Sunteți pe pagina 1din 25

5.

INDEXAREA SI SORTAREA FISIERELOR


5.1.Sortare i indexare Crearea de noi nregistrri ntr-un fiier se face de regul la sfrit prin adugare folosind comanda APPEND, sau prin nserri intre cele existente prin INSERT. Inserarea nu se recomand fiindc necesit mutarea tuturor nregistrrilor care urmeaz. La adugare nu se ine n general cont de coninutul cmpurilor nregistrrii. Se admite i concatenarea unor fiiere total sau parial prin: APPEND FROM fis [FOR cond] [TYPE SDF | DELIMITED [WITH <char> | BLANK]] [REINDEX] nregistrrile fiierului specificat, care ndeplinesc condiia, sunt adugate la fiierul curent deschis. Daca fiierul nu este de tip DBF, se va specifica si tipul su: SDF ASCII text file (System Data Format) n care delimitarea nregistrrilor se face prin CR- Carage Return si LF -Line Field DELIMITED presupune un fiier text n care cmpurile sunt delimitate prin virgula CSV (Comma Separated Value) iar nregistrrile prin CR. DELIMITED [WITH <char> | BLANK]] Cmpurile delimitate prin caracterul specificat sau spatiu (BLANK). [REINDEX] indic actualizarea fiierelor index dup terminarea comenzii Pentru a realiza diferite situaii si rapoarte, articolele trebuie sa fie ordonate n fiier dup anumite criterii: pe secii, faculti, an grupa, cod de material sau piesa, conturi, cod salariat, etc. Ordonarea complet sau pariala a unui fiier dup unul sau mai multe cmpuri (sau chiar poriuni de cmp), se realizeaz prin comanda SORT, care genereaz un nou fiier sortat, cel curent rmnnd nemodificat. SORT [domeniu] TO fis_sortat ON cimp1 [/A][/C][/D], cimp2 [/A].....[FOR cond][ASCEN/DESC] Sortarea in ordinea cheilor se face: /A - cresctor innd cont de codul ASCII pentru iruri de caractere /C - fr deosebire intre literele mari si mici /D - ordine descresctoare ASCE/DESC - ordinea de sortare este aceeai pentru toate cheile USE STUD && deschide fiierul nesortat LIST && listare fiier nesortat SORT TO STUD_S ON NUME && sortare dup cmpul Nume n fiierul Stud_S USE STUD_S && deschidere fiier sortat LIST && afiare fiier sortat

Numrul maxim de chei de sortare este 10 si nu pot fi de tip logic, sau memo. Sortarea necesita nc 2 fiiere de manevra i spaiu pentru fiierul sortat si nesortat pe disc. Pentru fiecare situaie listat este necesar o alt sortare. Pentru studeni se poate cere listarea n ordine alfabetic, n ordinea mediilor, n ordinea codului, pe grupe, etc. Pentru a putea parcurge fiierul n ordine dup chei diferite se recomand utilizarea indexrii, care este mai rapid si mai economica sub aspectul spaiului i vitezei de prelucrare. Un fiier poate fi indexat dup maxim 47 de chei, care pot fi combinaii de cmpuri. Pentru fiecare cheie se creeaz un fiier index (.NDX), care conine valorile sortate ale cmpului si numrul de ordine al nregistrrii corespunztoare din fiier. Pentru a simplifica utilizarea indecilor s-a introdus gruparea indecilor pentru un fiier de date ntr-un singur fiier cu extensia .MDX. 5.2. Metode de indexare Pentru regsirea rapid n acces direct a informaiilor din fiierele unei baze de date (BD), pe baza unei chei simbolice, se folosesc metode de indexare sau randomizare a cheii. n majoritatea sistemelor de gestiune a bazelor de date (SGBD) se utilizeaz metode de indexare care s-au perfecionat mult. Indexarea multinivel permite o regsirea unei nregistrri cu valoare dat a cheii prin 3-4 poziionri pe disc. Pentru un timp de acces disc care este n prezent de cca. 10 ms, aceasta nseamn regsirea unei nregistrri dintr-o BD cu zeci de mii de articole n mai puin de 0,1 secunde. Avantajele indexrii fa de utilizarea hashingului constau n : posibilitatea citirii ordonate a nregistrrilor, secvenial n ordinea cheii de indexare; permite accesul direct la o nregistrare i parcurgerea n continuare a fiierului, secvenial din acel punct, pentru a citi nregistrri care au egal o parte a cheii (studeni din aceeai secie i an); posibilitatea crerii mai multor fiiere index, pentru acelai fiier de date dup diferite cmpuri, care sunt chei secundare (exist mai multe nregistrri cu aceeai valoare a cmpului index). Pentru regsirea informaiilor n acces direct, performanele tuturor metodelor de indexare sunt bune, dar indexarea are i dezavantaje care trebuie menionate: utilizarea fiierelor index multinivel (cele mai des folosite), consum mult timp pentru actualizarea fiierelor index la adugarea de noi nregistrri n BD mari, care limiteaz utilizarea lor mai ales cnd exist mai multe fiiere index pentru un fiier de date; spaiul disc consumat de fiierele index este de acelai ordin de mrime cu cel al fiierelor de date i mult mai mare dect cel utilizat de directoarele de hashing. Primul dezavantaj se elimin prin utilizarea unor algoritmi de indexare dinamic cum sunt cei cu arbori echilibrai B+ cu ncrcare incomplet a nodurilor, care se vor prezenta n continuare. Aceast metod complic procedurile de cutare i actualizare a fiierului index. Spaiul disc folosit pentru fiierele index poate fi redus funcie de aplicaie prin utilizarea unor structuri de BD care folosesc liste nlnuite cu pointeri sau fiiere de legturi. Se elimin n acest caz spaiul ocupat de cheie n nregistrarea de index.

5.2.1. Indexarea multinivel nedens dup cheia primar Fiierele secvenial indexate clasice au fost realizate pe un fiier secvenial sortat, format din blocuri grupate pe cilindri. Pentru fiecare cilindru s-a creat o tabel index nregistrri pe cilindru, format din cte o intrare pentru fiecare bloc de date. O nregistrare de index conine valoarea cheii primare maxime din bloc i adresa blocului la care se refer. Tabela este plasat n unul sau mai multe blocuri la sfritul cilindrului. Pentru ntregul fiier disc ( volum) se realizeaz o tabel index cilindri pe fiier, avnd cte o intrare pentru fiecare cilindru. Intrarea conine cheia maxim pe cilindru i adresa tabelei index a cilindrului. Dac o tabel de index conine mai multe blocuri, se va crea o tabel index rezumat urmat de blocurile tabelei detaliu. O intrare din tabela rezumat conine cheia maxim dintr-un bloc detaliu i adresa blocului respectiv. Tabela rezumat este separat de tabela detaliu prin unul sau mai multe blocuri libere. La consultare se citete tabela rezumat i se determin blocul din tabela detaliu care conine cheia cutat. Acesta se poate citi n aceeai tur de pist prin folosirea blocurilor libere, ce vor fi parcurse pe timpul cutrii n tabela rezumat. Citirea tabelei cilindru i a blocului ce conine nregistrarea cu cheia cutat se va face printr-o singur poziionare pe disc, deoarece ele se gsesc pe acelai cilindru. cil. 0 bl. 0 record 1 bl. 1 bl. 2 Tabela record 2

index

nreg. pe

cil.0

cil. 1

Tabela cil. K bl. N Tabela Tabela

index

nreg. pe

cil.1

index index

nreg. pe cil. pe

cil.k fiier

Tabel index detaliu Tab.index rezumat Fig.5.1. Indexare multinivel nedens Metoda folosete indexarea nedens, deoarece numrul de chei din tabela index este mult mai mic dect numrul de chei din fiierul de date. Spaiul ocupat de index este de cca. 10 % din spaiul ocupat de fiierul de date. Aceasta duce la un acces rapid la nregistrri cu maxim 2 accese disc. Metoda a fost totui abandonat, deoarece adugrile

ulterioare de nregistrri se fac ntr-o zon de depire unde se nlnuie cu pointer n nregistrarea precedent existent n zona principal a fiierului. Dup crearea fiierului, tabelele index rmn nemodificate, nu se admit valori duble pentru chei ( cheie primar). 5.2.2. Fiiere index dense multinivel SGBD-urile relaionale folosesc fiiere index "dense" aplicate pe fiiere de date neordonate. Se pot construi fiiere index pentru mai multe cmpuri din fiier, fr ca acestea s fie cmpuri cheie (chei secundare). Fiierul index va conine cte o intrare pentru fiecare nregistrare din fiier. Intrarea de index este de forma ( K i , Pi ) unde K i este valoarea cheii, iar Pi un pointer ce indic adresa nregistrrii ce conine cheia n fiierul de date. Adresa este relativ n fiier i poate fi: adresa n octei a nregistrrii n fiier; adresa sector nceput bloc plus adresa octet n bloc a nregistrrii (.NDX); numrul nregistrrii n fiier ( fiiere .MDX n dBASE ). Ultima form ocup doar 4 octei i presupune nregistrri cu lungime fix, condiie impus n unele BD relaionale. Tabela index obinut se sorteaz n ordinea valorii cheilor i face referiri la nregistrrile din fiierul de date prin pointer. Dac tabela index conine mai mult de un bloc se creeaz o tabel rezumat de nivel 2 (fig.5.2), n care pentru fiecare bloc din nivelul 1 se creeaz o intrare ce conine cheia maxim din acel bloc i numrul sectorului unde ncepe blocul. Fiecare bloc din tabela de nivel 2 se plaseaz dup blocurile de nivel 1, la care se refer. n acelai mod se formeaz tabele index de nivel 3, .a.m.d. Cutarea unei nregistrri pentru o cheie dat presupune citirea a cte un bloc din fiecare nivel, plus blocul din fiierul de date. Cutarea unei chei n blocurile index se face rapid n memoria central i timpul se neglijeaz. Pentru un fiier de 30 de mii de articole cu lungimea nregistrrii index de 16 octei (12 cheie +4 adres) rezult 3 nivele de index, deci 4 poziionri pe disc. Timpul de acces este sub 0,1 secunde pentru discuri cu timp de acces sub 20 ms. Fiierele index multinivel necesit mult timp pentru actualizare cnd sunt de mari dimensiuni. Adugarea unei noi chei duce la o reorganizare a tabelelor index, prin inserare ntr-un tabel secvenial ordonat. Pentru a pstra consistena BD pentru orice actualizare n fiierul de date, se actualizeaz toate fiierele index asociate, dac n dBASE se utilizeaz fiiere .MDX.

Tabela rezumat (nivel 2) Adr.sector Cheie maxima bloc index pe bloc index 006 ASUE... 008 BRLX... 00A CWCV... 00C DYWV... 00E EZIL... 010 FYEO... ... ... 030 XSDX... 032 YSDN... 034

Tabela index (nivel 1) Nr. sector Cheie Nr.inr.in nregistrare fi.date 006 ... ... ASUE... 09B 008 ... BRLX... 012 00A CWCV... 054 00C DYWY... 023 00E ... 030 XSDX... 032 YSDN... 034 ZZZZ... 036 Tabela rezumat 005 index (nivel 2) 042 015

Fig. 5.2. Fiier index dens multinivel La folosirea fiierelor de tip NDX, este posibil ca la adugri i tergeri numeroase de nregistrri fiierele index s nu fie deschise. Refacerea fiierelor index se va face la sfritul lucrrii prin reindexare i nu dup fiecare nregistrare adugat. Dac se folosesc grupri de fiiere index de tip MDX sau CDX, la deschiderea fiierului de date se deschid automat toate fiierele index asociate. Dup orice actualizare a unei nregistrri din fiierului de date care afecteaz un cmp cheie, se restructureaz ntregul fiier index. 5.3. Comenzi de indexare Indexarea se face n dBase folosind comanda INDEX unde se specific cmpul cheie dup care se face indexarea i numele fiierului index generat. INDEX ON cheie TO fis_index [UNIQUE][DESCENDING] Clauza UNIQUE nu accept chei cu aceeai valoare n mai multe nregistrri, iar DESC specific sortarea fiierului index in ordine descresctoare. Daca fiierul index este deschis parcurgerea secvenial a nregistrrilor din fiier se va face n ordinea dat de fiierul index (DISP, LIST, EDIT, BROWSE,

SKIP, LOCATE). Deschiderea fiierelor index se poate face odat cu fiierul de date sau separat prin : SET INDEX TO lista_fis_index Pentru un fiier se pot crea mai multe fiiere index dupa mai multe cmpuri (Cods, Nume, Telefon ) fr a sorta inregistrrile care ramn n ordinea n care au fost introduse. USE STUD && deschide fiierul LIST && listeaz fiierul in ordine naturala INDEX ON Nume TO INUME && indexare dupa nume student LIST && listare in ordinea numerelor INDEX ON CODS TO ICODS LIST && listare in ordinea codurilor (facultate, secie) USE STUD && deschidere fr fiiere index LIST && listare in ordine naturala SET INDEX TO ICODS && deschidere fiier index ICODS LIST && listare in ordinea codurilor USE && nchidere fiier de date si index asociate La nchiderea unui fiier de date se nchid si toate fiierele index asociate lui. Un fiier DBF indexat poate fi exploatat i fr fiiere index sau numai cu unele din acestea. Daca se deschid simultan mai multe fiiere index, atunci primul din lista este index master si va determina ordinea de parcurgere a nregistrrilor la accesul secvenial sau cheia de selecie in acces direct. Oricare fiier index poate fi specificat ca master prin comanda: SET ORDER TO n - unde n este numrul de ordine din lista n care s-a deschis. SET ORDER TO 0 - reprezint ordinea natural SET ORDER TO Cods - tag index in .MDX Dac se fac modificri in fiierul de date (adugri, tergeri, modificri de nregistrri), se actualizeaz automat toate fiierele index deschise pentru toate comenzile (APPEND, EDIT, BROWSE, REPL,PACK). USE STUD INDEX ICODS,INUME && deschide fiier DBF si index; LIST && afiare in ordinea codurilor studenilor SET ORDER TO 2 && fiier index master INUME LIST && afiare in ordinea numelor. Selecia in acces direct. In fiierele indexate se poate caut o nregistrare dup cheia din fiierul index master deschis utiliznd comenzile: SEEK expr FIND cheie - caut nregistrarea cu cheia dat prin expresie - caut nregistrarea cu cheia specificata direct

Dac nregistrarea cu cheia specificat exista se poziioneaz funciile FOUND() =.T. si EOF() = .F. iar dac nregistrarea nu exista valorile vor fi invers. Dup orice cutare se va verifica una din funcii si daca EOF()=.F., nseamn c s-a poziionat pe nregistrarea cutat. Compararea chei cu cmpul cheie se face pentru iruri funcie de modul de comparaie SET EXACT ON sau OFF. USE STUD INDEX INUME SET EXACT OFF && cutare dup primele caractere din cheie FIND POP && se caut primul care are primele litere POP * SEEK 'POP' && dac se utilizeaz comanda SEEK IF EOF () && verifica dac s-a gsit cheia ? ` Nu exista student cu numele cerut ` RETURN ENDIF DO WHILE Nume =`POP` .AND. .NOT. EOF(). DISP Nume, Adresa && afieaz toi studenii a cror nume ncepe cu POP.. SKIP && trece la urmtoarea nregistrare conform fiierului index ENDDO RETURN

Acelai exemplu se poate generaliza pentru dialog: USE STUD INDEX INUME VNUME =ACCEPT( `Nume student: `) && cere nume student cutat * FIND &VNUME && se specifica cheia indirect SEEK VNUME && in SEEK se specific numele variabilei IF EOF() && verificare dac studentul exist ? ` studentul ` + VNUME + ` nu exista` RETURN ENDIF DO WHILE NUME=VNUME .AND..NOT. EOF() DISP && afieaz toi studenii cu numele dat SKIP ENDDO && urmtorul student conform fiierului index S-a introdus si condiia .NOT.EOF() n DO pentru a se opri ciclul n cazul n care studenii cutai sunt la sfritul fiierului. Comanda FIND are exact aceeai funcie dar difer puin scrierea. Pentru ultimul exemplu va fi o substituie cu valoarea introdus n variabila VNUME: FIND &VNUME - iar restul rmne la fel. Grup de fisiere index. In ultimele variante de dBASE s-a introdus noiunea de grup de fiiere index (Multiple Index) care are extensia .MDX si care poate conine, mai multe fiiere index, de obicei pentru acelai fiier de date (DBF).

Fiecare fiier index se numete TAG si are un nume propriu, Daca la crearea structurii fiierului DBF se completeaz coloana Index cu Ascending din dreptul unui cmp, el devin automat cheie (implicit valoarea este None). Pentru fiierul DBF se genereaz automat un fiier MDX cu acelai nume ca al fiierului (STUD.MDX), care conine pentru fiecare cheie specificat un fiier index TAG cu numele cmpului. La orice deschidere a fiierului DBF se deschide automat si fiierul index multiplu MDX asociat, asigurnd automat actualizarea fiierelor index componente.

Fiierul index (TAG) master se specific prin: SET ORDER TO TAG nume_tag - index din fiierul MDX activ SET ORDER TO TAG nume_tag OF fis.MDX - dac indexul este n alt fiier MDX La crearea ulterioara a unor fiiere index TAG se va folosi: INDEX ON cheie TO TAG nume_tag OF fis.MDX. In acest fel se pot genera tag_uri index pentru fiiere DBF diferite in acelai fiier MDX. Deschiderea fiierului si a indecilor se face prin specificarea listei_Tag si grupului MDX. USE fisier INDEX lista_tag OF fis.MDX [ORDER nume_tag]. OBSERVATIE: Utilizarea fiierelor index MDX este contraproductiv, deoarece toate fiierele TAG se deschid la deschiderea fiierului DBF si vor duce la actualizarea "ON LINE" a fiierelor index, care consum mult timp. Daca se adaug multe nregistrri este preferabil ca fiierele index s nu fie deschise si s se reindexeze o singura data la sfrit. Reindexarea fiierului se poate face pentru toate fiierele index deschise prin comanda REINDEX. Reindexarea este obligatorie si dup comanda PACK, care modifica numrul de ordine al nregistrrilor dup eliminarea celor marcate.

USE STUD PACK && eliminare nregistrri marcate SET INDEX TO INUME,ICOD && deschide fisiere index REINDEX && reindexeaza fiierele index deschise USE && nchide fiierul La comenzile de actualizare s-a introdus clauza REINDEX, care cere ca reindexarea s se fac doar la terminarea comenzii si nu pentru fiecare nregistrare modificata (APPEND FROM fisier , INSERT, REPLACE). 5.4.Utilizarea simultan a mai multor fiiere din BD Baza de date (BD) este format din mai multe tabele (fiiere) legate ntre ele prin chei simbolice i care urmresc reducerea redundanei informaiilor. Pn in prezent a fost folosit un singur fiier deschis, la care se refereau toate comenzile. Deschiderea altui fiier n aceeai zon implic nchiderea celui deschis. Toate datele despre acest fiier se pstrau intr-o zona de memorie de lucru pe care o vom numi zona 1. In dBASE se pot utiliza implicit maxim 40 fiiere deschise simultan, fiecare n alt zon de lucru. Fiecare zona de lucru din memorie pstreaz aceleai informaii despre fiierul deschis: - numele fiierului DBF deschis - informaiile privind structura nregistrrilor - numele fiierelor index, report, format asociate. - contorul de nregistrri i nregistrarea curenta. - zona tampon pentru citirea din fiier - adresa blocului curent citit din fiier Zona 1 Student Zona 2 Masini Zona3 Accidente Zona 4 .....

Orice fiier poate fi deschis in orice zona care se selecteaz cu SELECT nr_zona. Zona in care se deschide fiierul poate fi specificata prin comanda USE utiliznd clauza IN: SELECT 3 && selecie zona 3 USE STUD INDEX INUME && deschide fiier studeni in zona 3 SELECT l && selecie zona 1 USE CURS INDEX ICODC && deschide fiier cursuri USE MASINI IN 4 INDEX INRM && deschide fiier maini in zona 4 9

LIST SELECT 3 LIST SELECT 4 LIST

&& afieaz lista cursuri && selectare zona 3 && afiare lista studeni && selectare zona 4 && afieaz lista masini

Prelucrri ale unui fiier intr-o zona (SKIP, GO, FIND, APPEND...) nu afecteaz fiierele din alte zone, care rmn la forma si poziia ultimei prelucrri. Forma generala a comenzii USE este: USE fisier [INDEX lista fisiere_index][IN nr_zona][ALIAS alias] [AGAIN][EXCLUSIVE | SHARED] [NOUPDATE] Clauza ALIAS specifica un nume prescurtat al fiierului ce poate fi folosit pentru referire in program la fiier sau la zona in care este deschis. Se permite deschiderea simultana a unui fiier in 2 zone folosind clauza AGAIN. Clauza NOUPDATE nu permite modificri n fiier nchiderea fiierelor se poate face prin: USE - nchide fiierul DBF si cele index din zona curenta USE IN nr_zona - nchide fiierul din zona specificata CLOSE DATABASE - nchide toate fiierele DBF din toate zonele CLOSE ALL - nchide toate fiierele DBF, NDX, FMT, FRM, din toate zonele. Intr-o zona se pot utiliza cmpuri ale nregistrrii curente din alta zon prin prefixare cu numele fiierului sau un nume alias astfel: USE STUD INDEX INUME ALIAS ST && fiier studeni indexat dup nume USE MASINI IN 2 INDEX INRM ALIAS MS && fiier maini indexat dup NRM VNUME= ACCEPT( `Nume student`) SEEK VNUME && caut studentul * Presupunem ca in fiierul STUD exista un numar masina NRM SELE 2 // selectare zona cu fisier Masini SEEK ST->NRM && cauta dupa NRM din fisierul STUD in fisierul MASINI ? ST->NUME, ST->ADR, NRM, TIP_M && afisare date student si masina Legaturi ntre fiiere deschise n zone diferite In fiiere diferite pot exista nume de cmpuri identice (NRM). Intre doua fiiere deschise in zone diferite se poate stabili o relaie nct la poziionarea pe nregistrarea din fiierul master sa se realizeze automat poziionarea pe o nregistrare corespunztoare din fiierul 2. Relaia se poate specifica prin: numr de nregistrare ce poate fi dat printr-o expresie

10

nume de cmp comun celor doua fiiere, care in fiierul 2 este cheie pentru un fiier index master deschis (NRM)

USE STUD IN 1 - deschide fisierul studenti in zona 1 USE MASINI IN 2 - deschide fisierul studenti in zona 2 SET RELATION TO RECNO() INTO MASINI GO 5 - pozitioneaza pe aticolul 5 in STUD si MASINI In exemplul dat pentru orice poziionare in fiierul master studeni, se cere automat poziionarea pe nregistrarea cu acelai numr din fiierul maini (RecNo()). USE STUD IN 1 - deschide fisierul master Stud USE MASINI INDEX INRM IN 2 - deschide fisierul referit Masini indexat dupa NRM SET RELATION TO NRM INTO MASINI - definire relaie intre fisierul Stud i Masini Relaia definit cere ca la orice poziionare pe o nregistrare din fiierul master s se selecteze automat maina cu numrul NRM. Cmpul NRM trebuie s existe in ambele fiiere. In clauza TO se poate specifica si un pointer. Pentru a putea exploata mai uor mai multe fiiere cu relaii intre ele au fost modificate si anumite comenzi si funcii. EOF(zona) FOUND(zona) SKIP n IN alias GO n IN alias RECNO(zona) RECSIZE(zona) RECCOUNT(zona) SEEK(cheie, zona) ALIAS(zona) - permite testarea indicatorului EOF din zona specificata - indicatorul logic FOUND() din zona indicata - poziionare n fiier din alta zona fata de nregistrarea crt. - poziionare pe nregistrarea n din fiierul indicat - numrul nregistrrii curente din zona - lungime nregistrare fiier din zona - numr de nregistrri in fiier din zona - funcie de cutare (pozitionare ) n alt zon - afieaz numele sau aliasul fisierului deschis in zona

EOF(), ALIAS(), RECNO(),... se refera la zona curent Folosind SET RELATION se pot crea BD complexe, formate din mai multe fiiere, care au relaii intre ele si pot fi consultate simultan fr complicaii de programare. Atenie: Se interzice folosirea literelor ca alias, sau variabile deoarece sunt implicit considerate nume de zone. Forma generala a comenzii SET RELATION permite legaturi cu mai multe fiiere: SET RELATION TO exp1 INTO alias1, exp2 INTO alias2,.... La un moment dat dintr-o zona numai ultima relaie definita este operaional.

11

5.5. Exemple de programe


Exemplul 1 Considerm fiierele care conin cmpurile specificate: STUD: NUME, ADRESA, DATA_N, CODS, BURSA, NRM MASINI: NRM, TIP, AN_F, CAP_C ,PUTERE Fiierul STUD l presupunem indexat dup NUME, CODS si NRM iar MASINI dup numr maina(NRM). Programul va permite cutarea unui student dup oricare din chei si afiarea datelor personale si ale mainii. *========================================== * PREL * Program pentru exemplificare legaturi intre fisiere *========================================== SET TALK OFF USE STUD INDEX INUME, ICODS, INRM && deschis in zona 1 USE MASINI IN 2 INDEX INR ALIAS M l && deschis in zona 2 SET RELATION TO NRM INTO M1 && precizare relatie DO WHILE .T. && ciclu infinit cu iesire conditionata CLEAR TEXT Cautarea se poate face dupa: 1- Nume student 2- Cod student 3- Numar masina 4- terminare program ENDTEXT WAIT TO R DO CASE CASE R=`1` SET ORDER TO 1 && selectare fisier index master INUME C1=`NUME STUDENT: ` && C1 mesaj parametric de dialog C2=`NUME` && C2 nume cimp utilizat in DO WHILE CASE R=`2` C1='COD STUDENT: ` C2=`CODS` && C2 numele cimpului cod student SET ORDER TO 2 && selectare fisier index ICODS CASE R=`3` C1=`NR. MASINA: ` C2=`NRM` && cimp numar masina SET ORDER TO 3 && selectare fisier index INRM ca master CASE R=`4` CLOSE ALL &&inchide fisiere si sfirsit program RETURN

12

OTHER ? `Functia` + R + ` inexistenta` WAIT LOOP && reluare dialog ENDCASE CH =TRIM(ACCEPT( C1)) && introducere cheie (C1 - mesaj corespunzator) SEEK CH && cautare student dupa cheie IF EOF() && student negasit ? `Studentul precizat prin `+ C1 + CH + `nu exista` WAIT LOOP &&reluare dialog ENDIF DO WHILE &C2=CH && cautare toti studentii cu cheia data DISP && afisare date despre student IF EOF(2) && verificare daca s-a gasit masina cu NRM in zona 2 ? `Studentul nu are masina ELSE ? M1->NRM, M1->AN_F, M1->CAP_C, M1->PUTERE && date despre masina ENDIF WAIT SKIP && trece la studentul urmator cu aceeasi cheie ENDDO ENDOO Secventa DO CASE s-ar fi putut inlocui cu: IF R $ `l234` N=VAL(R) && valoarea numerica a lui R SET ORDER TO N && setarea cheie utilizind parametrul R ELSE ? `Functia ` +R+ `nu exista` WAIT LOOP ENDIF Dup ncercarea exemplului prezentat ncercai modificarea lui pentru a se selecta maina dup NRM si apoi datele studentului inversnd relaia.

13

Exemplu 2 de program care utilizeaz 3 fiiere legate ntre ele STUD, MASINI i ACCIDENT. Pentru fiecare student selectat se afieaz datele studentului, ale mainii i accidentele mainii respective.

* Pr_mas Program afisare persoane, masini si accidente set talk off Clear set date to dmy use stud index inume, icods, inrm alias st use masini in 2 index inm alias m1 set relation to nrm into m1 use accident in 3 index inr alias ac select 2 set relation to nrm into ac select 1 do while .t. clear text Cautarea se face dupa: 1. Nume student 2. Cod student 3. Numar masina 4. Terminare endtext wait 'Dati optiunea: ' to r do case case r='1' set order to 1 c1='Nume student:' c2='Nume' 14

case r='2' set order to 2 c1='cod student:' c2='Cods case r='3' set order to 3 c1='Nr. masina:' c2='Nrm' case r='4' close all clear all return other ? 'Functia '+r+' inexistenta' wait loop endcase clear && sterge f1 ch =accept( c1) seek trim(ch) if eof() @ 1,1 say 'Studentul precizat prin '+c1+ch+' nu exista' wait loop endif do while &c2=ch clear && sterge f1 ? 'Student: ' +nume ? 'Adresa: ' + adresa ? 'Nr. masina: ' + nrm ? 'Cods: ' +cods if eof(2) @ 1,1 say 'Studentul nu are masina' else * ? m1->nrm, m1->tip, m1->an_f, m1 ->cap_c, m1 ->putere ? 'Nr. masina: ' +m1->nrm ? ' Tip masina: '+ m1->tip ? 'An fabricatie: ' + str(m1->an_f,5) ? ' Putere: ' + STR(m1->putere) if .not. eof(3) ? 'Masina nr: ' +ac->nrm ? 'Accident: ' +ac->cauza ? 'Data: ' + DTOC(ac->data) ? 'Valoare repar: ' +str(ac->valoare,8) endif 15

endif ? Wait 'continuati' to r skip enddo enddo Cancel Structura si continut fisiere de date Structura fisier STUD.DBF ------------------------------------Field Field Name Type Length Dec Index ----------------------------------------------------------------------------------------1 NUME CHARACTER 10 N 2 ADRESA CHARACTER 10 N 3 BURSA NUMERIC 6 N 4 DATA DATE 8 N 5 CODS CHARACTER 10 N 6 NRM CHARACTER 10 N ------------------------------------------------------------------------------------------

Fisier STUD.DBF ------------------------NUME ADRESA BURSA DATA CODS NRM -----------------------------------------------------------------------------------------------------

1 adi tm 2592 03 ac231 tm1 2 deni TM 4074 12 ac427 tm5 3 dan tm 32442 02 ac163 4 virgil TM 3241 12 ac523 tm4 5 pop ar 57438 12 ac234 ar1 6 vlad ar 342 12 ac235 ar2 7 liviu DEVA 657 02 ac123 ar6 8 stefan TM 3402 10 ac124 12 radu tm 12345 11 ac125 13 gelu tim 500 ac126 ar5 14 asul tim 2345 12 ac127 tm10 16 ralu ar 9876 05 ac236 ar3 17 vasile ar 10123 12 ac238 -------------------------------------------------------------------------------------

tm3

tm5 tm2

ar4

16

Structura fisier MASINI.DBF -----------------------------------------------------------------Field Field Name Type Index 1 NRM CHARACTER 10 2 TIP CHARACTER 10 3 AN_F NUMERIC 4 4 CAP_C NUMERIC 7 5 PUTERE NUMERIC 10 Fisier MASINI.DBF ---------------------------NRM TIP AN_F CAP_C PUTERE ----------------------------------------------------------------------------

Length N N 2

Dec N N N

1 tm5 2 tm4 3 tm3 4 tm2 5 tm1 6 ar1 7 ar2 8 ar3 9 ar4 10 ar5 11 tm10

opel golf logan audi dacia bmw mercedes dacia ford fiest nissan ford musta

1993 1575 2000 1600 2004 1500 2001 1700 1996 1400 2000 2200 2001 2300 2002 1400 2004 1400 1999 1600 1988 1480

85 90 75 85 70 110 120 70 120 130 210

Structura fisier ACCIDENT.DBF ---------------------------------------------------------------Field Name Type Length Dec Index 1 NRM CHARACTER 10 2 DATA DATE 8 3 CAUZA CHARACTER 20 4 VALOARE NUMERIC 10 Fisier ACCIDENT.DBF --------------------------------------------------------------NRM DATA CAUZA VALOARE

1 2 3 4

tm3 tm1 ar1 tm2

01 derapaj 10 coliziune 02 viteza 150 prioritate

1000 2500 3100 200

5.6. Chei primare i integritate referenial


17

Considerm o baz de date universitar normalizat (fr redundan), care are structura din figur. Avem tabelele Student, Curs i Profesor, care reprezint entiti cunoscute ntre care exist legturi de tipul N:M (Many- To-Many) sau 1:N, greu de implementat prin liste nlnuite. Un student particip la N cursuri, iar la un curs particip M studeni. La fiecare curs studentul are o not. Fiecrui student i corespunde o nregistrare cu datele personale i o cheie unic de identificare Cods numit cheie primar PK (Primary Key),. Fiecare curs din planul de nvmnt are un Codc unic ca o cheie simbolic primar PK i are o nregistrare n care se specific Titlul cursului, cod profesor CodP, dac exist o tabel cu datele personale ale profesorilor. Implementarea relaional introduce o tabel de legtur Note, care conine codul studentului Cods, codul cursului Codc, ca informaii de legtur ntre tabela Student si Curs, iar Nota i Data ca informaii cantitative. Cods i Codc se numesc chei externe FK (Forein Key) i pot lua numai valorile existente n tabelele Student respectiv Curs. Se permit note numai pentru studenii i cursurile care exist. Prin tabela Note legtura M:N se sparge n 2 legaturi 1:N. Pentru o cutare rapid fiierul Student se va indexa dup Cods, fiierul Curs dup cmpul Codc, iar Profesor dup codP. Fiindc la un moment dat trebuie s gsim toate notele unui student i fiierul Note se va indexa dup Cods i Codc. n aceti indeci din Note numii secundari poate apare o valoare de mai multe ori. STUDENT CodS Nume Adresa DataN PK NOTE CodS CodC NOTA FK FK CURS CodC Titlu CodP PK 1:N FK PROFESOR CodP Nume PK Bursa Data Telefon CNP ......

Adresa

Tel

n bazele de date avem: indeci dup cheia primar n care fiecare cheie este unic indeci secundari, dup orice cmp n care valorile cheii se pot repeta Se prezint mai jos tabelele completate n care au fost definite fiierele index primare i secundare i s-au definit condiiile de integritate a referinei. Se observa mesajul care apare dac se d o valoare a cheii Codc (se), care nu exist.

18

Vom prezenta in continuare modul de definire a cheilor primare i integritatea referinei n dBase. O tabel poate avea o singur cheie primar i mai multe chei secundare pentru cutare. Indexarea dup un cmp cheie primar se face prin: USE Student INDEX ON cods TAG cods PRIMARY Definirea cheii primare pentru tabela Student se poate face i prin meniuri: - se selecteaz fiierul student i se d click dreapta - se selecteaz Design Table i se va afia structura fiierului (Table Designer) - se selecteaz din meniul principal Structure i apoi Define Primary Key - va apare fereastra Define Primary Key din care se alege campul Cods ca PK 19

La fel se se definete cheia primar Codc pentru tabela Curs Se definesc indeci secundari Cods i Codc pentru tabela Note deschiznd fereastra Designe Table unde se aleg Asc n coloana index.

Definire integritate referenial 20

Se trece la definirea restriciei de Integritate referenial n care tabelele Student i Curs sunt parinte i au cheile primare Cods i Codc definite anterior. Tabela fiu va fi Note care are cheile secundare Cods i Codc i refer cheile primare din tabelele parinte. Definirea integritii refereniale se face astfel: - se selecteaz din meniul principal File i opiunea Data Administration - va apare fereastra data Administration n care se selecteaz Referential Integrity - in fereastra Referential Integrity se selecteaz butonul New - se va deschide fereastra Define Referential Integrity Rule unde se va selecta tabela printe i fiu i cmpurile cheie din cele 2 tabele. Dup definirea restriciilor de integritatea a referinei la orice not adaugat se va verifica dac exist studentul cu acel Cods i cursul cu acel Codc.

21

Programul AfisN va afia toate notele unui student pentru care se d Cods.

22

Reindexai nainte fiierele Student, Curs si Note pentru a actualiza indeci dac s-au fcut adgri de nregistrri sau modificri. Use stud Reindex Use Note Reindex

Atentie! Cele 2 legturi Set relation pentru Note se scriu in aceeai comand, fiindc se ia ultimul Set relation dac nu are clauza Again. In caz de cheie eronat EOF()=.T. inainte de Loop se pune Wait

23

Modificnd puin programul se pot afia cu programul AfisC toti studenii si notele obinute la un anumit curs specificat prin Codc (BD n exemplul dat).

Programul poate fi dezvoltat prin adugarea unei tabele Profesor(Codp, NumeP, Tel), care s aib cheia primar CodP i s fie printe pentru tabela Curs pentru care se va da: Use Profesor in 4 order tag codp alias PR Set Relation To Codp Into Pr

24

n programele de afiare se va aduga i cmpul pr->Nume, selectarea profesorului fcndu-se automat prin Set relation-ul declarat.

Structura logic a bazei de date se poate reprezenta printr-un utilitar din dQuery o component dBase Plus.

25

S-ar putea să vă placă și