Autor Téma: Locate() - nenájde nové záznamy v rámci životnosti formulára  (Přečteno 1384 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

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ěď #15 kdy: 17-10-2020, 18:53:13 »
AutoStop - pôvodná hodnota True.
Chtel jsem se zeptat na StopOptions a napsal jsem to blbe :-(

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ěď #16 kdy: 17-10-2020, 19:35:45 »
Až teraz mi došlo čo spôsobuje, že pre Table.Transaction a Query.Transaction používam tú istú transakciu.
Podľa momentálnej úvahy by som mal použivať dve samostatné transakcie, aby mi nedochádzalo ku kolízii.
StopOptions - s tým nič nerobil
  • xolfCmdsInactie - True
  • xolfAutoStarted - True
  • soFinishRetaining - False
Tomu som nevenoval pozornosť. Ani neviem čo jednotlivé voľby znamenajú.
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ěď #17 kdy: 18-10-2020, 20:36:13 »
Pokračujem v sekcii "Obecné"

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ěď #18 kdy: 19-10-2020, 18:10:05 »
Ja som z toho už... Prestalo mi to fungovať všade!!!
Prikladám momentálne nastavenia, aby som predišiel všetkým nedorozumeniam. Viac transakcií nemám.
  • Transaction
  • UpdateTransaction
  • Connection
Jednoducho novo založený záznam Locate() nevidí. Aj pri jednoduchej tabuľke (číselník), kde inde nesiaham.
Začínam mať z toho tiky.
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ěď #19 kdy: 19-10-2020, 21:20:53 »
Už si hľadám niečo na urobenie slučky >:( . Jednoducho zmeny v tabuľkách sú v rámci formulára neviditeľné. Po jeho znovu otvorení sú viditeľné. Čo už len môže byť zlé na tomto kóde.
Kód: [Vybrat]
function TRoomTitle.DataOK: Boolean;
begin
  FCustomDB.PostRecord(True);
//  Pridaná kontrola. Predtým prebehne samotné Locate s takým istým výsledkom
Qry := TFDFunction.NewQryRead(nil);
Qry.SQL.Text := 'SELECT * FROM ROOMTITLES WHERE IDROOMTITLES = :IDROOMTITLES';
Qry.ParamByName('IDROOMTITLES').asinteger := FCustomDB.NewPKey;  //  OK 101 %
TFDFunction.QryOpen(Qry);
ShowMessage(IntToStr(Qry.recordCount)); //  = 0
...
end;
.
procedure TCustomDB.PostRecord(AAutoCommit: Boolean);
begin
  FTable.UpdateTransaction.StartTransaction;
    FTable.Post;
    FTable.UpdateTransaction.Commit;
    FinalPostRecord(AAutoCommit);  //  Nerobí sa nič s tabuľkou
Ja sa nemôžem bez toho hnúť. Už som všetko dookola 100 x skontroloval ako blbec. Všetko mi sedí. Žiaľ, krištáľovú guľu som daroval. Nevedel som, že ju budem potrebovať.
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ěď #20 kdy: 19-10-2020, 21:26:23 »
A jakou transakci používá Qry? Není to nějaká dřívější, která prostě nevidí změny provedené v transakci FTable.UpdateTransaction?

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ěď #21 kdy: 19-10-2020, 21:59:36 »
fdtrFocRead - Pre tabuľky a Query typu SELECT Transaction
fdtrFocUpdate - pre tabuľky UpdateTransaction a Query Transaction, ktoré nevracajú DataSet
.
Tiež mi nejde do hlavy, že ak formulár zavriem a znova otvorím tak to je OK. Veď tam už s údajmi ani transakciami nič nerobím. Samozrejme okrem načítania údajov. Nepoužívam DBGrid, ale VST.

« Poslední změna: 19-10-2020, 22:06:48 od Stanislav Hruška »
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ěď #22 kdy: 19-10-2020, 22:08:30 »
Až teraz som pochopil Tvoju otázku. Sú to dve rozdielne transakcie. Vraj by to malo byť v poriadku. No asi som to zle pochopil. Vyskúšam to.
Dočerta, máš pravdu! Pri test s query to zbehlo. Ale čo s Locate()? To je ako napojené na tabuľku, že to nenačíta?
.
Tak ako to mám robiť, keď som dostal odporúčania na načítanie používať jednu a na zmenu údajov inú transakciu? To ma domotalo.
Alebo mám transakcii fdtrFocUpdate meniť pred použitím parametre? To sa mi nepozdáva.
.
Základ je, že si mi našiel chybu. Už to len urobiť tak, ako sa sluší a patrí.
« Poslední změna: 19-10-2020, 22:17:18 od Stanislav Hruška »
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ěď #23 kdy: 19-10-2020, 22:34:22 »
Je to spôsobené nesprávnym nastavením izolácie. Mám predvolenú - nešpecifikovanú. Ak som vyskúšal Dirty, tak to išlo. Už len zistiť, ktorá je pre mňa tá správna.
Asi to bude ReadCommited.
« Poslední změna: 19-10-2020, 22:36:33 od Stanislav Hruška »
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.