SQLite und Beträge?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

SQLite und Beträge?

Beitrag von TT73GP7 »

Hallo zusammen,

ich Bastel mir grade eine kleine Warenwirtschaft zusammen.
Nun bin ich an den punkt das ich bei den Artikeln preise hinterlegen will.

nun welchen Datentyp nimmt man dafür in SQLite eigentlich?

Viele Grüße
Alex

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: SQLite und Beträge?

Beitrag von Michl »

Willkommen im Lazarusforum!

Wenn du SQLDB (Package mit Lazarus geliefert) verwendest, kannst du Currency als Datentyp nehmen. Nimmst du dann ein TDBEdit, werden nur Zahlen und Dezimaltrenner als Eingabemaske zugelassen.

Zeos speichert Currency als undefined Varchar und du musst selber prüfen, ob Eingaben einem Preis entsprechen (z.B. dem User einen Hinweis ausgeben, dass der Preis ein falsches Format hat).

PS: Bitte keine Mehrfachposts http://www.lazarusforum.de/viewtopic.php?f=18&t=9622 zum gleichen Thema. Es meldet sich schon jemand, auch wenn es manchmal etwas dauert.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

EgonHugeist
Beiträge: 93
Registriert: Di 17. Apr 2012, 22:41

Re: SQLite und Beträge?

Beitrag von EgonHugeist »

@Michl

Michl hat geschrieben:Zeos speichert Currency als undefined Varchar und du musst selber prüfen, ob Eingaben einem Preis entsprechen (z.B. dem User einen Hinweis ausgeben, dass der Preis ein falsches Format hat).

Kann ich so nicht stehen lassen... War das mal so?

Code: Alles auswählen

 
....
        stFloat, stDouble, stCurrency, stBigDecimal:
          FErrorcode := FPlainDriver.bind_double(FStmtHandle, i,
            ClientVarManager.GetAsFloat(InParamValues[i-1]));
....

Da SQLite keinen Currency Typen kennt, leg ich Currency values als Double ab. Beim lesen sollten das Feld mit 'MONEY' enden -> SQLite affinities (e.g. SMALLMONEY etc)

Nur so am Rande..
ZeosDevTeam

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: SQLite und Beträge?

Beitrag von Michl »

EgonHugeist hat geschrieben:@Michl

Michl hat geschrieben:Zeos speichert Currency als undefined Varchar und du musst selber prüfen, ob Eingaben einem Preis entsprechen (z.B. dem User einen Hinweis ausgeben, dass der Preis ein falsches Format hat).

Kann ich so nicht stehen lassen... War das mal so?

Code: Alles auswählen

 
....
        stFloat, stDouble, stCurrency, stBigDecimal:
          FErrorcode := FPlainDriver.bind_double(FStmtHandle, i,
            ClientVarManager.GetAsFloat(InParamValues[i-1]));
....

Da SQLite keinen Currency Typen kennt, leg ich Currency values als Double ab. Beim lesen sollten das Feld mit 'MONEY' enden -> SQLite affinities (e.g. SMALLMONEY etc)

Nur so am Rande..
Ich hatte gestern nur einen kurzen Test gemacht und nicht in den Code geschaut. Zugegeben, ich muss ZEOS auf den neusten Stand bringen (was ich eben machen wollte aber irgendwie ist der SVN-Server gerade nicht erreichbar), in meiner genutzen Version (SVN testing-7.2) ist Currency aber auch schon als Double definiert.

Allerdings wird in einem TDBGrid das Currency Datenfeld erst mit ZConnection.Properties-Zusatz "Undefined_Varchar_AsString_Length=255" angezeigt und es können problemlos sonstige Zeichen "abc.." eingegeben und gespeichert werden. D.h. es legt genau das Verhalten, wie ein undefined Varchar an den Tag. Daher meine obige Falschaussage.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: SQLite und Beträge?

Beitrag von TT73GP7 »

ich habe das nun mit Decimal(10,2) gemacht

geht wunderbar :)

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: SQLite und Beträge?

Beitrag von ErnstVolker »

Hallo,

ich frage mal hier, denn ich habe das Problem mit Postgres.

In Postgresql ein Feld mit numeric(20,2) definiert.

Im DBGrid und auf einem Formular in einem TCurrencyEdit werden einfache Tausender-Zahlen mit Tausender-Trennzeichen angezeigt.

1 Mio wird nur als 100 und 10 Tsd nur als 1 angezeigt.

Was mache ich denn da schon wieder falsch?

Schönen Abend

Volker

ErnstVolker
Beiträge: 336
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: SQLite und Beträge?

Beitrag von ErnstVolker »

Die Antwort auf meine Frage:

Den Datentyp "numeric" nicht verwenden. Besser "double precision" oder "money". Wobei ich ganz am Anfang meines Gebastel (Postgres 14 oder was ich da am Start hatte) mit "money" meine liebe Not hatte. Siehe hier: viewtopic.php?f=17&t=7936&p=134771&hili ... ey#p134771

Jetzt bin ich wieder bei money und es funktioniert (PG15, Lazarus Trunk 3.99 auf Manjaro und Win 11). Double geht auch.

Sicherer ist vermutlich double. Ich schau einfach was passiert und wie sich das entwickelt.

Schönen Abend

Volker

Antworten