Seite 1 von 1

[erledigt] CDX-Index mit kombiniertem Key

Verfasst: Mi, 01. Aug 2018 10:50
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?

Re: CDX-Index mit kombiniertem Key

Verfasst: Mi, 01. Aug 2018 11:00
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

Re: CDX-Index mit kombiniertem Key

Verfasst: Mi, 01. Aug 2018 11:15
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)

Re: CDX-Index mit kombiniertem Key

Verfasst: Mi, 01. Aug 2018 11:40
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

Re: CDX-Index mit kombiniertem Key

Verfasst: Mi, 01. Aug 2018 11:44
von Jan
Achso: Lt. Doku darf der Tagname nur 10 Zeichen lang sein. Deiner ist da wesentlich länger.

Jan

Re: CDX-Index mit kombiniertem Key

Verfasst: Mi, 01. Aug 2018 11:45
von unicorn
Genau das wollte ich grade schreiben das ich den Fehler gefunden habe ^^

Habe deine Korrekturen eingebaut, danke dir!

Re: CDX-Index mit kombiniertem Key

Verfasst: Mi, 01. Aug 2018 11:47
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 ;-)