Numerische Werte

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
FrankG
Rookie
Rookie
Beiträge: 10
Registriert: Sa, 22. Jul 2006 8:12
Wohnort: Bonn

Numerische Werte

Beitrag von FrankG »

Hallo xBase-Forum,

auf der Suche nach einem Problem mit dem ADS, ADSDBE und der Index-Erstellung ist mir folgendes aufgefallen:

In einer Datenbank (nur ein Datensatz) pflege ich einen Zähler für die fortlaufende Auftragsnummer. Dieses Datenbank-Feld ist definiert mit N 8,0.

Den Wert lese ich unspektakulär in eine Variable ein: nauftrag:=stat->statnummer

Wenn man sich nun den Wert mit entsprechender Picture-Klausel anzeigen lässt, erhält man folgendes Ergebnis:

532535,000000000100000000000000

und wenn man .0000000001 hinzuaddiert
erhält man tatsächlich folgendes Ergebnis

532535,000000000200000000000000


Wenn man den 1. Wert rundet auf "keine" Nachkommastelle, erhält man das gleiche Ergebnis (wie 1).

Mich interessiert, warum ist das so? Ich bräuchte einfach eine Ganze-Zahl.

Ich glaube, dass es deshalb beim Speichern des Datensatzes in der Auftragsdatenbank in Zusammenhang mit Multiplikationen in der Index-Definition zu Problemen mit der ADSDBE kommt.

Grüße aus Bonn


Frank
Krause
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Mo, 08. Jan 2007 8:55
Wohnort: In Thüringen

Beitrag von Krause »

Hallo Frank,

hattest Du der Variable nauftrag bei der Initialisierung einen Wert zugewiesen, etwa so:

Code: Alles auswählen

LOCAL nauftrag:=0
wenn nicht, einfach mal ausprobieren. Was ergibt eigentlich:

Code: Alles auswählen

nauftrag:=Int(stat->statnummer )
Mit freundlichen Grüßen
Joachim Krause
FrankG
Rookie
Rookie
Beiträge: 10
Registriert: Sa, 22. Jul 2006 8:12
Wohnort: Bonn

Beitrag von FrankG »

Hallo Joachim,

Danke für die Hinweise. Ich hatte die Variable (habe sofort schlechtes Gewissen bekommen) ausnahmsweise mal deklariert. Auf die Idee mit der INT()-Funktion wäre ich nicht gekommen.

Aber xBase zeigt sich FAST, aber nicht völlig unbeeindruckt:

kanzeige(n2auftrag,int(n2auftrag),int(n2auftrag+0.0000000001),int(n2auftrag)+0.0000000001)

Anzeige:
532541,000000000100000000000000
532541,0000000001000000000000000
532541,000000000100000000000000
532541,000000000200000000000000

Insbesondere der dritte Parameter zeigt, dass da wohl System hintersteckt. Aber welches?

Grüße

Frank
Krause
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Mo, 08. Jan 2007 8:55
Wohnort: In Thüringen

Beitrag von Krause »

Hallo Frank,

dieses Problem hatte ich auch schon in einem anderem Zusammenhang, also ADS – unabhängig, bei der Programmierung eines Zufallsgenerator. Letztendlich habe ich mir dann meine eigene INT()-Methode geschrieben, hier liegt wohl ein Xbase Fehler vor:

Code: Alles auswählen

**********************************************************************
METHOD SYSC0A01:SysInt(nValue)
**********************************************************************
  LOCAL cStrNumber:=Transform(nValue,""), nDmy:=0 
  cStrNumber:=StrTran(cStrNumber,SetLocale(NLS_STHOUSAND),"")
  nDmy:=Rat(SetLocale(NLS_SDECIMAL),cStrNumber)
  IF nDmy <> 0
   nDmy:=Val(Left(cStrNumber,nDmy-1))
  ELSE
   nDmy:=Val(cStrNumber)
  ENDIF
RETURN nDmy
seit Verwendung dieser Methode habe ich keine Probleme mehr, habe es allerdings auch nicht mehr weiter verfolgt. Einfach mal ausprobieren ...

Mit freundlichen Grüßen
Joachim Krause
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

Xbase++ kennt keine Ganzzahlen. So einfach ist das.

Bei Transform() und str() werden diese Werte passend gerundet und mit int() erzeugt man eine Fließkommazahl, die ganz dicht an einer INT ist, aber es bleibt eine Fließkommazahl.
Zuletzt geändert von brandelh am Di, 20. Feb 2007 1:36, insgesamt 1-mal geändert.
Gruß
Hubert
Krause
UDF-Programmierer
UDF-Programmierer
Beiträge: 52
Registriert: Mo, 08. Jan 2007 8:55
Wohnort: In Thüringen

Beitrag von Krause »

Hi,

aber in meinem Beispiel war es nicht ganz einerlei. Wenn man Int(0,irgendetwas) eingibt, einen Vergleich mit 0 durchführt und dann noch höflicher weise ein FALSE zurückbekommt, dann kann ich nicht viel Freude an dem geschilderten Sachverhalt in einer DO WHILE - Schleife finden ...
Xbase++ kennt keine Ganzzahlen. So einfach ist das.
... wie man's eben nimmt!

Mit freundlichen Grüßen
Joachim Krause
Antworten