Sziasztok!
Bocsánat, hogy ezt mondom, de véleményem szerint az esetek 99%-ában, ha
mentés kikényszerítésére van szükség, akkor nincs jól szervezve a program.
Mi az a folyamat, aminek az a következménye, hogy ugyanazon a fizikai
rekordon állok, amit a felhasználó módosított, és anélkül, hogy elhagynám
el kell mentsem (termináljam a rekordot), és még egy plusz műveletet végre
kell hajtsak? Nem azt mondom, hogy nincs ilyen hanem, hogy alapvetően
ritka. Na most akkor erre a ritkaságra koncentráljunk:
1, Kezdő magic-esként én is mindig megpróbáltam a felvitelt, módosítást,
lekérdezést egy taszkban megcsinálni, fizikai mezőkkel. A hosszú évek során
be kellett, hogy lássam, hogy - akármennyire is kevesebb munkának tűnik az
elején - nem igazán járható út, és a végén sokkal több munkával jár.
Egyrészt mivel sajnos a Magic hibásan működik több adatbázis kezelő
esetében (hiba leadva az MSE-nek és javításra vár). Bizonyos esetekben
akkor is nyit tranzakciót és lockol, amikor egy bevitel/módosító taszkot
lekérdezésre használunk. Ez nagy rendszer esetén óriási gond. Ezért
túlnyomó többségben külön módosító és külön megtekintő programokat kezdtünk
írni. A másik kapcsolódó probléma, hogy Marika néni el kezd módosítani
valamilyen alapadatot, majd elmegy kávézni. A harmadik a RIA-s és mobilos
alkalmazások alapvető működési különbsége, hogy nem a kliens nyúl el az
adatbáziskezelőhöz, hanem az alkalmazás szerver. Mindhárom abba az irányba
nyom minket, hogy a lekérdező programok maradjanak fizikaiak, de a
módosítóknál külön (pl. altaszkban) lekérdezzük az adatokat, feltöltsünk
virtuálisokat, majd módosításkor (pl. altaszkban) mentsük az eredményt.
Ráadásul ha így csináljuk, akkor nincs is szükség módosítás
kényszerítésére.
2, View Refresh event. Ha ezt kiadjuk, a módosítások (ha érintették az
adatnézetet) elmentésre kerülnek, majd az adatnézet újraolvasásra kerül.
Ráadásul van egy nagyon használható paramétere, érdemes átböngészni.
Szerintem ez az egyik legjobb megoldás.
3, Exit event. Ha lehet a programot úgy szervezni, akkor megcsinálhatjuk,
hogy a módosítás után kiadunk egy Exit parancsot. Ez biztosan menti a
módosítást. Persze kilép a taszkból, amit úgy tudunk kivédeni, hogy van
fölötte egy másik és visszazavarjuk. Ha az ablak nyitva marad, vagy
subformot haszálunk és visszaállunk ugyanarra a rekordra, fent előre
nyitunk minden táblát, és rezidens az altaszk, akkor ez általában nem is
zavaró. Ez is egy elég tiszta megoldás.
4, Force Exit event. Gyula szépen leírta, csak annyit akarok hozzáfűzni,
hogy a hangsúly az események láncolásán van, lásd később. Ritkán
használjuk. A fenti három biztosabb.
5, Record Flush event. Elvben pont azt csinálja amit szeretnénk.
Gyakorlatilag hibás volt még az 1.9-ben is, valahol a 2.x környékén lett
egy kicsit jobb, de időnként nem működik, pl. eseményből hívva bizonyos
esetekben, ha altaszkból is módosítottunk a felette levő taszkból valamit,
meg valami bizonytalan, számomra nem körülhatárolható esetekben. Kerüljük
ahol csak lehet.
Események:
1, A Wait=Yes valójában úgy működik mint a Call. Azt jelenti, hogy a
végrehajtás ott megáll, végrehajtja az eseményt (mint egy szubrutint) és
visszatér. Belső (internal) esemény nem lehet ilyen!!!
2, A Wait=No azt jelenti, hogy az Event Queue-ba bekerül az esemény és
majd ha odakerül a feldolgozás, akkor végrehajtja. Mikor van ez?
Általánosságban azt lehet mondani, hogy Online taszk rekord prefix
végrehajtása után, amikor a felhasználóra várunk. Belső esemény csak ilyen
lehet!
3, Ha saját eseményeket belső eseményekkel keverünk, és/vagy láncoljuk az
eseményeket, akkor mindegyiket vegyük Wait=No-ra. Így teljesen kiszámítható
lesz a működés. Nyilván azzal számolni kell, hogy ez csak a legközelebbi
"idle time" esetén lesz végrehajtva. Viszont legalább egy kötegben.
4, A fentiek alapján kijelenthetjük, hogy kb. 10%-ban van értelme a
Wait=Yes használatának. A többi esetben a Call, vagy függvény használata
szebb, átláthatóbb megoldás ad.
Esemény láncolás példa:
El akarom menteni az adatnézetet, csinálni valamit, majd kilépni. Mindezt
ugye egy Online taszkban, adatbevitel közben, miután Marika néni
rákattintott a Rendben gombra.
a)
Raise Event View Refresh Wait=No
Raise Event Saját event Wait=Yes
Raise Event Quit Wait=No
b)
Raise Event View Refresh Wait=No
Raise Event Saját event Wait=No
Raise Event Quit Wait=No
Az a) esetben a View Refresh bekerül az Event Queue-ba, majd végrehajtódik
a Saját esemény, majd a Quit bekerül az Event Queue-ba, majd ha Marika néni
nem csinál közben valami nagy disznóságot, megkezdődik az Event Queue
feldolgozása, végrehajtódik az adatnézet frissítés (ekkor mentődnek a
változások), majd kilép a taszkból.
A b) esetben View Refresh, majd a Saját eseményem, majd a kilépés esemény
mind bekerülnek az Event Queue-ba, majd (ha Marika néni nem...) megkezdődik
a feldolgozása, tehát frissül az adatnézet (mentés), saját esemény elindul,
és végül kilép a taszk.
A a) esetben a Saját eseményem után lett mentve a módosítás a b) esetben
előtte. Elég komoly a különbség.
Dióhéjban ennyi. Bocs ha kicsit szájbarágósra sikeredett, de hátha olvassa
kezdő Magic-es is. :-)
Ámor
On Mon, 18 Jan 2016 11:02:32 +0100, "Bakos Gyula"
<
bakos...@szegedsw.hu>
wrote: