Autor Téma: TFDQuery.FetchAll - dá sa to niekde nastaviť ako default?  (Přečteno 167 krát)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2971
  • Karma: 29
    • Verze Delphi: XE7 professional
V transakcii som to nenašiel. No neviem aké parametre sa tam dajú nasekať.
TFDQuery to má ako metódu.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 360
  • Karma: 15
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:TFDQuery.FetchAll - dá sa to niekde nastaviť ako default?
« Odpověď #1 kdy: 07-11-2017, 14:02:10 »
Dotaz nechapu. Default ceho konkretne? Da se nastavit FetchOptions.Mode na fmAll cimz se zacnou na klienta prenaset vsechny zaznamy datasetu pri volani Open. Pripadne FetchOptions.AutoFetchAll na afAll (coz je defaultni nastaveni) cimz se prenesou vsechny zaznamy pred odpojenim objektu.
« Poslední změna: 07-11-2017, 14:06:39 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2971
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:TFDQuery.FetchAll - dá sa to niekde nastaviť ako default?
« Odpověď #2 kdy: 07-11-2017, 14:12:12 »
Ďakujem.
Práve som to našiel, vylúštil. Ale ako čítam Tvoj príspevok, tak som to pekne poplietol.
Dúfam, že to platí aj pre Refresh.
« Poslední změna: 07-11-2017, 14:14:11 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 360
  • Karma: 15
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:TFDQuery.FetchAll - dá sa to niekde nastaviť ako default?
« Odpověď #3 kdy: 07-11-2017, 18:58:35 »
Dúfam, že to platí aj pre Refresh.

Nasledujici plati pro TFDQuery. Pokud spoustis Refresh pro SQL prikaz, ve kterem je v SELECT listu sloupcu obsazen klic, pak se prenesou vsechny zaznamy. Pokud v SELECT listu klic neni, pak se prenese RowsAffected pocet zaznamu (jez muze byt nastavenim FetchOptions.Mode ovlivnen). Tedy takto:

Kód: Delphi [Vybrat]
  1. FDQuery.SQL.Text := 'SELECT ID, OtherField FROM MyTable'; // ← ID je klic
  2. FDQuery.Open;
  3. FDQuery.Refresh; // ← prenese vsechny zaznamy (bez ohledu na nastaveni FetchOptions.Mode)

Kód: Delphi [Vybrat]
  1. FDQuery.SQL.Text := 'SELECT OtherField FROM MyTable'; // ← v SELECT listu neni klic
  2. FDQuery.Open;
  3. FDQuery.Refresh; // ← prenese pocet RowsAffected (jez muze byt nastavenim FetchOptions.Mode ovlivnen)
« Poslední změna: 07-11-2017, 19:20:44 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2971
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:TFDQuery.FetchAll - dá sa to niekde nastaviť ako default?
« Odpověď #4 kdy: 07-11-2017, 20:07:25 »
Ako to tak po troške čítam, tak zisťujem, že to je poriadne zamotané. A nemožné si zapamätať ako sa to správa pri rôznych kombináciách vlastností.
Ale hlavne mám skúsenosť ktorá hovorí: čítaj pozorne všetko až do posledného slova!
Vďaka za vysvetlenie.

Poznámka: nikde nevidím, žeby sa na stránke o FireDAC dalo vyhľadávať. A keď to človek nepozná, tak mu index nijako nepomôže. Napr. pod R nie Refresh, lebo to je niekde v triede v ktorej to je definované. Ale v ktorej to je to nemám ešte ako vedieť. Dostať do hlavy celú štruktúru FireDAC je pre mňa nemožné :'(
Ten príklad neberte doslova. Viem, že Refresh ma hodí do Data.DB.TDataSet.Refresh
« Poslední změna: 07-11-2017, 20:11:29 od Stanislav Hruška »
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 360
  • Karma: 15
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:TFDQuery.FetchAll - dá sa to niekde nastaviť ako default?
« Odpověď #5 kdy: 07-11-2017, 21:50:36 »
Ako to tak po troške čítam, tak zisťujem, že to je poriadne zamotané.

Je. A dokumentace v tomto pripade neexistuje. Jediny kontrakt ktery mas je chovani metody Refresh. Jak je interne implementovana neni popsane. To co jsem tady popsal je ze zdrojaku, konkretne TFDDataSet.InternalRefresh (coz je de-facto implementace Refresh):

Kód: Delphi [Vybrat]
  1.   if sKeyFields <> '' then begin // ← pokud v SELECT listu existuji klice, pak...
  2.     CheckFetchedAll; // ← pro TFDQuery se uvnitr vola InternalFetchRows s parametrem AAll == True (coz prenese vsechny zaznamy)
  3.     if LocateRecord(sKeyFields, vLastKeyValue, [], iNewRecNo) then begin
  4.       FRecordIndex := iNewRecNo;
  5.       lRecIndSet := True;
  6.     end;
  7.   end;
  8.   if not lRecIndSet then // ← lRecIndSet == False
  9.     InternalSetRecNo(iLastRecNo); // ← uvnitr vola InternalFetchRows s parametrem AAll == False (coz neprenese vsechny zaznamy)

A aby toho nebylo malo, napr. TFDTable se bude chovat jinak :) Proc chces vlastne prenaset vsechny zaznamy? Kvuli lepsimu vykonu? Nebo si chodis pro data do interni kolekce?
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2971
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:TFDQuery.FetchAll - dá sa to niekde nastaviť ako default?
« Odpověď #6 kdy: 07-11-2017, 22:19:24 »
Citace
Proc chces vlastne prenaset vsechny zaznamy? Kvuli lepsimu vykonu?
Dôvodov je viac. Jeden z nich môže byť aj výkon, ako som sa dočítal.
Všade kde mám použitý SELECT pracujem s celou sadou záznamov. Tých záznamov budem mať rádovo v stovkách. Takže objem dát nie je problémom. V drvivej väčšine prípadov mám while not qry.eof do. Čo znamená, že ich aj tak natiahnem všetky.
Teraz mám len doslovne pár záznamov a tak netuším ako dlho sa budú vykonávať jednotlivé operácie. A či by som pocítil rozdiel.
Niekde prechádzam dataset od konca. Neviem či by mu vadilo ak by nebol natiahnutý celý.
Inde si to vyžaduje spôsob práce s datasetom - ťahanie údajov do výpočtov.
Hlavne si v niektorých prípadoch nie som istý ako to funguje. Tak si vytváram poistku.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Delfin

  • Hrdina
  • ****
  • Příspěvků: 360
  • Karma: 15
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
    • Ibi Yoyo :)
Re:TFDQuery.FetchAll - dá sa to niekde nastaviť ako default?
« Odpověď #7 kdy: 07-11-2017, 23:58:22 »
Niekde prechádzam dataset od konca. Neviem či by mu vadilo ak by nebol natiahnutý celý.

Nevadilo. Skokem na posledni zaznam (metodou Last) se prenesou vsechny zaznamy (TFDDataSet.InternalLast vola CheckFetchedAll). Jde vsak o implementacni detaily ktere neni treba znat. Pro tvuj pripad nastav FetchOptions.Mode na fmAll, pokud ti jde o vykon, zkus otestovat zda dosahnes vyssiho vykonu navysovanim FetchOptions.RowsetSize (pocet zaznamu prenesenych jednim packetem). Pote ti volani Open stejne jako Refresh bude prenaset vsechny zaznamy.

Pokud by te zajimal realny pocet zaznamu prenesenych na klienta, muzes vycist pocet ze storage pomoci FDQuery.Table.Rows.Count
 (property RecordCount je ovlivnitelna nastavenim).
« Poslední změna: 08-11-2017, 00:31:46 od Delfin »
A co chudinky ovce? Koupíš jim snad plovací vesty? Nebo jim nasadíš chůdy? Ještě lepší, kdybys je zkřížil s delfíny na ovce hopkavé!

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2971
  • Karma: 29
    • Verze Delphi: XE7 professional
Re:TFDQuery.FetchAll - dá sa to niekde nastaviť ako default?
« Odpověď #8 kdy: 08-11-2017, 08:39:24 »
Citace
pokud ti jde o vykon, zkus otestovat zda dosahnes vyssiho vykonu navysovanim
Držím sa zásady ktorú mi tu niekoľkokrát obili  o hlavu. Najprv nech ti to všetko správne funguje. Až potom sa venuj optimalizácii. A mne to ešte nefunguje ako má + nemám všetko otestované (lebo ma to už nebaví :) ).  Až k tomu dôjde, tak si najprv budem musieť vygenerovať dostatočný počet záznamov. Už len to generovanie bude zábava.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

 

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í:
Křestní jméno zpěváka Gotta: