Autor Téma: SQLite využtie Afinity  (Přečteno 4935 krát)

Offline miroB

  • Guru
  • *****
  • Příspěvků: 612
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
SQLite využtie Afinity
« kdy: 17-08-2018, 21:46:58 »
SQLite umožňuje ukladať rôzne typu údajov, do poľa s preddefinovaným typom.
Na rozdiel od iných databáz. Napríklad text do poľa definovaného ako integer.
Dosť ma to prudí. Až doteraz.. Teraz by som to rád využil.
Základná myšlienka: Excel generuje chybové hlášky, ktoré sa tvária ako text. Napríklad "#N/A".
Viď prvá tabuľka obrázku.
Celkove má Excel tých hlášok cca 8 rôznych. Pri výpočte ich samozrejme ignoruje.
Užívateľ má vizuálnu informáciu - ak by sa mu zažiadalo chyby opraviť:)
Rovnaký cieľ mám teraz aj s SQLite databázou. Pri preberaní údajov z Excelu.

Je definovaná experimentálna tabuľka:
Kód: MySQL [Vybrat]
  1. CREATE TABLE [Chyby_Harok]
  2.         ([Prvý] BIGINT
  3.         ,[Druhý] VARCHAR( 16 )
  4.         ,[Tretí] BIGINT
  5.          );
Naveľa sa mi ju podarilo naplniť v zmysle obrázku. Musel som však pre
Kód: MySQL [Vybrat]
  1. insert into .. VALUES ( :P0, :P1, :P2)
do parametrov zadať typ ftString a všetko to napľňať ako text.
Pôvodne som dúfal, že to tam nasúkam krížom krážom integery a texty a iné typy, podľa potreby, keď to má byť SQLite engine ukradnuté..
Zrejme to však FireDAC stráži.
Dobre, lenže teraz by som tie údaje rád aj zobrazil. Je preukázané, že sú v tabuľke.
Viď stredný obrázok, to je externý program SQLiteSPY, ktorý so zobrazením nemá najmenší problém.
Ale moje Delphi to zobrazuje pri rovnakom SQL príkaze s nulami, miesto chybových textov.
Kód: MySQL [Vybrat]
  1.         Prvý, Druhý, Tretí
  2.         FROM Chyby_Harok
Verziu z Delphi vidieť v tretej tabuľke obrázku.
Asi je to FireDAC, ktorý ten text nepustí v poli typu integer.
Dal by sa nejako oblafnúť?
Aby som vedel zobraziť údaje z tabuľky tak, ako to vie program SQLiteSPY?
« Poslední změna: 17-08-2018, 21:52:05 od Miroslav Baláž »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 612
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite využtie Afinity
« Odpověď #1 kdy: 21-08-2018, 20:38:45 »
Čiastočne vyriešené:
Nie ideálne, lebo sa nepodrží originálny datový typ poľa, ale ide o funkčné riešenie:

V prípade, importu z Excelu, ktorý obsahuje v stĺpci chybové hlášky a treba ich v databáze zobraziť v originálnom vzhľade, je možné dané pole importovať ako text.
Nad textovým poľom, ktorý bol originál typu Integer, alebo Float, je možné vykonať v SQLite SELECT, ktorý podporuje bežné operácie, vrátane matematiky, funkcií a aj agregačných funkcií. Je to overené.

Dokonalejšie by bolo mať údaje v pôvodnom type s vloženým textom. Teda napr. Integer a len chybové hlášky by boli typu text. To SQLite dovolí. Lenže v Delphi, via FireDAC neviem takéto pole interpretovať inak, než, že texty/chybové hlášky sa zobrazia ako 0/NULA.
Sú programy, čo zvládnu zobraziť mixovaný obsah (napr. SQLiteSPY)
Zatiaľ teda pole s chybami (#N/A), prevádzam pri importe do databázy na text.

Ale ak by niekto našiel spôsob, ako fireDAC v tomto obalamutiť, stále mám záujem..
- Bolo by to lepšie pre pridávanie údajov, pretože v pôvodnej várke nemuseli byť chyby, ale v appendnutej už áno. SQLite neumožní zmeniť typ poľa dodatočne.

- Plus.. taký integer zaberie 4 bajty, a ako text môže až 8.
Dokonca SQLite vie integer, ba aj Float stlačiť na 1 bajt, ak sa aktuálne jedná napr. o celočíselnú hodnotu v rozsahu -128..127. Bez ohľadu, či je pole bigint, alebo float.
SQLite minimalizuje pre každú jednu hodnotu ukladací priestor. Ako to je len možné.

Pripomínam, že ide o SQLite. Ostatné databázy takýto typový "guláš" v jednom poli neumožňujú.
« Poslední změna: 21-08-2018, 21:08:15 od miroB »

Offline miroB

  • Guru
  • *****
  • Příspěvků: 612
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:SQLite využtie Afinity
« Odpověď #2 kdy: 22-08-2018, 00:48:18 »
Ďalší čiastkový úspech, vlastne finálny. Dobré je, že nevyžaduje zásah do zdrojákov FireDAC.

Prišiel som síce na funkciu GetData vo FireDAC.Phys.SQLiteWrapper a lokalizoval presné miesta, kde FireDAC zatĺka texty v poli typu Integer. Ale je to tam viacnásobne poistené, takže by to bolo trochu Harakiri.

Jednoduchší postup:
Pole naplniť číslami a aj chybami, ak tam sú. (Postup bol spomenutý vyššie)
Bežný SELECT zobrazí len čísla. Chybové text sú interpretované ako 0 (Nula).
Kód: MySQL [Vybrat]
  1. SELECT  [Prvý] as [s_Nulami]
  2.          FROM [Sheet1]

Vhodným SELECT-om je však možné zviditeľniť chybové texty pomocou CAST AS Text.
Lepšie pomocou vychytávky FireDAC/SQLite '::'
Riešenie:
Kód: MySQL [Vybrat]
  1. SELECT  [Prvý] as [s_Chybami::Text( 15 )]
  2.          FROM [Sheet1]
Zobrazí údaje presne tak, ako SQLiteSPY na strednom obrázku úvodného príspevku.
To bolo vlastne zmyslom dotazu.

Musel som úlohu vyriešiť sám, keď má teraz Delfín tú dovolenku :)
« Poslední změna: 22-08-2018, 01:01:26 od miroB »