Elemi alkalmazások fejlesztése IV. Adatbázis-kezelés ActiveX vezérl ı kkel - 2 ADATBÁZIS-KEZELÉS ACTIVEX VEZÉRLİ K ALKALMAZÁSÁVAL II... 2 PROJEKT LÉTREHOZÁSA... 3 ACTIVEX VEZÉRLİ K BEILLESZTÉSE... 3 A CSOPORT TÁBLA ELHELYEZÉSE AZ Ő RLAPON... 3 IDC_DATA_CSOPORT beállításai... 3 IDC_GRID_CSOPORT beállításai... 4 A TAG TÁBLA ELHELYEZÉSE AZ Ő RLAPON... 5 IDC_DATA_TAG beállításai... 5 IDC_GRID_TAG beállításai... 6 A CSOPORT TÁBLA ÉS A TAG TÁBLA ÖSSZEKAPCSOLÁSA... 6 Csoport váltás figyelése... 6 Új rekord beszúrása a tag táblába... 7 A MAXIMÁLIS ÉS AKTUÁLIS CSOPORTLÉTSZÁM ELHELYEZÉSE... 8 IDC_DATA_MAX beállításai... 9 IDC_TEXTBOX_MAX beállításai... 9 IDC_DATA_COUNT beállításai... 10 IDC_TEXTBOX_COUNT beállításai... 10 A SZÁMLÁLÓ FRISSÍTÉSE... 11 ELLENİ RZÖTT ADATBEVITEL BIZTOSÍTÁSA... 11 Új rekord beszúrásának engedélyezése, tiltása... 11 Adatbevitel ComboBox segítségével... 12 DIÁKOK KIVÁLASZTÁSA A DIÁK TÁBLA SEGÍTSÉGÉVEL... 13 IDC_DATA_DIAK beállításai... 13 IDC_GRID_DIAK beállításai... 13 IDC_GRID_TAG módosítása... 14 A kiválasztott diák adatainak beillesztése a tag táblába... 14 Szabóné Nacsa Rozália Email: nacsa@inf.elte.hu Honlap: people.inf.elte.hu/nacsa 2004. november 1. oldal
Elemi alkalmazások fejlesztése IV. Adatbázis-kezelés ActiveX vezérl ı kkel - 2 Adatbázis-kezelés ActiveX vezérl k alkalmazásával II. Feladat: ActiveX vezérlı k felhasználásával készítsünk programot az Eaf projekthez, amely alkalmas a diákok csoportba történı bejelentkeztetéséhez. A feladat megoldásához az alábbi ActiveX vezérlı ket fogjuk használni: Microsoft ADO Data Control, version 6.0 (C:\Widows\System32\MSADODC.OCX) (Adatbázishoz rendelhetı, adatszolgáltató vezérlı, mely összekapcsolható adatok megjelenítésére készült vezérlı kkel.) TRue OLE DBGrid 8 Control (C:\Widows\System32\todg8.OCX) (Táblázat megjelenítét és kezelését végzı, adatszolgáltatóval összeköthetı vezérlı elem) Microsoft RemoteData Control, version 6.0 (C:\Widows\System32\MSRDC2032.OCX) (Adatbázishoz rendelhetı, adatszolgáltató vezérlı, mely összekapcsolható adatok megjelenítésére készült vezérlı kkel.) DBGridControl (C:\Widows\System32\DBGRID32.OCX) (Táblázat megjelenítését és kezelését végzı,, adatszolgáltatóval összeköthetı vezérlı elem) Microsoft Forms 2.0 TextBox (C:\Widows\System32\FM20.DLL) (Szöveget megjelenítı, adatszolgáltatóval összeköthetı vezérlı elem) A DBGridControl a Microsoft Remote Data Control-lal, a TRue OLE DBGrid 8 Control a Microsoft ADO Data Control-lal tud együtt dolgozni. A DBGridControl alkalmazása során azt tapasztaltam, hogy üres táblázatok esetén nem jól mő ködik az új rekord felvétele, ezért szívesebben használom a TRue OLE DBGrid 8 Control vezérlı t. Ezt a vezérlı t 30 napos kipróbálásra lehet letölteni. Letöltéshez regisztrálni kell a http://www.logon-int.com/product_evaluate.asp címen, majd a levélben visszajelzett tdbgrid8_****.exe fájl végrehajtása után a vezérlı bekerül a regisztrált ActiveX vezérlı k közé. Természetesen, ha Önnek nem sikerül beszerezni az itt ismertetett ActiveX vezérlı t, használja nyugodtan a Microsoft vezérlı it, vagy bátran keressen más AciveX vezérlı t a feladat megoldásához. Az adatbázis-kezelést támogató ActtiveX vezérlı k használata és beállítása nagyon hasonlít egymáshoz. 1. Figyeljen arra, hogy az adatmegjelenítı t csak a neki megfelelı adatszolgáltatóval lehet összekötni. 2. A Microsoft Remote Data Control DBGrid pár és a Microsoft ADO Data Control True DBGrid pár ugyanolyan feladatok megoldására alkalmas, nagyon hasonló a paraméterezésük, de sajnos az elsı változat legalábbis nálam bizonyos esetekben hibásan mő ködik. 2. oldal
Projekt létrehozása File/New/MFC AppWizard(Exe) Project name: ActiveEaf /OK Single document/next/next/next Printing kikapcsolva/next/next Base Class: CFormView Finish/OK ActiveX vezérlı k beillesztése Project/Add to Project/Component and Controls Registered ActiveX Controls könyvtár kiválasztása Microsoft ADO Data Control Version 6.0 (OLEDB) kiválasztása - Insert/Ok/Ok True OLE DBGrid 8 Control kiválasztása - Insert/Ok/Ok Microsoft Remote DataControl 6.0 kiválasztása - Insert/Ok/Ok DBGrid Control kiválasztása - Insert/Ok/Ok (Táblázat megjelenítése és kezelése - Microsoft) Microsoft Forms 2.0 TextBox kiválasztása - Insert/Ok/Ok Close Keresse meg a Controls eszköztárban az új vezérlı elemek gombjait. A csoport tábla elhelyezése az ő rlapon Helyezzen el egy Microsoft ADO Data Control Version 6.0 (OLEDB) vezérlı t és egy True OLE DBGrid 8 Control vezérlı t az ablakon. Állítsa be a két vezérlı t az alábbiak szerint. IDC_DATA_CSOPORT beállításai 1. A vezérlı láthatatlan. ID: IDC_DATA_CSOPORT Caption: Csoport vezérlı Visible: kikapcsolva 2. Az EAF adatbázist ODBC driveren keresztül használjuk. Control fül Source of Connection Use ODBC Data source name: Elemi alkalmazások fejlesztése 3. Az adatforrást a csoport, gyakvez és a felev táblák összekapcsolásával, nézetként állítjuk elı. RecordSource fül Command type 1 adcmdtext Command Text(SQL): select csoport_id,csoport.nev,felev.kezdet,felev.szam,gyakvez.nev gyakvez_nev,csoport.max from csoport,gyakvez,felev where csoport.felev_id=felev.felev_id and csoport.gyakvez_id=gyakvez.gyakvez_id 4. Legyen a vezérlı változója m_datacsoport. 3. oldal
IDC_GRID_CSOPORT beállításai 1. A táblázat látható. ID: IDC_GRID_CSOPORT Caption: Csoport tábla Visible: bekapcsolva Tab stop: true 2. Beszúrást, törlést, módosítást nem engedélyezünk. All fül Data Source IDC_DATA_CSOPORT AllowAddNew false AllowUpdate false AllowDelete false 3. Sor kiválasztásánál kijelöljük a teljes sort. Splits fül MarqueeStyle/3 HiglightRow 4. Az utolsó oszlop és az ablak széle között ne legyen kitöltetlen sáv. Splits fül Split(00) ExtendedRightColumn: true 5. Adjunk beszédesebb neveket az oszlopoknak. Columns fül Column(00) Data Field: csoport_id Caption: Csoport Id Column(01) Data Field: nev Caption: Csoport neve Column(02) Data Field: kezdet Caption: Félév kezdete Column(03) Data Field: szam Caption: Félév száma Column(04) Data Field: gyakvez_nev Caption: Gyakorlatvezetı Column(05) Data Field: max Caption: Max 6. A Félév száma oszlopban az 1,2,3,4 helyett jelenjen meg EAF1,,EAF4. Values fül Column3 (szam) Translate: bekapcsolva Validate: bekapcsolva Töltse ki a Value/Display Value párt az alábbi táblázatnak megfelelı en. Value Display value 1 EAF1 2 EAF2 3 EAF3 4 EAF4 4. oldal
7. Legyen a vezérlı változója m_gridcsoport. Forditás/Futtatás A projekt lefordítása után ellenı rizze a táblázatot. Vegye észre, hogy nem lehet új sort beszúrni és sorokat törölni. A félévek száma helyett az EAF1,, EAF4 szöveg jelenik meg a táblázatban. A tag tábla elhelyezése az ő rlapon Vegyük kisebb mérető re a csoport táblát és helyezzük el alatta a tag tábla adatvezérlı jét és táblázatát. IDC_DATA_TAG beállításai 1. A vezérlı legyen láthatatlan ID: IDC_DATA_TAG Caption:: Tag vezérlı Visible: kikapcsolva 2. Használjuk az EAF adatbázist ODBC driveren keresztül Control fül Source of Connection Use ODBC Data source name: Elemi alkalmazások fejlesztése 3. Az adatforrás legyen a tag tábla RecordSource fül Command type 1 adcmdtext Command Text(SQL): select tag.diak_id, concat(diak.nev,'[',diak.azon,']') diak_azon,tag.csoport_id,pont1,pont2,pont3,pont4 from tag,diak 4. Legyen a vezérlı változója m_datatag. 5. oldal
IDC_GRID_TAG beállításai 1. A vezérlı legyen látható ID: IDC_GRID_TAG Caption: Tagtábla Visible: true Tab stop: true 2. Engedélyezzük a módosítást, törlést, beszúrást All fül Data Source IDC_DATA_TAG AllowAddNew true AllowUpdate true AllowDelete true 3. Az utolsó oszlop és az ablak széle között ne legyen kitöltetlen sáv. Splits fül Split(00)/ExtendedRightColumn: true 4. Adjunk beszédesebb neveket az oszlopoknak. Columns fül Column(00) Data Field: csoport_id Caption: Csoport Id Column(01) Data Field: diak_id Caption: Diák Id Column(02) Data Field: diak_azon Caption: Diák azonosító Column(03) Data Field: pont1 Caption: Bead 1 Column(04) Data Field: pont2 Caption: Bead 2 Column(05) Data Field: pont3 Caption: Bead 3 Column(05) Data Field: pont4 Caption: Bead 4 5. Rejtsük el a csoport_id oszlopot. Splits fül Columns Column(00) Visible: false 6. Legyen a vezérlı változója m_gridtag. A csoport tábla és a tag tábla összekapcsolása Csoport váltás figyelése A két tábla összekapcsolásához a csoport tábla RowColChange üzenetet kell kezelni. Ez az üzenet akkor kerül kibocsátásra, amikor sort váltunk a csoport táblában. A sorváltáskor elvégzendı feladatok elvégzését a RefreshTag() privát metódusra bízzuk, melyet az OnRowColChange() üzenetkezelı ben hívunk meg 6. oldal
1. A RefreshTag() privát függvény deklarálása Class View/CEafActiveView/Jobb egérfül/ Add Member Function Function type: void Function declaration: RefreshTag() Access: private 2. A RefreshTag() privát függvény definiálása void CTestView::RefreshTag() //aktuális csoport lekérdezése m_gridcsoport.setcol(0); CString csop = m_gridcsoport.gettext(); CString q; //tag tábla frissítése q.format("select tag.diak_id, concat(diak.nev,'[',diak.azon,']') diak_azon,tag.csoport_id,pont1,pont2,pont3,pont4 from tag,diak where tag.diak_id=diak.diak_id and csoport_id = %s",csop); m_datatag.setrecordsource(q); m_datatag.refresh(); 3. A RowColChange eseménykezelı beillesztése ClassWizard Project: ActiveEAf Class name: CActivEafView Objec ID: IDC_GRID_CSOPORT Message: RowColChange MemberFunction: OnRowColChangeGridCsoport 4. Az OnRowColChangeGridCsoport() eseménykezelı definiálása void CActiveEafView::OnRowColChangeGridCsoport(VARIANT FAR* LastRow, short LastCol) RefreshTag(); 5. A Click eseménykezelı beillesztése ClassWizard Project: ActiveEAf Class name: CActivEafView Objec ID: IDC_GRID_CSOPORT Message: Click MemberFunction: OnClickGridCsoport 6. Az OnClickGridCsoport() eseménykezelı definiálása void CActiveEafView::OnClickGridCsoport() RefreshTag(); Új rekord beszúrása a tag táblába 1. A BeforeUpdate eseménykezelı beillesztése Amikor egy új diákot felveszünk a tag táblába, akkor a csoport_id-t automatikusan töltsük ki a kiválasztott csoporthoz (a csoport tábla kijelölt sorához) tartozó csoport_id-vel. ClassWizard Project: ActiveEAf Class name: EActivEafView Objec ID: IDC_GRID_TAG Message: BeforeUpdate MemberFunction: OnBeforeUpdateGridTag 7. oldal
2. Az OnBeforeUpdateGridTag () eseménykezelı definiálása void void CActiveEafView::OnBeforeUpdateGridTag(short FAR* Cancel) m_gridcsoport.setcol(0); CString csop = m_gridcsoport.gettext(); m_gridtag.setcol(0); m_gridtag.settext(csop); m_gridtag.setcol(1); 3. Az AfterUpdate eseménykezelı beillesztése ClassWizard Project: ActiveEAf Class name: EActivEafView Objec ID: IDC_GRID_TAG Message: AfterUpdate MemberFunction: OnAfterUpdateGridTag 4. Az OnAfterUpdateGridTag () eseménykezelı definiálása void CActiveEafView::OnAfterUpdateGridTag() m_datatag.refresh(); Forditás/Futtatás Figyelje meg, hogy a tag tábla csak az adott csoportot jeleníti meg. Ellenı rzéshez kapcsolja be a tag tábla csoport_id oszlopának láthatóságát. Itt már felvehetünk új diákot a kiválasztott csoportba, de a felvitelnél még nincs semmiféle ellenı rzés. A maximális és aktuális csoportlétszám elhelyezése A maximális és az aktuális csoportlétszámot egy, az adatbázishoz csatolható szövegdobozban (Microsoft Forms 2.0 TextBox) jelenítjük meg. Ehhez a szövegdobozhoz hozzárendelünk egy adatforrást (Microsoft Remote DataControl 6.0.). Ezt az adatforrást az elı zı ekben megismert Microsoft ADO Data Control adatvezérlı höz nagyon hasonló módon lehet beállítani. 8. oldal
vezérlı Változó típusa Változó neve Megjegyzés IDC_DATA_MAX (Microsoft Remote DataControl 6.0) CRdc m_datamax IDC_TEXTBOX_MAX (Microsoft Forms 2.0 TextBox) CMdcText m_textboxmax IDC_DATA_COUNT (Microsoft Remote DataControl 6.0) CRdc m_datacount IDC_TEXTBOX_COUNT (Microsoft Forms 2.0 TextBox) CMdcText m_textboxcount IDC_DATA_MAX beállításai Vegye észre, hogy most egy másik Data Control vezérlı t (Microsoft Remote DataControl 6.0) használunk. 1. Az adatvezérlı t elrejtjük. ID: IDC_DATA_MAX Caption:: Max vezérlı Visible: kikapcsolva 2. Az EAF adatbázist ODBC driveren keresztül használjuk. (Megadjuk a felhasználót és a jelszót is.) Control fül Data source: Elemi alkalmazások fejlesztése User name: nacsa Password: **** SQL: select max from csoport (A select parancsot pontosító where klauzulát, azaz hogy melyik csoport max értékére van szükség, csak a programban tudjuk megadni. Itt azért adunk ki mégis egy hiányos select parancsot, hogy legyen egy max mezı nk, amit felhasználhatunk a tulajdonság lapok beállításánál.) 3. Legyen a vezérlı változója m_datamax. IDC_TEXTBOX BOX_MAX beállításai 1. A szövegdoboz látható, de nem módosítható. ID: IDC_TEXTBOX_MAX Caption: Max Visible: bekapcsolva Disable: bekapcsolva 2. Legyen az adatforrás az IDC_DATA_MAX-ban definiált max mezı. All fül Data Source IDC_DATA_MAX 9. oldal
Data Field: max Back Color: háttérszín kiválasztása (Vegye észre, hogy itt nemcsak az adatforrást, de az adatmezı t is meg kell adni.) 3. Legyen a vezérlı változója m_textboxmax. IDC_DATA_COUNT beállításai 1. Az adatvezérlı t elrejtjük. ID: IDC_DATA_COUNT Caption:: Count vezérlı Visible: false 2. Az EAF adatbázist ODBC driveren keresztül használjuk. (Megadjuk a felhasználót és a jelszót is.) Control fül Data source: Elemi alkalmazások fejlesztése User name: nacsa Password: 1234 SQL: select count(*) from tag 3. Legyen a vezérlı változója m_datamax. IDC_TEXTBOX BOX_COUNT beállításai 1. A szövegdoboz látható, de nem módosítható ID: IDC_TEXTBOX_COUNT Caption: Count Visible: true Disable: true 2. Legyen az adatforrás az IDC_DATA_COUNT-ban definiált count(*) mezı All fül Data SourceIDC_DATA_COUNT Data Field: count(*) Back Color: háttérszín kiválasztása (Vegye észre, hogy itt nemcsak az adatforrást, de az adatmezı t is beállítottuk.) 3. Legyen a vezérlı változója m_textboxcount. 4. Frissítse a RefreshTag() függvény a szövegdobozokat is. Egészítsük ki a RefreshTag() metódust úgy, hogy az IDC_TEXT_COUNT és az IDC_TEXT_MAX vezérlı k az aktuális csoport adatait mutassák. void CActiveEafView::RefreshTag() //aktuális csoport lekérdezése m_gridcsoport.setcol(0); CString csop = m_gridcsoport.gettext(); CString q; //tag tábla frissítése q.format("select tag.diak_id, concat(diak.nev,'[',diak.azon,']') diak_azon,tag.csoport_id,pont1,pont2,pont3,pont4 from tag,diak where tag.diak_id=diak.diak_id and csoport_id = %s",csop); m_datatag.setrecordsource(q); m_datatag.refresh(); //max és count frissítése q.format("select count(*) from tag where csoport_id=%s;",csop); m_datacount.setsql(q); m_datacount.refresh(); 10. oldal
q.format("select max from csoport where csoport_id=%s",csop); m_datamax.setsql(q); m_datamax.refresh(); A számláló frissítése Amikor felveszünk egy új diákot a tagtáblába ill. kiveszünk egy diákot a tag táblából, akkor a csoportlétszám megváltozik, ezért frissíteni kell. 1. A tag tábla AfterDelete eseménykezelı jének beillesztése ClassWizard Project: ActiveEAf Class name: CActivEafView Objec ID: IDC_GRID_TAG Message: AfterDelete MemberFunction: OnAfterDeleteGridTag 2. Az OnAfterDeleteGridTag() eseménykezelı definiálása void CActiveEafView::OnAfterDeleteGridTag() RefreshTag(); 3. A tag tábla AfterInsert eseménykezelı jének beillesztése ClassWizard Project: ActiveEAf Class name: CActivEafView Objec ID: IDC_GRID_TAG Message: AfterInsert MemberFunction: OnAfterInsertGridTag 4. Az OnAfterDeleteGridTag() eseménykezelı definiálása void CActiveEafView::OnAfterInsertGridTag() RefreshTag(); Ellenı rzött adatbevitel biztosítása Új rekord beszúrásának engedélyezése, tiltása Az adatbázis konzisztenciájának megı rzéséhez csak akkor engedélyezhetjük új diák felvételét egy csoportba (új rekord beszúrása a tagtáblába), ha ott valóban van hely. Azoknál a csoportoknál, ahol nincs több szabad hely, írjunk ki figyelmeztetı üzenetet. Vegyünk fel egy vezérlı t (IDC_COMMENT) a figyelmeztetı üzenet megjelenítéséhez. vezérlı Változó típusa Változó neve IDC_COMMENT CString m_comment A beszúrás lehetı sége csoportonként változik, ezért ezt a lehetı séget is csoportonként állítani kell. Egészítsük ki a RefreshTag() metódust úgy, hogy a kiválasztott csoport függvényében engedélyezze vagy tiltsa meg új diák felvételét a csoportba (új rekord beszúrását). void CTestView::RefreshTag() //aktuális csoport lekérdezése... //tag tábla frissítése... //max és count frissítése... 11. oldal
//Ellenı rzött adatbevitel biztosítása //Csak akkor vehetı fel új diák a csoportba, ha van hely int free = atoi(m_textboxmax.gettext()) - atoi(m_textboxcount.gettext()); if (free <= 0) m_comment= "Nincs több szabad hely!"; m_gridtag.setallowaddnew(false); else m_comment.format(""); m_gridtag.setallowaddnew(true); UpdateData(FALSE); Adatbevitel ComboBox segítségével Beállíthatjuk a tag tábla pontszám beviteli szerkesztı it úgy, hogy a kívánt értéket ComboBox-ból lehessen kiválasztani. Value fül ID: IDC_GRID_TAG CoLumn: Pont1 Presentation: 2 ComboBox Max Combo items: 6 Validate: true Caption:: Diák vezérlı Visible: false Forditás/Futtatás Futtassa a programot. Figyelje meg, hogyan változik a max és count értéke. Szúrjon be új rekordot, ill. töröljön rekordokat a tag táblából. Nézze meg, helyesek-e a count értéke. Figyelje meg, hogy azokban a csoportokban, ahol nincs több szabad hely nem vehet fel új diákot. Már egész szép az alkalmazásunk, de az még mindig elég kényelmetlen, hogy a diákokat vakon, a diak_id alapján kell megadni. Módosítsuk a programot úgy, hogy barátságosabb legyen a diákok kiválasztása. 12. oldal
Diákok kiválasztása a diák tábla segítségével Tegyük fel az alkalmazás ablakára a diák táblát. Új diák felvitelekor (új rekord beszúrása a tag táblába) a diák tábla megfelelı sorára duplát kattintva a diák adatai automatikusan kerüljenek be a tag táblába. A biztonság kedvéért a tag táblában a diak_id és a diak_azon mezı k csak olvashatóak legyenek. vezérlı Változó típusa Változó neve IDC_DATA_DIAK CAdodc m_datadiak IDC_GRID_DIAK CTRueDBGridCtrl m_griddiak IDC_DATA_DIAK beállításai 1. A vezérlı legyen láthatatlan ID: IDC_DATA_DIAK Caption:: Diák vezérlı Visible: false 2. Használjuk az EAF adatbázist ODBC driveren keresztül Control fül Source of Connection Use ODBC Data source name: Elemi alkalmazások fejlesztése 3. Az adatforrás legyen a diak tábla Record Source fül Command type 1 adcmdtext Command Text (SQL): select * from diak 4. Legyen a vezérlı változója m_datadiak. IDC_GRID_DIAK DIAK beállításai 1. Az adatvezérlı látható ID: IDC_GRID_DIAK Caption: Diak tábla Visible: true Tab stop: true 2. Adatok módosítása tilos. All fül Data Source IDC_DATA_DIAK AllowAddNew false AllowUpdate false AllowDelete false 13. oldal
3. Adjunk beszédesebb neveket az oszlopoknak. Columns fül Column(00) Data Field: diak_id Caption: Diák Id Column(01) Data Field: nev Caption: Diák neve Column(02) Data Field: azon Caption: ETR kód 4. Sor kiválasztásánál kijelöljük a teljes sort. Splits fül MarqueeStyle/3 HiglightRow 5. Legyen a vezérlı változója m_griddiak. IDC_GRID_TAG módosítása Legyen csak olvasható a tag tábla diak_id és a diak_azon mezeje. Splits fül/columns Column(01)[Diák Id] Style/Locked: true Column(02)[Diák azonosító] Style/Locked: true A kiválasztott diák adatainak beillesztése a tag táblába Szeretnénk, ha a diák tábla segítségével kiválasztott diák adatai (a sorra duplát kattintva) automatikusan bekerülnének a tag táblába. 1. A diák tábla DblClick eseményének beillesztése ClassWizard Project: ActiveEAf Class name: EActivEafView Objec ID: IDC_GRID_DIAK Message: DblClick MemberFunction: OnDblClickGridDiak 2. Az OnDblClickGridDiak() eseménykezelı definiálása void CActiveEafView::OnDblClickGridDiak() if(atoi(m_textboxcount.gettext())==0) m_gridtag.setrow(0); else m_gridtag.movelast(); m_gridtag.setrow(m_gridtag.getrow()+1); m_gridtag.setfocus(); m_griddiak.setcol(0); CString id = m_griddiak.gettext(); m_gridtag.setcol(1); m_gridtag.settext(id); m_griddiak.setcol(1); CString azon = m_griddiak.gettext(); m_griddiak.setcol(2); CString nev = m_griddiak.gettext(); CString nev_azon = nev + "[" + azon + "]"; m_gridtag.setcol(2); m_gridtag.settext(nev_azon); m_gridtag.setfocus(); 14. oldal
Megjegyzés: Ha a tag táblát úgy definiáljuk az adatbázisban, hogy a (csoport_id,diak_id) párt tekintjük elsı dleges kulcsnak, akkor biztosan nem kerülhet be kétszer ugyanaz a diák a csoportba. Az adatbázis konzisztenciájának biztosításához érdemes lenne csak azokat a diákokat megjeleníteni a diák táblában, akik egyáltalán szóba jöhetnek a csoportba történı bejelentkezéskor, azaz egyáltalán nem szerepel még a tag táblában, vagy ha igen, akkor nem lehet tag a félév más csoportjában és teljesítenie kellett a megelı zı féléveket. Ennek az ellenı rzésnek a megoldását önálló feldolgozásra ajánljuk. A munkafüzetben bemutatott példaprogram kicsomagolható a people.inf.elte.hu/nacsa/eaf/eaf4/projects/activeeaf.zip fájlból. 15. oldal