Episodul 6 - Adaugarea functionalitatilor necesare



Episodul 6 - Adaugarea functionalitatilor necesare

Continuam dezvoltarea aplicatiei noastre cu extinderea formului principal prin adaugarea functionalitatilor necesare.

Practica m-a invatat ca e bine sa atribui nume sugestive diferitelor componente ale oricarui proiect care accepta nominalizarea obiectelor si ca atribuirea acestor nume sa se faca in baza unui sablon. Asa ca, in timp, mi-am dezvoltat obieciul de a atribui nume pentru fiecare obiect definit in Access (si nu numai, dar luam acum in discutie acest aspect numai) in functie de tipul obiectului. Astfel, pentru un ListBox prefixul este lst, pentru un combo-box prefixul este cbo si asa mai departe. Va puteti stabili singuri acest tip de regula, dar ideea este sa respectati aceasta regula intotdeauna, indiferent de amploarea proiectului. In timp, uitati amanuntele si la o eventuala depanare a aplicatiei sau un eventual upgrade sau modificare, va va fi greu daca nu aproape imposibil sa va amintiti logica in diferitele locuri ale aplicatiei.

In aceasta idee, vom avea urmatoarele obiecte in formul principal:

• lstCDList – lista de cd-uri

• btnAdd – butonul de adaugare

• btnEdt – butonul de editare

• btnDel – butonul de stergere

• btnRpt – butonul pentru acces la rapoarte

• btn_Iesire – butonul de inchidere a aplicatiei (il vom lasa cu nume diferit ca sablon de restul, pentru simplul motiv ca deja e configurat cu un event si nu-l mai modificam)

Numele obiectelor se schimba in panoul Properties, tabul Other. Cateva cuvinte despre acest panou, Properties.

Fiecare obiect definit in aplicatia noastra, are asociate niste proprietati. Aceste proprietati depind de tipul obiectul si sunt impartite pe categorii (si afisate fiecare in tab-ul propriu).

Aceste tab-uri sunt:

• Format – proprietati care afecteaza formatarea obiectului la afisare

• Data – proprietati legate de datele manipulate prin intermediul acelui obiect (control)

• Event – proprietati legate de diferitele evenimente aparute in aplicatie si cum reactioneaza "controlul” respectiv la acel eveniment

• Other – alte proprietati, specifice tipului de obiect in cauza

• All – toate proprietatile de mai sus, indiferent de categorie, grupate alfabetic

Am mentionat termenul de evenimente (sau events) care apar in aplicatie. Foarte sumar, aceste evenimente (sau events) sunt generate in parte de Windows, in parte de Access. Evenimentele sunt "semnale” emise de Windows si de Access prin care "semnalizeaza” faptul ca, de exemplu, s-a apasat un buton al mouse-ului, s-a apasat o tasta, s-a schimbat valoarea unui control (un checkbox, de exemplu) si altele. Aplicatia, prin intermediul actiunilor pe care le specificam la tabul Event, reactioneaza conform specificului event-ului in cauza. De exemplu, putem specifica faptul ca la fiecare click de mouse in lista de discuri (lstCDList) sa fie actualizate, in partea dreapta, detaliile relativ la inregistrarea selectata prin acel click. Evident, fiecare event interceptat de Access se refera la eventuri care "tin” de Access. Este treaba Windows-ului sa gestioneze corect aceste aspecte si nu vom insista deloc in aceasta directie.

Vom modifica acum, proprietatile obiectelor din formul principal dupa cum se poate vedea in imaginile care urmeaza.

Lista de discuri – schimbat numele in lstCDList:

|[pic] |

| |

| |

Butoanele

|[pic] |

| |

| |

Butonul Adauga redenumit in btnAdd.

|[pic] |

| |

| |

Butonul Editeaza redenumit in btnEdit.

|[pic] |

| |

| |

Butonul Sterge redenumit in btnDel.

|[pic] |

| |

| |

Butonul Rapoarte redenumit in btnRpt.

|[pic] |

| |

| |

Butonul Iesire redenumit in btn_Iesire.

Asta a fost pentru schimbarea numele butoanelor. Urmeaza sa adaugam detaliile pe care le dorim afisate in partea din dreapta a formului. Pentru aceasta, vom adauga niste textbox-uri in care nu vom permite editarea datelor (editarea se va face in formuri dedicate). Pentru ca aceste textbox-uri sa contina datele corecte, ne vom folosi de Event-ul On Click al lstCDList. Textbox-urile se includ in form apasind pe butonul evidentiat in imaginea de mai jos:

|[pic] |

| |

| |

Voi include textbox-urile si va voi prezenta forma finala a formului, in imaginea urmatoare:

|[pic] |

| |

| |

In partea dreapta a formului, dupa cum am spus ceva mai inainte, am inclus unele controale pentru afisarea detaliilor "ascunse” ale inregistrarii curent selectate in lista din stanga. Pentru a impiedica editarea datelor in ecranul din dreapta, am setat proprietatea Locked a fiecarui control pe Yes. In tabelul care urmeaza, am inclus proprietatile generale ale controalelor de afisare incluse in partea dreapta a formului:

|Camp |Nume control |Continut |

|ID |txtID |ID-ul unic al inregistrarii |

|Disc propriu |txtDiscPropriu |Flag disc propriu / disc imprumutat |

|An aparitie |txtAn |Anul de aparitie al discului |

|Gen |txtGen |Genul productiei |

|Producator |txtProducator |Casa de discuri, producator |

|Data cumpararii |txtDataCump |Data achizitionarii discului (sau data la |

| | |care a fost luat imprumut) |

|Data Returnarii |txtDataRetur |Data returnarii discului |

|Nume persoana |txtNume |Numele persoanei care a furnizat discul |

| | |(daca este luat imprumut) sau careia i-a |

| | |fost imprumutat discul |

|Adresa |txtAdresa |Adresa de domiciliu a persoanei in cauza |

|Telefon |txtTelefon |Numarul de telefon al persoanei in cauza |

|Email |txtEmail |Adresa de email a persoanei in cauza |

In imaginea anterioara, la prima vedere, un utilizator mai neatent ar putea incerca sa modifice datele afisate. Pentru a elimina aceasta posibila confuzie, vom modifica aspectul campurilor dupa cum se va vedea in cele ce urmeaza.

|[pic] |

| |

| |

Am modificat proprietatea Special Effect a fiecarui control din caseta de detalii pe valoarea Chiseled, cu exceptia cimpului Adresa, pentru care am ales valoarea Etched. Efectele acestor modificari se vad in imaginea de mai sus.

Un control aparte, cel putin la prima vedere, este campul Disc Propriu. Am implementat acest camp folosind un combo-box (o lista derulanta), care contine valorile Da si Nu. Valoarea acceptata de baza de date, in schimb, este True sau False. Pentru aceasta, asa cum se poate vedea in imaginea de mai sus, am implementat aceste valori, folosindu-ma de facilitatea oferita de acest tip de control: setarea unei surse a datelor care sa fie afisata de control (proprietatile Row Source Type si Row Source). Astfel, am setat ca sursa a datelor pentru acest control o lista fixa de valori (Da si Nu), iar ca valori pe care sa le "transmita” spre baza de date o alta lista de valori (True si False), care este ascunsa la afisare, folosind optiunile de formatare a controlului, asa cum se vede in imaginea de mai jos (proprietatile Column Count si Column Widths):

|[pic] |

| |

| |

Acelasi mod de implementare il vom folosi putin mai tarziu, pentru acest camp, in formurile de editare date si de adaugare inregistrari noi in baza de date.

Modificarea "comportamentului” formului

De unde vom lua aceste date ? Din interogarea care este sursa datelor afisate in lista din stinga. Daca ne amintim din exercitiile anterioare, pentru lista din stanga, am inclus mai multe campuri, mai multe detalii decat afisam in acea lista. Acele campuri in plus le-am inclus exact pentru acest scop. Cum vom actualiza aceste campuri ? Am spus mai sus ca ne vom folosi de event-ul OnClick al listei din stanga. Acest event, se declanseaza de cate ori utilizatorul face click pe lista. Ce alte event-uri vom mai folosi ? Inainte de orice, trebuie spus ca ne vom folosi de event-uri de form si de event-uri de controale. In functie de context, exista o ordine in care se declanseaza aceste event-uri. De exemplu, la prima incarcare a unui form, se declanseaza toate eventurile de form si apoi cele specifice controalelor. Ulterior incarcarii paginii (formului), se vor declansa acele event-uri specifice actiunilor executate de utilizator. Unele event-uri sunt specifice unei clase anume (la nivel de form sau la nivel de control). De asemenea, anumite actiuni sunt limitate din punct de vedere al optiunilor permise, in functie de contextul de executie (apelate din cadrul unui event la nivelul unui form sau a unui control).

In continuare, vom enumera event-urile de care ne vom folosi in exercitiul nostru.

Event-uri la nivel de form:

OnLoad – event-ul se declanseaza la incarcarea paginii (form-ului) si a controalelor de pe aceasta (acesta este un event la nivel de form)

Event-uri la nivel de controale:

OnClick – event-ul se declanseaza de cate ori utilizatorul executa un click pe un control OnDblClick – event-ul se declanseaza de cate ori utilizatorul executa dublu-click pe un control

Modificarea acestor event-uri, modificarea "comportamentului” formului in cazul declansarii anumitor event-uri, se face folosind cod VBA (Visual Basic for Applications). Modificarea codului VBA din spatele fiecarui event se face conform imaginii de mai jos:

|[pic] |

| |

| |

In lista superioara se selecteaza elementul lstCDList. In tab-ul Event, se selecteaza event-ul dorit si din lista se alege optiunea [Event Procedure], dupa care se executa un click pe butonul … (evidentiat in imaginea de mai sus). Dupa aceasta, se va afisa editorul VBA.

Pentru eventul Form_OnLoad, se va introduce codul evidentiat cu bold:

Private Sub Form_Load()

If Me.lstCDList.ListIndex + 1 = 0 Then

' Setam butoanele Edit si Sterge pe inactiv, daca nu este selectata nici o inregistrare in lista

Me.btnEdt.Enabled = False

Me.btnDel.Enabled = False

End If

End Sub

Pentru event-urile OnClick si OnDblClick, se va introduce codul de mai jos:

Private Sub lstCDList_Click()

' Cind utilizatorul da click pe lista, dorim:

' 1. sa se actualizeze datele din caseta de detalii

' 2. sa se activeze butoanele de editare si stergere inregistrari

If Me.lstCDList.ListIndex + 1 > 0 Then

' Setam butoanele Edit si Sterge pe activ

Me.btnEdt.Enabled = True

Me.btnDel.Enabled = True

' Setam valorile afisate in caseta Detalii

Me.txtID = Me.lstCDList ' Se preia prima coloana (Bound Column)

Me.txtAn = Me.lstCDList.Column(3) ' indexul coloanelor incepe de la 0

Me.txtGen = Me.lstCDList.Column(5)

Me.txtDiscPropriu = lstCDList.Column(6)

Me.txtDataCump.Value = Me.lstCDList.Column(7)

Me.txtDataRetur = Me.lstCDList.Column(8)

Me.txtNume = Me.lstCDList.Column(9)

Me.txtAdresa = Me.lstCDList.Column(10)

Me.txtTelefon = Me.lstCDList.Column(11)

Me.txtEmail = Me.lstCDList.Column(12)

Me.txtProducator = Me.lstCDList.Column(13)

End If

End Sub

Private Sub lstCDList_DblClick(Cancel As Integer)

' Cind utilizatorul de dublu click pe lista, dorim sa se intre

' in modul editare pe inregistrarea curent selectata in lista

' Codul aferent acestei operatii se gaseste asociat cu butonul de editare

btnEdt_Click ' Se apeleaza codul asociat butonului Editare

End Sub

Efectul codului VBA de mai sus este evidentiat in imaginile urmatoare:

|[pic] |

| |

| |

Nici o inregistrare selectata in lista din stanga.

|[pic] |

| |

| |

Click pe una din inregistrari si in caseta de detalii sunt afisate detaliile acelei inregistrari.

In continuare, vom genera formurile necesare editarii detaliilor unei inregistrari si adaugarii uneia noi. Totodata, vom include si functionalitatea de stergere a unei inregistrari.

Functia de adaugare a unei inregistrari noi si cea de editare a detaliilor unei inregistrari existente pot folosi acelasi form. Singura diferenta va fi initializarea valorilor campurilor afisate in acest form, specific contextului (de editare sau de adaugare a unei noi inregistrari). Astfel, in cazul editarii unei inregistrari, vom dori ca in campurile formului sa fie afisate valorile curente pentru fiecare camp in parte, pe cand in cazul adaugarii unei inregistrari, ne este suficient ca aceste campuri sa fie blank (necompletate cu nimic) sau cu anumite valori care pot fi determinate (de exemplu, data cumpararii poate fi presupusa, si propusa, cea curenta).

Vom putea folosi acelasi form in scopuri diferite, prin 2 metode: ori folosind un wizard, ori prin intermediul codului VBA. Pentru diversificare, va voi prezenta si modul rapid de dezvoltare a unui form, folosind un wizard. Inainte de a incepe, sa ne amintim putin cateva detalii despre formul principal. Datele care ne intereseaza sunt afisate sumar in lista lstCDList, afisata in partea stinga a formului principal. Proprietatea Bound Column a acestei lista am setat-o pe valoarea 1, adica prima coloana din aceasta lista contine codul unic de identificare a inregistrarilor afisate in lista. Ne vom folosi de acest control si de aceasta proprietate putin mai tirziu.

Si acum la lucru…

Ne pozitionam in containerul Forms si dam dublu click pe Create new form by using wizard.

|[pic] |

| |

| |

|[pic] |

| |

| |

Selectam in lista Tables/Queries, tabela tbl_Colectie, apoi click pe butonul cu sageti duble, pentru includerea tuturor cimpurilor din aceasta tabela in form.

|[pic] |

| |

| |

Click pe Next.

|[pic] |

| |

| |

Selectata optiunea Columnar. Puteti experimenta si cu celelalte valori, pentru a vedea rezultatul. Pentru exercitiul nostru, vom alege optiunea Columnar. Click pe Next.

|[pic] |

| |

| |

Vom alege ca efect de afisare a cimpurilor modul Standard. Puteti experimenta si celelate optiuni, pentru a vedea rezultatele. In acest pas, puteti alege ce efect va place, neinfluentind major rezultatul exercitiului. Eu am sa aleg Standard. Click pe Next.

|[pic] |

| |

| |

Specificati un nume pentru form (se va modifica oricum in faza de design) si specificati ca doriti sa intrati in modul Design dupa inchiderea wizardului si click pe Finish.

|[pic] |

| |

| |

Si acesta este formul obtinut cu ajutorul Wizard-ului. Urmeaza sa-l adaptam nevoilor noastre. Acest lucru il vom face prin 2 metode, complementare. Adaptand diferitele proprietati ale formului si incluzand cod VBA care sa modifice formul in functie de contextul in care este apelat (editare sau adaugare date). Vom incepe prin a adauga un buton de salvare a datelor si unul de abandon.

|[pic] |

| |

| |

Alt tip de adaptare consta in modificarea tipului unor campuri, din text box in combo box. Mai exact, ne referim la campurile Producator (CasaID), Tip (StandardID), Gen (GenID) si Nume (AgendaID). Aceasta modificare se impune a fi efectuata pentru ca in aceste campuri vom stoca doar codurile corespunzatoare valorilor pe care le dorim. Schimbarea o vom face cu click dreapta pe controlul respectiv, selectat Change To… si apoi Combo Box.

|[pic] |

| |

| |

Si rezultatul acestor modificari, la toate campurile mentionate mai sus:

|[pic] |

| |

| |

Acest tip de control ne permite sa afisam o valoare in form si sa stocam aceeasi valoare sau alta, dupa caz, in baza de date. In cazul nostru, in loc sa afisam un cod, care nu este sugestiv, vom afisa in aceste combobox-uri un text descriptiv asociat fiecarui cod iar in baza de date vom stoca codul corespunzator textului descriptiv selectat in combobox. Urmeaza sa specificam valorile pe care le dorim afisate in aceste combobox-uri. Voi include printscreen-uri pentru fiecare combobox in parte.

Campul CasaID

|[pic] |

| |

| |

Click pe … pentru a specifica sursa datelor.

|[pic] |

| |

| |

Click pe tbl_CaseDeDiscuri, click pe Add si click pe Close.

|[pic] |

| |

| |

Incluse campurile conform imaginii de mai sus. In coloana Sort Order specificata valoarea 1 si apoi se inchide fereastra.

|[pic] |

| |

| |

Click pe Yes.

|[pic] |

| |

| |

Rezultatul.

Campul StandardID

|[pic] |

| |

| |

Click pe … pentru specificarea sursei datelor.

|[pic] |

| |

| |

Selectata tabela tbl_Standarde, click pe Add si click pe Close.

|[pic] |

| |

| |

Efectuate selectiile ca in imaginea de mai sus si inchisa fereastra.

|[pic] |

| |

| |

Click pe Yes

Campul GenID

|[pic] |

| |

| |

Click pe … pentru specificarea sursei datelor

|[pic] |

| |

| |

Click pe tabela tbl_GenuriMuzicale, click pe Add, click pe Close.

|[pic] |

| |

| |

Efectuate selectiile ca in imaginea de mai sus.

|[pic] |

| |

| |

Click pe Yes.

Campul AgendaID

|[pic] |

| |

| |

Click pe … pentru specificarea sursei datelor.

|[pic] |

| |

| |

Selectata tabela tbl_Agenda, click pe Add si apoi click pe Close.

|[pic] |

| |

| |

Efectuate selectiile ca in imaginea de mai sus. Pentru a obtine randul 2, se scrie de mana textul Nume & " – " & Adresa iar in coloana urmatoare (Alias) se trece textul Nume. Ca si rezultat, in acest combobox, vor fi afisate numele si adresa fiecarei persoane din tabela.

Am ales acest mod de afisare, pentru a permite selectarea persoanei dorite, in situatia in care exista mai multe persoane cu acelasi nume in baza de date. Daca doriti, pentru simplitate (sau daca nu va iese J ), puteti lasa numai Nume in prima coloana, caz in care nu mai e nevoie sa treceti nimic in coloana Alias. Inchisa fereastra.

La toate campurile de pana acum, se vor modifica proprietatile Column Count pe valoarea 2 si Column Widths pe valoarea 0”;1”, similar imaginii de mai jos:

|[pic] |

| |

| |

|[pic] |

| |

| |

Click pe Yes, pentru salvare.

Urmeaza sa includem codul VBA prin intermediul caruia vom:

1. Determina contextul in care ruleaza formul (editare sau adaugare) 2. Permite salvarea sau abandonul modificarii datelor 3. Afisa noile valori in formul principal daca datele (modificate sau adaugate) au fost salvate.

Vom incepe prin a modifica formul principal, din care vom apela formul tocmai creat. Inainte de asta, sa salvam formul creat si sa-i dam un nume. Inchidem Form Designer-ul, click pe Yes.

|[pic] |

| |

| |

Selectat formul nou creat (in Wizard i-am dat numele Colectie), click dreapta, Rename si tastat noul nume al formului: frm_DetaliiDisc.

|[pic] |

| |

| |

Am redenumit formul pentru a respecta conventia de nume pentru obiectele din aplicatie.

|[pic] |

| |

| |

Deschis formul frm_StartUp, click dreapta pe butonul Adauga, click pe Build Event.

|[pic] |

| |

| |

Selectata optiunea Code Builder si click pe OK.

|[pic] |

| |

| |

Dupa cum se vede in imaginea de mai sus, Code Editor-ul afiseaza informatii despre comanda pe care ati tastat-o (evident, in ideea ca ceea ce ati scris este corect sintactic). Nu mai urmeaza decat sa introducem parametrii doriti de noi pentru comanda noastra. Nu voi intra in detalii despre sintaxa diferitelor comenzi VBA si am sa va invit pe fiecare din voi sa o descoperiti. Pentru acest buton, comanda este urmatoarea:

DoCmd.OpenForm "frm_DetaliiDisc", acNormal, , , acFormAdd, , "ADD"

Semnificatia parametrilor este descrisa de tooltip, in Code Editor. Ce nu este explicat in Code Editor, este ultimul parametru. VBA de permite sa specificam pe aceasta pozitie un parametru, optional, pe care sa-l folosim dupa cum credem noi de cuviinta. In astfel de situatii, de refolosire a unui form (sau de parametrizare a acestuia), personal am decis sa folosesc acest parametru pentru a decide contextul in care ruleaza acest form. In cazul nostru, furnizam parametrul "ADD” pentru modul adaugare, "EDT” pentru editare si "DEL” pentru stergere. Tot cu acest parametru, mai putem lua unele decizii cu privire la ce mai afisam in plus in form (vom vedea mai tirziu putin despre ce e vorba). Inchidem Code Editor si trecem la celelalte 2 butoane (Editare si Stergere).

Codul pentru butonul Editare: DoCmd.OpenForm "frm_DetaliiDisc", acNormal, , "[DiscID]=" & Me.lstCDList, acFormEdit, , "EDT"

In plus fata de codul pentru butonul Adaugare, apare conditia "[DiscID]=” & Me.lstCDList. Acest parametru de tip conditional, specifica criteriul de selectie si filtrare a datelor din tabela tbl_Colectie. Daca va mai amintiti, am mentionat la un moment dat, despre proprietatea Bound Column a controlului lstCDList. Aici este momentul sa ne folosim de aceasta. Clauza de filtrare mentionata selecteaza din toata tabela tbl_Colectie, numai acea inregistrare care are codul DiscID egal cu cel al inregistrarii selectate in lstCDList.

Codul pentru butonul Sterge: DoCmd.OpenForm "frm_DetaliiDisc", acNormal, , "[DiscID]=" & Me.lstCDList, acFormEdit, , "DEL"

Semnificatiile parametrilor sunt aceleasi ca in cazul editarii, cu exceptia ultimului parametru.

Urmeaza acum sa specificam, prin intermediul VBA, cum se va "comporta” formul nostru, in functie de context. Ca si prime aspecte de mentionat cu privire la comportament:

1. In functie de context, vom modifica titlul afisat in bara de titlu a formului 2. Tot in functie de context, unele butoane vor avea alt text descriptiv afisat (de exemplu, in cazul in care dorim stergere, textul nu va fi Salveaza J, ci Sterge)

Pentru aceasta, deschidem fereastra frm_DetaliiDisc in modul design si trecem la scrierea codului VBA. Pentru a modifica proprietatile formului enumerate mai sus, ne vom folosi de event-ul OnLoad al formului.

|[pic] |

| |

| |

In lista din dreptul eventului On Load, selectata optiunea Event Procedure, click pe ….

Se introduce codul VBA de mai jos:

Private sPar AS String

Private Sub Form_Load()

' Salvare parametru extra

sPar = Me.OpenArgs

' Modificare proprietati controale & form

If sPar = "ADD" Then

' Titlul afisat in bara de titlu a formului

Me.Caption = "Adaugare disc"

ElseIf sPar = "EDT" Then

' Titlul afisat in bara de titlu a formului

Me.Caption = "Editare disc #" & Me.DiscID & " - " & Me.Titlu

ElseIf sPar = "DEL" Then

' Titlul afisat in bara de titlu a formului

Me.Caption = "Stergere disc #" & Me.DiscID & " - " & Me.Titlu

' In acest context, se modifica si textul afisat pe butonul Salveaza

Me.btnSave.Caption = "Sterge"

' Tot in acest context, pt a evita modificarea accidentala a datelor,

' se comuta controalele pe Locked

Me.Titlu.Locked = True

Me.StandardID.Locked = True

Me.An.Locked = True

Me.NumeArtist.Locked = True

Me.GenID.Locked = True

Me.DiscPropriu.Locked = True

Me.DataCumpararii.Locked = True

Me.DataReturnarii.Locked = True

Me.AgendaID.Locked = True

Me.CasaID.Locked = True

' Setam focus-ul pe butonul Cancel, pt a evita stergerea din greseala a inregistrarii

Me.btnCancel.SetFocus

End If

End Sub

Cu ajutorul codului de mai sus, am stabilit ce se intampla cu formul, in cele 3 ipostaze in care e folosit: editare, adaugare si stergere inregistrari.

NOTA: Prima linie (Private sPar AS String) se va introduce imediat sub linia Option Database Implicit.

Urmeaza sa adaugam codul VBA pentru cele 2 butoane din form.

Codul pentru butonul Salvare

Private Sub btnSave_Click()

' Salvare parametru context

sPar = Me.OpenArgs

If sPar = "DEL" Then

' In acest caz, se executa o alta secventa de instructiuni

' Mai exact, se va sterge inregistrarea curenta

' Dar mai intii se va cere o confirmare

If MsgBox("Sigur stergeti inregistrarea selectata ?", vbYesNo + vbCritical + vbDefaultButton2 + vbQuestion, "Stergere") = vbYes Then

sSql = "DELETE FROM tbl_Colectie WHERE DiscID = " & Me.DiscID

DoCmd.RunSQL sSql

End If

End If

' Fortare refresh pe lista discuri din formul principal

Forms![frm_StartUp]![lstCDList].Requery

Forms![frm_StartUp]![lstCDList].SetFocus

' Inchidere form curent

DoCmd.Close

End Sub

Codul pentru butonul Abandon

Private Sub btnCancel_Click()

' Simulam un abandon al editarii folosind tasta ESC

SendKeys "{Esc}"

' Inchidere form curent

DoCmd.Close

End Sub

Acestea fiind spuse, mai aducem un ultim touch formului nostru. Anume, la partea de aspect. Pentru a vedea despre ce e vorba, salvam modificarile efectuate pana acum si incercam formul in real-life.

La apasarea pe butonul Adaugare, rezultatul este cel de mai jos:

|[pic] |

| |

| |

Cateva observatii:

1. Apare fereastra Properties (cea din dreapta) 2. Apare Record Selector 3. Apare controlul de navigare intre inregistrarile disponibile la nivel de form 4. Campul DiscID este afisat, desi nu este necesar in nici unul din scenarii (adaugare, editare sau stergere)

Pentru a elimina / corecta cele de mai sus, modificam o parte din proprietatile formului frm_DetaliiDisc (cu formul deschis in modul Design, ca in imaginea afisata dupa tabel) conform tabelului de mai jos:

|Proprietate |Valoare |Semnificatie |

|Scroll bars |Neither |Elimina scroll bar-urile de la nivelul formului. |

|Record Selectors |No |Elimina record selector (bara verticala din stinga formului) |

|Navigation Buttons |No |Elimina record selector (bara verticala din stinga formului) |

|Border style |Thin |Nu permite resizing-ul formului |

|Allow Design Changes (tabul Other) |Design View Only |Afiseaza fereastra Properties numai in modul Design |

|[pic] |

| |

| |

Se observa faptul ca in fereastra Properties, este selectat elementul Form. Sa trecem acum la campul DiscID. Se selecteaza acest cimp si se seteaza proprietatea Visible pe No (tabul Format).

|[pic] |

| |

| |

Si acum sa repetam testul.

|[pic] |

| |

| |

Arata mai bine

Inainte de a incheia partea a 6-a a tutorialului nostru, sa incercam sa ne definim un raport pe care sa-l generam in ultima parte a tutorialului. Acest raport ne dorim sa includa toate inregistrarile care reprezinta discuri date imprumut unor terti, cu toate detaliile asociate acestor discuri (titlu, data estimata a returului, etc). Totodata, dorim ca in acest raport sa fie evidentiate separat discurile a caror data de returnare e depasita (fata de data generarii raportului).

Puteti downloada baza de date de aici

Pentru cometarii, intrebari, alte solutii accesati sectiunea de pe forum rezervata acestui tutorial

In partea a 7-a si ultima a tutorialului nostru, vom finaliza aplicatia noastra cu formul pentru activarea si generarea raportului, vom genera raportul si vom mai aduce unele finisari aplicatiei.

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download