De ce un formular, si nu scris direct in tabel
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.
Crearea formularului si operatii pe inregistrari: adaugare, modificare, stergere
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.
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.
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.
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.
Validari pe camp — opresti greseala inainte sa se salveze
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.
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.
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.
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.
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.
Importul dintr-o foaie de calcul Excel existenta
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).
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.
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.
Pregatirea foii de calcul inainte de import
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".
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.
Gasirea si eliminarea duplicatelor
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.
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.
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.
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.
Doua tabele legate: Pacienti si 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.
| Tabel | Campuri | Cheie |
|---|---|---|
| Pacienti | ID_Pacient, Nume, Prenume, Data_Nasterii, CNP, Telefon | ID_Pacient = cheie primara (AutoNumber) |
| Consultatii | ID_Consultatie, Cod_Pacient, Data_Consultatiei, Tip_Consultatie | ID_Consultatie = cheie primara; Cod_Pacient = cheie externa |
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.
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.
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.
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
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.