Lazarus 1.8.0 (2017.12.06.)
Letöltés

file Adattábla újraolvasása

  • Ferke
  • Ferke profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 19
  • Köszönetek: 0

Ferke válaszolt a témára: Adattábla újraolvasása

Szóval annyi a történet, hogy kell az olvasó programba is egy SQLTransaction1.Commit;, amivel zárjuk a létező összes tranzakciót, ekkor fogja csak a buffert újratölteni. Ami igazából kicsit furcsa, és bekavar a háttérben dolgozó query-knek, de ez van, kezelni kell. Én CommitRetaining-gel próbálkoztam, hogy ne zavarjam a többi process-t, de ez sajnos nem elég.
A megoldás annyi lett, hogy figyelem az összes tranzakciót, és ha van egy üresjárat, akkor oda gyorsan bevágok egyet.

Köszi az infókat!
#2248
  • Ferke
  • Ferke profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 19
  • Köszönetek: 0

Ferke válaszolt a témára: Adattábla újraolvasása

Kedves Gábor,
egyre gondolunk, ezért kérdezem, hogyan lehet rávenni a query-t, hogy az adatbázisból olvasson. Nekem gyors hozzáférés kell, teljesen jó nekem így, de amikor törzsadatokat vagy külsős programmal módosítanak, utána muszáj újraolvasnom.
Tudsz tippet adni, hogyan tudom a TSQLQuery-t rávenni, hogy friss adatokkal dolgozzon?
Egyébként igen, olyan programról van szó, aminek nem tehetem ki ide a forrását.

Köszönöm a segítséged!
#2247
  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 387
  • Karma: 6
  • Köszönetek: 54

Gábor válaszolt a témára: Adattábla újraolvasása

A forráskód mindig(!) segít a hibakeresésben, azon látható, hogy pontosan mi és hogyan történik a programban. A program működése és az esetleges hiba annak ismeretében válik ténylegesen is vizsgálhatóvá. Természetesen ha a frissítést végző eljárás forráskódja és benne az SQL lekérdezés annyira értékes elgondolás, hogy nem oszthatod meg senkivel akkor nem kell megtenned.

Képzelj el egy lekérdezést melynek eredményeként akár több ezer rekordot is kaphatsz... és most képzeld el, hogy minden egyes mező (vagy akár csak rekord) módosítása után mindig mented és újra le is kérdezed az adatbázis aktuális tartalmát (ráadásul ezt az adatbázist többen használhatják)... Kis gondolkodás után belátható, hogy ez jelentős terhelést okozna minden oldalon (nem részletezem), tehát nem igazán jó megoldás.
A megoldás, hogy a megfelelő helyen és időben frissíted / újratöltöd a puffer tartalmát, valószínűleg ez van rosszul kivitelezve a programodban.

Lásd még:
SqlDBHowto
Working_With_TSQLQuery
Firebird
#2246
  • Ferke
  • Ferke profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 19
  • Köszönetek: 0

Ferke válaszolt a témára: Adattábla újraolvasása

Ahh, ok. Akkor ezért szenvedek. Nincs utasítás vagy attribútum arra, hogy ne pufferből töltsön?
Forráskód szerintem itt semmit nem segített volna, ezért nem is írtam. Mint a válaszodból látszik, annyi a gond, hogy a TSQLQuery pufferel. Egyébként ezt írtam az elején is, hogy olyan, mintha pufferből dolgozna.
#2245
  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 387
  • Karma: 6
  • Köszönetek: 54

Gábor válaszolt a témára: Adattábla újraolvasása

Az SQLQuery pufferből dolgozik, ha akarod ha nem. Az alkalmazásod indulásakor a puffer az adatbázisból kerül feltöltésre, az ez utáni változtatások mentését és lekérését neked kell az általad megfelelőnek vélt helyen és időben elvégezned (kényszerítened).

Egy példa a gombnyomásra történő frissítésre, amely természetesen csak akkor működik ha minden más is rendben van:
SQLTransaction1.StartTransaction;
Lista1.Clear;
SQLQuery1.SQL.Text:='SELECT nev FROM emberek';
SQLQuery1.Open;
while not SQLQuery1.EOF do begin
  Lista1.Items.Add(SQLQuery1.Fields[0].AsString);
  SQLQuery1.Next;
end;
SQLQuery1.Close;
SQLTransaction1.Commit;
Fontos lenne, hogy segítségkéréskor értelmezhető (minél teljesebb) forráskódot mutass nekünk, a "de ilyesmi" nem jelent semmit. Egy apróság (ezerféle lehet) teljesen félreviheti a program működését...
+ A vizuális komponensek sem tudják, hogy Te mit miért írsz vagy nem írsz a kódba.
#2244
  • Ferke
  • Ferke profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 19
  • Köszönetek: 0

Ferke válaszolt a témára: Adattábla újraolvasása

Nem tudom, mire gondolsz. Ez egy vizuális komponens. Nem fut le automatikusan a frissítés, amikor elindul a program. Üres a grid. Van egy gomb, aminek az eseménykezelőjében ez a két sor van, ez feltölti a gridet. Ha újraindítás nélkül megnyomom, nem jönnek a frissített adatok. Ha újraindítom, aztán nyomom meg a gombot, a friss adatokkal tölti fel.
#2243
  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 387
  • Karma: 6
  • Köszönetek: 54

Gábor válaszolt a témára: Adattábla újraolvasása

Az lenne a lényeg hogy ezt (a frissítést végző) teljes rutint megmutasd (fejléccel), mert abból hiányzik egy művelet, ami a program újraindításakor viszont lefut. Félinformációk alapján nehéz elfogadható választ adni... A találgatás meg nem az én világom.
#2242
  • Ferke
  • Ferke profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 19
  • Köszönetek: 0

Ferke válaszolt a témára: Adattábla újraolvasása

SQLQuery.Close;
SQLQuery.Open;

Benne egy SQL lekérdezés. De mondom, újraindítás után megvannak az adatok.
#2241
  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 387
  • Karma: 6
  • Köszönetek: 54

Gábor válaszolt a témára: Adattábla újraolvasása

Hogy néz ki az eljárás, amelyben az adatokat újra be akarod olvasni?
#2240
  • Ferke
  • Ferke profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 19
  • Köszönetek: 0

Ferke válaszolt a témára: Adattábla újraolvasása

Nem hiszem, hogy lényeges, tekintve, hogy az adatbázisba belekerülnek. :)
De ilyesmi:
SQLqQuery.Close;
SQLqQuery.Params.ParamByName('pUser').Value:= cUser;
SQLqQuery.ExecSQL;
SQLTransaction1.Commit;
#2239
  • prekox
  • prekox profilkép
  • Gyakori fórumozó
  • Gyakori fórumozó
  • Hozzászólások: 85
  • Karma: 1
  • Köszönetek: 2

prekox válaszolt a témára: Adattábla újraolvasása

És milyen kóddal módosítod az adatokat?

i5 3470
8GB
Win7
CodeTyphon 6.2
#2238
  • Ferke
  • Ferke profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 19
  • Köszönetek: 0

Ferke válaszolt a témára: Adattábla újraolvasása

Nem az lenne a lényeg, hogy automatikusan frissítsen. Azt megteszem én egy gombbal:
SQLQuery.Close;
SQLQuery.Open;

Hogyan mondjam el még érthetőbben. Elindítom az A programot. A program betölti a grid-be az adatokat szépen.
B programmal módosítom az adatbázisban az adatokat.
Az A programban ezután mindegy, mit csinálok, nem jelennek meg a frissített adatok.
De egyébként nem csak gridre vonatkozik. Bármilyen SQL lekérdezésre. Egyszerűen olyan, mintha nem az adatbázisból dolgozna, hanem pufferből. Bármit csinál a B, az A egészen odáig nem látja, amíg újra nem indítom.
#2237
  • prekox
  • prekox profilkép
  • Gyakori fórumozó
  • Gyakori fórumozó
  • Hozzászólások: 85
  • Karma: 1
  • Köszönetek: 2

prekox válaszolt a témára: Adattábla újraolvasása

Szerezd meg az alkalmazás ablakának handle-jét és küldjél neki üzenetet a frissítéskor, az üzenetkezelőben meg frissits...

i5 3470
8GB
Win7
CodeTyphon 6.2
#2236
  • Ferke
  • Ferke profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 19
  • Köszönetek: 0

Ferke válaszolt a témára: Adattábla újraolvasása

Sajnos nem segített ez sem. Viszont fagy tőle a program. :\
#2235
  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 387
  • Karma: 6
  • Köszönetek: 54

Gábor válaszolt a témára: Adattábla újraolvasása

A kapcsolódáshoz (még az előtt) megadott paraméterek lényegesek lehetnek, például:
SQLTransaction1.Params.text:='isc_tpb_read_committed';
#2234
  • Ferke
  • Ferke profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 19
  • Köszönetek: 0

Ferke válaszolt a témára: Adattábla újraolvasása

Kicsit akkor másképp fogalmazok. Egy rekordot módosítok az egyik táblában. Annak programnak a gridjében, amelyben a módosítást csináltam, azonnal megjelennek a friss adatok, amit a gridhez tartozó TSQLQuery-n egy close-t és egy open-t. Megjelennek az adatbázisban is, ezt megnéztem. A másik programban viszont sem a close-open, sem az általad említett refresh nem segít. Ha újraindítom a proframot, akkor a friss adatok jelennek meg.
Olyan, mintha pufferelné a táblákat induláskor, s abból dolgozna. Márpedig a programokat én írtam, és nem pufferelek semmit.
#2233
  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 387
  • Karma: 6
  • Köszönetek: 54

Gábor válaszolt a témára: Adattábla újraolvasása

Kódrészletet nem írtál, ezért csak annyit tudok válaszolni, hogy elvileg a kliensprogramokban használhatod a TSQLQuery.Refresh metódusát, mely a leírás szerint végrehajtja a módosítások mentését és az adatok frissítését is.
Lásd: TDataset.Refresh

Természetesen nem szabad elfelejteni, hogy a kliensprogramok nem értesülnek automatikusan az adatbázis változásairól, ezért a frissítés megfelelő időben történő végrehajtásáról és az egyidejű változtatások (több kliens módosítja/törli ugyanazt a rekordot) elleni védekezésről gondoskodni illik.
#2232
  • Ferke
  • Ferke profilkép
  • Új fórumozó
  • Új fórumozó
  • Hozzászólások: 19
  • Köszönetek: 0

Ferke létrehozta a témát: Adattábla újraolvasása

Sziasztok!

Adott két Lazarus-ban készült program, mely ugyanazzal a felhasználónévvel csatlakozik egy Firebird adatbázishoz. A kérdésem az lenne, hogy miért van az, hogy ha az egyik programmal módosítok adatokat az egyik adatbázisban, akkor az miért nem látszik a másikban? Tehát az egyik programmal felülírok egy rekordot, vagy újat teszek le, akkor a másikban nem látszik, csak akkor, ha újraindítom. A programok nem csatlakoznak le az adatbázisról minden művelet után, mivel sok dbgrid és temp-table van bennük.

Köszi előre is!
#2231