Baze de date
UTILIZARE PROCEDURI SI FUNCTII -are aplicatie simpla de Baza de Date universitara1.PROCEDURI SI FUNCTII UTILIZATOR Pentru a realiza o programare modulara , programe inteligibile, usor de depanat si dezvoltat, se recomanda scrierea unui program principal din care se cheama proceduri. Fiecare procedura va realiza functii bine determinate si va avea parametrii proprii de intrare si iesire. In proceduri se utilizeaza parametrii formali specificati prin comanda PARAMETER, variabile locale, nume de campuri din orice zona (utilizand prefixarea), variabile globale. Variabilele globale se declara in sectiunile unde se folosesc prin: PUBLIC lista _var Variabilele locale (PRIVATE) se pot utiliza numai in procedura unde sunt definite, sunt alocate in stiva si dispar dupa executia procedurii. Se pot realiza copii private ale unor variabile publice prin: PRIVATE lista_var ALL [LIKE/EXCEPT generic] Parametrii formali ai unei proceduri sau functii se dau prin: PARAMETER lista_var_formale O procedura are structura: PROCEDURE nume_proced PARAMETER lista_var_formale PUBLIC lista_var_globale PRIVATE lista_var_locale - secventa comenzi definite procedura - secventa de comenzi.RETURN - sfarsit de procedura Sfarsitul de procedura se marcheaza prin inceputul altei proceduri sau functii. O procedura se cheama prin: DO nume_proced WITH lista_param Parametrii de apel trebuie sa fie de acelasi tip cu cei formali din definitie. Variabilele publice nu se pot sterge cu RELEASE lista_var ci numai cu CLEAR ALL Functia poate avea mai multi parametrii de intrare dar numai o valoare transmisa la iesire prin numele functiei. Structura unei functii este asemanatoare cu a procedurii, dar valoarea de iesire se transmite in argumentul comenzii RETURN: FUNCTION nume_functie PARAMETER lista_var_formale PUBLIC lista_var_globale - secventa comenzi definitie functie secventa de comenziRETURN (exp) - iesire cu transmitere valoare calculata. O functie poate fi utilizata in expresii cu operanzi de acelasi tip cu ea. Tipul functiei e dat de tipul expresie din RETURN. Utilizarea procedurilor permite refolosirea unor secvente de program. Procedurile pot apela proceduri dar nu recursiv. Procedurile se pot scrie in program la sfarsit sau se pot grupa intr-un fisier de proceduri ce se va declara prin: SET PROCEDURE TO fis_proc [ADDITIV] SET LIBRARY TO Pentru a deschide mai multe fisiere pentru proceduri se va specifica clauza ADDITIV, altfel se va lua numai ultima specificatie SET PROCEDURE . Inchiderea unui fisier de proceduri se face prin: SET PROCEDURE TO sau CLOSE PROCEDURE Atentie! Comanda CLEAR ALL sterge toate setarile si toate variabilele din memorie si selecteaza prima zona de lucru. 2. Proiectare aplicatie simpla de Baza de Date universitara La proiectarea unei aplicatii se recomanda urmatoarele faze: - Analiza aplicatiei si alegerea fisierelor utilizate - Stabilirea structurii fisierelor componente ale BD si a legaturilor dintre ele (campuri, fisiere index, relatii). Pentru fiecare fisier se va stabili un camp cheie care sa identifice univoc fiecare inregistrare. - Stabilirea functiilor care trebuie realizate (cerute de beneficiar) - Stabilirea procedurilor ce realizeaza fiecare functie si a algoritmilor folositi - Stabilirea meniurilor de selectie a functiilor si ierarhia meniurilor; - Stabilirea ierarhiei de chemare a procedurilor pentru fiecare functie - Scrierea programului principal care cuprinde meniul principal si secventa de selectie. - Scrierea si testarea fiecarei proceduri si a programului in ansamblu. Se considera o Baza de date pentru evidenta universitara care contine informatii despre studenti, cursuri si profesori care sunt entitati bine definite. Structura BD se proiecteaza urmarind eliminarea redundantei informatiilor. Se vor alege fisierele componente in care informatiile nu trebuie sa se repete si spatiul liber trebuie eliminat. Suntem tentati sa cream un fisier de cursuri, care sa contina numele profesorului si gradul sau. Numele se regaseste si in fisierul de profesori unde se gasesc toate datele personale (CodP, data nasterii, salar, locul nasterii, adresa, telefon acasa, telefon la servici, mobil,..). Atunci in fisierul de cursuri vom introduce numai codul profesorului (CodP). Se elimina astfel si repetare numelui daca un profesor este titular la mai multe cursuri. In fisierul de studenti vom introduce datele personale ale studentului (CodS, nume, adresa, data nasterii, telefon, bursa,..). Pentru fiecare student trebuie introduse sirul notelor si cursul la care au fost obtinute. Pentru a simplifica lucrurile vom introduce entitatea note, ca o entitate de legatura intre studenti si cursuri, care va contine CodS, CodC, Nota, Data. CodS si CodC sunt referinte care definesc o legatura intre fisierul STUD si CURS, iar ultimele 2 campuri sunt informatii cantitative ce caracterizeaza legatura. Structura BD fara redundante va fi cea de mai jos: STUD
NOTE
CURS
PROF
Campuri cheie sunt CodS in fisierul STUD, CodC in CURS, CodP in PROF si pentru ele se pot crea fisiere index pentru cautare in acces direct si parcurgere ordonata. Se pot crea fisiere index si pentru campul Nume in fisierele STUD si Titlu in CURS dar ele nu sunt chei pentru fisier. Cheie ar putea fi campul CNP (Cod Numeric Personal) din STUD si PROF, dar ele nu sunt functionale pentru aceasta aplicatie. In fisierul NOTE cheia este formata din concatenarea campurilor CodS+CodC care identifica univoc o nota. Totusi se va crea cate un fisier index ICodSN si ICodCN pentru campurile Cods si CodC. Indexul IcodSN va servi la identificarea notelor unui student, iar indexul ICodCN la determinarea tuturor notelor la un Curs dat. ( Nu se permit 2 fisiere index cu acelasi nume). Vom prezenta in continuare un program care face gestiunea fisierului de studenti utilizand proceduri si realizeaza urmatoarele functii: - crearea structurii fisierelor BD utilizand o structura de referinta - adaugare inregistrari - singulare (fisierele index deschise) - masive cu reindexare la sfarsit - afisarea unor inregistrari selectate in acces direct dupa nume student - modificarea datelor unor studenti selectati prin nume - stergerea unor studenti din BD Ultimele trei proceduri cuprind secventa de selectare a studentului si afisarea lui. Ele difera putin, motiv pentru care s-a scris o singura procedura avand ca parametru codul functiei. Daca se cere modificarea inregistrarii selectate se face READ care va trece in editare campurile afisate cu GET. Daca se cere stergerea inregistrarii deja afisate se da un DELETE eventual precedat de confirmare. - listarea studentilor ordonati alfabetic sau dupa Cods (facultate, sectie, an, grupa, nr.in gr). Listarea studentilor din BD s-a realizat tot cu o procedura parametrica pentru a realiza 3 functii distincte utilizand un meniu propriu. Procedura PLIST realizeaza paginare, cu cap tabel si numerotarea paginilor. Se permite listarea totala in ordinea alfabetica, sau partiala dupa CODS (ex: CODS =AC4) si eventual indexarea dupa acest camp. Pentru fisierul PROF si CURS se pot realiza proceduri asemanatoare. Pentru completarea unei note va trebui adaugata o inregistrare in fisierul NOTE cu verificare existenta student (CodS) in fisierul STUD si existenta curs (CodC) in fisierul CURS. Nu se permite adaugarea unei note pentru un student sau un curs care nu exista. ** PRINC ** Program principal de selectie proceduri * SET TALK OFF SET PROCED TO FPRO && specificare fisier proceduri DO WHILE .T. CLEAR @ 1,1 SAY 'CAT.CALCULAT' @ 1,50 SAY 'PROIECT DIDACTIC' @ 2,60 SAY 'IONESCU BOGDAN' @ 5,10 SAY 'BAZA DE DATE EVIDENTA STUDENTI' @ 6,10 SAY REPL('=',30) @ 7,5 SAY 'FUNCTII OFERITE:' TEXT -1 CREARE INITIALA structura BD -2 ADAUGARI MASIVE -3 ADAUGARI SINGULARE -4 AFISARE STUDENTI -5 MODIFICARI INREGISTRARI -6 STERGERI INREGISTRARI -7 LISTARE STUDENTI -8 TERMINARE PROGRAM ENDTEXT WAIT TO R IF .NOT. R$ '12345678' && verificare cod functie ? 'FUNCTIA '+R+' NU EXISTA' WAIT LOOP ENDIF DO CASE CASE R='1' && creare structura BD DO PCREA CASE R='2' .OR. R='3' && adaugari DO PAD WITH R CASE R $ '456' && afisari, modificari, stergeri DO PIMS WITH R CASE R='7' DO PLIST && listari parametrice CASE R='8' USE && inchidere fisier ? ’PROGRAMUL S-A TERMINAT * La revedere! CANCEL ENDCASE ENDDO ** FPRO ** Fisier de proceduri ** ** PCREA ** Procedura creare baza de date * PROCEDURE PCREA CLEAR @ 1,10 SAY 'Creare initiala structura fisiere BD' USE RSTUD && deachidere fisier de referinta COPY STRU TO STUD && copiere structura USE STUD && deschide fisierul creat DISP STRU && afisare structura INDEX ON SUBSTR(NUME,1,7) TO INUME && indexare fisier vid USE && inchidere fisier @ 17,10 SAY 'S-A CREAT FISIERUL STUDENT' WAIT RETURN * PAD ** Procedura adaugari ** * R=2 Adaugari masive R=3 Adaugari singulare ** PROCEDURE PAD PARAM R USE STUD && deschidere fisier STUD fara index IF R='3' && adaugari singulare SET INDEX TO INUME && deschidere fisier index ENDIF R1='D' DO WHILE R1 $ 'DdYy' CLEAR @3,10 SAY 'PROCEDURA ADAUGARE' APPEND BLANK && adaugare inregistrare alba @5,10 SAY 'NUME STUDENT ' GET NUME @6,10 SAY 'ADRESA ' GET ADRESA @7,10 SAY 'BURSA ' GET BURSA @8,10 SAY 'COD STUDENT ' GET CODS READ && activare geturi pentru completare cimpuri ? 'MAI EFECTUATI ADAUGARI D/N?' WAIT TO R1 && confirmare continuare adaugari ENDDO IF R='2' && au fost adaugari masive? INDEX ON SUBSTR(NUME,1,7) TO INUME && reindexare ENDIF USE RETURN * SFIRSIT PROCEDURA ADAUGARI ** PIMS Procedura interogari,modificari,stergeri * * R=4 INTEROGARE,R=5 MODIFICARE,R=6 STERGERE * PROCED PIMS PARAM R USE STUD INDEX INUME STORE 'D' TO R1 DO WHILE R1 $ 'DdYy' clear @3,10 say 'PROCEDURA INTEROGARI,MODIFICARI,STERGERI' secventa comuna de selectie si afisare VNUME=SPACE(20) @ 5,10 SAY 'NUMELE STUDENTULUI ' GET VNUME READ && nume student selectat VN=SUBSTR(TRIM(VNUME),1,7) && suprimare spatii din dreapta SEEK VN && cauta primul student cu numele IF EOF() && daca studentul nu exista mesaj de eroare ? 'STUDENTUL CU NUMELE ' +VNUME+ ' NU EXISTA' WAIT ’ Continuati D?N’ TO r1 && asteptare citire mesaj LOOP ENDIF *** ciclu de afisare grup de studenti DO WHILE .NOT. EOF() .AND. NUME=VN @ 7,5 SAY 'NUME STUDENT' GET NUME && afisare date un student @ 8,5 SAY 'ADRESA' GET ADRESA @ 9,5 SAY 'BURSA' GET BURSA @ 10,5 SAY 'COD STUDENT' GET CODS IF R='5' READ && se trec in editare campurile afisate cu GET ENDIF IF R='6' DELETE && se marcheaza pentru stergere studentul selectat WAIT && se poate cere confirmarea stergerii ENDIF IF R='4' WAIT && se asteapta dupa afisarea unui student ENDIF SKIP && se trece la inregistrarea urmatoare ENDDO WAIT 'CONTINUATI D/N?' TO R1 ENDDO IF R='6' PACK && compactare fisier daca s-au cerut stergeri INDEX ON SUBST(NUME,1,7)TO INUME && reindexare ENDIF USE RETURN ** PLIST *Procedura listari parametrice ** PROCEDURE PLIST R1='D' DO WHILE R1 $ 'DdYy' CLEAR @ 3,10 SAY 'PROCEDURA LISTARE' @ 6,5 SAY 'FUNCTII OFERITE' @ 8,10 SAY '1-LISTARE IN ORDINE ALFABETICA' @ 9,10 SAY '2-LISTARE TOTALA sau PARTIALA dupa CODS' @ 10,10 SAY '3-INDEXARE FISIER DUPA CODS' @ 11,10 SAY '4-TERMINARE PROCEDURA' WAIT TO R2 IF .NOT. R2 $ '1234' && verificare existenta functie de listare ? 'FUNCTIE INEXISTENTA' WAIT LOOP ENDIF DO CASE CASE R2='1' USE STUD INDEX INUME && parcurgere ordonata fisier dupa nume CL='.T.' && afisare toti studentii in ordine alfabetica CASE R2='2' CL='CODS=VCOD' && parametru conditie ACCEPT 'CODURI DE LISTAT' TO VCOD VCOD=TRIM(VCOD) && codul grupului de studenti ex: AC4 USE STUD INDEX ICOD && fisier index master ICODS SEEK VCOD && cautare primul student cu codul dat IF EOF() ? 'CODUL '+VCOD+' NU EXISTA' WAIT 'Continuati D/N ' TO R1 LOOP ENDIF CASE R2='3' USE STUD && indexare dupa CODS daca nu exista index INDEX ON CODS TO ICOD USE LOOP CASE R2='4' RETURN && terminare program ENDCASE ** urmeaza secventa comuna cu parametrul CL CLEAR NRP=0 && contor de pagini NL=100 && contor de linii ,fortare afisare cap tabel * SET DEVICE TO PRINT && pentru imprimanta DO WHILE .NOT. EOF() .AND. &CL && ciclu de afisare CL='CODS=VCOD' sau .T. IF NL>23 && nr linii ecran (65-100 la imprimanta) DO CAPT && afisare cap tabel ENDIF ** afisare un rind pe o pozitie variabila @ NL,1 SAY NUME+' I '+ADRESA+' I '+STR(BURSA,7,2)+' I '+CODS @ NL+1,1 SAY REPLICATE ('_',75) && linie subliniere NL=NL+2 && incrementare contor linii SKIP && inregistrarea urmatoare ENDDO WAIT 'LISTAREA S-A TERMINAT. CONTINUATI D/N ?' TO R1 * SET DEVICE TO SCREEN && daca s-a afisat la imprimanta ENDDO RETURN * SFIRSIT PROCEDURA LISTARE ** CAPT ** Procedura cap tabel * PROCEDURE CAPT WAIT && asteptare inainte de afisare pagina noua CLEAR && daca se lucreaza pe ecran *EJECT && pagina noua la imprimanta NRP=NRP+1 && incrementare nr.pagina @ 0,1 SAY 'FAC CALCULATOARE' NL=5 && primul rind de informatii dupa cap tabel @ 1,20 SAY 'TABEL STUDENTI' && titlul tabelului @ 1,60 SAY 'PAG:'+STR(NRP,2) && afisare nr.pagina @ 2,1 SAY REPL('=',75) && linie cap tabel @ 3,1 SAY ' NUME SI PRENUME I ADRESA I'; + ' BURSA I CODS ' && text in cap tabel @ 4,1 SAY REPLICATE('=',75) RETURN
Listare in ordine alfabetica
Listare partiala dupa cod student pentru Cods=ac
Propuneri dezvoltare program la laborator pentru dezvoltarea aplicatiei:
Se va folosi o fereastra pentru meniul principal FM si una pentru meniurile secundare FM2. Functiile pentru gestiunea fisierului NOTE pot fi: - Adaugare nota pentru un student cu verificare existenta student (CodS) si curs (CodC) - Afisare note pentru un student dat prin Cods - Afisare note pentru un student dat prin Nume Pentru afisare note pentru un student: Se deschid toate fisierele indexate in 4 zone de lucru Se stabileste prin SET RELATION o legatura - intre fisierul NOTE si CURS prin CodC - intre fisierul CURS si PROF prin CodP Se cere Cods sau Nume si se selecteaza studentul afisand numele in fereastra FS Se cauta in fisierul NOTE prin indexul ICodSN prima nota a studentului Se afiseaza intr-un ciclu cu DO WHILE intr-o fereastra FNote pentru toate notele: Nota, CS->Titlu, PR->Nume
|