Invatare Atomica

Operatii si incarcare: formular de receptie si import de date

Cum ajung produsele noi corect si curat in baza de date a farmaciei

Progres lectie:
0%
🎯

De ce conteaza aceasta lectie

O baza de date de farmacie este utila doar daca datele din ea sunt corecte. Fiecare cutie de produs care intra pe stoc trebuie inregistrata cu grija: cu termenul ei de valabilitate, cu cantitatea reala, cu lotul corect. O receptie facuta neatent (termen uitat, cantitate negativa, acelasi produs introdus de doua ori sub doua coduri) strica exact zonele in care ai nevoie de incredere totala: alerta de expirare, calculul de stoc, comanda catre depozit. In aceasta lectie inveti pasii concreti prin care datele intra CORECT in baza de date, de la formularul de receptie pana la importul dintr-un fisier trimis de furnizor.

Dupa aceasta lectie vei putea:

  • Sa explici ce este un formular de receptie si de ce se lucreaza prin formular, nu direct in tabel
  • Sa aplici cele doua validari obligatorii la intrarea unui lot: termen de valabilitate prezent si cantitate strict pozitiva
  • Sa recunosti si sa corectezi o inregistrare respinsa de validare, cu exemplu numeric concret
  • Sa descrii pasii de import al unui fisier de la furnizor (CSV/Excel) intr-un tabel de intrari
  • Sa identifici si sa elimini randurile duplicate rezultate dintr-un import repetat
  • Sa recunosti o greseala tipica de incarcare (unitate de masura amestecata) si sa o corectezi

Incearca singur!

Provocare — inainte sa citesti:

Este ora 9 dimineata la farmacie. Soferul de la depozit aduce o cutie cu 15 flacoane de ser fiziologic, lot SF2607, termen de valabilitate 03.2027. Colega ta de la receptie deschide programul de gestiune si trebuie sa introduca aceasta intrare in baza de date, ca de acum produsul sa apara pe stoc si sa poata fi vandut/eliberat. Scrie mai jos, in ordine, ce informatii crezi ca trebuie completate in formularul de receptie inainte ca programul sa accepte inregistrarea, si ce crezi ca s-ar intampla daca colega ta ar lasa necompletat campul de termen de valabilitate.

💡 Ai nevoie de un indiciu?

Gandeste-te ce s-ar intampla peste 6 luni daca acel flacon NU are termen de valabilitate inregistrat: cum ar putea baza de date sa te avertizeze ca produsul e aproape de expirare, daca nu stie deloc cand expira? O baza de date nu "ghiceste" — respinge orice intrare careia ii lipseste o informatie declarata obligatorie, exact ca sa nu ajunga produse "invizibile" pentru sistemul de alerta.

Subiectul lectiei de azi raspunde exact la aceasta intrebare!

1

Formularul de receptie — poarta de intrare a datelor

Un formular este un ecran de introducere a datelor, cu campuri clar etichetate (Produs, Lot, Cantitate, Termen de valabilitate, Furnizor, Pret), pe care aplicatia il foloseste ca sa scrie un rand nou intr-un tabel — in cazul nostru, tabelul de intrari din baza de date a farmaciei. Chiar si un tabel de baza de date are deja o prima linie de aparare: fiecare coloana are un tip de date fix (Text scurt / Numar / Data, vezi Lectia 1), care respinge automat o litera intr-un camp Numar sau un text oarecare intr-un camp Data. Dar tipul de date, singur, nu e de ajuns: un camp Numar accepta la fel de usor 0 sau -20 ca si 3, iar un camp Data poate ramane gol daca nu e marcat separat ca obligatoriu. Formularul adauga exact regulile suplimentare de care mai e nevoie (camp obligatoriu completat, numar strict pozitiv) si le verifica inainte de salvare, aratand mesajul de eroare potrivit langa campul gresit — spre deosebire de a scrie direct in tabel, unde aceste reguli suplimentare nu se verifica automat.
Exemplu — campurile unui formular de receptie de farmacie:

Cod produs — se alege din nomenclatorul deja existent (nu se retasteaza denumirea, ca sa nu apara variante gresite ale aceluiasi produs)
Lot — codul de lot inscris pe ambalaj de producator
Cantitate — numarul de unitati primite in aceasta livrare
Termen de valabilitate — data pana la care produsul poate fi eliberat
Furnizor — de la cine a venit livrarea
Data receptiei — completata automat de aplicatie, cu data curenta

De ce nu se scrie direct in tabel:

Daca ai scrie direct intr-un tabel deschis, ai putea uita o coloana, ai putea scrie textul in coloana gresita, sau ai putea scrie o data intr-un format pe care sistemul nu il recunoaste (ex. "azi" in loc de o data reala). Formularul elimina aceste riscuri: iti arata exact ce trebuie completat, cate un camp, si nu te lasa sa salvezi pana cand campurile obligatorii sunt completate corect.

2

Validare 1 — termenul de valabilitate este obligatoriu

O validare este o regula pe care aplicatia o verifica automat inainte sa accepte o inregistrare, exact ca un control de calitate care opreste o piesa gresita inainte sa iasa pe linia de fabricatie. Prima regula obligatorie la orice intrare de produs farmaceutic: campul Termen de valabilitate nu poate ramane gol.
De ce este exact acest camp obligatoriu:

Baza de date foloseste termenul de valabilitate pentru interogari esentiale de gestiune: "ce loturi expira in urmatoarele 30 de zile?", "ce a expirat deja si trebuie retras?". Daca un singur lot ar avea acest camp gol, acel lot ar deveni invizibil pentru orice raport de expirare — un risc pe care o farmacie nu si-l permite.

Cum arata validarea, pas cu pas:

1. Utilizatorul completeaza formularul si apasa butonul Salveaza.
2. Aplicatia verifica: are randul o valoare in campul Termen de valabilitate?
3. Daca DA — verificarea trece la urmatoarea regula (cantitatea, vezi Atomul 3).
4. Daca NU — aplicatia opreste salvarea si afiseaza un mesaj de eroare langa camp, de exemplu: "Campul Termen de valabilitate este obligatoriu." Randul NU ajunge in tabel pana cand campul nu e completat.

Greseala tipica

O colaboratoare grabita nu gaseste termenul pe cutie si, ca sa treaca de validarea "camp obligatoriu", scrie in campul Termen de valabilitate o data la intamplare, de exemplu 01.2030, in loc sa lase campul gol si sa ceara lamurire. Aplicatia accepta randul pentru ca formatul e o data valida si campul nu e gol — dar data nu corespunde realitatii lotului. La raportul de expirare, acest lot va aparea gresit ca fiind valabil inca multi ani, desi nimeni nu stie de fapt cand expira cu adevarat. Cum se recunoaste: in lista de produse, coloana Termen de valabilitate arata o data nerealista sau foarte indepartata fata de restul livrarilor de la acelasi furnizor (ex. un termen la 4-5 ani distanta, cand produsul are de obicei valabilitate de 2-3 ani), fara nicio corespondenta cu factura sau cu ambalajul fizic. Cum se repara: se cere furnizorului fisa lotului sau se verifica fizic ambalajul, apoi se corecteaza randul cu data reala, in formatul luna.an folosit de aplicatie pentru acest camp (ex. 03.2027).

3

Validare 2 — cantitatea trebuie sa fie strict pozitiva

A doua regula obligatorie: campul Cantitate trebuie sa contina un numar strict pozitiv (mai mare decat zero). "Strict" inseamna ca zero nu este acceptat — o receptie de zero bucati nu este o receptie, e o inregistrare fara sens care nu ar trebui sa existe.
Exemplu numeric complet:

Se receptioneaza un lot de comprimate pentru raceala, cod produs C-0148, lot RC0912, cu 3 cutii introduse de la depozit.
Colega scrie in campul Cantitate: 3. Verificare: 3 > 0 — TRECE. Randul se salveaza in tabelul de intrari.
Daca ar fi scris 0: verificare 0 > 0 este FALS — aplicatia respinge, mesaj: "Cantitatea trebuie sa fie mai mare decat 0."
Daca ar fi scris -3 (tastand din greseala semnul minus): verificare -3 > 0 este FALS — aplicatia respinge la fel.

De ce nu se accepta cantitati negative la receptie:

O cantitate negativa la o intrare de marfa nu descrie o situatie reala — marfa nu poate "intra minus". (Scaderile de stoc, cum ar fi o eliberare catre pacient sau o retragere de lot, se inregistreaza separat, ca operatii de iesire, nu ca o cantitate negativa la receptie.) De aceea validarea de receptie cere strict un numar pozitiv, nu doar "orice numar".

Ordinea validarilor conteaza:

Daca la aceeasi intrare lipseste si termenul de valabilitate, si cantitatea e gresita, aplicatia verifica regulile in ordine (Validarea 1 din Atomul 2, apoi Validarea 2 de aici): se opreste la prima regula incalcata si arata doar acel mesaj de eroare. Utilizatorul corecteaza campul respectiv si apasa din nou Salveaza — abia atunci aplicatia reia verificarea de la inceput si, daca mai exista o a doua eroare (de exemplu cantitatea), o va semnala la aceasta a doua incercare. De aceea e normal sa vezi mesajul de eroare schimbandu-se de la o incercare la alta, in loc sa apara toate erorile deodata.

4

Importul din fisierul furnizorului

Cand depozitul trimite o livrare mare (zeci sau sute de produse), nu este eficient sa se completeze formularul manual pentru fiecare produs. In loc de asta, se foloseste importul: functia programului de gestiune care citeste un fisier (de obicei CSV — un fisier text in care valorile sunt separate prin virgula sau punct-si-virgula, sau un fisier Excel .xlsx) si adauga automat cate un rand in tabelul de intrari pentru fiecare linie din fisier.
Cum arata un fisier CSV trimis de furnizor:

Un fisier CSV este text simplu, deschis in orice editor sau in Excel. O linie de antet arata numele coloanelor, urmata de cate o linie pentru fiecare produs:

livrare_2026-09-02.csv csv
1cod_produs;lot;cantitate;termen_valabilitate;furnizor
2C-0148;RC0912;3;09.2027;FarmaDepo SRL
3C-0201;SF2607;15;03.2027;FarmaDepo SRL
4C-0339;VT1104;8;11.2026;FarmaDepo SRL
Pasii de import, in ordine:

1. Se deschide in aplicatia de gestiune functia Import date (de obicei in meniul Stocuri sau Nomenclator).
2. Se selecteaza fisierul primit de la furnizor (butonul de tip "Alege fisier" / "Browse").
3. Aplicatia arata o previzualizare: cum se potrivesc coloanele din fisier (cod_produs, lot, cantitate, termen_valabilitate) cu campurile din baza de date. Aici se verifica manual ca "termen_valabilitate" din fisier chiar corespunde campului Termen de valabilitate din formular, si nu, de exemplu, cu campul Data receptiei.
4. Se ruleaza un import de proba pe primele cateva randuri, ca sa se vada daca validarile (Atomii 2 si 3) trec pentru acele randuri.
5. Daca proba e curata, se importa tot fisierul. Daca apar erori (ex. un rand fara termen de valabilitate), aplicatia trebuie sa arate exact ce randuri au fost respinse, ca sa fie corectate manual sau retrimise catre furnizor.

Importul TOT trece prin validari:

Un rand adus prin import care nu are termen de valabilitate sau are cantitate 0 trebuie respins de aplicatie exact ca si cum ar fi fost introdus manual prin formular. Importul este doar o alta cale de introducere a datelor — regulile de validare din Atomii 2 si 3 raman aceleasi, indiferent daca datele vin dintr-un formular completat de mana sau dintr-un fisier.

5

Curatarea duplicatelor

Un duplicat este un rand din tabel care repeta o inregistrare deja existenta. La incarcarea datelor, duplicatele apar cel mai frecvent cand acelasi fisier de import este rulat de doua ori (din greseala, sau pentru ca prima incercare a parut ca "nu a mers" si s-a repetat operatia fara sa se verifice ca de fapt reusise).
Exemplu numeric — efectul unui duplicat:

Fisierul livrare_2026-09-02.csv de mai sus a fost importat de doua ori. In tabelul de intrari, produsul C-0148, lot RC0912, apare acum de doua ori, cu cantitate 3 de fiecare data.
Daca aplicatia calculeaza stocul total prin insumarea tuturor intrarilor pentru acel lot, rezultatul gresit va fi 3 + 3 = 6 bucati in loc de 3 bucati reale primite. Stocul afisat este cu 3 bucati mai mare decat marfa aflata fizic pe raft.

Cum se identifica un rand duplicat:

Doua randuri sunt considerate duplicat cand au aceeasi combinatie de cod produs + lot + cantitate + data receptiei. Daca doar codul produsului e la fel dar lotul difera, NU e duplicat — inseamna doua livrari diferite ale aceluiasi produs, o situatie normala si de dorit (produsul se reaprovizioneaza).

Pasii de curatare, in ordine:

1. Se exporta tabelul de intrari din aplicatia de gestiune intr-un fisier Excel (de obicei o functie Export / Export in Excel a programului) — aceasta este o copie de lucru, folosita doar ca sa gasim duplicatele mai usor.
2. In Excel, se sorteaza fisierul exportat dupa cod produs, apoi dupa lot (meniul Data → Sort, cu doua niveluri de sortare), ca sa ajunga alaturate randurile identice pe cod produs + lot + cantitate + data.
3. Excel are si o functie dedicata: se selecteaza tabelul exportat, apoi meniul Data → Remove Duplicates (Elimina duplicate), bifand coloanele cod produs, lot, cantitate si data ca sa fie exact acele coloane comparate.
4. Randurile identificate ca duplicat se sterg din aplicatia de gestiune (nu doar din copia Excel, care era doar pentru identificare) — de obicei printr-o functie de anulare/stergere a intrarii, direct pe randul duplicat din tabelul de intrari.
5. Se recalculeaza stocul si se verifica din nou fata de cantitatea reala numarata pe raft.

Greseala tipica

Se sterge un rand "duplicat" doar pentru ca are acelasi cod de produs cu altul, fara sa se verifice si lotul si cantitatea. Rezultat: se sterge, de fapt, o livrare reala si diferita a aceluiasi produs (alt lot, alt termen de valabilitate), iar stocul acelui lot dispare din baza de date, desi marfa exista fizic pe raft. Cum se recunoaste: dupa "curatare", numarul de bucati din baza de date e mai mic decat cel numarat fizic. Cum se repara: se verifica intotdeauna toate cele patru campuri (cod, lot, cantitate, data) inainte de a sterge un rand ca duplicat, niciodata doar codul de produs.

6

Greseala tipica de incarcare — unitatea de masura amestecata

Validarile invatate la Atomii 2 si 3 verifica forma a datelor (exista o data? este numarul pozitiv?), dar nu pot verifica sensul lor — daca o cifra inseamna un numar de flacoane sau un numar de cutii, aplicatia nu are cum sa stie decat daca i se spune explicit. De aceea, o greseala foarte frecventa la incarcarea datelor de la furnizori diferiti este amestecarea unitatilor de masura.
Exemplu numeric complet:

Ambalajul standard pentru produsul C-0275 (dezinfectant de maini) este de 1 cutie = 10 flacoane. Baza de date a farmaciei tine evidenta stocului in flacoane (unitatea in care se elibereaza produsul).
Furnizorul MedStoc Distribution trimite in fisierul CSV cantitatea 12, insemnand 12 cutii.
Daca cel care importa fisierul nu observa diferenta si lasa cifra 12 asa cum e, baza de date inregistreaza 12 flacoane — desi in depozit au sosit de fapt 12 × 10 = 120 flacoane.
Diferenta: 120 − 12 = 108 flacoane "lipsa" din baza de date, desi marfa exista fizic pe raft.

Cum se recunoaste greseala:

Stocul din aplicatie pare mult mai mic decat cel numarat fizic, de obicei intr-un raport constant (de 10 ori mai mic, de 20 ori mai mic — in functie de cate bucati are ambalajul mare). Daca eroarea apare mereu la produsele de la acelasi furnizor, e un semn clar ca unitatea lor de masura difera de cea a bazei de date.

Cum se repara si cum se previne:

La corectare: se inmulteste cantitatea gresit introdusa cu factorul de conversie corect (in exemplul nostru, ×10) si se rescrie randul. La prevenire: inainte de orice import nou de la un furnizor, se verifica in ce unitate trimite el cantitatile (se intreaba furnizorul sau se verifica pe factura insotitoare) si, daca difera de unitatea folosita in baza de date, se converteste fisierul inainte de import, nu dupa.

7

Recapitulare si conexiuni

Datele intra corect in baza de date a farmaciei fie manual (formular, cu validari), fie in bloc (import dintr-un fisier al furnizorului, cu aceleasi validari). Indiferent de cale, doua reguli obligatorii tin datele curate — termen de valabilitate prezent si cantitate strict pozitiva — iar dupa import se verifica intotdeauna randurile duplicate si unitatile de masura.
Rezumat vizual al fluxului de incarcare:

Sursa datelor (formular completat manual SAU fisier CSV/Excel de la furnizor)
  ↓ trece prin
Validare 1 — termen de valabilitate obligatoriu
  ↓ apoi
Validare 2 — cantitate strict pozitiva
  ↓ randul valid ajunge in
Tabelul de intrari
  ↓ dupa import se verifica
Duplicate (acelasi produs+lot+cantitate+data, aparut de doua ori) si unitatea de masura (flacoane vs. cutii)

Conexiune cu urmatoarea lectie:

Odata ce datele sunt incarcate corect si curate, urmeaza sa le folosim: in lectia urmatoare veti invata cum se exploateaza baza de date printr-un set de interogari utile pentru gestiunea zilnica — produse expirate sau aproape expirate, stoc sub minim, valoarea stocului pe categorie — si cum se genereaza un raport de gestiune tiparibil.

De retinut pentru activitatile practice:

Formularul controleaza datele; introducerea libera intr-un tabel nu.
Termen de valabilitate lipsa = intrare respinsa, intotdeauna.
Cantitate ≤ 0 = intrare respinsa, intotdeauna.
Importul dintr-un fisier trece prin ACELEASI validari ca formularul.
Duplicat = potrivire pe cod produs + lot + cantitate + data, nu doar pe cod produs.
Unitatea de masura a furnizorului se verifica inainte de import, nu se presupune.

Exercitii practice

Exercitiul 1 (Nivel minim) — Trece sau respinge?

Pentru fiecare din urmatoarele patru randuri propuse pentru receptie, spune daca ar trece validarile (termen de valabilitate prezent si cantitate strict pozitiva) sau ar fi respinse, si de ce:
a) cod C-0148, lot RC0912, cantitate 5, termen 09.2027
b) cod C-0201, lot SF2607, cantitate 0, termen 03.2027
c) cod C-0339, lot VT1104, cantitate 8, termen (necompletat)
d) cod C-0410, lot AB1120, cantitate -2, termen 12.2026

Vezi rezolvarea

a) Trece: termenul 09.2027 este completat, iar cantitatea 5 este strict pozitiva (5 > 0). Ambele validari sunt indeplinite.

b) Respins: termenul este completat, dar cantitatea 0 nu trece validarea 2 - regula cere strict mai mare decat 0, iar 0 nu este acceptat.

c) Respins: campul Termen de valabilitate lipseste (necompletat), iar aceasta validare este obligatorie.

d) Respins: cantitatea -2 este negativa, deci nu trece validarea 'cantitate strict pozitiva' - o intrare nu poate fi negativa.

Exercitiul 2 (Nivel standard) — Gaseste duplicatul

In tabelul de intrari al farmaciei apar urmatoarele cinci randuri, dupa un import:
1) C-0148, RC0912, 3, 09.2027, receptie 02.09.2026
2) C-0201, SF2607, 15, 03.2027, receptie 02.09.2026
3) C-0148, RC0912, 3, 09.2027, receptie 02.09.2026
4) C-0148, RC0913, 3, 09.2027, receptie 02.09.2026
5) C-0339, VT1104, 8, 11.2026, receptie 02.09.2026
Care rand (sau randuri) sunt duplicat si trebuie sters? Care rand SEAMANA cu un duplicat dar NU este, si de ce? Motiveaza raspunsul folosind cele patru campuri de comparatie invatate in lectie.

Vezi rezolvarea

Comparatia se face pe patru campuri: cod produs, lot, cantitate si data receptiei.

  1. Randul 3 este duplicat al randului 1: acelasi cod C-0148, acelasi lot RC0912, aceeasi cantitate 3, aceeasi data 02.09.2026 - patru campuri identice. Randul 3 trebuie sters, altfel stocul acestui lot ar fi calculat in plus cu 3 bucati.
  2. Randul 4 seamana cu un duplicat, dar NU este: are acelasi cod C-0148, aceeasi cantitate 3 si aceeasi data, insa lotul difera - RC0913, nu RC0912. Este o livrare reala dintr-un lot diferit si trebuie pastrat.

Exercitiul 3 (Nivel performanta) — Corecteaza fisierul de import

Baza de date a farmaciei tine stocul de comprimate in blistere. Un furnizor nou trimite fisierul de livrare cu cantitatile exprimate in cutii, unde 1 cutie = 6 blistere. Fisierul primit este:
cod_produs;lot;cantitate;termen_valabilitate;furnizor
C-0512;PN0815;4;01.2027;MedExpress SRL
C-0518;PN0820;7;02.2027;MedExpress SRL
Calculeaza cate blistere ar trebui sa apara REAL in baza de date pentru fiecare din cele doua produse, dupa conversie. Apoi scrie, in ordine, cei trei pasi pe care i-ai urma inainte de a importa acest fisier ca sa eviti greseala de unitate de masura descrisa in lectie (Atomul 6).

Vezi rezolvarea

Conversie (1 cutie = 6 blistere):

  1. C-0512: 4 cutii x 6 = 24 blistere.
  2. C-0518: 7 cutii x 6 = 42 blistere.

Schita celor trei pasi, in ordine (aceeasi capcana de unitate de masura amestecata din lectie):

  1. Verifici in ce unitate este exprimata coloana cantitate din fisierul furnizorului - aici 'cutii', nu 'blistere' ca in baza de date.
  2. Inainte de import, transformi coloana cantitate inmultind fiecare valoare cu factorul de conversie (aici 6), intr-o coloana ajutatoare.
  3. Faci un import de proba pe cateva randuri si verifici in tabel ca valorile afisate sunt cele convertite (24, 42), nu cifrele brute din fisier (4, 7).

Se evalueaza: calculul corect, identificarea explicita a riscului de unitate amestecata si ordinea logica verificare-conversie-import de proba.

Ce ai invatat astazi

  • Formularul de receptie controleaza campurile completate, spre deosebire de scrisul liber intr-un tabel
  • Validare obligatorie 1: Termen de valabilitate nu poate fi gol — altfel lotul devine invizibil pentru alertele de expirare
  • Validare obligatorie 2: Cantitatea trebuie sa fie strict pozitiva (mai mare decat 0) la o receptie
  • Importul dintr-un fisier CSV/Excel al furnizorului trece prin aceleasi validari ca formularul manual
  • Pasii de import: alegere fisier → potrivire coloane → import de proba → import complet, cu erorile raportate
  • Duplicat = acelasi cod produs + lot + cantitate + data; se identifica exportand tabelul in Excel (Data → Remove Duplicates) si se sterge apoi din aplicatia de gestiune
  • Greseala tipica: unitatea de masura a furnizorului (ex. cutii) diferita de cea a bazei de date (ex. flacoane/blistere) — se verifica si se converteste INAINTE de import

Vrei mai mult?

Provocare: Scrie, pe hartie sau intr-un fisier text, 5 randuri de test pentru un import CSV: unul valid, unul cu cantitate 0, unul cu termen_valabilitate gol, unul care e duplicat exact al randului valid si unul cu cantitatea scrisa in cutii cand baza tine evidenta in flacoane. Pentru fiecare rand, noteaza ce ar face aplicatia: accepta, respinge (cu motivul exact) sau accepta gresit, fara sa observe problema.

De gandit: Validarile invatate azi - camp obligatoriu, numar strict pozitiv - verifica forma datelor, nu sensul lor. De ce nicio validare de tip din Access nu poate prinde singura o greseala de unitate de masura, cutii in loc de flacoane? Ce informatie suplimentara, care nu tine de tipul campului, ar trebui sa cunoasca aplicatia ca sa prinda si aceasta greseala?

Deschidere: Exact acest tipar - validare de forma la introducere, apoi verificare separata de sens, duplicate si unitati, dupa import - e folosit de orice program de gestiune farmacie care primeste facturi electronice de la distribuitori, nu doar de exercitiul din lectie.

Urmatoarea lectie

Continua cu Exploatarea bazei — interogari utile pentru gestiunea zilnica (produse expirate sau aproape expirate, stoc sub minim, valoarea stocului pe categorie) si generarea unui raport de gestiune tiparibil.

Continua →