Seite 1 von 1

Index [Erledigt]

Verfasst: Di, 26. Jul 2022 11:10
von Dominik Krebs
Hallo zusammen,
ich habe folgendes Problem:
Vereinfacht gesagt habe ich eine Tabelle mit zwei Spalten (spalte1,spalte2)
Ich möchte einen Indexerzeugen der mit diese beiden spalten sortiert (spalte1+spalte2). Das funktioniert auch, solange spalte 1 befüllt ist.
Ist diese leer wird Spalte2 nicht mehr sortiert. Folgende ausdrücke habe ich bereits ohne Erfolg versucht.

-Spalte1+Spalte2
-Alltrim(Spalte1)+Alltrim(Spalte2)
-PadR(trim(Spalte1),50," ")+Spalte2
-PadR(trim(Spalte1),50,"X")+Spalte2
-PadR(trim(Spalte1)+Trim(Spalte2),100," ")

Ich stehe auf dem Schlauch ...

Re: Index

Verfasst: Di, 26. Jul 2022 12:31
von brandelh
Ein Indexbegriff benötigt immer die gleiche Länge !

Wenn du mit alltrim() arbeitest, musst du mit Blanks auffüllen.

2 Felder ohne Trim(), gibt die komplette Feldlänge beider als Summe.
Ansonsten die Länge abfragen oder festlegen, du kannst mit seek() auch linke Teilbegriffe suchen ...

Schreib doch mal was du erwartest, das erste Feld leer wird normal immer nach Oben (Blanks) sortieren.
Am Besten erzeugt man Such und Indexbegriff durch die gleiche Funktion.

Re: Index

Verfasst: Di, 26. Jul 2022 12:34
von brandelh
bei solchen Sachen nehme ich gerne die set alternate to ... Datei und drucke die Begriffe aus, so kann man sehen was tatsächlich erzeugt wird und in welcher Reihenfolge.

Wenn du die führenden Blanks entfernst, wird das 2. Feld in das erste einsortiert.
Mit führenden Blanks bzw. Inhalt, wird das 2. Feld nur sortiert, wenn im 1. Feld der gleiche Inhalt mehrfach vorkommt.

Re: Index

Verfasst: Di, 26. Jul 2022 12:37
von nightcrawler
Hört sich nach ADT an. Da sollte der Index "spalte1;spalte2" heissen.

Re: Index

Verfasst: Di, 26. Jul 2022 18:12
von Marcus Herz
ist die Spalte leer
kann auch ein NULL Problem sein, NULL + "HELLO" = NULL

Re: Index

Verfasst: Di, 26. Jul 2022 21:03
von Dominik Krebs
Ja es handelt sich um eine ADT Tabelle, sorry habe wohl vergessen das zu erwähnen.

Ich möchte kein seek machen, mir geht es wirklich nur um die Sortierung im Browse. Beide Felder sind Char(50) und wenn ich mittels PadR auffüllen, Fülle ich auch auf 100 zeichen.

Eventuell wirklich das "Null Problem". Habe noch nichts davon gehört.

Und was hat das ";" genau für eine Bedeutung? Kenne ich so auch nicht 🫢

Re: Index

Verfasst: Di, 26. Jul 2022 23:02
von Jan
Dominik,

was in Xbase++ NIL ist ist unter SQL NULL. Und wenn man die Datenbank so konfiguriert sind leere Felder automatisch NULL - wenn ich da noch richtig in Erinnerung hab ist NULL oftmals der Standard. Da muß man unter Xbase++ aufpassen, weil das dort anders erwartet wird, und dann scheppert das halt. Vielleicht kannst Du die Abfrage machen ob das Feld NULL ist, und in dem Fall nicht ein PadR() darauf machen, sondern ein Replicate().

Jan

Re: Index

Verfasst: Mi, 27. Jul 2022 8:17
von Marcus Herz
Ok ADT:
Hier kann man Index mit
SPALTE1;SPALTE2
definieren. Aber Xbase++ kann damit kein Seek machen. (AdsClass++ kann das :-) )
Xbase++ kann aber die Tabelle aber richtig sortiert anzeigen
Die Sortierung stimmt auch bei NULL Werten, wenn SPALTE1 NULL IST, wird dann korrekt noch nach SPALTE2 sortiert. Und auch anders rum.
Alternativ kannst du im Index aber NULL abfangen

Code: Alles auswählen

coalesce(SPALTE1, space(x))+SPALTE2
x ist Länge von Feld SPALTE1. Das sollte auch funktionieren
Besonders relevant ist dieses Problem mit leeren Datumsfeldern, die sind immer NULL

Re: Index

Verfasst: Do, 28. Jul 2022 11:19
von Dominik Krebs
spalte1;spalte2 war die Lösung.
Vielen Dank für die Hilfe.

Auch wenn ich das ; nicht kannte.