Eseményvezérelt alkalmazások fejlesztése I 10. előadás. Adatbázis-kezelés modell/nézet architektúrában. Giachetta Roberto

Hasonló dokumentumok
Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés modell/nézet architektúrában

Adatbáziskezelés M/V architektúrában

Eseményvezérelt alkalmazások fejlesztése I 11. előadás. Adatkezelés speciális eszközökkel. Giachetta Roberto

Adatok speciális megjelenítése

3. Beadandó feladat dokumentáció

Elemi alkalmazások fejlesztése III.

Választó lekérdezés létrehozása

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

Alkalmazások fejlesztése III. Qt 4 /C++ alapú MDI alkalmazás: Számlakészítő program 2/3

MS ACCESS 2010 ADATBÁZIS-KEZELÉS ELMÉLET SZE INFORMATIKAI KÉPZÉS 1

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET Core) Cserép Máté

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása

DKÜ ZRT. A Portál rendszer felületének általános bemutatása. Felhasználói útmutató. Támogatott böngészők. Felületek felépítése. Információs kártyák

2. Beadandó feladat dokumentáció

SQL*Plus. Felhasználók: SYS: rendszergazda SCOTT: demonstrációs adatbázis, táblái: EMP (dolgozó), DEPT (osztály) "közönséges" felhasználók

Készítsen egy adatbázist (egytáblásat) egy számítástechnikai tanfolyam résztvevőiről. Az adattábla rögzítse a következőket:

Elemi adatbázis kezelés

HVK Adminisztrátori használati útmutató

1. Az Access 2000 indítása után válasszuk az Üres adatbázis létrehozása pontot,

A gyakorlat során MySQL adatbázis szerver és a böngészőben futó phpmyadmin használata javasolt. A gyakorlat során a következőket fogjuk gyakorolni:

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET)

Adatbázis-kezelés Access XP-vel. Tanmenet

Fogalmak: Adatbázis Tábla Adatbázis sorai: Adatbázis oszlopai azonosító mező, egyedi kulcs Lekérdezések Jelentés Adattípusok: Szöveg Feljegyzés Szám

Webes alkalmazások fejlesztése 4. előadás. Megjelenítés és tartalomkezelés (ASP.NET) Cserép Máté.

Eseményvezérelt alkalmazások fejlesztése I 8. előadás. Adatbázis-kezelés elemi eszközökkel. A MySQL adatbázis-kezelő

2. Beadandó feladat dokumentáció

MTMT adminisztrátori felület és teendők. Mátyás Melinda, Szabó Panna november 4. ELTE Egyetemi Könyvtár

Programozási technikák Pál László. Sapientia EMTE, Csíkszereda, 2009/2010

Eseményvezérelt alkalmazások fejlesztése II 12. előadás. Objektumrelációs adatkezelés (ADO.NET) Giachetta Roberto

Eseményvezérelt alkalmazások fejlesztése I 7. előadás. Adatbázis-kezelés elemi eszközökkel. Giachetta Roberto

3. Beadandó feladat dokumentáció

SQL jogosultság-kezelés. Privilégiumok Grant és Revoke Grant Diagrammok

Elemi alkalmazások fejlesztése IV.

MySql elindítása. Elemi alkalmazások fejlesztése IV. Feladat. Az alkalmazás adatbázisa

Haladó irodai számítógépes képzés tematika

Az importálás folyamata Felhasználói dokumentáció verzió 2.1.

Országos Területrendezési Terv térképi mel ékleteinek WMS szolgáltatással történő elérése, Quantum GIS program alkalmazásával Útmutató 2010.

Felhasználói leírás a DimNAV Server segédprogramhoz ( )

Parlagfű Bejelentő Rendszer

ABAP dictionary objektumok SAP adatmodell Táblák kezelése. Az SAP programozása 1. Tarcsi Ádám

Access gyakorlati feladatok lépésről lépésre

Táblázatkezelés Excel XP-vel. Tanmenet

Adabáziselérés ODBC-n keresztül utasításokkal C#-ban

Adatbázis-kezelés ActiveX vezérl kkel 2.rész

A szürke háttérrel jelölt fejezet/alfejezet szövege a CD-mellékleten található. A CD-melléklet használata. 1. Elméleti áttekintés 1

Az ErdaGIS térinformatikai keretrendszer

Swing GUI készítése NetBeans IDE segítségével

Az SQL*Plus használata

A webáruház kezdőlapján háromféle diavetítés beállítására van lehetőség:

Lekérdezések I. Egyszerű választó lekérdezések

Táblázatok kezelése. 1. ábra Táblázat kezelése menüből

Adatbázis-kezelés az Excel 2013-ban

Duál Reklám weboldal Adminisztrátor kézikönyv

Java Programozás 6. Gy: Java alapok. Adatkezelő 2.rész

PHP-MySQL. Adatbázisok gyakorlat

Hozzávalók keresése és csatolása

PwC EKAER Tool felhasználói leírás május

Térképek jelentése és elemzése

Bevezetés: az SQL-be

Téradatbázisok használata QGIS-ből A DB kezelő modul 2.2 verzió

Adatbáziskezelés alapjai. jegyzet

Felhasználói segédlet a Scopus adatbázis használatához

Molnár Mátyás. Bevezetés a PowerPoint 2010 használatába. Csak a lényeg érthetően!

Access alapok. Megnevezés Művelet Minta. Új adatbázis létrehozása. Új / Üres adatbázis.. Tábla létrehozása tervező nézetben.

Netlock Kft. által kibocsátott elektronikus aláírás telepítése Windows XP SP3 Internet Explorer 8 böngészőbe

Technikai információk fejlesztőknek

2 Access 2016 zsebkönyv

Felhasználói dokumentáció. a TávTagTár programhoz. Készítette: Nyíri Gábor, hdd@nc-studio.com GDF Abakusz regisztrációs kód: GDFAba43

Elemi alkalmazások fejlesztése III.

Adatbázis kezelés Delphiben. SQL lekérdezések

KTI Közlekedéstudományi Intézet Nonprofit Kft. Vasúti Vizsgaközpont

Prezentációkészítés PowerPoint XP-vel

Adatbázis, adatbázis-kezelő

az adatbevitel szabályozása, alapok

Országos Területrendezési Terv térképi mel ékleteinek WMS szolgáltatással történő elérése, MapInfo program alkalmazásával Útmutató 2010.

Algoritmus terv 3. Fejezet: Folyamatok meghatározása

Ismerkedés az Office 2007 felhasználói felületével

Országos Területrendezési Terv térképi mellékleteinek WMS szolgáltatással történő elérése, MapInfo program alkalmazásával

Táblázatok. Táblázatok beszúrása. Cellák kijelölése

SQL DDL-2 (aktív elemek) triggerek

A d m i n i s z t r á c i ó s f e l a d a t o k a I n t e g r á l t K ö n y v t á r i R e n d s z e r b e n

Java Programozás 11. Ea: MVC modell

Operációs rendszerek. Tanmenet

Grafikus felhasználói felület (GUI) létrehozása A GUI jelentése Egy egyszerű GUI mintaalkalmazás létrehozása

Outlook Express használata

ESEMÉNY VEZÉRELT ALKALMAZÁSOK FEJLESZTÉSE I. Bevezetés. Készítette: Gregorics Tibor

Ügyviteli rendszerek hatékony fejlesztése Magic Xpa-val mobilos funkciókkal kiegészítve. Oktatók: Fülöp József, Smohai Ferenc, Nagy Csaba

A WORDPRESS TESTRESZABÁSA (MEGJELENÉS MENÜ ELEMEI)

3. modul - Szövegszerkesztés

SEGÉDLET ADATKEZELÉS MS EXCEL-BEN. Tároljuk az adatokat Excel munkalapon. Megjegyzés: A feladatokat MS Office Excel ban oldottuk meg.

Könyvtári nyilvántartás

KUTATÁSTÁMOGATÁS SOROZAT. Felhasználói segédlet Academic Search Complete adatbázisban idézők kereséséhez

ContractTray program Leírás

Excel VI. Haladó ismeretek. Makrók készítése Visual Basic nyelven Egyszerű Visual Basic program

WordPress segédlet. Bevezető. Letöltés. Telepítés

Felhasználói segédlet a Web of Knowledge / Web of Science adatbázis használatához

munkafüzet open eseményéhez

Webes alkalmazások fejlesztése 12. fejezet. Szolgáltatás alapú kommunikáció (WCF) Giachetta Roberto. Eötvös Loránd Tudományegyetem Informatikai Kar

On-line képzési program nyilvántartás

EDInet Connector telepítési segédlet

Átírás:

Eötvös Loránd Tudományegyetem Informatikai Kar Eseményvezérelt alkalmazások fejlesztése I 10. előadás Adatbázis-kezelés modell/nézet architektúrában Giachetta Roberto http://people.inf.elte.hu/groberto

A modell/nézet architektúra Az összetettebb alkalmazásoknál célszerű a kétrétegű architektúrát bevezetni, amelyet a modell/nézet (Model/View) architektúrának nevezünk felhasználó nézet alkalmazás modell Adatkezelő alkalmazásoknál ez több szempontból is hasznos lehet, pl.: az adatkezelést könnyen átalakíthatóvá teszi az adatmegjelenítést egyedire szabhatjuk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:2

A Qt koncepciója A Qt magába ágyazta a modell/nézet architektúrát adatkezelésre, így beépített elemek használatával is elérhető az alkalmazás rétegelt felépítése a modell biztosít osztályokat a különböző adatforrások olvasására, írására, pl. listák, XML fájlok, adatbázisok, fájlrendszer, a nézet különböző megjelenítő grafikus vezérlőket tartalmaz, pl. táblázat megjelenítő, lista megjelenítő, a két réteg pontos összeillesztését a delegált (item delegate) típusok felügyelik, amelyek meghatározzák, milyen módon jelenjenek meg az adatok ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:3

A Qt koncepciója lista megjelenítő tábla megjelenítő fa megjelenítő delegált nézet modell lista modell fájlrendszer modell adatbázis modell szöveg listák fájlrendszer adatbázis ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:4

Adattársítás és indexelés A felületen a nézetek mellett egyéb grafikus vezérlők is kezelhetik az adatokat, amennyiben megfelelő adattársítást (data binding) biztosítunk a vezérlő és a modell között Egy modell tetszőlegesen sok különböző felületi elemhez kapcsolható, különböző nézetek és adattársítások használatával a tartalom szinkronizált, így az egyik nézetben végzett módosítások azonnal megjelennek a másik nézetben Az adatközlés a felület és a modell között modell indexek (QModelIndex) segítségével történik, amely az adatok lokalizálására szolgál pl. sor/oszlop szám alapján táblázat esetén ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:5

Adattársítás és indexelés felületi vezérlő táblamegjelenítő modell indexek adattársítás delegált adatbázis modell parancs objektumok adatbázis kapcsolat adatbázis ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:6

Adatbázis-kezelő modellek A modellek a QAbstractItemModel leszármazottai, ezek közül adatbázis-kezelésre 3 alkalmazható: QSqlQueryModel: egy lekérdezés eredményének kezelésére (csak olvasható) QSqlTableModel: egy tábla tartalmának kezelésére (írható és olvasható) QSqlRelationalTableModel: idegen kulcsokat tartalmazó tábla kezelésére (további táblákból begyűjtött adatokkal) QAbstractItemModel QSqlQueryModel QSqlTableModel QSqlRelationalTableModel ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:7

Lekérdezés modellek A QSqlQueryModel típust lekérdezések megjelenítésére, olvasásra használhatjuk a setquery(<lekérdezés>) metódussal beállíthatunk tetszőleges lekérdezést (akár több táblát felhasználva) a setheaderdata(<oszlop>, <megjelenés>, <elnevezés>) művelettel szabályozhatjuk az oszlopok tulajdonságait a sorok számát a rowcount(), az oszlopok számát a columncount() metódussal kérdezhetjük le az adatokat soronként (record(<sor>)), vagy indexek segítségével (index(<sor>, <oszlop>)) érhetjük el ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:8

Lekérdezés modellek megjelenítése Modellek megjelenítéséhez a QAbstractItemView leszármazottait kell használnunk, táblázatos megjelenítéshez a QTableView típust a setmodel(<modell>) művelettel állítjuk be a modellt pl.: QSqlQueryModel model; // modell model.setquery("select "); // lekérdezés model.setheaderdata(0, Qt::Horizontal, "Id"); // oszlop fejlécének beállítása QTableView view; // nézet view.setmodel(model); // modell beállítása view.show(); // megjelenítés ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:9

Példa Feladat: Készítsük el az apartman adatbázis épületeinek (buildings) grafikus megjelenítését. az alkalmazáshoz nem kell egyetlen új osztályt se definiálnunk, a létező típusok felhasználásával megoldható a feladat az ablakban egy táblamegjelenítőben jelenjen meg a tábla teljes tartalma, ehhez egy QTableView példányt alkalmazunk az adatok betöltését egy lekérdező modellel végezzük (QSqlQueryModel), amely megkapja a megfelelő lekérdezést, és lefuttatja a lekérdező műveleteket (QSqlQuery) ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:10

Példa Tervezés (adatbázis): ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:11

Példa Tervezés (alkalmazás): QAbstractItemView -model QAbstractItemModel QTableView QSqlQueryModel -query QSqlQuery ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:12

Példa Megvalósítás (main.cpp): int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase("MYSQL"); // adatbázis-kapcsolat létrehozása QSqlQueryModel* model = new QSqlQueryModel(); // lekérdezési modell model->setquery("select * from building"); // lekérdezés beállítása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:13

Példa Megvalósítás (main.cpp): model->setheaderdata(0, Qt::Horizontal, trutf8("azonosító")); // fejlécek beállítása QTableView* tableview = new QTableView(); // táblamegjelenítő tableview->setmodel(model); // modell beállítása a megjelenítőhöz tableview->show(); } return a.exec(); ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:14

Indexek használata A modellen belüli adatok kezelését indexek (QModelIndex) segítségével tehetjük meg minden elemnek a modellünkben saját indexe van, saját címmel, amely a modell felépítésétől függ ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:15

Indexek használata az indexhez tartozó adatot a data() metódussal kérhetjük le az index sorral (row()) és oszloppal (column()) rendelkezik, fák esetén az indexnek lehetnek gyerek (child(<sorszám>)), illetve szülő (parent()) indexei is Az indexeket a nézetben is használhatjuk a kiválasztás módját a setselectionbehavior(<viselkedés>) és setselectionmode(<mód>) műveletekkel szabályozzuk a setcurrentindex(<index>) a kijelölést állítja az edit(<index>) művelettel szerkeszthetővé tehetünk egy elemet, az update(<index>) frissíti az adott tartalmat ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:16

Szerkesztő modellek Egy tábla lekérdezését és szerkesztését a QSqlTableModel osztály biztosítja a settable(<táblanév>) művelettel állíthatunk be egy táblát adatforrásnak, a select() művelet szolgál az adatok lekérdezésére adatot lekérdezni a data(<index>), beállítani a setdata(<index>, <adat>) metódussal tudunk lehetőségünk van tetszőlegesen rendezni az adatokat a setsort(<oszlop>, <rendezési mód>) művelettel az insertrow(<sor>) beszúr egy üres sort a megadott helyre, a removerow(<sor>) töröl egy sort ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:17

Szerkesztő modellek Pl.: QSqlTableModel *model; // modell QTableView *view; // nézet model->settable("mytable"); // tábla beállítása model->setsort(0, Qt::AscendingOrder); // rendezés model->select(); // adatok betöltése int row = view->currentindex().row(); // kijelölt sor lekérdezése model->insertrow(row); // új sor beszúrása QModelIndex index = model->index(row, 0); // index lekérdezése (a sor első oszlopához) model->setdata(index, 100); // adat beállítása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:18

Példa Feladat: Készítsünk alkalmazást, amely alkalmas az épületek szerkesztésére, új épület létrehozására, törlésére. a táblaszerkesztést egy ablakba (TableModelDialog) helyezzük, amelyhez felvesszük a hozzáadás és törlés gombjait, a táblakezeléshez egy QSqlTableModel, a megjelenítéshez egy QTableView példányt használunk beszúráskor lekérdezzük a kijelölt sor indexét, behelyezünk egy sort a helyére, átállítjuk a kijelölést (az indexen keresztül), majd szerkesztésre váltunk törléskor töröljük a kijelölt sort (amennyiben van kijelölés), és áthelyezzük a kijelölést ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:19

Példa Tervezés: QDialog BuildingEditorDialog - _addbutton :QPushButton* - _buttonbox :QDialogButtonBox* - _model :QSqlTableModel* - _removebutton :QPushButton* - _tableview :QTableView* + ~BuildingEditorDialog() :void + BuildingEditorDialog(QWidget*) - setupmodel() :void - setupui() :void «slot» - addbutton_clicked() :void - removebutton_clicked() :void -_tableview -_model QTableView QSqlTableModel ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:20

Példa Megvalósítás (main.cpp): int main(int argc, char *argv[]) { QApplication a(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); if (db.open()) { // kapcsolat megnyitása BuildingEditorDialog *w = new BuildingEditorDialog(); w->show(); // ablak megnyitása } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:21

Példa Megvalósítás (buildingeditordialog.cpp): void BuildingEditorDialog::setupModel() { _model = new QSqlTableModel(this); // táblamodell létrehozása _model->settable("building"); // tábla beállítása model->setsort(1, Qt::AscendingOrder); // rendezési sorrend model->setheaderdata(0, Qt::Horizontal, trutf8("azonosító")); model->select(); // adatok begyűjtse ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:22

Példa Megvalósítás (buildingeditordialog.cpp): void BuildingEditorDialog::setupUi() { tableview = new QTableView(this); tableview->setmodel(model); // modell hozzákapcsolása a megjelenítőhöz tableview->setselectionbehavior( QAbstractItemView::SelectItems); // kijelölés módja tableview->resizecolumnstocontents(); // oszlopok automatikus méretezése } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:23

Szerkesztési stratégia A szerkesztési stratégia függvényében kétféle megközelítést alkalmazhatunk az adatkezelésben: szinkron (állandó kapcsolatú) modell: az adatbázis és a modell tartalma folyamatosan (legalábbis rekordváltásonként) egyezik, ez az automatikus szerkesztési stratégia aszinkron (bontott kapcsolatú) modell: az adatbázis és a modell tartalma különbözhet, és csak meghatározott pontokon egyezik meg (select, submitall, revertall), ez a manuális szerkesztési stratégia A gyakorlatban az aszinkron modell az elterjedtebb, mivel nem igényel állandóan az adatbázis műveletek futtatását ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:24

Szerkesztési stratégia A szerkeszthető modell lehetőséget ad a szerkesztési stratégia beállítására a modell a módosításokat első lépésben csak a memóriában végzi el, utána menti vissza azokat az adatbázisba a módosítás fennállását az isdirty(<index>) metódussal kérhetünk le, ez igazat ad, amennyiben az adat eltér az adatbázisban tárolttól egy sort, vagy adatot menteni a submit(), a teljes tartalmat menteni a submitall() utasítással tudunk lehetőségünk van változtatások visszavonására is revert() és revetall() metódusokkal ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:25

Szerkesztési stratégia a seteditstrategy(<stratégia>) függvényével definiálhatjuk a visszamentés módját, ez a következő lehetnek: OnFieldChange: amint váltjuk a mezőt, automatikusan meghívja a submit() utasítást OnRowChange: amint váltjuk a sort, automatikusan meghívja a submit() utasítást OnManualSubmit: nem történik változtatás, amíg meg nem hívjuk a mentés (submitall()) vagy visszavonás (revertall()) műveletét a mentő műveletek hamissal térnek vissza sikertelen mentéskor, ekkor a lasterror() tartalmazza a hibát ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:26

Tranzakciók Lehetőségünk van az adatok konzisztencióját tranzakciók segítségével biztosítani (ha az adatbázis-kezelő támogatja) a transaction() utasítás indítja a tranzakciót, amelyet a commit() utasítással véglegesíthetünk, a rollback() utasítással visszavonhatunk amennyiben valamelyik utasítás hibásnak bizonyul, visszaállíthatjuk az adatbázis konzisztens állapotát, ezért célszerű használni a submitall() utasítás esetén, pl.: db.transaction(); // tranzakció indítása if (model->submitall()) // módosítások mentése db.commit(); // ha sikeres, véglegesítünk else db.rollback(); // ha sikertelen, visszavonjuk ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:27

Kapcsolt táblák kezelése Adatbázisbeli relációk segítségével kapcsolt adatokat a QSqlRelationalTableModel segítségével kezelhetünk a setrelation(<oszlop>, <reláció>) metódussal beállíthatunk relációt egy adott oszlopra a reláció típusa QSqlRelation, megadja a tábla nevét, a forrás (társított), valamint a cél (megjelenített) oszlopot pl.: QSqlRelationalTableModel model; // modell model.settable("mytable"); // tábla beállítása model.setrelation(2, QSqlRelation("otherTable", 0, 1)); // reláció megadása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:28

Kapcsolt táblák kezelése A relációval kapcsolt tábla egyúttal egy külön modellt is létrehoz az alkalmazásban, amelyet külön lekérdezhetünk és szerkeszthetünk a relationmodel(<oszlop>) metódus visszaadja a csatolt táblához tartozó modellt pl.: model.setrelation(2, QSqlRelation("otherTable",0,1)); // reláció megadása QSqlTableModel *othermodel = model.relationmodel(2); // relációval kapcsolat tábla lekérdezése othermodel->data( ); // adat lekérdezése ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:29

Kapcsolt táblák megjelenítése A társított adatokat nem csak szövegesen, hanem legördülő menü segítségével is megjeleníthetjük a nézet setitemdelegate(<delegált>) metódusa segítségével állíthatunk be speciális delegáltat a delegáltat az alapértelmezettről egy QSqlRelationalDelegate példányra kell lecserélnünk pl.: QTableView view; // nézet view.setmodel(model); // modell beállítása view.setitemdelegate(new QSqlRelationalDelegate()); // delegált beállítása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:30

Példa Feladat: Módosítsuk az épületek szerkesztését úgy, hogy a városokat hozzácsatoljuk az megjelenítéshez ehhez relációs adatmodellt kell használnunk, amely létrehozza a relációt a városok táblával (city), az épületek táblabeli azonosítót (city_id) kötve az azonosítóhoz (id), és helyette megjelenítve a nevet (name) a megjelenítéshez lecseréljük a delegáltat is, így legördülő menü fog megjelenni az adatok mentését manuálisan valósítjuk meg tranzakciók segítségével egy külön gombbal ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:31

Példa Tervezés (adatbázis): ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:32

Példa Tervezés (alkalmazás): BuildingEditorDialog QDialog - _addbutton :QPushButton* - _buttonbox :QDialogButtonBox* - _model :QSqlRelationalTableModel* - _removebutton :QPushButton* - _revertbutton :QPushButton* - _submitbutton :QPushButton* - _tableview :QTableView* + ~BuildingEditorDialog() :void + BuildingEditorDialog(QWidget*) - setupmodel() :void - setupui() :void «slot» - addbutton_clicked() :void - removebutton_clicked() :void - submitbutton_clicked() :void -_tableview QTableView QSqlRelationalDelegate -_model QSqlRelationalModel ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:33

Példa Megvalósítás (buildingeditordialog.cpp): _model = new QSqlRelationalTableModel(this); _model->setrelation(2, QSqlRelation("city", "id", "name")); // reláció beállítása egy oszlophoz _tableview = new QTableView(this); _tableview->setitemdelegate( new QSqlRelationalDelegate()); // megjelenítés módjának definiálása ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:34

Példa Megvalósítás (buildingeditordialog.cpp): if (model->submitall()) { // mentés _model->database().commit(); } else { // amennyiben sikertelen volt _model->database().rollback(); // visszavonjuk QMessageBox::warning(this, trutf8("hiba történt a mentéskor!"), trutf8("az adatbázis a következő hibát jelezte: %1"). arg(model->lasterror().text())); // jelezzük a hibát } ELTE IK, Eseményvezérelt alkalmazások fejlesztése I 10:35