SQLite a TBCD prakticky + Problém

Autor Téma: SQLite a TBCD prakticky + Problém  (Přečteno 771 krát)

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1050
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite a TBCD prakticky + Problém
« Odpověď #30 kdy: 22-07-2018, 20:46:45 »
Niečo v tom smere sme už preberali. Myslíš, že mám šancu?

O tech prefixech v aliasech sloupcu nevim. Nejspis to byl nekdo jiny. Kazdopadne na uzavreni tohoto tematu mi prijde ze zbyva jedina vec[1]. A to jak popsat sloupec s UDF v SELECT listu. Pri pouziti kalkulacni udalosti:

Kód: Delphi [Vybrat]
  1. procedure TForm1.FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject);
  2. begin
  3.   AOutput.AsNumber := AInputs[0].AsNumber - AInputs[1].AsNumber;
  4. end;

se v metode TSQLiteValue.SetData pro parametr AOutput nastavi datovy typ SQLITE_TEXT a hodnota se prevede na text s desetinnou teckou. Problem nastane pri cteni hodnoty accessorem AsBcd (jenz pouziva systemovy format), nebo neco vic?

[1]: Ten zbytek s mapovanim sloupcu vlastnim datovym typem jak jsi psal funguje.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Miroslav Baláž

  • Hrdina
  • ****
  • Příspěvků: 323
  • Karma: 13
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite a TBCD prakticky + Problém
« Odpověď #31 kdy: 22-07-2018, 21:22:21 »

Kód: Delphi [Vybrat]
  1. procedure TForm1.FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject);
  2. begin
  3.   AOutput.AsNumber := AInputs[0].AsNumber - AInputs[1].AsNumber;
  4. end;

se v metode TSQLiteValue.SetData pro parametr AOutput nastavi datovy typ SQLITE_TEXT a hodnota se prevede na text s desetinnou teckou. Problem nastane pri cteni hodnoty accessorem AsBcd (jenz pouziva systemovy format), nebo neco vic?
..
Tá funkcia/event funguje. Len je treba Castnúť funkciu v rámce SELECT.
Napríklad:
Kód: MySQL [Vybrat]
  1. SELECT Rozdiel(MyField, 5.5) AS [rslt::Numeric(30,0)]
Potom sa dá čítať Field.AsBcd a aj Field.AsAnsiString.
Ak sa necastne, dá sa čítať len Field.AsAnsiString.
Ten cast s použitím '::' má však iné negatívne dôsledky. To by bolo na dlhšie. Preto by som nahradil CAST :: radšej niečím ako:
"AS n_Result", čím by SQLite získal info, že to má castnúť na Numeric(30,0). Vďaka prefixu "n_". Taký prefix zaručene nebude páchať žiadnu ďalšiu škodu, ako je pácha "::"

OK. Zatiaľ mám dosť informácií a námetov.
Toto vlákno je už dlhé a stráca prehľadnosť.
Priebežne teda vykonám nejaké operácie, ktoré zvládnem. Aj na základe vecí popísaných tuná. Až sa to celé niekam rozumne posunie a budem mať viac info, ozvem sa s prípadnými ďalšími otázkami.

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1050
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite a TBCD prakticky + Problém
« Odpověď #32 kdy: 23-07-2018, 10:17:57 »
Tá funkcia/event funguje. Len je treba Castnúť funkciu v rámce SELECT.
Napríklad:
Kód: MySQL [Vybrat]
  1. SELECT Rozdiel(MyField, 5.5) AS [rslt::Numeric(30,0)]
Potom sa dá čítať Field.AsBcd a aj Field.AsAnsiString.
Ak sa necastne, dá sa čítať len Field.AsAnsiString.

Ano, protoze FireDAC s nastavenim AOutput.AsNumber pouzije datovy typ SQLITE_TEXT s konverzi na hodnotu s desetinnou teckou. V datasetu se pak o tom UDF sloupci (bez toho ::DataType hintu) vi pouze to ze je typu SQLITE_TEXT. Tudiz pro nej FireDAC vyrobi TStringField a hodnoty ve storage jsou s desetinnou teckou (a pokud mas system nastaveny jinak nez na tecku, AsBcd selze).

Ty vracis hodnotu pres AOutput.AsString (taktez datoveho typu SQLITE_TEXT) s desetinnym separatorem ze systemu (coz Ti tim padem zfunkcni AsBcd). Na stejny problem jako na zacatku vsak v tomto pripade narazis pokud v SQL prikazu pouzijes typecast typu AS [rslt::Numeric(30,0)] (FireDAC pro takovy sloupec ocekava hodnoty s teckou).

Zaverem, v tomto pripade bych se snazil spis prizpusobit a pro konverzi hodnot techto sloupcu na BCD pouzil fixne desetinnou tecku, tedy vytvoril bych napr. helper (cimz se dostanes k implementaci toho co jsem predtim radil):

Kód: Delphi [Vybrat]
  1. type
  2.   TFieldHelper = class helper for TField
  3.   public
  4.     function AsBCD(const Format: TFormatSettings): TBcd;
  5.   end;
  6.  
  7. implementation
  8.  
  9. { TFieldHelper }
  10.  
  11. function TFieldHelper.AsBCD(const Format: TFormatSettings): TBcd;
  12. begin
  13.   if not (Self is TStringField) then
  14.     Result := GetAsBCD
  15.   else
  16.     Result := StrToBcd(GetAsString, Format);
  17. end;

Pouziti pak:

Kód: Delphi [Vybrat]
  1. var
  2.   Value: TBcd;
  3.   Settings: TFormatSettings;
  4. begin
  5.   Settings := TFormatSettings.Create;
  6.   Settings.DecimalSeparator := '.';
  7.  
  8.   Value := FDQuery1.Fields[0].AsBCD(Settings);
  9. end;


Nakonec, ono by vraceni hodnoty s carkou z te UDF mohlo mit negativni vliv napr. pri ukladani hodnoty do sloupce s affinity NUMERIC.
« Poslední změna: 23-07-2018, 10:32:49 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1050
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite a TBCD prakticky + Problém
« Odpověď #33 kdy: 23-07-2018, 11:20:03 »
Ostatne pro to, aby ses prizpusobil se priklani i vyuziti bindovanych parametru (resp. vyuziti accessoru AsFMTBCD). Tam se taktez pouzije fixne konverze na hodnotu s desetinnou teckou a datovy typ se nastavi na SQLITE_TEXT.

Cili rada na zaver, pouzivej jako separator vzdy desetinnou tecku a pro nacteni hodnoty z pole pouzij namisto vlastnosti AsBCD vlastni helper kde bude mozne zvolit format nezavisly na systemu (kde pro konverzi textu na BCD pouzijes jako separator tecku).
« Poslední změna: 23-07-2018, 11:41:36 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Miroslav Baláž

  • Hrdina
  • ****
  • Příspěvků: 323
  • Karma: 13
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite a TBCD prakticky + Problém
« Odpověď #34 kdy: 23-07-2018, 11:56:52 »
Ďakujem. Ten tebou navrhovaný Helper je riešením.
len som ho musel upraviť, aby sa BCD dali aj zapisovať.
Procedúra "getAsBCD_Local" sa zdá byť zbytočná. Ale inak to neviem vyriešiť.
Kód: Delphi [Vybrat]
  1.   TFieldHelper = class helper for TField
  2.     function getAsBCD_Local: TBcd;
  3.     procedure setAsBCD_Local( const Value: TBcd );
  4.   public
  5.     property AsBCD: TBcd read getAsBCD_Local write setAsBCD_Local;
  6.   end;
a funkcie:
Kód: Delphi [Vybrat]
  1. { TFieldHelper }
  2. // ČÍTANIE
  3. function TFieldHelper.getAsBCD_Local: TBcd;
  4. begin
  5.   if Self is TStringField then
  6.     Result := StrToBcd( GetAsString, fmtSettingsDOT )
  7.   else
  8.     Result := GetAsBCD;
  9. end;
  10. // ZÁPIS
  11. procedure TFieldHelper.setAsBCD_Local( const Value: TBcd );
  12. begin
  13. {  if Self is TStringField then
  14.     SetAsString( Data.FmtBcd.BcdToStr( Value, fmtSettingsDOT ) )
  15.   else}
  16.   SetAsBCD( value );
  17. end;
S tou bodkou máš pravdu, študujem:
FireDAC,Phys.SQLiteWrapper :  FDStr2BCD a FDBCD2Str. Obe natvrdo použijú bodku
Kód: Delphi [Vybrat]
  1. function TSQLiteValue.GetData(var AValue: Pointer; var ASize: Integer;
  2.   AByRef: Boolean = False; AExtDataType: TSQLiteExtDataType = etUnknown): Boolean;
  3. ..
  4. case iType of  // etNumber
  5.         SQLITE_TEXT,
  6.         SQLITE_BLOB:
  7.           FDStr2BCD(PChar(pVal), iSize, PBcd(AValue)^, '.'); // Tu je natvrdo bodka
  8. ..
  9. a
  10. procedure TSQLiteValue.SetData(AValue: Pointer; ASize: Integer;
  11.   AExtDataType: TSQLiteExtDataType = etUnknown);
  12. ..
  13. etNumber:
  14.       begin
  15.         pVal := Database.Buffer.Check(C_FD_MaxFixedSize);
  16.         FDBCD2Str(PChar(pVal), iSize, PBcd(AValue)^, '.');  // Tu je natvrdo bodka
  17.         iType := SQLITE_TEXT;
  18.       end;

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1050
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite a TBCD prakticky + Problém
« Odpověď #35 kdy: 23-07-2018, 12:26:27 »
Neni zac! ;) Prave ty metody TSQLiteValue.GetData a TSQLiteValue.SetData slouzi k predavani dat mezi FireDAC a SQLite (coz je napr. pro cteni hodnot z poli a vstupnich parametru UDF a zapisu hodnot poli a vystupniho parametru UDF). Proto jsem na zaver vyrazil s radou se prizpusobit.

Ohledne navrhovaneho helperu, dej pozor na prekryti puvodni property a na to ze pri pouziti puvodni verze zapisu se (u Tebe) pro TStringField ulozi retezec s carkou, zatimco ctes s teckou. Odkomentuj co mas v TFieldHelper.setAsBCD_Local, jinak budes zapisovat jinak nez cist.

Abych se tedy vyhnul rozbiti kodu jenz ocekava puvodni implementaci AsBCD, pouzil jsem unikatni nazev (AsLocale prefix se muze hodit; muzes si pak vyrobit i dalsi jako AsLocaleDateTime atd.) a pridal moznost specifikace formatu:

Kód: Delphi [Vybrat]
  1. type
  2.   TFieldHelper = class helper for TField
  3.   private
  4.     function GetAsLocaleBCD(const Format: TFormatSettings): TBcd;
  5.     procedure SetAsLocaleBCD(const Format: TFormatSettings; const Value: TBcd);
  6.   public
  7.     property AsLocaleBCD[const Format: TFormatSettings]: TBcd read GetAsLocaleBCD write SetAsLocaleBCD;
  8.   end;
  9.  
  10. implementation
  11.  
  12. { TFieldHelper }
  13.  
  14. function TFieldHelper.GetAsLocaleBCD(const Format: TFormatSettings): TBcd;
  15. begin
  16.   if not (Self is TStringField) then
  17.     Result := GetAsBCD
  18.   else
  19.     Result := StrToBcd(GetAsString, Format);
  20. end;
  21.  
  22. procedure TFieldHelper.SetAsLocaleBCD(const Format: TFormatSettings; const Value: TBcd);
  23. begin
  24.   if not (Self is TStringField) then
  25.     SetAsBCD(Value)
  26.   else
  27.     SetAsString(BcdToStr(Value, Format));
  28. end;

Pouziti:

Kód: Delphi [Vybrat]
  1. var
  2.   Value: TBcd;
  3.   Settings: TFormatSettings;
  4. begin
  5.   Settings := TFormatSettings.Create;
  6.   Settings.DecimalSeparator := '.';
  7.  
  8.   Value := FDQuery1.Fields[0].AsLocaleBCD[Settings];
  9.   ...
  10.   FDQuery1.Fields[0].AsLocaleBCD[Settings] := Value;
  11. end;
« Poslední změna: 23-07-2018, 12:47:06 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Miroslav Baláž

  • Hrdina
  • ****
  • Příspěvků: 323
  • Karma: 13
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite a TBCD prakticky + Problém
« Odpověď #36 kdy: 23-07-2018, 12:48:53 »
Nie sú to vlastne chyby vo FireDAC? Veď by to malo všetko fungovať..

A.
Ten helper mi však nedovolí zapísať
Kód: Delphi [Vybrat]
  1. Field.AsBcd='-1234567890.0123456789';// Toto hlási chybu konverzie
  2. // Lebo ide hneď v úvode cez funkciu
  3. class operator TBcd.Implicit(const str: string): TBcd;
  4. begin
  5.   if not TryStrToBcd(str, Result) then
  6.     raise EBcdException.Create(SInvalidInput);
  7. end;
  8. //a v nej to zhavaruje
Existuje aj funkcia "TryStrToBcd(AValue, Bcd, FormatSettings)"
Dá sa spraviť nejaký helper aj na class operator TBcd.Implicit ?
Mätie ma ten class operator. Viem aký má význam, ale prácu s týmto prvkom ozaj nepoznám.

B.
..
- dej pozor na prekryti puvodni property  ???  čo sa stane ak ju prekryjem? Veď o to mi ide nie?
a na to ze
- pri pouziti puvodni verze zapisu se (u Tebe) pro TStringField ulozi retezec s carkou.
V mojej verzii som schválne vynechal :
Kód: Delphi [Vybrat]
  1. {  if Self is TStringField then
  2.     SetAsString( Data.FmtBcd.BcdToStr( Value, fmtSettingsDOT ) )
  3.   else}
Pretože tade to snáď nikdy nepôjde.
Ak zapisujem AsBCD, tak Firedac si pamätá, že zapisujem do poľa TNumericField a nie do TStringField
« Poslední změna: 23-07-2018, 13:16:48 od Miroslav Baláž »

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1050
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite a TBCD prakticky + Problém
« Odpověď #37 kdy: 23-07-2018, 13:17:04 »
- dej pozor na prekryti puvodni property  ???  čo sa stane ak ju prekryjem? Veď o to mi ide nie?

To ja netusim :) Mozna bys narazil na problem kdybys soucasne pracoval i s jinymi (napr. pametovymi) dataset objekty (prip. DBMS).

- pri pouziti puvodni verze zapisu se (u Tebe) pro TStringField ulozi retezec s carkou.
V mojej verzii som schválne vynechal :
Kód: Delphi [Vybrat]
  1. {  if Self is TStringField then
  2.     SetAsString( Data.FmtBcd.BcdToStr( Value, fmtSettingsDOT ) )
  3.   else}
Pretože tade to snáď nikdy nepôjde.
Ak zapisujem AsBCD, tak Firedac si pamätá, že zapisujem do poľa TNumericField a nie do TStringField

On si nic nepamatuje. Jen jsi pouzil mapovani a pravdepodobne ted zapisujes do pole typu TFMTBCDField. Kdyby to pole bylo typu TStringField ulozil bys do nej hodnotu s desetinnou carkou. Zkus vypnout mapovani a nacti zaznam s polem s affinity TEXT (napr. ten navrhovany FLOATTEXT), edituj dataset, zaznam znova nacti a zkus precist hodnotu. Skoncis na "not a valid BCD value" protoze do toho sloupce ulozis carku a snazis se cist s teckou.
« Poslední změna: 23-07-2018, 13:20:10 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Miroslav Baláž

  • Hrdina
  • ****
  • Příspěvků: 323
  • Karma: 13
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite a TBCD prakticky + Problém
« Odpověď #38 kdy: 23-07-2018, 13:28:59 »
Jasne, už chápem všetky pripomienky.

Ešte k môjmu bodu A.
TBcd.Implicit: pokúšam sa o record helper for TBcd
Lenže chyba: E2123 PROCEDURE, FUNCTION, PROPERTY, or VAR expected
Teda neviem ako modifikovať class operator Implicit, aby som mu podtsrčil
TryStrToBcd(AValue, Bcd, FormatSettings)
Je to v Data.FmtBcd

Predbežne odhadujem, že to nemá riešenie. Viď SO:
https://stackoverflow.com/questions/30126479/is-there-a-workaround-to-make-class-operators-work-for-built-in-types
« Poslední změna: 23-07-2018, 13:47:45 od Miroslav Baláž »

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1050
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite a TBCD prakticky + Problém
« Odpověď #39 kdy: 23-07-2018, 14:05:09 »
Nie sú to vlastne chyby vo FireDAC? Veď by to malo všetko fungovať..

Nerekl bych. Pro tak presne hodnoty potrebujes pro SQLite sloupec s affinity TEXT.

Pro nej (stejne jako pro sloupec s UDF bez ::DataType hintu) se bez mapovani vytvori sloupec TStringField do nejz se da ulozit jakykoli text protoze neexisuje zadna informace o tom ze bylo umyslem ukladat desetinna cisla. Zapis i cteni textove hodnoty accessorem AsBCD probiha dle lokalniho nastaveni systemu. FireDAC pak ulozi data tak jak byla predana o vrstvu vyse.

S mapovanim se da presvedcit FireDAC, aby pro sloupec s affinity TEXT vytvoril TFMTBCDField. Pres accessor AsBCD se predavaji data v numericke podobe s tim ze je pak FireDAC konvertuje z pripadne do textove podoby za fixniho pouziti tecky jako separatoru.

Cili FireDAC Ti nabizi pro tento pripad pomocnou ruku v podobe mapovani (pro UDF je treba hintu, pripadne jak jsi navrhoval prefixy v nazvech). Sloupec s affinity TEXT je treba pouzit v kazdem pripade.

K tomu bodu A.
TBcd.Implicit. Pokúšam sa o record helper for TBcd
Lenže chyba: E2123 PROCEDURE, FUNCTION, PROPERTY, or VAR expected
Teda neviem ako modifikovať class operator Implicit
Je to v Data.FmtBcd

Mam obavu ze s tim nic nenadelas. Helpery zda se nemaji podporu operatoru.
« Poslední změna: 23-07-2018, 14:06:56 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Miroslav Baláž

  • Hrdina
  • ****
  • Příspěvků: 323
  • Karma: 13
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite a TBCD prakticky + Problém
« Odpověď #40 kdy: 23-07-2018, 14:10:52 »
Pretože Record helper TBCD pre "class operator" nie je možný, tento rébus:
Kód: Delphi [Vybrat]
  1. Field.AsBcd='-1234567890.0123456789';
Som vyriešil funkciou:
Kód: Delphi [Vybrat]
  1. procedure TFieldHelper.setAsLocaleBCD( const Value: String );
  2. begin
  3.   if Self is TStringField then
  4.     SetAsString( Value )
  5.   else
  6.     SetAsBCD( StrToBcd( Value, fmtSettingsDOT ) );
  7. end;
  8. ..// VOLANIE:
  9. Fields.setAsLocaleBCD( '-1234567890.0123456789' );
  10.  

Offline Miroslav Baláž

  • Hrdina
  • ****
  • Příspěvků: 323
  • Karma: 13
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite a TBCD prakticky + Problém
« Odpověď #41 kdy: 23-07-2018, 14:17:09 »
Nie sú to vlastne chyby vo FireDAC? Veď by to malo všetko fungovať..

Nerekl bych. Pro tak presne hodnoty potrebujes pro SQLite sloupec s affinity TEXT.
No mne sa zdá, že tu boli prezentované štandardné metódy. Tie fungujú napr. pre US nastavenie určite bez problémov. Lenže programovací nástroj by mal rešpektovať aj národné nastavenia.
Alebo by mal umožniť pomocou prítomných parametrov situáciu vyriešiť.
Ak by aj všetko ostatné fungovalo len pre US, tak ani Unicode nie je treba .. Obrazne povedané.

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1050
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite a TBCD prakticky + Problém
« Odpověď #42 kdy: 23-07-2018, 14:44:13 »
No mne sa zdá, že tu boli prezentované štandardné metódy. Tie fungujú napr. pre US nastavenie určite bez problémov. Lenže programovací nástroj by mal rešpektovať aj národné nastavenia.
Alebo by mal umožniť pomocou prítomných parametrov situáciu vyriešiť.
Ak by aj všetko ostatné fungovalo len pre US, tak ani Unicode nie je treba .. Obrazne povedané.

To si vyrid s SQLite ;) Sloupce s numerickou affinity vyzaduji v hodnote tecku (a pokud presahnou rozsah, zaokrouhli se). Proto je treba pouzit sloupec s textovou affinity (coz je zkratka jen text). A bez mapovani jde jen o text o nemz FireDAC nevi nic. S mapovanim (pro UDF hintem) jde porad o text, ale jeho cteni a ukladani probiha v rezii FireDAC (s teckou). No a pokud mu primo v SQL prikazu ulozis hodnotu jinak, tak se na nej nemuzes zlobit (porad je to jen neznamy text, ktery se mapovanim nebo sloupcem dle hintu snazi zkonvertovat).
« Poslední změna: 23-07-2018, 14:48:15 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Miroslav Baláž

  • Hrdina
  • ****
  • Příspěvků: 323
  • Karma: 13
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite a TBCD prakticky + Problém
« Odpověď #43 kdy: 23-07-2018, 15:23:43 »
A kto tam strká tú čiarku? Nikto iný než systém. Nie užívateľ. Ani SQLite nie. Neviem prečo si BCD berie niečo zo systému, ak mu to prekáža. BCD je vlastne riešené v Data.FmtBcd, takže nie FireDAC, ale Delphi spôsobuje tieto ťažkosti.
Samozrejme aj pri Double je presne ten istý problém, ale ten sa darí niekde po ceste zakryť, na rozdiel od BCD.

Online Delfin

  • Guru
  • *****
  • Příspěvků: 1050
  • Karma: 52
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQLite a TBCD prakticky + Problém
« Odpověď #44 kdy: 23-07-2018, 15:46:17 »
A kto tam strká tú čiarku? Nikto iný než systém. Nie užívateľ. Ani SQLite nie. Neviem prečo si BCD berie niečo zo systému, ak mu to prekáža. BCD je vlastne riešené v Data.FmtBcd, takže nie FireDAC, ale Delphi spôsobuje tieto ťažkosti.
Samozrejme aj pri Double je presne ten istý problém, ale ten sa darí niekde po ceste zakryť, na rozdiel od BCD.

Delphi vrstva DB. Ale ona nemuze tusit ze si prave ted prejes konvertovat BCD na text s jinym nez systemovym separatorem. Nevi, ze je o nekolik vrstev nize FireDAC a SQLite jenz potrebuji tecku. Nicmene carku muze vlozit i uzivatel konstantni hodnotou v SQL prikazu.

Ano, chybi moznost ten format specifikovat. A to nejspis accessorem. Nebo pridat do TField separatni format settings (vychozi ze systemu) s tim ze kde by se dalo by se volaly konverze podle nej.
« Poslední změna: 23-07-2018, 16:00:18 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):