Pouzij uvozovky, jde o alias:Kód: MySQL [Vybrat]Kód: MySQL [Vybrat]
Inak test CREATE TEMPORARY TABLE dopadol presne s rovnako nepriaznivym vysledkom, ako CREATE VIEW.
Pole vytvorene metodou alias::<T> nie je mozne nasledne v selecte zavolat.
Znovu len ako
SELECT * FROM myTempTable
Davam este na povsimnutie tento zadrhel:
Ako vidiet tabulka obsahuje aj pole typu text : txtTest Text(20)
Po ulozeni do Temporary table sa vsak pole zmeni na Text(32000), nejak tak, plus minus.
Takze aj tam, kde nie je pole vypocitane, ale dalo by sa prevziat z povodnej struktury tabulky sa stane text neznamej dlzky. A neda sa zobrazit v gride. No viem da sa to naprogramovat. Ale na toto veru nie som z Access enginy celkom zvyknuty. Tam to je dost hladsie..
Takze aj s textom nastavaju presne tie neiste hratky, ako je to u datumov.. Grrr..
No a uplne vtipne je toto zistenie:
SELECT z CREATE VIEW, presnejsie tento:Kód: MySQL [Vybrat]v tomto prikaz v Delphi kode:Kód: Delphi [Vybrat]naplni do premennej s, hodnotu x
s := FDQuery1.Fields[ 1 ].FieldName
Ale SELECT tam tu hodnotu nevidi!
Ten vidi skutocny, dlhy nazov pola v tabulke:
[x::DATE]
Tak to povazujem za ozaj dost zlomyselne od autorov.
For an expression in a SELECT list, SQLite avoids type name information. When the result set is not empty, FireDAC uses the value data types from the first record. When empty, FireDAC describes those columns as dtWideString. To explicitly specify the column data type, append ::<type name> to the column alias:Kód: MySQL [Vybrat]
Mam rozpracovany Tvoj i svoj navrh riesenia prenosu informacie zo vzorca do vysledku, ale zatial som nedosiahol ziadne uspokojive a jasne vysledky.
Nieze by to neslo. Ono to ide podla planu, ale ani to nestaci pre dokoncenie praktickej myslienky. Zatial.. Budem sa snazit dalej..
Porad si muzes parsovat prikazy sam. A pro resultset si pred otevrenim sestavit kolekci perzistentnich poli. A ty datove hinty, pokud bys je potreboval pouzit z prikazu odstranovat. Verim ze lexeru pro SQLite budou mraky (mozna i pro Delphi) ;)Dobre, ak by som išiel touto cestou. Teda nejaký low-level API. Myslím toto:
nakoniec som postnul tuto zakladnu temu aj na forum Embarcadero.Sice jsou cross posty neeticke, ale ja na tvem miste bych to postnul radeji SO - prece jenom tam to auditorium je asi nejvetsi a autor FireDac pred lety sam diskutovaval...
Dik, skusím aj to asi.nakoniec som postnul tuto zakladnu temu aj na forum Embarcadero.Sice jsou cross posty neeticke, ale ja na tvem miste bych to postnul radeji SO - prece jenom tam to auditorium je asi nejvetsi a autor FireDac pred lety sam diskutovaval...
Fajn ze se nevzdavas :) Jen mam vazne obavu ze toho moc nevyresis. Muzes jeste jit cestou toho parsovani a hinty z vnitrnich SELECT listu u SQL prikazu pred spustenim vyhazet. U definice VIEW asi holt smula; tam by musel SQLite nejako podporovat definici nazvu a datovych typu.Aha, tak to znamená, že "fld::type" sa musí strčiť celé do SQLite enginy, aby sa zas až pri výstupe dal dešifrovať typ pre prezentáciu dát?
Staci si jen predstavit co se deje na ktere strane. V tomto pripade se prikazy spousti na SQLite engine, a produktem uspesneho spusteni je popis datasetu ze ktereho muze FireDAC pomoci datovych hintu specifikovat pole v kolekci "na prani".
To API neni pro prime pouziti. Nic Ti v jeho pouziti nebrani, jen se nediv chybejici dokumentaci. Tzv. "low level" je z pohledu FireDAC o vrstu vys (tam uz se sdruzuji podporovane DBMS).Na ktorom mieste presne v kode mozem povedat, ze nechcem column definition podla FireDAC, ale podla seba.
Ale ja nepsal nic o low level API. Tohle muzes udelat i "zvenku". Pred predanim prikazu FireDAC objektu prikaz rozparsujes, poskladas si perzistentni pole, predas upraveny dotaz a ten spustis.
FireDAC spousteny prikaz upravuje jen v pripade pouziti maker, takze neni treba chodit tak hluboko do nitra ;)
Na ktorom mieste presne v kode mozem povedat, ze nechcem column definition podla FireDAC, ale podla seba.
Ako nizko musim teda ist? Ak vravis., ze nie je uplne nutne low-level.
Niekde som videl aj take odporucene riesnie, ze si pred kazdym SQL vytvoris temp table so svojou definíciou polí a tam nasypeš data zo selectu.
No a ak by som to spojil s low-level, tak som pomaly doma..
Naplnis jen kolekci FieldDefs. Tak jako bys to udelal v design time pres fields editor.Ak uvediem konkretne na priklade, tak kedy v ramci tohoto?
Design time pri databazach nepouzivam snad nikdy. Takze to mi tiez moc nehovori.
Naplnis jen kolekci FieldDefs. Tak jako bys to udelal v design time pres fields editor.Ak uvediem konkretne na priklade, tak kedy v ramci tohoto?Kód: MySQL [Vybrat]Pred riadkom 1, 2, alebo az na konci.
Zatial som to nikdy neriesil.
Design time pri databazach nepouzivam snad nikdy. Takze to mi tiez moc nehovori.
Naplnis jen kolekci FieldDefs. Tak jako bys to udelal v design time pres fields editor.Ak uvediem konkretne na priklade, tak kedy v ramci tohoto?Kód: MySQL [Vybrat]Pred riadkom 1, 2, alebo az na konci.
Zatial som to nikdy neriesil.
Design time pri databazach nepouzivam snad nikdy. Takze to mi tiez moc nehovori.
iiha, to bolo jednoduche. Takze sa blizim k rieseniu.
Opravujem opravene :)
Bolo to jednoduche, ale unahlil som sa so svojim prispevkom, ten som zmazal a davam spravne zenenie kodu:Kód: Delphi [Vybrat]Kod som doplnil do toho, co som publikoval na embarcadero. Takze keby niekto chcel vyskusat. Ma aj cely kod.
FDQuery1.SQL.Text := 'SELECT * FROM ( select [id], [datum] AS [myDate::DATE] from [demo] )'; FDQuery1.Active := True; i := FDQuery1.FieldDefs.Count; // 2 FDQuery1.FieldDefs.Clear; i := FDQuery1.FieldDefs.Count; // 0 FDQuery1.FieldDefs.Add( 'id', ftSmallInt, 0 ); FDQuery1.FieldDefs.Add( 'datum', ftDate, 0 ); i := FDQuery1.FieldDefs.Count; // 2
Len toto bolo "vylepsene", co je uvedene tuna som teda pozmenil
BUU.......
POZOR. IBA SA TVARI, ze ide. Vytvorim novu definiciu poli, aj vratane typu.
Zda sa, ze prebehne OK. Ale typ sa nepodari zmenit.
Nie typy poli v tomto pripade nejdu zmenit. Ani pred, ani po.BUU.........
POZOR. IBA SA TVARI, ze ide. Vytvorim novu definiciu poli, aj vratane typu.
Zda sa, ze prebehne OK. Ale typ sa nepodari zmenit.
No, a pak jsem psal ze ty definice je treba vytvorit pred otevrenim kurzoru (v puvodnim kodu se kurzor otevira na radku 2.); tj. pred nastavenim Active na True (nebo volanim Open).
Nie typy poli v tomto pripade nejdu zmenit. Ani pred, ani po.
V rpípade pred, otvorenie FDQuery ich premaze. NEPOMOZE.
Ked su po, tak sa mozem hrat, ze ich prepisem, aj zmazem, a znovu vytvorim. To sa zda, ze ide. Aj pocet v Count sa zmeni, ale po vytvoreni su tam zase tie typy, co predtym.
Ale hrajem sa s Low Level API: TSQLiteDatabase a TSQLiteStatement.
Tam viem ziskat udaje bez toho, ze by bol naplneny dataset.
Ten mozem slobodne sam vytvorit a naplnit ho.
Co mi odporucas, mam pouzit TFDMemTable, alebo by na to bolo nieco vhodnejsie?