Über die Auswirkungen von SetCollation()

Aus Wiki des Deutschsprachige Xbaseentwickler e. V.
Zur Navigation springen Zur Suche springen


Bedeutung von SET COLLATION / SetCollation()

Auf der einen Seite beeinflussen die beiden Umgebungsfunktionen das Verhalten des Programms in Bezug auf Vergleiche und Sortierung.

Für den Einsatz der CDXDBE ist wichtig, dass die Einstellung, die durch SET COLLATION festgelegt wurde, in der CDX-Datei hinterlegt wird und nicht änderbar ist.

Wenn also eine CDX-Datei mit DANISH Collation erstellt wurde, wird die Sortierfolge immer mehr als seltsam erscheinen, selbst dann, wenn in dem Programm, das die CDX-Datei verwendet, als erste Anweisung ein SET COLLATION TO DIN steht.


Ein Beispielprogramm für die Auswirkung von SET COLLATION

Projekt-Definitionsdatei Project.xpj

Zuerst einmal die (leicht gekürzte) Project.XPJ:

[PROJECT]
   COMPILE       = xpp
   COMPILE_FLAGS = /ga /p /q /w /wl
   DEBUG         = yes
   GUI           = yes
   LINKER        = alink
   LINK_FLAGS    = /PM:PM
   RC_COMPILE    = arc
   RC_FLAGS      = /v
   PROJECT.XPJ
[PROJECT.XPJ]
   TC.EXE
[TC.EXE]
   TESTCOLLATION.PRG

Besonders möchte ich auf den COMPILE_FLAG /ga hinweisen. Eine Änderung dieses Flags auf /go bzw. das Weglassen dieser beiden Flags führt zu unterschiedlicher Behandlung der Umlaute. Es lohnt sich schon, das einmal zu vergleichen. Wir werden uns hier auf /ga beschränken.

Programmbeispiel TestCollation.prg

#INCLUDE "Collat.CH"
FUNCTION Main()
  Local aCollations := {COLLAT_SYSTEM, COLLAT_ASCII, COLLAT_GERMAN, COLLAT_USER}
  Local nI, nLen
  nLen := Len(aCollations)
  FOR nI := 1 TO nLen
     GenerateTable(aCollations[nI])
     FillTable()
     ShowTable()
     dbCloseAll()
  NEXT
RETURN (.T.)
FUNCTION FillTable()
  Local aData := {"Schulze", "Müller", "Muller", "Möller", "Munden", "Pölten", "Polten", "Pulten"}
  Local nI, nLen
  nLen := Len(aData)
  FOR nI := 1 TO nLen
     dbAppend()
     FieldPut(1, aData[nI])
  NEXT
RETURN (.T.)
FUNCTION ShowTable()
  CLS
  dbGoTop()
  WHILE !EoF()
     ? Str(Recno(), 3) + ": " + FieldGet(1)
     dbSkip(1)
  END
  WAIT
RETURN (.T.)
FUNCTION GenerateTable(nCollation)
  Local aStru
  IF File("Collat.cdx")
     fErase("Collat.cdx")
  ENDIF
  IF File("Collat.dbf")
     fErase("Collat.dbf")
  ENDIF
  aStru := {;
     {"NACHNAME", "C", 32, 0};
     }
  dbCreate("Collat", aStru, "FOXCDX")
  dbUseArea(.T., "FOXCDX", "Collat")
  SetCollation(nCollation)
  INDEX ON NACHNAME TAG "A1" TO COLLAT
RETURN (.T.)
FUNCTION DBESys()
  IF !DbeLoad("FOXDBE", .T.)
  ENDIF
  IF !DbeLoad("CDXDBE" , .T.)
  ENDIF
  IF !DbeBuild("FOXCDX", "FOXDBE", "CDXDBE" )
  ENDIF
RETURN (.T.)

Das Programm durchläuft fünfmal (oder öfter, falls man weitere COLLAT_ Einträge in aCollations hinterlegt) das Erstellen der Dateien, das Füllen sowie die Anzeige.

Da wir mit figurativen Konstanten arbeiten, muss die "Collat.CH" eingebunden werden, in der die verschiedenen, Xbase++ bekannten Collations hinterlegt sind.


Ausgabe des Test-Programms mit verschiedenen Collation-Einstellungen:

Interessant sind die Ergebnisse der Testläufe:

Collation = System

 4: Möller                 
 3: Muller                 
 2: Müller                 
 5: Munden                 
 7: Polten                 
 6: Pölten                 
 8: Pulten                 
 1: Schulze                
Press any key to continue...

Collation = ASCII

 3: Muller                 
 5: Munden                 
 4: Möller                 
 2: Müller                 
 7: Polten                 
 8: Pulten                 
 6: Pölten                 
 1: Schulze                
Press any key to continue...

Collation = GERMAN

 4: Möller                 
 2: Müller                 
 3: Muller                 
 5: Munden                 
 6: Pölten                 
 7: Polten                 
 8: Pulten                 
 1: Schulze                
Press any key to continue...

Collation = DIN

 4: Möller                 
 3: Muller                 
 2: Müller                 
 5: Munden                 
 7: Polten                 
 6: Pölten                 
 8: Pulten                 
 1: Schulze                
Press any key to continue...

Collation = DANISH

 3: Muller                 
 2: Müller                 
 5: Munden                 
 4: Möller                 
 7: Polten                 
 8: Pulten                 
 6: Pölten                 
 1: Schulze                
Press any key to continue...

tabellarischer Vergleich der Ausgabe:

SYSTEM ASCII GERMAN DIN DANISH
4: Möller 3: Muller 4: Möller 4: Möller 3: Muller
3: Muller 5: Munden 2: Müller 3: Muller 2: Müller
2: Müller 3: Muller 3: Muller 2: Müller 5: Munden
5: Munden 2: Müller 5: Munden 5: Munden 4: Möller
7: Polten 7: Polten 6: Pölten 7: Polten 7: Polten
6: Pölten 8: Pulten 7: Polten 6: Pölten 8: Pulten
8: Pulten 6: Pölten 8: Pulten 8: Pulten 6: Pölten
1: Schulze 1: Schulze 1: Schulze 1: Schulze 1: Schulze