Ungültiger numerischer Wert für Operation

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

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

Ungültiger numerischer Wert für Operation

Beitrag von ramses »

Hallo

in letzter Zeit häufen sich in meinen Programmen Fehlermeldung in der Funktion str() alle betroffenen Zeilen haben die letzten 10-20 Jahre OHNE solche Fehlermeldungen gearbeitet.
Der Funktion wird jeweils das Ergebnis einer Rechnung z.B. aus 2 Datenbankfelder übergeben:

Code: Alles auswählen

?? str(field->skontoabz/(field->skontober/100),10,1)
Die Fehlermeldung:
------------------------------------------------------------------------------
oError:args :
-> VALTYPE:N
VALUE: 0.00
-> VALTYPE:N
VALUE: 10
-> VALTYPE:N
VALUE: 1
canDefault : F
canRetry : F
canSubstitute: T
cargo :
description : Ungültiger numerischer Wert für Operation
filename :
genCode : 12
operation : str
osCode : 0
severity : 2
subCode : 5
subSystem : BASE
thread : 1
tries : 0

Beide Datenbankfelder sind vom Typ "N" Nummerisch Länge 10 Stellen, 2 Dez. Stellen. Ein oder beide Werte können 0 enthalten.
Division durch 0 ist im Errorhandler abgefangen so dass jeweils 0 Zurückgegeben wird.
Der Zugriff auf die Datenbank erfolgt über ADSDBE.
Xbase-Version 2.0.807
ADS-Version 10.10.0.49 axcws32.dll Version 10.10.0.49

Es ist nicht nur obige Zeile betroffen, sondern viele verschiedene Zeilen mit jeweils unterschiedlichen Auswertungen(Rechnungen).
Der Fehler kann nicht bewusst herbeigeführt werden.
Er schlägt sporadisch zu, Tagelang gar nicht, dann wieder mehrfach.
Obige Zeile ist seit über 20 Jahren im Code, die vergangenen Jahre hat es auch nicht ein Problem gegeben, erst seit einer der letzten Xbase Versionen häufen sich diese Fehler auf eine Anzahl die der Kunden nicht mehr aktzeptiert.

Kennt jemand diese neue Erscheinung?

Gruss Carlo
Zuletzt geändert von ramses am Fr, 29. Sep 2017 18:15, insgesamt 2-mal geändert.
Valar Morghulis

Gruss Carlo
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: Ungültiger numerischer Wert für Operation

Beitrag von Jan »

Hallo Carlo,

die Fehlermeldung sagt ja ganz eindeutig, das Du da drei numerische Werte an Str() übergeben hast. DAS kann also jedenfalls nicht der Fehler sein.

genCode 12 sagt: The variable is too long to fit into field. -- Invalid numeric value (e.g. 3 % 0 or float number is too large for array index)

Wobei sich mir die Frage stellt: Warum ist 0.0 zu groß, um als 10.1 dargestellt zu werden?

Ansonsten: Alaska fragen. Sowas können vermutlich nur die wirklich beantworten.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Ungültiger numerischer Wert für Operation

Beitrag von ramses »

Hallo Jan

Danke für deine Bestätigung. Weisst du langsam beginne ich doch zu zweifeln, jedenfalls komme ich mir gegenüber dem Kunden blöd vor ... wie erklährts du dass Programmteile deren Source nicht geändert wurde seit Jahren perfekt läuft auf einmal nach irgend einem Update von xbase Zicken macht? Da es dabei noch die Buchhaltung ist macht es nicht einfacher.

Aber du hast recht ich schreibe mal an Alaska. Was ich bis zur Antwort von Alaska den Kunden sage weis ich nicht. Ich habe gehoft dass jemand einen Tip hat oder auch schon über dieses Problem gestossen ist.

Gruss Carlo
Valar Morghulis

Gruss Carlo
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: Ungültiger numerischer Wert für Operation

Beitrag von Martin Altmann »

Naja, Jan,
nicht zu groß? Er hat 0,00 und will die mittels str() mit einer(!) Nachkommastelle darstellen!
Sollte eigentlich kein Problem sein - aber ich habe noch die 1.9 SL1 im Einsatz.

Carlo,
was passiert, wenn Du statt str() mit transform() arbeitest?

Viele Grüße,
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.
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: Ungültiger numerischer Wert für Operation

Beitrag von Jan »

Hallo Martin,

OK, das könnte man so sehen. Aber lt. Hilfe von Alaska wird gerundet, wenn die angefragten Dezimalstellen kleiner sind als die tatsächlichen. Aber ja, das wäre mal eine Idee, den errechneten Wert erstmal mit Round() auf 1 Nachkommastelle zu bringen, und danach erst in Str() einzusetzen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
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: Ungültiger numerischer Wert für Operation

Beitrag von Martin Altmann »

Laut Alaska... schon.
Aber - es wurde ja schon Mal Code "gebrochen". Keine Ahnung, ob es das ist. Ich kann es auch nicht testen/provozieren, da ich keine aktuelle Version habe.
Ist halt nur eine Idee...

Viele Grüße,
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.
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: Ungültiger numerischer Wert für Operation

Beitrag von ramses »

Hallo Martin

das dumme ist dass sich der Fehler nicht gezielt herbeiführen lässt.
Vorallem wurden die "Problemzeilen" in den letzten Jahren sicher mehrere Mio mal Durchlaufen immer ok .... ich kann doch nicht alle str() gegen transform() austauschen....
z.b. es passiert beim Posten 5 nach Neustart kann der Posten 5 aber problemlos 20 Mal aufgerufen werden ohne ein Problem.
Es trifft auch unterschiedlichen Stellen wie ? str() oder @ .... say str() oder str() + str() + str()

Als gemeinsamkeit sehe ich dass es immer passiert wenn ein Wert berechnet wurde, z.B aus Datenbankfelden oder Mem-Vars auch nach Round() jedoch noch nie in einer Zeile die nur ein Datenbankfeld anzeigt wird. ( str(field->betrag,10,2) )

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Ungültiger numerischer Wert für Operation

Beitrag von AUGE_OHR »

ramses hat geschrieben: Di, 08. Aug 2017 15:02ich kann doch nicht alle str() gegen transform() austauschen....
in so einem Fall würde ich es per

Code: Alles auswählen

// Dummy
#xtranslate STR( => TRANSFOM(
machen. wie die genaue Syntax ist müsste man erarbeiten.

Frage : tritt das Problem auf mehreren/allen PCs auf oder nur auf einer bestimmten Workstation ?
gruss by OHR
Jimmy
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: Ungültiger numerischer Wert für Operation

Beitrag von brandelh »

Str() und Transform() haben aber ganz andere Syntax.

Ich würde in so einem Fall nicht auf die Errorsys vertrauen, dass die die division durch 0 abfängt, sondern eine eigene Funktion aufrufen mit beiden Werten, die dies abfängt:

Code: Alles auswählen

function MyDivZahl(n1, n2, nLen, nDez)
    local cZahl, nWert
    if empty(n1) .or. empty(n2)
       cZahl := space(nLen) // oder space(nLen-3)+"0,0" ??
    else
       nWert := n1 / n2 **** deine Funktion 
       cZahl := Str(nWert,nLen,nDez)
    endif
return cZahl
dann würde im Fehlerfall auch eine Zeilennummer in deiner Funktion angezeigt werden und man käme dem Problem näher.
Gruß
Hubert
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: Ungültiger numerischer Wert für Operation

Beitrag von ramses »

Hallo

@ Jimmy

es sind verschiedene PC's betroffen.


@Hubert

auf die Errorsys bezw. das so abfangen der DIvision durch Null hat viele viele Jahre so funktioniert. Wenn man sich auf das nicht mehr verlassen kann ist das beinahe ein Totalschaden des ganzen Programms würden bedeuten den ganzen Code auf solche Stellen abzusuchen. Das dürfte es doch so nicht sein !?

Gruss Carlo
Valar Morghulis

Gruss Carlo
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Ungültiger numerischer Wert für Operation

Beitrag von Koverhage »

64-bit ?
Division durch 0.000000000000000000000000000000000000000000000000000111 ?
Wenn der Patch nicht installiert ist passiert das.
Gruß
Klaus
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: Ungültiger numerischer Wert für Operation

Beitrag von ramses »

Hallo Klaus

welcher Patch?

Gruss Carlo
Valar Morghulis

Gruss Carlo
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: Ungültiger numerischer Wert für Operation

Beitrag von brandelh »

War das nicht ein Patch für 1.90.xxx ?
Der Zugriff auf die Datenbank erfolgt über ADSDBE.
Xbase-Version 2.0.807
ADS-Version 10.10.0.49 axcws32.dll Version 10.10.0.49
PS: ich sage nicht, dass die Methode über die ErrorSys() nicht ok ist, ich würde es nur nie so machen.

Meine Errorsys() ist stark erweitert um Fehler zu dokumentieren, dabei kam es vor, dass dort auch Fehler entstanden, das wird dann übel ;-)
Aber ich hatte ADSDBE und Xbase++ 2.00 übersehen, also vergiss meinen Eintrag einfach
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Ungültiger numerischer Wert für Operation

Beitrag von Koverhage »

Carlo,
es gibt bzw. gab einen Patch dafür, den ich selbst aber aufgrund einer abgelaufenen Subscription nicht installieren konnten.
Deshalb behelfe ich mich an den Stellen wo es passiert mit Val(STR(nWert)).
Gruß
Klaus
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: Ungültiger numerischer Wert für Operation

Beitrag von brandelh »

Das war für 1.90.355, PDR 6130 und 6286, beide wurden mit dem Hotfix 36 behoben, dürften also in 2.00.x gar keine Rolle mehr spielen.
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Ungültiger numerischer Wert für Operation

Beitrag von Koverhage »

sorry hatte das übersehen das Carlos die 2.0 Version einsetzt.
vermute aber das sich das Problem trotzdem in dem Bereich befindet.
Gruß
Klaus
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: Ungültiger numerischer Wert für Operation

Beitrag von ramses »

PS: ich sage nicht, dass die Methode über die ErrorSys() nicht ok ist, ich würde es nur nie so machen.
Ich vermutlich mit dem Wissen von heute auch nicht mehr.
Wenn dies jetzt plötzlich nicht mehr geht und solche Zeilen zu sporadischen Fehlern führen ist das nicht mehr handelbar.
An vielen Stellen in den Programmen sind Divisionen, wie Füllstandsberechnungen, Kapazitätsberechnung uva. da ist eine Div durch 0 absolut normal und darf doch nicht plötzlich zu Fehlern führen. Vorallem kann man schlicht nicht hingehen und nach Jahren den gesamten Code vom xxxxxxx Zeilen überarbeiten.

Ich weiss momentan wirklich nicht mehr weiter. Mein aktuelles Konzept "aktuelle Tools" verwenden scheint zum Totalschaden zu werden ......

Gruss Carlo
Valar Morghulis

Gruss Carlo
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: Ungültiger numerischer Wert für Operation

Beitrag von brandelh »

Da der Fehler nur selten Auftritt, musst du die Errorsys um Infos erweitern, z.b. immer fortschreiben, oder den Dateinamen um Datum und Uhrzeit (Rechnername) ergänzen.
Dann würde ich in der Zeile die die DIV 0 behandeln soll in der ErrorSys einen LOG einbauen, damit du sieht, er kam da mit ... Werten an und gab ... zurück.

Betrifft es nur Datenbankfelder oder auch Berechnungen mit local Variablen ?

Betrifft es nur die ADSDBE oder auch DBF...
Gruß
Hubert
DelUser01

Re: Ungültiger numerischer Wert für Operation

Beitrag von DelUser01 »

ramses hat geschrieben: Di, 08. Aug 2017 13:36

Code: Alles auswählen

?? str(field->skontoabz/(field->skontober/100),10,1)
Zerlege die Zeile doch mal in mehrere und schaue was dann herauskommt, z.B.:

Code: Alles auswählen

a := field->skontober / 100
b := field->skontoabz / a
?? str( b , 10 , 1 )
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: Ungültiger numerischer Wert für Operation

Beitrag von ramses »

Hallo Hubert, Hallo Roland

das tut meine Errorsys bereits. Sie schreibt sämtliche Infos, Username, Exeversion, Verzeichnisse, geöffnete DBF's Index aktuelle DBF, Index, recno() usw. usw. weg.
Betrifft es nur Datenbankfelder oder auch Berechnungen mit local Variablen ?
Das kann ich nicht bestimmen. Einzig es folgt nach einer Berechnung auch über Locale Vars.

Ich habe heute den ganzen Tag versucht den Fehler zu provozieren .... ohne Erfolg.... einzig hat sich das Test-Programm unter dem Debugger einige male von 6MB auf 160MB aufgebläht und ist dann mit einer xppfatal gecrasht ....


Gruss Carlo
Valar Morghulis

Gruss Carlo
DelUser01

Re: Ungültiger numerischer Wert für Operation

Beitrag von DelUser01 »

Carlo - wie in dem anderen Beitrag erwähnt, versuche es doch einmal mit einer Funktion die Dir den String zurückgibt. Ich meine, dass es irgendwie möglich sein müsste eine (weitere) andere Fehlermeldung zu produzieren die einen zusätzlichen Hinweis auf den Ursprung des Übels gibt. Und damit Str(...) entlastet.

So dass in der Ausgabezeile nur noch die String-Var ausgegeben wird
?? cErgebnis

( https://xbaseforum.de/viewtopic.php?f=9 ... 41#p115038 )


Habe interessehalber meinen gesamten Code grob durchforstet,
3x ? str(... (nur in 3 Testprogrammen)
0x ?? str(...
Ich verwende also str() so gut wie nicht in Zeilen mit ? oder ??
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Ungültiger numerischer Wert für Operation

Beitrag von AUGE_OHR »

ramses hat geschrieben: Di, 08. Aug 2017 19:14es sind verschiedene PC's betroffen.
OK ... aber nicht auf alle PCs und nicht immer ... dann konntest du es ja simulieren und den Fehler finden.

ihr geht alle auf das STR() raus aber IMHO passiert schon vorher "etwas" wonach ich schauen würde.
ich habe ein Logbuch wo ich in solchen Fällen nachsehe was der User wann vorher gemacht hat.

Szenario :
User öffnet DBF um in einer Maske was einzugeben.
jetzt kommt ein Anruf der eine ganze Zeit lang dauert -> kein Logbuch Bewegung
nach dem Anruf gibt er weiter Daten ein und klickt auf "save" und bekommt einen Absturz mit "unsinniger" Meldung.

die Meldung alleine bringt einen evtl. noch nicht weiter aber wenn man in das Logbuch sieht käme man auf die Idee ob ein Timeout vorliegen könnte der Schlussendlich zum Fehler führt.

also suche mal im Umfeld vor dem Fehler ob du da Gemeinsamkeiten findest was den Fehler provozieren könnte.

Nachtrag :

ich sehe gerade in "Seltsames Verhalten Version 817" den letzten Beitrag mit "Index" ...
es wäre ein Test wert bei den Betreffenden DBF ein Index mit STR(Feld) aufzubauen um zu sehen ob es ohne Fehler durchläuft. zumindest wäre man dann sicher das die Daten OK sind und kein Mist rein gekommen ist (z.b. defekter Cluster auf einer HDD)
gruss by OHR
Jimmy
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: Ungültiger numerischer Wert für Operation

Beitrag von ramses »

Hallo Jimmy, Hallo Roland

die Gemeinsamkeit ist dass:

-- ein Ergebiss aus einer Rechnung mit einem nummerischen Datenbankfeld (über ADSDBE) in str() zum Crash führt.
-- es in einer Schlaufe passiert in welcher z.B. Rechnungen gedruckt werden, nach x Rechnungen ---> BUMM
-- ein in str() in vielfacher Kombi geschiet z.b. ? str() oder auch arr[1] := str() usw. usw.


Der Support hat verschiedene Vermutungen. Besonders eigene DLL-Funktionsaufrufe stehen im Focus,
Das gleiche Problem ( ADS - str() ) ist anscheinend auch schon aufgetreten jedoch hatte der Betroffene Alaska nicht mehr über die Lösung/Ursache informiert.

Gruss Carlo
Valar Morghulis

Gruss Carlo
DelUser01

Re: Ungültiger numerischer Wert für Operation

Beitrag von DelUser01 »

Hallo Carlo

ich wiederhole mich...
hast Du getestet, was passiert wenn Du die Berechnungen usw. vor der Ausgabe mit ?/?? Dann NUR die String-Var mit den ausgiebst. Da muss sich was ändern...
Nur Du kannst das testen, sonst kann ich Dir kein bishchen weiterhelfen...

Ev. auch die Ausdrücke in Str(...) nochmal zusätzlich in Klammern stellen.

?? str(field->skontoabz/(field->skontober/100),10,1)
|
V
?? str( ( field->skontoabz / ( field->skontober / 100 ) ) , 10 , 1 )
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: Ungültiger numerischer Wert für Operation

Beitrag von ramses »

Hallo Roland

Ja das habe ich getestet.

z.B.
a := field->skontoabz/(field->skontober/100)
? str(a,10,1) --> BUMM

oder

a := ( field->skontoabz/(field->skontober/100) )
? str(a,10,1) --> BUMM


Gruss Carlo
Valar Morghulis

Gruss Carlo
Antworten