Über die Auswirkungen von SetCollation(): Unterschied zwischen den Versionen

Aus Wiki des Deutschsprachige Xbaseentwickler e. V.
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:


== Bedeutung von SET COLLATION / SetCollation() ==
== Bedeutung von SET COLLATION / SetCollation() ==


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


== Ein Beispielprogramm für die Auswirkung von SET COLLATION ==
== Ein Beispielprogramm für die Auswirkung von SET COLLATION ==
=== Projekt-Definitionsdatei Project.xpj ===


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


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.
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"
  #INCLUDE "Collat.CH"
Zeile 88: Zeile 94:


Da wir mit figurativen Konstanten arbeiten, muss die "Collat.CH" eingebunden werden, in der die verschiedenen, Xbase++ bekannten Collations hinterlegt sind.
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:
Interessant sind die Ergebnisse der Testläufe:


Collation = System
Collation = System
   4: Möller                 
   4: Möller                 
   3: Muller                 
   3: Muller                 
Zeile 102: Zeile 111:
  Press any key to continue...
  Press any key to continue...


Collation = ASCII
Collation = ASCII
   3: Muller                 
   3: Muller                 
   5: Munden                 
   5: Munden                 
Zeile 113: Zeile 122:
  Press any key to continue...
  Press any key to continue...


Collation = GERMAN
Collation = GERMAN
   4: Möller                 
   4: Möller                 
   2: Müller                 
   2: Müller                 
Zeile 124: Zeile 133:
  Press any key to continue...
  Press any key to continue...


Collation = DIN
Collation = DIN
   4: Möller                 
   4: Möller                 
   3: Muller                 
   3: Muller                 
Zeile 135: Zeile 144:
  Press any key to continue...
  Press any key to continue...


Collation = DANISH
Collation = DANISH
   3: Muller                 
   3: Muller                 
   2: Müller                 
   2: Müller                 
Zeile 145: Zeile 154:
   1: Schulze                 
   1: Schulze                 
  Press any key to continue...
  Press any key to continue...
=== tabellarischer Vergleich der Ausgabe: ===




Zeile 160: Zeile 171:
|-
|-
| 7: Polten  || 7: Polten  || 6: Pölten  || 7: Polten  || 7: Polten
| 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
|}
|}
== und noch ein Eintrag ==

Aktuelle Version vom 15. Mai 2013, 09:33 Uhr


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