Seite 1 von 1

asort() reihenfolge [ERLEDIGT]

Verfasst: Fr, 22. Jun 2018 11:32
von Manfred
Hi,
ich komme im Moment nicht weiter. Ich habe ein Array das sortiert wird, mit folgenden Inhalten
awerte[1] -> "Summe"
awerte[2] -> "øSaldo"

bisher war es so, wenn es mit asort(awerte) sortiert wurde, ergab es genau das Ergebnis, wie es oben steht. Jetzt ist es neuerdings andersherum. das "ø" wird zuerst einsortiert. Irgendwas habe ich wohl zwischendurch geändert, finde es aber nicht. In der Hilfe steht, das SET EXCACT SET LEXICAL und SET COLLATION eine Rolle spielen. Wie müssen die denn geschaltet sein damit das "S" wieder vor dem "ø" steht? Ich bin mir sehr sicher, das ich mit SET EXACT und LEXICAL nicht herumgespielt habe. Bei SET COLLATION bin ich mir im Moment nixcht mehr sicher. Ich habe zwischendurch von DBFNTX auf FOXCDX umgestellt. Kann das damit zusammhängen?

Re: asort() reihenfolge

Verfasst: Fr, 22. Jun 2018 11:42
von Jan
Manfred,

ich hab Dein Beispiel mal eben bei mir durchgetestet. Das sieht genau so aus. Saldo komm vor øSaldo. Erscheint mir auch logisch.

Von den drei von SETs habe ich im Code nur eine, und das ist SET COLLATION TO GERMAN. SET CHARSET TO ist egal, was man da einstellt.

Jan

Re: asort() reihenfolge

Verfasst: Fr, 22. Jun 2018 11:45
von brandelh
Ja was steht denn in der EXE zu den 3 Anweisungen ?

Laut ASC() müsste "S" immer vor "ø" (245) kommen, mit SYSTEM wäre die Sortierung nach ASCII Code, aber ich denke nicht, dass unter GERMAN das anders wäre ...
Könnte es sein, dass ein winziges Blank VOR dem ø steht ;-)

Re: asort() reihenfolge

Verfasst: Fr, 22. Jun 2018 11:49
von Manfred
Hubert,
das war auch zuerst mein Verdacht, steht aber nicht. Kann auch nicht sein, weil es dann nach oben rutschen würde, oder? ;-)

Re: asort() reihenfolge

Verfasst: Fr, 22. Jun 2018 12:12
von Jan
Manfred,

machst Du denn einfach ein ASort(aArray), oder ein ASort(aArray, {|x, y| ...})?

Jan

Re: asort() reihenfolge

Verfasst: Fr, 22. Jun 2018 12:13
von Manfred
nur ein asort().

Re: asort() reihenfolge

Verfasst: Fr, 22. Jun 2018 12:16
von Jan
Manfred hat geschrieben: Fr, 22. Jun 2018 11:49Hubert,
das war auch zuerst mein Verdacht, steht aber nicht. Kann auch nicht sein, weil es dann nach oben rutschen würde, oder? ;-)
Aber ist denn nicht genau daß das Problem? Es soll unten sein, wie sich das gehört. Du aber hast es jetzt oben. Was durch ein Blank passieren würde.

Jan

Re: asort() reihenfolge

Verfasst: Fr, 22. Jun 2018 12:16
von Manfred
Mist, habe das Problem gefunden. Jetzt bin ich aber echt gekniffen...... Mal schauen wie ich das jetzt vernünftig geregelt kriege.....

Re: asort() reihenfolge [ERLEDIGT]

Verfasst: Fr, 22. Jun 2018 12:20
von Manfred

Re: asort() reihenfolge [ERLEDIGT]

Verfasst: Fr, 22. Jun 2018 12:33
von Jan
... ich bin irritiert. Das ø muß doch in jeder Collation nach dem S kommen. Oder nicht?

Jan

Re: asort() reihenfolge [ERLEDIGT]

Verfasst: Fr, 22. Jun 2018 13:02
von Manfred
es klappt jetzt wieder.

Re: asort() reihenfolge [ERLEDIGT]

Verfasst: Fr, 22. Jun 2018 13:40
von brandelh
Beispielprogramm, denn ich kann nicht glauben was ich höre 8)

Xbase 2.00.951

Code: Alles auswählen

#include "Common.ch"
PROCEDURE Main
   LOCAL cSeltsam := "ø"
   LOCAL cS := "S"
   LOCAL aTest := { "x","s",cSeltsam,"a","A","S","Z" }
   /* we use the ansi charset by default */
   SET CHARSET TO ANSI
   SET COLLATION TO SYSTEM

   SET ALTERNATE TO test.txt
   SET ALTERNATE ON

   ? "ø = ASC() = ",asc(cSeltsam), cSeltsam+" > "+cS+" ? ",cSeltsam > cS
   ? "S = ASC() = ",asc(cS), cS+" > "+cSeltsam+" ? ",cS > cSeltsam
   ?
   ? "Sortiere das"
   ? aTest
   aSort(aTest)
   ? "ergibt das"
   ? aTest
   ?
   ? "Ende"

   SET ALTERNATE OFF

   inkey(40)
   /* $TODO: place your application code here */
RETURN
1. Feststellung

im Beispiel Projekt war die ANSI => OEM Umsetzung aktiv, daher seltsame unerwartete ASC() Werte, OEM Ergebnis mit SYSTEM

Code: Alles auswählen

ø = ASC() =         155 ø > S ?  N
S = ASC() =          83 S > ø ?  J

Sortiere das
{x, s,ø, a, A, S, Z}
ergibt das
{ø, a, A, s, S, x, Z}

Ende
nun zuerst ANSI => OEM Umsetzung deaktiviert und ANSI Ergebnis mit SYSTEM

Code: Alles auswählen

ø = ASC() =         248 ø > S ?  N
S = ASC() =          83 S > ø ?  J

Sortiere das
{x, s, ø, a, A, S, Z}
ergibt das
{a, A, ø, s, S, x, Z}

Ende
:arrow: das "ø" wird anders sortiert je nach Quellcode Umsetzung !

ANSI Ergebnis mit GERMAN

Code: Alles auswählen

ø = ASC() =         248 ø > S ?  J
S = ASC() =          83 S > ø ?  N

Sortiere das
{x, s, ø, a, A, S, Z}
ergibt das
{A, S, Z, a, s, x, ø}
sieh mal einer an, mit der Standardeinstellung eines deutschen Xbase++ wird es wieder richtig sortiert.

Mit DIN und ASCII hatte ich das gleiche Ergebnis, SYSTEM scheint nicht sinnvoll ... obwohl in der Hilfe nur steht, dass Groß-/Kleinschreibung nicht unterschieden wird.
Eventuell ist das "ø" aber auch ein Schriftzeichen, das dadurch nach vorne rückt.

Re: asort() reihenfolge [ERLEDIGT]

Verfasst: Fr, 22. Jun 2018 13:50
von Manfred
Das ist Chr(245) wenn ich recht erinnere.

Re: asort() reihenfolge [ERLEDIGT]

Verfasst: Fr, 22. Jun 2018 15:01
von brandelh
chr(245) = "§" // per ALT + 245 erzeugt ;-)

Re: asort() reihenfolge [ERLEDIGT]

Verfasst: Fr, 22. Jun 2018 15:09
von Manfred
sorry, hast recht. 248 war gemeint

Re: asort() reihenfolge [ERLEDIGT]

Verfasst: Fr, 22. Jun 2018 15:10
von Jan
OEM 157
ANSI 248

Jan

Re: asort() reihenfolge [ERLEDIGT]

Verfasst: Fr, 22. Jun 2018 15:11
von HaPe
Eventuell ist das "ø" aber auch ein Schriftzeichen,
Das ist Chr(245) wenn ich recht erinnere.
Nö, CHR( 155 )

Getestet in der Xbase-Workbench, meinen Programmierer-Editoren, im CMD-Fenster, PowerShell, Visual Studio, usw.