Delphi - Multi-tier alkalmazásfejlesztés MIDAS komponensekkel

Multi-tier 7. rész

forráskód letöltése
A Multi-tier alkalmazásfejlesztés sorozatunk soron következő cikkében a TClientDataSet további metódusaival ismerkedhetünk meg. (Példaprogramunkban - a könnyebb áttekinthetőség kedvéért - most nem használunk külön adatmodult, mint az előző példákban, de a példát külön adatmodullal is el lehetett volna készíteni.)

A példánkhoz használt szerver adatmoduljára most a szokásos TDataBase komponens mellé csak egy TQuery és egy TDataSource került. A TQuery DatabaseName tulajdonságának kiválasztottuk a DBPelda-t, SQL tulajdonságához beírtunk a következő SQL utasítást: "select * from SZEMELYEK;". Az adatmodulra került még egy TDataSetProvider komponens is. Ennek Exported tulajdonságát True-ra állítottuk, az Options-ban pedig a poAllowCommandText opciót szintén True-ra állítottuk (a későbbiekben lesz rá szükség). Ezután a /regserver paraméterrel a szokásos módon regisztráltuk a szervert.

- AddIndex:
Ez a metódus egy új indexet állít elő a kliens adathalmazhoz (TClientDataSet).
Példánkban a Form-ra helyeztünk egy TEdit komponenst (Edit1), amibe beírhatjuk azt a mezőnevet (mezőneveket), amely(ek) alapján az új indexet elő akarjuk állítani. (Több mezőnév esetén a mezőneveket ";"-vel kell elválasztani.)
Az új index előállítását a szintén a Form-ra helyezett TButton (Button1) komponens OnClick eseménykezelőjében (TfrmFoform.Button1Click) kódoltuk le. Az AddIndex metódus használatához a fő Form interface-ében a uses záradék utáni felsorolásba be kell írni a DB-unit nevét (DB). A gomb lenyomására az eseménykezelő előállítja a TEdit-ben megadott új indexet, és a rács adatait az új rendezettség szerint jeleníti meg. Amennyiben nem létező mezőnevet adtunk meg, hibaüzenetet kapunk.



- CreateDataSet:
Ezzel a metódussal futásidőben létrehozhatunk egy új, üres kliens-adathalmazt, és fel is tölthetjük értékekkel.

A metódus bemutatásához a Form-ra helyeztünk egy újabb TClientDataSet komponenst, egy TDataSource komponenst és egy TDBGrid-et. Az új kliensadathalmazt (ClientDataSet1) létrehozó eseménykezelőt (TfrmFoform.FormCreate) a fő Form OnCreate eseményéhez rendeltük. Az új adathalmaznak két adatmezőt (oszlopot) készítettünk (Nev, Kora).
Az új adathalmazt a fő Form OnActivate eseménykezelőjéből meghívott TfrmFoform.FormActivate procedúra segítségével töltöttük fel a cdsSzemelyek adathalmaz adataiból.
Felmerülhet a kérdés, hogy mire jó a futásidőben létrehozott kliens adathalmaz, vagyis hogy mi lehet a gyakorlati alkalmazása. Ezt bemutatandó, a Form-ra ráhelyeztünk még egy TRadioGroup komponenst is, amellyel a nemek közül lehet választani. Ha újra megnézzük az 5-ös számú cikk példaprogramjait, láthatjuk, hogy ott az adatok nemek szerinti szűrés feltételét a kliens adathalmaz (cdsSzemelyek) DataRequest metódusának paramétereként adtuk meg. Ez a paraméter a kéréssel együtt "elutazott" a szerverhez, az pedig végrehajtotta a szűrést a kapott paraméter alapján, és az eredményhalmazt visszaküldte a kliensalkalmazás adathalmazába. Mostani példánkban az eredetileg lekért kliens adathalmazt (cdsSzemelyek) nem szűrjük, hanem a rádiógombcsoporttal (TRadioGroup) megadott szűrőfeltétel alapján újra feltöltjük az előzőleg kiürített, futásidőben létrehozott adathalmazt (ClientDataSet1). Mint látjuk tehát, a kliens adathalmaz (TClientDataset) futásidejű létrehozása főleg akkor hasznos, ha - sebességi okok miatt - nem akarunk sokat kommunikálni a szerveralkalmazással, hanem a lekért adatok szűrését, rendezését helyileg kívánjuk megoldani. Ilyenkor persze vigyázni kell arra, hogy a kliensoldalon minden felhasználó csak a jogosultságainak megfelelő adatokat kérhesse le, ezért nem kerülhető ki teljesen a szerveroldali adatszűrés, de a jogosultságoknak megfelelően szűrt adatok lekérése után már a felhasználó a saját adataival helyileg úgy "gazdálkodhat" ahogy akar (meg ahogy a kliensalkalmazás megengedi).


- Execute
Ezzel a metódussal lefuttathatunk egy SQL-parancsot az alkalmazásszerveren. Fontos kitétel, hogy csak olyan SQL-parancsok esetében használható, amelyek nem generálnak eredményhalmazt! A végrehajtandó SQL-parancsot megadhatjuk a TClientDataSet CommandText-tulajdonságában.
Példánkban egy új rekord felvitelét oldottuk meg az Execute metódussal, mert ez nem generál eredményhalmazt. Az új tétel adatbeviteli mezői alatti TButton-komponens (Felvitel) OnClick eseménykezelőjében (TfrmFoform.Button2Click) található kód két dolgot végez el.

CommandText:='insert into Szemelyek(SZEMELYKOD,NEV,
      HELYSEG,UTCAHAZ,NEME,KORA,FOGLALKOZAS)'+
      'values ("1","'+edNev.Text+'","'+edHelyseg.Text+
       '","'+edUtcahaz.Text+'","'+neme+'","'+edKora.Text+
      '","'+edFoglalkozas.Text+'")';
Execute;



Ez a kódrész a cdsSzemelyek CommandText property-jét feltölti az adatbeviteli komponensek (TEdit) értékeivel, majd lefuttatja az Execute metódust. A személyek nemét a TRadioGroup komponenssel állíthatjuk be, amelynek OnClick eseménykezelőjében (TfrmFoform.RadioGroup1Click) a "neme" public változónak adunk értéket ("F" vagy "N"). A SZEMELYKOD a beszúráskor konstans értéket kap, ('1'), mert ezt az adatbázisban definiált generátor állítja elő a trigger lefutásakor! Az '1' konstans érték csak azért kell, hogy ne kapjunk hibaüzenetet az alkalmazásunktól, még mielőtt a trigger egyáltalán lefuthatna a szerveren (erről már az előző cikkekben volt szó).
Close;
CommandText:='select * from Szemelyek';
Open;
Az eseménykezelőnek ez a második fele újraolvassa a szerverről a személyek adatait, hogy az újonnan bevitt rekord látható legyen a kliens adathalmazunkban (cdsSzemelyek). Ez azért fontos, mert most nem a kliens adathalmazba vittük be az új rekordot, hanem SQL utasítással közvetlenül a szerverre küldtük el. Mint látható, ezért nem is kellett meghívnunk a cdsSzemelyek az ApplyUpdates metódusát, mint amikor az új rekordot a kliens adathalmazba szúrtuk be, és csak azután küldtük el a szervernek az ApplyUpdates metódus meghívásával.

Multi-tier cikksorozat