De ce iti trebuie trei tabele, nu unul singur
Clienti — un rand pentru fiecare client, o singura data.
Vehicule — un rand pentru fiecare masina, legat de clientul ei printr-o cheie straina.
Interventii — un rand pentru fiecare reparatie, legat de vehiculul respectiv printr-o alta cheie straina.
Fiecare informatie sta o singura data, in tabelul ei potrivit, iar legaturile intre tabele se fac prin campuri de tip cheie straina — un camp care nu contine date noi, ci doar valoarea cheii primare dintr-un alt tabel.
Daca la fiecare interventie noua retastezi numele clientului de mana, e usor sa scrii o data "Popescu Ana" si alta data "Popescu A." — pentru calculator sunt doi clienti diferiti, si un raport care numara "cati clienti distincti ai avut luna asta" iti va da un numar gresit, mai mare decat realitatea. Legatura prin cheie straina elimina complet acest risc: numele se scrie o singura data, in tabelul Clienti, iar restul tabelelor doar il refera prin numar.
Proiectarea celor trei tabele
1. Din tab-ul Create, apesi Table Design (nu butonul simplu "Table" — acela deschide direct foaia de date, fara sa-ti lase timp sa alegi tipurile de campuri).
2. Pe fiecare rand nou scrii numele campului si alegi tipul de date (Data Type) din lista derulanta, dupa listele de mai jos (Short Text, Number, Date/Time, Long Text sau Currency).
3. Dai clic-dreapta pe randul campului AutoNumber (id_client, id_vehicul sau id_interventie, dupa caz) si alegi Primary Key — apare o cheita galbena in fata randului, semn ca acel camp e acum cheia primara a tabelului.
4. Pentru un camp Number folosit ca cheie straina (id_client in Vehicule, id_vehicul in Interventii), dai clic pe rand si, jos in panoul Field Properties, la proprietatea Field Size alegi Long Integer — este aceeasi marime pe care o are automat campul AutoNumber din tabelul parinte; daca alegi alta marime (de exemplu Integer), Access refuza mai tarziu sa creeze relatia dintre cele doua tabele (atomul urmator).
5. Salvezi tabelul cu Ctrl+S si ii dai numele lui (Clienti, Vehicule sau Interventii).
Repeti pasii 1-5 pentru fiecare din cele trei tabele, cu campurile exacte din listele de mai jos.
id_client — AutoNumber, cheie primara (Access genereaza numarul singur, la fiecare client nou)
nume — Text scurt
telefon — Text scurt (nu Number! — un numar de telefon poate incepe cu 0722, iar tipul Number ar sterge zero-ul din fata, exact ca la codurile de piese din lectia despre incarcarea bazei)
id_vehicul — AutoNumber, cheie primara
id_client — Number (Long Integer), cheie straina spre Clienti.id_client
nr_inmatriculare — Text scurt (ex. NT-45-XYZ)
marca — Text scurt (ex. Dacia, Renault, Volkswagen)
model — Text scurt (ex. Logan, Clio, Golf)
id_interventie — AutoNumber, cheie primara
id_vehicul — Number (Long Integer), cheie straina spre Vehicule.id_vehicul
data_interventie — Date/Time
descriere — Text lung (Long Text), pentru ce s-a lucrat efectiv
cost_manopera — Number, format cu 2 zecimale (sau Currency)
cost_piese — Number, format cu 2 zecimale (sau Currency)
Daca un camp dintr-un tabel poarta acelasi nume (sau un nume asemanator) cu campul cheie primara al altui tabel si contine numere care se repeta (fiindca acelasi client are mai multe masini, sau aceeasi masina are mai multe interventii), este aproape sigur o cheie straina. Cheia primara insa nu se repeta niciodata in tabelul ei — fiecare valoare apare o singura data.
Crearea relatiilor intre tabele
1. Din tab-ul Database Tools, apesi butonul Relationships.
2. Daca fereastra de adaugare a tabelelor nu apare singura, apesi butonul Show Table si adaugi tabelele Clienti, Vehicule si Interventii in spatiul de lucru.
3. Tii apasat clic pe campul id_client din tabelul Clienti si tragi peste campul id_client din tabelul Vehicule, apoi lasi butonul mouse-ului.
4. In fereastra Edit Relationships care apare, bifezi Enforce Referential Integrity, apoi apesi Create.
5. Repeti acelasi pas intre id_vehicul din Vehicule si id_vehicul din Interventii.
Intre cele doua tabele apare o linie, cu cifra 1 langa tabelul care are cheia primara (Clienti) si simbolul infinit ∞ langa tabelul care are cheia straina (Vehicule) — asta arata ca un client poate avea mai multe vehicule, dar fiecare vehicul apartine unui singur client. Acelasi tipar (1 la ∞) se repeta intre Vehicule si Interventii.
Daca uiti sa bifezi Enforce Referential Integrity, relatia tot se deseneaza pe ecran, dar nu opreste nimic — poti introduce in continuare un vehicul cu un id_client care nu exista in Clienti. Cum recunosti problema: apar inregistrari "orfane" (un id_client in Vehicule fara niciun rand corespunzator in Clienti), iar interogarile care combina cele doua tabele (join) lasa pur si simplu afara acele randuri, fara nicio eroare vizibila — rezultatul pare corect, dar lipsesc date.
Introducerea datelor de test
Clienti: 1 — Ionescu Mihai (0722 111 222); 2 — Popescu Ana (0733 222 333); 3 — Georgescu Ion (0744 333 444)
Vehicule: 1 — B-123-ABC, Dacia Logan, id_client 1; 2 — NT-45-XYZ, Volkswagen Golf, id_client 2; 3 — NT-77-DEF, Renault Clio, id_client 3
Interventii din martie 2026:
03.03.2026 — vehicul 1 (B-123-ABC) — schimb placute frana — manopera 80,00 lei, piese 145,00 lei
10.03.2026 — vehicul 2 (NT-45-XYZ) — schimb ulei si filtre — manopera 60,00 lei, piese 180,00 lei
18.03.2026 — vehicul 1 (B-123-ABC) — revizie curea de distributie — manopera 250,00 lei, piese 480,00 lei
27.03.2026 — vehicul 3 (NT-77-DEF) — inlocuire amortizoare spate — manopera 120,00 lei, piese 320,00 lei
1. In panoul din stanga (Navigation Pane), selectezi tabelul Interventii.
2. Din tab-ul Create, apesi butonul Form — la fel cum ai facut deja pentru Piese_Stoc, in lectia despre operatii pe tabel. Access genereaza automat un formular cu cate o caseta pentru fiecare camp: id_interventie, id_vehicul, data_interventie, descriere, cost_manopera, cost_piese.
3. Salvezi formularul cu Ctrl+S (de exemplu cu numele frmInterventii).
4. Deschizi formularul in modul normal, apesi butonul de inregistrare noua, apoi completezi campurile cu Tab intre ele — la id_vehicul alegi masina din lista (vezi caseta de mai jos), restul campurilor le tastezi normal.
Acest formular este exact "formularul functional prin care poti adauga o interventie noua" cerut la criteriul 9 din fisa de evaluare (atomul 7) — il folosesti si pentru cele patru interventii din martie de mai jos, si pentru orice interventie noua ulterioara.
Ca sa nu tastezi manual numere de id_vehicul pe care nu le tii minte, poti seta campul id_vehicul ca un camp de tip Lookup: in loc de o caseta de text, apare o lista derulanta cu numerele de inmatriculare (sau marca + model), din care alegi vizual masina potrivita. Access retine pe dedesubt id_vehicul-ul corect, corespunzator alegerii tale.
Sunt de fapt doua moduri de a obtine aceasta lista derulanta, si nu sunt acelasi lucru: (1) Lookup setat la nivel de tabel — in Table Design, la proprietatea Data Type a campului id_vehicul alegi asistentul Lookup Wizard; lista apare automat oriunde e folosit campul (formular generat automat, foaia de date a tabelului). (2) Combo box pus manual pe formular — in Design View al formularului, adaugi un control de tip Combo Box doar pe acel formular, fara sa modifici tabelul. Pentru evaluare conteaza doar rezultatul — id_vehicul salvat corect — asa ca oricare din cele doua metode e acceptata.
Daca atelierul are doua masini asemanatoare (de exemplu doua Dacia Logan de la clienti diferiti), e usor sa alegi din greseala vehiculul gresit la o interventie noua. Cum recunosti problema: inainte sa salvezi, verifici mereu campul afisat langa alegerea ta (numarul de inmatriculare, nu doar marca si modelul) — numarul de inmatriculare este singurul identificator care nu se repeta niciodata intre doua masini.
Interogarea care aduna datele pentru raport
1. Din tab-ul Create, apesi Query Design.
2. In fereastra Show Table adaugi tabelele Clienti, Vehicule si Interventii — pentru ca sunt deja legate prin relatii, Access deseneaza singur liniile de legatura intre ele in grila interogarii.
3. Tragi in grila campurile nume (din Clienti), nr_inmatriculare (din Vehicule), data_interventie, cost_manopera si cost_piese (din Interventii).
4. Intr-o coloana goala scrii un camp calculat: Total_interventie: [cost_manopera]+[cost_piese] — numele campului nou, urmat de doua puncte; fiecare nume de camp folosit in formula se scrie intre paranteze drepte, iar semnul + le leaga.
5. Pe randul Criteria al campului data_interventie scrii: Between [De la data:] And [Pana la data:] — asta creeaza o interogare cu parametri: de fiecare data cand ruleaza interogarea (sau un raport construit din ea), Access iti cere sa tastezi cele doua date, in loc sa le fixezi o data pentru totdeauna.
6. Salvezi interogarea cu numele Raport_Lunar. Aici nu apesi butonul Totals — lasi interogarea sa intoarca cate un rand pentru fiecare interventie din perioada aleasa, cu Total_interventie calculat pe randul lui. Motivul: daca ai activa Totals acum, Access ar pune automat Group By pe toate campurile ramase in grila (nume, nr_inmatriculare, data_interventie) — nu doar pe cel pe care crezi ca-l grupezi — si gruparea s-ar face, de fapt, dupa fiecare interventie in parte; niciun rand n-ar mai aduna cele patru sume la un loc. Insumarea reala o faci abia in raport, la subsolul general — vezi atomul urmator.
La rulare, tastezi la "De la data:" valoarea 01.03.2026 si la "Pana la data:" valoarea 31.03.2026. Access aduce cele patru interventii din perioada aleasa, fiecare pe randul ei, cu Total_interventie deja calculat: 80+145=225,00 lei; 60+180=240,00 lei; 250+480=730,00 lei; 120+320=440,00 lei. Interogarea in sine ramane cu cele patru randuri separate, fara un total unic afisat aici — suma lor, 225+240+730+440 = 1.635,00 lei, o vezi abia in raportul construit peste aceasta interogare, la subsolul general (Report Footer), pe care il construiesti in atomul urmator.
Daca uiti sa completezi criteriul Between pe data_interventie, interogarea aduna absolut toate interventiile din istoricul intreg al atelierului, nu doar cele din luna ceruta. Cum recunosti problema: suma afisata e mult mai mare decat te-ai astepta pentru o singura luna, iar numarul de randuri din rezultat nu se potriveste cu numarul de interventii pe care ti le amintesti din luna respectiva.
De la interogare la raportul tiparibil
1. Selectezi interogarea Raport_Lunar in panoul din stanga (Navigation Pane).
2. Din tab-ul Create, apesi Report Wizard.
3. Alegi toate campurile pe care vrei sa le vezi in raport (nume client, nr_inmatriculare, data_interventie, Total_interventie), apoi apesi Next.
4. Alegi gruparea dupa nr_inmatriculare, ca sa vezi interventiile adunate pe fiecare masina in parte, apoi Next.
5. La pasul de sortare, alegi sortare crescatoare dupa data_interventie, apoi Finish.
Raport_Lunar (interogarea din spatele raportului) are doi parametri, [De la data:] si [Pana la data:], pusi acolo la pasul 5 din atomul anterior. Un raport construit peste o interogare parametrizata mosteneste acei parametri — asa ca de fiecare data cand deschizi raportul (nu doar prima data, ci de fiecare data), Access iti va cere din nou cele doua date, exact ca la interogare. Nu e o stricaciune: asa functioneaza corect un raport lunar reutilizabil, caruia ii schimbi luna de fiecare data cand il rulezi.
Deschizi raportul in vederea Design View. In sectiunea Report Footer (subsolul intregului raport, nu al fiecarei pagini), plasezi o caseta text noua si ii setezi proprietatea Control Source la =Sum([Total_interventie]). Pentru ca interogarea Raport_Lunar nu are randul Totals activat (ai lasat-o pe randuri "detaliu", una pe interventie — vezi atomul anterior), campul din interogare se numeste exact Total_interventie, deci formula il gaseste direct, fara sa fie nevoie sa redenumesti nimic. Cand deschizi raportul in modul normal, aceasta caseta aduna toate randurile listate si afiseaza automat suma lor — in exemplul nostru, 1.635,00 lei.
Daca pui caseta cu formula =Sum(...) in sectiunea greasita (de exemplu in antetul de grup, in loc de Report Footer), fie primesti o eroare, fie vezi doar subtotalul unui singur grup repetat, nu totalul general al raportului. Cum recunosti problema: numarul afisat e prea mic fata de suma pe care ai calculat-o singur si nu corespunde cu totalul din interogare.
Recapitulare: fisa de evaluare a aplicatiei finale
Fisa de evaluare — DA / NU
| Criteriu de evaluare | DA / NU |
|---|---|
| Exista cele trei tabele — Clienti, Vehicule, Interventii — fiecare cu camp AutoNumber, cheie primara | ____ |
| Tabelul Vehicule are campul id_client, de tip Number, folosit ca cheie straina spre Clienti | ____ |
| Tabelul Interventii are campul id_vehicul, de tip Number, folosit ca cheie straina spre Vehicule | ____ |
| Campurile numerice (cost_manopera, cost_piese) au tip de date Number sau Currency, nu Text | ____ |
| Campul data_interventie are tipul de date Date/Time, nu Text | ____ |
| Campul telefon din Clienti este Text scurt, nu Number (nu pierde zerourile din fata) | ____ |
| Relatiile dintre cele trei tabele sunt create in fereastra Relationships, cu Enforce Referential Integrity bifat | ____ |
| Fiecare tabel are cel putin datele de test introduse in lectie (3 clienti, 3 vehicule, 4 interventii) | ____ |
| Exista un formular functional prin care poti adauga o interventie noua, legata corect de vehiculul ei | ____ |
| Interogarea Raport_Lunar cere prin parametri intervalul de date (De la data / Pana la data) | ____ |
| Interogarea calculeaza corect Total_interventie = cost_manopera + cost_piese pentru fiecare rand | ____ |
| Caseta =Sum([Total_interventie]) din Report Footer afiseaza suma corecta a perioadei alese, verificata manual macar o data | ____ |
| Exista un raport (obiect Report) generat din interogare, grupat pe vehicule, cu un total general in Report Footer | ____ |
Fiecare "NU" iti arata exact ce trebuie reparat inainte de predare — nu e un motiv de descurajare, ci o lista de lucru. O aplicatie gata de predat are toate cele 13 criterii bifate cu DA. Daca ai un singur "NU" la relatii sau la interogare, restul lucrarii (formularul, datele) ramane valabil — repari doar acel punct si verifici din nou.
Structura pe care ai construit-o azi — client, masina legata de client, interventie legata de masina — este exact tiparul folosit si de aplicatiile profesionale de gestiune service auto. Diferenta dintre o fisa scrisa de mana si o baza de date bine legata nu e doar viteza de cautare, ci si faptul ca datele raman corecte si consistente chiar si dupa sute de interventii introduse de mai multi oameni, in luni diferite.