Invatare Atomica

Aplicatie evaluata pentru competenta 2: baza de date a atelierului

De la structura tabelelor legate intre ele, pana la raportul lunar de interventii, cu fisa de evaluare finala cu DA si NU

Progres lectie:
0%
🎯

Obiectivul lectiei

Aceasta este lectia de incheiere a Competentei 2. Nu mai inveti o unealta noua izolata — pui cap la cap tot ce ai exersat pana acum (tabel, camp, cheie primara, sortare, filtrare, formular, import, interogare) intr-o singura lucrare completa: baza de date a unui atelier auto, cu trei tabele legate intre ele, cu date reale introduse de tine, cu o interogare care aduna costurile pe o luna si cu un raport tiparibil. La final primesti o fisa de evaluare cu DA si NU, ca sa-ti verifici singur lucrarea inainte s-o predai — exact cum arata o evaluare reala de competenta.

Dupa aceasta lectie vei putea:

  • Sa proiectezi trei tabele legate intre ele (Clienti, Vehicule, Interventii), fiecare cu cheia lui primara
  • Sa recunosti si sa construiesti o cheie straina, care leaga un tabel de altul fara sa repete datele
  • Sa creezi relatiile dintre tabele in Access si sa activezi integritatea referentiala
  • Sa introduci date de test corecte, respectand legaturile dintre tabele
  • Sa construiesti o interogare parametrizata care aduna costurile dintr-o perioada aleasa de tine
  • Sa generezi un raport tiparibil cu totalul lunar de interventii
  • Sa-ti evaluezi singur lucrarea finala cu o fisa de criterii DA/NU, inainte s-o predai

Incearca singur!

Provocare — inainte sa citesti:

Sefu' de atelier vine la tine luni dimineata si intreaba: "Cate interventii am facut luna trecuta si cat am incasat in total, ca sa stiu ce raportez la contabilitate?" Ai in fata fie un teanc de fise scrise de mana, fie o baza de date organizata pe calculator, cu tabele Clienti, Vehicule si Interventii deja legate intre ele. Scrie mai jos, in cuvintele tale: ce ai face diferit ca sa raspunzi in 2 minute, daca ai avea baza de date gata construita, fata de cazul in care ai avea doar fisele de hartie?

💡 Ai nevoie de un indiciu?

Cu fisele de hartie ai rasfoi un teanc intreg, ai aduna manual pe hartie sau pe calculator si ai risca sa uiti o fisa ratacita. Cu o baza de date bine construita, pui o singura intrebare — "toate interventiile din luna martie" — si aplicatia iti aduna singura suma, in cateva secunde, fara sa gresesti la adunare.

Exact aceasta lucrare o construiesti astazi, pas cu pas, de la tabele pana la raspunsul gata calculat.

1

De ce iti trebuie trei tabele, nu unul singur

Ai lucrat deja cu tabele legate: in lectia despre structura bazei, Interventii se lega de Autovehicule printr-o cheie externa, iar in lectia despre exploatarea bazei ai construit interogari peste doua tabele deodata (Interventii + Piese). Aplicatia de azi duce ideea un pas mai departe — leaga trei tabele intr-un lant (Clienti → Vehicule → Interventii), nu doar doua. Daca ai pune tot intr-un singur tabel de tip Interventii, ai fi nevoit sa retastezi numele si telefonul clientului la fiecare interventie noua a aceluiasi client — date repetate, greu de actualizat (daca clientul isi schimba numarul de telefon, il corectezi in 20 de locuri diferite) si predispuse la greseli de tastare care sparg cautarile ulterioare.
Solutia — trei tabele legate prin chei:

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.

Greseala tipica — si cum o eviti:

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.

2

Proiectarea celor trei tabele

Inainte sa deschizi Access, decizi pe hartie campurile fiecarui tabel, cu tipul de date corect pentru fiecare — o structura buna de la inceput iti economiseste ore de reparat rapoarte gresite mai tarziu.
Pas cu pas — crearea efectiva a unui tabel (Table Design):

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.

Tabelul Clienti:

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)

Tabelul Vehicule:

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)

Tabelul Interventii:

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)

Regula de recunoastere a unei chei straine:

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.

3

Crearea relatiilor intre tabele

A avea campurile de cheie straina in tabele nu e de ajuns — trebuie sa spui explicit aplicatiei ca acele campuri sunt legate intre ele. In Access, aceasta legatura se declara o singura data, in fereastra Relationships, si de atunci aplicatia o foloseste automat de fiecare data cand introduci date sau construiesti o interogare.
Pas cu pas — crearea relatiei Clienti - Vehicule:

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.

Cum arata o relatie corecta pe ecran:

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.

Greseala tipica — si cum o eviti:

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.

4

Introducerea datelor de test

Cu tabelele si relatiile gata construite, urmeaza sa introduci date reale, folosind formularul (asa cum ai exersat in lectia despre incarcarea bazei) — mai intai clientii, apoi vehiculele lor, apoi interventiile. Ordinea conteaza: nu poti adauga o masina inainte sa existe clientul ei in tabelul Clienti, pentru ca integritatea referentiala ar respinge inregistrarea.
Setul de date pe care il vei folosi in restul lectiei:

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

Pas cu pas — formularul pentru interventii noi:

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.

Un camp Lookup pentru confort la tastare:

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.

Greseala tipica — si cum o eviti:

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.

5

Interogarea care aduna datele pentru raport

O interogare (query) poate combina date din mai multe tabele legate, poate calcula un camp nou din alte campuri si poate aduna valori pe grupuri — exact ce iti trebuie pentru intrebarea "cate interventii am facut luna trecuta si cat am incasat".
Pas cu pas — construirea interogarii Raport_Lunar:

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.

Rularea interogarii pentru martie 2026 — exemplu complet:

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.

Greseala tipica — si cum o eviti:

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.

6

De la interogare la raportul tiparibil

Interogarea iti da datele calculate, dar un raport (obiect Report in Access) le aseaza intr-o forma gata de tiparit sau trimis pe email — grupate, cu antet, cu subsol si cu totalul afisat clar la finalul paginii.
Pas cu pas — generarea raportului din interogare:

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.

Atentie — raportul cere cele doua date de fiecare data cand il deschizi:

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.

Adaugarea totalului general in subsol:

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.

Greseala tipica — si cum o eviti:

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.

7

Recapitulare: fisa de evaluare a aplicatiei finale

Aceasta este lucrarea completa pentru Competenta 2: trei tabele legate (Clienti, Vehicule, Interventii), relatii cu integritate referentiala, date reale introduse prin formular, o interogare parametrizata care aduna costurile pe o perioada aleasa si un raport tiparibil cu totalul general. Inainte sa predai aplicatia, parcurge fisa de mai jos si bifeaza onest fiecare criteriu — asa functioneaza si o evaluare reala de competenta.

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____
Cum citesti fisa:

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.

Legatura cu munca reala de atelier:

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.

Exercitii practice

Exercitiul 1 (Nivel minim) — Cheie primara sau cheie straina?

Pentru fiecare camp de mai jos, scrie daca este cheie primara, cheie straina sau niciuna dintre ele, si justifica intr-o propozitie: (a) id_client din tabelul Clienti; (b) id_client din tabelul Vehicule; (c) nume din tabelul Clienti; (d) id_vehicul din tabelul Interventii; (e) descriere din tabelul Interventii.

💡 Verifica-ti raspunsul (barem)

(a) Cheie primara — AutoNumber, identifica unic fiecare client, nu se repeta.
(b) Cheie straina — contine valoarea din id_client al Clienti, se poate repeta (un client poate avea mai multe vehicule).
(c) Niciuna dintre ele — camp obisnuit de tip text; doi clienti pot avea din intamplare acelasi nume, deci nu identifica unic si nu leaga tabele.
(d) Cheie straina — contine valoarea din id_vehicul al Vehicule, se poate repeta (aceeasi masina are mai multe interventii).
(e) Niciuna dintre ele — camp text lung, descriptiv, fara rol de identificare sau legatura intre tabele.

Vezi rezolvarea

Pentru fiecare camp, decizi intai daca valoarea lui identifica unic un rand in tabelul lui (atunci e cheie primara), daca preia valoarea cheii primare din alt tabel (atunci e cheie straina), sau daca e doar o informatie descriptiva:

  1. id_client din Clienti - cheie primara (AutoNumber, unic pentru fiecare client, nu se repeta).
  2. id_client din Vehicule - cheie straina (repeta valoarea din Clienti; se poate repeta, pentru ca un client poate avea mai multe masini).
  3. nume din Clienti - niciuna dintre ele (text obisnuit; doi clienti pot avea din intamplare acelasi nume, deci nu identifica unic si nu leaga tabele).
  4. id_vehicul din Interventii - cheie straina (repeta valoarea din Vehicule; se poate repeta, pentru ca aceeasi masina are mai multe interventii).
  5. descriere din Interventii - niciuna dintre ele (text descriptiv, fara rol de identificare sau de legatura intre tabele).

Exercitiul 2 (Nivel standard) — Raportul pentru aprilie 2026

In aprilie 2026, atelierul a mai facut doua interventii, pe langa cele din martie: pe 05.04.2026, vehiculul 2 (NT-45-XYZ) — schimb bujii — manopera 40,00 lei, piese 60,00 lei; pe 20.04.2026, vehiculul 1 (B-123-ABC) — reparatie sistem de franare — manopera 150,00 lei, piese 260,00 lei. Calculeaza: (a) Total_interventie pentru fiecare dintre cele doua interventii noi; (b) suma totala incasata in aprilie 2026 (doar cele doua interventii de mai sus); (c) media unei interventii in aprilie, cu doua zecimale.

💡 Verifica-ti raspunsul (barem)

(a) 05.04.2026: 40,00 + 60,00 = 100,00 lei. 20.04.2026: 150,00 + 260,00 = 410,00 lei.
(b) Suma totala aprilie 2026: 100,00 + 410,00 = 510,00 lei.
(c) Media: 510,00 : 2 = 255,00 lei.

Vezi rezolvarea

Total_interventie se calculeaza exact ca in interogarea din lectie: cost_manopera + cost_piese.

  1. 05.04.2026 (vehicul 2, schimb bujii): 40,00 + 60,00 = 100,00 lei.
  2. 20.04.2026 (vehicul 1, reparatie franare): 150,00 + 260,00 = 410,00 lei.
  3. Suma totala incasata in aprilie 2026: 100,00 + 410,00 = 510,00 lei.
  4. Media unei interventii: 510,00 : 2 = 255,00 lei.

Aceleasi calcule le-ar face automat interogarea Raport_Lunar daca ai rula-o cu intervalul 01.04.2026 - 30.04.2026, iar caseta =Sum([Total_interventie]) din subsolul raportului ar afisa direct 510,00 lei.

Exercitiul 3 (Nivel performanta) — O piesa poate aparea in mai multe interventii

Atelierul vrea sa stie exact ce piese s-au folosit la fiecare interventie, nu doar costul total de piese. La aceeasi interventie se pot folosi mai multe piese diferite, iar aceeasi piesa (de exemplu Bujie NGK) poate aparea la mai multe interventii diferite, in cantitati diferite — aceasta e o relatie multi-la-multi, spre deosebire de relatiile 1-la-multi pe care le-ai construit azi (Clienti-Vehicule, Vehicule-Interventii). O relatie multi-la-multi nu se poate face cu o singura cheie straina intr-un tabel, ca la Vehicule — are nevoie de un tabel de legatura (junction table), asezat intre cele doua, cu cate o cheie straina spre fiecare.

Reaminteste-ti tabelul Piese_Stoc din lectia despre operatii pe tabel: id_piesa (AutoNumber, cheie primara), denumire, furnizor, pret_achizitie, stoc. Pornind de la acest tabel si de la Interventii, propune un al patrulea tabel, numit Interventie_Piese, care sa le lege: (a) ce campuri ar trebui sa aiba acest tabel, inclusiv un camp pentru cantitatea folosita; (b) explica, in cuvintele tale, de ce ai nevoie aici de un tabel separat si nu poti pune direct o cheie straina in Interventii, ca la Vehicule; (c) care ar fi cheia primara a acestui tabel nou — un AutoNumber propriu, sau o combinatie a celor doua chei straine?

💡 Verifica-ti raspunsul (barem orientativ)

(a) Interventie_Piese ar avea: id_interventie (Number, cheie straina spre Interventii.id_interventie), id_piesa (Number, cheie straina spre Piese_Stoc.id_piesa) si cantitate (Number intreg, cate bucati din acea piesa s-au folosit la acea interventie).
(b) O singura cheie straina in Interventii ar permite legarea unei interventii de o singura piesa. Aici insa o interventie poate folosi mai multe piese si o piesa poate aparea la mai multe interventii — doar un tabel separat, cu cate o pereche (id_interventie, id_piesa) pe fiecare rand, poate reprezenta oricate combinatii intre cele doua.
(c) Ambele variante sunt corecte si acceptate: fie un camp AutoNumber propriu (id_interventie_piesa), fie cheia primara compusa din (id_interventie + id_piesa) impreuna — cu conditia ca perechea sa nu se poata repeta de doua ori pentru aceeasi interventie.

Vezi rezolvarea

Schita de rezolvare, nu solutia gata facuta - gandeste-o intai pe hartie:

  1. Porneste de la cele doua tabele care trebuie legate: Interventii (id_interventie) si Piese_Stoc (id_piesa).
  2. Tabelul de legatura are nevoie de minimum trei campuri: cate o cheie straina spre fiecare tabel parinte, plus un camp propriu al relatiei (cantitatea folosita).
  3. Decide cheia primara: un AutoNumber propriu e mai simplu de administrat; o cheie compusa din cele doua chei straine impiedica direct dublarea aceleiasi perechi, dar trebuie setata manual din ambele campuri.
  4. Capcana: daca pui cheia straina direct in Interventii, ca la Vehicule, poti lega o interventie de o singura piesa - nu rezolva cazul cu mai multe piese diferite pe aceeasi interventie.

Criterii de evaluare: tabelul are exact cele doua chei straine plus cantitatea; explicatia relatiei multi-la-multi foloseste corect exemplul cu o piesa care apare la mai multe interventii; alegerea cheii primare e justificata, nu doar afirmata.

Ce ai invatat astazi

  • Trei tabele legate (Clienti, Vehicule, Interventii) evita repetarea datelor si greselile de tastare la actualizare
  • Cheia straina este un camp care contine valoarea cheii primare dintr-un alt tabel — asa se leaga tabelele intre ele
  • Relatiile se creeaza o singura data in Database Tools > Relationships, cu Enforce Referential Integrity bifat
  • Integritatea referentiala respinge inregistrarile "orfane" — un vehicul sau o interventie legate de ceva inexistent
  • O interogare parametrizata (Between [param] And [param]) cere intervalul de date la fiecare rulare, nu-l fixeaza o data pentru totdeauna
  • Un camp calculat (Total: [camp1]+[camp2]) in interogare, plus o caseta =Sum(...) in Report Footer, aduna automat costurile pe perioada aleasa
  • Un raport (Report Wizard) grupeaza si tipareste datele interogarii, cu totalul general intr-o caseta =Sum(...) in Report Footer
  • Fisa de evaluare cu DA/NU verifica, punct cu punct, ca aplicatia finala respecta toata structura invatata in modulul C2

Vrei mai mult?

Provocare: Cu relatiile din lectie deja create si Enforce Referential Integrity bifat, incearca sa stergi din Clienti pe Popescu Ana (id_client=2), care are vehiculul NT-45-XYZ legat in Vehicule. Noteaza exact mesajul de eroare al Access si ce ar trebui sa stergi INTAI ca sa reusesti stergerea clientului.

  • Intrebare: De ce Access refuza sa stearga un client cu vehicul legat, in loc sa stearga automat si vehiculul (si interventiile lui)? Ce s-ar pierde, ireversibil, daca stergerea in lant ar fi implicita?

Deschidere: Access are o optiune Cascade Delete Related Records care ar permite exact stergerea automata in lant — dar e riscanta si rar activata. Aceeasi grija apare la un sistem bancar, care refuza sa stearga un cont cu tranzactii active, sau la o fisa medicala legata de programari viitoare.

Ai terminat modulul C2. Baze de Date cu Aplicatii Specifice

Aceasta a fost ultima lectie a modulului. Intoarce-te la cuprinsul modulului ca sa revezi orice lectie anterioara, sau continua cu urmatorul modul din programa Scolii de Maistri.

Cuprinsul modulului →