Logisch
Ich bin dem Problem noch einmal auf dem Grund gegangen und zum Ergebnis gekommen, dass die Funktion DESCEND() in Verbindung mit Index-Ausdrücken zur Erzeugung von
absteigenden Indexen im Zusammenhang mit alphanumerischen + numerischem Feld nicht geeignet ist.
Der Grund dafür liegt
nicht in einer fehlerhaften Implementierung der DESCEND() Funktion sondern darin, dass für ein Index-Tag bzw. eine Index-Datei bei der Nutzung von einem numerischen Feld in Verbindung mit einem alphanumerischen Feld der Indexausdruck immer ein String zurück geben muss. Somit erfolgt die Reihenfolge über einen String-Vergleich.
Die nachfolgenden Beispiele sollen dies verdeutlichen. Aus Gründen der Übersichtlichkeit verzichte ich auf ein über mehrere Felder zusammengesetzten Indexausdruck, sondern betrachte ich Nachfolgenden ein einfaches PREIS-Feld.
- FIELD->PREIS
1
4000
7000
12000
Bei String-Vergleichen gelten folgende Bedingungen:
Aufsteigende Reihenfolge: „ “ < „-„ < „0“ oder chr(32) < chr(45) < chr(48 )
Absteigende Reihenfolge: „0“ > „-„ > „ „ oder chr(48 ) > chr(45) > chr(32)
Ein Index mit Str( FIELD->PREIS,6,0) ergibt über den Stringvergleich folgende Reihenfolge:
- „_____1“
„__4000“
„__7000“
„_12000“
Ein Index unter Verwendung von Transform( FIELD->PREIS, „@L0 999999“) führt über den String-Vergleich zu folgender Reihenfolge:
- „000001“
"004000"
"007000"
"012000"
Ein Index unter Verwendung von Str( Descend(xWert), 6,0) führt über den String-Vergleich zu folgende Reihenfolge:
- „____-1“
„_-4000“
„_-7000“
„-12000“
Ein Index unter Verwendung von Transform( DESCEND(FIELD->PREIS), „@L0 999999“) führt über den String-Vergleich zu folgender Reihenfolge:
- "-12000"
„-04000“
„-07000“
„-00001“
Somit bleibt festzuhalten, dass Str(Descend( nValue ),x,y) bzw. Transform( Descend(nValue), „@L0 999999.99“) nicht geeignet ist, um eine
absteigende Sortierung zu erhalten.
Gruß, Olaf
PS: Bedingt durch die proportionale Schrift habe ich zur besseren Visualisierung Leerzeichen mit einem Unterstrich aufgeführt.