OrdKeyNo() liefert ein NIL!

Advantage Database Server

Moderator: Moderatoren

Antworten
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

OrdKeyNo() liefert ein NIL!

Beitrag von Magic »

Hi,

ich habe seit Tage ein RISIGES Problem mit einer Tabelle auf der ADS (8.1).
Ohne jetzt alles in Detail beschreiben zu wollen, versuche ich es vorerst mit einer allgemein formulierten Frage:

Welche Gründe kann es geben, dass einige Datensätze nicht im Index landen, andere schon. Das Erzeugen der Datensätze erfolgt immer nach demselben Prinzip, immer aus demselben Programm heraus. Trotzdem gibt es Datensätze die anscheinend nicht im Index vorhanden sind(?).
Programm ist nicht von mir geschriben worden, scheint schon etwas älter zu sein. Lief aber bis vor ein paar Tagen ohne Probleme.
Daher Tippe ich auf einen Fehler in der Tabelle / ADS.

Im Programm liefert die Funktion OrdKeyNo() ein NIL, wenn zuvor ein DbGoBottom() gesetzt wurde. Der fragliche Datensatz ist aber in der Tabelle vorhanden, denn über den Advantage Data Architekten sehe ich ihn, auch wenn ich denselben Index wähle.

Reindex und Neuaufbau der Indexdatei habe ich schon durch. Ohne Erfolg.

Dies hier liefert NIL:

Code: Alles auswählen

nBot := ( DOCS->( OrdKeyNo() ) )
Kurze Zeit späte knall es, beim oBrowser:refreshAll(), da der lastPosBlock des Browser einen ungültigen Wert hat.

Gebe ich mir vor vorher den OrdKeyNo() raus:

Code: Alles auswählen

Msgbox( "OrdKeyNo(): " + Alltrim( Str( DOCS->( OrdKeyNo() ) ) ) )
Bekomme ich die Fehlermeldung:
oError:args :
-> VALTYPE: C VALUE: 195339
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : {NIL, 5041, Error 5041: The requested object was not found. Key not in index.}
oError:description : Parameter hat falschen Typ
oError:filename :
oError:genCode : 2
oError:operation : str
oError:osCode : 0
oError:severity : 2
oError:subCode : 1025
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
Gruß,
Magic
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: OrdKeyNo() liefert ein NIL!

Beitrag von georg »

Hallo, Magic -


wie lautet der Index-Begriff?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: OrdKeyNo() liefert ein NIL!

Beitrag von Magic »

Code: Alles auswählen

STR(AU_NR,9)+STR(POS,4)+ZKEY+STR(9999-REV_NR,4)
ZKEY ist CHARAKTER, 10.
Gruß,
Magic
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: OrdKeyNo() liefert ein NIL!

Beitrag von ramses »

Hallo Magic

sind AU_NR, POS, ZKEY, REV_NR alles Datenbankfelder?
Ich denke jedoch dein Problem liegt bei 9999-REV_NR weil rechenoperationen im Indexkey nicht gehen. Verwende besser DECEND()

Gruss

Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: OrdKeyNo() liefert ein NIL!

Beitrag von Magic »

Ich habe den Übertäter gefunden aber kann mir nicht erklären woran es liegt und vor allem wie ich es beheben kann :?: :?: :?: :?:
Der Knackpunkt ist das Feld ZKEY :!: :!: :!: :!:

Ich habe den Index komplett gelöscht, dann Feld für Feld angelegt und geprüft.

Index

Code: Alles auswählen

STR(AU_NR,9)+STR(POS,4)
geht, Sortierung OK.

Index

Code: Alles auswählen

STR(AU_NR,9)+STR(POS,4)+ZKEY
geht zwar aber wenn ich mir die Datensätze dann mit aktiven Index direkt auf der ADS anschaue, sind sie falsch sortiert!

Hier nur der Auszug der Spalte ZKEY in der Reihenfolge wie sie in der ADS angezeigt werden:

Code: Alles auswählen

05.01
05.06.3
05.18
E.003
E.003.1
ZS-MDG-VWS
ZS-MDG
Nach meinem Verständnis, sind die letzen beiden Datensätze falsch :!:
Gruß,
Magic
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: OrdKeyNo() liefert ein NIL!

Beitrag von ramses »

@Magic

nicht unbedingt. Sind denn die spalten AU_NR + POS bei den gelisteten Datensätze identisch?

Cu

Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: OrdKeyNo() liefert ein NIL!

Beitrag von Magic »

ramses hat geschrieben:nicht unbedingt. Sind denn die spalten AU_NR + POS bei den gelisteten Datensätze identisch?
Ja.

Es liegt tatsächlich an der Sortierung. Irgendwie schlägt die Sortierung nach dem zweitem "-" fehl.
Ändere ich den Schlüssel und setze statt ZS-MDG-VWS ein ZS-MDG.VWS ein so ist der Fehler dann weg und die Sortierung passt.

Ist das wohl ein ADS Bug?
Gruß,
Magic
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: OrdKeyNo() liefert ein NIL!

Beitrag von Magic »

Magic hat geschrieben:Ist das wohl ein ADS Bug?
Für meine Begriffe sieht es tatsächlich so aus.
Leider gibt es für unsere Version keinen Support mehr, so dass man wohl in diese Richtung nichts näheres mehr erfahren wird.
Vielleicht meldet sich Joachim noch dazu.
Gruß,
Magic
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: OrdKeyNo() liefert ein NIL!

Beitrag von georg »

Hallo, Magic -


hast Du mal ein "+Pad(ZKEY, 10) +" im Schlüssel versucht?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: OrdKeyNo() liefert ein NIL!

Beitrag von Magic »

georg hat geschrieben:hast Du mal ein "+Pad(ZKEY, 10) +" im Schlüssel versucht?
PadR() gerade getestet, ändert nichts.
Gruß,
Magic
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: OrdKeyNo() liefert ein NIL!

Beitrag von Tom »

Ein Index auf einem Character-Feld wird immer mit nachfolgenden Blanks erzeugt, sonst wäre der Index automatisch korrupt, weil Indexausdrücke über die gesamte Tabelle hinweg die gleiche Länge haben müssen. Das Padding findet also implizit statt, sonst müsste man das nämlich bei allen alphanumerischen Feldern machen.

Hast Du Dir die Tabelle mal mit einem Hex-Editor oder irgendeinem anderen Tool angeschaut? Ist es möglich, dass "ZKEY" im fraglichen Datensatz nicht darstellbare Zeichen enthält?
Herzlich,
Tom
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: OrdKeyNo() liefert ein NIL!

Beitrag von brandelh »

An chr(255) hatte ich auch schon gedacht, da ja das Blank chr(32) immer kleiner als - chr(45) ist (egal welche Codepage eingestellt ist),
aber wenn es mit . funktioniert, dann muss es ein Blank sein. Eventuell interpretiert die ADS hier etwas, was nicht zu interpretieren ist.

Ich entferne bei meinen Indexen immer die Umlaute mit einer eigenen Funktion KeinUmlaut().
Das einfachste wäre, wenn du die Indizierung und die Abfrage von den Einzelwerten auf eine Funktion umstellen würdest.
Dort könntest du das '-' grundsätzlich gegen z.B. '.' austauschen. Suchen müsste natürlich die gleiche Funktion verwenden.

Diese Funktion darf die tatsächliche Indexlänge aber nicht ändern !

Beispiel:

Code: Alles auswählen

function MyIndexS( aVars, nLen) // Stringindexe
     local cIndex := ""
     aeval( aVars, {|cTxt| cIndex += strTran(cTxt,"-",".") } )
     // UPPER() oder mehr ...
return padR(cIndex,nLen)
ich hoffe ich habe mich jetzt nicht zu sehr verschrieben ;-)
aVars könnte eine flexible Anzahl von Parametern enthalten, somit wäre die Funktion allgemeingültig, allerdings müssten die Arrayelemente immer gleich aufgebaut werden.
Sicherer wäre eine Funktion pro Index mit der richtigen Anzahl Parametern (oder moderner einem Parameter-Objekt mit allen Infos), die Parameter könnten dann auch vom Typ her gemischt sein.
Diese Funkton könnte dann je Feld Vorgaben setzen und die Suche wäre flexibler und sicherer.

Wie auch immer, falls bei der ADS ein Feld mit dem Inhalt falsch sortiert wird, musst du einen Workaroud bauen:

Code: Alles auswählen

"Dies-ist-ein-Beispiel" // das sollte ans Ende sortiert werden
"Dies ist ein Beispiel" // und das an den Anfang
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: OrdKeyNo() liefert ein NIL!

Beitrag von Tom »

@Hubert: UDFs sind in ADS-Indexen nicht möglich.
Herzlich,
Tom
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: OrdKeyNo() liefert ein NIL!

Beitrag von brandelh »

Dann müsste man ein extra Indexfeld vom Typ Char anlegen, das mit der UDF gefüllt wird, keine '-' enthält und von der ADS normal indiziert wird.
Gruß
Hubert
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: OrdKeyNo() liefert ein NIL!

Beitrag von Magic »

Ich werde es auf eine ganz einfache Weise lösen.
ZKEY ist es Schlüssel der in einer separaten Tabelle gepflegt wird.
Im zugehörigen Pflege- / Verwaltungsmodul schließe ich alles was Probleme im Index bereitet aus, also eben ein „-„. Zum Schlüssel gibt es ja auch noch ein Bezeichnungsfeld, dort kann der User weiterhin alles sprechend benennen.

Die ganze Fehlersuche hat mich bereits mind. 3 Tage gekostet.
Gruß,
Magic
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: OrdKeyNo() liefert ein NIL!

Beitrag von brandelh »

Wenn du den Inhalt von ZKEY begrenzen kannst ist das natürlich ideal :D
Gruß
Hubert
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: OrdKeyNo() liefert ein NIL!

Beitrag von Magic »

Ich habe gerade noch eine Gegenprobe auf dem ADS Version 10 gemacht.
Ergebnis: dasselbe Verhalten / derselbe Fehler.

Übrigens liegt das tatsächlich nur an dem "Minuszeichen / Bindestrich", denn viele andere Zeichen zeigen in diesem Zusammenhang kein Fehlverhalten.
Es ist also so, dass ein Bindestrich vor Leerzeichen sortiert wird :!:
Gruß,
Magic
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: OrdKeyNo() liefert ein NIL!

Beitrag von Tom »

Kann ich nicht bestätigen. Ich habe mit ADS 9, 10 und 11 getestet. Allerdings mit DBF/NTX-Tabellen und OEM, sowie entsprechenden Einstellungen (zweimal "GERMAN") beim Server - das Minus kommt immer nach dem Leerzeichen, was aber auch bei ANSI und anderen Spracheinstellungen der Fall sein müsste. Welches Tabellenformat verwendest Du? Ist ein Data Dictionary aktiv? Welche Zeichensatzeinstellungen? Hast Du möglicherweise eigene Kollationstabellen angelegt? Geschieht das nur bei diesem Index oder auch beispielsweise in Adresstabellen, wenn es einen "Müller-Hänselhausen" und einen "Müller Hänselhausen" gibt? Ändert sich das Verhalten nach einem expliziten REPLACE auf dem betroffenen Feld bei aktivem Index?
Herzlich,
Tom
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: OrdKeyNo() liefert ein NIL!

Beitrag von Magic »

Tom hat geschrieben:Allerdings mit DBF/NTX-Tabellen und OEM, sowie entsprechenden Einstellungen (zweimal "GERMAN")
Wir haben CDX, ANSI und ebenfalls die Einstellungen GERMAN.
Tom hat geschrieben:Ist ein Data Dictionary aktiv?
So wie ich es sehe, nein.
Tom hat geschrieben:Hast Du möglicherweise eigene Kollationstabellen angelegt?
Nein.
Tom hat geschrieben:Geschieht das nur bei diesem Index oder auch beispielsweise in Adresstabellen, wenn es einen "Müller-Hänselhausen" und einen "Müller Hänselhausen" gibt? Ändert sich das Verhalten nach einem expliziten REPLACE auf dem betroffenen Feld bei aktivem Index?
Das muss ich erst prüfen. ... geprüft.
Wenn es sich exakt um die letzten Beiden Datensätze (nach Index sortiert) handelt, gibt es immer wieder dieselben Probleme, auch wenn auf den ersten Blick alles OK aussieht. Wenn Du Dir die Sätze in dem Advantage Data Architect anschaust und dann in dem dortigen Browser über den letzten Datensatz scrollst, passieren ganz merkwürdige Dinge.
Gruß,
Magic
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: OrdKeyNo() liefert ein NIL!

Beitrag von nightcrawler »

Magic hat geschrieben:Irgendwie schlägt die Sortierung nach dem zweitem "-" fehl.
Ändere ich den Schlüssel und setze statt ZS-MDG-VWS ein ZS-MDG.VWS ein so ist der Fehler dann weg und die Sortierung passt.

Ist das wohl ein ADS Bug?
Ist ein bekanntes Verhalten und kein Bug (und war schon immer so). Die ANSI-Sortierung GERMAN sieht ein Leerzeichen nach dem Bindestrich vor... und alle Ausdrücke/Felder/... werden nach hinten mit Leerzeichen aufgefüllt. Bei V8 müsste noch das ansichr utility dabei sein. Damit kannst Du Dir Deine eigene Sortierung anhand der Windows-Sortierung erstellen (zB MYGERMAN) und dabei "ignore symbols" anhaken. Damit müsste es sowie von Dir erwartet funktionieren.
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Antworten