De la tabel la raspuns — ce e o interogare
Produse — un rand pentru fiecare produs din nomenclator: cod_produs (cheia primara), denumire_produs, forma_farmaceutica (ex: comprimate, sirop, unguent, solutie), unitate_masura, pret_amanuntul, stoc_minim.
Intrari — un rand pentru fiecare livrare: id_intrare (cheia primara), numar_factura, data_intrare, cod_produs (leaga randul de Produse), cod_furnizor (leaga randul de Furnizori), lot, data_expirare, cantitate, pret_achizitie.
Observatie importanta: tabelul Produse NU are un camp gata scris cu stocul curent, si nici cu data de expirare — acelea tin de fiecare livrare in parte si stau in Intrari (acelasi produs poate avea mai multe loturi, cu date de expirare diferite). De aceea, cand o interogare de gestiune are nevoie si de denumirea produsului (din Produse), si de lot sau data de expirare (din Intrari), trebuie sa adaugi AMBELE tabele in interogare — Access le leaga automat prin cod_produs, relatia definita inca de la lectia 1.
Din ribbon, fila Create (Creare) → grupul Queries → Query Design (Proiectare interogare). In fereastra de alegere a surselor adaugi tabelul de care ai nevoie — de exemplu Produse, sau Produse si Intrari deodata, daca ai nevoie de campuri din amandoua. Te afli acum in Design View: fereastra de proiectare, cu lista campurilor disponibile pentru fiecare tabel adaugat (Field List) in partea de sus, si grila de proiectare (Query By Example, prescurtat QBE) in partea de jos. Grila are randuri cu rol fix: Field — numele campului afisat pe acea coloana; Table — din ce tabel vine; Sort — daca si cum se sorteaza; Show — daca acea coloana apare in rezultat; Criteria — conditia pe care trebuie sa o indeplineasca randul; or (si randurile de sub el) — conditii alternative, combinate cu SAU fata de randul Criteria. Dubla-clic pe un camp din Field List il adauga pe o coloana noua in grila. Rulezi interogarea cu butonul Run (semnul "!" rosu) din ribbon — rezultatul apare in Datasheet View, ca un tabel obisnuit, dar filtrat sau calculat dupa ce ai cerut tu.
Loturi expirate sau aproape expirate
Loturi deja expirate — sub coloana data_expirare, in randul Criteria, scrii: <Date() — inseamna "orice data mai mica (mai veche) decat astazi".
Loturi aproape expirate (in urmatoarele 30 de zile) — sub coloana data_expirare scrii: Between Date() And Date()+30 — inseamna "orice data cuprinsa intre astazi si astazi plus 30 de zile", inclusiv capetele intervalului.
Atunci Date() = 10.03.2026, iar Date()+30 = 09.04.2026. Patru loturi din tabelul Intrari:
Lot A, data_expirare 01.02.2026 → mai veche decat 10.03.2026 → apare la "deja expirate" (<Date()).
Lot B, data_expirare 25.03.2026 → cade intre 10.03.2026 si 09.04.2026 → apare la "aproape expirate".
Lot C, data_expirare 15.04.2026 → depaseste 09.04.2026 → nu apare in niciuna dintre cele doua interogari, e inca prea departe.
Lot D, data_expirare 09.03.2026 → cu o zi inainte de 10.03.2026 → apare la "deja expirate".
Create → Query Design → adaugi tabelele Produse si Intrari (ca sa ai si denumirea produsului, nu doar codul lui) → adaugi coloanele denumire_produs, lot, data_expirare → sub data_expirare, in Criteria, scrii criteriul dorit → Run. Poti salva interogarea cu Ctrl+S si un nume clar, de exemplu InterogareExpirate, ca sa o rulezi din nou oricand fara sa o construiesti de la zero.
Stoc sub minim — o interogare peste alta interogare
Create → Query Design → adaugi tabelul Intrari → adaugi coloana cod_produs → adaugi coloana cantitate → in ribbon, grupul Show/Hide → butonul Totals (simbolul Σ) — apare randul nou Total in grila → sub cod_produs, in Total, ramane Group By; sub cantitate, schimbi din Group By in Sum, si redenumesti coloana in randul Field: StocCurent: cantitate → Run. Salvezi interogarea cu numele StocPeProdus.
Create → Query Design → in fereastra de alegere a surselor, fila Queries: adaugi StocPeProdus; fila Tables: adaugi si Produse — Access le leaga automat prin cod_produs, campul comun → adaugi coloanele denumire_produs si stoc_minim (din Produse) si StocCurent (din StocPeProdus) → sub StocCurent, in Criteria, scrii: <[stoc_minim] → Run. Parantezele drepte [ ] spun Access-ului ca stoc_minim este numele unui alt camp din interogare, comparat rand cu rand, nu un text oarecare.
Produs, StocCurent, stoc_minim, rezultat:
Paracetamol 500mg (comprimate) — StocCurent 12, stoc_minim 20 → 12<20 → apare (trebuie comandat)
Fastum gel (unguent) — StocCurent 300, stoc_minim 100 → 300<100 este fals → nu apare
Ser fiziologic (solutie) — StocCurent 8, stoc_minim 15 → 8<15 → apare (trebuie comandat)
Augmentin (sirop) — StocCurent 25, stoc_minim 25 → 25<25 este fals (sunt egale) → nu apare
Valoarea stocului pe forma farmaceutica — interogare de totalizare
StocPeProdus (interogarea salvata la atomul anterior), legata cu Produse, ca sa ai la un loc StocCurent, pret_amanuntul si forma_farmaceutica.
1. Create → Query Design → fila Queries: adaugi StocPeProdus; fila Tables: adaugi si Produse (se leaga automat prin cod_produs).
2. Adaugi coloana forma_farmaceutica (din Produse).
3. Intr-o coloana noua, in randul Field, scrii un camp calculat: ValoareStoc: [pret_amanuntul]*[StocCurent] — numele dinaintea celor doua puncte (ValoareStoc) devine titlul coloanei in rezultat, iar formula de dupa calculeaza pretul de vanzare inmultit cu stocul curent, pentru fiecare produs.
4. In ribbon, grupul Show/Hide → butonul Totals (simbolul Σ) — apare randul nou Total in grila.
5. Sub coloana forma_farmaceutica, in randul Total, lasi Group By (grupeaza dupa aceasta forma farmaceutica).
6. Sub coloana ValoareStoc, in randul Total, schimbi din Group By in Sum (aduna valorile din fiecare grup).
7. Run. Salvezi interogarea, de exemplu ca ValoareStocPeForma.
Forma farmaceutica comprimate: Produs 1 (pret_amanuntul 3,20 lei, StocCurent 150 buc) → 3,20 × 150 = 480,00 lei; Produs 2 (pret_amanuntul 5,00 lei, StocCurent 80 buc) → 5,00 × 80 = 400,00 lei. Total forma farmaceutica = 480,00 + 400,00 = 880,00 lei.
Forma farmaceutica unguent: Produs 3 (pret_amanuntul 12,50 lei, StocCurent 40 buc) → 12,50 × 40 = 500,00 lei (singurul produs din grupa, deci totalul e chiar aceasta valoare).
Interogarea de totalizare va afisa exact doua randuri: comprimate — 880,00 lei si unguent — 500,00 lei, indiferent cate produse individuale sunt in spatele fiecarei sume.
De la interogare la raport tiparibil
1. In ribbon, fila Create → grupul Reports → Report Wizard.
2. La "Tables/Queries" alegi interogarea ValoareStocPeForma, construita la atomul anterior — ea are deja exact un rand pentru fiecare forma farmaceutica, cu totalul calculat.
3. Muti in coloana "Selected Fields" campurile forma_farmaceutica si ValoareStoc, apoi Next.
4. La pasul de grupare (grouping levels) NU adaugi niciun nivel — datele sunt deja un singur rand pe forma farmaceutica, un nivel de grupare suplimentar nu ar face nimic util aici — apesi direct Next.
5. La pasul de sortare, alegi sortare descrescatoare dupa ValoareStoc — de data asta sortarea chiar schimba ordinea randurilor din raport (nu exista niciun grup deasupra care sa o anuleze), asa ca cea mai valoroasa forma farmaceutica apare prima.
6. La pasul de layout apar toate cele trei optiuni (Columnar, Tabular, Justified), pentru ca nu ai adaugat niciun nivel de grupare — alegi Tabular (cel mai potrivit pentru un tabel de gestiune), apoi Finish.
7. Raportul se deschide in Print Preview — verifici cum arata, apoi tiparesti cu butonul Print, sau exporti ca PDF cu butonul PDF or XPS din grupul Data al filei Print Preview (sau din External Data → Export → PDF or XPS). Fila File → Print nu ofera export PDF, doar Print, Quick Print si Print Preview.
O interogare tiparita direct din Datasheet View arata ca un tabel brut, fara titlu clar si fara aliniere ingrijita pe pagina — greu de citit si de semnat. Raportul rezolva exact aceasta problema, fara sa recalculezi nimic: foloseste automat datele curente din interogare la fiecare deschidere.
Greseala tipica — numele de camp scris gresit
Daca scrii din greseala <[stoc_min] in loc de <[stoc_minim] in interogarea ProduseSubMinim, interogarea nu da o eroare la salvare — Access nu stie inca daca greseai sau chiar voiai un parametru introdus manual. Abia cand apesi Run, apare o fereastra "Enter Parameter Value" care iti cere sa tastezi tu o valoare pentru "stoc_min". Aceasta fereastra este semnul sigur ca ai un nume de camp gresit scris — Access nu a gasit un camp cu acel nume exact, asa ca a presupus ca e ceva ce vrei sa completezi manual.
Apesi Cancel pe fereastra de parametru (altfel interogarea ruleaza gresit, cu valoarea pe care ai introdus-o manual). Te intorci in Design View, verifici litera cu litera numele campului din criteriu sau din formula, si il compari cu numele exact al coloanei din Field List, panoul din partea de sus a ferestrei de proiectare (aici, campurile venite din Produse sau din StocPeProdus). Corectezi ortografia si rulezi din nou.
Daca la ValoareStoc: [pret_amanuntul]*[StocCurent] scrii gresit [pret_amanuntul] ca [pret_amanunutul], se intampla exact acelasi lucru — o fereastra de parametru la rulare, in loc de calculul asteptat. Verificarea e identica: recitesti cu atentie numele exacte ale campurilor.
Recapitulare — de la date brute la raport de gestiune
Interogare simpla cu criteriu pe data — <Date() pentru expirate, Between Date() And Date()+30 pentru aproape expirate, pe coloana data_expirare din Intrari.
Interogare de totalizare pe un singur tabel — StocPeProdus: Group By pe cod_produs, Sum pe cantitate, redenumit StocCurent.
Interogare construita peste o interogare salvata — ProduseSubMinim: StocPeProdus si Produse, legate prin cod_produs, criteriu <[stoc_minim] sub StocCurent.
Interogare de totalizare pe doua surse legate, cu camp calculat — ValoareStocPeForma: Group By pe forma_farmaceutica, Sum pe ValoareStoc: [pret_amanuntul]*[StocCurent].
Raport tiparibil — Report Wizard pornind de la o interogare deja agregata, cu sortare si layout Tabular.
Interogarea NU modifica niciodata tabelele originale — poti rula si re-rula in siguranta.
Parantezele drepte [NumeCamp] leaga o expresie de un camp real dintr-o interogare sau tabel, chiar daca vine dintr-o sursa diferita de cea totalizata.
Un camp calculat se scrie NumeNou: formula, cu doua puncte dupa numele nou.
O interogare salvata poate deveni sursa altei interogari — util cand ai nevoie sa totalizezi intai, si sa compari sau sa grupezi abia dupa.
Fereastra "Enter Parameter Value" la rulare = aproape sigur un nume de camp scris gresit.
Query = date pe ecran, pentru lucru; Report = document formatat, pentru tiparit si atasat la dosar.