[erledigt] CDX-Index mit kombiniertem Key

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
unicorn
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Di, 25. Apr 2017 17:23
Wohnort: Umgebung Stuttgart

[erledigt] CDX-Index mit kombiniertem Key

Beitrag von unicorn »

Hey Leute,

bin ja noch relativ neu bei den CDX-Indexen (haben bisher NTX verwendet).

Frage: Wie stürzt das Programm hier ab?

Code: Alles auswählen

INDEX ON AUFTRAGID + TICKETID TAG "auftragticket" TO ind_ticket
Beide Schlüssel sind numerisch, müssten sich also ja verbinden lassen. Bei NTX funktioniert das. Mache ich was falsch oder geht das bei CDX nicht?
Zuletzt geändert von unicorn am Mi, 01. Aug 2018 11:47, insgesamt 1-mal geändert.
Gruß,
Jannik (das verträumte Einhorn, by Jan)
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: CDX-Index mit kombiniertem Key

Beitrag von Martin Altmann »

Moin Jannik,
Du addierst die Werte (Summe). Das geht so nicht! Verschiedene Zahlen liefern ja die selbe Summe.
Du müsstest also den Index über eine Zeichenkette bilden, wenn du die beiden Werte hintereinander stehen haben willst!

Viele Grüße aus Irland,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
unicorn
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Di, 25. Apr 2017 17:23
Wohnort: Umgebung Stuttgart

Re: CDX-Index mit kombiniertem Key

Beitrag von unicorn »

Hi Manfred,

da hast du schonmal recht, ist jetzt korrigiert:

Code: Alles auswählen

INDEX ON ltrim(rtrim(Str(AUFTRAGID))) + ltrim(rtrim(Str(ID))) TAG "auftragticket" TO ind_ticket
Leider kommt der Fehler noch immer...
Die Felder existieren in der DBF natürlich!

XPPERROR.LOG:

Code: Alles auswählen

------------------------------------------------------------------------------
FEHLERPROTOKOLL von "H:\BSYS_NEU\BSYS\indexrefresh.EXE" Datum: 01.08.2018 11:13:16

Xbase++ Version     : Xbase++ (R) Version 2.00.951
Betriebssystem      : Windows 10 1803 Build 17134
------------------------------------------------------------------------------
oError:args         :
          -> VALTYPE: C VALUE: ind_ticket
          -> VALTYPE: C VALUE: AUFTRAGTICKET
          -> VALTYPE: C VALUE: ltrim(rtrim(Str(AUFTRAGID))) + ltrim(rtrim(Str(ID)))
          -> VALTYPE: B VALUE: {|| ltrim(rtrim(Str(AUFTRAGID))) + ltrim(rtrim(Str(ID)))}
          -> VALTYPE: U VALUE: NIL
          -> VALTYPE: L VALUE: .F.
oError:canDefault   : J
oError:canRetry     : J
oError:canSubstitute: N
oError:cargo        : NIL
oError:description  : 
oError:filename     : 
oError:genCode      :       8999
oError:operation    : OrdCreate
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :       5381
oError:subSystem    : BASE
oError:thread       :          1
oError:tries        :          1
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von MAIN(144)
Gruß,
Jannik (das verträumte Einhorn, by Jan)
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: CDX-Index mit kombiniertem Key

Beitrag von Jan »

Jannik,

das geht so nicht.

Erstmal: LTrim(RTrim(wasauchimmer)) = AllTrim(wasauchimmer)

Aber viel wichtiger ist: Die Indexausdrücke müssen immer gleich lang sein! Also kein Trim, welches auch immer! Sondern Str(wert1, 12) + Str(wert2, 15). Wobei die Ziffern natürlich von Dir angepasst werden müssen, am besten sollte das die jeweilige Feldlänge sein.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: CDX-Index mit kombiniertem Key

Beitrag von Jan »

Achso: Lt. Doku darf der Tagname nur 10 Zeichen lang sein. Deiner ist da wesentlich länger.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
unicorn
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 40
Registriert: Di, 25. Apr 2017 17:23
Wohnort: Umgebung Stuttgart

Re: CDX-Index mit kombiniertem Key

Beitrag von unicorn »

Genau das wollte ich grade schreiben das ich den Fehler gefunden habe ^^

Habe deine Korrekturen eingebaut, danke dir!
Gruß,
Jannik (das verträumte Einhorn, by Jan)
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: CDX-Index mit kombiniertem Key

Beitrag von brandelh »

Der Index-Begriff muss immer gleich lang sein !!!

wenn man wie du trim einsetzt, muss man danach mit Blanks (etc.) auffüllen, damit der String gleich lang wird.
Bei einem numerischen Feld ist das kein Problem, aber z.B. die Summe von 2 Werten kann in der Länge je nach Nachkommastellen unterschiedlich lang sein.
Str() ohne Parameter macht da was es will (bzw. nötig ist) und falls die Summe einen Wert übersteigt, dann wird ***** eingesetzt.

Daher immer wenn es nicht um einfache Felder geht in einen String umwandeln, der eindeutige Längen und Positionen hat:

Code: Alles auswählen

Angenommen:

AUFTRAGID ist Feld N 12 , 0
TICKETID    ist Feld N 10 , 0

Code: Alles auswählen

cAuftragTicket := StrZero(AUFTRAGID,12) + StrZero(TICKETID,10) // leeren Stellen jetzt mit 0 besser lesbar
wenn man auf Nummer sicher gehen will (überlauf ?), kann man auch etwas Luft lassen. Diese Berechnung erledigt man am besten in einer eigenen Funktion, die auch bei DBSEEK() verwendet wird.

Code: Alles auswählen

cAuftragTicket := left( StrZero(AUFTRAGID,14) + StrZero(TICKETID,12) + space(26) , 26) // oder etwas mehr Platz wegen evtl. Überläufe
wenn man wie du aber mischen will (also eine durchgängige Zahl ohne füllende Blanks oder 0 ... dann

Code: Alles auswählen

nMaxLen := 24
cAuftragTicket := left( alltrim(Str(AUFTRAGID,18,0)) + alltrim(Str(TICKETID,18,0)) + space(nMaxLen) ,nMaxLen) 
wie gesagt, eine eigene Funktion ist da sinnvoll, dann kann man auch die Länge nachträglich noch leicht anpassen.

PS: ich war zu langsam, aber da ich schon mal soviel geschrieben habe wollte ich es nicht einfach löschen ;-)
Gruß
Hubert
Antworten