Invatare Atomica

Operatii pe tabel si incarcarea bazei

Formular de introducere, validari pe camp, import dintr-o foaie de calcul, corectarea duplicatelor — doua tabele legate: Pacienti si Consultatii

Progres lectie:
0%
🎯

Obiectivul lectiei

Un tabel gol nu ajuta pe nimeni. In lectia asta inveti sa aduci date reale intr-o baza pe care ai construit-o deja: printr-un formular, atunci cand inregistrezi un pacient nou la ghiseu, unul cate unul; cu validari, ca sa nu se poata salva un camp obligatoriu gol sau un format gresit (un CNP cu mai putin de 13 cifre, o data de nastere din viitor); prin import, atunci cand ai deja o lista mare intr-un Excel (de exemplu, evidenta unui cabinet scolar); si prin curatarea duplicatelor, ca acelasi pacient sa nu apara de doua ori sub doua inregistrari diferite. La final vezi cum doua tabele — Pacienti si Consultatii — raman legate corect, fara sa repeti datele pacientului la fiecare vizita.

Dupa aceasta lectie vei putea:

  • Sa creezi un formular simplu in Access pornind de la un tabel existent si sa il folosesti pentru a adauga o inregistrare noua
  • Sa setezi proprietatea Required si o Regula de validare (Validation Rule) pe un camp, ca sa opresti date evident gresite la sursa
  • Sa folosesti o Masca de intrare (Input Mask) pentru un camp cu format fix, precum CNP-ul
  • Sa importi dintr-o foaie de calcul Excel intr-un tabel existent, folosind expertul de import din Access
  • Sa recunosti si sa elimini inregistrarile duplicate dintr-o lista, inainte sau dupa import
  • Sa explici de ce Pacienti si Consultatii sunt doua tabele separate, legate printr-un camp comun, si nu unul singur

Incearca singur!

Provocare — inainte sa citesti:

Esti la receptia unui cabinet si primesti un pacient nou. In acelasi timp, o colega iti trimite pe e-mail un Excel cu 40 de pacienti inscrisi la un control de rutina, ca sa ii adaugi si pe ei in evidenta electronica. Scrie mai jos: ce ai face diferit ca sa introduci pacientul de la ghiseu fata de cei 40 din Excel? Ce probleme crezi ca ar putea aparea daca ai retasta manual, unul cate unul, toti cei 40 din Excel?

💡 Ai nevoie de un indiciu?

Pentru un singur pacient, un formular clar, cu campurile completate pe rand, e mai sigur decat sa scrii direct in tabel — greu sa confunzi coloanele. Pentru 40 de pacienti dintr-un Excel deja existent, retastarea manuala inseamna 40 de sanse de greseala de tastare si ore de munca in plus — Access poate importa toata lista dintr-o singura operatie.

Subiectul lectiei de azi arata exact cum se fac amandoua, corect.

1

De ce un formular, si nu scris direct in tabel

Un tabel este locul unde datele sunt stocate — randuri (inregistrari) si coloane (campuri). Poti scrie direct in el, dar la un tabel cu 10-15 campuri (Nume, Prenume, CNP, Data nasterii, Telefon, Adresa...), coloanele late si textul mic fac usor sa scrii intr-o coloana gresita, mai ales cand introduci date sub presiune, la ghiseu. Un formular (Form) rezolva asta: afiseaza campurile unei singure inregistrari, unul sub altul, cu eticheta clara in stanga si spatiul de completat in dreapta — fara sa vezi restul tabelului deloc.
Cand foloseste receptia formularul:

Un pacient nou se prezinta la cabinet. In loc sa deschizi tabelul Pacienti si sa cauti primul rand liber, deschizi formularul Formular_Pacienti, apesi butonul de "inregistrare noua" si completezi campurile unul dupa altul: Nume, Prenume, Data nasterii, CNP, Telefon. Persoana de la receptie nu are nevoie sa cunoasca structura tabelului pe de rost — formularul o ghideaza.

2

Crearea formularului si operatii pe inregistrari: adaugare, modificare, stergere

Access construieste un formular direct din structura unui tabel deja existent — nu trebuie desenat nimic de la zero. Presupunem ca tabelul Pacienti exista deja, cu campurile ID_Pacient (AutoNumber, cheia primara), Nume, Prenume, Data_Nasterii, CNP, Telefon.
Pas cu pas — formular nou din tabel:

1. In panoul din stanga (Navigation Pane), dai clic pe numele tabelului Pacienti, ca sa fie selectat (nu trebuie neaparat deschis).
2. Deschizi tab-ul Create de pe panglica.
3. Apesi butonul Form. Access genereaza automat un formular cu toate campurile tabelului, fiecare pe randul lui, cu eticheta in stanga si spatiul de completat in dreapta.
4. Formularul se deschide in modul Layout View — poti trage marginile campurilor mai late sau mai inguste daca un text nu incape.
5. Salvezi formularul cu Ctrl+S si ii dai un nume clar, de exemplu Formular_Pacienti.

Adaugarea unei inregistrari noi:

Deschizi formularul (dublu-clic pe el, in Navigation Pane). La baza ferestrei, in bara de navigare intre inregistrari, apesi butonul cu sageata si asterisc (New (blank) record). Formularul se goleste, gata pentru pacientul nou. Completezi fiecare camp, apoi treci la urmatorul cu tasta Tab. Access salveaza automat inregistrarea cand treci la alt rand sau inchizi formularul, dar poti salva explicit inregistrarea curenta oricand, fara sa astepti: Shift+Enter, sau butonul Save Record din grupul Home > Records de pe panglica.

Atentie la Ctrl+S: comanda Ctrl+S folosita mai sus, la pasul 5, cand formularul era deschis in Layout View imediat dupa creare, salveaza designul formularului (structura lui, ca obiect). E o comanda diferita de salvarea unei inregistrari completate ulterior in Form View — acolo, Ctrl+S/Shift+Enter salveaza datele randului curent, nu structura formularului.

Modificarea unei inregistrari existente:

Deschizi formularul si navighezi la pacientul dorit cu sagetile din bara de navigare de la baza ferestrei, sau il cauti direct cu Ctrl+F (Find) dupa nume ori CNP. Dai clic in campul de corectat (de exemplu Telefon), stergi valoarea gresita si scrii cea corecta, apoi treci la alt camp sau la alta inregistrare — Access salveaza automat modificarea, la fel ca la o inregistrare noua. Nu exista un pas separat de "confirmare"; daca vrei sa fii sigur ca s-a salvat inainte sa inchizi formularul, apesi Shift+Enter.

Stergerea unei inregistrari:

Cu inregistrarea de sters afisata in formular, apesi butonul Delete din grupul Home > Records (sageata de sub el) sau Home > Records > Delete Record. Access cere o confirmare, pentru ca stergerea nu poate fi anulata cu Undo dupa ce ai confirmat. Daca pacientul respectiv are deja consultatii legate in tabelul Consultatii, stergerea poate fi refuzata sau poate sterge in cascada si consultatiile lui, in functie de setarea de integritate referentiala a relatiei — vezi atomul 7, unde se explica exact aceasta setare.

3

Validari pe camp — opresti greseala inainte sa se salveze

O validare este o regula setata pe un camp, care refuza sa salveze o valoare care nu respecta regula. Se seteaza in Design View al tabelului (clic-dreapta pe numele tabelului → Design View → dai clic pe randul campului dorit → completezi proprietatile jos, in fereastra Field Properties). Trei proprietati sunt cele mai utile pentru un tabel cu date de pacienti:
1. Required (obligatoriu) — camp care nu poate ramane gol

Pentru campurile Nume, Prenume si CNP, setezi proprietatea Required pe Yes. Daca cineva incearca sa salveze o inregistrare fara Nume completat, Access afiseaza un mesaj de eroare si nu salveaza randul pana campul nu e completat.

2. Input Mask (masca de intrare) — forma fixa, cum e CNP-ul

CNP-ul are intotdeauna exact 13 cifre. In proprietatea Input Mask a campului CNP (tip de date Short Text, nu Number — vezi atomul urmator de ce), scrii o masca de 13 pozitii cifra: 0000000000000 (13 caractere "0" — fiecare "0" in Input Mask cere obligatoriu o cifra pe pozitia respectiva). Cand utilizatorul completeaza formularul, campul afiseaza 13 spatii libere de completat cu cifre; nu poti introduce o litera si nu poti lasa mai putin de 13 pozitii.

Atentie la ordine: Access copiaza Input Mask-ul pe controlul din formular in momentul in care creezi formularul (Create > Form, atomul 2). Daca ai generat deja formularul si abia acum adaugi masca pe campul CNP din tabel, controlul CNP de pe formularul existent NU o preia automat — masca nu se propaga retroactiv. Ca sa functioneze si acolo, deschizi formularul in Design View, dai clic pe controlul CNP, si in Property Sheet > Data > Input Mask copiezi manual aceeasi masca (0000000000000); sau, mai simplu, stergi controlul CNP de pe formular si il adaugi din nou din Field List — un control nou preia intotdeauna proprietatile curente ale campului. Cel mai sigur e sa setezi toate validarile pe tabel inainte de a genera formularul cu Create > Form.

3. Validation Rule (regula de validare) — o conditie logica

Pentru campul Data_Nasterii (tip de date Date/Time), o data de nastere nu poate fi in viitor. In proprietatea Validation Rule scrii: <=Date() — adica valoarea trebuie sa fie mai mica sau egala cu data de azi. In proprietatea Validation Text scrii mesajul care apare cand cineva incalca regula, de exemplu: "Data nasterii nu poate fi in viitor." Daca cineva tasteaza din greseala anul 2036 in loc de 2006, Access respinge salvarea si arata acel mesaj.

4. Indexed = Yes (No Duplicates) — previne duplicatele chiar la sursa

Pentru campul CNP, cea mai directa validare impotriva duplicatelor nu se face in Excel, ci direct pe tabel: setezi proprietatea Indexed pe Yes (No Duplicates). De atunci incolo, Access refuza sa salveze orice inregistrare noua (introdusa prin formular sau prin import) al carei CNP exista deja in tabel — inainte ca duplicatul sa apuce sa strice evidenta, nu dupa. E singura validare din acest atom care opreste un duplicat, nu doar un format gresit.

❌ Greseala frecventa: Campul CNP este setat cu tipul de date Number, pentru ca "e format din cifre". Un CNP care incepe cu 0 nu exista in realitate (prima cifra, S, arata sexul si secolul nasterii si ia valori de la 1 la 9: 1/2 = 1900-1999, 3/4 = 1800-1899, 5/6 = 2000-2099, 7/8 = rezident strain, 9 = persoana cu cetatenie straina), dar problema similara apare des la campul Telefon: un numar romanesc scris "0733123456", salvat ca Number, devine "733123456" — zeroul din fata dispare, pentru ca la un numar matematic zeroul din fata nu are valoare (007 = 7).
Cum recunosti: numarul de telefon afisat in evidenta are 9 cifre in loc de 10, sau apelul catre acel numar nu functioneaza.
Cum repari: schimbi tipul de date al campului in Short Text inainte de a reintroduce valorile — un numar de telefon sau un CNP este o eticheta, nu o cantitate cu care faci calcule, deci nu are ce sa caute intr-un camp Number.
4

Importul dintr-o foaie de calcul Excel existenta

Cand ai deja o lista mare intr-un fisier Excel (.xlsx) — de exemplu evidenta unui control scolar de rutina, tinuta pana acum in Excel de o colega — nu are sens sa o retastezi prin formular, rand cu rand. Access are un expert de import (Import Wizard) care citeste direct fisierul Excel si adauga randurile intr-un tabel.
Pas cu pas — import Excel in tabelul Pacienti:

1. Deschizi tab-ul External Data de pe panglica.
2. In grupul Import & Link, apesi Excel.
3. In fereastra care se deschide, alegi fisierul Excel (Browse) cu cei 40 de pacienti.
4. Alegi una dintre cele trei optiuni: Import the source data into a new table (creeaza un tabel nou), Append a copy of the records to the table (adauga la un tabel care exista deja — alegi Pacienti din lista) sau Link to the data source (doar conecteaza, fara sa copieze). Pentru situatia noastra — completarea tabelului Pacienti existent — alegi Append si selectezi Pacienti.
5. Pe ecranul urmator lasi bifata caseta "First Row Contains Column Headings" — ii spui expertului ca primul rand din Excel nu e o inregistrare, ci denumirile coloanelor.
6. Access iti arata o previzualizare pasiva a datelor (doar de citit — la Append nu exista un ecran in care sa remapezi manual o coloana peste alta). Verifici din priviri ca randurile arata corect.
7. Apesi Finish. Access confirma cate randuri au fost adaugate — sau, daca o denumire de coloana nu se potriveste cu niciun camp din Pacienti, opreste importul cu o eroare (vezi caseta de mai jos).

Conditia ca importul sa functioneze corect:

La optiunea Append, Access potriveste fiecare coloana strict dupa denumirea din randul de antet al Excelului, comparata cu numele campului din tabelul Access — nu conteaza ordinea coloanelor, si o ordine identica nu ajuta cu nimic daca denumirile difera. Spre deosebire de Import into a new table (unde expertul iti da ecrane in care poti redenumi coloanele si schimba tipul de date), in modul Append acele ecrane de remapare lipsesc complet — exista doar previzualizarea pasiva de la pasul 6. Daca in Excel antetul scrie "Numar telefon" si in Access campul se numeste "Telefon", Access nu il recunoaste ca fiind acelasi camp: importul se opreste cu eroarea "The field 'Numar telefon' doesn't exist in destination table 'Pacienti'." si nu se adauga niciun rand.

❌ Greseala frecventa: Se lanseaza Append direct, fara sa se verifice denumirile din Excel fata de numele campurilor din Access — tocmai scenariul "Numar telefon" vs "Telefon" de mai sus.
Cum recunosti: importul se opreste cu un mesaj de eroare in loc sa confirme cate randuri au fost adaugate, si niciun rand nu ajunge in tabel.
Cum repari: inainte de a lansa expertul, redenumesti antetul din Excel ca sa fie identic cu numele campului din Access (aici: "Numar telefon" devine "Telefon"), apoi reiei importul de la pasul 1.
5

Pregatirea foii de calcul inainte de import

Un import reuseste doar daca foaia de calcul e "curata" ca structura, adica seamana cu un tabel simplu. Inainte de a lansa expertul din Access, verifici in Excel urmatoarele:
Checklist de curatenie:

Un singur rand de antet — primul rand contine denumirile coloanelor, identice cu numele campurilor din tabelul Access (Nume, Prenume, Data_Nasterii, CNP, Telefon), fara randuri goale sau titluri suplimentare deasupra. Nu e doar un ideal: la Append (atomul anterior), o denumire diferita opreste tot importul cu eroare.

Fara celule combinate (merged cells) — daca cineva a combinat celule pentru un titlu de sectiune (de exemplu "Pacienti control ianuarie" scris peste mai multe coloane), Access nu stie carei coloane ii apartine acea valoare. Se dezactiveaza cu: selectezi zona, apoi Home > Merge & Center.

Fara randuri sau coloane goale in mijlocul datelor — un rand gol intrerupe intervalul pe care Access il citeste, iar restul listei de dedesubt poate ramane neimportat.

Fiecare coloana are un singur tip de continut — nu amesteci, in aceeasi coloana Telefon, si numere si texte ca "nu are telefon".

Un detaliu important pentru date de pacienti — informatiile personale in Excel:

Cat timp fisierul Excel cu CNP-uri si telefoane exista pe disc, inainte si dupa import, el ramane un document cu date personale ale pacientilor. Nu il lasi intr-un folder partajat vizibil oricui in retea si il stergi de pe calculator dupa ce importul a fost verificat si confirmat corect — datele au deja o singura locatie sigura, in baza de date.

6

Gasirea si eliminarea duplicatelor

Un duplicat este o inregistrare care apare de doua sau mai multe ori, cu aceleasi valori (sau aproape aceleasi). Duplicatele strica evidenta: un pacient inregistrat de doua ori sub doua ID-uri diferite ajunge cu doua fise separate, fiecare cu o parte din istoricul lui de consultatii, in loc de una singura completa.
Exemplu complet — 9 randuri, 3 duplicate:

Lista din Excel, in ordine: 1) Popescu Ana, CNP 289..., 2) Ionescu Maria, CNP 296..., 3) Popescu Ana, CNP 289... (duplicat al randului 1), 4) Gheorghiu Ion, CNP 178..., 5) Ionescu Maria, CNP 296... (duplicat al randului 2), 6) Dumitrescu Elena, CNP 285..., 7) Popescu Ana, CNP 289... (duplicat al randului 1, a treia aparitie), 8) Radu Vasile, CNP 175..., 9) Stan Georgeta, CNP 291...

Selectezi tot intervalul (inclusiv antetul), deschizi tab-ul Data si apesi Remove Duplicates. In fereastra care apare, lasi bifate toate coloanele (ca sa compare randul intreg, nu doar o coloana) si apesi OK. Excel raporteaza: "3 duplicate values found and removed; 6 unique values remain." Raman exact randurile 1, 2, 4, 6, 8, 9 — 9 − 3 = 6 randuri unice.

Vezi intai ce se sterge, inainte sa stergi:

Remove Duplicates sterge direct, fara sa iti arate randurile marcate. Ca sa vezi intai ce ar fi considerat duplicat, selectezi coloana CNP, apoi Home > Conditional Formatting > Highlight Cells Rules > Duplicate Values. Excel coloreaza toate CNP-urile care se repeta, ca sa le verifici cu ochiul liber inainte sa decizi ce stergi — util cand doi frati au acelasi nume de familie, dar CNP-uri diferite, si nu vrei sa ii confunzi drept duplicat.

❌ Greseala frecventa: Se compara doar coloana Nume, iar doi pacienti cu acelasi nume si prenume (posibil, mai ales in familii cu traditie de nume) sunt considerati gresit duplicat si unul e sters.
Cum recunosti: dupa curatare lipseste un pacient real din evidenta, desi numele lui apare o singura data.
Cum repari: la Remove Duplicates, lasi bifate toate coloanele relevante (macar Nume + Prenume + CNP + Data nasterii), nu doar Nume — CNP-ul, in particular, este unic pentru fiecare persoana si arata clar daca e vorba de aceeasi persoana sau de doua persoane diferite cu nume asemanator.
Si daca duplicatul a ajuns deja in Access?

Remove Duplicates functioneaza doar in Excel, inainte de import. Daca apesi Append de doua ori din greseala (usor de facut) si acelasi pacient ajunge de doua ori in tabelul Pacienti, curatarea se face direct in Access, cu Create > Query Wizard > Find Duplicates Query Wizard: alegi tabelul Pacienti, alegi campul (sau campurile) dupa care cauti duplicate — de exemplu CNP — si expertul iti construieste automat o interogare care arata doar randurile cu acea valoare repetata, gata pentru verificare si stergere manuala a copiei in plus. Cea mai buna prevenire ramane insa cea de la Indexed = Yes (No Duplicates) din atomul 3: cu ea activata pe CNP, al doilea Append identic e respins de Access inainte sa apuce sa intre in tabel.

7

Doua tabele legate: Pacienti si Consultatii

Un pacient trece prin cabinet de mai multe ori de-a lungul timpului: un control, apoi altul peste cateva luni, apoi altul. Daca ai pune toate consultatiile in acelasi tabel cu datele personale ale pacientului (Nume, CNP, Telefon repetate la fiecare vizita), ai rescrie de fiecare data acelasi CNP si acelasi nume — risc mare de greseala de tastare si spatiu irosit. Solutia: doua tabele separate, legate printr-un camp comun.
Crearea tabelului Consultatii:

La fel ca Pacienti in lectia trecuta, Consultatii se creeaza in Design View (Create > Table Design): campul ID_Consultatie tip AutoNumber, marcat cheie primara; Cod_Pacient tip Number, Field Size Long Integer (motivul exact e explicat mai jos); Data_Consultatiei tip Date/Time; Tip_Consultatie tip Short Text. Odata salvat tabelul, il poti incarca la fel ca Pacienti — cu un formular (Create > Form) pentru fiecare vizita noua, sau prin import daca ai deja un Excel cu vizitele.

Structura celor doua tabele:
TabelCampuriCheie
PacientiID_Pacient, Nume, Prenume, Data_Nasterii, CNP, TelefonID_Pacient = cheie primara (AutoNumber)
ConsultatiiID_Consultatie, Cod_Pacient, Data_Consultatiei, Tip_ConsultatieID_Consultatie = cheie primara; Cod_Pacient = cheie externa
Cum se leaga cele doua tabele:

Coloana Cod_Pacient din Consultatii se potriveste cu coloana ID_Pacient din Pacienti — acesta este campul de legatura dintre cele doua tabele, numit cheie externa (foreign key). Pentru pacienta Popescu Ana, cu ID_Pacient = 5, tabelul Consultatii poate avea trei randuri diferite, toate cu Cod_Pacient = 5 (un control in martie, o evaluare a parametrilor in iunie, un control de rutina in septembrie): un pacient poate avea mai multe consultatii, dar fiecare consultatie apartine unui singur pacient. Aceasta se numeste relatie unu-la-multe. Relatia se construieste in Access din tab-ul Database Tools > Relationships, tragand cu mouse-ul din ID_Pacient (Pacienti) peste Cod_Pacient (Consultatii), apoi confirmand cu Create in fereastra Edit Relationships.

❌ Greseala frecventa: Cod_Pacient este lasat cu tipul implicit Short Text (acelasi tip ca CNP-ul, din obisnuinta), in timp ce ID_Pacient din Pacienti e AutoNumber — un tip numeric. Cand tragi din ID_Pacient peste Cod_Pacient ca sa creezi relatia, Access refuza cu o eroare de nepotrivire de tip si nu creeaza relatia.
Cum recunosti: fereastra Edit Relationships nu apare deloc, sau apare un mesaj ca cele doua campuri nu au acelasi tip de date.
Cum repari: deschizi Consultatii in Design View si schimbi Cod_Pacient pe tipul Number, cu Field Size = Long Integer — exact tipul numeric intern pe care il foloseste un camp AutoNumber. Abia dupa aceasta schimbare tragerea din ID_Pacient peste Cod_Pacient reuseste.
Enforce Referential Integrity — de ce conteaza pentru Exercitiul 3

In fereastra Edit Relationships (cea care apare dupa ce tragi ID_Pacient peste Cod_Pacient), exista o caseta Enforce Referential Integrity. Nebifata, Access lasa relatia "moale": poti sterge un pacient din Pacienti chiar daca mai are consultatii in Consultatii, iar acele consultatii raman in baza cu un Cod_Pacient care nu mai corespunde niciunui pacient real (inregistrari "orfane", imposibil de asociat inapoi cu cineva). Bifata, Access nu mai permite acest lucru: fie refuza stergerea pacientului cat timp mai are consultatii legate, fie — daca bifezi si optiunea suplimentara Cascade Delete Related Records — sterge automat si consultatiile lui odata cu el. Pentru o baza de pacienti, varianta recomandata e Enforce Referential Integrity bifata, fara Cascade Delete: stergerea unui pacient cu istoric medical ar trebui sa fie o decizie constienta, nu un efect automat.

Rezumat vizual al fluxului de lucru din lectia de azi:

Pacient nou, unul cate unul → Formular (Create > Form), cu Required si Input Mask/Validation Rule active pe camp
  ↓
Lista mare, deja in Excel → curatare (Remove Duplicates, structura fara celule combinate) → Import (External Data > Excel > Append la tabelul existent)
  ↓
Fiecare vizita ulterioara → randuri noi in Consultatii, legate de pacient prin Cod_Pacient — datele personale nu se rescriu niciodata

Conexiune cu urmatoarea lectie:

Odata ce baza are date reale si tabelele sunt legate corect, urmatorul pas este sa scoti informatie utila din ea — nu rasfoind manual tabelul, ci punand intrebari precise. In lectia urmatoare inveti interogari cu criterii: cum gasesti, de exemplu, toti pacientii cu o consultatie in luna curenta, fara sa cauti cu ochiul printre sute de randuri.

Exercitii practice

Exercitiul 1 (Nivel minim) — Formular sau tabel direct?

Pentru fiecare situatie, spune daca ai folosi formularul sau ai scrie direct in tabel, si justifica intr-o propozitie: a) un singur pacient nou, la ghiseu; b) o lista de 60 de pacienti, deja intr-un Excel primit de la un cabinet scolar; c) corectarea unui singur numar de telefon gresit tastat, la un pacient existent.

Vezi rezolvarea

a) Formular. E un singur pacient nou, la ghiseu: deschizi Formular_Pacienti, apesi New (blank) record si completezi campurile pe rand, cu Tab intre ele — greu sa confunzi coloanele, spre deosebire de scrisul direct in tabel.

b) Nici formular, nici tabel direct: import. Lista de 60 e deja gata intr-un Excel, deci folosesti expertul de import (External Data, apoi Excel, apoi Append la tabelul Pacienti existent) — retastarea prin formular ar insemna 60 de sanse de greseala si ore de munca in plus.

c) Formular. Deschizi formularul, cauti pacientul cu Ctrl+F dupa nume sau CNP, dai clic in campul Telefon, stergi valoarea gresita si scrii cea corecta.

Exercitiul 2 (Nivel standard) — Curatarea unei liste inainte de import

Primesti urmatoarea lista de 8 randuri, gata de import in tabelul Pacienti (Nume, Prenume, CNP): 1) Ionescu, Radu, 178..., 2) Marin, Elena, 285..., 3) Ionescu, Radu, 178... (identic cu randul 1), 4) Vasilescu, Ioana, 296..., 5) Popa, Mihai, 175..., 6) Ionescu, Radu, 179... (CNP diferit fata de randul 1, la a treia cifra: 178 devine 179, restul identic), 7) Marin, Elena, 285... (identic cu randul 2), 8) Dobre, Cristina, 291.... Raspunde: a) cate randuri sunt duplicate exacte si cate raman dupa Remove Duplicates cu toate coloanele bifate; b) randul 6 este sau nu duplicat cu randul 1 — motiveaza folosind CNP-ul; c) ce ai verifica inainte sa consideri sigur ca randul 6 e o persoana diferita, si nu o greseala de tastare la CNP.

Vezi rezolvarea

a) Duplicate exacte: randul 3 (identic cu 1) si randul 7 (identic cu 2) — 2 randuri. Randul 6 nu e duplicat exact, are CNP diferit. Dupa Remove Duplicates cu toate coloanele bifate raman 6 randuri (8 minus cele 2 aparitii repetate).

b) Nu este duplicat cu randul 1. Nume si Prenume sunt identice (Ionescu Radu), dar CNP-ul difera la a treia cifra (178 fata de 179) — CNP-ul e identificatorul unic al persoanei, iar Remove Duplicates cu toate coloanele bifate nu il considera duplicat exact.

c) As verifica daca nu e o greseala de tastare a unei singure cifre la CNP, comparand cu actul de identitate, data nasterii dedusa din CNP sau alte date de contact, inainte sa presupun ca sunt doua persoane diferite cu acelasi nume.

Exercitiul 3 (Nivel performanta) — Proiectarea validarilor si a relatiei

Cabinetul iti cere sa pregatesti tabelul Pacienti pentru import, cu aceste campuri: ID_Pacient, Nume, Prenume, Data_Nasterii, CNP, Telefon. Pentru fiecare din CNP, Data_Nasterii si Telefon: a) alege tipul de date corect si motiveaza (Number, Short Text sau Date/Time); b) propune o validare concreta (Required, Input Mask sau Validation Rule, cu textul mesajului afisat la eroare). Apoi explica, in doua-trei propozitii, ce s-ar strica in evidenta consultatiilor daca ai sterge din greseala tabelul Pacienti si ai pastra doar Consultatii cu coloana Cod_Pacient.

Vezi rezolvarea

CNP — Short Text, nu Number: e o eticheta, nu o cantitate de calculat, iar Number ar putea sterge o cifra semnificativa. Validare: Input Mask cu 13 pozitii cifra (0000000000000) plus Required = Yes; mesaj: "CNP-ul trebuie sa aiba exact 13 cifre."

Data_Nasterii — Date/Time. Validare: Validation Rule <=Date(), Validation Text: "Data nasterii nu poate fi in viitor."

Telefon — Short Text, nu Number: un numar care incepe cu 0 (0733123456) salvat ca Number pierde zeroul si ramane cu 9 cifre. Validare: Required = Yes; o masca exacta de format pentru telefon nu apare in aceasta lectie, asa ca nu o propun ca fiind predata.

Daca stergi tabelul Pacienti si pastrezi doar Consultatii cu Cod_Pacient, relatia unu-la-multe se rupe: Cod_Pacient ramane un numar fara sens, fara Nume, CNP sau Telefon asociat — istoricul consultatiilor devine orfan, legat de niciun pacient identificabil.

Ce ai invatat astazi

  • Formularul (Create > Form) e sigur pentru adaugare, modificare si stergere punctuala: un camp pe rand, greu de confundat cu alta coloana; adaugarea/modificarea se salveaza automat la schimbarea randului (sau explicit cu Shift+Enter), stergerea cere confirmare
  • Required = Yes opreste salvarea unui camp gol; Input Mask impune o forma fixa (13 cifre la CNP, setata pe tabel INAINTE de a crea formularul); Validation Rule verifica o conditie logica (data nasterii <=Date()); Indexed = Yes (No Duplicates) blocheaza un CNP care exista deja
  • CNP si Telefon trebuie Short Text, nu Number — altfel zerourile din fata dispar; prima cifra a CNP-ului (S) ia valori 1-9
  • Import Excel: External Data > Excel > Append la tabelul existent — la Append, Access potriveste coloanele STRICT dupa denumirea din antet (ordinea nu conteaza), fara ecran de remapare; antetul din Excel trebuie sa fie identic cu numele campurilor din Access
  • Foaia de calcul trebuie curata inainte de import: un singur rand de antet cu denumiri identice campurilor Access, fara celule combinate, fara randuri goale
  • Duplicatele se previn cu Indexed = Yes (No Duplicates) pe CNP sau se gasesc cu Data > Remove Duplicates in Excel (inainte de import); daca au ajuns deja in Access, se cauta cu Create > Find Duplicates Query Wizard
  • Pacienti si Consultatii sunt doua tabele separate, legate unu-la-multe prin Cod_Pacient (Number, Long Integer) = ID_Pacient, cu Enforce Referential Integrity bifat — datele personale nu se rescriu la fiecare vizita, iar stergerea unui pacient cu istoric ramane o decizie constienta

Vrei mai mult?

Primesti un Excel cu 10 pacienti de import, dar doi randuri sunt aceeasi persoana scrisa diferit ("Popescu Ana" pe un rand, "POPESCU ANA" pe altul, cu acelasi CNP). Gaseste perechea verificand CNP-ul, nu numele, apoi seteaza pe campul CNP din tabel proprietatea Indexed = Yes (No Duplicates), ca sa nu mai poata intra niciodata doua inregistrari cu acelasi CNP.

De ce Indexed = Yes (No Duplicates) pe CNP nu ar fi prins singur cazul de mai sus daca cele doua randuri aveau CNP-uri scrise cu un spatiu in plus sau o cratima? Ce rol joaca aici Input Mask-ul de la CNP, pus inainte, in raport cu regula de unicitate pusa acum?

In orice sistem real de fisa electronica de pacient, CNP-ul e campul marcat unic exact asa, pentru ca un pacient dublat inseamna doi ID-uri diferite si un istoric medical rupt in doua fise separate. Acum ca tabelele tale sunt curate si legate corect, lectia urmatoare iti arata cum scoti din ele raspunsuri rapide, cu interogari.

Urmatoarea lectie

Continua cu Exploatarea bazei: interogari cu criterii — cum pui intrebari precise bazei de date, ca sa gasesti rapid exact pacientii sau consultatiile de care ai nevoie.

Continua →