Lucrul simultan cu tabele relationate

 

            Tabelele se deschid in in zone de lucru diferite. Prin relationarea a doua tabele, orice pozitionare facuta in una din tabele conduce autonat la o pozitionare in cea de a doua. Relationarea nu este o legatura egalitara intre tabele, ci una de subordonare: una din tabele va fi parinte ( sau  “conducatoare”) iar cealalta va fi copil (sau “condusa”). Comanda ce stabileste o relatie este urmatoarea:

                       

SET RELATION TO expresie INTO nr_zona | alias [ADDITIVE]

 

Observatii:

·        Inainte de stabilirea relatiei este necesar ca tabela copil sa fie indexata cu aceeasi cheie ca si cea a relatiei.

·        La lansarea comenzii, tabela parinte trebuie sa fie deschisa in zona de lucru current selectata.

·        Tabelele relationate au in general un camp comun, dupa  care este indexata tabela copil.

·         Daca se foloseste optiunea ADDITIVE se pastreaza toate relatiile deja existente ale tabelei parinte.

 

Fie tabelele produse si vanzari avand structurile:

produse [codp(C10), denumire (C15), pręt (N10), datap(D), cant(N4), um(C10)]

vanzari  [codp(C10), cantv(N4), datav(D), client (C15)]

 

produse

codp

denumire

pret

datap

cant

um

1

Ciocolata

20000

12/03/2004

20

buc

2

Biscuiti

7000

11/06/2004

50

buc

3

Suc

23000

04/05/2004

50

buc

4

Bomboane

45000

12/13/2004

100

buc

5

napolitane

8000

12/05/2004

120

buc

  vanzari

codp

cantv

datav

client

1

10

12/06/2004

Cimco

2

10

11/09/2004

Carom

4

10

12/16/2004

Meda

 

 

 

 

 

1. Se doreste afisarea sumei obtinute in urma vanzarii unui produs

 

sele 1

use produse alias pp

index on codp to cc

 

sele 2

use vanzari alias vv

index on codp to xx

 

sele 1

set rela to codp into vv

 

2. Pentru a determina cate bucati de biscuiti s-au vandut:

 

Seek ‘2’

display  'Din produsul ', denumire, 'avand pretul ', pret, ' s-au vandut ', vv.cantv,  ' bucati'

 

display 'Pt produsul ',denumire,' s-au incasat ',vv.cantv*pret,' lei'

 

In cazul in care unui articol din tabela parinte ii corespunde mai multe articole din tabela copil spunem ca este vorba de o relatie de unul–la-mai-multi

Comanda :

Set skip to alias

Determina ca pozitionarea pe un articol din tablela parinte sa lege de fiecare dintre articolele corespunzatoare din tabela copil.

 

 

produse

codp

denumire

pret

datap

cant

um

1

Ciocolata

20000

12/03/2004

20

buc

2

Biscuiti

7000

11/06/2004

50

buc

3

Suc

23000

04/05/2004

50

buc

4

Bomboane

45000

12/13/2004

100

buc

5

napolitane

8000

12/05/2004

120

buc

  vanzari

codp

cantv

datav

client

1

10

12/06/2004

Cimco

2

10

11/09/2004

Carom

4

10

12/16/2004

Meda

2

15

12/06/2004

Danis

 

 

3. Pentru biscuiti se realizeaza doua vanzari. Pentru a afisa ambele cantitati vandute pentru biscuiti:

 

Seek ‘2’

Set skip to vv

 

display denumire,vv.cant ,'bucati vandute  pe ', vv.datav for codp='2’

 

4. Pentru a determina suma incasata pe biscuitii vanduti:

Seek ‘2’

Sum pręt*vv.cantv to s for codp=’2’

?s           afiseaza  175 000

 

Pentru a determina valoarea produselor vandute:

?denumire, pręt*vv.cantv for cantv<>0

 

5.Pentru a determina valoarea incasata in urma vanzarii produselor:

Sum pręt*vv.cantv to x

?x

 

Comanda UPDATE permite actualizarea datelor din tabele relationate:

 

UPDATE ON camp_cheie FROM alias REPLACE camp WITH expresie

 

6. Pentru actualizarea campului cant din tabela produse in urma vanzarilor:

 

UPDATE ON codp FROM vv REPLACE cant WITH cant-vv.cantv

 

Probleme propuse:

  1. Testati comenzile anterioare
  2. Se citeste denumirea unui produs. Sa se afiseze (data) datele la care s-a vandut produsul respective
  3. sa se actualizeze cantitatea din tabela produse
  4. sa se determine valoarea obtinuta pt cantitatea vanduta
  5. sa se afiseze daca produsul a expirat (un produs expira dupa 30 zile)
  6. pentru urmatorul articol din tabela sa se determine acelasi lucru
  7. care este ultimul produs  cumparat de un client al carui denumire se citeste de la tastatura
  8. care sunt clientii care cumpara cel mai scump produs
  9. determinati daca doi clienti au facut vanzari de aceeasi suma pentru un produs al carui denumire se citeste de la tastatura. Se va afisa adevarat sau fals.
  10. determinati care este ultima achizitie a unui client citit si care este valoarea ei
  11. stiind ca produsele expira dupa 60 de zile sa se afiseze produsele expirate
  12. sa se stearga produsele expirate din tabela
  13. cate vanzari s-au facut astazi 
  14. sa se determine daca astazi s-a vandut cel mai vechi produs
  15. care sunt produsele primite in decembrie ?
  16. de cate ori a cumparat clientul x produsul y?
  17. se citesc date de la tastatura pentru un nou produs. Sa se completeze in ambele tabele
  18. sa se afiseze toti clientii a caror denumire incepe cu C
  19. sa se transforme denumirea clientului x in S.C. x S.R.L
  20. sa se majoreze cu 20% pretul produselor clientului x
  21. se se afiseze toate produsele cu pretul mai mare decat pretul mediu
  22. sa se numere produsele care nu mai sunt in stoc
  23. care este diferenta dintre suma incasata pe produsul x si suma incasata pe produsul y
  24. sa se genereze un nou camp in tabela vanzari care sa retina luna si data vanzarii la care sa se adauge codul produsului
  25. sa se determine daca s-au vandut produse luna asta in zilele 9 si 16