Databáze > Obecné

SQLite a TBCD prakticky + Problém

(1/9) > >>

miroB:
Skúšam SQLite + FireDAC + TBCD.
Pôvodne ma vystrašila info z odkazu:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_SQLite_with_FireDAC#High-Precision_Numbers

Spravil som pokus, viď priložený obrázok.
Tvorba a naplnenie tabuľky v SQL  (qryCreate):

--- Kód: MySQL ---DROP TABLE IF Exists tblBCD;CREATE TABLE tblBCD ( bcd23 Numeric( 64,23 ), bcd25 Numeric( 64,25 ) );Insert into tblBCD ( bcd23, bcd25 ) values  ( '-12345678901234567890,12345678901234567890123456789012345678901',    '-12345678901234567890,123456789012345678901234567890123456789012' );select rowid, bcd23, bcd25 from tblBCDNa výstupe sú však miesto desatinných oddeľovačov znaky "<". Je vidieť aj na obrázku.
Kontrola cez kód:

--- Kód: Delphi ---usesData.FmtBcd..procedure TForm1.FormCreate(Sender: TObject);var  x, y, x2, y2 : TBCD;  s, s2, s3 : String;begin  if dbMain.Connected then    dbMain.Connected   := false;  dbMain.Connected     := true;  qryCreate.ExecSQL;  qryCategories.Active := True;                 // PROBLÉM :  s   := qryCategories.Fields[ 0 ].AsString; // s : obsahuje kompletný záznam, ale ten znak "<" ..  s2  := StringReplace( s, '<', ',', [] );   // s2 je už s čiarkou ..  y   := StrToBcd( s2 );                     // korektné BCD číslo  s3  := BcdToStr( y - 1 );                  // korektný výsledok  x2  := qryCategories.Fields[ 0 ].AsBcd;    // toto zdanlivo funguje, ale Precision je poškodenáend;ešte SQL kód qryCategories:

--- Kód: MySQL ---select   *,rowid from tblBCD
Naplnenie cez kód sa však správa korektne:

--- Kód: Delphi ---  s := '-12345678901234567890,12345678901234567890123456789012';  x2 := StrToBcd( s );                   // BCD číslo  qryCategories.Edit;                    // vloženie do tabuľky  qryCategories.Fields[ 0 ].AsBCD := x2; // vloženie do tabuľky  qryCategories.Post;                    // vloženie do tabuľky  y2 := qryCategories.Fields[ 0 ].AsBCD; // vloženie do tabuľky  x := y2 - 1;                           // VYBRATIE z tabuľky + matem operácia  s3  := BcdToStr( x );                  // koprektný výsledok//    '-12345678901234567891,12345678901234567890123456789012345678901'Zdá sa, že SQLite + FireDAC dokážu manažovať BCD
Problém je zatiaľ len s vkladaním pomocou SQL - INSERT INTO
Z kódu Delphi sa BCD čísla vložené a vybrané z tabuľky správajú korektne

Problém je zrejme vo FormatSettings, pretože vo Windows mám decimal separator ako čiarku.

ČIASTKOVÝ ZÁVER: BCD je v SQLite vďaka FireDAC použiteľné bez okľuky cez TEXT, či BLOB.
Funguje typ NUMERIC. Zatiaľ vidím jediný väčší problém: napĺňanie BCD cez INSERT INTO..

Apropos: operácie v databáze sa zrejme prevádzajú na Double, pretože matemat operácie dajú presnosť len v rámci Double.
To by vyzeralo na dodatočné UDF funkcie..


vandrovnik:
A nemá se v tom INSERT použít desetinná tečka?

vandrovnik:
Jinak hlodá ve mně zvědavost, z jakého měření padají tak přesná čísla, protože i double by uměl uložit vzdálenost ze Země k Alfa Centauri s přesností na 1 cm 10 m :-)

miroB:

--- Citace: vandrovnik  20-07-2018, 10:52:09 ---A nemá se v tom INSERT použít desetinná tečka?

--- Konce citace ---
S bodkou to nefungovalo vôbec. S čiarkou tak, ako som napísal.
Celkom verím, že sa vo vnútri procesov bije čiarka s bodkou.
Zrejme ak by som mal Win-y nastavene na US, prebehlo by všetko OK. Preskúmam neskôr.
Pri pokuse s čiarkou dáva Delphi túto hlášku:
'-12345678901234567890.12345678901234567890123456789012 is not a valid BCD value'.
Ak zamením bodku za čiarku, je to OK.
Niekde som tu videl tému, kde sa rieši nastavenie FormatSettings, aby Delphi bralo od štartu generálne bodku ako oddelovač. Alebo použiť funkciu
TryStrToBcd(AValue, Result, FormatSettings)


--- Citace: Delfin  20-07-2018, 11:34:58 ---
--- Citace: Miroslav Baláž  19-07-2018, 14:50:17 ---Pôvodne ma vystrašila info z odkazu:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_SQLite_with_FireDAC#High-Precision_Numbers

--- Konce citace ---

Duvod je na miste. Manual rika, ze pro takto precizni hodnoty mas pouzit datovy typ TEXT a mapovani datovych typu FireDAC. SQLite tak precizni hodnotu do datoveho typu REAL neulozi.

--- Konce citace ---
Vtip je v tom, že ten Numeric funguje. Je pravdepodobné, že FireDAC interne prehodí typ na blob, alebo text. Funguje nad tým napríklad aj agregačná funkcia SUM. Ibaže zobrazí double. Zatiaľ mi vkladanie funguje len cez Delphi kód. Nie cez SQL. Napríklad pre Numeric( 26,16 ), sa zdá, že pracuje ako s Float/Double.
Ale Numeric( 64,23 ), založí zrejme pole typu Char(34), aspon taky je datasize. Hlási ho však ako ftFMTBcd.


--- Citace: vandrovnik  20-07-2018, 11:51:12 ---Jinak hlodá ve mně zvědavost, z jakého měření padají tak přesná čísla, protože i double by uměl uložit vzdálenost ze Země k Alfa Centauri s přesností na 1 cm 10 m :-)

--- Konce citace ---
Teraz je to ako hobby. Ale plánujem to rozbehnúť. Už viackrát som narazil na problém s nepresnosťou pri sčítaní veľkého množstva údajov. V rámci rôznych štatistík.
Najmä ak ide o rôzne postupy, tak sa výsledky nezhodovali presne.
V bankách furt mali problém s presnosťou. To som však zažil (ako pozorovateľ), pred rokmi, teraz nie:)
PS: Ak by riadne fungoval Extended aj pod 64 bit kódom, ani by ma nenapadlo riešiť nejaké BCD.
Tie obrovské čísla, čo som prezentoval, išli už len pre zaujímavosť až na hranicu toho, čo zvláda BCD.



miroB:

--- Citace: Delfin  20-07-2018, 15:58:41 ---Vecer mrknu na to co se uvnitr deje..

--- Konce citace ---
Rád sa dozviem niečo praktické na túto tému. Alebo zo zákulisia..

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi