Lucrul simultan cu mai multe tabele

 

            In mediile xbase activarea unei tabele se face intotdeauna intr-o asa-numita „zona de lucru”. Daca la activarea unei tabele nu se specifica o zona de lucru, in mod implicit aceasta activare se face in zona de lucru 1.. In fiecare zona de lucru poate fi activata o tabela, ceea ce permite lucrul simultan cu mai multe tabele.

            La un moment dat exista o singura zona selectata, tabela activa din acea zona fiind denumita tabela curenta . Daca intr-o zona a fost activata o tabela si apoi inca una, s-a produs implicit dezactivarea celei dintai.

            Selectarea unei zone de lucru se face cu comanda:

                        SELECT numar_zona

 

            Pentru lucrul simultan cu mai multe tabele exista doua posibilitati:

 

1.      folosirea unor tabele nerelationate (necuplate, nelegate prin relatii)

In acest caz veti utiliza comenzile studiate pana acum si pozitionarea in fiecare tabela trebuie facuta prin comenzi explicite (locate, seek ).

2.      folosirea tabelelor relationate (cuplate prin relatii, intre care s-au stabilit legaturi)

In acest caz mai intai se utilizeaza o comanda speciala care „cupleaza” tabelele intre ele, astfel incat orice pozitionare  pe un articol in una din tabele determina pozitionarea pe articolul corespunzator din tabela relationata cu prima.

 

Lucrul simultan cu tabele nerelationate

 

In acest caz tabelele ce trebuie utilizare se deschid simultan in zone de lucru distincte. Pozitionarea pe articolul de interes din fiecare tabela se face prin selectarea zonei in care se afla tabela corespunzatoare si  utilizarea comenzii de pozitionare in tabela cu comenzile SEEK sau LOCATE.

 

Observatie:

La un momendat una dintre zonele de lucru este cea curenta. Selectarea unui camp al unei tabele din zona de lucru curenta se face in mod obisnuit cu nume_camp in schimb selectarea unui camp al unei tabele din alta zona de lucru se face cu nume_tabela .nume_camp

 

Exemplu:

 

Fie tabelele:

biblioteca.dbf (cod_carte, titlu, autor, pret, an_aparitie),

cititori.dbf(cod_cititor, nume_prenume, adresa, telefon)

imprumut.dbf(cod_carte, cod_cititor, data_imprumut).

 

Presupunand ca fiecare persoana poate imprumuta o singura carte la un momendat sa se determine:

    1. pentru o persoana a carei nume se citeste de la tastatura ce carte a imprumutat si cand:

 

Fiecare tabela se deschide intr-o zona de lucru si se indexeaza

sele 1

use biblioteca

index on cod_carte to i1

 

sele 2

use cititori

index on cod_cititor to i2

 

sele 3

use imprumut

index on cod_cititor to i3

 

accept numele persoanei   to nm

sele 2

locate for nume=nm

c=cod_cititor

 

sele 3

seek c

y=cod_carte

 

sele 1

seek y

? ”cartea ”,  titlu, avand pretul  ”, pret, ” a fost imprumutata de cititorul ”,cititori.nume_prenume,” cu telefonul ”, cititori.telefon, ”la data de ”, imprumut.data_imprumut

 

Observatie: in interogarea anterioara nu are relevanta indexarea tabelei cititori dupa campul cod_cititor dar s-a tinut cont de faptul ca indexarea unei tabele se realizeaza in special dupa cheia primara (sau dupa campul dupa care se realizeaza cele mai frecvente interogari).

 

Exercitii:

Pentru baza de date anterioara se vor determina:

a.       pentru o carte al carui titlu si autor se citesc de la tastatura de cine a fost imprumutata si cand

b.      cat costa cartea imprumutata de un cititor (al carui nume se citeste de la tastatura) la o data citita

c.       la cine este cea mai scumpa carte in cazul in care a fost imprumutata)

d.      de cate ori a imprumutat carti un cititor al carui nume se citeste de la tastatura

e.       care este ultima carte imprumutata de acesta

f.        este cartea X imprumutata de cititorul Y? Indicatie: se cauta in tabela imprumut cel mai recent imprumut al lui Y si se varifica daca codul cartii X este codul cartii imprumutate

g.       de la ce editura este ultima carte imprumutata. De cine a fost imprumutata?

h.       Cand a imprumutat cititorul X cartea cu titlul Y de la editura Z?

i.         A imprumutat de mai multe ori cititorul X aceasta carte? (se va afisa adevarat sau fals)

j.        Formulati o interogare care sa presupuna lucrul simultan cu mai multe tabele

 

Fie baza de date depozit care ar trebui sa prelucreze informatii privind stocul de materiale, furnizorii si clientii (cumparatorii) precum si informatii legate de vanzarile produselor:

Informatiile de interes sunt: denumire material, pret unitar,  cantitate, unitate de masura, furnizor, adresa furnizor, telefon furnizor, client, adresa client, cantitate cumparata etc.

Formulati interogari care sa va afiseze informatii din doua sau mai multe tabele. Actualizati baza de date in urma receptionarii unui nou produs sau vanzarii unui produs