Autor Téma: FireDAC - Refresh  (Přečteno 367 krát)

Online chaloup

  • Mladík
  • **
  • Příspěvků: 80
  • Karma: 9
    • Verze Delphi: Delphi 10.1
FireDAC - Refresh
« kdy: 11-01-2017, 11:41:59 »
zdar,
narazil jsem na zvláštní (teda podle mě je zvláštní) chování FireDAC ve spojení s Firebirdem (ostatní db jsem nezkoušel, je možný, že se to tak chová všude).
Refresh se chová rozdílně, když je vyplněno UpdateOptions.KeyFields (nebo nevyplněno).
Mám připojený DBGrid a když v KeyFields není nic vyplněno a zavolám Refresh, tak se znovu načtou pouze záznamy, které grid zobrazuje.
Když KeyFields vyplním a zavolám refresh provede se Refresh, ale načtou se úplně všechny záznamy, jako by se zavolalo ještě FetchAll.
Funguje to tak i když nastavím u nějakého fieldu, že je klíč - ProviderFlags := [pfInKey]

Testováno na Berlin Upd2

Online chaloup

  • Mladík
  • **
  • Příspěvků: 80
  • Karma: 9
    • Verze Delphi: Delphi 10.1
Re:FireDAC - Refresh
« Odpověď #1 kdy: 16-10-2017, 18:38:17 »
Tak jsem se na ten problém zeptal podpory, podle nich je to by-design, mě se to chování nezdá správné. Jak píšou, na řádku 5141 se ten FetchAll opravdu volá, když je vyplněný index.
Citace
The behaviour that you describe looks to be as designed. By setting pfInKey in the provider flags, you are telling FireDAC that the table in the query has a primary key. If I look at line 5141 of FireDAC.Comp.DataSet.pas,  I see that the rows will be fetched if a primary key is defined:

if sKeyFields <> '' then begin
   CheckFetchedAll;

Offline Delfin

  • Plnoletý
  • ***
  • Příspěvků: 232
  • Karma: 9
    • Verze Delphi: 2009, Tokyo
Re:FireDAC - Refresh
« Odpověď #2 kdy: 16-10-2017, 23:51:33 »
O jake komponente se tu bavime (TFDQuery)? Muzu poprosit o jeji uplnou konfiguraci?
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 chaloup

  • Mladík
  • **
  • Příspěvků: 80
  • Karma: 9
    • Verze Delphi: Delphi 10.1
Re:FireDAC - Refresh
« Odpověď #3 kdy: 17-10-2017, 09:38:07 »
Jo jedná se o TFDQuery.  Když nastavím pfInKey:
Kód: [Vybrat]
FDQuery1.Fields.FieldByName('MY_ID').ProviderFlags := [pfInWhere, pfInUpdate, pfInKey]; nebo v update options nastav KeyFields.
Tak refresh začne dělat FetchAll.
Protože v FireDAC.Comp.DataSet.pas na řádku 5141 je:
Kód: [Vybrat]
if sKeyFields <> '' then begin
   CheckFetchedAll;

 

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):