Lucrarea 4

Sortarea si indexarea tabelelor. Crearea Interogarilor.

1. Sortarea tabelelor

SORT TO fisier_sortat ON câmp1 [/A][/C][/D]
    [,câmp2 [/A][/C][/D] …][FOR expL]

2. Indexarea tabelelor

INDEX ON cheie_de_sortare TO fis_index [UNIQUE][DESCENDING]

Exemplu:
USE stud
LIST
INDEX ON SUBSTR(nume,1, 5) TO inume
INDEX ON cods TO icods
USE stud INDEX inume, icods
LIST
SET ORDER TO 2 && stabileste index activ: icods
LIST
USE

Exemplu:
Adaugati câteva înregistrari nu numele "Pop", "Popa", "Popescu" în fisierul Stud apoi reindexati fisierul iNume. Rulati apoi programul L41.PRG.
*** Fisierul L41.PRG
USE STUD INDEX iNume
SET EXACT ON && cautare pe întreaga lungime a sirului
FIND Pop
IF FOUND()
  ? "Gasit prin FIND:"
  DISP
ELSE
  ? "Nu exista înregistrarea"
ENDIF
SEEK "P"+"op"
IF FOUND()

  ? "Gasit prin SEEK:"
  DISP
ELSE
  ? "Nu exista înregistrarea"
ENDIF
SET EXACT OFF && cautare dupa prefixul sirului
SEEK "Pop"
IF FOUND()
  ? "Toate numele care încep cu Pop:"
  DO WHILE .NOT. EOF() .AND. nume = "Pop"
    DISP
    SKIP
  ENDDO
ENDIF
ACCEPT "Nume Student:" TO vNume
FIND &vNume && echivalent cu SEEK vNume
IF FOUND()
  ? "Date pentru studentul "+vNume
  DISP
ELSE
  ? vNume+"nu exista în tabela"
ENDIF
USE
RETURN

   3. Lucrul cu mai multe tabele. Specificarea relatiilor între tabele

Exemplu:
Se va crea o tabela masini.DBF care va retine date despre masinile studentilor din tabela stud.DBF. Aceasta va avea câmpurile CODS (cod student la fel ca si în stud), NRM ( numar înregistrare ), MARCA ( producator auomobil ), TIP ( tip automobil ), culoare, nr_usi. Se vor introduce câteva înregistrari, pastrându-se corespondenta între câmpul CODS din stud si masini. Se va indexa apoi prin INDEX ON cods TO iMCods.
*** Fisierul L42.PRG
SELECT 2
USE masini ALIAS mas INDEX iMCods
USE stud IN 1 INDEX iNume
SELECT 1
? "Zona 1"
LIST
SELECT 2
? "Zona 2"
LIST
SELECT 1
ACCEPT "Stundent: " TO cNume
SEEK cNume
IF FOUND()
  SELECT 2
  SEEK stud->cods && corect pt. ca în zona 2 este activ iMCods
  IF FOUND()
    ? "Studentul: "+stud->nume+" are masina:"
    ?TRIM(marca)+TRIM(tip)
    ? "Cu numarul de inregistrare:"+ nrm
  ELSE
    ? "Studentul: "+stud->nume+" nu are masina"
  ENDIF
ELSE
  ? "Studentul "+cNume+" nu exista in tabela"
ENDIF
WAIT "Sfarsit!"
CLOSE DATABASES
RETURN

Pentru a stabili o relatie trebuie parcursi urmatorii pasi:

  1. Se deschide tabela sursa.
  2. Se deschide tabela destinatie indexata dupa criteriu de legatura în alta zona.
  3. Se selecteaza zona cu tabela sursa a relatiei (de unde pleaca relatia)
  4. Se executa instructiunea:
    SET RELATION TO cheie_de_legatura INTO tabela_destinatie [CONSTRAI N] [ADDITIVE]

Exemplu:
*** Fisierul L43.PRG
CLEAR
USE stud IN 1
USE masini IN 2 INDEX iMCods ALIAS mas
SELECT 1
SET RELATION TO cods INTO mas
GO TOP
DO WHILE .NOT. EOF()
  ? "Studentul :"+nume
  IF EOF(2)
    ? "Nu are masina"
  ELSE
    ? "Are masina cu numarul: "+mas->nrm
  ENDIF
  SKIP
ENDDO
CLOSE DATADABES
RETURN

4. Folosirea interogarilor Visual dBase

Exemplu:
Interogarea Masini.QBE creaza o vedere formata din studentii bursieri care au masina, adaugând si un câmp suplimentar care afiseaza initialele orasului în care este inmatriculata masina.

    

Imaginea urmatoare prezinta definirea relatiilor între tabelele Stud si Masini.

    

Rezultatul rularii acestei interogari este asemanator cu cel al continutului unei tabele obisnuite.

    

4. Probleme propuse
P1. Rulati exemplele prezentate în acest capitol.

P2. Sortati dupa câmpul nume tabela Stud cu ajutorul comenzii SORT si depuneti rezultatul în fisierul Stud1.DBF. Creati un program care sa citeasca numele unui student de la consola si apoi sa caute informatiile în tabela Stud1 printr-un algoritm de cautare binara. Algoritmul de cautare binara va împarti tabela la fiecare pas în doua jumatati egale si apoi va compara cheia de cautare cu înregistrarea de la mijlocul intervalului. Se vor folosi instructiunea GO si functia RECCOUNT().

P3. Scrieti o secventa de program care deschide tabele Stud si Masini si creeaza doua relatii de sens opus între ele. Folosind aceste relatii sa se caute un student dupa nume si apoi sa se afiseze datele despre masina sa apoi sa se caute o masina dupa numarul de înregistrare si apoi sa se afiseze datele despre proprietarul sau.


© s.l. dr. ing. Dan Pescaru '2004