Tabel, inregistrare, camp — si de ce farmacia foloseste trei tabele legate
Fiecare rand se numeste inregistrare — un exemplar complet de date (de exemplu, tot ce stim despre un produs anume).
Fiecare coloana se numeste camp — o singura categorie de informatie, aceeasi pentru toate randurile (de exemplu, coloana Pret contine numai preturi).
Daca ai pune totul intr-un singur tabel de "intrari marfa", ar trebui sa rescrii denumirea furnizorului si adresa lui la fiecare livrare, si denumirea produsului si pretul de vanzare la fiecare rand. Orice greseala de scriere (o virgula in plus, un pret vechi copiat din greseala) creeaza exact confuzia din caietul de hartie: acelasi produs cu preturi diferite scrise in locuri diferite.
Produse — un singur rand pentru fiecare produs din nomenclator, cu pretul lui actual.
Furnizori — un singur rand pentru fiecare firma de la care se cumpara marfa.
Intrari — un rand pentru fiecare livrare (receptie) — ce produs, de la ce furnizor, in ce lot, cu ce data de expirare.
Tabelul Intrari "citeste" datele produsului si ale furnizorului din celelalte doua tabele, in loc sa le copieze. Detaliem fiecare tabel in atomii urmatori.
Tabelul Produse — nomenclatorul farmaciei
cod_produs — cod intern unic (cheia primara), ex: P0001
denumire_produs — denumirea comerciala afisata pe raft si pe bon
forma_farmaceutica — ex: comprimate, sirop, unguent, solutie
unitate_masura — ex: cutie, flacon, tub
pret_amanuntul — pretul de vanzare actual, in lei
stoc_minim — cantitatea sub care produsul trebuie recomandat spre comanda
cod_produs = P0001 · denumire_produs = "Exemplu produs A" · forma_farmaceutica = "comprimate" · unitate_masura = "cutie" · pret_amanuntul = 12,50 · stoc_minim = 20
In tabelul Produse exista un singur pret actual pentru fiecare produs — nu unul pentru fiecare livrare. Pretul se actualizeaza pe randul produsului cand se schimba; istoricul livrarilor (cu pretul de achizitie al fiecarui lot) sta in alt tabel, Intrari, pe care il vedem in atomul 4.
Tabelul Furnizori — de la cine se cumpara marfa
cod_furnizor — cod intern unic (cheia primara), ex: F001
denumire_firma — numele firmei furnizoare
cui — codul unic de inregistrare al firmei (text, nu numar)
adresa — adresa sediului sau a depozitului
telefon — numarul de contact (text, nu numar)
email — adresa de e-mail pentru comenzi
cod_furnizor = F001 · denumire_firma = "Exemplu Distributie Farma SRL" · cui = "RO12345678" · adresa = "Str. Exemplu nr. 10" · telefon = "0721000000" · email = "comenzi@exemplu-distributie.ro"
Daca alegi tipul de date Number pentru campul telefon, un numar ca 0721000000 este interpretat ca valoare numerica si zero-ul din fata dispare automat (ramane 721000000), iar numarul nu mai este valid. Solutia: telefonul, ca si CUI-ul, se stocheaza ca Text — un cod de contact, nu o valoare cu care faci calcule.
Tabelul Intrari — fiecare livrare, cu lot si data de expirare
id_intrare — numar generat automat pentru fiecare intrare (cheia primara)
numar_factura — numarul facturii de la furnizor
data_intrare — data la care marfa a fost receptionata
cod_produs — leaga randul de tabelul Produse (ce produs a intrat)
cod_furnizor — leaga randul de tabelul Furnizori (de la cine a intrat)
lot — seria/lotul de fabricatie a marfii primite
data_expirare — data de expirare a acelui lot
cantitate — cate unitati au intrat
pret_achizitie — pretul platit furnizorului pentru o unitate
La o intrare, pret_achizitie = 10,00 lei/bucata (fara TVA). Farmacia aplica intai un adaos comercial (marja de vanzare) de exemplu 25%, apoi TVA de 19% — exact ordinea invatata la lectia C2 (Formule si adaos): intai adaosul, apoi TVA, niciodata invers.
Pasul 1 — pret cu adaos, fara TVA: pret_achizitie × (1 + adaos_comercial ÷ 100) = 10,00 × 1,25 = 12,50 lei
Pasul 2 — pret cu amanuntul, cu TVA: pret_cu_adaos × (1 + TVA ÷ 100) = 12,50 × 1,19 = 14,88 lei
Aceasta valoare de 14,88 lei — nu 12,50 lei, care este doar pretul dupa adaos, inainte de TVA — este cea care se scrie in campul pret_amanuntul din tabelul Produse (atomul 2) — un singur pret actual, actualizat la fiecare schimbare, nu unul separat pentru fiecare intrare.
Cod_produs si cod_furnizor din tabelul Intrari sunt aceleasi coduri care apar ca cheie primara in tabelul Produse, respectiv Furnizori. Aceasta este legatura dintre tabele — se numeste cheie externa (foreign key) — si e motivul pentru care nu mai trebuie rescrisa denumirea produsului sau adresa furnizorului la fiecare livrare.
Cheia primara — identificatorul care nu se repeta niciodata
1. Deschizi tabelul in Design View (clic dreapta pe numele tabelului din panoul din stanga → Design View).
2. Dai clic pe randul cu numele campului pe care il alegi cheie primara (de exemplu cod_produs).
3. Din fila Design a panglicii (ribbon), apesi butonul Primary Key (are o iconita cu o cheita galbena) — sau clic dreapta pe selectorul randului si alegi Primary Key din meniul contextual.
4. Langa numele campului apare simbolul cheitei, semn ca acel camp este acum cheia primara a tabelului.
Pentru tabelul Intrari, unde nu exista niciun cod natural care sa fie mereu unic, se foloseste tipul de date AutoNumber: Access genereaza singur un numar nou (1, 2, 3, ...) la fiecare inregistrare noua, fara sa fie nevoie sa il scrii tu. Campul id_intrare din atomul 4 este exact acest tip de cheie.
Alegerea campului denumire_produs ca si cheie primara. Problema: doua produse diferite pot avea denumiri scrise identic din greseala (spatiu in plus, litera mare/mica diferita nu se vede cu ochiul liber), sau denumirea comerciala a unui produs se poate schimba in timp — iar o cheie primara nu ar trebui sa se schimbe niciodata. Solutia sigura este un cod intern stabil (cod_produs) sau un AutoNumber.
Tipurile de date — fiecare camp isi are tipul lui
Short Text — text scurt (pana la 255 caractere), folosit si pentru coduri care "arata" a numar dar nu se calculeaza cu ele: denumire_produs, forma_farmaceutica, unitate_masura, cod_produs, denumire_firma, cui, adresa, telefon, email, cod_furnizor, numar_factura, lot
Number — valori numerice cu care se fac calcule: cantitate, stoc_minim
Currency — valori banesti, stocate cu precizie de pana la patru zecimale (afisate implicit cu doua): pret_amanuntul, pret_achizitie
Date/Time — date calendaristice: data_intrare, data_expirare
AutoNumber — numar generat automat, unic: id_intrare
Yes/No — o singura alegere din doua variante, ex: un camp "produs_activ" care arata daca produsul mai este inca in nomenclatorul curent
Daca stochezi pretul ca Short Text, Access sorteaza valorile alfabetic, nu numeric: sirul "12", "2", "9" apare in aceasta ordine (pentru ca cifra "1" vine inaintea lui "2" si a lui "9" alfabetic), desi numeric 2 < 9 < 12. In plus, nu poti face nicio suma sau medie pe un camp text. Solutia: campurile cu care faci calcule sau sortari numerice folosesc mereu Number sau Currency, niciodata Short Text.
Recapitulare si conexiuni
Produse (cheie primara: cod_produs) — denumire, forma farmaceutica, unitate de masura, pret_amanuntul, stoc_minim
↑↓ legat prin cod_produs
Intrari (cheie primara: id_intrare, AutoNumber) — numar_factura, data_intrare, cod_produs, cod_furnizor, lot, data_expirare, cantitate, pret_achizitie
↑↓ legat prin cod_furnizor
Furnizori (cheie primara: cod_furnizor) — denumire_firma, cui, adresa, telefon, email
Acum ca stii cum arata cele trei tabele, in lectia urmatoare vei invata cum se completeaza efectiv un formular de receptie cand soseste marfa noua si ce validari se aplica la introducerea datelor, astfel incat sa nu poti salva din greseala un lot fara data de expirare sau o cantitate negativa.
Rand = inregistrare, coloana = camp.
Trei tabele, trei roluri: Produse (nomenclator si pret actual), Furnizori (contacte), Intrari (istoricul livrarilor, cu lot si expirare).
Cheia primara: unica, niciodata goala, niciodata schimbata — nu alege un nume ca cheie primara, alege un cod stabil sau un AutoNumber.
Tipul de date potrivit: Currency pentru preturi, Date/Time pentru date calendaristice, Short Text pentru coduri si nume, chiar daca "arata" a numar (cui, telefon).