Autor Téma: Locate() - nenájde nové záznamy v rámci životnosti formulára  (Přečteno 1387 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6019
  • Karma: 44
    • Verze Delphi: W10 + D11
Doteraz som taký problém nemal. Idem v embedded režime
Ak formulár zavriem a otvorím, tak všetko je v poriadku.
V rámci zisťovania chyby som:
  • skontroloval SQL.Text
  • hodnoty pre parametre
  • skontroloval tabuľky v DB manažéri
  • pred každým Locate doplnil Table.Refresh
Všetky výsledky kontrol sú v poriadku. Máte nejaký tip ako na to?
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline vandrovnik

  • Guru
  • *****
  • Příspěvků: 1274
  • Karma: 51
    • Verze Delphi: 10.3
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #1 kdy: 16-10-2020, 17:03:14 »
Není to zapsané v jiné transakci, takže ta aktuální transakce to nevidí? Jinak Table se vyhýbám jak čert kříži... To Refresh, které voláš, udělá Refresh aktuálního záznamu, nebo to znovu načte všechny záznamy?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6019
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #2 kdy: 16-10-2020, 18:40:51 »
Mám len jedinú transakciu. Spustenú a ukončenú jediný raz.
Table - občas sa stane, že štrajkuje. Refresh som dal pre istotu pred Locate().
Teraz som zistil, že sa to chová akosi divne. Mám dva záznamy a pridám tretí. Potom postupne vyberám záznamy sa takýmto výsledkom Locate
  • 2. False
  • 1. True
  • 2. True
  • 3. False
Mám dve triedy, ktoré používajú vo vlastnom DataSource fyzicky ten istý TFDTable.
No v každom prípade mi zle, presnejšie vôbec, neaktualizuje subform Salle. To v súčasnom čase neriešim.
Upresňujem. Správanie 2. záznamu platí pre predposledný záznam. Všetky ostatné existujúce dajú vždy True. Nové False.
.
Poznámka: pri použití toho istého subform (Salle) na inom subform to funguje ako má. Skontroloval som v Salle všetko, čo nie je rovnaké pre Parent (subform). Nenašiel som chybu.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6019
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #3 kdy: 16-10-2020, 19:08:42 »
Aktualizácia už je v poriadku, ale nie Locate().
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6019
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #4 kdy: 16-10-2020, 19:45:37 »
Nezabralo ani
Kód: [Vybrat]
FCustomDB.Table.Close;
FCustomDB.Table.Open;
Totálne tomu nerozumiem.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6019
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #5 kdy: 16-10-2020, 20:01:15 »
Už som našiel príčinu
Kód: [Vybrat]
    FCustomDB.Table.Transaction.Commit;zbehlo :o  Už len zistiť kde mi to ostalo otvorené.
Ale na zmenu DB používam zásadne len FCustomDB.Table.UpdateTransaction. Takže niekde mám bordel.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6019
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #6 kdy: 16-10-2020, 22:13:28 »
Ale miesto/zdroj, kde sa to deje som nenašiel. To ma silne štve. Lebo neviem či to nevyskočí niekde inde.
Pre istotu som tam pridal if FCustomDB.Table.Transaction.Active then...
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6019
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #7 kdy: 16-10-2020, 22:40:27 »
Už som to našiel a ostal som veľmi prekvapený. Bežne používam
Kód: [Vybrat]
Query.Open;
...
FreeAndNil(Query);
Automaticky som predpokladal, že sa ukončí transakcia. Ale ona ostáva otvorená ::) :-\
To je naozaj tak? Nechce sa mi tomu veriť.
Mám nastavené Connection.AutoCommit/AutoStart na True.
To si budem musieť prejsť celý projekt
Nepomohlo ani Qry.Close; Musím tam dať natvrdo Qry.Rollback/Commit

« Poslední změna: 16-10-2020, 22:45:35 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3290
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #8 kdy: 17-10-2020, 08:22:59 »
Automaticky som predpokladal, že sa ukončí transakcia. Ale ona ostáva otvorená ::) :-\
To je naozaj tak? Nechce sa mi tomu veriť.
Ano. Query resp. dataset reprezentuje jen jednu DB operaci, ktera se provadi v kontextu transakce, ktery query dostava jako parametr a transakce se pouzivaji hlavne kvuli atomicite tj. kdy se vice DB operaci chova jako jedina, ktera se provede/neprovede. Zavreni/zruseni query nema na transakci zadny vliv.

Citace
Mám nastavené Connection.AutoCommit/AutoStart na True.
To je mozne nastaveni, protoze byva zvykem, ze v okamziku, kdy nastartujes explicitne transakci, tak se to vnitrne vypne.

Ale z meho pohledu je to chyba, protoze to umoznuje sahnout do DB v podstate "bez" transakce s nepredvidatelnymi dusledky. Proto vzdycky ridime transakce explicitne a to rizeni vynucujeme nastavenim na FALSE. To je dulezite zejmena tam, kde na projektu po dlouhou dobu pracuje vic lidi, aby se snizila sance to prasit.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6019
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #9 kdy: 17-10-2020, 10:48:19 »
Ďakujem. Potvrdil si mi moje znalosti a úvahu, žeby som si to Auto... mal zrušiť.
Citace
To je mozne nastaveni, protoze byva zvykem, ze v okamziku, kdy nastartujes explicitne transakci, tak se to vnitrne vypne.
Ale akosi sa mi nevypína.
Citace
Ale z meho pohledu je to chyba, protoze to umoznuje sahnout do DB v podstate "bez" transakce s nepredvidatelnymi dusledky.
Vzhľadom na skutočnosť, že sa to nevypínalo, tak sa mi (prudko) zvyšoval počet spustených ale neukončených transakcíí.
Zas mám čo robiť.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3290
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #10 kdy: 17-10-2020, 11:35:05 »
Citace
To je mozne nastaveni, protoze byva zvykem, ze v okamziku, kdy nastartujes explicitne transakci, tak se to vnitrne vypne.
Ale akosi sa mi nevypína.
To spatne chapes: vypina ten automaticky rezim.

Pokud to mas na true a udelas Execute, tak to za tebe udela automaticky Start/Commit transaction pred a po prikazu.

Ale jakmile udelas sam StartTransaction, tak to vnitrne nastavi auto na FALSE a nikdo za tebe uz nic neudela tj. ty musis transakci sam ukoncit.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6019
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #11 kdy: 17-10-2020, 13:26:00 »
Citace
Pokud to mas na true a udelas Execute, tak to za tebe udela automaticky Start/Commit transaction pred a po prikazu.
Tak som to chápal. Preto som sa tak veľmi čudoval.
Moja skúsenosť je iná. Použil som Open (lebo ide o SELECT) a Commit neprebehol. Presnejšie, transakcia ostala aktívna. Vylučujem prípad, že som transakciu spustil ručne a neukončil ju.
Už som to prerobil.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3290
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #12 kdy: 17-10-2020, 14:03:39 »
Moja skúsenosť je iná. Použil som Open (lebo ide o SELECT) a Commit neprebehol. Presnejšie, transakcia ostala aktívna. Vylučujem prípad, že som transakciu spustil ručne a neukončil ju.
Už som to prerobil.
Jak jsi mel nastaveny AutoStop? A prerobil jsi to jak?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 6019
  • Karma: 44
    • Verze Delphi: W10 + D11
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #13 kdy: 17-10-2020, 17:51:26 »
Citace
Jak jsi mel nastaveny AutoStop? A prerobil jsi to jak?
AutoStop - pôvodná hodnota True.
  • Nastavil som AutoCommit, Autostart a AutoStop na False
  • Napísal jednoduché procedúry na
  • otvorenie query a
  • FreeAndNilQuery - ukončí transakciu a zlikviduje query
  • vždy najprv kontrolujem, či je transakcia aktívna
« Poslední změna: 17-10-2020, 17:53:05 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3290
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
« Odpověď #14 kdy: 17-10-2020, 18:37:20 »
Citace
Jak jsi mel nastaveny AutoStop? A prerobil jsi to jak?
AutoStop - pôvodná hodnota True.
Divny... Ze by FireDaC nefungoval autostop? To asi ne, na to by se uz davno prislo