Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Proceduri si functii utilizator. Editarea bazelor de date

baze de date



+ Font mai mare | - Font mai mic



Proceduri si functii utilizator. Editarea bazelor de date.

Campuri memo. Instructiuni de indexare ale bazelor de date.



0.Cuprins.

Executia programelor in FoxPro.

Proceduri si functii definite de utilizator.

Variabile locale si globale. Transferul parametrilor.

Depanarea programelor in FoxPro.

Editarea interactiva a bazelor de date.

Campuri memo. Functii referitoare la campurile memo.

Fisiere de tip index. Comenzi de indexare.

Sortarea bazelor de date.

Pozitionarea intr-o baza de date.

Aplicatii.

Executia programelor in FoxPro.

Un program reprezinta o succesiune de instructiuni care respecta sintaxa limbajului in care au fost editate si care au ca scop final rezolvarea unei probleme prin descrierea unui algoritm.

In FoxPro exista urmatoarele tipuri de fisiere referitoare la executia programelor:

Tip Fisier

Extensie

Program executabil

EXE

Aplicatie

APP

Forma compilata a programului

FXP

Program sursa

PRG

Programul sursa se editeaza din editorul de programe ,apelat cu comanda MODIFY COMMAND / FILE . Programul sursa trebuie sa contina o secventa valida de instructiuni ale limbajului FoxPro. Pentru executia unui program este necesara compilarea programului sursa, obtinandu-se un fisier cu extensia .FXP , fisier ce va fi interpretat de FoxPro.

Executia unui program se realizeaza prin urmatoarea comanda:

DO <file>

[WITH <parm list>]

[IN <file>]

Efect: Executa programul continut in <file> ; daca <file> nu are extensie atunci se cauta pe disc fisierele din tabelul anterior , in ordinea data in tabel.

Obs.: - optiunea WITH permite specificarea unor parametri externi pentru executia unui program;

- optiunea IN permite executia unei proceduri existenta in fisierul <file>;

- un program poate contine la randul sau alte comenzi DO, obtinandu-se astfel DO-uri imbricate; nivelul

maxim de imbricare este 32;

- executia unui program se poate opri in una din urmatoarele situatii:

- la executia uneia dintre comenzile : RETURN, CANCEL, QUIT;

- cand se intalneste sfarsitul fisierului;

- cand se intalneste o alta comanda DO (dupa executarea noului program se revine in programul

apelant);

Numele unui program care se executa este obtinut prin functiile : PROGRAM([<expN>]) sau SYS(16[,<expN]).

Exemplu: * Ex1.prg

SET TALK OFF

CLEAR

? 'Apasati o tasta pentru inceperea programului !'

READ

? ' Programul care se executa:' , PROGRAM()

CLEAR

DO EX2

? ' Programul care se executa:' , PROGRAM()

READ

* Ex2.prg

? ' Programul care se executa:' , PROGRAM()

READ

CLEAR

c='1'

@ 3,3 SAY 'Alegeti optiunea dorita:' GET c FUNCTION 'M 1,2,3,4' ;

MESSAGE '1=Revenire in Ex1, 2=Iesire in Fox, 3=Suspendare executie, 4=Iesire din Fox'

DO CASE

CASE c='1'

RETURN

CASE c='2'

CANCEL

CASE c='3'

? 'Pentru reluarea executie lansati comanda RESUME'

SUSPEND

CASE c='4'

QUIT

ENDCASE

2. Proceduri si functii definite de utilizator.

Procedura reprezinta un grup de instructiuni ce primeste de la programul apelant un grup de parametri, realizeaza anumite prelucrari, dupa care revine in programul apelant. O preocedura definita de utlizator nu poate intra in alcatuirea unei expresii ca operand, fiind analoaga comenzilor standard din FoxPro.

PROCEDURE <nume>

[ PARAMETER <param1[,param2..]>]

[RETURN]

Functia utilizator (UDF = User Defined Function) reprezinta un grup de instructiuni care primeste un set de parametri de la programul apelant si ii returneaza acestuia o valoare ca rezultat al prelucrarilor parametrilor transmisi. O UDF poate intra in componenta unei expresii ca operand, analog functiilor standard din FoxPro.

FUNCTION <nume>

[ PARAMETER <param1[,param2..]>]

RETURN <var>

FoxPro permite specificarea unui fisier de proceduri si/sau UDF cu comanda:

SET PROCEDURE TO <nume fisier>, astfel incat acestea sunt apelabile de oriunde. Specificarea unui alt nume de fisier de proceduri inchide automat pe cel vechi. Numai un singur fisier de acest tip poate fi activ la un moment dat. Pentru a inchide fisierul curent de proceduri fara a deschide unul nou, se da comanda fara argument. Avantajul acestor fisiere este ca aduna toate rutinele intr-un singur loc, apelul lor facandu-se mult mai rapid decat in cazul unor fisiere program separate.

Ordinea de cautare a unei proceduri de FoxPro este:

- programul curent in executie

- fisierul de proceduri indicat in SET PROCEDURE

- cauta un fisier program independent in directorul curent in ordinea: .EXE (executabil), .APP

(aplicatie), .FXP (compilat), .PRG (sursa)

- cauta un fisier program independent in calea FoxPro de directoare stabilita cu SET PATH TO

<lista directoare>

Apelul unei proceduri se face cu: DO myprog , iar a unei UDF cu o simpla atribuire (<variabila> = myudf()). Daca nu intereseaza valoarea returnata se poate scrie: =myudf().

Exemplu: * OPERATII.PRG

PROCEDURE operatii

PARAMETERS x,y,s,p

s=adunare(x,y)

p=inmultire(x,y)

RETURN

FUNCTION adunare

PARAMETERS a,b

RETURN a + b

FUNCTION inmultire

PARAMETERS a,b

RETURN a * b

* EOF OPERATII.PRG

* TEST.PRG

SET TALK OFF

CLEAR

STORE 0 TO suma,prod,x,y

* cititi x si y

DO operatii WITH x,y,suma,prod

? 'Suma este:',suma

? 'Produsul este:',prod

? 'Apelare functia "Adunare"', adunare(x,y)

SET PROCEDURE TO operatii

? 'Apelare functia "Adunare"', adunare(x,y)

? 'Apelare functia "Inmultire"', inmultire(x,y)

SET PROCEDURE TO

? 'Apelare functia "Inmultire"', inmultire(x,y)

* EOF TEST.PRG

3. Variabile locale si globale. Transferul parametrilor.

a) Variabile locale si globale.

Intr-un modul de program pot fi referite 2 tipuri de variabile: globale si locale.

Variabilele globale (publice) pot fi accesate si modificate in orice modul de executie , de pe un nivel inferior, egal sau superior nivelului modulului curent. Variabilele globale se definesc cu instructiunile:

PUBLIC <lista var>

Efect: Declara si creaza variabilele globale din <lista var>.

PUBLIC [ARRAY] <masiv1>(<eN1>[,<eN2>]),

Efect: Declara si creaza masivele globale din <masiv i>.

Variabilele locale (private) pot fi accesate numai in modulul curent sau in cele aflate pe un nivel inferior modulului curent.

PRIVATE <lista var>

PRIVATE ALL [IKE <sablon> | EXCEPT <sablon>]

Efect: Declara ca private variabilele din <lista var> (nu le creaza !)

Exemplu: SET TALK OFF

CLEAR

PRIVATE a1

PUBLIC a2

a1=1

a2=2

DISP MEMO LIKE a*

DO test

DISP MEMO LIKE a*

PROCEDURE test

PRIVATE a3

PUBLIC a4

a3=3

a4=4

DISP MEMO LIKE a*

RETURN

b) Transferul parametrilor.

Procedurile si functiile pot primi maxim 24 parametri de la apelant. Parametri pot fi trimisi in doua moduri:

- prin valoare (eventuala modificare a variabilei in subprogram nu afecteaza valoarea acesteia in programul apelant);

- prin referinta (variabila transmisa este afectata de eventualele modificari aduse in subprogram).

Transmiterea parametrilor la un subprogram se desfasoara in modul urmator:

- se stabilesc variabilele care se vor transmite subprogramului ca parametri, intr-o ordine stabilita de programator la conceperea programului;

- se stabileste un set de variabile locale subprogramului, care vor prelua valorile variabilelor transmise ca perametri de la programul apelant;

- corespondenta dintre variabilele transmise din programul apelant si cele locale ale subprogramului se face prin pozitia in doua liste si anume: lista cu parametrii de apel ai subprogramului si, respectiv, lista variabilelor locale, specificata prin comanda PARAMETERS;

- in modulul apelat se lucreaza cu variabilele locale respective;

- daca tipul transmisiei este prin referinta, la sfarsitul executarii subprogramului, continutul variabilelor este trecut in variabilele corespunzatoare transmise ca parametri;

- daca avem o transmisie prin valoare, aceasta ultima copiere nu mai are loc, deci in acest caz variabilele de apelare nu vor mai fi actualizate cu noile valori ale variabilelor locale corespunzatoare.

In ceea ce priveste metoda folosita la transmisia parametrilor, avem urmatoarele reguli:

- la programe parametrii se transmit implicit prin referinta;

- la proceduri si functii se foloseste implicit metoda transmiterii parametrilor prin valoare.

Pentru a schimba metoda implicita de transmitere a parametrilor la proceduri si functii se poate folosi comanda SET UDFPARMS cu sintaxa urmatoare:

SET UDFPARMS TO VALUE | REFERENCE

Obs. : Daca in lista argumentelor reale este un camp al unei BD (deci nu o variabila de memorie !!) acesta este intotdeauna transmis prin valoare !!

Exemplu.: a=1

?a,modif_a(a),a

* VARIANTA I: transfer prin valoare

FUNCTION modif_a

PARA b

b=b+5

RETURN b

a=1

SET UDFPARMS TO REFERENCE

? a,modif_a(a),a

* VARIANTA II: transfer prin referinta

FUNCTION modif_a

PARA b

b=b+5

RETURN b

Pentru a forta transmiterea unui parametru prin valoare, la apelul unei functii acesta se include intre paranteze rotunde, iar pentru fortarea transmiterii prin referinta, acesta va fi precedat de caracterul '@'. La fel se poate transfera un masiv.

Obs.: O variabila definita oriunde in program, devine globala pentru toate procedurile din program apelate dupa definire, care o folosesc.

Exemplu: SET TALK OFF

CLEA

STORE 1 TO a,b,c,d

? 'a=',a,'b=',b,'c=',c,'d=',d

l=test((a),@b,@c,(d))

? 'a=',a,'b=',b,'c=',c,'d=',d

FUNCTION test

PARA x,y,z,v

STORE 2 TO x,y,z,v

? 'x=',x,'y=',y,'z=',z,'v=',v

RETURN .T.

4. Depanarea programelor in FoxPro.

La executia unui program pot apare 2 categorii de erori:

- erori de sintaxa , care conduc la fie la intreruperea rularii, fie la executarea unor rutine de tratare a intreruperilor;

- erori de rulare, logice, rezultatele obtinute nefiind corecte.

Pentru depanarea programelor se folosesc 2 ferestre sistem din meniul Window: Trace si Debug. Fereastra Trace permite utilizatorilor rularea programelor in urmatoarele moduri:

- pas cu pas (se executa cate o singura instructiune la comanda utilizatorului (Step/Over));

- executarea unor secvente de instructiuni pana la intalnirea unor puncte de intrerupere (Breakpoints) definite in prealabil de utilizator (Out);

- executarea continua cu viteza maxima sau controlata de utilizator (Throttle).

In paralel cu executarea unui program in fereastra Trace, se pot vizualiza continutul unor variabile folosite in program in fereastra Debug. Fereastra Debug are 2 parti:

- in partea dreapta se introduc variabilele si expresiile ce se doresc a fi vizualizate;

- partea stanga afiseaza valorile de moment ale acestor variabile si expresii.

5. Editarea interactiva a bazelor de date.

Editarea interactiva a unei baze de date se poate realiza prin comenzile CHANGE, EDIT, BROWSE. Cele 3 comenzi deschid o fereastra de editare in care utilizatorul poate modifica datele in mod interactiv. Comenzile CHANGE si EDIT sunt identice, iar BROWSE difera doar prin modul de organizare pe ecran a ferestrei corespunzatoare. Astfel , comanda BROWSE afiseaza campurile bazei de date in linie, pe cand CHANGE / EDIT le afiseaza pe coloana.

BROWSE

[FIELDS <field list>]

[FONT <expC1> [, <expN1>]]

[STYLE <expC2>]

[FOR <expL1>]

[FORMAT]

[FREEZE <field>]

[KEY <expr1> [, <expr2>]]

[LAST | NOINIT]

[LEDIT] [REDIT]

[LOCK <expN2>]

[LPARTITION]

[NOAPPEND]

[NOCLEAR]

[NODELETE]

[NOEDIT | NOMODIFY]

[NOLGRID] [NORGRID]

[NOLINK]

[NOMENU]

[NOOPTIMIZE]

[NOREFRESH]

[NORMAL]

[NOWAIT]

[PARTITION <expN3>]

[PREFERENCE <preference name>]

[REST]

[SAVE]

[TIMEOUT <expN4>]

[TITLE <expC3>]

[VALID [:F] <expL2>

[ERROR <expC4>]]

[WHEN <expL3>]

[WIDTH <expN5>]

[[WINDOW <window name1>]

[IN [WINDOW] <window name2>

| IN SCREEN | IN MACDESKTOP]]

[COLOR SCHEME <expN6>

| COLOR <color pair list>]

Efect: Afiseaza tabelar intr-o fereastra de editare baza de date deschisa in zona de lucru curenta.

Optiuni:

- FIELDS <field list> - afiseaza doar campurile specificate, in ordinea aparitiei lor in lista; <field list> reprezinta o insiruire de campuri ale unei baze de date sau calculate, cu urmatoarea sintaxa:

<field1> [:R]

[:column width]

[:V = <expr1> [:F] [:E = <expC1>]]

[:P = <expC2>]

[:B = <expr2>, <expr3> [:F]]

[:H = <expC3>]

[:W = <expL1>]

[, <field2> [:R]]

:R - campul este Read-Only;

:column width - latimea campului la afisare;

:V=<expr1> - permite validarea campului introdus; la iesirea din editare daca valoarea campului s-a modificat , se evalueaza expresia logica <expr1>; daca ea este .T. data introdusa in camp este corecta, altfel nu se permite iesirea din campul de editare, considerandu-se data incorecta;

:F - se forteaza validarea la trecerea cursorului prin camp (chiar daca valoarea nu a fost modificata);

:E=<expC1> - afiseaza mesajul de eroare <expC1> daca validarea campului nu este corecta;

:P=<expC2> - formateaza afisarea campului printr-un cod PICTURE (<expC2>);

:B= <expr2>,<expr3> - specifica intervalul in care trebuie sa se afle valoarea din camp dupa editare;

:H=<expC3> - numele utilizator al campului curent;

:W - permite intrarea in editarea campului doar daca <exprL1> este .T.

- FOR si WHILE specifica domeniul inregistrarilor ce vor fi accesibile pentru editare;

- FREEZE - permite modificarea doar a unui camp ,celelalte fiind doar afisate;

- KEY - se foloseste pentru baze de date indexate;

- NOAPPEND - nu permite adaugarea de inregistrari noi;

- NODELETE - nu permite stergerea inregistrarilor;

- NOEDIT | NOMODIFY - nu permite editarea inregistrarilor;

- NOMENU - inhibarea meniului Browse ce apare odata cu lansarea comenzii;

- PARTITION - afiseaza fereastra de editare sub forma a doua partitii ,una sub forma CHANGE (campuri aranjate vertical), , una sub forma BROWSE (campuri aranjate orizontal);

- TIMEOUT - se specifica numarul de secunde de asteptare pentru introducerea datelor in fereastra de editare, inainte de inchiderea ferestrei;

- TITLE - titlul ferestrei de editare ;

- VALID :F <expL2> ERROR <expC4> - clauza asemanatoare cu optiunea clauzei FIELDS, dar spre deosebire de aceasta , clauza se refera la intreaga inregistrare (validare la nivel de inregistrare);

- WHEN <expL3> - se declanseaza la trecerea cursorului de la un articol la altul; daca <expL3> este evaluata .T. atunci se permite trecerea la inregistrarea urmatoare;

- WIDTH - specifica latimea de afisare a tuturor campurilor afisate din baza de date;

Comenzile EDIT / CHANGE sunt asemanatoare cu BROWSE, dar folosesc o organizare diferita a ferestrei de editare deschisa pentru modificarea bazei de date. Optiunile si clauzele comenzilor EDIT sau CHANGE sunt asemanatoare cu cele prezentate la comanda BROWSE.

Campuri memo. Functii referitoare la campurile memo.

a) Campuri memo.

Campurile memo permit memorarea cantitatilor mari de text (fara limitarea de 254 caractere a campului Caracter !!). Singura limitare este data de dimensiunea spatiului liber pe disc.

Utilizarea campurilor memo se recomanda in situatiile in care cantitatea de informatii ce trebuie stocata intr-un anumit camp difera foarte mult de la o inregistrare la alta. De ex. intr-o BD oarecare am un camp 'OBSERVATII' care intr-o inregistrare are 75 caractere in alta 30, iar in alta 100 caractere. Ca urmare, ar fi ineficient sa stabilesc un camp caracter cu lungimea 100 doar pentru 'observatiile' care apar in cateva inregistrari !). Pentru eliminarea acestei 'deficiente' s-a introdus campul de tip memo.

Informatiile din campul memo nu sunt memorate in acelasi fisier cu restul campurilor. Astfel o BD ce contine cel putin un camp memo are asociat un fisier suplimentar (cu extensia .FPT) numai pentru datele memo.

Pentru accesul la un camp memo, Foxpro procedeaza intern, deci transparent pentru utilizator, astfel:

Citire:

- se selecteaza inregistrarea dorita si se citesc informatiile din campul memo

- se gaseste astfel locul in care se afla continutul campului memo in fisierul memo asociat

- se citeste efectiv de aici continutul campului memo

Scriere:

- se gaseste un spatiu liber in fisierul memo asociat, suficient pentru memorarea datelor, care sunt incarcate in spatiul respectiv

- se completeaza in BD la inregistrarea corespunzatoare, in campul memo, informatiile necesare pentru localizarea in fisierul asociat a continutului campului

Incarcarea datelor intr-un camp memo se poate face astfel:

1) De catre utilizator intr-o fereastra de editare

2) Prin citirea datelor dintr-un fisier sau din memoria calculatorului.

1) Prima metoda se realizeaza cu una din comenzile: CHANGE, EDIT, BROWSE, APPEND. Se pozitioneaza cursorul in campul memo al inregistrarii dorite dupa care se tasteaza Ctrl-PgDn (sau Ctrl-PgUp), sau se face dublu click pe mouse-ul pozitionat in camp. Va apare o fereastra de editare in care se trec informatiile dorite. Iesirea, inapoi in fereastra de editare se face cu Ctrl-W pentru salvare sau Escape pentru renuntare. Pentru a edita un camp memo fara a folosi una din comenzile de mai sus, se poate utiliza comanda MODIFY MEMO:

MODIFY MEMO MemoField1 [, MemoField2 ]

[NOEDIT]

[NOMENU]

[NOWAIT]

[RANGE nStartCharacter, nEndCharacter]

[[WINDOW WindowName1]

[IN [WINDOW] WindowName2 | IN SCREEN | IN MACDESKTOP]]

[SAME]

[SAVE]

Efect: Deschide direct o fereastra de editare pentru campul memo specificat in comanda al inregistrarii curente din BD activa (cititi in HELP amanunte despre sintaxa comenzii !!)

Inchiderea ferestrei de editare se face cu comanda:

CLOSE MEMO <memo1>[,<memo2>..]] ALL

Efect: Inchide toate ferestrele de editare aferente campurilor memo specificate in lista, salvandu-se eventualele modificari. Oricum inchiderea unei BD se vor inchide si ferestrele memo deschise in acel moment Clauza ALL are ca efect inchiderea tuturor ferestrelor memo deschise, pentru toate zonele de lucru.

2. A doua metoda se realizeaza cu ajutorul comenzii:

APPEND MEMO <camp memo> FROM <fisier> OVERWRITE

Efect: Incarca continutul unui fisier in campul memo specificat. Adaugarea se face la sfarsitul campului memo. Clauza OVERWRITE presupune copierea peste vechiul continut al campului memo.

Exista si operatia inversa de copiere a unui camp memo intr-un fisier ASCII text cu comanda:

COPY MEMO <camp memo> TO <fisier> ADDITIVE

Efect: Copie continutul campului memo specificat in fisierul <fisier>. Daca <fisier> nu exista se creeaza unul nou, altfel copierea are loc in fisierul existent. Clauza ADDITIVE permite salvarea vechiului continut al fisierului prin adaugarea la sfarsit a informatiilor din campul memo.

Exemplu: Am o baza de date T1 care are un camp memo NUME. Se doreste interschimbarea continutului campului NUME in inregistrarile 2 si 4 !!

SELE 0

USE T1

SELE 0

USE T1 AGAIN ALIAS TT

SELE T1

GO 2 && inreg.2 in zona de lucru 1

COPY MEMO NUME TO A1 && salvez continut camp NUME in fisierul A1

GO 4 IN TT && merg la inreg. 4 in zona 2

REPL NUME WITH TT.NUME && inlocuiesc camp NUME in zona 1 cu acelasi camp

&& din zona 2

GO 4 && merg la inreg 4

APPE MEMO NUME FROM A1.TXT OVERWRITE    && pun aici continutul A1.TXT (vechiul && continut al inreg. 2

BROWSE && vizualizez schimbarile facute

CLOS ALL && inchid bazele de date

Problema se putea rezolva folosind o simpla variabila de memorie in locul unui fisier, adica in forma: var=nume (in loc de COPY MEMO !!) si apoi in loc de APPE MEMO, REPL NUME WITH VAR !! In varianta standard, variabila poate ocupa maxim 64k de memorie, iar in versiunea extinsa poate ocupa toata memoria disponibila. Aceasta variabila este tratata ca un sir de caractere si deci i se pot aplica toate functiile aferente. Exista insa o serie de functii FoxPro care se pot aplica direct campurilor memo, fara sa necesite transformarea lor in variabile de memorie.

b)Functii de lucru cu campuri memo

MEMLINES(<camp memo>) - returneaza numarul de linii al campului memo specificat

MLINE(<camp memo>,<expN1>,<expN2>)

Efect: Extrage o linie dintr-un camp memo, unde:

- <expN1> - indica numarul liniei care se extrage (daca nu exista se returneaza sirul vid)

- <expN2> - offset-ul de unde se extrage linia, adica se considera inceputul campului memo de la al <expN2>-lea+1 caracter.

Valorile returnate de aceste functii sunt influentate de comanda:

SET MEMOWIDTH TO <expN>

Efect: 'Forteaza' lungimea unei linii dintr-un camp memo la <expN> caractere. Aceasta comanda influenteaza si lungimea maxima de afisare a campurilor memo de catre comenzile LIST, DISPLAY, ? si ??. Valoarea implicita este 50, iar valoarea minima este 8. Valoarea <expN> poate depasi 256, dar latimea de afisare a campurilor memo pe ecran nu va depasi aceasta valoare.

Fisiere de tip index. Comenzi de indexare.

a) Fisiere de tip index.

In orice aplicatie apare necesitatea ordonarii informatiilor dupa anumite criterii, deci a ordonarii BD ce contin informatiile respective. Se poate spune ca o BD este ordonata dupa un anumit criteriu, daca fiecare inregistrare a acesteia respecta criteriul dat, in raport cu articolele anterioare si posterioare.

Criteriul dupa care se face ordonarea se mai numeste si cheie de ordonare.

In FoxPro exista 2 metode de ordonare a unei BD:

- indexarea unei BD, ceea ce inseamna crearea unui nou fisier, numit fisier index, care contine numai informatiile cu privire la ordinea inregistrarilor din BD

- sortarea unei BD, ceea ce presupune obtinerea unei noi BD care contine aceleasi inregistrari ca si BD initiala dar aflate, FIZIC, in ordinea corespunzatore criteriului de ordonare

b)Comenzi de indexare.

Consideram o BD, NUME.DBF, cu urmatoarea structura si articole:

NR_REC COD NUME

1 3 IONESCU

2 5 POPESCU

3 6 PASCU

4 2 MARCU

5 1 BARNA

6 4 ANTON

Daca indexam aceasta BD dupa campul cod, crescator, fisierul index asociat, (de ex. NUME.IDX) va avea urmatoarele articole 5,4,1,6,2,3, adica exact ordinea in care apar inregistrarile cand indexul specificat este activ. Se poate spune ca daca indexul este activ se schimba numai ordinea LOGICA a inregistrarilor unei BD. Oricum, aceasta este o prezentare intuitiva a notiunii de index, in realitate FoxPro folosind o tehnica de accesare mai complexa, dar principial asemanatoare.

Fisierele index ce pot fi asociate unei BD pot fi:

- fisiere index simple (extensia .IDX) contin o singura cheie de indexare

- fisiere index simple complicate (extensia .IDX) - care utilizeaza tehnologia de compresie dinamica de la indecsii compusi (vezi mai jos !!)

- fisiere index compuse (extensia .CDX) - care memoreaza m.m. chei de indexare (etichete, tag-uri) intr-un singur fisier index, la un moment dat fiind activa una singura. In dbase IV un fisier .MDX era limitat la 47 etichete spre deosebire de FoxPro unde limitarea este doar spatiul disponibil pe disc

O BD poate avea m.m fisiere index asociate, dar numai unul singur va fi activ la un moment dat, acesta fiind numit fisierul index activ. Ordinea in care sunt accesate articolele BD este data de fisierul index activ, iar daca acesta este compus, de eticheta activa.

Comanda de indexare este:

INDEX ON <expr> TO <idx file> | TAG <tag name> [OF <cdx file>]

[FOR <expL>] [COMPACT]

[ASCENDING | DESCENDING]

[UNIQUE] [ADDITIVE]

Efect: Indexeaza fisierul din zona de lucru curenta; <expr> - cheia de indexare care contine campuri ale BD dar nu si campuri memo .

Clauza FOR permite limitarea inregistrarilor ce vor putea fi accesate prin fisierul index la cele care indeplinesc conditia <expL> (tip logic !!)

Clauza COMPACT permite crearea fisierelor index simple compacte.

Obs.: Fisierele index compuse sunt intotdeauna compacte, deci clauza ar fi redundanta.

Clauzele ASCENDING (implicita) si DESCENDING stabilesc modul de ordonare a informatiilor: crescator / descrescator pentru indecsi compusi

Clauza UNIQUE permite in cazul in care am m.m. inregistrari cu aceeasi cheie de indexare, accesarea numai a primei inregistrari din BD, la celelalte neavand acces !!

Clauza ADDITIVE (nu are sens la indecsii compusi structurali) permite ca la crearea unui nou index, cel activ sa nu fie inchis, ceea ce se intampla automat in absenta clauzei

Comanda se foloseste astfel pentru crearea celor 2 tipuri de index:

- index simplu:

INDEX ON <expr> TO <idx file> [FOR <expL>] [COMPACT]

[UNIQUE] [ADDITIVE]

- index compus:

INDEX ON <expr> TAG <tag name> [OF <cdx file>]

[ASCENDING | DESCENDING] [UNIQUE] [FOR <expL>]

Indecsii compusi sunt la randul lor de 2 tipuri:

- structurali - au acelasi nume si se afla in acelasi director cu BD asociata ; deschiderea BD cu comanda USE presupune si deschiderea fisierului index

- nestructurali - au nume diferit sau se afla in alt director fata de BD asociata, caz in care nu sunt deschisi automat odata cu deschiderea BD, iar la crearea lor trebuie precizata clauza OF.

Comanda de deschidere a unei BD impreuna cu fisierele INDEX asociate va arata astfel:

(2) USE [<file> | ?]

.

[INDEX <index file list> | ? [ORDER [<expN> | <file.idx>

| [TAG] <tag name> [OF <file.cdx>] [ASCENDING | DESCENDING]]]]

Efect: In urma acestei comenzi se va deschide BD <file> impreuna cu lista de fisiere index (separate prin virgula !!) care sunt deja create cu comanda INDEX. Extensia fisierelor index nu trebuie precizata, doar daca sunt 2 fisiere cu acelasi nume si extensie diferita !!

Clauza ORDER permite stabilirea fisierului indexul simplu activ sau eticheta dintr-un fisier index compus ce va deveni activa, astfel:

ORDER <expN> - unde <expN> este numarul de ordine al fisierului index simplu sau al etichetei din fisierul index compus. Sunt numarate mai intai fisierele index simple din lista, apoi etichetele apartinand indexului compus structutal si ,in ultimul rand, etichetele apartinand altor indecsi compusi nestructurali. Daca <expN>=0, inregistrarile vor fi accesate in ordinea lor fizica (ca si cum nu ar fi index)

ORDER <file.idx> - unde fisierul index simplu <file.idx> va deveni activ

ORDER [[ TAG <tag name>][OF <file.cdx>] - unde eticheta <tag name> dintr-un index compus structural sau ne- va deveni activa. Clauza OF permite precizarea fisierului index compus.

Daca se doreste deschiderea altor fisiere index dupa deschiderea BD se foloseste comanda:

(3) SET INDEX TO [<index file list> | ?] [ORDER <expN>

| <file.idx> | [TAG] <tag name> [OF <file.cdx>]

[ASCENDING | DESCENDING]] [ADDITIVE]

Efect:Se vor deschide toate fisierele index specificate in lista. Clauzele ORDER, DESCENDING, OF sau ADDITIVE au aceeasi semnificatie ca si anterior.

Daca comanda se da in forma: SET INDEX TO se vor inchide toate fisierele index ale BD din zona curenta de lucru cu exceptia indexului structural.

Daca am deschise m.m. fisiere index simple sau compuse, pentru a schimba indexul (eticheta) activ(a) se foloseste comanda:

SET ORDER TO [<expN1> | <file.idx> | [TAG] <tag name> [OF <cdx file>]

[IN <expN2> | <expC>] [ASCENDING | DESCENDING]]

Explicatiile anterioare raman valabile. Clauza IN se foloseste atunci cand comanda se refera la o BD deschisa in alta zona de lucru, referirea facandu-se prin numarul zonei (<expN2>) sau prin alias (<expC>)

c) Indecsi unici

La crearea unui fisier index sau a unui TAG pentru o BD, fiecarei inregistrari ii va corespunde o valoare a cheii de indexare. Pot aparea situatii cand 2 sau m.m. articole au aceeasi valoarea a cheii de indexare, aparand problema accesului la aceste inregistrari. Exista posibilitatea ca in index sa fie trecuta numai prima aparitie a cheii de indexare, folosind clauza UNIQUE sau comanda SET UNIQUE ON (implicit OFF).

Starea UNIQUE va fi memorata in fisierul index respectiv neputandu-se schimba decat prin reindexare.

Obs. : Din pacate indecsii unici au unele probleme de actualizare in FoxPro ceea ce limiteaza libertatea lor de utilizare. Trebuie manifestata reticenta la utilizarea indecsilor unici, ei fiind foarte eficace ca indecsi temporari, cand nu are loc actualizarea inregistrarilor.

Actualizare indecsi. Stergere indecsi.

REINDEX

Efect: Permite actualizarea indecsilor asociati unei BD. Sunt multe situatii in care un index poate fi desincronizat (caderi de tensiune, probleme de alocare - cluster-i dublii sau inexistenti !!) caz in care acesta trebuie refacut. Cei mai putini expusi unor astfel de probleme sunt indecsii compusi structurali, care sunt deschisi odata cu BD asociata.

Dar si acestia (alaturi de ceilalti) pot suferi fragmentari semnificative, in urma adaugarii sau stergerii de articole. De asemenea stergerea unei etichete dintr-un index compus (structural sau ne-) nu elibereaza spatiul pe disc. Din acest motiv este recomandata utilizarea ritmica a comenzii REINDEX.

Obs.: Daca marcajul de index din antetul BD este sters, o comanda REINDEX va fi oricum inefectiva fiind necesara o comanda explicita INDEX

COPY INDEXES <index file list> | ALL [TO <file.cdx>]

Efect: Permite transformarea unui fisier index simplu intr-o eticheta a unui index compus structural sau specificat cu clauza TO. Se presupune ca sunt deja deschisi indecsii simpli din lista. Comanda se aplica fie la fisierele index simple din lista specificata, fie la toti indecsii simpli deschisi cu o comanda USE sau SET INDEX TO.. in cazul utilizarii clauzei ALL. Etichetele vor avea numele indecsilor simpli specificati (evident fara extensie !!). Daca unul din indecsi are aceleasi nume cu o eticheta deja creata, utilizatorul este interogat cu privire la inlocuirea ei.

COPY TAG <tag name> [OF <file.cdx>] TO <index file>

Efect: Realizeaza operatia inversa de transformare a unei etichete dintr-un index compus structural sau specificat cu clauza OF <file.cdx> intr-un index simplu specificat cu clauza TO. Indexul simplu va capata numele etichetei. In absenta clauzei OF, cautarea etichetei incepe cu indexul structural si continua cu restul indecsilor compusi asociati BD active. Comanda nu sterge eticheta specificata !!

DELETE TAG <tag name1> [OF <file1.cdx>]

[,<tag name2> [OF <file2.CDX>]] sau

DELETE TAG ALL [OF <cdx file>]

Efect: Comanda permite stergerea etichetelor dintr-un index compus fie structural, fie specificat cu clauza OF. Clauza ALL permite stergerea tuturor etichetelor, caz in care fisierul index compus specificat este sters de pe disc.

CLOSE INDEXES

Efect: Permite inchiderea fisierelor index deschise Comanda inchide doar indecsii simpli sau cei compusi nestructurali asociati BD active. Acelasi efect il au si comenzile: CLOSE ALL, USE, CLOSE DATABASES.

Comanda CLOSE ALL sau CLOSE DATABASES inchide si indecsii deschisi in alte zone de lucru.

Sortarea bazelor de date.

O alta metoda de ordonare a articolelor unei tabele o constituie sortarea care conduce la crearea unei noi BD in care ordinea FIZICA a inregistrarilor este conform cheii de sortare. Comanda de sortare este:

SORT TO <file> ON <field1> [/A | /D] [/C]

[, <field2> [/A | /D] [/C] ]

[ASCENDING | DESCENDING]

[<domeniu>]

[FOR <expL1>] [WHILE <expL2>]

[FIELDS <field list>]

[NOOPTIMIZE]

Efect: Noua BD numita file.DBF va contine toate campurile celei vechi sau numai cele specificate in clauza FIELDS. Cheia de sortare este data de campurile <field1>, <field2> .. specificate dupa clauza ON. Optiunile /A si /D asociate campului pe care-l succed specifica tipul ordonarii respectiv, crescator/des- (implicit crescator !!). Optiunea /C specifica faptul ca ordonarea este insensibila la majuscule (implicit se ia in considerare tipul literelor). Specificarea celor 2 optiuni se face /AC sau /DC. Clauza NOOPTIMIZE inhiba optimizarea RUSHMORE. Clauzele ASCENDING si DESCENDING sunt similare optiunilor /A, respectiv /D insa actioneaza global la nivelul tuturor campurilor (sau cele specificate in lista). Clauzele FOR si WHILE ca si <domeniu> limiteaza inregistrarile asupra carora se va aplica comanda.

Obs.: Comanda SORT este considerata 'ruda saraca' a indexarii FoxPro intrucat necesita m.m spatiu pe disc si nu accepta expresii pentru controlul sortarii precum comanda INDEX.

Totusi SORT are unele aspecte pozitive:

- este f.rapida, uneori mai rapida ca indexarea

- permite sortarea crescatoare / descrescatoare a unei BD camp-cu-camp intr-un mod mai direct decat INDEX

- pe langa conditia filtru cu FOR permite si clauze de domeniu sau WHILE

- permite tratarea automata a cheilor compuse din campuri cu tipuri de date diferite

Comanda SORT se justifica in cazurile BD cu o singura eticheta index si care sunt f.putin actualizate sau deloc, situatie in care se poate renunta la index. De asemenea se recomanda utilizarea sa pentru crearea fisierelor temporare utilizate in rapoarte, avand in vedere facilitatea de specificare a unei liste de campuri pentru fisierul de iesire, adica campurile necesare raportului.

Pozitionarea intr-o baza de date.

a)      Pozitionarea absoluta.

GO | GOTO [RECORD] <expN> | BOTTOM | TOP [IN <alias>

Efect: Permite pozitionarea "pointer-ului" pe un anumit articol precizat prin numarul de ordine determinat de valoarea <expN>, la inceputul sau la sfarsitul fisierului din zona de lucru specificata.

Obs.: - BOTTOM permite pozitionarea la sfarsitul BD;

TOP permite pozitionarea la inceputul BD;

RECORD <expN> permite pozitionarea pe articolul cu numarul de ordine <expN> in BD;

IN <alias> permite realizarea pozitionarii in fisierul din zona de lucru precizata .

b)      Pozitionarea relativa.

SKIP [<expN>] [IN <alias>]

Efect: Permite pozitionarea "pointer-ului" pe un anumit articol precizat prin <expN>, relativ la pozitia curenta, in fisierul din zona de lucru specificata.

Obs.: - daca <expN> >0 atunci pozitionarea se face cu <expN> articole dupa cel curent; daca <expN> <0 atunci pozitionarea se face cu <expN> articole inaintea celui curent.

c)      Cautarea secventiala

LOCATE [<scop>][FOR <expL1>][WHILE <expL2>][NOOPTIMIZE]

Efect: Permite pozitionarea "pointer-ului" pe primul articol care indeplinesc conditiile din filtru (<scop>,FOR,WHILE).

Obs.:    - daca nu exista un articol care sa indeplineasca conditiile din filtru, "pointerul" de articol se pozitioneaza pe sfarsit de fisier (EOF() are valoarea .T. si FOUND() are valoarea .F.).

optiunea NOOPTIMIZE inhiba mecanismul de optimizare RUSHMORE;

cautarea se poate face numai in fisierul din zona de lucru curenta.

CONTINUE

Efect: Permite pozitionarea "pointer-ului" pe urmatorul articol care indeplineste conditiile precizate prin filtrul instructiunii LOCATE anterioare. Nu are efect daca nu s-a executat in prealabil o instructiune LOCATE.

d)      Cautare indexata.

FIND <const_cheie>

Efect: Permite pozitionarea pointerului pe primul articol care are cheia egala cu <const_cheie> din sintaxa. Pentru folosirea acestei instructiuni, baza de date trebuie sa fie indexata.

SEEK <exp_cheie>

Efect: Permite pozitionarea pointerului pe primul articol care are cheia egala cu <exp_cheie> din sintaxa. Pentru folosirea acestei instructiuni, baza de date trebuie sa fie indexata.

Obs.:    - diferenta dintre SEEK si FIND consta numai in tipul parametrului (expresie sau constanta).

SEEK (<exp_cheie>[,<alias>])

Efect: Permite pozitionarea pointerului pe primul articol care are cheia egala cu <exp_cheie> in zona de lucru curenta sau in cea specificata. Functia intoarce .T. daca s-a incheiat cautarea cu succes si .F. in caz contrar. BD trebuie sa fie indexata.

Obs.:    - functia SEEK este mai puternica decat instructiunea SEEK deoarece permite cautarea si in alta zona de lucru decat cea curenta si permite determinarea rezultatului cautarii.

consultati (Help) comanda SET NEAR ON

Comenzi pentru extragerea informatiilor statistice din baze de date.

Limbajul FoxPro ofera cateva instructiuni pentru obtinerea diverselor informatii statistice din diferitele baze de date.

(1) AVERAGE [ExpressionList]

[Scope] [FOR lExpression1] [WHILE lExpression2]

[TO MemVarList | TO ARRAY ArrayName]

[NOOPTIMIZE]

Efect: Permite calcularea valorilor medii pentru lista de expresii si memorarea rezultatelor in variabile de memorie sau intr-un tablou.

Exemplu: SET TALK OFF

USE AG

AVERAGE SAL_BAZA TO v

? 'Media salariilor de baza: ',v

USE

(2) COUNT

[Scope] [FOR lExpression1] [WHILE lExpression2]

[TO MemVarName]

[NOOPTIMIZE]

Efect: Permite numararea articolelor care satisfac conditiile precizate prin filtru si memorarea rezultatului intr-o variabila de memorie.

Exemplu: SET TALK OFF

USE CL

COUNT FOR PRIVAT=.T. TO v

? "Numarul clientilor privati: ",V

USE

(3) SUM [eExpressionList]

[Scope] [FOR lExpression1] [WHILE lExpression2]

[TO MemVarNameList | TO ARRAY ArrayName]

[NOOPTIMIZE]

Efect: Permite calcularea valorilor totale pentru lista de expresii numerice si memorarea rezultatelor in variabile de memorie sau intr-un masiv.

Exemplu: SET TALK OFF

USE MA

SUM CANTITATE FOR ALLT(DENUMIRE)='DISCHETE' TO v

? "Stocul de dischete (3,5 si 5,25) este de :", v

USE

TOTAL TO TableName ON FieldName

[FIELDS FieldNameList]

[Scope]

[FOR lExpression1]

[WHILE lExpression2]

[NOOPTIMIZE]

Efect: Permite crearea unui fisier de date obtinut din fisierul curent prin insumarea campurilor numeirce. In noul fisier se creaza atatea articole cate schimbari de valoarea a campului cheie exista.

(5) CALCULATE eExpressionList

[Scope] [FOR lExpression1] [WHILE lExpression2]

[TO MemVarList | TO ARRAY ArrayName]

[NOOPTIMIZE]

Efect: Permite realizarea unor calcule asupra unui fisier de date si memorarea rezultatelor in variabile de memorie sau intr-un masiv.

Obs. : Prin eExpressionList se intelege o lista de expresii ce se pot realiza folosind si urmatoarele functii speciale.

Functie

Parametri

Semnificatie

AVG

<expN>

Calculeaza valoarea medie (total/nr. articole)

CNT

Calculeaza nr. de articole

MAX

<exp>

Calculeaza valoarea maxima

MIN

<exp>

Calculeaza valoarea minima

SUM

<expN>

Calculeaza totalul (suma)

Exista urmatoarele echivalente: CALCULATE AVG() AVERAGE

CALCULATE CNT() COUNT TO

CALCULATE SUM() SUM TO

Relatii intre baze de date Comenzi referitoare la relatiile dintre bazele de date.

O baza de date relationala reprezinta o baza de date in care tabelele (fisierele de date-.DBF) sunt organizate si accesate prin intermediul relatiilor. O relatie este o legatura intre fisiere de date, legatura care permite accesarea informatiilor din mai multe fisiere (nu numai cea din zona curenta). Legatura reprezinta conditia de asociere intre fisierele de date, si este materializata printr-un camp comun fisierelor de date.

De exemplu , avem bazele de date AG(enti) si TR(zanzactii). Agentii care au intermediat tranzactii se regasesc in fisierul TR, prin intermediul cimpului NR_AGENT si nu prin intermediul cimpurilor NUME si PRENUME. Deci se poate stabili o relatie intre cele doua baze de date , prin intermediul campului NR_AGENT, care apartine celor 2 fisiere. Acest lucru se poate efectua prin comanda :

SET RELATION TO [<expr1> INTO <expN1>|<expC1>

[, <expr2> INTO <expN2> | <expC2> ]

[ADDITIVE]]

In acest caz voi avea o BD parinte (cea activa in momentul comenzii - AG in exemplul dat) si una sau m.m BD copii (TR in exemplul dat) specificate prin numar <expNi> sau alias <expC>, toate aceste BD fiind deschise in zone de lucru diferite. Cheia relatiei este stabilit prin <expri> care corespunde unui camp (sau la m.m campuri) din BD parinte. Cheia relatiei este si cheia de indexare a BD copii.

Stabilirea unei relatii intre 2 BD presupune ca mutarea pointer-ui de articol in BD parinte determina si mutarea in BD copii. Bineinteles ca initial se evalueaza <expri> si daca sunt gasite inregistrarile corespunzatoare in BD copii, pointer-ul va fi mutat in consecinta, altfel va ajunge la sfarsitul BD si deci EOF() pentru zona de lucru respectiva va fi .T.

Clauza ADDITIVE face ca relatiile deja existente pentru BD activa sa nu fie sterse.

Aceasta comanda face ca fiecarei inregistrari din BD parinte sa-i corespunda o inreg. in BD copil, unde saltul se face automat. Se pune intrebarea, ce se intampla cand unei inreg. parinte ii corespund m.m articole in BD copil (si care nu are activ un index unic !!). In aceasta situatie, comanda determina numai gasirea primei inregistrari, deci am o relatie "ONE TO ONE" 'UNA LA UNA'.

Exista insa o comanda care imi permite sa pot gasi m.m. inregistrari ale BD copil ce corespund unei singure inregistrari din BD parinte, adica care imi permite o relatie tip "ONE TO MANY" 'UNA LA MAI MULTE'. Comanda aceasta este:

(2) SET SKIP TO [<alias1> [,alias2>]]

Pentru a folosi aceasta comanda, relatiile trebuie sa fie deja create cu o comanda SET RELATION TO Modul de lucru al comenzii este urmatorul: daca se muta pointer-ul in BD parinte in urma unor comenzi GOTO, LOCATE sau SEEK, evident se va muta pe articolul corespunzator si in BD copil. Urmatoarele salturi in BD parinte cu SKIP sau cu o bucla SCAN .. ENDSCAN nu vor determina mutarea pointer-ui, in schimb in BD copil vom fi pozitionati pe urmatoarele inregistrari ce au aceeasi cheie cu inregistrarea din BD parinte.

Pentru stergerea relatiilor dintre BD se va folosi comanda:

(3) SET RELATION OFF INTO <expN> | <expC> - care sterge relatia dintre BD curenta si BD copil specificata prin nnumar - <expN> sau alias - <expC>

Introducerea comenzii fara parametri - SET RELATION TO - determina inlaturarea tuturor relatiilor existente pentru BD curenta !

Exemplu 1: * se indexeaza initial cele 2 tabele

CLEAR

CLOSE DATABASES

USE AG ORDER tag AG_I IN 0 && Tabelul parinte

BROW

USE TR ORDER tag AG_I IN 0 && Tabelul copil

SELE TR

BROW

SELECT AG && Selectare tabel parinte

SET RELATION TO nr_agent INTO TR && Stabilirea relatiei

SET SKIP TO TR && Tipul relatiei este 'One-to-many'

WAIT WINDOW 'Afisarea TRANZACTIILOR efectuate de fiecare AGENT' NOWAIT

BROWSE FIELDS AG.NR_AGENT :H='Nr.Id.', ;

AG.NUME :H='Nume', AG.PRENUME :H='Prenume', TR.NR_TRANZ

Functii referitoare la relatiile dintre bazele de date.

(1) RELATION(<expN1>[,<expN2>|<expC>])

Efect: Returneaza un sir de caractere ce contine expresia cheie a relatiei, cu numarul <expN1> a BD curente sau a BD specificate fie prin numar <expN2>, fie prin alias <expC>

Numerotarea relatiilor se face cu 1 in ordinea definirii lor !!

Exemplu : RELATION(3,B) - va intoarce expresia celei de-a 3-a relatii din BD deschisa in zona de lucru B.

(2) TARGET(<expN1>[,<expN2>|<expC>])

Efect: Returneaza un sir de caractere ce reprezinta alias-ul BD cu care BD curenta sau cea specificata prin numar <expN2> sau alias <expC> se afla in relatia <expN1>.

Exemplu: TARGET(3,B) - intoarce numele (alias-ul) cu care BD din zona B se afla in relatia a 3-a.

Aplicatii.

Creati o baza de date TRIUNGHI (latura 1,latura 2,latura 3, tip triunghi,arie,perimetru), astfel:

se citeste de la tastatura printr-o procedura lungimile laturilor;

se verifica daca este respectata regula de constructie a unui triunghi (l1<l2+l3,l2<l1+l3, l3<l1+l2);

daca da , se verifica tipul triunghiului si se afiseaza;

se calculeaza in functii separate perimetrul si aria triunghiului;

se actualizeaza baza de date si se afiseaza (fara posibilitatea de a o modifica).

Scrieti un program care sa completeze automat o coloana SALREALIZ din AGENTI astfel: la salariul de angajare se adauga sumele obtinute prin aplicarea procentelor de 20% , respectiv 30% din tranzactiile "cumparare" si respectiv "vanzare" ale agentului respectiv (se aplica comenzile LOCATE, CONTINUE si functiile FOUND(), EOF() etc).

Scrieti un program care sa extraga si sa afiseze urmatoarele informatii statistice:

varsta medie a agentilor si apoi varsta medie a agentilor pe orase;

valoarea facturilor achitate si a celor neachitate, precum si numarul acestora pe cele 2 categorii;

factura cu valoarea maxima / minima care a fost achitata, respectiv nu a fost achitata;

numele clientilor 'cei mai tranzactionati' si ai agentilor 'cei mai activi';

numele agentilor care au intermediat 'vanzarea', respectiv 'cumpararea' cea mai 'scumpa', si valorile acestor tranzactii.

Pentru fisierul cu agentii firmei, creati urmatorii indecsi - afisati continutul BD dupa fiecare :

nume + prenume;

nume + nr. de identificare;

nume + data nasterii - descrescator;

nume + data angajarii + salariu - descrescator.

Scrieti proceduri pentru regasirea agentilor dupa : nume / cod / data nasterii / data angajarii .

Sortati baza de date AG dupa nume - crescator si salariu - descrescator (comanda SORT) .

6. Studiati bazele de date STUDENTI si PREZENTA. Editati o procedura de completare a fisierului PREZENTA cu studentii prezenti la laborator. Restrictii :

studentii trebuie sa existe in STUDENTI (eventual preluarea celor prezenti din aceasta baza de date);

campul Absenta accepta doar valorile 'A' sau 'P';

campul Semigr accepta valorile: 0 = toata grupa,1 = semigrupa A, 2 = semigrupa B;

campul Data reprezinta data laboratorului.

Completati fisierul PREZENTA pentru laboratorul de azi.

Se considera baza de date AGENDA cu structura urmatoare:

AGENDA

Nr.Crt.

Denumire camp

Tip camp

Lungime camp

1

Cod_ID

Num

4

2

Nume

Char

25

3

Prenume

Char

35

4

Adresa

Memo

-

5

Data_nast

Date

-

6

Telefon

Char

15

7

Tel_Fax

Memo

-

8

Observatii

Memo

-

Se considera urmatoarea structura a campurilor memo (datele incadrate de ghilimele sunt cele ce vor fi existente in campurile memo ale bazei de date, xxxxxxxxx - reprezinta datele ce vor fi actualizate cu valori reale):

- ADRESA: linia 1 - "Tara: xxxxxxxx" TEL_FAX: "(S): xxxxxxxxx"

linia 2 - "Judet/Regiune: xxxxxxxx" "(M): xxxxxxxxx"

linia 3 - "Localitate: xxxxxxxx" "(E): xxxxxxxx"

linia 4 - "Rest Adresa: xxxxxxx" "(F): xxxxxxxx"

- OBSERVATII: contine ,sub forma unui text, observatii utile despre fiecare persoana (studii,meserie,loc de munca, interese etc)

Legenda: (M) = Mobil; (S) = Servici; (E) = Adresa EMail; (F) = Fax.; Telefon - reprezinta telefonul de acasa.

Cerinte:

a)      Creati indecsii necesari testarii exemplelor din cadrul laboratorului astfel:

- AGENDA_N.idx - indexare dupa NUME;

AGENDA_D.cdx - indexare dupa DATA_NAST, COD

AGENDA.cdx. - NUME, TELEFON,NUME si PRENUME.

Testati exemplele date la indecsi.

b)      Scrieti o procedura de adaugare la baza de date, respectand structura campurilor memo (se folosesc comenzile referitoare la campurile memo).

c)      Veti afisa unul sub altul campurile (mai putin campul COD_ID) fiecarei inregistrari din baza de date (2 inregistrari pe ecran !!). Intre inregistrari veti trasa o linie punctata de 70 caractere. Afisarea liniilor din campul memo trebuie sa se faca astfel incat sa nu depaseasca 50 caractere/linie (Veti folosi comanda SET MEMOWIDTH si functiile MEMLINES(), MLINE()).

d)      Afisati persoanele din AGENDA in ordine alfabetica, a codului sau a varstei dupa optiunea utilizatorului.

e)      Afisati persoanele care au numarul de acasa sau de la serviciu de tip Alcatel , precum si pe cei dintr-o anumita localitate indicata de utilizator.

f)       Scrieti proceduri de regasire a persoanelor , in functie de optiunea utilizatorului, dupa cod / nume / data nastere / telefon.

Scrieti un program pentru calcularea mediilor. Ca date de intrare creati fisierul STUD (nr_matr (N), nume (C), prenume (C), nota1 (N),nota2 (N),nota3 (N), nota4 (N). Nota i = 0 reprezinta absenta la examenul respectiv. Mediile se vor calcula intr-o functie , dupa regula: pentru o singura absenta se imparte suma notelor la 3, altfel la 4. Pentru mai mult de o absenta media este 0. Afisati baza de date STUD (BROWSE) care sa contina si campul calculat Media (nu exista fizic !). Afisati studentii in ordine alfabetica sau in ordinea mediilor ,dupa optiune.

Creati (CREATE) doua baze de date cu urmatoarele structuri :

JUDETE

‑ denumire ‑ unica

‑ abreviere (doua litere ‑ una pentru Bucuresti, inclus printre judete) ‑ unica

‑ suprafata

‑ populatie

ORASE

‑ denumire

‑ cod de identificare (de exemplu, codul postal ) ‑ unic

‑ judetul corespunzator (indicat prin abreviere) - sa fie existent in JUDETE

‑ populatie

Scrieti cate o procedura de actualizare a continutului bazelor de date create , folosind comenzile APPEND BLANK si EDIT.

Obs.: - se vor asigura unicitatile specificate

- se vor stabili limite MAXIME/MINIME rezonabile pentru suprafata si populatie

- nu vor fi acceptate valori negative (la suprafata/populatie)

- se vor da mesaje de eroare in situatiile de mai sus

cautarea se va face cu LOCATE (vezi Help)



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1399
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved