
A mellékelt példaprogram futtatása előtt a Unit1.pas forráskód 20. sorában lévő ConnectionString konstans értékét módosítsa úgy, hogy a Dolgozok példaadatbázis elérhetővé váljon.
A mellékelt Dolgozok.sql állomány tartalmazza a feltöltött példa adatbázis létrehozásához szükséges szkriptet. A szkript lefuttatásához használja az SQL szerver Manager programját. Amennyiben SQL szerverének elérési útja eltér a telepítési alapbeállítástól, úgy a script-ben írja át az elérési utakat a következőre: C:\Program Files\Microsoft SQL Server\MSSQL\data\
Példaprogramunkban, az előző részben elkészített adatbázist használjuk fel. Az előző részben elkészítettük a Szemely_VIEW és Osszesadat_VIEW nézeteket. Mellékelt példaprogramunkban, a Szemely_VIEW nézettáblán keresztül végzünk rekordműveleteket, a Dolgozok adatbázisban.
A nézettáblák azon kívül, hogy megjelenítik egy adatbázis bizonyos részletét, alkalmasak arra, hogy rekordokat szúrjunk be velük tábláinkba. Lehetőségünk van már meglévő rekordok módosítására és törlésére is. A nézettáblák esetében, a rekordműveleteknek van néhány sajátosságuk. Az alábbiakban ezeket nézzük át.
Amikor egy nézettáblán valamilyen rekord műveletet hajtunk végre, az igazából a nézet alapját képező táblákban hajtódik végre.
Új rekord beszúrása esetén az a legegyszerűbb eset, amikor a nézettábla egy adattábla összes oszlopát lefedi. Ilyenkor az adattábla minden egyes mezőjét fel tudjuk tölteni értékekkel.
Ha az adattábla egyes oszlopai nincsenek benne a nézettáblában, akkor ezeknek az oszlopoknak képeseknek kell lenniük arra, hogy NULL értéket tároljanak, vagy pedig alapértelmezett érték kell, hogy tartozzon hozzájuk. Ha ezen feltételek egyike sem teljesül, akkor a nézettábla alkalmatlanná válik arra, hogy új rekordokat vegyünk fel rajta keresztül.
Delphi példaprogramunkban a Szemely_VIEW nézettáblát használjuk fel arra, hogy új rekordokat vegyünk fel a Szemely táblába. A nézet azonban nem tartalmazza az SZKod mezőt. Amikor létrehoztuk a Dolgozok adatbázist, lehetővé tettük, hogy minden egyes mező NULL értékeket is tartalmazhasson. Így nézettáblánk alkalmas arra, hogy új rekordokat tudjon fogadni. Azonban az SZKod mező értékének beállításáról nekünk kell gondoskodnunk.
A Szemely tábla SZKod mezőjét arra használjuk, hogy kapcsolatot tudjunk létesíteni az Adatok táblával. Ebből adódóan nem a legoptimálisabb megoldás, ha az SZKod mezőben NULL értékeket hagyunk. A Delphi példaprogramban készítettünk egy eljárást, amelyet minden újonnan felvitt rekord után meghívunk. A SetSZKod eljárás egy ADOTable komponens segítségével csatlakozik a Szemely táblához. Ahol a táblában az SZKod helyén NULL értékeket talál, ott az SZKod mező értékét a rekord sorszámának megfelelő értékre cseréli ki.
Emlékezzünk vissza arra, hogy a Szemely_VIEW nézetet úgy hoztuk létre, hogy csak az 1972.01.01. után született személyeket jelenítse meg. Ez felveti azt a problémát, hogy mi történik akkor, ha olyan rekordot viszünk fel, amelyben a megadott születési dátum kisebb ennél az értéknél.
Az SQL szerver, alapbeállítás szerint megengedi az olyan rekordok felvitelét is, amelyek nem esnek bele a nézettábla által megjeleníthető tartományba. Azonban amikor frissítjük a nézettáblát, a felvitt rekord nem lesz látható.
Delphi példaprogramunkban egy új rekordot ugyanúgy tudunk felvenni, mint egy Table objektum esetében.
with ADOQuery1 do begin
Append;
FieldByName('Nev').AsString:=Form2.ENev.Text;
FieldByName('SzulIdo').AsString:=Form2.ESzulIdo.Text;
Post;
end;
A Delphi példaprogramban próbáljuk ki, hogy mi történik akkor, ha olyan rekordot veszünk fel, amely nem tartozik bele a Szemely_VIEW által megjeleníthető tartományba. Azt tapasztalhatjuk, hogy a DBGrid1 objektum ugyanúgy megjeleníti a rekordot, mint a feltételnek eleget tevőket. Ez így van egészen addig, míg a Frissítés feliratú gombra nem kattintunk. Ha újraindítjuk a programot, vagy csupán frissítjük a nézettáblát, újra csak a nézet feltételének eleget tevő rekordok válnak láthatóvá.
A nézettáblát Delphi-ben a következő utasítással frissíthetjük:
Ha Delphi-ből módosítani akarunk a nézettáblában egy rekordot, akkor azt a következő módon tehetjük meg.
with ADOQuery1 do begin
Edit;
FieldByName('Nev').AsString:=Form2.ENev.Text;
FieldByName('SzulIdo').AsString:=Form2.ESzulIdo.Text;
Post;
end;
A módosítás összetett nézettáblák esetében is működne. Nem módosíthatjuk azoknak a mezőknek a tartalmát, amelyek adattáblák közti kapcsolódást szolgálnak.
Törölni csak olyan rekordokat tudunk, amelyek megjelennek a nézettáblában, azaz eleget tesznek a nézettáblában definiált feltételnek.
Ha a Delphi példaprogramban olyan rekordot viszünk fel, ahol a születési dátum kisebb, mint 1972.01.01, akkor a rekord csak addig törölhető, még a nézettábla tartalmát nem frissítjük. Utána ugyanis a Szemely_VIEW nézetből elérhetetlenné válik.
Egy rekordot törölni az alábbi módon tudunk.