Index [Erledigt]

Advantage Database Server

Moderator: Moderatoren

Antworten
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Index [Erledigt]

Beitrag 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 ...
Zuletzt geändert von Dominik Krebs am Do, 28. Jul 2022 11:19, insgesamt 1-mal geändert.
Gruß Dominik
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Index

Beitrag 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.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Index

Beitrag 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.
Gruß
Hubert
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Index

Beitrag von nightcrawler »

Hört sich nach ADT an. Da sollte der Index "spalte1;spalte2" heissen.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Index

Beitrag von Marcus Herz »

ist die Spalte leer
kann auch ein NULL Problem sein, NULL + "HELLO" = NULL
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: Index

Beitrag 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 🫢
Gruß Dominik
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Index

Beitrag 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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: Index

Beitrag 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
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Dominik Krebs
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 197
Registriert: Mo, 15. Apr 2019 16:19
Hat sich bedankt: 10 Mal
Danksagung erhalten: 4 Mal

Re: Index

Beitrag von Dominik Krebs »

spalte1;spalte2 war die Lösung.
Vielen Dank für die Hilfe.

Auch wenn ich das ; nicht kannte.
Gruß Dominik
Antworten