Sunteți pe pagina 1din 20

Capitolul 3 Tabele si forme

3.1 Tabele

Pentru a simplifica modalitatea de creare a tabelelor vom ilustra prin


exemple fara a intra in detalii, modul in care se creaza tabelele, cum se definesc
campurile, ce proprietati au acestea si care sunt modalitatile cele mai simple de
actiune in acest sens. In cadrul capitolului, vor fi prezentate mai multe exemple,
pentru ca cititorul sa se familiarizeze cu tabelele.

Vom construi prin exemple tabelul Angajati pezentat anterior. Pentru a


exemplifica posibilitatile oferite, mai construim inca doua tabele de Functii si
Sectii, din primul, vom prelua functia pe care o vom introduce in campul aferent din
tabelul Angajati.

Obsevam ca in fereastra Database avem obiectele Access: Tables, Queries,


Forms, Reports, Macros, Modules.

In baza noastra de date avem tabelele Angajati, Functii, Sectii si sa


exemplificam continutul tabelului Functii.
Dupa cum se observa continutul din tabelului urmator, dispunem de un
navigator printre inregistrarile tabelului. In exemplul de mai sus, inregistrarea
curenta este cea de a treia.
In tabel ne putem deplasa asa cum arata indicatoarele, pornind de la
inregistrarea curenta, astfel: pe prima, pe precedenta (relativ la intregistrarea
curenta), pe urmatoarea, pe ultima si dupa ultima inregistrare (in ultimul caz pentru
a adauga inregistrari noi). De asemenea, avem indicat numarul (de ordine) al
inregistrarii curente si numarul total de inregistrari din tabel.

Tabelele Sectii si Functii contin cate un camp care este Sectia respectiv
Functia. Pentru a introduce informatii in tabelul Functii Sectii il deschidem (Open)
si introducem numele functiilor care dorim sa le avem. In mod analog, vom
deschide si tabelul Sectii in care vom introduce sectiile existente in firma noastra.

Crearea tabelului Angajati va fi ilustrata prin urmatoarele imagini iar


cometariile vor fi facute numai pentru situatiile noi in care ne vom afla.
Dupa cum observam campul Marca este definit ca Auto Number este un
numar intreg in forma lunga. Pentru el valorile noi se dau prin incrementare, este
indexat si nu admite duplicate. De asemenea campul Marca a fost definit ca si cheie
primara.

Trebuie sa remarcam inca odata in plus, cheia primara impune existenta


pentru fiecare inregistrare a unei valori unice (care nu mai apare la o alta
inregistrare) iar in cazul in care o inregistrare este stearsa, valoarea pe care a avut-o
cheia nu va mai fi atribuita nici unei alte inregistrari care va fi adaugata ulterior.
Cand se adauga o inregistrare noua, aceasta primeste urmatoarea valoare (fata de
valoarea atribuita ultimei inregistrari adaugate). Faptul ca un camp a fost definit ca
si cheie primara, permite stabilirea de relatii intre tabele.

Analizand campul Nume, observam ca el este de tipul Text, are o lungime


de 10 caractere, am indexat tabelul dupa Nume si admite duplicate (lucru evident
deoarece nimic nu ne impiedica sa avem doi angajati cu numele Pop Ioan,
identificarea lor facandu-se dupa marca).

Campul Sex este Text si are lungimea un caracter. De asemenea, impunem o


regula de validare care restrictioneaza valorile care pot fi introduse in acest camp la
caracterele “M” sau “F”. Acesta se postuleaza in Validation Rule (regula de
validare). In cazul in care introducem alt caracter decat cele specificate mai sus, va
aparea un mesaj cel specificat in Validation Text (care va trebui receptat printr-o
tastare pe OK in MsgBox), dupa care se reia introducerea in campul Sex (pentru
aceeasi inregistrare).
Campul Salariu are tipul Currency si are valoarea implicita 0 plasata in
proprietatea Default Value. Intr-un camp putem plasa o valoare implicita
completand prorietatea Default Value, care nu mai trebuie introdusa de catre
utilizator numai in cazul in care el doreste sa plaseze in acest camp alta valoare
decat aceasta.

In cele ce urmeaza vom utiliza un Combo Box pentru a facilita introducerea


datelor in campul Functie.
Definim campul Functie iar ca suport de introducerea datelor utilizam
Combo Box in proprietatea Display Control, precizand faptul ca luam datele dintr-
un tabel in proprietatea Row Source Type si tabelul Functii din care vom lua
valorile, in proprietatea Row Source. In proprietatea Bound Column precizam care
este campul de legatura, iar daca am dori sa afiseze din tabelul Functii mai multe
campuri, vom preciza in proprietatea Column Count cate coloane sa afiseze din el.
Celelalte detalii se pot imagina usor, de exemplu se pot afisa 8 linii din tabelul
Functii.

Intr-un mod asemanator, putem utiliza in loc de Combo Box, List Box pentru
introducerea datelor. Vom ilustra aceasta pentru campul Sectii.
Exemplificam utilizarea Combo Box si List Box in urmatoarele doua imagini.

In campul Functie am preluat valoarea care o dorim din tabelul Functii,


alegand-o din cele posibile. Mentionam ca putem introduce si alte valori care nu
sunt in acest tabel, fara a primi mesaj de avertizare si daca dorim aceasta, atunci
trebuie sa o specificam pecum am aratat, in proprietatea Validation Rule.

In campul Sectie, am preluat o valoare din lista de valori specificata la


definirea campului Sectie. Trebuie sa precizam ca si aici se pot introduce si alte
valori decat cele prezentate in lista de valori de la definirea campului. De asemenea,
se impune precizarea faptului ca o completare a listei de valori se poate face in
proiectare modificand in campul Sectia.
Consideram ca pe baza exemplelor de mai sus, se pot crea tabele cu
elementele prezentate. Nu am intrat in detalii pe care le-am considerat inutile.
Desigur ca exista inca multe detalii care vor trebui aprofundate, dar care nu fac
obiectul prezentei carti. Vom reveni cu cateva concluzii.

Campurile care sunt incluse intr-un tabel au tipuri de date care trebuiesc
specificate si caracteristici cum ar fi lungimea lor care de asemenea se impun a fi
precizate.

Exista posibilitatea de a face anumite validari asupra datelor introduse intr-


un camp, cu afisarea de mesaje in cazul in care nu se introduc valorile care sunt
cerute.

Anumite campuri pot lua valori implicite, caz in care utilizatorul trebuie sa
completeze numai daca in camp doreste sa plaseze alte valori.

Sunt campuri care pot sa fie sau nu obligatorii, fapt care se specifica in
proprietatea Required care are valoarea Yes (pentru obligatoriu) si No pentru
optional. In cazul in care nu am completat un camp care este obligatoriu pentru o
inregistrare si dorim sa trecem la o alta inregistrare, va apare un mesaj de
atentionare si Access va reveni pe campul (obligatoriu) care va trebui introdus. In
exemplele de mai sus, am omis ilustrarea acestei posibilitati.

La inchiderea tabelului se cere salvarea sa, i se cere numele acestuia, care


trebuie sa fie intuitiv si care va fi utilizat ori de cate ori se va face referire la el sau
la campurile din el. Daca tabelul nu are cheie primara, atunci Access solicita daca sa
puna o cheie primara sau nu, in caz in care utilizatorul raspunde afirmativ, atunci
Access ii pune chie primara cu numele ID.

Nu intram in detalii referitoare la ajustarea dimensiunii ferestrelor, la


modalitatea de obtinere a culorilor pe care le dorim, pentru a avea pe ecran o
imagine agreabila. Acestea se pot obtine cu putin efort, relativ usor.

3.2 Forme

In cele ce urmeaza vom trece in evista modalitati de utilizare a formelor.


Vom crea cateva tabele cu informatii relativ la facturi. Am descompus factura in
doua tabele AntetFactura si DetaliuFactura, motivatia o vom face mai jos.

Pentru a putea da o imagine mai sugestiva, ne propunem sa analizam


continutul informatiilor din factura. Avem doua modalitati de a prezenta datele din
factura:
 Prima dintre ele este aceea in care pentru fiecare rand pe care avem inscrisa o
marfa (denumire, unitate da masura, pret, cantitate, valoare) mai completam si
datele din antetul facturii (numarul, data si beneficiarul). In aceasta situatie,
evident ca informatiile din antetul facturii se repeta pentru fiecare rand, lucru
care este neeconomicos atat pentru procesul de introducere a datelor cat si
pentru spatiul de memorare;
 Cea de a doua, in care sugestiv putem spune ca vom decupa antetul facturii de
detaliul facturii (partea in care avem marfurile) in doua tabele, fiecare avand
continutul cunoscut, iar intre ele vom stabili legatura pe baza numarului facturii
pe care-l adaugam la detaliu pe (fiecare) rand. Astfel, nu vom avea informatii
care se repeta decat numarul facturii care de fapt este campul de legatura intre
cele doua tabele.

Pentru exemplele pe care le vom da, vom folosi urmatoarele tabele in care nu vom
mai preciza lungimile campurilor, decat acolo unde se impune, in sensul ca la
anumite tipuri de date lungimile campurilor sunt deja cunoscute:

AntefFactura

Nume camp Tip camp Lungime camp


NrFactura Intreg
DataFacturii Data
CodPartener Intreg

DetaliuFactura

Nume camp Tip camp Lungime camp


NrFactura Intreg
CodMarfa Intreg
UnitMas Text 5
Cantitate Intreg
Pret Intreg

Parteneri

Nume camp Tip camp Lungime camp


CodPartener Intreg
NumePartener Text 10
Adresa Memo 10
BancaFil Text 10
ContBanca Text 10
NomMarfa

Nume camp Tip camp Lungime camp


CodMarfa Intreg
DenMarfa Text 10
UnitMas Text 5
CategMarfa Text 10
Merceolog Text 10
Gestiune Text 10

Tabelele Merceologi, CategMarfuri contin cate un singur camp cu numele


merceologului, respectiv categoria de marfa din care face parte marfa.

Pentru o utilizare eficienta, cateva tabele au fost indexate dupa diferite


campuri.

Tabelele din baza de date care vor fi utilizate, sunt prezentate in imaginea
urmatoare.

Pentru aceste tabele, se pot construi forme in cateva variante. Dintre aceste
variante le vom prezenta doar pe cele mai simple, urmand ca cei care doresc sa
aprofundeze mecanismul de construire al formelor sa incerce singuri.
In imagine am creat pentru tabelul AntetFactura forma in mod automat.
Aceasta este prezentata si se salveaza sub numele pe care il dam asa cum se vede in
imaginea urmatoare.

O alta modalitate pentru a crea o forma este aceea in care utilizatorul


precizeaza campurile care doreste sa apara in forma si specifica modul in care
acestea sunt dipuse in forma (coloana sau tabel).

In cele ce urmeaza vom relua crearea formei pentru AntetFactura in care


vom prelua in forma toate campurile din tabel iar configuratia formei va fi de
prezentare a datelor in coloane.
Forma a fost creata cu Form Wizard si a fost legata de tabelul
AntetFactura. Pasii de creare sunt parcursi, prin clic pe Next si in final pe Finish.
Forma ne va fi prezentata si daca este cazul putem sa facem modificari in ea inainte
de a o salva.

Forma aferenta detaliului facturii, va fi prezentata sub forma de coloane


pentru a ilustra cat mai bine imaginea documentului (factura) de pe care se preiau
datele.

Forma aferenta detaliului facturii, va fi prezentata sub forma de coloane


pentru a ilustra cat mai bine imaginea documentului (factura) de pe care se preiau
datele. Imaginile urmatoare prezinta cativa dintre pasii care trebuie urmati.
Deoarece in cele ce urmeaza, campul NrFactura din forma
frmDetaliuFactura este camp de legatura si utilizatorul nu are de ce sa-l modifice,
ci trebuie sa-l vada, va fi numai vizualizat fara ca utilizatorul sa-l poata modifica. In
acest sens, inainte de a salva forma, vom face modificari in proiectarea ei. Imaginile
urmatoare ilustreaza acest lucru.
Prin pozitionarea proprietatii Enabled pe No, campul NrFactura va fi deci
vizibil pentru utilizator, acesta nu il va putea modifica (in cadrul formei
frmDetaliuFactura).

Obiectivul nostru este acela de a prezenta intr-o maniera simpla utilizarea


formei si subformei care in cazul facturii se va concretiza in definirea in cadrul
formularului frmAntetFactura a subformei frmDetaliuFactura. Legatura intre
forma si subforma se va face prin intermediul campului comun NrFactura, care in
forma este Master Field (cheie principala in tabelul AntatFactura) iar in
subforma este Child Field (cheie secundara in tabelul DetaliuFactura).

Pentru aceasta vom deschide in proiectare frmAntetFactura si vom adauga


un control Subform/Subreport caruia la proprietati ii vom atasa subforma
frmDetaliuFactura.
Controlului subformei ii vom da numele sfrmDetFact si proprietatii Object Source
ii vom da valoarea frmDetaliuFactura si in mod automat legatura intre forma si
subforma se va face prin intermediul campului NrFactura.
In acest moment avem formularul frmAntetFactura care contine ca
subformular frmDetaliuFactura.

Dupa ce o ajustam putin, ca sa avem o imagine agreabila a formularului il


deschidem si avem o imagine completa a acestuia.

Vom face cateva comentarii relativ la imaginea de mai sus. In prrimul rand,
observam ca infatisarea formei frmAntetFactura, aduce cu forma documentului
factura utilizat in mod curent, pe forma aparand atat datele din antetul facturii cat si
datele relativ la marfurile vandute cu factura. Se impun urmatoarele observatii:
 in subformular, campul NrFactura este vizibil, dar nu este accesibil;
 pentru o factura sunt afisate toate randurile aferente ei;
 pentru a introduce informatii in campul CodMarfa avem un Combo Box care
afisaza atat codul marfii cat si denumirea ei;
 avem doua navigatoare printre inregistrari:
- unul printre inegistrarile tabelului DetaliuFactura (cel care este situat mai
sus in imagine);
- altul printre inregistrarile tabelului AntetFactura (cel care este situat mai
jos in imagine).
Vom mai construi cateva forme pentru a ilustra si alte facilitati. Prima dintre acestea
este introducerea unui camp calculat valoare in forma frm1DetFact.

Am definit in subsolul formei de mai sus un control calculat in care vom


avea totalul facturii. Se observa modul in care se atribuie valori unui control calculat
in proprietatea Control Source se completeaza expresia care trebuie calculata:

= [Cantitate]*[Pret]

Am introdus o functie SUM care permite insumarea in forma a tuturor valorilor


aferente unei facturi. Observam ca acest control este plasat in subsolul subformei.

Tot aici se impune sa precizam inca odata faptul ca avand forma si


subforma, pentru o factura data (prin numarul sau) se vor afisa toate inregistrarile
din subforma care sunt aferente numarului de factura din forma.

Tot aici se impune sa precizam inca odata faptul ca avand forma si


subforma, pentru o factura data (prin numarul sau) se vor afisa toate inregistrarile
din subforma care sunt aferente numarului de factura din forma.

Daca deschidem forma frm1AntFact vom avea urmatorul continut:


Aici observam ca pe fiecare rand avem calculata valoarea marfii in controlul
calculat Valoare iar in controlul calculat Total fact avem totalul facturii in orice
moment in timpul introducerii datelor.

Nu am epuizat modalitatile de creare a formelor si subformelor, existand mai


multe posibilitati fata de ce s-a prezentat aici. Pentru exemplificare, vom relua intr-o
alta maniera de prezentare construirea unui formular cu subformular.

Sa consideram formele frmAntetFac

si frmDetaFact, in care dupa cum se observa, nu avem campul numarul facturii,


pentru faptul ca acest camp il avem in forma precedenta si va constitui campul de
legatura asa cum de fapt s-a vazut in exemplele prezentate anterior. Vom construi in
forma anterioara antetul facturii, subformularul detaliu factura dar intr-o alta
modalitate, asa cum se va vedea in imaginile urmatoare.
In forma frmAtetFac, inseram subformularul frmDetaFact, astfel:

Dupa care ne apare solicitarea de a preciza de unde dorim sa luam forma sacr va
consitui subformularul.
De unde precizam ca dintre formele existente alegem frmDetaFact, dupa care
suntem invitati sa precizam cum stabilim legatura intre forma si subforma.

Din informatiile pe careAccess le are, ne sugereaza doua alternative daca optam


pentru a alege din lista (definirea de catre utilizator a fost ilustrata in exemplele
precedente):
 prima bazata pe campul NrFactura, comun in cele doua forme, acesta este
campul pe baza caruia vom stabili legatura si in plus, ni se vor arata toate
inregistrarile din detaliu factura care corespund unei inregistrari din antet factura
(unei valori din campul NrFactura);
 a doua cand nu avem practic nici o legatura intre cele doua forme, pe care o
lasam pentru a fi elucidata de catre cititor,.

Dupa ce salvam forma frmAntetFac, si o deschidem, aceasta va arata astfel:

S-ar putea să vă placă și