Einzelnen Beitrag anzeigen

cltom

Registriert seit: 22. Sep 2005
221 Beiträge
 
Delphi 12 Athens
 
#1

TryStrToFloat/TryStrToInt, leeren String nicht als 0 erhalten

  Alt 30. Apr 2022, 13:40
Delphi-Version: XE2
Hallo,

ein Thema, das bestimmt zigfach gelöst ist, ich hab aber keine gute Lösung dazu, die nicht einen irren Aufwand verursacht.

Es sollen Werte aus Edit-Feldern in diverse Variablen geschrieben werden. Dafür wird TryStrToInt/TryStrToFloat verwendet. Die Werte werden numerisch gebraucht für einige Rechnungen. Dann wird alles in eine SQL-DB geschrieben. Später geht der Weg natürlich wieder retour, aus der SQLite ins Objekt, von da wieder ins UI via FloatToStr(...).

Nun kann es sein, dass manche Eingabefelder leer bleiben, der User also einfach nichts eingibt. Das soll auch erlaubt sein. Allerdings: es soll nun beim Lesen auch wieder nichts drinstehen, nicht "0". Wie kriegt man das hin, dass entlang obiger Kette das "nichts" erhalten bleibt und nicht eine 0 rauskommt.


Die Themen fangen schon damit an, dass beim TryStrToFloat bei einem ungültigen String als Eingabe ja letztlich ein Wert in der Variable vorhanden ist. Beim TryStrToInt kommt Null raus.


Die Varianten, die mir mal eingefallen sind:

1. das Ergebnis von TryStrToInt/TryStrToFloat verwenden
TryStrToInt/Float hab ich ja schon, da kann ich ja das result nehmen. Aber wie weiter? Ich müsste ja dann für jede Variable einen bool mitführen, der das Ergebnis von TryStrToInt enthält, um später zu entscheiden, ob der Wert in die DB geschrieben wird. Denn sobald Null drinsteht, landet Null in der DB und ich kann später nicht mehr sagen, ob die Null eine Eingabe war oder beim TryStrToInt entstanden ist. Die SQL-Anweisungen werden dann allerdings ein absurder Aufwand, weil ich für jede Variable einzeln prüfen muss, ob ihr zugehöriger "bin-eine-echte-Null"-bool wahr ist. Allein die Prüfung TryStrToInt verhindert ja nicht, dass in der Variable eine Null landet, wenn der string='' ist
Variation: den bool führen und zusätzlich mit in die DB aufnehmen. Dann bleibt der SQl-Zugriff unberührt ... enorm aufgebläht um zahhlose bools zwar ... schick ist anders.

2. bei einem false von TryStrToX einen "Markerwert" in die Variable setzen
Also beim false von TryStrToX der Variable einen Wert verpassen, der exotisch genug ist, dass er real sonst nicht vorkommt. Damit kann man alles machen, die DB-Zugriffe ändern sich nicht. Da könnte man wohl die "def"-Variante verwenden. Beim Züruckholen ins UI wird der Wert abgefangen und durch '' ersetzt. Nachteile: es wird ein falscher Wert geführt, der in den Rechnungen Probleme machen könnte. Da müsste man allerhand Unsinn abfangen. Die Datenbank enthält falsche Werte, die bei allen folgenden Abfragen/Rechnungen/etc. berücksichtigt werden müssten und letztlich womöglich eines Tages keiner weiß, warum ein Teil der Felder merkwürdige Zahlen enthält.

3. alle Eingaben grundsätzlich mal als String abspeichern. Dann ist mal die Originaleingabe erhalten. Für die Rechnung brauch ich die Umwandlung dennoch, dh die Variablenzahl verdoppelt sich. In der DB hab ich dann entweder nur noch strings und bin damit eingeschränkt oder alles doppelt. Einmal als string, einmal numerisch. Auch hier: der Aufwand ist groß, die Struktur in der Datenbank alles andere als elegant



Hab bestimmt was Eleganteres übersehen, oder?

danke

Gruß
cltom
  Mit Zitat antworten Zitat