Forum Delphi.cz

Databáze => Firebird a Interbase => Téma založeno: Stanislav Hruška 16-10-2020, 15:46:51

Název: Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 16-10-2020, 15:46:51
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:
Všetky výsledky kontrol sú v poriadku. Máte nejaký tip ako na to?
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: vandrovnik 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?
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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
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.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 16-10-2020, 19:08:42
Aktualizácia už je v poriadku, ale nie Locate().
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 16-10-2020, 19:45:37
Nezabralo ani
Kód: [Vybrat]
FCustomDB.Table.Close;
FCustomDB.Table.Open;
Totálne tomu nerozumiem.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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...
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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

Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: pf1957 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.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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ť.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: pf1957 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.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: pf1957 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?
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 17-10-2020, 17:51:26
Citace
Jak jsi mel nastaveny AutoStop? A prerobil jsi to jak?
AutoStop - pôvodná hodnota True.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: pf1957 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
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: pf1957 17-10-2020, 18:53:13
AutoStop - pôvodná hodnota True.
Chtel jsem se zeptat na StopOptions a napsal jsem to blbe :-(
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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
Tomu som nevenoval pozornosť. Ani neviem čo jednotlivé voľby znamenajú.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 18-10-2020, 20:36:13
Pokračujem v sekcii "Obecné"

Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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.
Jednoducho novo založený záznam Locate() nevidí. Aj pri jednoduchej tabuľke (číselník), kde inde nesiaham.
Začínam mať z toho tiky.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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ť.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: vandrovnik 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?
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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.

Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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í.
Název: Re:Locate() - nenájde nové záznamy v rámci životnosti formulára
Přispěvatel: Stanislav Hruška 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.