Home - qdidactic.com
Didactica si proiecte didacticeBani si dezvoltarea cariereiStiinta  si proiecte tehniceIstorie si biografiiSanatate si medicinaDezvoltare personala
referate stiintaSa fii al doilea inseamna sa fii primul care pierde - Ayrton Senna





Aeronautica Comunicatii Drept Informatica Nutritie Sociologie
Tehnica mecanica

Access


Qdidactic » stiinta & tehnica » informatica » access
Accesul la o baza de date prin interfata ODBC, folosind clase MFC



Accesul la o baza de date prin interfata ODBC, folosind clase MFC


Accesul la o baza de date prin interfata ODBC, folosind clase MFC



ODBC (Open Database Connectivity) este o interfata pentru programare (API) implementata prin intermediul driverelor ODBC specifice diferitelor Sisteme de Gestiune a Bazelor de Date (SGBD). Un program care foloseste interfata ODBC apeleaza administratorul de drivere ODBC (ODBC Driver Manager), care selecteaza driverul corespunzator si acesta, la randul sau, interactioneaza cu Sistemul de Gestiune al Bazei de Date prin intermediul instructiunilor SQL.

Folosind interfata ODBC si clasele MFC ODBC, poate fi accesata orice sursa de date, locala sau la distanta, pentru care utilizatorul aplicatiei are un driver ODBC. Sunt disponibile atat drivere pe 16 biti, cat si pe 32 de biti, pentru o varietate de surse de date (de exemplu: baze de date care folosesc mecanismul Microsoft Jet, create cu Microsoft Access sau cu Microsoft Visual Basic; bazele de date Microsoft FoxPro; dBASE; Paradox; Microsoft Excel; Lotus; fisiere de text).



In aceasta lucrare de laborator se va dezvolta o aplicatie de acces la o baza de date folosind interfata ODBC prin intermediul bibliotecii MFC. Aplicatia se refera la o baza de date numita Fonoteca.mdb, care va fi creata folosind unul din SGBD-urile instalate in laborator (Microsoft Access, SQL Server sau Oracle) si apoi inregistrata folosind Administratorul ODBC.


1. Crearea si inregistrarea bazei de date


Se creaza o baza de date numita Fonoteca care va contine doua tabele, Compozitor si Interpretare conform modelului de mai jos (prezentat in Microsoft Access), in care se introduc cateva inregistrari, pentru a se putea urmari executia programului de aplicatie:






Pentru campul Suportul, alegand Validation Rule[] se va deschide caseta de dialog Expression Builder, cu ajutorul careia se poate specifica o regula de validare: [Suportul=1] or [Suportul=2] or [Suportul=3].

Dupa crearea tabelelor din baza de date Fonoteca trebuie specificata relatia dintre ele. Asa cum s-a aratat si in lucrarea de laborator anterioara in caseta de dialog Relationships se creaza o relatie de tip One-To-Many intre cele doua tabele selectand cu mouse-ul campul IDComp care este cheie primara in tabelul Compozitor si 'tragandu-l' deasupra campului IDComp din tabelul Interpretare unde este cheie straina.

2. Inregistrarea bazei de date in ODBC


Se va inregistra noua baza de date in ODBC, cu numele sursei de date (Data Source Name - DSN) Fonoteca. Aplicatia Fonoteca va contine referinte la acest nume. Pentru a inregistra sursa de date folosind Administratorul ODBC se procedeaza in felul urmator:

In Control Panel, se selecteaza ODBC;

In caseta de dialog ODBC Data Source Administrator se selecteaza pagina System DSN. Apoi, in aceasta pagina se selecteaza comanda Add, pentru adaugarea unei noi surse de date.

In caseta de dialog Add Data Sources, se alege driverul ODBC corespunzator (Microsoft Access, SQL Server sau Oracle).

In campul Data Source Name din caseta de dialog ODBC Setup se scrie numele: Fonoteca.

In grupul Database, alegerea optiunii Select permite localizarea pe disc a fisierului Fonoteca.mdb creat cu Microsoft Access.


3.     Dezvoltarea aplicatiei de baze de date


Aplicatia de baze de date se va crea in trei pasi de dezvoltare:

Crearea unei aplicatii minimale cu suport pentru baze de date.

Adaugarea unei interogari parametrizate.

Extinderea intefetei pentru adaugarea, actualizarea si stergerea inregistrarilor.


3.1. Crearea unei aplicatii minimale cu suport pentru baze de date


Clasele MFC care se folosesc in aplicatiile de baze de date prin interfata ODBC sunt: CDatabase, CRecordset, CRecordView. Clasa CDatabase specifica conexiunea la o baza de date prin intermediul numelui DSN al acesteia, inregistrat in ODBC.

Un obiect de tip CRecordset reprezinta un set de inregistrari selectate dintr-o sursa de date. Obiectul de tipul CRecordset contine o selectie a inregistrarilor dintr-unul sau mai multe tabele ale bazei de date, proiectate pe una sau mai multe coloane.

Obiectul vedere asociat acestor inregistrari (de tip CRecordView) corespunde unei vederi care este un formular si permite inglobarea controalelor de editare sau de afisare. Un astfel de obiect are atasata o resursa de tip dialog, care permite afisarea sau/si editarea campurilor unui set de inregistrari. Un obiect de tip CRecordView este asociat atat cu un obiect de tip CRecordset cat si cu resursa de dialog asociata. Clasa CRecordset ofera suport pentru navigarea prin seturile de inregistrari, folosind comenzile Move First , Move Next, Move Previous si Move Last, utilizand un cursor, care este actualizat corespuunzator de aceste comenzi. Cand este modificata valoarea cursorului si se trece la alta inregistrare, valoarea din campul corespunzator este actualizata automat.

La crearea unei aplicatii se va specifica o sursa de date ODBC si un tabel din baza de date corespunzatoare. AppWizard va crea o pereche de clase: o clasa pentru setul de inregistrari si o clasa vedere pentru vizualizarea acestora, in urmatorii pasi

Se creaza un proiect SDI numit Fonoteca.

In caseta de dialog AppWizard-Step2 se selecteaza optiunea Database View Without File Suport; se apeleaza Data Source; in caseta de dialog Database Options se selecteaza ODBC, iar din lista se selecteaza Fonoteca; in caseta de dialog Select Database Tables se selecteaza tabelul Interpretare.

In caseta de dialog AppWizard-Step6, se efectueaza urmatoarele modificari: se selecteaza clasa CFonotecaSet si i se schimba numele in CInterpSet; se schimba si numele fisierului antet in InterpSet.h si al fisierului de implementare in InterpSet.cpp; clasa de baza este CRecordset si nu poate fi shimbata. Se selecteaza clasa CFonotecaView si i se schimba numele in CInterpForm; deasemenea se modifica si numele fisierelor header si sursa corespunzatoare; clasa de baza este CRecordView.


Dupa ce AppWizard a creat proiectul Fonoteca, se poate folosi ClassView pentru a vedea o reprezentare grafica a claselor si a componentelor acestora, create de AppWizard in mod implicit. De asemenea, cu ClassWizard se pot vedea legaturile create de AppWizard intre variabilele membru si campurile tabelului Interpretare.

Clasa pentru setul de inregistrari CInterpSet. AppWizard a legat toate coloanele tabelului Interpretare de variabilele membru ale clasei CInterpSet. Acestea se numesc 'variabile membru corespunzatoare campurilor' (field data members). AppWizard le denumeste in mod automat, pe baza numelor coloanelor din tabelul Interpretare. De asemenea, AppWizard atribuie tipul corect de date C++ sau MFC pentru aceste variabile membru, in functie de tipul coloanei.


Clasa vedere CInterpForm Functia membru a clasei de baza CRecordView:: OnInitialUpdate()deschide baza de date daca aceasta nu era deja deschisa, apoi deschide setul de inregistrari si initializeaza formularul, apeland functia CFormView::OnInitialUpdate().

Clasa document CFonotecaDoc: In alte tipuri de aplicatii, documentul pastreaza datele si le stocheaza intr-un fisier pe disc prin serializare. Intr-o aplicatie pentru baze de date, datele sunt stocate in baza de date, iar utilizatorul le vede ca inregistrari. O astfel de aplicatie nu are nevoie de un fisier de stocare. Prin urmare, un document al unei aplicatii pentru baze de date nu este folosit ca suport pentru serializare. Rolul clasei document in aplicatia Fonoteca este acela de a pastra setul de inregistrari.


class CFonotecaDoc : public Cdocument

Obiectul de tip set de inregistrari m_interpSet, este inglobat in obiectul document. De aceea, obiectul set de inregistrari este construit si eliminat automat odata cu obiectul document. Clasa document poate pastra un numar oricat de mare de obiecte de tip set de inregistrari. Alegerea optiunii 'Database without file support' (baza de date fara suport pentru fisiere) face ca in meniul File sa nu mai existe comenzile New, Open, Save sau Save as.

Pe langa aceste clase, AppWizard a creat si o resursa de tip dialog, numita IDD_FONOTECA_FORM, pe care clasa CInterpForm, derivata din CRecordView, o foloseste pentru a afisa controalele de editare sau de afisare a datelor. Deoarece CRecordView este derivata din CFormView, zona client a unei vederi din clasa CRecordView este ocupata de o resursa de dialog.

Configurati aceasta resursa de dialog adaugand sase controale statice pentru Compozitor, Piesa, Orchestra, Dirijor, Anul, Suportul si controalele de editare corespunzatoare. Se protejeaza la scriere controlul de editare Compozitor, selectandu-se caseta de validare Read Only din pagina Styles a ferestrei de proprietati. O regula des folosita la proiectarea interfetelor cu utilizatorul a aplicatiilor pentru baze de date este aceea de a nu i se permite utilizatorului sa modifice campurile care fac parte din cheia primara sau dintr-o cheie straina. Astfel, daca, de exemplu utilizatorul vrea sa schimbe compozitorul dintr-o inregistrare a tabelului Interpretare, el trebuie sa se asigure ca nu a incalcat vreo regula de integritate. Stabiliti ordinea de tabulare astfel incat un control de editare sa urmeze dupa controlul static corespunzator.

In mod normal, se foloseste ClassWizard pentru a lega controalele dintr-o caseta de dialog (sau dintr-un formular) de variabilele membru ale clasei derivate din CDialog (sau CFormView). Totusi, in cazul clasei CRecordView, nu se leaga controalele formularului de datele membru ale acestei clase, ci de datele membru ale clasei pentru setul de inregistrari. Clasa derivata din CRecordView, in acest caz CInterpForm, are o variabila membru numita m_pSet care este un pointer la CInterpSet, clasa pentru setul de inregistrari a aplicatiei Fonoteca. Legaturile ce pornesc de la controalele formularului ajung, prin intermediul variabilei m_pSet, la variabilele membru corespunzatoare ale clasei CInterpSet. In fereastra editorului de resurse dialog, tinand tasta Ctrl apasata, executarea unui dublu-clic pe controlul de editare Piesa, de exemplu, conduce la aparitia casetei de dialog Add Member Variable din ClassWizard, propunandu-va un nume in campul Member Variable Name, nume ales de ClassWizard pe baza textului controlului static anterior. De exemplu: m_pSet->m_Piesa. Se repeta pentru fiecare din celelalte controale de editare ale formularului.

Compilati si rulati aplicatia. Cand se deschide setul de inregistrari de tip CInterpSet, el va selecta inregistrarile din tabelul Interpretare al bazei de date Fonoteca. Prima inregistrare devine cea curenta. Formularul aplicatiei afiseaza in controalele adaugate valorile din inregistrarea curenta. Examinati meniul Record, care contine comenzile First Record, Previous Record, Next Record si Last Record. Acestor comenzi le corespund butoane din bara cu instrumente. Testati aceste comenzi pentru a vedea inregistrarile din obiectul CRecordset.


3.2. Adaugarea unei interogari parametrizate


Desi cu AppWizard se creaza initial o aplicatie care are numai o clasa CRecordset si o clasa vedere CRecordView, ulterior se poate folosi ClassWizard pentru a adauga mai multe astfel de clase. Diferite clase vedere pot 'vedea' acelasi set de inregistrari si invers, mai multe seturi de inregistrari pot fi 'vazute' de aceeasi clasa vedere, dintre care unul singur este setul primar de inregistrari.

Pasul al doilea al aplicatiei ilustreaza folosirea a doua seturi de inregistrari intr-o singura vedere, pentru realizarea unei interogari parametrizate. Se va adauga un obiect set de inregistrari pentru tabelul Compozitor, care va fi folosit pentru completarea unei liste din care sa se poata selecta un anumit compozitor. Astfel, CInterpForm va avea o asociere primara cu obiectul CInterpSet (vederea va afisa o inregistrare din CInterpSet), in timp ce lista compozitorilor este asociata celui de-al doilea obiect set de inregistrari, CCompSet. In clasa CInterpSet vor fi selectate numai acele piese din fonoteca melomanului care apartin unui anumit compozitor, in loc sa fie selectate toate piesele ale tuturor compozitorilor. Controlul de editare Compozitor va fi inlocuit cu o caseta combo-box, care va fi completata cu toate numele compozitorilor ale caror lucrari exista in fonoteca melomanului, care vor fi preluate din tabelul Compozitor. Cand utilizatorul selecteaza un alt nume de compozitor in caseta, va fi reinterogat tabelul Interpretare pentru a selecta numai piesele din creatia compozitorului ales. Operatiile care se vor efectua pentru a realiza aceasta functionare sunt urmatoarele:

a) Crearea unei clase pentru setul de inregistrari din tabelul Compozitor. Aplicatia are deja o clasa pentru setul de inregistrari din tabelul Interpretare, care completeaza controalele de editare ale vederii CInterpForm cu informatii despre interpretarea unei piese. Se va adauga o noua clasa pentru setul de inregistrari din tabelul Compozitor, care va fi utilizata pentru a completa lista tuturor compozitorilor prezenti prin piesele lor in fonoteca melomanului. Cu ClassWizard se creaza o noua clasa CCompSet derivata din clasa de baza CRecordSet. Se deselecteaza caseta de validare Add to Component Gallery. In caseta de dialog Database Options, din lista ODBC se selecteaza Fonoteca. In caseta de dialog Select Database Tables se selecteaza tabelul Compozitor. Astfel s-a conectat numele tabelului Compozitor la clasa CCompSet.

b) Inglobarea obiectului set de inregistrari in obiectul document. In fisierul FonotecaDoc.h se adauga un obiect inglobat de tip CCompSet, public: CCompSet m_compSet; De asemenea, se adauga directiva #include 'CompSet.h' in fisierele FonotecaDoc.cpp, Fonoteca.cpp si in InterpForm.cpp inainte de directiva #include FonotecaDoc.h.”

c) Adaugarea unui control de editare pentru campul 'A trait intre' din tabelul Compozitor. Prin adaugarea unui obiect set de inregistrari pentru tabelul Compozitor, programul va avea acces la datele din acest tabel continand numele compozitorilor si anii intre care au trait acestia. Utilizatorul va putea vedea numele complete ale compozitorilor si nu numai identificatorii lor, precum si anii intre care au trait. Pentru a vedea anii intre care au trait compozitorii se adauga un control static Anii si un control de editare corespunzator, de tip Read Only. Se adauga o variabila membru m_Anii de tip CString in clasa vedere.

d) Inlocuirea controlului de editare Compozitor cu o caseta combo-box. In resursa dialog IDD_FONOTECA_FORM stergeti controlul de editare Compozitor si adaugati in locul lui un control de tip combo-box, pentru care alegeti in lista Type din pagina de proprietati Styles, DropList. Se reface ordinea de tabulare. Se sterge vechea legatura cu campul de editare si se leaga noua caseta de o variabila membru a vederii de tip CComboBox (se adauga variabila membru m_ctrlCompList de categorie Control).

e) Inscrierea in caseta combo-box a listei numelor de compozitori. Locul cel mai potrivit pentru inscrierea in caseta combo-box a listei numelor compozitorilor este functia virtuala redefinita OnInitialUpdate() din clasa CInterpForm. Vederea completeaza lista din caseta in cadrul procesului sau de initializare. Pentru aceasta, in functia OnInitialUpdate() se construieste si se deschide obiectul set de inregistrari CCompSet, se sterge continutul curent al casetei, se introduce fiecare nume de compozitor in lista, se fixeaza selectia curenta la primul nume din lista (in ordinea sortarii). Codul care se adauga prin procedura urmatoare completeaza caseta si, totodata, filtreaza, parametrizeaza si sorteaza setul de inregistrari CInterpSet. Apoi se initializeaza variabila m_Anii cu anii intre care a trait primul compozitor al carui nume va fi introdus in caseta combinata si care va deveni, in mod implicit, numele curent selectat. Se completeaza codul ca mai jos:


void CInterpForm::OnInitialUpdate()

}

m_ctrlCompList.SetCurSel(0);

GetParentFrame()->RecalcLayout();

ResizeParentToFit();


f) Introducerea filtrului parametrizat. In primul pas al aplicatiei, in obiectul de tip CInterpSet erau selectate toate inregistrarile din tabelul Interpretare. Acum vor fi selectate numai informatiile referitoarre la piesele unui anumit compozitor. Filtrul unui set de inregistrari determina submultimea de inregistrari selectate dintr-un tabel sau dintr-o interogare. Pentru aceasta aplicatie, filtrele folosesc parametrii, reprezentati prin semnul '?', in loc de valori literale atribuite la compilare. Aplicatia reselecteaza, sau 'reinterogheaza' inregistrarile din tabelul Interpretare, ori de cate ori utilizatorul selecteaza un alt nume de compozitor din caseta combinata. O modalitate de reinterogare a setului de inregistrari este 'parametrizarea' filtrului, adica apelarea functiei Requery() cu o noua valoare a filtrului si o anumita valoare a parametrului.

Pentru aceasta se adauga in clasa CInterpSet o variabila membru pentru parametru (CString m_strIDCompParam;) si se initializeaza aceasta variabila si numarul de parametri in constructorul clasei CInterpSet m_nParams=1; m_strIDCompParam='';

De asemenea, se competeaza functia DoFieldExchange()cu urmatoarele linii de cod pentru a identifica parametrul m_strIDCompParam:


pFX->SetFieldType(CFieldExchange::param);

RFX_Text(pFX,'IDCompParam',m_strIDCompParam);


Functia DoFieldExchange()recunoaste doua tipuri de campuri: coloane si parametri. Apeland functia SetFieldType()membru al clasei CFieldExchange, ea afla ce tip de camp (campuri) urmeaza in apelul (apelurile) functiei RFX. Semnul '?' din specificatia filtrului parametrizat indica locul unde va fi substituita valoarea parametrului la rulare. Pentru a furniza valoarea parametrului la rulare se atribuie aceasta valoare variabilei membru parametru a setului de inregistrari in linia: m_pSet->m_strIDCompParam=pDoc->m_compSet.m_IDComp; In felul acesta, valoarea parametrului va fi prima valoare a campului IDComp regasita in setul de inregistrari CCompSet.

Atat AppWizard, cat si ClassWizard implementeaza clasele derivate din CRecordSet astfel incat obiectul set de inregistrari sa aiba ca variabila membru un pointer la obiectul baza de date, de tip CDatabase, prin intermediul caruia sa fie conectat la sursa de date. Implementarea implicita a functiei CRecordView:: OnInitialUpdate()apeleaza indirect functia


CString CInterpSet::GetDefaultConnect()

Cadrul-aplicatie transmite acest 'sir de caractere de conectare' functiei CDatabase::Open() pentru obiectul de tip CDatabase creat de cadrul-aplicatie la implementarea functiei CRecordSet::Open(). Daca aplicatia are doua sau mai multe seturi de inregistrari, fiecare dintre acestea va crea in mod implicit si va deschide propriul obiect de tip CDatabase. Daca mai multe seturi de inregistrari au acces la aceeasi sursa de date, atunci este mai eficient ca ele sa foloseasca in comun obiectul de tip CDatabase. O modalitate de a permite mai multor seturi de inregistrari sa foloseasca in comun acelasi obiect CDatabase este atribuirea ca parametru functiei Open() pentru celelalte seturi de inregistrari valoarea variabilei membru m_pDatabase a primului obiect set de inregistrari:


m_pSet->m_pDatabase=pDoc->m_compSet.m_pDatabase;

CRecordView::OnInitialUpdate();


Daca functia CRecordset::Open() afla ca variabila membru m_pDatabase este deja alocata, refoloseste obiectul de tip CDatabase care este deschis.

Inregistrarile din tabelul Compozitor au fost sortate dupa coloana IDComp:


pDoc->m_compSet.m_strSort='IDComp';


Pentru un anumit compozitor, inregistrarile din CInterpSet sunt sortate dupa identificator: m_pSet->m_strSort='ID';


g) Reinterogarea bazei de date. De fiecare data cand utilizatorul selecteaza un alt nume de compozitor din caseta combinata, aplicatia trebuie sa reinterogheze obiectul set de inregistrari CInterpSet pentru a-i improspata inregistrarile. Selectand un nume de compozitor, utilizatorul va vedea numai inregistrarile reprezentand piesele compozitorului respectiv. CInterpSet contine inregistrarile pentru compozitorul selectat anterior. Reinterogarea ii actualizeaza inregistrarile, in conformitate cu noul nume de compozitor ales, folosind valorile curente ale sirurilor de caractere pentru filtrare si sortare. Cand utilizatorul selecteaza un nume de compozitor din caseta combinata, vederea de tip CInterpForm primeste mesajul de notificare CBN_SELENDOK. Apoi, vederea foloseste functia de tratare a acestui mesaj pentru a reselecta inregistrarile corespunzatoare numelui de compozitor selectat, transmitand ca parametru identificatorul compozitorului respectiv. Implementarea fuctiei de tratare a mesajului CBN_SELENDOK:


void CInterpForm::OnSelendokComplist()

m_pSet->m_strIDCompParam=pDoc->m_compSet.m_IDComp;

m_Anii=pDoc->m_compSet.m_A_trait_intre;

m_pSet->Requery();

if(m_pSet->IsEOF())

UpdateData(FALSE);



Codul adaugat reselecteaza inregistrari din baza de date in obiectul set de inregistrari, in functie de valoarea parametrului m_strIDCompParam. Aceasta valoare reprezinta identificatorul compozitorului al carui nume a fost selectat in caseta combinata. Functia GetLBText(), membru al clasei CComboBox, incarca in cel de-al doilea parametru textul curent selectat in control. Astfel, variabila str va primi ca valoare numele compozitorului curent selectat. Apoi se cauta in setul de inregistrari CCompSet identificatorul compozitorului cu numele respectiv, pentru a-i atribui valoarea parametrului m_strIDCompParam. Daca dupa reinterogarea obiectului CInterpSet reiese ca pentru compozitorul curent selectat nu exista nici o piesa in fonoteca, setul de inregistrari este initializat cu valoarea Null, cu exceptia campului IDComp, care va fi initializat cu identificatorul compozitorului respectiv.

Dupa compilarea si rularea aplicatiei, folositi interfata cu utilizatorul pentru a naviga printre piesele compozitorului al carui nume l-ati selectat in caseta combinata. Alegeti alte nume de compozitori si examinati informatiile stocate in baza de date despre piesele lor.


3.3. Extinderea interfetei pentru adaugarea, actualizarea si stergerea inregistrarilor


In acest ultim pas al aplicatiei, se va extinde interfata cu utilizatorul prin adaugarea a trei noi comenzi in meniul Record:

Comanda Adauga pregateste o inregistrare vida in care utilizatorul va introduce datele. Acestea sunt salvate cand utilizatorul trece la alta inregistrare, folosind o comanda de meniu sau un buton din bara cu instrumente pentru navigarea printre inregistrari. In acest fel, se puteau salva si pana acum modificarile aduse unei inregistrari. In plus, utilizatorul poate sa salveze noua inregistrare, alegand din nou comanda Adauga.

Comanda Renunta abandoneaza o operatiune de adaugare sau de editare a unei inregistrari aflate in curs de desfasurare. Totodata, readuce inregistrarea modificata la starea ei initiala sau revine la inregistrarea afisata inainte de alegerea comenzii Adauga.

Comanda Sterge sterge o inregistrare.


Adaugati cele trei articole in meniul Record. Fiecare dintre articolele nou adaugate are nevoie de o functie de tratare in clasa CInterpForm. Deoarece resursa meniu a aplicatiei Fonoteca este asociata cu clasa CMaimFrame, trebuie stabilita o asociere intre identificatorii articolelor de meniu si clasa CInterpForm.

In operatiunile de adaugare, editare si stergere a inregistrarilor, clasa CRecordView actualizeaza in mod automat inregistrarea curenta atunci cand utilizatorul trece la alta inregistrare. Clasa CRecordView modifica in trei pasi o inregistrare in obiectul set de inregistrari asociat, atunci cand utilizatorul trece la alta inregistrare:

Pregateste inregistrarea curenta pentru a fi actualizata, apeland functia membru Edit() a clasei pentru setul de inregistrari;

Apeleaza functia membru UpdateData() pentru clasa vedere a aplicatiei, derivata din CFormView, functie care modifica valorile variabilelor membru ale obiectului set de inregistrari, de obicei prin obtinerea noilor valori de la controalele formularului;

Apeleaza functia membru Update() a clasei pentru seturi de inregistrari pentru a actualiza efectiv sursa de date cu valorile modificate.


Implementarea comenzii Adauga


In implementarea descrisa, utilizatorul va putea adauga numai piese ale compozitorilor existenti in tabelul Compozitor. Selectand comanda Adauga, se intra in modul 'Adaugare', atribuindu-se variabilei m_bSeAdauga valoarea TRUE; cand utilizatorul trece la alta inregistrare se iese din modul 'Adaugare'.

Pentru implementarea functiei de tratare a comenzii Adauga, in fisierul InterpForm.h se declara o variabila protected:BOOL m_bSeAdauga; care se initializeaza in constructorul clasei CInterpForm cu valoarea FALSE. Se construieste functia de tratare astfel:


void CInterpForm::OnRecordAdauga()

Datele stocate in baza de date se actualizeaza, prin adaugarea noii inregistrari, atunci cand utilizatorul trece la o alta inregistrare. Tot atunci se iese si din modul Adaugare. Aceasta functionalitate se realizeaza prin redefinirea functiei membru OnMove() a clasei CRecordView:


BOOL CInterpForm::OnMove(UINT nIDMoveCommand)

m_pSet->m_IDComp=pDoc->m_compSet.m_IDComp;

TRY CATCH(CDBException,e)

END_CATCH;

m_bSeAdauga=FALSE;

OnSelendokComplist();

return TRUE;


else return CRecordView::OnMove(nIDMoveCommand);


Daca aplicatia este in modul Adaugare, se incearca adaugarea noii inregistrari la baza de date, inainte de a se trece la alta inregistrare. Daca datele introduse incalca vreo regula de validare sau de integritate impusa tabelului respectiv in baza de date, atunci se afiseaza mesajul de eroare corespunzator. Variabila membru m_IDComp ia valoarea corespunzatoare compozitorului selectat (in timpul adaugarii, caseta cu numele de compozitori este folosita pentru introducere). In final, se iese din modul Adaugare si se apeleaza OnSelendokComplist() care va reinteroga baza de date. Atunci cand aplicatia este in modul Adaugare si utilizatorul alege o comanda de navigare (de exemplu, MoveNext), ca urmare a reinterogarii sursei de date in metoda OnSelendokComplist(), se ajunge intotdeauna la prima inregistrare.

La pasul doi al aplicatiei, atunci cand utilizatorul alegea numele unui compozitor, functia de tratare OnSelendokComplist()reinteroga obiectul set de inregistrari CInterpSet pentru a gasi toate piesele aflate in fonoteca, apartinand compozitorului respectiv. Pentru functia de adaugare de inregistrari, operatiile legate de reinterogare sunt executate numai daca aplicatia nu este in modul Adaugare, asa cum se vede in functia de tratare OnSelendokComplist().


Implementarea comenzii Sterge


Ca raspuns la comanda Sterge, vederea sterge inregistrarea curenta, apeland functia membru Delete() a obiectului set de inregistrari asociat:


void CInterpForm::OnRecordSterge()


TRY

CATCH(CDBException,e)

END_CATCH;

m_pSet->MoveNext();

if(m_pSet->IsEOF())

m_pSet->MoveFirst();

if(m_pSet->IsBOF())

m_pSet->SetFieldNull(NULL);

UpdateData(FALSE);


Daca programul este in modul Adaugare, apeleaza OnRecordRenunta(). Altfel, apeleaza functia membru Delete() si, daca aceasta functie lanseaza o exceptie (de exemplu, nu se poate sterge o inregistrare datorita regulilor de integritate la nivelul tabelului respectiv), erorile sunt raportate utilizatorului. Variabila membru m_strError a clasei CDBException este pregatita de driverul ODBC pentru eroarea respectiva. Apoi, se trece la inregistrarea urmatoare. Daca inregistrarea stearsa era ultima din setul de inregistrari, in ordinea sortarii, atunci ne intoarcem la inregistrarea care a devenit ultima in urma operatiunii de stergere. Daca inregistrarea stearsa a fost ultima si acum nu mai exista inregistrari, campurile setului de inregistrari vor primi valoarea Null.


Implementarea comenzii Renunta


Comanda Renunta anuleaza modul Adaugare, in cazul in care utilizatorul a ales anterior comanda Adauga, sau nu ia in considerare modificarile aduse inregistrarii curente, daca utilizatorul a incercat sa editeze valorile din campul formularului.


void CInterpForm::OnRecordRenunta()

UpdateData(FALSE);


Daca utilizatorul se razgandeste si nu mai vrea sa adauge noua inregistrare, aplicatia iese din modul Adaugare apeland functia Move(), membru al clasei CRecordSet. Cand se apeleaza functia AddNew() pentru a incepe operatiunea de adaugare, cadrul-aplicatie pastreaza o copie a valorilor curente ale variabilelor setului de inregistrari, inainte de a permite utilizatorului sa introduca noi valori in controalele formularului. Apelul functiei Move(), ca mai sus, anuleaza operatiunea de adaugare, refacand inregistrarea care era curenta inainte de a alege comanda Adauga. Dupa iesirea din modul Adaugare se va apela OnSelendokComplist()pentru a reinteroga baza de date, in cazul in care in timpul adaugarii a fost selectat un alt compozitor.

Compilati si rulati versiunea finala a aplicatiei. Testati noile comenzi Adauga, Renunta si Sterge, din meniul Record. Incercati sa fortati o exceptie: in campul Suportul, introduceti o valoare care nu este un numar intre 1 si 3.


Exercitii:

1.     Parcurgeti pasii necesari crearii aplicatiei prezentate.

2.     Pentru bazele de date create in lucrarile precedente, dezvoltati aplicatii de interogare si actualizare a datelor, folosind interfata ODBC si biblioteca MFC.




Contact |- ia legatura cu noi -| contact
Adauga document |- pune-ti documente online -| adauga-document
Termeni & conditii de utilizare |- politica de cookies si de confidentialitate -| termeni
Copyright © |- 2024 - Toate drepturile rezervate -| copyright