..
procedure TForm1.FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput;
var AUserData: TObject);
var
Result: TBcd;
begin
Result := AInputs[0].AsNumber - AInputs[1].AsNumber;
AOutput.SetData(@Result, SizeOf(Result), etNumber);
end;
..
Dalo by sa ušetriť pri ukladaní dát, predstavoval by som si to takto (Doplnený výpočet potrebnej veľkosti pre uloženie):
procedure TForm1.FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput;
var AUserData: TObject);
var
iSize : Integer;
Result: TBcd; // BCD ukladá 2 bajty + reťazec bajtov [0..31]. Ale nie všetky sú potrebné.
begin // Z prvého bajtu sa dá vypočítať potrebná dĺžka na uloženie
Result := AInputs[0].AsNumber - AInputs[1].AsNumber;
// Vypočíta len potrebné bajty pre uloženie.
iSize := 2 + Result.Precision div 2 + Result.Precision mod 2;
// Počet odložených bajtov je iSize, namiesto SizeOf(Result),
AOutput.SetData( @Result, iSize, etNumber );
end;
Ušetí sa nielen manipulácia s textom / UTF16 / UTF8, ale aj nepotrebné bajty.
To by v reále mohlo predstavovať kľudne 3/4 úspory miesta ba možno aj výrazne viac.
Pre milióny riadkov, by to možno už stálo za úvahu.
Asi by to aj bežalo rýchlejšie.
- V zmysle tvojho podkladu, bolo vyriešené správne ukladanie pre funkciu.
- Vkladanie cez kód Delphi v tvare Field.AsBcd=.. správne ukladá data do BLOBU.
- Ukladanie cez INSERT INTO by potrebovalo vyriešiť.
To sa stále ukladá ako TEXT, aj po týchto zásahoch.
Prikladám obrázok, ako sú data viditeľné v programe SQLiteSPY.
Oba riadky obrázku obsahujú rovnaké BCD čísla
Čo sa týka kompatibility dát mimo môjho programu, tak si nerobím veľké ambície.
Budem tam mať viacero úprav s cieľom vylepšiť vlastné používanie SQLite.
Ale bude k dispozícii export, import.. Nakoniec, je stále možnosť využiť klasický Double..
Pre istotu kód, ktorý ukazuje naplnenie tabulky z priloženého obrázku:
qryCreate.SQL.Text := 'DROP TABLE IF Exists tblBCD;' + #13#10 +
'CREATE TABLE tblBCD ( n_bcd23 FLOATTEXT, n_bcd25 FLOATTEXT );';
qryCreate.ExecSQL;
qryCreate.SQL.Text := 'SELECT n_bcd23, n_bcd25 from tblBCD;';
qryCreate.Open;
qryCreate.Append; // vloženie do tabuľky
x2 := StrToBcd( '-12345678901234567890.12345678901234567890123456789012', fmtSettingsDOT ); // BCD číslo
qryCreate.Fields[ 0 ].AsLocaleBCD := x2; // vloženie do tabuľky
qryCreate.Fields[ 1 ].setAsLocaleBCD( '123456789012345.6789' ); // vloženie do tabuľky
qryCreate.Post;
// qryCreate.Close;
qryCreate.SQL.Text := 'Insert into tblBCD ( n_bcd23, n_bcd25 ) values' + #13#10 +
'( ''-12345678901234567890.12345678901234567890123456789012'',' + #13#10 +
'123456789012345.6789 );';
qryCreate.ExecSQL;