Crearea si lucrul cu formularele
Formularele ofera unei baze de date o interfata prietenoasa si eleganta, prin care programatorul poate controla actiunile utilizatorului. Un formular are peste 70 de proprietati, la care se adauga cele ale controalelor, între 38 si 58 pentru fiecare.
Principalul rol al formularelor este introducerea datelor, dar ele pot folosi si la regasirea datelor sau afisarea meniurilor, a ecranelor de tip splash etc.
Sursele de înregistrari ale formularelor indica de unde provin sau unde vor fi stocate datele si sunt specificate printre proprietatile formularelor.
Pentru a vedea pagina de proprietati a unui formular deschis în modul Design View, faceti clic pe butonul selector care se afla în coltul din stânga-sus al formularului si apoi selectati comanda View x Properties sau apasati butonul Properties pe bara cu instrumente.
Nota: Pentru a vedea pagina de proprietati a unui control al formularului, faceti clic pe el pentru a-l aduce în prim plan si apoi alegeti comanda View x Properties sau apasati butonul Properties de pe bara cu instrumente.
Sursa de înregistrari a unui formular poate fi o tabela, o interogare sau o instructiune SQL, specificata în proprietatea Record Source a formularului respectiv.
Figura IV.1.
În figura IV.1. observati ca în dreapta câmpului proprietatii Record Source se afla doua mici butoane. Daca faceti clic pe primul (cel reprezentat de o sageata), se va deschide o lista cu toate tabelele si interogarile din baza de date curenta, dintre care veti selecta sursa de înregistrari. Pentru a modifica sursa de date a unui formular apasati cel de al doilea buton din dreptul proprietatii Record Source (cel reprezentat prin trei puncte.) care va deschide fereastra SQL Ouery Builder (figura IV.2). Aceasta se aseamana cu fereastra QBE atât ca aspect, cât si ca functionare.
Figura IV.2.
Daca formularul se bazeaza pe o interogare, modificarile aduse acesteia în fereastra SQL Builder se vor reflecta si în interogarea propriu-zisa.
Dupa cum am aratat în capitolele precedente, exista doua tipuri de interogari: pentru regasirea datelor si pentru definirea si modificarea datelor. Dintre acestea, numai interogarile pentru regasirea datelor (de tip SELECT) pot servi drept sursa de înregistrari pentru un formular.
Daca va întrebati ce sa alegeti ca sursa de date pentru un formular dintre o interogare salvata si o instructiune SQL, raspunsul este urmatorul: daca interogarea este complexa, salvati-o si apoi alegeti-o în câmpul proprietatii Record Source; daca este simpla, introduceti instructiunea SQL corespunzatoare direct în câmpul proprietatii Record Source a formularului. Formularele bazate pe interogari salvate sunt mai rapide, dar aceste interogari sporesc numarul de obiecte din baza de date, facând-o sa ocupe mai mult spatiu.
Access va pune la dispozitie doua componente pentru crearea formularelor simple: AutoForm Wizard, pentru crearea automata a formularelor si Form Wizard, ce îi da programatourlui mai multa libertate de decizie. Pe lânga acestea, puteti crea formulare si singuri, pornind de la zero, în modul Design View.
Formularele create automat cu ajutorul vrajitorului AutoForm wizard, contin câte un control (câmp) pentru fiecare coloana a tabelei sau a interogarii pe care sunt bazate. În partea dreapta a fiecarui câmp exista o denumire (eticheta) care este data de valoarea prorietatii Label a coloanei respective. Controlul corespunzator unei coloane este cel specificat în proprietatea Display Control a coloanei respective si poate fi Text Box, Combo Box, List Box sau Check Box, în functi de tipul de date.
Figura IV.3. prezinta formularul DetaliiProfesor, creat automat si care se bazeaza pe interogarea DetaliiProf din figura IV.2.
Figura IV.3.
Puteti alge tiparul, adica fundalul implicit si fontul si culoarea implicita a etichetelor folosite de AutoForm Wizard la crearea automata a formularelor. Pentru aceasta, deschideti formularul în modul Design View, efectuati modificarile dorite si alegeti comanda AutoFormat.
Spre deosebire de vrajitorii pentru crearea automata a formularelor (AutoForm Columnar Wizard, AutoForm Tabular Wizard si AutoForm Datasheet Wizard, care difera prin modul în care sunt prezentate datele în formular), vrajitorii de tip Form Wizard (Form Wizard, Chart Wizard si Pivot Table Wizard) îi dau programatorului posibilitatea de a specifica tabelel sau interogarile pe care se va baza formularul, câmpurile acestora care vor aparea pe formular, ordinea de sortare a datelor, fundalul etc.
Nota: Daca folositi mai multe tabele si interogari ca sursa de înregistrari pentru un formular, între acestea trebuie sa fie stabilite relatii.
Apasând butonul "Create form by using wizard" din pagina Forms a ferestrei Database Container, se va deschide fereastra de dialog (figura IV.4), în care veti alege vrajitorul care vreti sa va ajute la crearea unui nou formular.
Figura IV.4.
Dupa ce ati ales optiunea Form Wizard, acest vrajitor va va prezenta succesiv patru cutii de dialog, în care veti putea alege câmpurile dorite din una sau mai multe tabele sau interogari din baza de date (între care trebuie sa existe relatii), modul cum vor fi prezentate datele (pe o singura coloana (Columnar), sub forma de tabel (Tabular), ca în modul Datasheet View (Datasheet) sau aliniate atât la stânga cât si la dreapta formularului (Justified)), fundalul si, în final, numele formularului.
Daca doriti sa creatiun formular pornind de la zero, fara nici un ajutor, în cutia de dialog New Form alegeti optiunea "Create Form in Design View". Astfel, se va deschide un formular fara nici un control, urmând ca dumneavoastra sa adaugati controalele dorite, folosind cutia de instrumente (Toolbox).
Un formular Access poate avea între una si cinci sectiuni. Iata care sunt acestea (prezentate si în figura IV.5):
Figura IV.5
Detail - Aceasta sectiune contine datele din fiecare înregistrare a sursei de date. Pentru a trece de la o înregistrare la alta veti folosi butoanele de navigare ale formularului.
Form Header - Aceasta sectiune apare întotdeauna în partea de sus a formularului. Aici puteti include informatii care nu se schimba în functie de fiecare înregistrare, cum ar fi un antet sau un control ce nu are legatura cu înregistrarea curenta, precum si o caseta combinata folosita pentru filtrarea înregistrarilor.
Form Footer - Aceasta sectiune apare în partea de jos a unui formular. Aici puteti include informatii despre data si ora la care a fost creat formularul sau totalurile coloanelor unui formular tabelar.
Page Header - Aceasta sectiune apare între Form Header si Detail. Formularele care contin un numar mare de controale pot fi împartite cu ajutorul unui control de tip Page Break în doua sau mai multe pagini, pentru a fi afisate pe rând. Sectiunile Page Header si Page Footer vor ramâne nemodificate când se trece de la o pagina la alta a formularului.
Page Footer - Aceasta sectiune apare între Detail si Form Footer si se aseamana cu sectiunea Page Header.
Indiferent de cum a fost deschis un formular, veti putea face trecerea la oricare dintre cele trei moduri în care poate fi vazut formularul: Design View (pentru a lucra cu controalele formularului), Datasheet View (pentru a avea acces numei la datele pe care se bazeaza formularul) sau Form View (pentru a vedea formularul în forma sa finala), alegând una dintre aceste comenzi din meniul View.
Într-un formular puteti naviga atât între controale, cât si între înregistrari. Cu ajutorul tastei Tab puteti trece de la un control la altul. Pentru a stabili ordinea în care se face aceasta trecere, alegeti comanda View x Tab Order.
Pentru a trece la înregistrarea urmatoare, treceti la ultimul control de pe formular si apoi apasati tasta Enter. Un alt mod de a trece de la o înregistrare la lata este prin folosirea tastelor Page Up si Page Down. Mult mai simplu este însa sa folositi butoanele pentru navigarea printre înregistrari. Aceste butoane apar în coltul din stânga jos al unui formular, daca în pagina de proprietati a acestuia proprietatea Navigation Buttons are valoarea Yes.
Tot în pagina de proprietati a unui formular veti gasi sase proprietati ce va permit sa controlati actiunile utilizatorului asupra datelor pe care se bazeaza formularul:
Allows Edits: Daca are valoarea Yes, utilizatorul va putea modifica înregistrarile; daca are valoarea No, aceasta nu va putea schimba în nici un fel datela afisate în formular.
Allow Deletions: Daca are valoarea Yes, utilizatorul va putea sterge înregistrari, cu conditia ca integritatea referentiala sa nu fie violata.
Allow Additions: Daca are valoarea Yes, utilizatorul va putea introduce noi înregistrari prin intermediul formularului.
Data Entry: daca are valoarea Yes, formularul deschide automat o înegistrare noua, fara date. Utilizatorul nu are acces la înregistrarile existente. Daca proprietatea Alow Additions are valoare No, iar Data Entry are valoarea Yes, va rezulta o eroare.
Recordset Type: Poate fi Dynaset, Dynaset (Inconsistent Updates) sau Snapshot. Se refera la formularele ce au mai multe tabele ca sursa de date. Daca valoarea este Dynaset, datele din controalele asociate câmpurilor vor putea fi editate de catre utilizator, ceea ce nu este valabil în cazul valorii Snapshot.
Record Locks: Se refera la aplicatii multiuser. Daca are valoarea No Locks, mai multi utilizatori vor putea modifica aceleasi înregistrari în acelasi timp, fiind luate în considerare numai modificarile care au fost salvate primele. Optiunea Edited Records împiedica ceilalti utilizatori de a opera schimbari asupra unei înregistrari care este deja în curs de modificare. Optiunea All Records blocheaza toate înregistrarile din formular si din tabelele de baza atâta timp cât un utilizator editeaza orice înregistrare din tabela.
O data ce au fost facute modificari asupra unei înregistrari dintr-un formular, acestea vor fi salvate fie când se trece la înregistrarea urmatoare, fie când se închide formularul.
Proprietatile din pagina Format a ferestrei de proprietati a formularului controleaza aspectul acestuia. Printre ele se numara:
Caption: Pastreaza textul ce va fi afisat în bara de titlu a formularului.
Default View: Stabileste daca formularul va fi afisat în modul Single Form (cel mai des folosit), Continuos Form sau Datasheet.
Views Allowed: Stabileste daca utilizatorul poate trece din modul Form View în modul Datsheet View.
ScrollBars: Stabileste daca formularul are bare de derulare verticale si/sau orizontale.
RecordSelectors: Daca valoarea sa este Yes, pe latura din stânga a sectiunii Detail va aparea un selector pentru înregistrari.
NavigationButtons: Daca valoarea este Yes, formularul va fi dotat cu butoane pentru parcurgerea înregistrarilor.
RecordDividers: Daca valoarea este Yes, în modul Continuos va aparea o linie de separare între înregistrari.
AutoResize: Daca valoarea este Yes, fereatra formularului va fi dimensionata corespunzator la fiecare deschidere a acestuia.
AutoCenter: Daca valoarea este Yes, la deschidere formularul va aparea centrat pe ecran.
ControlBox: Daca valoarea este Yes, caseta de control va aparea în partea din stânga a barei de titlu.
MaxMinButtons: Precizeaza daca butoanele Minimize si Maximize vor fi incluse în bara de titlu. În acest caz, valoarea proprietatii WhatsThisButton trebuie sa fie No.
CloseButton: Daca valoarea este Yes, butonul (X) pentru închiderea formularului va fi inclus în partea dreapta a barei de titlu.
WhatsThisButton: Daca valoarea este Yes, butonul ( ) va aparea în partea din dreapta a barei de titlu în cazul în care si CloseButton are valoarea Yes.
Pe lânga acestea, ar fi mai interesant sa mentionam doua dintre cele mai importante proprietati din pagina Other a ferestrei Properties:
Pop Up: Daca valoarea sa este Yes, formularul va fi afisat deasupra altor ferestre, putând fi mutat si în afara ferestrei Access.
Modal: Daca valoarea sa este Yes, alte ferestre deschise nu pot primi controlul pâna când formularul nu este închis.
Fiecare element de pe un formular este un control de un anumit tip. Puteti adauga controale la un formular deschis în modul Design View folosind cutia de instrumente Toolbox, pe care o puteti vedea alegând comanda View x Toolbox sau apasând butonul Toolbox de pe bara de instrumente. Majoritatea butoanelor din Toolbox reprezinta un tip de control ce poate fi plasat pe un formular. Figura V.6 prezinta cutia de instrumente Toolbox si descrie componentele sale.
Pentru a plasa un control din Toolbox pe un formular, faceti clic pe butonul corespunzator tipului de control dorit, dupa care faceti clic pe formular. O data adaugat, controlul poate fi redimensionat în functie de necesitati. Puteti selecta un control sau un grup de controale cu ajutorul sagetii din cutia cu scule. Alegeti sageata si apoi trasati un dreptunghi în jurul controalelor pe care doriti sa le selectati. O alta metoda ar fi sa tineti tasta Shift apasata în timp ce faceti clic pe controalele respective.
Pentru a stabili proprietatile si comportamentul unui control, Access va pune la dispozitie vrajitorul control Wizard, care va fi activat atunci când controlul este plasat pe formular, daca butonul Control Wizard din cutia de scule este apasat (ca în figura IV.6).
Figura IV.6
Exista trei tipuri de controale ce pot fi plasate pe un formular: atasate, neatasate si calculate.
Un control este folosit pentru a furniza sau primi de la utilizator informatii ce nu sunt sau nu vor fi stocate în baza de date. Iata câteva exemple de astfel de controale:
O eticheta ce descrie alt control;
Un buton prin care se deschide un alt formular;
Un bitmap ce face formularul mai atractiv etc.
Controalele atasate sunt folosite pentru a afisa sau edita informatii din baza de date si lor le corespunde câte un câmp dintr-o tabela sau un câmp returnat de o interogare sau instructiune SQL. Orice control poate fi atasat, cu exceptia dreptelor, dreptunghiurilor, sfârsitului de pagina, etichetelor si cadrelor pentru imagini.
Un control atasat va mosteni multe dintre proprietatile câmpului corespunzator (cum ar fi Caption, Description, Input Mask, Format), dar aceste proprietati pot fi modificate prin intermediul paginii de proprietati a controlului.
Pentru a plasa un control atasat pe un formular procedati astfel:
Alegeti comanda View x Field List pentru a afisa câmpurile sursei de date pe care se bazeaza formularul.
Selectati un câmp sau un grup de câmpuri din aceasta lista.
Faceti drag & drop cu selectia pe formular. Astfel, pentru fiecare câmp selectat va aparea pe formular un control si o eticheta ce va afisa textul din proprietatea Caption a câmpului corespunzator.
Puteti transforma un control neatasat într-unul atasat folosind proprietatea Control Source a controlului respectiv, în care sa specificati câmpul corespunzator.
Controalele calculate folosesc expresii pentru a-si obtine datele. Desi casetele text sunt cel mai frecvent întâlnite controale de acest tip, orice alt fel de control ce are proprietatea Control Source poate fi calculat. Orice expresie trebuie sa înceapa cu semnul egal (=). De exemplu, daca în formularul DetaliiProfesor dorim sa avem un câmp ce calculeaza impozitul din salariul afisat în controlul Salariu, expresia folosita va fi:
[Salariu]*0.12
Aceasta expresie poate fi introdusa direct în control daca acesta este o caseta text sau în câmpul proprietatii Control Source a controlului. Pentru expresii mai complicate lansati Expression Builder (despre care am mai vorbit în capitolul III), apasând butonul (.) dinpartea dreapta a câmpului poprietatii Control Source.
În continuare, va vom arata cum puteti sa profitati de ajutorul oferit de vrajitorul Control Wizard pentru lucrul cu controalele de tip caseta combinata, caseta lista si grup de optiuni. Daca butonul Control Wizard din cutia de instrumente este apasat, prin plasarea pe formular a unui control de tipul celor enumerate anterior, se va activa vrajitorul corespunzator (Combo Box Wizard, List Box Wizard sau Option Group Wizard).
Vrajitorii pentru casete combinate si casete lista sunt foarte asemanatori cu vrajitorul Lookup Wizard, care va ajuta sa creati într-o tabela o coloana ale carei valori proveaneau din alta tabela sau dintr-o lista specificata de dumneavoastra (vezi capitolul III). Pentru a ilustra lucrul cu ei, ne vom întoarce la formularul DetaliiProf care trebuie sa fie deschis în modul Design View. Sa presupunem ca în locul casetei text Titlu vom introduce o caseta combinata din care utilizatorul sa poata alege una dintre valorile din coloana Titlu a tabelei cu acelasi nume. stergeti asadar controlul Titlu de pe formular (faceti clic pe el pentru a-l selecta si apoi apasati tasta Del) si adaugati un control de tip Combo Box. În prima cutie de dialog a vrajitorului Combo Box Wizard alegeti prima optiune, prin care specificati ca valorile controlului vor proveni dintr-o tabela sau interogare. În a doua cutie de dialog va trebui sa alegeti tabela sau interogarea respectiva, în speta, tabela Titlu. În cea de-a treia cutie de dialog veti alege câmpurile din tabela Titlu ce vor da valorile din caseta combinata. Deoarece în lista dorim sa fie afisate titlurile din coloana Titli, dar în tabela Profesor se vor stoca doar identificatorii din coloana IdTitlu, aici vom selecta atât coloana Titlu, cât si IdTitlu. În cea de-a patra cutie de dialog veti ajusta, eventual, latimea listei si veti lasa validata caseta Key Column, deoarece nu doriti ca în lista sa apara si valorile coloanei IdTitlu. Cea de-a cincea cutie de dialog va întreaba daca valorile selectate în caseta combinata vor fi memorate pentru a fi folosite ulterior sau vor fi stocate în baza de date. Alegeti a doua optiune si specificati ca valorile vor fi stocate în coloana IdTitlu. Ultima cutie de dialog va lasa sa introduceti textul etichetei plasat în dreptul casetei combinate. Scrieti "Titlu" si apasati butonul Finish pentru a închide vrajitorul si a crea controlul. Treceti apoi în modul Form View si testati formularul (figura IV.7).
Figura IV.7
Sa privim pagina de proprietati a casetei combinate Titlu pentru a întelege ce a facut Combo Box Wizard (figura IV.8). În câmpul proprietatii Row Source Type este selectata valoarea Table / Query, deoarece valorile din lista casetei combinate provin dintr-o tabela, interogare sau instructiune SQL. Proprietatea Row Source specifica aceasta instructiune:
SELECT DINCTINCROW [Titlu].[IdTiltu], [Titlu].[Titlu] FROM [Titlu];
Proprietatea Control Source specifica exact coloana din care provin datele din caseta combinata: IdTitlu. Atunci când veti dori sa introduceti în tabela Profesor date despre un nou profesor prin intermediul acestui formular, în coloana IdTitlu a tabelei Profesor va fi stocata valoarea lui IdTitlu din tabela Titlu, în functie de alegerea dumneavoastra din caseta combinata.
Figura IV.8
În continuare, vom adauga formularului DetaliiProf un grup de optiuni cu ajutorul vrajitorului Option Group Wizard. Pentru aceasta, va trebui sa adaugam o noua coloana la tabela Profesor si anume Statut, de tip Number (FieldSize=Integer) si care va avea valoarea 1 daca profesorul este titular sau 0 daca este suplinitor. De asemenea, va trebui sa modificam si sursa de date a formularului (interogarea DetaliiProf) astfel încât ea sa contina si aceasta coloana.
Deschideti din nou formularul DetaliiProf în modul DesignView si, din cutia de instrumente selectati controlul de tip grup de optiuni. Daca butonul Control Wizard din cutia de instrumente este apasat, când veti plasa controlul pe formular, se va activa vrajitorul Option Group Wizard. În prima cutie de dialog a vrajitorului veti specifica etichetele fiecarui buton de optiune: "Titular" si "Suplinitor". În urmatoarea cutie de dialog veti alege care dintre cele doua optiuni sa fie implicita: alegeti optiunea Titular. În cea de-a treia cutie de dialog veti introduce valorile corespunzatoare optiunilor, valori ce vor fi stocate în tabela: 1 pentru Titular si 0 pantru Suplinitor. Urmatoarea cutie de dialog ne cere sa specificam daca valorile vor fi stocate într-o tabela, si daca da, în ce câmpuri. Alegeti aici coloana Statut si apasati Next. Urmatoarea cutie de dialog ne propune diferite tipuri de controale ce pot aparea într-un grup de optiuni. Selectându-le, le veti putea vedea în partea stânga a cutiei de dialog. Acceptati, de exemplu, varianta implicita si treceti la ultima cutie de dialog în care va trebui sa introduceti denumirea grupului de optiuni (sa-i spunem "Statutul"). Pentru a vedea functionarea grupului de optiuni treceti în modul Form View si testati formularul. El va arata ca în figura IV.9.
Pentru ca la introducerea datelor sa nu poata aparea neconcordante între caseta combinata Titlu si câmpul IdTitlu al formularului, dati proprietatii Locked a casetei text IdTitlu valoarea Yes, astfel încât valorile sale sa nu poata fi modificate direct de catre utilizator.
Figura IV.9
Sa vedem acum ce a facut Option Group Wizard. Observati ca grupul contine doua butoane de optiune, ale caror etichete sunt "Titular" si "Suplinitor". Din pagina de proprietati a grupului de optiuni (figura IV.10), merita sa remarcam valoarea proprietatii Control Source, si anume coloana Statut. De asemenea, proprietatea Default Value are valoarea 1, corespunzatoare optiunii Titular (asa cum am specificat în cea de-a doua cutie de dialog a vrajitorului). Din pagina de proprietati a primului buton de optiune, Titlu, remarcam doar ca valoarea 1 pe care o specificasem în cea de-a treia cutie de dialog a vrajitorului se regaseste în valoarea proprietatii Option Value (figura V.11). Analog, valoarea 0 corespunzatoare optiunii Suplinitor se regaseste în valoarea proprietatii Option Value a celui de-al doilea buton de optiune.
Atunci când avem doua tabele între care exista o relatie de tip 1:m, poate fi avantajos sa putem lucra cu amândoua prin intermediul unui singur formular. De exemplu, tabelele Profesor si Titlu sunt legate printr-o astfel de relatie, coloana de legatura fiind IdTitlu. Ar fi interesant ca, atunci când obtinem informatii despre titlul de lector, sa putem vedea si toti profesorii care au acest titlu.
Pentru aceasta, vom crea un formular ce va contine un subformular. Formularul parinte va lucra cu datele din tabela aflata în partea (1) a relatiei, iar subformularul, cu cele ale tabelei din partea (m). Access recunoaste faptul ca între cele doua tabele este definita o relatie si, pentru o anumita înregistrare din tabela Titlu, limiteaza înregistrarile din subformular la cele pentru care valorile câmpului de legatura din cele doua tabele sunt egale.
Puteti avea maximum doua niveluri de imbricare a subformularelor si oricâte subformulare pe acelasi nivel de imbricare. Access 97 va pune la dispozitie un instrument foarte prietenos pentru crearea de formulare cu subformulare: Form Wizard. Pasii pe care trebuie sa-i parcurgeti pentru aceasta sunt urmatorii:
În pagina Forms a ferestrei Database alegeti butonul New si apoi, din cutia de dialog New Forms, alegeti Form Wizard.
În prima cutie de dialog a Vrajitorului, selectati din caseta combinata Tables/Queries tabela Profesor si apoi, din lista Available Fields alegeti coloanele Nume, Catedra si Data Angajarii. Selectati apoi din caseta combinata rabela Titlu si coloanele Titlu si Salariu.
Pe baza datelor pe care le-ati selectat, Access îsi da seama ca doriti sa creati un formular bazat pe doua tabele între care exista o relatie de tip1:m si va pune la dispozitie trei moduri de a vizualiza aceste date. Daca în cea de-a doua cutie de dialog din Wizard alegeti ca datele sa fie prezentate în functie de tabela Profesor, atunci formularul va fi de tip Single Form, adica datele din cele doua tabele vor fi afisate într-un singur formular. Daca alegeti ca datele sa fie prezentate în functie de tabela Titlu, atunci puteti opta între 2 posibilitati: Linked Forms (formulare legate) (în acest caz vor fi create doua formulare separate, cel care se bazeaza pe tabela din partea (1) a relatiei având un buton, pe care daca apasati se va deschide formularul bazat pe tabela din partea (m) a relatiei) si Form with subform(s) (formular cu subformulare). Alegeti aceasta ultima posibilitate.
Urmatoarele cutii de dialog din Wizard se ocupa cu caracteristicile grafice ale formularului.
Dupa ce ati apasat butonul Finish în ultima cutie de dialog din Wizard, pe ecran se va deschide un formular asemanator cu cel din figura V.12.
Pentru a întelege legatura dintre formularul parinte si subformular, sa le privim în modul Design View. Observati, în figura V.13, ca formularul parinte, Titlu_Profesori are, în plus fata de casetele text Titlu si Salariu si etichete corespunzatoare acestora, un control de tip Subform/Subreport. Legatura între cele doua formulare se face prin intermediul a doua proprietati ale controlului de tip Subform/Subreport: Link Child Fields si Link Master Fields care specifica numele coloanelor de legatura ce formeaza cheia straina în tabela din partea (m) si, respectiv, ale coloanelor ce formeaza cheia primara a tabelei din partea (1) a relatiei. Mai observati faptul ca proprietatea Source Object are ca valoare numele subformularului (Profesori Subform).
Figura V.14 prezinta subformularul în modul Design View si pagina de proprietati a acestuia. Observati ca proprietatea Record Source are ca valoarea tabela Profesor, din care provin datele subformularului. De asemenea, observati ca subformularul are un antet în care se afla numele coloanelor.
Un subformular poate fi adaugat unui formular parinte si fara ajutorul lui Form Wizard. Nu trebuie decât sa trageti numele subformularului din pagina Forms a ferestrei Database Container peste formularul principal deschis în modul Design View si apoi sa stabiliti proprietatile Link Child Fields si Link Master Fileds ale controlului de tip Subform/Subreport care va contine subformularul. Alta metoda ar fi sa selectati din cutia de instrumente un control de tip Subform/Subreport si sa-i stabiliti în mod corespunzator proprietatile Link Child Fields, Link Master Fileds si Source Object.
Capitolul V
Crearea si lucrul cu rapoartele
Rapoartele reprezinta o metoda prin care datele pot fi prezentate într-un mod intuitiv si placut. Ele pot fi tiparite, vizualizate sau exportate într-un alt format. Desi între formulare si rapoarte exista multe asemanari, una dintre deosebiri este aceea ca rapoartele nu pot fi folosite pentru introducerea datelor. Raportele pot sa contina aproape toate elementele unui formular, cu exceptia controalelor care presupun actiuni ale utilizatorului, cum ar fi cele de tip Comba box. Puteti sa convertiti formularele în rapoarte si vice-versa facând clic dreapta pe numele formularului sau al raportului în fereastra Database si alegând optiunea Save As Report (sau Save As Form) din meniul derulant.
Datele unui raport pot proveni dintr-o tabela, o interogare sau o instructiune SQL. Setul de înregistrari însa nu este dynaset, ci un snapshot (despre acestea vom vorbi pe larg în capitolul X, "Lucrul cu obiecte").
Pentru a crea un nou raport, Access va pune la dispozitie doua programe wizard, Auto Report si Report Wizard. Acestea sunt utile mai ales atunci când sursa de date a raportului este simpla sau pentru a crea un raport de pornire pe care sa îl perfectionati ulterior, manual.
Pentru a crea un formular în mai putin de un minut, nu trebuie decât sa apasati butonul New din pagina Reports a ferestrei Database si sa alegeti din cutia de dialog New Report una dintre optiunile AutoReport (Columnar, pentru ca datele sa fie prezentate pe o singura coloana sau Tabular, pentru prezentarea datelor sub forma de tabel). În plus, mai trebuie sa selectati numele unei tabele sau interogari din caseta combinata a acestei cutii de dialog. Dupa ce ati apasat butonul OK, raportul creat va fi afisat pe ecran în modul Print Preview.
Pentru a crea însa un raport mai elaborat, vom folosi Report Wizard. Sa presupunem ca dorim sa cream un raport care sa prezinte, pentru fiecare student, cursurile optionale la care s-a înscris. Vom crea raportul pe baza interogarii Student_Cursuri, din figura V.1:
De data aceasta, alegeti din cutia de dialog New Report optiunea Report Wizard. În prima cutie de dialog, alegeti din caseta combinata Tables/Queries interogarea Student Cursuri si apasati butonul (>>) pentru a selecta toate câmpurile acestei interogari, prezentate în lista Available Fields. Cea de-a doua cutie de dialog din wizard va întreaba în functie de care date sa se faca gruparea: de cele din tabela Curs, de cele din tabela Curs_Student sau de cele din tabela Student. Deoarece dorim sa vedem cursurile la care s-a înscris fiecare student si nu studentii care s-au înscris la fiecare curs, vom alege ca gruparea sa se faca în functie de tabele Student. Urmatoarea cutie de dialog va permite sa stabiliti si alte niveluri de grupare a datelor. Dupa cum puteti vedea, deja exista doua niveluri: primul contine informatii despre un student: NrMatricol, NumeSt, PrenumeSt, Grupa, iar al doilea, despre cursurile la care acesta s-a înscris: Denumire si Nota. Sa zicem ca am dori ca, la rândul lor studentii sa fie grupati în functie de grupa în care se afla. Pentru aceasta, selectati coloana Grupa din lista din stânga cutiei de dialog si apasati butonul (>). Nu este prea târziu înca sa va razgânditi asupra ordinii în care vor fi grupate datele. Pentru aceasta puteti folosi butoanele Priority
(↑ si ↓). Pentru acest exemplu pastrati totusi ordinea din figura V.2 si apasati butonul Next.
Daca la pasul anterior am stabilit dupa care coloane se va face gruparea datelor, în aceasta cutie de dialog putem stabili ordinea în care vor fi afisate datele de pe ultimul nivel: Denumire si Nota. Sa zicem ca preferam sa afisam cursurile în ordinea alfabetica a denumirii lor. Pentru aceasta, va trebuie sa alegeti în prima caseta combinata coloana Denumire. Daca doriti sa schimbati ordinea de sortare, apasati pe butonul din dreapta casetei combinate. Tot în aceasta cutie de dialog exista si butonul Summary Options, care deschide o alta cutie de dialog. Aici puteti alege ca pentru o coloana de pe ultimul nivel sa se afiseze si suma, media, minimul sau maximul.
Urmatoarele doua cutii de dialog va prezinta câteva variante de aliniere a datelor si, respectiv, câteva stiluri de fonturi folosite pentru afisarea lor (pentru acest exemplu vom alege alinierea în trepte (Stepped) si stilul Compact). În ultima cutie de dialog din wizard introduceti numele raportului (Student_Cursuri) si apasati butonul Finish. Raportul se va deschide în modul Print Preview si va arata în genul celui din figura VI.3. Salvati raportul, pentru ca vom mai lucra cu el în acest capitol.
Daca va decideti sa creati manual un raport, pornind de la zero, alegeti în cutia de dialog New Report optiunea Design View. Se va deschide în modul Design View un raport fara nici un control pe el. Daca ati învatat cum sa proiectati un formular, crearea manuala a unui raport o sa vi se para foarte usoara. Vom avea de-a face cu aceleasi categorii de sectiuni, aceleasi tipuri de controale si aceleasi ferestre suport: ToolBox (cutia cu instrumente), Field List (lista câmpurilor) si Properties (pagina de proprietati). Singurul element nou îl constituie fereastra Sorting and Grouping (sortare si grupare) care va va ajuta sa stabiliti nivelurile de grupare si ordinea în care vor fi afisate datele. Figura VI.4 prezinta formularul Student Cursuri în modul Design View.
Atunci când creati un nou raport în Access, aveti posibilitatea de a alege sursa de date a acestuia din caseta combinata a cutiei de dialog New Report. Aceasta sursa de date poate fi tabela sau interogare salvata. Pentru raportul pe care l-am creat anaterior, sursa de date este interogarea Student Cursuri. Ca si în cazul formularelor, sursa de date este specificata de proprietatea Record Source, dupa cum puteti vedea si din pagina de proprietati a raportului Student_Cursuri (figura VI.5). Puteti schimba ulterior sursa de date a unui raport, modificând valoarea acestei proprietati.
Pentru ca informatiile stocate într-un câmp al sursei de date sa poata fi afisate în raport, trebuie ca grila în QBE proprietatea Show a câmpului respectiv sa fie activata, ca în figura V.1. Daca interogarea pe care se bazeaza raportul are parametri, pentru a putea vizualiza sau tipari raportul, utilizatorul trebuie sa furnizeze valorile parametrilor respectivi.
Dupa ce ati selectat sursa de date a raportului, puteti începe sa-i adaugati controalele, fie ele atasate, neatasate sau calculate, folosind metodele pe care
le-am descris pentru formulare în capitolul IV.
În figura VI.4 puteti vedea sectiunile raportului Student_Curs si, dupa cum
v-ati dat seama, ele nu sunt cu mult diferite de sectiunile unui formular.
Report Header - Apare numai pe prima pagina, ca un titlu pentru întregul raport. Daca doriti sa creati o pagina separata numai pentru titlul raportului, alegeti ca valoare a proprietatii ForceNewPage a acestei sectiuni optiunea After Section (dupa sectiune).
Page Header - Apare în partea de sus a fiecarei pagini, cu exceptia primeia, unde apare dupa antetul raportului. Cel mai adesea, contine titlurile câmpurilor afisate.
Detail - Se repeta pantru fiecare înregistrare la vizualizarea sau la tiparirea raportului. S-ar putea ca la proiectarea raportului sa nu stiti exact cât de înalta trebuie sa fie sectiunea Detail. De exemplu, este foarte posibil ca o înregistrare sa nu aiba nimic într-un câmp de tip memo, în timp ce alta înregistrare sa ocupe o jumatate de pagina sau chiar mai mult. Proprietatile Can Grow (poate creste) si Can Shrink (se poate micsora) ale sectiunii Detail determina pentru aceasta o înaltime variabila, în functie de fiecare înregistrare în parte.
Page Footer - Apare în partea de jos a fiecarei pagini a raportului. Cel mai adesea contine data si ora si, eventual, numarul paginii. Observati, din figura VI.5, ca sectiunea Page Footer a raportului Student Cursuri contine doua casete de text, ce au ca surse de date expresiile: Now () si
="Page " & [Page] & " of " & [Pages]
Prima afiseaza data curenta, iar cea de-a doua, pagina curenta din numarul total de pagini ale raportului. Variabila [Page] are ca valoare numarul paginii curente, iar variabila [Pages], numarul total de pagini. Pentru a tipari aceste informatii în subsolul de pagina al unui raport, alegeti optiunile Page Numbers si, respectiv, Date and Time din meniul Insert.
Report Footer - Apare numai pe ultima si poate contine totaluri ale datelor diverselor sectiuni ale raportului. Pentru a afisa totalul unui control numeric, adaugati la aceasta sectiune o caseta text, a carei proprietate Control Source sa aiba valoarea:=Sum ([Nume_Control]). Daca doriti ca totalurile sa fie afisate pe o pagina separata la sfârsitul raportului, dati proprietatii ForceNewPage a acestei sectiuni valoarea Before Section (înaintea sectiunii).
În plus, fata de aceste sectiuni pe care le-am întâlnit si la crearea formularelor, un raport poate avea un numar de antete si subsoluri de grup, care sa afiseze titlurile câmpurilor ce definesc grupul respectiv si totaluri în cadrul grupului.
Pentru a deschide pagina de proprietati a unui raport, procedati exact ca în cazul formularelor: faceti clic pe careul negru din coltul din stânga-sus al raportului în modul Design View si alegeti comanda Properties din meniul View. În continuare, va prezentam câteva dintre proprietatile cu care veti lucra cel mai des pentru a determina comportamentul raportului.
Record Source - Sursa de date a raportului poate fi o tabela, o interogare sau o instructiune SQL.
Filter: - Numele unei interogari (sau al unei instructiuni SQL) care limiteaza numarul de înregistrari din tabela de baza ce vor fi afisate în raport.
Filter On: - Daca are valoarea Yes, filtrul definit de proprietatea Filter se va aplica.
Order By: - Un câmp sau o lista de câmpuri separate prin virgule, din sursa de date a raportului în functie de care va fi stabilita ordinea în care vor fi afisate datele.
Order By On: - Daca are valoarea Yes, se va face sortarea stabilita de proprietatea Order By.
Caption: - Numele care apare în bara de titlu a formularului în modul Print Preview.
Record Locks: - Daca are valoarea All Records (toate înregistrarile), alti utilizatori nu vor putea modifica datele din tabelele de baza ale raportului atâta timp cât acesta nu este vizualizat sau tiparit (pentru aplicati multiuser).
Page Header si Page Footer: - Stabileste daca antetul si/sau subsolul de pagina va fi tiparit si pe paginile în care apare antetul si/sau subsolul raportului.
Picture: - Daca doriti ca pe fundalul raportului sa apara o imagine, aici puteti introduce numele si calea unui fisier cu extensia .bmp, .dib, .wmf sau .emf.
Picture Type: - Determina daca imaginea specificata de proprietatea Picture va fi salvata în baza de date sau va fi pastrata într-un fisier separat.
Picture Size Mode: - Determina în ce mod imaginea specificata de proprietatea Picture va fi micsorata în cazul în care nu încape în pagina.
Picture Alignment: - Arata daca imaginea specificata de proprietatea picture va fi centrata sau aliniata la stânga sau dreapta paginii.
Picture Tiling: - Daca imaginea specificata de proprietatea Picture este mai mica decât pagina, ea se va repeta pe toata pagina.
Picture Pages: - Determina daca imaginea specificata de proprietatea Picture va fi tiparita pe toate paginile, numai pe prima, sau pe nici una.
Layout for Print: - Daca are valoarea Yes, la proiectarea raportului nu veti putea folosi decât fonturile native ale imprimantei si pe cele True Type.
Cea mai buna cale de a descoperi cum lucreaza proprietatile unui raport este totusi sa le testati cu diferite valori pe care le pot lua.
Daca veti alege comanda Sorting and Grouping din meniul View, în timp ce raportul Student_Cursuri este deschis în modul Design View, se va deschide cutia de dialog prezentata în figura VI.6.
Posibilitatea de grupa si de a sorta înregistrarile este ceea ce deosebeste rapoartele de formulare. Cutia de dialog din figura VI.6 va permite sa stabiliti ordinea de sortare a înregistrarilor. Cheia de sortare cea mai semnificativa se afla pe prima pozitie din lista Field/Expression (Grupa, în acest exemplu). Urmeaza apoi coloanele NrMatricol si, respectiv, Denumire. Cu alte cuvinte, pentru fiecare grupa, se vor afisa toti studentii, în ordinea crescatoare a numerelor lor matricole si, pentru fiecare student, se vor afisa cursurile la care acesta s-a înscris, în ordinea alfabetica a denumirilor lor. Daca veti dori sa inversati ordinea de sortare pentru un anumit câmp din aceasta lista, alegeti în câmpul corespunzator din coloana Sort Order cealalta optiune (Descending (descendenta) daca initial ordinea era Ascending (ascendenta) si invers). Pentru fiecare câmp din lista puteti stabili cinci proprietati:
Group Header: Daca are valoarea Yes, Access va crea pentru acest câmp o sectiune antet, în care puteti include ce controale doriti. De exemplu, pentru coloana Grupa, acest antet contine o caseta de text care are ca sursa de date chiar aceasta coloana.
Group Footer: Daca are valoarea Yes, Access va crea pentru acest câmp o sectiune subsol, unde ati putea include controale care sa afiseze diferite totaluri pentru grupul respectiv. Deocamdata, nici unul dintre grupurile definite nu are subsol, dar în cadrul acestui capitol, vom adauga unul.
Group On: Daca valoarea sa este Each Value, Access va considera ca facând parte din acelasi grup doar înregistrarile pentru care valorile câmpului respectiv sunt egale. Cu alte cuvinte, pentru fiecare valoare a câmpului, Access va crea un grup separat care, eventual, va avea un antet si/sau un subsol. Daca valoarea sa este Interval (pentru câmpuri numerice), grupurile se vor extinde la toate înregistrarile pentru care valoarea câmpului respectiv se afla într-un interval specificat. Pentru câmpuri de tip text, avem optiunea Prefix Characters care va considera ca facând parte din acelasi grup toate înregistrarile pentru care valoarea câmpului respectiv începe cu aceleasi n caractere, unde n este valoarea proprietatii Group Interval. De asemenea, pentru coloane de tip sate/time, aceasta proprietate mai poate avea valorile "Year", "Quarter", "Month" etc., înregistrarile putând fi astfel grupate pe ani, trimestre, luni etc.
Group Interval: Daca valoarea proprietatii Group On este alta decât "Each Value", proprietatea Group Interval defineste intervalul în care se poate afla valoarea câmpului respectiv pentru a face parte dintr-un grup.
Keep Together: Daca are valoarea No, Access va trece la o pagina noua numai atunci când pagina curenta este plina. Daca are valoarea Whole Group (întregul grup), Access va face tot posibilul ca antetul, subsolul si sectiunea Detail a grupului sa se afle pe aceeasi pagina. Daca ele nu încap în pagina curenta, se va trece la o pagina noua. Daca are valoarea With First Detail (numai primul detaliu), Access va trece la o pagina noua daca antetul si cel putin prima înregistrare de la sectiunea Detail a grupului nu încap pe pagina curenta.
Raportul Student Cursuri ar furniza mai multa informatie daca ar afisa, pentru fiecare student, media cursurilor optionale la care s-a înscris. Am mai spus ca cel mai bun loc pentru a afisa totaluri este subsolul unei sectiuni sau al unui grup. Pentru exemplul nostru, media ar trebuie sa fie afisata în subsolul grupului determinat de coloana NrMatricol dar, dupa cum puteti vedea si în figura VI.4, acest grup nu are subsol. Pentru a adauga un subsol pentru grupul NrMatricol, deschideti fereastra Sorting and Grouping si dati proprietatii Group Footer a acestui grup valoarea Yes. Access va crea subsolul NrMatricol Footer si îl va plasa între sectiunea Detail si sectiunea Page Footer. Acum nu mai trebuie decât sa plasati în acest subsol o caseta de text si sa dati proprietatii RecordSource ca valore expresia:
=Avg ([Nota])
Eventual, dati proprietatii Caption a etichetei asociate valoarea "Media:" iar proprietatii Name a casetei, valoarea txtMedia. Acum formularul deschis în modul Design View va arata ca în figura VI.7:
Cel mai important lucru, atunci când folosim functii agregat în rapoarte, este acela ca Access restrânge numarul de înregistrari pentru care se face agregarea numai la grupul curent. Astfel, daca includeti o functie agregat în cadrul antetului sau subsolului unui grup, vor fi luate în considerare numai înregistrarile care fac parte din acel grup. Daca o includeti la sectiunea Page Header sau Page Footer, functia va lua în considerare numai înregistrarile din pagina respectiva, iar daca o includeti la sectiunea Report Header sau Report Footer, functia va calcula totalul pentru toate înregistrarile raportului. Astfel, puteti crea atâtea sub-totaluri câte grupuri are raportul.
Alte functii agregat pe care le veti folosi frecvent sunt: Sum([c mp_numeric]) (pentru calcularea sumelor), Count([c mp_numeric]) (pentru a numara înregistrarile), Min([c mp_numeric]) (pentru a afla minimul) si Max([c mp_numeric]) (pentru a afla maximul). Puteti, de asemenea, sa creati expresii în care sa folositi functii agregat si sa le afisati drept totaluri:
=Sum([Nota]) / Count([Denumire])
Am creat mai devreme raportul Student Cursuri folosind Report Wizard si, apoi, i-am adaugat o caseta de text a carei sursa de date este o functie agregat. Desi raportul ne ofera multe informatii utile, aspectul sau ar mai putea fi îmbunatatit: titlurile coloanelor ar putea fi schimbate (Access a folosit numele câmpurilor, care nu sunt întotdeauna intuitive si prezentabile); formatul în care sunt afisate mediile ar trebui modificat astfel încât sa aiba numai doua zecimale; am putea evidentia anumite texte si, eventual, am putea introduce numere de ordine.
Bineînteles ca toate aceste modificari nu vor putea fi facute decât în modul Design View. Pentru a schimba titlurile coloanelor, selectati etichetele corespunzatoare de la sectiunea Page Header si, în pagina lor de proprietati, modificati proprietatea Caption: în loc de "NumeSt" si "PrenumeSt", introduceti, de exemplu, doar "Nume" si "Prenume", iar în loc de "Denumire", introduceti "Cursuri". Chiar si titlul raportului ar putea fi îmbunatatit, din "Student Cursuri" în "Studenti si Cursuri". Probleme de aspect ar mai putea ridica si alinierea textului în controale. Daca proprietatea "Text Align" (alinierea textului) a unei etichete are valoarea "General", textul va fi aliniat la stânga controlului, iar daca aceeasi proprietate a unei casete de text are aceasta valoare, textele vor fi aliniate la stânga iar valorile numerice sau de tip date/time vor fi aliniate la dreapta. Pentru a schimba aceste valori, alegeti explicit una dintre celelalte valori ale proprietatii Text Align: "Left" (la stânga), "Center" (centrat) si "Right" (la dreapta).
Pentru ca mediile sa fie afisate cu exact doua zecimale, selectati cutia de text txtMedia adaugata la sectiunea anterioara si dati proprietatii Format valoarea "Fixed" iar proprietatii Decimal Places, valoarea 2. De asemenea, media fiind o informatie importanta, ar fi bine sa o evidentiem într-un fel. Pentru aceasta, dati proprietatii Font Weight a casetei de text valoarea "Bold" si, astfel, mediile vor fi scrise îngrosat.
Un alt element des întâlnit în rapoarte îl reprezinta numerele de ordine. Sa presupunem ca în dreptul fiecarui student dorim sa apara al câtelea este în cadrul raportului. Pentru aceasta, adaugati la sectiunea "NrMatricol Header" o noua caseta de text (stergeti eticheta asociata, deoarece nu ne trebuie), a carei proprietate Control Source sa fie =1. Pentru ca numarul de ordine sa fie incrementat cu unu la fiecare student, dati proprietatii Running Sum a acestei casete de text valoarea "Over All". Daca am fi dorit ca numerotarea sa reînceapa pentru fiecare grupa, valoarea proprietatii Running Sum ar fi trebuit sa fie "Over Group".
Daca observati ca pentru anumite valori ale înregistrarilor textul care trebuie sa apara într-un control nu se vede în întregime deoarece controlul nu este suficient de mare, dati proprietatii Can Grow a controlului respectiv valoarea Yes. Astfel, controlul va fi redimensionat automat, ca sa poata afisa textul în întregime. Acesta poate fi si cazul casetei de text care afiseaza denumirile cursurilor.
|