Numerisches Feld läuft nur bei ADS Nutzung über

Advantage Database Server

Moderator: Moderatoren

Antworten
MatthiasF
Rookie
Rookie
Beiträge: 14
Registriert: Mi, 27. Feb 2008 7:18
Wohnort: Berlin

Numerisches Feld läuft nur bei ADS Nutzung über

Beitrag von MatthiasF »

Hallo zusammen,
ich möchte eines unserer xbase Programme unter ADS 9.0.0.7 laufen lassen. Es werden ganz normale dBase Datenbanken und NTX Indizes benutzt. Das Programm arbeitet seit einem Jahr als Clipper Programm und seit drei Wochen als xbase programm ohne ADS sehr gut und fehlerfrei. Sobald ich jedoch die Datenbanken mit dem ADS geöffnet habe, kommt es an bislang einer Programmstelle zu folgendem Fehler:
FEHLERPROTOKOLL von "I:\LAGER\EIGEN\DATENFUNK\CHE_DFUE.EXE" Datum: 18.11.08 12:59:15

Xbase++ Version : Xbase++ (R) Version 1.90.331
Betriebssystem : Windows 2000 05.00 Build 02195 Service Pack 4
------------------------------------------------------------------------------
oError:args :
-> VALTYPE: N VALUE: 1
-> VALTYPE: N VALUE: 1
oError:canDefault : N
oError:canRetry : N
oError:canSubstitute: J
oError:cargo : {NIL, 4004, Error 4004: Advantage Expression Engine evaluator stack overflow.}
oError:description : L„nge des Datenbankfeldes wurde berschritten
oError:filename :
oError:genCode : 63
oError:operation : <1> + <1>
oError:osCode : 0
oError:severity : 2
oError:subCode : 8029
oError:subSystem : BASE
oError:thread : 1
oError:tries : 0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von STATUS_3E(1062)
Aufgerufen von WE_AN_HTS(3806)
Aufgerufen von VON_FUNK(6547)
Aufgerufen von DFUE_MEN(592)
Aufgerufen von MAIN(335)
Im Forum nachgeschaut: Aha da möchte jemand 1000 in ein dreistelliges numerisches Feld reinschreiben, bei clipper gabs ***, bei xbase den oben genannten Fehler.

Code: Alles auswählen

In Zeile 1062 steht folgendes:
repl ACDAT->ACBEST1 with ACDAT->ACBEST1 + BZDAT->BZANZ1

ACBEST1 ist numerisch definiert und 9 stellig, BZANZ1 ebenfalls. Beide hatten zum Zeitpunkt des Geschehens den Wert 1. Das sagt die Zeile oError:operation: (1) + (1) und entspricht auch meiner Prüfung vorher und nachher.
Also 1 + 1 paßt nicht in ein neunstelliges numerisches Feld ? Ich habe es mehrfach überprüft, war auch mal 68 + 1. Es ist auch nicht so, daß das mal funktioniert und mal nicht. Es gibt immer den gleichen Fehler. Das Feld ACBEST1 ist nicht Bestandteil des Indexes. Das ganze funktioniert erst dann wieder, wenn ich die Datei ACDAT ohne ADS, also mit DBFNTX öffne. Dann paßt es wieder und funktioniert immer.
Jemand ne Idee, wonach ich suchen kann ? Besten Dank im vorraus.
Gruß Matthias Fischer
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Re: Numerisches Feld läuft nur bei ADS Nutzung über

Beitrag von Lewi »

Versuche doch mal folgendes:

Code: Alles auswählen

nWert := ACDAT->ACBEST1 + BZDAT->BZANZ1
repl ACDAT->ACBEST1 with nWert
MatthiasF
Rookie
Rookie
Beiträge: 14
Registriert: Mi, 27. Feb 2008 7:18
Wohnort: Berlin

Re: Numerisches Feld läuft nur bei ADS Nutzung über

Beitrag von MatthiasF »

Hallo Lewi,
habs probiert. Funktioniert auch nicht, gleicher Fehler, bloß ein paar Zeilen tiefer. Danke trotzdem.
Etwas weiter oben in meinem Programm ist praktisch die gleiche Operation (1+1 in einem neunstelligen num. Datenbankfeld errechnen) nochmal. Da bin ich aber mit meinem Programm schon vorbei und es gab keinen Fehler. Es muß also an der Datei oder ihrem Index liegen, ich werde jetzt eher in dieser Richtung forschen. Leider kann ich an Struktur und Index nichts ändern, da basiert ein uraltes gekauftes Programm drauf.
Gruß Matthias Fischer
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Re: Numerisches Feld läuft nur bei ADS Nutzung über

Beitrag von hschmidt »

Hallo Matthias,

der Fehler 4004 ist bei ADS folgendermaßen dokumentiert:
Problem: An error occurred in the Advantage Expression Engine evaluator. The result of the parsed index key expression is too long to fit on the internal evaluator stack.
Solution: 4004 errors are typically caused by modifying a table's structure without deleting and re-building the index. 4004 errors are also caused by variable length index keys being created, often as a result of using a TRIM function in the index expression without using a PAD function.
Das deutet also tatsächlich auf ein Problem mit einem Index hin. Hast Du schon mal ein Reindex gemacht?

Hans
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Numerisches Feld läuft nur bei ADS Nutzung über

Beitrag von Tom »

Es ist dringend zu empfehlen, bei Einsatz des ADS alle Datenbanken zu re-indexieren und bei Tabellen mit mehr als einem Memofeld sogar per ADS zu kopieren (öffnen mit DBFNTX und COPY TO ... VIA ADSDBE). Sonst crasht es an Stellen, an denen man keine Fehler erwarten würde. Indexe und Tabellen sind nicht ganz kompatibel (nur rückwärts).
Herzlich,
Tom
MatthiasF
Rookie
Rookie
Beiträge: 14
Registriert: Mi, 27. Feb 2008 7:18
Wohnort: Berlin

Re: Numerisches Feld läuft nur bei ADS Nutzung über

Beitrag von MatthiasF »

Erstmal danke für die Antworten.
Reindex und kompletten Indexneuaufbau und auch umkopieren habe ich schon mehrfach versucht.
Ich bin allerdings noch nicht auf den Gedanken gekommen, das mit dem ADS zu versuchen. Das probier ich aus, muß es aber erstmal programmieren.
Übrigens sieht der einzige Index der Datei so aus:

Code: Alles auswählen

index on str(ackunr,6,0) + acarnr + aczusatz + aczoll + acmonitur + dtoc(acmhd) + ackulakuna 
Ich habe mir mal die Indexbeschreibungen angeschaut. Was diesen Index so einmalig in dem gekauften Programm macht, ist das dtoc() vom Mindesthaltbarkeitsdatum, kein andere Index hat sowas. Könnte es da noch einen Schalter in xBase oder ADS geben ?
Gruß Matthias Fischer
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Numerisches Feld läuft nur bei ADS Nutzung über

Beitrag von brandelh »

Hi,

ein dtoc() Index erscheint mir recht sinnlos ...
10.10.2005
10.10.2006
10.10.2007
...
10.11.2005
10.11.2006
10.11.2007
...
allerdings so weit hinten wird er für die Sortierung wohl nicht mehr nötig sein.
dtos() wäre besser, kann das die ADS ?
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Numerisches Feld läuft nur bei ADS Nutzung über

Beitrag von Tom »

Hallo, Hubert.

Ja, die ADS kann DtoS(), aber DtoC() macht tatsächlich einen gewissen Sinn, wenn man die entsprechende Sortierung nicht benötigt, aber (nur) nach konkatinierten Ausdrücken suchen will, die Datumsfelder enthalten. Will man also für einen bestimmten Tag suchen und hat außer diesem Datum ackunr, acarnr, aczusatz, aczoll und acmonitur zur Verfügung, funzt das.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Numerisches Feld läuft nur bei ADS Nutzung über

Beitrag von brandelh »

brandelh hat geschrieben:ein dtoc() Index erscheint mir recht sinnlos ...
recht sinnlos bedeutet ja nicht, dass es nicht doch noch irgendeinen gewissen Sinn geben kann ;-)

Auf jeden Fall hielte ich es für recht unsinnig, wenn ich die Artikel (und was sonst noch in den anderen Variablen steht) eines Tages anzeigen will und dann alle Artikel durchsuchen muss ob einer davon vielleicht auch an diesem Tage verkauft wurde ...

aber wie gesagt, wer von uns weiß schon was und warum das so programmiert wurde ;-)
Gruß
Hubert
Antworten