Über die Auswirkungen von SetCollation(): Unterschied zwischen den Versionen
Georg (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Georg (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 161: | Zeile 161: | ||
| 7: Polten || 7: Polten || 6: Pölten || 7: Polten || 7: Polten | | 7: Polten || 7: Polten || 6: Pölten || 7: Polten || 7: Polten | ||
|} | |} | ||
== und noch ein Eintrag == |
Version vom 15. Mai 2013, 09:17 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
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.
#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.
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...
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 |