Lazarus 3.2 (2024.02.28.)
Letöltés

  • Oldal:
  • 1

TÉMA:

Adattábla újraolvasása 2017 szept. 29 19:12 #2248

  • Ferke
  • Ferke profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 19
  • Köszönetek: 0
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!

Adattábla újraolvasása 2017 szept. 21 16:35 #2247

  • Ferke
  • Ferke profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 19
  • Köszönetek: 0
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!

Adattábla újraolvasása 2017 szept. 21 14:49 #2246

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
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
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Adattábla újraolvasása 2017 szept. 20 18:23 #2245

  • Ferke
  • Ferke profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 19
  • Köszönetek: 0
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.

Adattábla újraolvasása 2017 szept. 20 17:42 #2244

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
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.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Adattábla újraolvasása 2017 szept. 20 16:40 #2243

  • Ferke
  • Ferke profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 19
  • Köszönetek: 0
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.

Adattábla újraolvasása 2017 szept. 20 16:15 #2242

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
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.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Adattábla újraolvasása 2017 szept. 20 14:28 #2241

  • Ferke
  • Ferke profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 19
  • Köszönetek: 0
SQLQuery.Close;
SQLQuery.Open;

Benne egy SQL lekérdezés. De mondom, újraindítás után megvannak az adatok.

Adattábla újraolvasása 2017 szept. 20 14:21 #2240

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
Hogy néz ki az eljárás, amelyben az adatokat újra be akarod olvasni?
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Adattábla újraolvasása 2017 szept. 19 20:55 #2239

  • Ferke
  • Ferke profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 19
  • Köszönetek: 0
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;

Adattábla újraolvasása 2017 szept. 19 20:30 #2238

  • prekox
  • prekox profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 87
  • Köszönetek: 4
És milyen kóddal módosítod az adatokat?
i5 3470
8GB
Win 10
CodeTyphon 7.0

Adattábla újraolvasása 2017 szept. 19 20:15 #2237

  • Ferke
  • Ferke profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 19
  • Köszönetek: 0
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.

Adattábla újraolvasása 2017 szept. 19 20:06 #2236

  • prekox
  • prekox profilkép
  • Haladó forumozó
  • Haladó forumozó
  • Hozzászólások: 87
  • Köszönetek: 4
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
Win 10
CodeTyphon 7.0

Adattábla újraolvasása 2017 szept. 19 19:13 #2235

  • Ferke
  • Ferke profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 19
  • Köszönetek: 0
Sajnos nem segített ez sem. Viszont fagy tőle a program. :\

Adattábla újraolvasása 2017 szept. 19 18:10 #2234

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
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';
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Adattábla újraolvasása 2017 szept. 19 16:52 #2233

  • Ferke
  • Ferke profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 19
  • Köszönetek: 0
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.

Adattábla újraolvasása 2017 szept. 19 12:22 #2232

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 506
  • Köszönetek: 86
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.
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

Adattábla újraolvasása 2017 szept. 19 09:03 #2231

  • Ferke
  • Ferke profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 19
  • Köszönetek: 0
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!

  • Oldal:
  • 1