Utilizarea mai multor tabele
Cand se lucreaza cu mai multe tabele se folosesc, pe de o parte, sesiuni de date pentru a controla tabelele disponibile pentru formulare si, pe de alta parte, zone de lucru pentru a stabili tabelele deschise.
Zona de lucru este o regiune numerotata prin care se identifica un tabel deschis. In Visual FoxPro exista 32767 zone de lucru in care se pot deschide si manipula tabele. Zonele de lucru sunt identificate i 929d36j ntr-o aplicatie prin folosirea aliasului tabelului deschis in zona de lucru.
Folosirea aliasurilor tabelelor
Un alias de tabel este numele prin care Visual FoxPro indica un tabel deschis intr-o zona de lucru. Atunci cand se deschide un tabel Visual FoxPro foloseste automat numele fisierului ca alias implicit.
Exemplu: Daca se deschide tabelul Clienti in prima zona de lucru disponibila (zona 0 ) cu ajutorul comenzilor urmatoare, tabelului ii va fi asociat aliasul implicit „clienti”:
SELECT 0
USE clienti
a) Deschiderea unui tabel cu un alias definit de utilizator
se utilizeaza clauza ALIAS in comanda USE
Exemplu: SELECT 0
USE Clienti ALIAS cli
In acestr caz, pentru a face referire la tabelul deschis se va folosi aliasul atribuit ( in exemplul de mai sus „cli”). Un alias definit de utilizator consta din maximum 254 de caractere (litere, cifre sau liniute de subliniere) si trebuie sa inceapa cu o litera sau o liniuta de subliniere. Daca un alias furnizat de utilizator contine un caracter nepermis, FoxPro creaza automat un alias.
b) Utilizarea aliasurilor atribuite de Visual FoxPro.
Visual FoxPro atribuie automat un alias unui tabel daca se deschide simultan acelasi tabel in mai multe zone de lucru, prin includerea clauzei AGAIN in cadrul comenzii USE, si nu se indica un alias la deschiderea tabelului in fiecare zona de lucru sau daca survine un conflict intre aliasuri.
Aliasurile implicite din primele 10 zone de lucru au asociate literele de la A la J. Aliasurile atribuite in zonele de lucru de la 11 la 32767 pornesc de la W11 pana la W32767. Aceste aliasuri pot fi folosite pentru a indica tabelul deschis in zona de lucru, la fel ca orice alias implicit sau definit de utilizator.
Utilizarea sesiunilorde date
O sesiune de date este o reprezentare a mediuluide lucru curent folosit de un formular, de un set de formulare sau de un raport. Fiecare sesiune de date cuprinde propriul sau set de zone de lucru, zone care contin tabelele deschise, indecsii lor si relatiile dintre ele.
a) Vizualizarea zonelor de lucru
Lista tabelelor deschise intr-o sesiune Visual FoxPro poate fi vizualizata in fereastra Data Session deschisa din meniul Windows.
b) Deschiderea unui tabel intr-o zona de lucru
Un tabel poate fi deschis intr-o zona de lucru:
folosind fereastra Data Session din care se alege butonul Open sau
prin utilizarea clauzei IN in comanda USE
Exemplu: USE Clienti IN 1
Nota: Pentru a deschide un tabel in zona de lucru disponibila cu numarul cel mai mic se foloseste clauza IN a comenzii USE cu parametrul 0.
Exemplu: Se presupune ca exista tabele deschise in zonele de lucru de la 1 la 7. Pentru a deschide un nou tabel in zona de lucru 8 se foloseste comanda:
USE Clienti IN 0
c) Inchiderea unui tabel dintr-o zona de lucru
Un tabel deschis intr-o zona de lucru poate fi inchis astfel:
in fereastra Data Session se selecteaza aliasul tabelului si se alege Close;
se selecteaza ca zona de lucru curenta zona in care este deschis tabelul ce se doreste a fi inchis, si se introduce comanda USE fara nici un nume de tabel;
se foloseste comanda USE cu clauza IN pentru a indica zona de lucru in care se va inchide tabelul.
Exemplu:
USE clienti
BROWSE
USE
2. USE IN clienti && daca aliasul tabelului este clienti
d) Indicarea zonei de lucru
prin utilizarea comenzii SELECT 0 - se indica urmatoarea zona de lucru libera, inainte de a deschide un tabel nou.
Cu ajutorul comenzii SELECT se selecteaza zona de lucru activa la un moment dat. Sintaxa comenzii este:
SELECT nWorkArea | cTableAlias
Exemplu: Presupunand ca tabelul Clienti este deschis in zona 3 cu aliasul cli, selectarea zonei in care este deschis fisierul se poate face astfel:
SELECT 3
sau
SELECT cli
e) Referirea la tabele deschise in alte zone de lucru
Se poate face referire la campuri apartinand unor tabele deschise in alte zone de lucru, plasand inainte de numele campului aliasul urmat de un punct '.' sau de operatorul '->'.
Exemplu: Daca dintr-o zona de lucru oarecare se doreste accesarea campului manager din cadrul tabelului Clienti, deschis intr-o alta zona cu aliasul cli, se poate folosi urmatoarea notatie:
cli.manager sau cli->manager
Cand se stabilesc relatii temporare intre tabele, se determina indicatorul de inregistrari al uneia dintre tabele (tabela fiu) sa urmareasca in mod automat miscarile indicatorului de inregistrari al celeilalte tabele (tabela parinte). Astfel se poate selecta o inregistrare din partea 'una' (parinte) a unei relatii si se obtine automat acces la inregistrarile asociate din partea 'mai multe' (fiu) a relatiei.
Exemplu: se pot lega tabelele Clienti si Facturi astfel incat atunci cand indicatorul de inregistrari din tabelul Clienti ajunge in dreptul unui anumit client, indicatorul de inregistrari din tabelul Facturi sa se pozitioneze pe inregistrarea care are acelasi identificator pentru client.
Se pot utiliza zonele de lucru si aliasurile tabelelor pentru a stabili relatii intre doua tabele deschise, prin intermediul comenzii SET RELATION.
Daca se utilizeaza un formular pentru a lucra cu tabelele respective, se pot stoca relatiile ca parte a mediului de date pentru formularul respectiv.
Pentru a crea relatii temporare intre tabele :
in fereastra Data Session se selecteaza tabelele si se foloseste butonul Relations pentru a crea relatiile (legaturile);
sau
se foloseste comanda SET RELATION, cu sintaxa:
SET RELATION TO
[eExpr1 INTO nWorkArea1 | cTableAlias1
[, eExpr2 INTO nWorkArea2 | cTableAlias2
]
[IN nWorkArea | cTableAlias]
[ADDITIVE]]
Comanda SET RELATION stabileste o relatie intre un tabel deschis in zona de lucru curent selectata si un tabel deschis intr-o alta zona de lucru. De obicei, tabelele asociate au un camp comun, iar expresia utilizata pentru a stabili relatia este chiar expresia de indexare a indexului de control al tabelului fiu.
Exemplu: Unui client i se pot emite mai multe facturi. Stabilind o relatie pe baza campului comun al tabelelor de clienti si facturi se pot vedea imediat toate facturile corespunzatoare fiecarui client. Secventa de cod urmatoare foloseste campul cod_cli, care este comun celor doua tabele si creaza o relatie intre acestea pe baza campului cod_cli din tabelul clienti si a etichetei de index cod_cli din tabelul Facturi.
USE Clienti IN 1
USE Facturi IN 2
SELECT facturi
SET ORDER TO TAG cod_cli
SELECT clienti
SET RELATION TO cod_cli INTO facturi
SELECT facturi
BROWSE NOWAIT
SELECT clienti
Fereastra Data Session afiseaza cele doua tabele deschise , precum si relatiile stabilite cu ajutorul comenzii SET RELATION.
In exemplul precedent s-a stabilit o singura relatie intre doua tabele. Din sintaxa comenzii SET RELATION se desprinde faptul ca aceasta se poate folosi pentru a stabili relatii multiple intre un tabel parinte si mai multe tabele fiu.
Crearea unor relatii intre inregistrarile dintr-un singur tabel
Exista posibilitatea de a crea relatii intre inregistrarile unui singur tabel, care pot fi utile atunci cand toate informatiile necesare sunt stocate intr-un acesta. Acestea se numesc relatii de autoreferentiere.
Pentru a crea o relatie de autoreferentiere se deschide de doua ori acelasi tabel: o data intr-o anumita zona de lucru, iar a doua oara cu ajutorul clauzei AGAIN a comenzi USE, intr-o alta zona de lucru. Apoi se utilizeaza un index care sa asocieze inregistrarile.
Exemplu: Se considera un tabel Personal (nr_pers, nume, prenume, functie, subordonat). La navigarea prin tabelul Personal, pe masura ce se muta indicatorul de inregistrari de la un manager la altul, se doreste vizualizarea angajatilor din subordine.
SELECT 0
USE Personal ALIAS manager
SELECT 0
USE Personal AGAIN ALIAS subordonat
INDEX ON subordonat TAG manag_id
SET ORDER TO manag_id
SELECT manager
BROWSE
SELECT subordonat
BROWSE
Atunci cand se muta indicatorul de inregistrare in feresatra BROWSE a tabelului manager, fereastra BROWSE a tabelului subordonat este actualizata astfel incat sa afiseze numai subordonatii managerului respectiv.
Relatiile persistente intre tabele sunt relatii intre tabelele apartinand unei baze de date, care sunt stocate in fisierul bazei de date , si sunt folosite automat drept conditii implicite de jonctiune in ferestrele Query Designer si View Designer. Sunt afisate in Database Designer ca linii de legatura intre indecsii tabelelor, sunt afisate in Data Enviromnent Designer ca relatii implicite pentru formulare si rapoarte si sunt folosite pentru a stoca informatii despre integritatea referentiala.
Se deosebesc de relatiile temporare ( create cu SET RELATION) prin faptul ca nu trebuie sa fie create de fiecare data cand se folosesc tabelele.
Nota: Datorita faptului ca relatiile persistente nu controleaza relatiile dintre indicatorii inregistrarilor din tabele, cand se dezvolta aplicatii Visual FoxPro se folosesc atat relatii temporare (SET RELATION) cat si relatii persistente.
Relatiile persistente se stabilesc intre indecsi, nu intre campuri, ceea ce permite legarea tabelelor pe baza unei expresii simple sau complexe compuse din indecsi
in Database Designer se alege numele indexului care se doreste legat si se trage cu mouse-ul peste numele indexului din tabelul legat.
Relatiile persistente apar in Database Designer ca linii care unesc tabelele legate.
De regula relatiile persistente sunt create folosind indecsii din cheile primara si externa. Tipul etichetei de index sau al cheii determina tipul relatiei persistente care se poate crea.
Trebuie folosita o eticheta index sau o cheie primara sau candidat pentru partea 'unu' a relatiei unu-la-mai-multe, iar pentru partea 'mai multe' se foloseste o cheie sau o eticheta de index obisnuita.
Stergerea unei relatii persistente intre tabele
In Database Designer se executa clic pe linia de relatie intre doua tabele si se apasa tasta DELETE
Generarea integritatii referentiale
Generarea integritatii referentiale presupune crearea unui set de reguli care sa pastreze relatiile definite intre tabele atunci cand se insereaza sau se sterg inregistrari.
Respectarea integritatii referentiale presupune ca Visual FoxPro va impiedica: adaugarea unei inregistrari la un tabel legat atunci cand nu exista nici o inregistrare asociata in tabelul primar, modificarea de valori in tabelul primar care ar duce la aparitia de inregistrari fara parinte in tabelul asociat sau stergerea de inregistrari din tabelul primar atunci cand exista inregistrari asociate.
Visual FoxPro furnizeaza un generator de integritate referentiala (RI - Referential Integrity Builder) care permite determinarea tipurilor de reguli ce se doresc intarite, tabelele pentru care regulile trebuie intarite si evenimentele de sistem care impun mediului sa verifice respectarea regulilor de integritate referentiala.
Generatorul RI gestioneaza mai multe niveluri de stergere si actualizari in cascada si este instrumentul cel mai potrivit pentru generarea integritatii referentiale.
in Database Designer se selecteaza Referential Integrity din meniul Database.
Prin folosirea generatorului de integritate referentiala in scopul de a crea regulile pentru baze de date, Visual FoxPro genereaza cod care intareste regulile de integritate referentiala, cod salvat sub forma de declansatoare care contin referinte la procedurile stocate. Acest cod poate fi vizualizat deschizand editorul de text pentru procedurile stocate.
Nota: Daca se intervine in arhitectura bazei de date, prin modificarea tabeleor sau a indecsilor folositi intr-o relatie persistenta va trebui rulat din nou generatorul RI inainte de a folosi baza de date. Aceasta determina revizuirea codului procedurilor stocate si a declansatoarelor tabelelor folosite pentru a intari integritatea referentiala astfel incat aceasta sa reflecte noua arhitectura.
Crearea procedurilor stocate
O procedura stocata este o secventa de cod Visual FoxPro stocata in fisierul .dbc. Acestea opereaza in mod specific asupra datelor din bazele de date, si au rolul de a imbunatati performantele deoarece sunt incarcate in memorie la deschiderea bazei de date.
a) Crearea unei proceduri stocate
in Project Manager se alege o baza de date si se selecteaza StoredProcedures, apoi se actioneaza butonul New
in Database Designer se alege comanda Edit Stored procedures din meniul Database
se foloseste comanda MODIFY PROCEDURE
Oricare din aceste metode deschide editorul de text Visual FoxPro care permite crearea procedurilor stocate in baza curenta.
b) Modificarea si stergerea procedurilor stocate
in Project Manager se alege o baza de date si se selecteaza StoredProcedures, apoi se actioneaza butonul Modify sau Remove
in Database Designer se alege comanda Edit Stored procedures din meniul Database
Procedurile stocate pot fi utilizate pentru a crea functii definite de utilizator care sa fie adresate in regulile de validare la nivel de camp si de inregistrare. Atunci cand o UDF este salvata sub forma de procedura stocata in baza de date, codul functiei este salvat in fisierul .dbc si se muta odata cu baza de date daca aceasta isi schimba amplasamentul. Utilizarea procedurilor stocate imbunatateste portabilitatea aplicatiei, deoarece nu este necesara gestionarea fisierelor care contin functiile definite de utilizator separat de fisierul bazei de date.
Cand se construieste o baza de date, Visual FoxPro creaza si deschide in mod exclusiv un fisier .dbc (DataBase Container), care stocheaza toate informatiile despre baza de date, inclusiv numele fisierelor si obiectelor asociate. Fisierul .dbc nu contine in mod fizic nici unul din obiectele de nivel inalt (tabele sau campuri), ci stocheaza pointerii cailor de acces la fisierele asociate tabelelor din baza de date.
Schema bazei de date este o reprezentare a structurii tabelelor si relatiilor persistente stabilite in cadrul bazei de date. Pentru o baza de date deschisa aceasta schema este afisata in Database Designer, care este deschis cu comanda MODIFY DATABASE.
Exemplu: MODIFY DATABASE Parteneri
Fisierul bazei de date contine cate o inregistrare pentru fiecare tabel, vedere, index, relatie persistenta si conexiune asociata bazei de date, precum si pentru fiecare camp din tabel sau vedere cu proprietati extinse. Fisierul mai contine o unica inregistrare cu toate procedurile stocate in baza de date.
Database Designer ofera o reprezentare conceptuala a schemei bazei de date. Se poate naviga printr-o baza de date inchisa folosind comanda USE pentru fisierul .dbc.
Exemplu: CLOSE DATABASE Parteneri
USE Parteneri.dbc EXCL
BROWSE
|