Sunteți pe pagina 1din 160

LIMBAJUL FoxPro NOIUNEA DE ALGORITM

Aceast lucrare o fost elaborat pentru a veni n sprijinul celor care doresc s nvee i s practice programarea n limbajul PASCAL. Lucrarea trebuie privit ca o introducere n problematica limbajului PASCAL. Odat stpnite noiunile prezentate n continuare, oricine poate aprofunda orict i n orice direcie toate subtilitile diverselor variante ale limbajului TURBOPASCAL.

Scrierea algoritmului de rezolvare a problemei.


Definiie: - algoritmul este un ansamblu de reguli de prelucrare, mpreun cu ordinea n care se succed n vederea soluionrii unui tip de probleme. -un sistem de reguli care pentru o problem dat, pornind de la datele iniiale se ajunge la rezultatele finale pe baza unui proces unic, finit, proces deschis printr-o succesiune de operaii de rutin la care nu intervine aportul creator al omului.

Proprietile algoritmului

generalitatea const n aceea c un algoritm nu rezolv o singur problem ci o clas de probleme de acelai tip; Finititudinea numrul transformrilor ce trebuie aplicat unei informaii de intrare pentru a obine imformaia final este finit; Unicitatea toate transformrile prin care trece informaia final sunt univoc determinate de regulile algoritmului.

Mrimi cu care opereaz algoritmii


Variabile - o mrime care poate lua o mulime de valori posibile n cursul prelucrrii. Constante - o mrime ce are atribuit o valoare care nu se modific n timpul execuiei.

Mrimile pot fi succesiuni de caractere alfabetice, numerice i chiar speciale. Este indicat ca aceste numere atribuite mrimilor s fie sugestive.

Operaii utilizate n algoritmi


ntr-un algoritm, regulile trebuie s precizeze foarte clar operaiile ce se execut asupra datelor. 1.Operaii de calcul sunt operaiile obinuite de : adunare (+), scdere (-), nmulire (*), mprire (/), ridicare la putere. Acestea intervin n cadrul expresiilor care sunt o succesiune de variabile i constante legate ntre ele prin operatori ( semne de operaii ) i eventual paranteze, dup reguli bine definite. n cadrul expresiilor operaiile se execut n ordinea natural, conform prioritilor. ntr-un algoritm o expresie apare ntotdeauna n cadrul unei operaii de atribuire. 2.Operaii de atribuire: printr-o asemenea operaie se atribuie unei variabilie o valoare a unei - constante, variabile, expresii. Operaia de atribuire se noteaz cu: := sau Ex: NUME : = IOAN (constant) NUME IOAN NUME : = NUMEP (variabil) NUME NUMEP A:= 1, A1, A:= X-1, A:= A+1 3.Operaii de test (decizie): scopul acestei operaii este de a verifica relaiile existente ntre datele asupra crora opereaz algoritmul pentru a decide transmiterea controlului execuiei ctre o anumit instruciune. n urma executrii unei operaii de test rezultatul obinut este una din aa numitele valori logice de adevr: adevrat sau fals. Operaiile de test se reprezint prin semnele: <; 4.Operaii de intrare/ieire : se refer la introducerea datelor de intrare respectiv furnizarea rezultatelor.

Operaii de intrare citire, atribuire citete Operaii de ieire - scriere, afiare scriere

Simboluri grafice
Schema logic este forma grafic de reprezentare a unui algoritm utiliznd simbolurile de reprezentare a operaiilor. Simbol Denumire simbol Sgeat Semnificaie

Realizeaz legtura ntre blocuri Bloc delimitator Marcheaz nceputul sau sfritul programului Bloc de Reprezint operaia de citire intrare/ieire sau scriere Bloc de calcul Descrie operaiile de calcul sau atribuire i atribuire Bloc de decizie DA NU Reprezint condiiile puse

Conectori a) b)

Bloc procedur

a)Cnd mai multe variante ale schemei logice se ntlnesc n acelai punct, conector de pagin b) conector de trecere pe alt pagin de Folosit pentru apelarea unei proceduri (program) reprezentat anterior

Operaii - aritmetice: avem operaii cu (+, - , *, DIV, MOD ) - numere reale (+, -, *, / )

- numere ntregi

operaii pe bii se aplic numai operanzilor de tip ntreg. Operatori pot fi: AND OR XOR NOT SHL SHR SI aritmetic (conjuncie) SAU aritmetic (disjuncie) SAU EXCLUSIV NEGAIE (nlocuirea lui 0 cu 1 i invers) deplasare stnga bit cu bit deplasare dreapta bit cu bit Deplasare se face pe toat lungimea n bii a tipului la care se aplic. Operaie 0 OR 0 0 OR 1 1 OR 0 1 OR 1 0 AND 0 0 AND 1 1 AND 0 1 AND 1 NOT 0 NOT 1 Rezultat 0 1 1 1 0 0 0 1 1 0

- operaii cu mulimi reuniune, intersecia, diferena. - operaii cu iruri de caractere operanzii pot fi de tip ir de caractere (string) sau de tip chart. Rezultatul este ntotdeauna de tip ir de caractere - operaia de adresare se aplic asupra identificatorilor de variabil, constant simbolic, funcii, proceduri - operaii logice ( AND, OR, XOR, NOT ) operanzii sunt de tip logic (Boolean). - operaii relaionale (relaii)- permit compararea a doi operanzi, rezultatul va fi de tip boolean.

Exemple de scheme logice


1. Schema logic a nmulirii

start

P: = 0

Citete M,N

P:=M*N

Tiprete p

End

2. Schema logic a algoritmului care rezolv ecuaia de gradul 2 de forma: Ax2 + Bx + C = 0 Pentru rezolvare se calculeaz D : = B 2 4 * A * C, iar apoi valorile pentru x1 i x2 n cazul cnd acestea au valori reale, iar n cazul cnd x1 i x2 au valori complexe se scrie un mesaj.

start

Citete A,B,C aaadfgfgA,B,A

,B,C
D : = B2 4 * A * C

NU D>0

DA

Scrie mesaj

X1 : = (- B + D ) / 2 * A

X2 : = (- B - D ) / 2 * A

Scrie x1, x2

end

3. S se deseneze schema logic a unui algoritm de calcul al valorii minime din trei numere date ( A, B, C ) i se tipresc aceast valoare.

Pentru a gsi minimul a trei elemente se compar primele dou i cel mai mic dintre ele se compar cu al treilea. Cel mai mic dintre acestea este elementul cu valoarea minim.
start

Citete A,B,C

NU

DA

A<B

DA

NU

NU

DA

B<C

A<C

M:=B

M:=C

M:=A

Scrie M

end

4. S se deseneze schema logic pentru suma a dou matrici. Operaiile asupra matricilor impun parcurgerea acestora element cu element, fapt care presupune modificarea ciclic a indicilor de linie i de coloan. Presupunem c avem matricea A [ M, N ] i matricea B [ M, N ] iar matricea rezultat va fi C [ M, N ] unde M reprezimt numrul de linii iar N reprezint numrul de coloane.

I = 1, M
J = 1, N
start

I:=1

J:=1

C[ i, j ] : = A[ i, j ] + C [i, j ]

J:=j+1

DA J<N NU I:=i+1 DA
I< M NU

NU

Scrie C [ i, j ]

End

10

5. Se consider un ir de N numere reale x1, x2, ...xn i numerele reale A i B. S se deseneze schema logic al unui algoritm de calcul al numrului de elemente din ir care sunt cuprinse n intervalul ( A, B ).
start

Citete A, B, N , X, i M:=0 i:=1 NU x >A

DA x<B DA M:=M+1 i:=i+1 DA i<N NU Scrie M

NU

Se iniializeaz numrul M cu 0. se iau apoi elementele irului pe rnd i dac sunt n interval se mrete contorul M cu 1, dac nu M rmne neschimbat. Apoi se trece la urmtorul element s.a.m.d.

End

11

start x ...x 6.Se consider irul 1 100. S se deseneze schema logic a unui algoritm de calcul a mediei aritmetice a termenilor pozitivi din ir. Citete xi , i = 1,100

s:=0 p:=0 i:=1

DA xi > 0 s : = s + xi p:=p+1

NU

i:=i+1

DA i < 100

NU M:=s/p

Scrie s

12
end

Considerm: s suma termenilor pozitivi p numrul termenilor pozitivi din ir s / p = M media aritmetic
Start

Citete N,Ai, i- 1,N

k:=0

i:=0

DA

A A 7.Se d un ir de N numere Ai > Ai + 1 reale A 1 .. C :n = . S se deseneze A i : = A i+1 Ai s ordoneze irul schema logic a unui algoritm de calcul care cresctor. A :=C
i+1

k:=1 NU

Ui : = i + 1
DA

i<N

NU

NU k=0

U U

U
DA

Scrie Ai

13

end

14

Etapele de execuie a unui program


Limbajul de programare constituie mijlocul de comunicare ntre om i calculator, iar descrierea succesiunii de operaii pe care trebuie s le efectueze calculatorul se numete program. Etapele necesare realizrii unui program sunt urmtoarele: a) scrierea programului (ntr-un anumit limbaj de programare); b) compilarea programului; c) editarea de legturi (link-editarea); d) execuia programului; e) eventuala depanare a sa, relund procedeul de la etapa a); f) mbuntirea performanelor programului; a) Scrierea programului presupune editarea unui fiier ce conine textul programului. Acest fiier se cheam fiier-surs i este un fiier text n format ASCII. n interiorul su el conine instruciuni ale limbajului n care se face programarea. Un limbaj de programare este foarte asemntor limbajului obinuit (natural); el reprezint un sistem de convenii pe baza cruia se efectueaz o comunicare. Deci limbajul de programare este un sistem de cuvinte (cheie), semne, construcii cu cuvinte i semne care ne asigur de faptul c transmitem calculatorului ceea ce dorim s realizeze. b)Propoziiile i frazele unui limbaj de programare nu sunt direct nelese de calculator. Ele sunt traduse din aceast form uor manevrabil n instruciuni main (singurele recunoscute de microprocesor) de cte un program ce se cheam compilator. Acest program recunoate noiunile din fiierul-surs i le convertete n echivalenele lor n limbaj main pe care le depune ntr-un fiier de ieire numit fiier-obiect. Fiierul-obiect produs de un compilator nu este, nc, gata de a fi executat necesitnd o prelucrare suplimentar .

15

Dac fiecare instruciune din fiierul-surs ar produce instruciuni care realizeaz scrierea unui mesaj aceast poriune de cod s-ar gsi repetat (cu mici modificri) n mai multe locuri din program. Pentru nlturarea unui astfel de lucru nedorit, operaiile cel mai des folosite sunt izolate ntr-o colecie de rutine, de unde pot fi apelate oricnd este nevoie. Deci dup compilare, fiierul-obiect produs nu va conine ntotdeauna instruciunile necesare unei operaii ci eventuale referiri la rutina de bibliotec ce execut operaia n cauz. c) Editarea de legturi (link-editare) va rezolva aceste referiri stabilind conexiunile dintre referiri i punctele referite. Ea va conecta referinele nerezolvate de compilator cu modulele de bibliotec ce le corespund. Din colecia de rutine (denumit bibliotec) vor fi extrase numai acele rutine (module) referite care mpreun cu instruciunile din fiierul-obiect vor constitui un program coerent, adic un fiierexecutabil. d) Execuia programului este scopul final al etapelor anterioare i presupune lansarea fiierului-executabil astfel obinut. Pentru aceast operaie sunt eventual necesare: - ndeplinirea unor cerine din partea sistemului; - specificarea de parametri corespunztori pentru program. e) n cazul unui program mai amplu sau n cazul unui debut n programare va fi ntotdeauna necesar depanarea programului obinut deoarece (fr gre) acesta nu va funciona din prima. Pentru depistarea eventualelor erori stau la dispoziie pachete de programe numite depanatoare. f) Dup ce programul a fost convins s funcioneze corect, abia atunci este cazul a ncerca mbuntirea performanelor sale (vitez de execuie, resurse sistem mai reduse, protejare la erori). Pentru acest reglaj fin stau la dispoziie programe de tip profiler care detecteaz zonele de programe ce consum cea mai mare cantitate de timp puncte n care trebuie s se concentreze atenia programatorului. De regul se obinuiete a se lansa o versiune de test a aplicaiei care este exploatat efectiv pentru a constata eventualele erori de funcionare.

16

Etapele de compilare i link-editare sunt necesare pentru realizarea unui program compilat. Se pot executa aplicaii i fr producerea fiierelor obiect i executabil. Metoda folosit este cea a unui interpretor. Un interpretor, compileaz, link-editeaz i execut un program linie-cu-linie. Pe msur ce sunt citite linii din fiierulsurs ele sunt transformate n instruciuni main i executate imediat. Pentru un program dat, un interpretor nu mai produce fiiere-obiect i executabil, opernd numai cu fiierul-surs. Care din metode este cea mai bun, cea a unui compilator sau cea a unui interpretor? Pentru interpretor pledeaz un singur avantaj, i anume reducerea timpului de punere la punct a unei aplicaii (prin eliminarea etapelor intermediare), dar acest avantaj este infim, deoarece n momentul de fa, mediile de programare de tip compilator, sunt extrem de rapide (sute de linii de text-surs pe secund) i realizeaz automat link-editarea i execuia, astfel nct ntrzierile provocate de etapele suplimentare sunt neglijabile. n schimb, avantajele unui program compilat fa de un program interpretat sunt zdrobitoare: - vitez de execuie de cteva ori (chiar zeci de ori) mai mare; - posibilitatea de a rula de sine stttor; odat compilat, compilatorul nu este necesar n execuia programului, pe cnd un program interpretat nu se poate executa dect dac interpretorul se afl n memoria calculatorului; - deci programul compilat dispune de resursele sistemului n ntregime, pe cnd cel interpretat le mparte cu interpretorul (mai ales memoria, care este de multe ori critic); - flexibilitatea sporit n realizarea programelor compilate (adugarea de noi biblioteci, redefinirea unei rutine deja existente etc). Toate aceste consideraii au determinat ca interpretoarele s fie pe cale de dispariie la ora de fa sau oricum, s fie dublate de un compilator. Spre exemplu limbajul BASIC ce beneficia iniial numai

17

de interpretor posed n prezent i compilatoare care ncearc s-l menin n atenia programatorilor.

Mediul de programare
Un pachet de programe ce asigur toate operaiile de mai nainte poart numele de mediu de programare. Cu ajutorul su: - se editeaz un program; - se compileaz i eventual link-editeaz automat; - se lanseaz n execuie; - se depaneaz un program; - se poate regla execuia unui program (cu un profiler). Mediile de programare disponibile n prezent sunt deosebit de performante i ofer utilizatorului toat gama de servicii necesare (help, exemple gata-construite etc), prin intermediul unor prgrame puternic interactive. Ele transform munca laborioas a programatorului ntr-un succes aproape sigur.

LIMBAJUL FOXPRO Tipuri de fiiere


Fiierele FOXPRO rein date, programe, informaii pentru generatoarele sistemului i se deosebesc prin extensii. Principalele fiiere cu care lucreaz FoxPro sunt: 1. fiiere .DBF sunt fiierele baze de date; 2. fiiere .PRG sunt textele surs ale programelor sau subprogramelor; 3. fiiere .MEM conin variabilele de memorie; 4. fiierele .NDX conin indexii asociai unei baze de date n vederea parcurgerii ordonate a acesteia; 5. fiierele .MDX conin liste mai mari de indexi; 6. fiierele .SCR, .FMT sunt folosite de generatorul de machete ecran; 7. fiierele .FRM conin proiectul de raport; 8. fiierele .LBL conin proiectul de etichet;

18

9. fiierele .DBO, .FRO, .FMO, .LBO sunt rezultatul compilrii programelor i proiectelor.

Operaii generale cu fiiere i directoare


Schimbarea directorului de lucru: SET DIRECTORY TO <director> Observaie: putem folosi i comanda DOS pentru aceast operaie CD (change directory) apelnd-o pentru execuie prin !. Schimbarea discului curent : SET DEFAULT TO <disc> Observaie: n FoxPro nu exist comanda SET DIRECTORY; pentru poziionarea pe un anumit director putem folosi comanda SET DEFAULT TO <director>. Indicarea directoarelor de cutare: SET PATH TO <lista de directoare> Orientarea cutrii unui fiier ntr-o list de directoare se face prin comanda SET PATH. Atenie: se va folosi <lista de directoare> la deschiderea unui fiier pentru consultare nu i de la depunerea lui prin creare.

Variabile i masive Variabile

19

Prelucrarea datelor cu ajutorul calculatorului presupune mai nti depozitare acestora ntr-o memorie extern sau interna a calculatorului. Pentru depozitarea n memoria intern a unei anumite date ( de tip numeric, logic, ir de caractere etc. ) se folosete variabila de memorie, sau simplu variabila. Aceasta reprezint o zon de memorie, creia I se atribuie un nume, i n care se poate memora o variabil de un anumit tip. Ca urmare o variabil are trei elemente specifice: - numele variabilei, atribuit de programator sau predefinit de proiectanii FoxPro ului, folosit pentr identificarea variabilei respective printre celelalte variabile existente la un moment dat n memorie; - coninutul sau valoarea variabilei, reprezentnd data ce este memorat n zona de memorie a veriabilei. n timpul unui program coninutul unei variabile se poate modifica; - tipul variabilei, reprezentnd tipul datei ce se poate memora n zona de memorie a variabilei. Acest tip determin comenzile i functiile ce se pot aplica acestor variabile. Exemplu: Nume Coninut + tip alfa 432 Referirea la o variabil se face prin numele su, astfel: ? alfa 432 se traduce prin afieaz ( ? ) coninutul variabilei alfa ( 432 ) . variabila alfa este de tip numeric, nelegnd prin aceasta c ea poate memora un numr, o valoare de tip numeric. Pentru folosirea unei variabile, ea trebuie mai nti creat, acesata presupunnd: - atribuirea unui nume variabilei respective - stabilirea tipului variabilei i rezervarea zonei de memorie ce este atribuit variabilei; - atribuirea unei valori iniiale pentru aceasta, adic stabilirea coninutului iniial al variabilei.

20

Tipurile posibile pentru variabile sunt: numeric, caracter, dat calendaristic, logic. O alt caracteristic a variabilelor FOX este statutul lor public sau privat. O variabil are statut privat (sau local) programului unde ea a fost creat, pierzndu-i valabilitatea dup terminarea execuiei programului. Dac a fost creat n modul de lucru comand ea are statutul de variabil public (global) fiind recunoscut n toate unitile funcionale (subprograme, funcii utilizator) lansate din acest mod de lucru. Tablourile pot avea doar 1-2 dimensiuni i ceea ce este de subliniat spre deosebire de limbajele de programare PASCAL, C, unde le-am mai ntlnit, n dBASE (FoxPro) natura elementelor nu este omogen; n funcie de valoarea reinut la un moment dat, unele elemente pot fi numerice, altele caracter, etc. Declararea variabilelor: Variabilele simple nu necesit declarare, ci numai tablourile. nainte de folosirea elementelor sale, tabloul trebuie declarat printr-o comand: DECLARARE <lista-tablou> unde <lista-tablou> este o secven de nume de tablouri separate de virgul: <nume-tab>[<dim1>[, <dim2>]]. Declararea dimensiunii unui tablou nseamn i iniializarea valorilor tabloului cu valoarea logic .F. Observaie: n FoxPro, pentru tablouri se pot folosi att parantezele ptrate ct i cele rotunde

Operaia de atribuire:
n FoxPro, exist dou modaliti de a atribui valori iniiale sau de a modifica valoarea unei variabile: prin comanda STORE i prin comanda de atribuire <var>=<exp>.

21

a) Crearea unei variabile sau modificarea valorii acesteia se realizeaz prin operatorul de atribuire, cu urmtoarea sintax: <variabil> = <exp> Funcionarea unei asemanea comenzi are loc astfel: - se evalueaz expresia <exp>, obinndu-se o valoare de un anumit tip; - se caut n memorie variabila cu numele <variabil> i, dac se gsete, se nlocuiete vechiul coninut al acesteia, cu valoarea expresiei; - dac nu se gsete variabila respectiv, FoxPro creaz una nou cu numele <variabil>, n care depune valoarea expresiei; - tipul variabilei este dat de tipul valorii expresiei, indiferent de tipul anterior al variabilei, n cazul cnd aceasta exist i nainte de execuia comenzii. Exemplu: a=2 && se creaz variabila numeric a cu valoarea iniial 2 a = bun && vechea variabil a este nlocuit cu una nou, de tip ir de caractere; ce va conine irul bun data = {12 \01 \70 } && se creaz variabila data, de tip calendaristic, cu valoarea iniial {12 \01 \70} b) o comand echivalent cu operatorul de atribuire este comanda STORE: STORE <expr> TO <list-variabile> Comanda const n evaluarea expresiei <expr> i depunerea valorii rezultate n toate variabilele din <list variabile>. Cele care nu exist vor fi create odat cu execuia comenzii. Exemplu: STORE 0 TO a, b, c NOTE se creaz trei variabile numerice a, b, c, care sunt iniializate cu valoarea 0.

22

STORE {12 \01 \70} TO data NOTE se creaz variabila data, de tip dat calendaristic i se iniializeaz cu valoarea {12 \01 \70}

Citirea unei variabile


Operaia de citire a unei variabile are nelesul de atribuire unei valori de la tastatur pentru variabila respectiv. Sunt trei astfel de comenzi prin care se pot da valori unei variabile. Atenie! numai unei singure variabile i se poate citi valoarea ntr-o comand. a) Comanda de citire INPUT permite crearea/modificarea oricrui tip de variabil: INPUT [<mesaj>] TO <var> Comanda INPUT permite afiarea (eventual) a unui mesaj <mesaj> pe ecran i ateapt introducerea de ctre operator a unei expresii. Expresia se evalueaz i, dac este corect, se creeaz variabila cu numele specificat n <var>. Variabile primete cu aceast ocazie tipul expresiei introdus de operator. b) comanda ACCEPT permite crearea sau modificarea variabilelor de tip caracter: ACCEPT [<mesaj>] TO <var> Observaie: Indiferent de tipul expresiei introdus de la tastatur, comanda consider i evalueaz numai iruri. c) comanda WAIT permite crearea unei variabile de tip caracter i lungime 1: WAIT [<mesaj>] [TO <var>]

23

Comanda permite o pauz n program pn cnd operatorul apas o tast. Caracterul corespunztor tastei este eventual atribuit variabilei <var> imediat ce a fost apsat tasta ne mai ateptndu-se certificarea introducerii prin tasta <enter>, ca la celelalte citiri. i mesajul poate lipsi; n acest caz sistemul are un mesaj standard de tipul: Press and key to continue

tergerea variabilelor
Numrul de variabile pe care le poate gestiona sistemul este destul de mare ca s nu ne preocupe eliberarea spaiului prin tergerea unor variabile. De asemenea, toate variabilele folosite ntrun program sunt terse automat cnd programul respectiv se termin. Dar, uneori este necesar s avem n memorie numai anumite variabile din cele manipulante n sesiune (pentru a le salva pe disc de exemplu). Operaia de tergere a variabilelor are urmtorul format general: RELEASE <list-variabile>/ALL/ [LIKE /EXCEPT <macchet> ]

Comanda RELEASE permite tergerea unor variabile nominalizate n <list-variabile>. Dac este prezent opiunea ALL, sunt terse automat toate variabilele.
Clauza <masca> permite selectarea variabilelor care vor fi terse (clauza LIKE) sau nu (clauza EXCEPT). Exemplu: RELEASE alfa, beta && se elimin din memorie variabilele alfa i beta RELEASE ALL LIKE a* Note se nltur din memorie toate variabilele care ncep cu litera a RELEASE ALL EXCEPT b? NOTE se vor elimina toate variabilele cu excepia celor al cror nume este format din dou caractere, dintre care primul este b

24

Operaia de tergere a tuturor variabilelor poate fi realizat prin alte dou comenzi: CLEAR MEMORY CLEAR ALL

Folosirea distinct a celor dou comenzi RELEASE, CLEAR ALL este legat de statutul de variabil public sau privat a unei variabile. Comanda RELEASE ALL terge toate variabilele locale, dar nu acioneaz asupra celor publice. Comanda CLEAR permite tergerea variabilelor publice, care n mod firesc se terg numai la ncheierea sesiunii de lucru. Salvarea i restaurarea variabilelor O alt problem important este salvarea variabilelor create ntr-o sesiune de lucru ca variabile publice sau private, n vederea refolosirii lor ulterioare. Trecerea pe disc a acestor variabile utile mai multor sesiuni ntr-un fiier special cu extensia .MEM se face prin comanda SAVE: SAVE TO <fis.mem> [ALL LIKE /EXCEPT <masca>] Sunt trecute pe disc n fiierul <fis.mem> fie toate variabilele (este opiunea implicit) fie numai o parte a acestora (clauza ALL LIKE va indica cele ce se vor pstra, clauza ALL EXCEPT pe cele ce se vor ignora la salvare). Exemplu: CLEAR ALL CLEAR a=1 b=2 suma = a + b ? a , + , b , ? , suma 1+2=3 SAVE TO fvar

25

NOTE se salveaz variabilele a , b i suma n fiierul fvar.mem a=5 b=3 suma = a + b ? a , + , b , ? , suma 5+3=8 RESTORE FROM fvar ? a , + , b , ? , suma 1+2=3 Restaurarea nseamn trecerea variabilelor din fiier n memoria de lucru i se face prin suprascriere prin comanda RESTORE: RESTORE FROM <fis. mem> [ADDITIVE] Clauza ADDITIVE este necesar atunci cnd vrem s se adauge variabilele salvate la cele existente. O tehnic special de lucru cu variabile o reprezint macrosubstituia, prin care coninutul unei variabile de tip ir de caracter este tratat ca numele altei variabile. Macrosubstituia funcioneaz ca i cum n locul variabilei respective ar fi pus irul de caractere coninut de aceasta, fr apostrofurile delimitatoare. Sintaxa este: & < var > [ . < expC > ] n care <var> desemneaz variabila de tip ir de caractere care va fi substituit de coninutul su. Exemplu: a = alfa alfa = Salut ! ?&a Salut ! ? alfa && echivalent cu comanda anterioar

26

Salut ! O alt metod de referire indirect la o variabil dat este reprezentat de expresiile nume. Acestea determin tratarea valorii unei espresii ca un nume. Pentru ca o expresie s fie tratat ca o expresie de tip nume, aceasta se ncadreaz ntre paranteze rotunde. Construcia este tratat ca o expresie de tip nume numai acolo unde nu exist posibilitatea confundrii parantezelor rotunde cu cele care grupeaz operaiile din expresii. Exemplu: a = nume b = propriu ? ( a + b ) && nu va fi tratat ca o expresie numeric nume propriu . REPLACE ( a ) WITH Popescu NOTE n acest caz a este o expresie nume Ori de cte ori este posibil folosirea expresiilor nume, se recomand aceast metod deoarece macrosubstituia este mai lent. Afiarea listei variabilelor existente se realizeaz prin urmtoarea comand: DISPLAY/LIST MEMORY [TO PRINTER/TO FILE <fis. txt>] Comanda permite trecerea n revist a variabilelor utilizator cu statutul lor public sau privat, tipul i valoarea n momentul respectiv. Statutul public al unei variabile i permite s fie recunoscut n mai multe programe; altfel ea are caracter privat, fiind local programului care a definit variabila. Clauza TO PRINTER permite afiarea listei la imprimant, iar clauza TO FILE trecerea listei de variabile ntr-un fiier text.

Masive
O variabil poate memora la un moment dat o singur valoare, de un anumit tip, tipul variabilei respective. Pentru memorarea simultan a mai multor valori se pot folosi mai multa

27

variabile, crora li se atribuie pentru identificare nume distincte. Dar ce facem atunci cnd numrul valorilor care trebuiesc memorate simultan este mare? O comanda care spre exemplu , ar incrca variabilele respective cu date dintr-un fiier, ar ocupa sute de linii din program, necesare pentru specificarea tuturor variabilelor care vor fi ncrcate. Evident c acest lucru este ineficient , acest metoda fiind nerecomandat. O alt metoda pentru memorarea mai multor valori n memoria interna a calculatorului este oferit de masive , structuri de date care permit memorarea mai multor valori ntr-o zon de memorie continu creia i se atribuie un nume, valorile respective putnd fi tratate ca un tot unitar (n comenzi in funcii speciale) , ct i independent, ca variabile simple. Masivele sunt organizate sub forma unui tablou de valori, unidimensional sau bidimensional, deci sub form de vector sau de matrice. Declararea unui masiv (vector sau matrice), presupune urmtoarele operaii: -stabilirea tipului masivului, adic dac acesta este vector sau matrice; -rezervarea zonei de memorie necesar depozitrii valorilor care vor fi memorate n masiv, n funcie de numrul de elemente ale acestuia; - atribuirea unui nume, prin caremasivul va fi identificat. Declararea unui masiv se realizeaz prin una din comenzile DIMENSION sau DECLARE, care sunt identice ca funcionare i sintaxa: DIMENSION <masiv1> (<expN1> [,<expN2>]) [, <masiv2> (<expN3> [,<expN4>]) ] DECLARE <masiv1> (<expN1> [,<expN2>]) [, <masiv2> (<expN3> [,<expN4>]) ] cu aceste comenzi se pot declara unul sau mai multe tablouri, ale cror nume vor fi <masiv1>, <masiv2>,.. Tipul tabloului, unidimensional (vector) sau bidimensional (matrice), va fi dat de numrul de expresii numerice care urmeaz numelui:

28

unidimensional, cnd este prezent o singur expresie, i bidimensional, cnd sunt prezente dou valori numerice ntre parantezele rotunde. Dimensiunea tabloului, adic numrul de elemente ale acestuia, este dat de valorile expresiilor dintre paranteze <expN1> i <expN2> pentru primul tablou i <expN3> i <expN4> pentru cel de-al doilea i aa mai departe. Astfel tabloul unidimensional <masiv1> va avea <expN1> elemente numerotate de la 1 la <expN1> iar, dac acesta este bidimensional, numrul de elemente va fi <expN1>*<expN2>. n cazul unui tablou bidimensional, deci o matrice, se adopt urmtoarea tehnologie, preluatade la lucrul cu matrice: prima expresie din parantez va da numrul de linii ale matricei, numerotate de la 1 la <expN1> iar cea de a doua expresie numrul de coloane ale matricei, numerotate de la 1 la <expN2>. Exemplu: DIMENSION a(10) NOTE definete vectorul a cu 10 elemente,numerotate de la 1 la 10. DIMENSION alfa(2,4) NOTE va declara matricea alfa cu 2 linii i 4 coloane DECLARE vector ( 3 ) , mat ( 5,10 ) NOTE se definete vectorul vector cu 3 elemente i matricea mat cu 5 linii si 10 coloane. n comenzile DIMENSION i DECLARE se pot nlocui parantezele rotunde cu cele ptrate, fr a afecta comanda respectiv. Elementele masivului sunt identificate prin poziia acestora n cadrul tabloului, astfel: - printr-un singur numr, indicnd poziia elementuluin cadrul vectorului; - prin doua numere,care vor desemna linia si coloana la care se afla elementul respectiv. Exemplu: a ( 5 ) identifica al 5-lea element al vectorului a

29

Alfa ( 2,3 ) desemneaza elementul de pe linia 2 si coloana 3 a matricei alfa. Elementele unei matrici pot fi, de asemenea, desemnate printr-o singur valoare numeric, care va indica poziia n matrice a elementului respectiv, numrarea acestora fcndu-se n ordinea urmtoare: mai nti se numra elementul unei linii, dup care se trece la urmtoarea. Exemplu: elementul alfa ( 2,3 ) poate fi identificat i prin alfa ( 7 ): alfa( 1 ) alfa( 2 ) alfa( 3 ) alfa( 4 ) alfa( 5 ) alfa( 6 ) alfa( 7 ) alfa( 8 ) alfa (2,3) Dup declararea unui masiv toate elementele acestuia vor fi de tip logic, avnd iniial valoarea .F. Att tipul ct i valoarea unui element al masivului, pot fi schimbate printr-o instruciune de atribuire ( operatorul de atribuire = sau comanda STORE ). Elementele unui masiv nu trebuie neaprat s aib acelei tip ( spre deosebire de alte limbaje, Pascal, C). O modalitate special de iniializare a elementelor unui masiv este dat de folosirea unei instruciuni de atribuire n care, n locul variabilei de atribuit, este introdus numele masivului. Astfet, toate elementele masivului vor capta valoarea expresiei din instruciune. Exemplu: DIMENSION a (10) STORE 0 TO a NOTE toate elementele masivului vor fi de tip numeric, avand ; initial valoarea 0. ? a (3) =, a (3) a (3) = 0 a= NOTE tipul tuturor elementelor masivului a va fi sir de caractere; i toate elementele acestuia vor avea valoarea

30

Marimea si dimensiunile unui tablou creat anterior se pot schimba printr-o noua comanda DIMENSION sau DECLARE, prin redefinirea acestuia. Se pot realiza astfel: - marirea sau micorarea dimensiunii unui tablou unidimensional ; - transformarea unui tablou unidimensional ntr-unul bidimensional i incers; - redimensionarea unui tablou bidimensional. Pentru masive unidimensionale: - la mrirea numrului de elemente ale acestuia, vechile elemente vor rmne neschimbate, iar noile elemente vor fi de tip logic, avnd iniial valoarea .F.; - la micorarea dimensiunii masivului, elementele care sunt n plus vor fi eliminate din memorie, iar celelalte vor rmne neschimbate. Transformarea unui masiv bidimensional ntr-unul unidimensional se face copiind elementele vechiului masiv, linie cu linie, n cadrul fiecrei linii copierea fcndu-se de la primul pn la ultimul element al acesteia. n aceast situaie apar dou cazuri: - masivul bidimensional avea mai multe elemente dect noul masiv unidimensional: n acest caz restul elementelor care nu au ncput se pierd; - noul masiv creat, unidimensional, are mai multe elemente dect noul masiv bidimensional, caz n care restul elementelor masivului unidimensional pentru care nu au mai fost elemente de copiat din primul masiv, vor fi iniializate cu valoarea logic .F. Trecerea invers se face n mod analog: completarea masivului bidimensional se face pe linii , ncepnd cu prima linie a masivului i terminnd cu ultima. i n acest caz elementele care nu ncap n noul masiv bidimensional se pierd, iar elementele masivului bidimensional care nu au corespondent n masivul unidimensional vor fi de tip logic, cu valoarea iniial .F. Redimensionarea unui masiv bidimensional se realizeaz prin alocarea memoriei necesare noului masiv bidimensional, dup

31

care urmeaz copierea elementelor vechiului masiv n cel nou, n ordinea numerotrii acestora. Elementele vechiului masiv bidimensional care nu ncap n cel nou se vor pierde, iar dac exist elemente ale noului masiv care nu au corespondent n vechiul masiv, acestea vor fi iniializate la valoarea logic .F. Exemplu: DIMENSION a ( 2,3 ) FOR I = 1 TO 6 a(I)=0 ENDFOR FOR I = 1 TO 2 ? FOR J = 1 TO 3 ?? a ( I,J ) ENDFOR ENDFOR ? DIMENSION a ( 3,4 ) FOR I = 1 TO 3 ? FOR J = 1 TO 4 ?? a ( I,J ) ENDFOR ENDFOR Vom obine pe ecran urmtoarele rezultate: 1 4 2 5 3 6

1 2 3 4 5 6 .F. .F. .F. .F. .F. .F. Vom prezenta n continuare funciile referitoare la prelucrarea masivelor.

32

Numrul elementelor unui masiv, numrul liniilor sau numrul colanelor acestuia, se obine prin funcia ALEN ( ), aceasta avnd sintaxa: ALEN ( < masiv> [ , < expN > ] ) < masiv > desemneaz masivul asupra cruia ne informm, iar <expN> este o expresie numeric ce determin informaia returnat, astfel; - cnd valoarea acesteia este 0, funcia returneaz numrul de elemente ale masivului; - la valoarea 1 a expresiei funcia va returna numrul de linii ale masivului ( numrul de elemente pentru masive unidimensionale ); - n cazul valorii 2 a lui < expN>, funcia va returna numrul de coloane ale masivului ( 0 pentru masivele bidimensionale ). Valoarea returnat este de tip numeric. Exemplu: DIMENSION alfa (3,5 ) ? tabloul alfa are ,ALEN ( alfa ), elemente Tabloul alfa are 15 elemente ? Acest tablou are ,ALEN ( alfa, 1 ), linii si , ALEN ( alfa , 2 ) , coloane Acest tablou are 3 linii si 5 coloane Absena expresiei numerice <expN> este echivalent cu valoarea 0 a acesteia. Exemplu: DIMENSION a ( 10 ) ? ALEN ( a ) = ALEN ( a, 0 ) .T. nserarea unui element, a unei linii sau a unei coloane ntr-un masiv se realizeaz cu funcia AINS ( ), avnd sintaxa: AINS ( < masiv> [ , 2 ] )

33

Aceast funcie lucreaz diferit, n funcie de numrul dimensiunilor masivului: - pentru masive unidimensionale funia va nsera un nou element n poziia <expN> a masivului <masiv>; - pentru masive bidimensionale funcia va nsera o linie, a <expN>-a linie a masivului <masiv>, cnd lipsete parametrul 2 din apelul funciei, sau va nsera o coloan, a <expN>-a coloan, n cazul cnd parametrul 2 este prezent. nserarea unui element, a unei linii sau a unei coloane ntr-un masiv nu va determina modificarea dimensiunii acestuia ci pierderea elementelor care nu mai ncap n masiv dup ce nserarea are loc. Exemplu: DIMENSION a ( 5 ) FOR I = 1 TO 5 a(I)=I ENDFOR ? FOR I = 1 TO 5 ??a(I) ENDFOR AINS ( a , 3 ) FOR I = 1 TO 5 ??a(I) ENDFOR n exemplul anterior, nserarea elementului nou pe poziia a 3-a a masivului unidimensional a va avea loc astfel: a(1) a(2) a(3) a (4) a(5) 1 2 3 4 5 1 2 .F. 3 4 5 elementul nou apare aici acest element se pierde

34

Funcia opus lui AINS ( ) este funcia ADEL ( ), care terge un elemen, o linie sau o coloan a unui masiv. ADEL ( ) are sintaxa: ADEL ( < masiv >, <expN> [, 2 ] ) Funcia tergnd elementul <expN> al masivului, n cazul cnd acesta este unidimensional, sau linia sau coloana <expN> a masivului, cnd acesta este bidimensional. Parametrul 2, ca i la funcia anterioar, face distincia ntre tergerea unei linii ( absena acestui parametru) i tergerea unei coloane (prezena parametrului ). Dup tergere, celelalte elemente ale masivului sunt translatate, n vederea umplerii golului format, iar pe ultima poziie, ultimul element, ultima linie sau ultima coloan, eliberat prin translatare, se va introduce valoarea logic .F. Exemplu: DIMENSION a ( 5 ) FOR I = 1 TO 5 a(I)=I ENDFOR ? FOR I = 1 TO 5 ??a(I) ENDFOR ADEL ( 3 ) FOR I = 1 TO 5 ??a(I) dispare acest element ENDFOR a(1) a(2) a(3) a(4) a(5) 1 2 3 4 5 1 2 4 5 .F. Referirea la elementele unui masiv bidimensional se poate face n dou moduri: prin doi indici reprezentnd linia i coloana

35

elementului respectiv n cadrul masivului, sau printr-un singur indice, acesta reprezentnd poziia elementului n masiv, numerotarea masivului fcndu-se astfel: mai nti se numr elementele primei linii, dup care se trece a cea de-a doua linie i aa mai departe. Pentru a afla poziia unui element al unui masiv, cnd se cunoate linia i coloana pe care se afl acesta, vom folosi funcia AELEMENT ( ), care are urmtoarea sintax: AELEMENT ( <masiv> , <expN1> [ , <expN2> ] ) <masiv> desemneaz tabloul, masivul la care se refer funcia, iar <expN1> i <expN2> reprezint linia respectiv coloana elementului referit. Dac <exp2> lipsete, masivul este unidimensional, funcia returnnd valoarea <expN1>. Rezultatul funciei este de tip numeric. Unele funcii referitoare la masive manipuleaz elementele tablourilor bidimensionale printr-un singur indice, pentru aflarea acestuia folosindu-se funcia prezentat anterior. Funcia care realizeaz transformarea invers , deci de la un singur indice la doi indici, este funcia ASUBSCRIPT ( ) : ASUBSCRIPT ( <masiv>, <expN1>, <expN2> ) <masiv> reprezint tabloul la care se refer funcia, iar <expN1> reprezint poziia elementului n tablou, <expN2> este o expresie numeric ce determin tipul informaiei returnate de funcie: - linia elementului, cnd <expN2> are valoarea 1; - coloana elementului, n cazul valorii 2 a lui <expN2>. Exemplu: avnd un masiv bidimensional definit cu : DIMENSION a ( 4, 6 ) Urmtoarele referiri sunt echivalente: a ( 2,3 ), a ( 9 ), a ( AELEMENT ( a, 2, 3 )), a ( ASUBSCRIPT ( a, 9, 1 ), ASUBSCRIPT ( a, 9, 2 ))

36

Copierea elementelor unui masiv n elementele altui masiv se face cu ajutorul funciei ACOPY ( ): ACOPY ( <masiv1>, <masiv2>, [, <expN1> [, <expN2> [, <expN3>]]]) Funcia va determina copierea a <expN2> elemente ale masivului <masiv1> ncepnd de la al <expN1>-lea inclusiv, n elementele masivului<masiv2>, ncepnd de la poziia <expN3>. Observm c referirea la elementele masivului se face printr-un singur indice. Dac <expN1> lipsete, se presupune implicit valoarea 1 a acestei expresii. Pentru a copia toate elementele masivului <masiv1>, ncepnd de la al <expN1>-lea i pn la sfrit, n masivul <masiv2>, vom folosi valoarea -1 pentru expresia <expN2>. Cnd masivul <masiv2> nu exist, se creeaz unul nou, cu aceleai dimensiuni n care se copiaz coninutul masivului <masiv1>. Cutarea unei expresii ntr-un masiv se face prin funcia ASCAN ( ) cu sintaxa: ASCAN ( <masiv>, <expr>, [ expN2]]) n care <masiv> desemneaz tabloul n care se caut expresia <expr>. Funcia returneaz poziia elementului n care s-a gsit aceast expresie, n caz de reuit, sau valoarea 0, cnd cutarea nu s-a ncheiat cu succes. Funcia ASORT ( ) sorteaz elementele masivului <masiv> n ordine cresctoare sau descresctoare. Toate elementele sortate trebuie s fie de acelai tip, pentru a se putea compara ntre ele. ASORT ( <masiv> [, ,expN1 [, <expN2> [, <expN3>]]] ) Pentru masivele unidimensionale se vor sorta elementele acestuia, iar pentru cele bidimensionale se vor sorta liniile masivului respectiv, n sensul c, n funcie de rezultatul comparrii a dou elemente ale unor linii distincte , se vor schimba sau nu ntre ele

37

toate elementele acestor linii, fiecare element rmnnd pe coloana pe care a fost i nainte. Dac masivul este unidimensional <expN1> va determina elementul de unde se ncepe sortarea ( se vor srta elementele de la al <expN1>-lea ncolo). n cazul cnd avem un masiv bidimensional, prima linie care va intra la sortare va fi cea pe care se afl elementul al <expN1>-lea al masivului. De asemenea, <expN1> determin i coloana de pe care se iau elementele de comparat, pentru a stabili ordinea liniilor. Exemplu: Dac avem masivul a (3,4 ), iar <expN1> este 7, avem situaia: a ( 1,1 ) a ( 1,2 ) a ( 1,3 ) a ( 1,4 ) a ( 2,1 ) a ( 2,2 ) a ( 2,3 ) a ( 2,4 ) a ( 3,1 ) a ( 3,2 ) a ( 3,3 ) a ( 3,4 ) Elementul al 7-lea este a (2,3), deci se vor sorta liniile 2 i 3 ale masivului, compararea acestora fcndu-se prin a (2,3 ) i a (3,3 ) (deci elementele de pe coloana a 3-a ). -<expN2> specific numrul elementelor sortate, n cazul unui masiv unidimensional, sau numrul liniilor de sortat, pentru un masiv bidimensional. Dac valoarea lui <expN2> este -1 sau dac aceast espresie lipsete, se vor sorta elementele, liniile, pn la sfritul masivului ( ultimul element, respectiv ultime linie ). -<expN3> determin ordinea sortrii: -cresctoare, dac <expN3> lipsete sau dac acest expresie are valoarea 0; -descresctoare pentru o valoare diferit de 0 a expresiei <expN3>. Rezultatul funciei este de tip numeric.

Tipuri de date i funcii standard


Datele cu care lucreaz FoxPro sunt de tip numeric, caracter, data calendaristic, logic. Asupra acestor tipuri de date s-au definit

38

operaii specifice i au fost realizate funcii standard dintre care cele mai des folosite vor fi explicate n continuare. Funcii uzuale asupra tuturor tipurilor de date: MAX (<e1>,<e2>) MIN (<e1>,<e2>) TYPE(<eC>) IIF(<eL>,<e1>,<e2> ) calculeaz maximul dintre dou valori <e1> i <e2> calculeaz minimul dintre dou valori <e1> i <e2> ntoarce litera corespunztoare tipului de dat. ntoarce <e1> dac <eL> este adevrat i <e2>n caz contrar

Tipul numeric
O mare parte a datelor prelucrate de calculator este reprezentat de numere, pentru a cror descriere se folosete tipul numeric. Cu toate c limbajul FoxPro este un limbaj orientat pe lucrul cu baze de date i nu unul orientat pe calcule matematice, tiinifice, tipul numeric este imlementat astfel ct s permit realizarea majoritii operaiilor matematice ntlnite n practic. De asemenea, sunt prevzute o serie de funcii matematice prin care se pot calcula funciile matematice elementare. Operanzii numerici care intervin n expresii pot fi: - cmpuri numerice ale unei baze de date; - funcii care returneaz valori numerice; - variabile de tip numeric; - constante numerice. Operatori care se aplic unor operanzi numerici, avnd ca rezultate tot valori numerice sunt : **, ^ (ridicarea la putere), * ( nmulire), / (mprire), % (modulo, restul mpririi), + (adunare), - scdere. ntre dou expresii numerice se pot aplica, de asemenea, operatori relaionali, obinndu-se expresii logice. Funciile standard uzuale:

39

ABS (<eN>) SQRT (<eN>) ROUND (<eN1>,<eN2>) MOD (<eN1>,<eN2>) INT (<eN>) CEILING (<eN>) FLOOR (<eN>) SIGN (<eN>)

calculeaz valoarea absolut din <eN> calculeaz radical din <eN> (strict pozitiv) <eN1> este rotunjit la zecimala dat de <eN2> calculeaz restul mpririi ntregi a lui <eN1> la <eN2> ntoarce un zecimalelor ntreg rezultat prin trunchierea

ntoarce cel mai mic ntreg mai mare sau egal cu argumentul <eN> ntoarce cel mai mare ntreg mai mic sau egal cu argumentul <eN> ntoarce valoarea 1 pentru argument negativ, 1 pentru argument pozitiv i 0 pentru argument nul.

RAND ()

returneaz un numr aleator n intervalul (0, 1)

conversia ntre tipul numeric i tipul ir: <eN1> este numrul, <eN2> este lungimea, <eN3> numrul de STR (<eN1>[,<eN2> poziii pe care se va face reprezentarea prii [,<eN3>]]) zecimale. Exemplu: ? MOD ( 38, 6 ) 2 ? MOD ( 44,44 , 11,11 ) 0

40

Observaie: Lista funciilor standard cuprinde i funcii trigonometrice, logaritmi, radical, funcia exponenial, pe care le vom prezenta n anex. Fixarea numrului de zecimale pentru afiarea numerelor se poate face cu comanda SET DECIMALS: SET DECIMAL TO <nr> Exemplu: ?2/3 0, 67 SET DECIMAL TO 4 ?2/3 0 , 6667 Exemple cu funcii: ? ABS ( a ) 400 ? SIGN ( - 32 ) -1 a= -2/3 ? a = SIGN ( a ) * ABS ( a ) .T. ? INT ( 14 . 46 ) 14 ? INT ( - 2 . 25 ) -2 a = 14 . 46 ? a INT ( a ) 0 . 46 a = - 2 . 25 ? a INT ( a ) - 0 . 25 ? CEILING ( 8 . 32 ) 9 ? CEILING ( -4 . 23 ) -4 ? FLOOR ( 8 . 32 ) 8

41

? FLOOR ( - 4 . 23 ) -5 ? EXP ( 2 ) 7 . 39 ? LOG ( 2 ) 0 . 69 ? LOG 10 ( 2 ) 1 . 00 ? EXP ( LOG ( 3 ) ) 3 . 00 ? SQRT ( 2 ) 1 . 41

42

Funciile financiare: ntre funciile matematice, o categorie aparte o formeaz funciile FV(.,.,.), PV(.,.,.) i PAYMENT(.,.,.) numite funcii financiare. n termeni economici funcia FV(.,.,.) calculeaz valoarea de viitor a unei investiii (Future Value) iar funcia PV(.,.,.) calculeaz valoarea prezentat a unei investiii (Prezent Value). Detaliind: 1) FV(<expN1>, <expN2>, <expN3>) calculeaz valoarea viitoare a unei depuneri regulate cu o cretere constant n cadrul unei investiii, cu o dobnd fix pe o perioad dat. Parametrii: <expN1> este depunerea, <expN2> este dobnda, <expN3> este perioada sau numrul de depuneri. 2) PV (<expN1>,<expN2>,<expN3>) calculeaz valoarea la zi a unei investiii constituite printr-un vrsmnt regulat cu o sum constant, de-a lungul unui numr de perioade date i cnd se practic o dobnd fixat. Parametrii funciei: <expN1> este suma pltit, <expN2> este dobnda, <expN3> este durata. 3) PAYMENT (<expN1>,<expN2>,<expN3>) calculeaz mrimea rambursrilor constante efectuate la intervale regulate care permit amortizarea unei sume, cu dobnd constant, pe un numr dat de perioade. Parametrii: <expN1> este mrimea sumei cheltuite, <expN2> este taxa sau dobnda, <expN3> este numrul de rambursri. Tipul ir de caractere Un ir de caractere reprezint o mulime ordonat de caractere care se trateaz ca un tot unitar. ntr-un ir de caractere ordinea acestora fiind esenial, fiecrui caracter I se poate asocia un numr reprezentnd poziia aceastuia n cadrul irului.

43

Numrul caracterelor dintr-un ir reprezint lungimea irului. Un subir al irului dat repreuint o poriune din ir, ncepnd de la o poziie specificat i de lungimea dat Constantele de tip ir de caractere se specific prin mulimea caracterelor care le compun, ncadrate ntre apostrofuri simple sau duble ( la ambele capete trebuie s fie acelai tip de apostrof ). Pentru a include unul dintre cele dou delimitatoare ntr-un ir de caractere, mulimea caracterelor ce alctuiesc irul va fi ncadrat ntre delimitatorul de cellalt tip dect cel din ir. Dac lungimea irului este 0 obinem irul vid sau nul, care se specific prin dou apostrofuri consecutive fr spaii sau alte caractere ntre ele. Datele de tip ir de caractere pot avea lungimea maxim 255 caractere ASCII i se reprezint intern cte un caracter pe octet n binar. Operaii asupra datelor de tip ir: - concatenarea a dou iruri se realizeaz prin operatorii de concatenare (+, -); (+) realizeaz concatenarea a dou iruri; Exemplu: strada _ + George _ Cobuc Dup evaluare, va avea valoarea: strada _ George _ Cobuc Operatorul (-) realizeaz concatenarea termenilor cu mutarea spaiilor de la sfritul primului ir la sfritul irului rezultat. Exemplu: Salut - prieteni ! Dup evaluare, vom obine irul de caractere Salut prieteni ! se observ c blancurile de la nceputul irului al doilea i pstreaz poziia n ir. - testarea apartenenei unui ir la un alt ir este realizat prin operatorul ($); poate fi folosit n expresii logice. De exemplu, expresia: calcul $ calculator este adevrat, pe cnd expresia: calcule $ calculator va fi evaluat la valoarea logic fals.

44

Compararea irurilor de caractere de lungimi diferite este controlat de comanda : SET EXACT ON / OFF n starea ON irurile se compar de pe toat lungimea lor (cu excepia spaiilor de la sfritul irului). n starea OFF se ia lungimea cea mai scurt i, dac pe aceeai lungime irurile sunt egale, rezultatul este .T.. Funcii uzuale asupra irurilor SUBSTR <eN1>,<eN2>) LEFT (<eC>, <eN>) RIGHT (<eC>, <eN>) LEN (<eC>) REPLICATE (<eC>, <eN>) SPACE (<eN>) LTRIM (<eC>) RTRIM (<eC>)/ TRIM (<eC>) AT (<eC1>, <eC2>) ISALPHA (<eC>) ISLOWER (<eC>) ISUPPER (<eC>) LOWER (<eC>) UPPER (expC) (<eC>, extrage un subir din irul <eC> ncepnd cu caracterul de pe poziia <eN1> pe lungime <eN2> extrage primele <eN> caractere din irul <eC> extrage ultimele <eN> caractere din irul <eC> ntoarce lungimea irului <eC> ntoarce un ir avnd <eC> multiplicat de <eN> ori ntoarce un ir de <eN> spaii elimin spaiile de la stnga irului <eC> ex.: LTRIM(MIA)=MIA elimin spaiile de la dreapta irului <eC> ex.: RTRIM(MAI)=MAI ntoarce poziiile irului <eC1> n <eC2> testeaz dac irul ncepe cu o liter testeaz dac irul ncepe cu minuscul testeaz dac irul ncepe cu majuscul transform irul n minuscule transform irul n majuscule

45

nlocuiete n <eC1> ncepnd cu poziia STUFF (<eC1>, <eN1>, <eN2>, <eN1> un subir de lungime <eN2> prin <eC2>) irul <eC2> CTOD (<eC>) realizeaz conversia unui ir la data calendaristic realizeaz conversia unui ir la numr

VAL (<eC>) Exemple: ? CHR ( 49 ) 1 ? CHR ( 65 ) == A .T. ? ASC ( A ) 65 ? ASC ( a ) = ASC ( alfa ) .T. ? A == CHR ( ASC ( A ) ) .T. ? 65 == ASC ( CHR ) 65 ) ) .T. ? SUBSTR ( ABCDEF , 2, 3 ) BCD ? SUBSTR ( Ziua Bun , 6 ) Bun ? LEFT ( La muli ani ! , 2 ) La ? RIGHT ( Noapte bun ! , 6 ) bun ! ? REPLICATE ( a , 5 ) a a a a a ? REPLICATE ( , 6 ) == SPACE ( 6 ) .T. ? ALLTRIM ( GAMA ) == GAMA .T. ? M numesc + RTRIM ( Ionescu ) + Daniel M numesc Ionescu Daniel

46

? i am + LTRIM ( 24 ) + ani. i am 24 ani ? AT ( nr. , Strada George Cobuc, nr. 63 64 ) 22 ? LEN ( Salutri ! ) 10 ? LEN ( Strada George Cobuc + nr. 150 ) 27 a = ALFA b = alfa ? UPPER ( a ) == UPPER ( b ) .T. ? LOWER ( a ) == LOWER ( b ) .T. STORE pala TO ir ir = STUFF ( ir , 3 , 0 , rale ) ? ir paralela ir = STUFF ( ir , 3 , 3 , sar ) ? ir pasarela ir = STUFF ( ir , 7 , 2 , ) ? ir pasare

Tipul dat calendaristic Datele calendaristice pot fi reprezentate n mai multe formate avnd ca delimitator acolada. Forma de prezentare a unei date calendaristice depinde de comanda SET DATE: SET DATE [TO] <format>

47

unde <format> poate fi: AMERICAN / GERMAN / ANSI / ITALIAN / DMY /BRITISH /JAPAN /FRENCH /USA /MDY /YMD Formatul AMERICAN prezint data calendaristic sub forma: ll/zz/aa.; formatul GERMAN sub forma zz.ll.aa., etc. Includerea secolului n formatul de dat este determinat de starea comutatorului SET CENTURY ON/OFF. Implicit este OFF. Indicarea semnului folosit ca separator al informaiilor de tip dat calendaristic este dat de comanda SET MARK. Implicit separatorul este dat de formatul de reprezentare. De exemplu formatul AMERICAN folosete ca separator /. SET DATE TO <car> unde <car> reprezint un singur caracter ce va fi folosit ca separator al informaiilor din data calendaristic. Operaii care se pot face cu datele calendaristice sunt: - compararea a dou date se realizeaz prin operatorii relaionali: - diferena dintre dou date calendaristice d un numr de zile: - adunarea unui numr de zile la o dat calendaristic d o alt dat: - scderea unui numr dintr-o dat calendaristic d tot o dat; Funciile referitoare la date calendaristice sunt : DATE() DAY (<eD>) MONTH(<eD>) ntoarce data curent de la sistem extrage nr. zilei din dat extrage nr. lunii din dat

48

CMONTH(<eD>) YEAR(<eD>) TIME() DTOS(<eD>) DMY(<eD>) MDY(<eD>) DTOC(<eD>)

ntoarce numele lunii extrage anul din data calendaristic extrage ora sistem sub forma irului HH:MM:SS ntoarce data sub forma secol an lun zi ntoarce data sub forma zi nume-lun an ntoarce data sub forma nume lun zi an conversie data la ir

Exemple: ? DATE ( ) 11 / 12 / 2000 ? CDOW ( DATE ( ) ) Saturday ? DOW ( {10 / 02 / 1864} ) 1 ? DAY ( {03 / 14 / 1990} ) 14 ? MONTH ( DATE ( ) ) 3 ? CMONTH ( {03 / 25 / 1990} ) March

Operaii elementare asupra bazelor de date


Crearea i manipularea structurii conceptuale Definirea structurii conceptuale a bazei de date este o operaie foarte important, de care poate depinde ntregul proiect al aplicaiei.

49

Proiectarea structurii logice pornete de la IEIRI, adic de la cererile de informaii, de la rezultatele pe care aplicaia informatic trebuie s le furnizeze decidenilor. Dup inventarierea tuturor cererilor de informaii se determin INTRRILE adic datele care pot fi reinute ntr-o baz de date. n general, se evit modificarea structurii conceptuale; de aceea administratorul bazei de date, cel care face proiectarea structurii, trebuie s analizeze nu numai cererile prezente de informaii, pe care aplicaia informatic trebuie s le ofere, ct i cererile posibile n viitor sau solicitate accidental. Structura conceptual este ansamblul cmpurilor cu denumirea, lungimea i tipul lor, precum i ordinea de definire a acestor cmpuri. Crearea structurii se realizeaz cu comanda CREATE CREATE <fis.dbf> Comanda CREATE permite deschiderea unui ecran de proiectare a structurii bazei de date i, prin dialog cu utilizatorul, definete structura unei baze de date: numele fiecrui cmp, tipul, lungimea sa, numrul de zecimale i dac respectivul cmp va fi cheie de indexare ntr-un fiier multiindex asociat bazei de date. Utilizatorul poate introduce date imediat dup salvarea structurii rspunznd afirmativ la ntrebarea sistemului: input data records now?(y/n) La un rspuns Y se deschide ecranul de introducere a datelor (un ecran standard) n care apare pe linii cmpurile din structur cu numele lor i, alturat, o zon invers video cu lungimea egal cu a cmpului a crei valoare o va cuprinde. Observaie: Dac se iese accidental din ecranul de introducere i mai sunt articole de adugat, se poate folosi comanda APPEND. Exemplu: creerea bazei de date mijloacef.dbf, memorand starea mijloacelor fixe ale unei unitati economice, cu structura: COD character 10 codul mijlocului fix

50

DENUMIRE VALOARE AMORTIZARE amortizata LOC_FOLOS folosinta STARE folosinta .T. , nefolosit .F.) DATA_INST instalarii, puneriin functionare se realizeaza cu comanda:

character numeric numeric memo logical date

30 10 10 10 1 8

denumirea valoarea valoarea locul starea data de (n

CREATE TABLE mijloacef; ( cod C (10), denumirea C (30), valoare N(10), amortizare N(10),; loc_folos M, stare L, data_inst D ) Deschiderea i nchiderea bazei de date Orice operaie, cu excepia creerii bazei de date, presupune deschiderea acesteia iar dup terminarea activitii asupra datelor respective bazele de date trebuiesc nchise. Comanda de deschidere a bazei de date este USE: USE<fis.dbf> Comanda USE deschide baza de date de nume specificat nchiznd, eventual, o alt baz de date dac este deschis. Extensia este implicit. Comanda de nchidere a bazei de date deschis anterior este: USE Exemplu. use mijloacef && s-a deschis baza de date mijloacef use produse && s-a nchis baza mijloacef i s-a deschis baza produse use && s-a nchis baza de date produse

51

Zone de lucru Sunt multe aplicaii care necesit accesul simultan la mai multe baze de date. Pentru aceste situaii se folosesc zone distincte de memorie numite zone de lucru. ntr-o zon de lucru se poate deschide o singur baz de date. n diferite variante ale pachetului de programe dBASE numrul de zone variaz: -in dBASE 4 sunt 10 zone de lucru identificate prin numere de la 1 la 10 sau literele A-J, -n FoxPro sunt 25 zone de lucru identificate cu numerele 1-25 sau cu literele alfaberului A-J (pentru primele 10) i W11-W25 (pentru zonele 11-25). Indicarea zonei de lucru unde se vor desfura urmtoarele operaii se face prin: SELECT <zona> / <nume-alias> Comanda funcioneaz ca un comutator pe zona dat prin construcia <zona> (ce poate fi numr sau liter asociat zonei de lucru) sau prin construcia <nume-alias> care este o prescurtare a numelui de fiier deschis n zon. Deschiderea unei baze de date ntr-o zon se poate face prin comanda USE cu o clauz nou, clauzan <zona>. Tot prin comanda USE se poate asocia i un alias (un pseudonim, o prescurtare) n vederea unei referiri mai clare att a cmpurilor ct i a zonei n care s-a deschis fiierul. USE <fis.dbf>n <zona> [ALIAS <nume-alias>] Calificarea cmpurilor: Atunci cnd sunt deschise mai multe fiiere, referirea la cmpurile lor se poate face printr-o construcie de forma: <zona>/<nume-alias> <separator> <nume-cmp>, unde <zona> este litera asociat zonei unde s-a deschis fiierul; <separator> este format din semnele -> (minus i mai mare). Exemplu: A->nume 0

52

Comenzile de poziionare ca i funciile asupra bazelor de date pot avea referire direct n zona cercetat. Astfel clauzan poate completa comenzile: GOTO/GO/GO TOP/GO BOTTOM in <zona> SKIP [+/-]<n>n <zona> Aliasul fiierului poate s apar i n funciile care lucreaz asupra fiierelor: 1) EOF(<zona>) && testeaz sfritul de fiier din zona <zona> 2) BOF(<zona>) && testeaz poziia naintea primului articol && din zona <zona> 3) RECNO(<zona> && d numrul articolului curent din fiierul && deschis n zona <zona>

Funcii necesare:
SELECT () && d primul numr de zon liber de folosit. Observaie important: Zonele de lucru sunt izolate; modificarea pointerului de nregistrare ca urmare a unei aciuni ntr-o baz de date nu poate determina modificarea pointerului unei alteia, deschis n alt zon de lucru. Fac excepie de la aceast regul fiierele nlnuite cu SET RELATION. Exemplu: ? SELECT ( ) && afiseaza zona de lucru curenta 1 USE mijloacef NOTE s-a deschis baza de date mijloacefn zona de lucru 1 USE && s-a inchis baza de date USE mijloacef n 2

53

NOTE s-a deschis baza de daten zona de lucru 2, chiar daca zona curenta; de lucru a fost si va ramane 1 USEn 2 && se inchide baza de date din 2 Observaie: n FoxPro o aceeai baz de date se poate deschide n zone diferite folosind n acest scop clauza AGAIN n comanda de deschidere. Exemplu: SELECT a USE mijloacef n 1 USE mijloacef AGAIN ? USED ( ) && testeaza folosirea zonei de lucru 1 .T. ? USED (2 ) && testeaza folosirea zonei de lucru 2 .F. ? USED ( mijloacef ) NOTE testeaza daca exista baza de date cu aliasul mijloacef; intr-o zona de lucru .T. USE USEn 1 Modificarea structurii bazei de date Comanda MODIFY STRUCTURE permite modificarea structurii unei baze de date. MODIFY STRUCTURE Comanda permite accesul utilizatorului la structura bazei de date active deschis n acel moment n zona de lucru. Utilizatorul poate terge, aduga, sau insera cmpuri, poate modifica lungimea, sau tipul unor cmpuri. Datele existente se vor copia n noua

54

structur prin verificarea numelui de cmp din cele dou structuri. Dac coincid, datele se vor trece pe noua structur fcndu-se conversia, acolo unde este posibil, la noul tip de cmp. Atenie! Dac am schimbat lungimea cmpului s-ar putea ca valorile existente n structura anterioar s nu ncap i, dac se va face trunchiere, la numere se vor pierde valori (apar stelue!). Dac mpreun cu adugarea unor cmpuri se va face i schimbarea numelui unor cmpuri, se vor pierde date. Afiarea structurii LIST/DISPLAY STRUCTURE [TO PRINTER/TO FILE <fis.txt>] Comenzile LIST i DISPLAY sunt asemntoare, cu deosebirea c DISPLAY face o pauz la umplerea unui ecran. Afiarea structurii poate fi direcionat la imprimant sau ntr-un fiier text. Exemplu: SELECT a USE mijloacef LIST STRUCTURE Structure for database: C:\FOXPRO\MIJLOACAF.DBF Number of data records: 6 Date of last update: 02/22/95 Field Field Name Type Width Dec Index 1 COD Character 10 Y 2 DENUMIRE Character 30 N 3 VALOARE Numeric 10 0 N 4 AMORTIZARE Numeric 10 0 N 5 LOC_FOLOS Memo 10 N 6 STARE Logical 1 N 7 DATA_INST Date 8 N 8 Tip Character 1 N ** Total ** 81

55

Duplicarea structurii conceptuale: COPY STRUCTURE TO <fis.dbf> [FIELDS<listacamp>] Comanda permite crearea unei noi baze de date numit <fis.dbf> pornind de la baza de date activ, prin preluarea tuturor cmpurilor (dac lipsete clauza FIELDS) sau a anumitor cmpuri enumerate n clauza FIELDS. Exemplu: din baza de date mijloacef se creaza o noua baza de date, mijloacaf_n,n care vom copia doar campurile COD, DENUMIRE si VALOARE: select a use mijloacef && se deschide baza de date mijloacef copy structure to mijloacef_n fields cod, denumire, valoare use mijloacef_n list structure Structure for database: C:\FOXPRO\MIJLOACAF.DBF Number of data records: 6 Date of last update: 02/22/95 Field Field Name Type Width Dec Index 1 COD Character 10 Y 2 DENUMIRE Character 30 N 3 VALOARE Numeric 10 0 N ** Total ** 51 Exist nc o modalitate de a crea structura unei baze de date: CREATE TABLE care permite specificarea direct, n comand, a structurii. Are formatul: CREATE TABLE<fis.dbf> (<lista-definiii>) unde <lista-definiii>:=<nume-cmp> <tip>[([<lungime>], <zecimale>])] Construcia <tip> este una din literele asociate tipurilor de date.

56

Funcii standard relativ la structura bazei de date: 1) FIELD(<expn>) ntoarce numele cmpului din baza de date activ care are numrul de ordine <expn>; 2) RECSIZE() ntoarce dimensiunea n octei a structurii bazei de date active; 3) TYPE(<cmp>) ntoarce tipul unui cmp precizat ca ir de caractere; 4) FLDCOUNT() ntoarce numrul de cmpuri din structura bazei de date. Exemple: use mijloacef && deschidere fiier mijloacef.dbf ?field(1) && se afieaz numele primului cmp COD ?field(6) && se afieaz numele celui de-al 6-lea cmp STARE ?field(15) && dac numrul dat ca parametru depete numrul de && cmpuri din structur, funcia ntoarce irul vid ?field(15)= && testm dac rezultatul ntors de funcie este irul vid .T. ?field(15)= && irul vid este diferit de caracterul spaiu .F. use mijloacaf_N ?recsize() 51 && se observ afiarea dimensiunii articolului ?type(denumire) C && cmpul nume are tipul caracter use mijloacef ?fldcount() && fiierul mijloacef are n structur 8 cmpuri .8. use mijloacef_n ?fldcount() && fiierul PROBE are 3 cmpuri 3

57

Structura fizic a unei baze de date cuprinde ansamblul valorilor cmpurilor grupate n nregistrri sau articole. Articolele se depun n tabel sau baz de date unul n continuarea celuilalt i fiecare poart o informaie (un numr), ce se asociaz automat la introducerea valorilor articolului n fiier. Numerele sunt n secven strict cresctoare, determinnd poziia fizic a articolului n fiier. Numrul de articol permite regsirea rapid a nregistrrii. n fiecare moment al prelucrrii unui fiier se pstreaz numrul articolului prelucrat (articolul curent) n pointerul de fiier sau indicatorul de nregistrare. Fiierul are un marcator de nceput i un marcator de sfrit, ntre care se poate opera cu nregistrrile utilizator. Cteva funcii necesare prelucrrii articolelor: a) RECNO () && ntoarce numrul articolului curent b) EOF () && ntoarce .T. dac n urma prelucrrilor s-a ajuns && la sfritul de fiier i .F. n caz contrar. c) BOF () && ntoarce .T. dac n urma prelucrrilor s-a ajuns && naintea primului articol cu date i .F. n caz contrar. d) RECCOUNT () && ntoarce numrul de articole din baza de date Selectarea articolelor Prelucrrile asupra unei baze de date (afiri, copieri, tergeri, modificri etc.) pot fi realizate pe toate articolele bazei sau pe o parte a acestora. Operaia de selectare a articolelor care vor fi prelucrate poate fi indicat chiar n comanda de prelucrare prin clauzele de selectare. <domeniu>, FOR <COND> WHILE <COND>

Clauza <domeniu> poate fi nlocuit cu urmtoarele cuvinte cheie: ALL: sunt selectate roate articolele fiierului,

58

NEXT <n> sunt selectate urmtoarele <n> articole fa de articolul curent; REST: sunt selectate toate articolele pn la sfritul fiierului ncepnd cu articolul pe care am fost poziionai anterior acestei comenzi; RECORD <n>semnific articolul cu numrul <n>. Clauza FOR <cond> permite selectarea articolelor care verific condiia indicat prin construcia <cond>, implicit sau prin testarea acesteia pe ntreg domeniul precizat n comand. Clauza WHILE <cond> selecteaz articolele care verific condiia dat; aceast verificare nceteaz atunci cnd se gsete primul articol care d ca rezultat al condiiei valoarea .F. (fals). Adaugarea de inregistrri la o baza de date Completarea cu valori a articolelor bazei de date se poate face imediat cu proiectarea structurii conceptuale, prin rspunsul y la mesajul sistem afiat sau ulterior, prin comanda APPEND. APPEND Comanda APPEND este o comand (mod ecran) care permite introducerea datelor de la tastatur. Standard, acest ecran prezint pe o linie cte un cmp cu numele lui i, n continuare, marcat invers-video, zona de introducere. Utilizatorul va introduce valorile articolului, cmp dup cmp i va trece automat la completarea articolului urmtor odat cu terminarea completrii ultimului cmp. Observaii: Completarea cmpurilor memo se face prin apsarea simultan a tastelor <ctrl><home>. Se deschide o fereastr de editare unde se poate introduce textul asociat cmpului memo, iar la sfritul editrii se apas pe tastele <ctrl><end> (salvare) sau <esc> (abandon).

59

Datele introduse n zonele invers-video trebuie s aparin tipului declarat la definirea structurii pentru cmpul respectiv. Se verific de asemenea i ncadrarea valorii cmpului n lungimea declarat. Semnalizarea cazurilor de eroare se face, de regul, sonor. Exist o comand comutator SET BELL ON/OFF care determin emiterea semnalului sonor de avertizare (ON) sau inhib aceast semnalizare (OFF). Comanda comutator SET CONFIRM ON/OFF ateapt confirmarea introducerii valorilor ntr-un cmp prin tasta <enter> (ON) sau trecerea automat la completarea valorilor cmpului urmtor imediat ce dimensiunea unui cmp a fost depit (OFF). Implicit este pe OFF. Verificarea apartenenei la tipul dat calendaristic se face n funcie de setarea existent. Comanda SET DATE d posibilitatea setrii n sesiunea curent a formatului de dat. Peste tot unde se lucreaz cu date calendaristice ele vor fi vzute n formatul respectiv. Deci dac a fost introdus anterior o comand SET DATE BRITISH (zz/ll/aa) se va verifica condiia ca primele 2 cifre s fie ncadrate n intervalul 1..31, urmtoarele cifre ntre 1..12. Alta va fi validarea aceleiai valori introduse n cmp dac anterior era setarea n format american (ll/zz/aa). O facilitate la introducerea interactiv a datelor este oferit de comanda SET CARRY ON/OFF. Atunci cnd introducem seturi de date grupate, unele informaii se vor repeta la mai multe articole. De exemplu la toate facturile unui partener, numele, adresa, codul fiscal al partenerului sunt aceleai i totui aceste date trebuiesc trebute n fiecare articol. SET CARRY ON copiaz n articolul curent valorile articolului precedent. Implicit, cumprtorul este pe valoarea OFF; n aceast situaie fiecare nou articol va avea cmpurile vide. Un cmp este vid dac are spaii (caracter), zero (numeric), .F. (logic) sau {//} (dat calendaristic).

60

Vizualizarea coninutului unei baze de date Afiarea informaiilor coninute ntr-o baz de date este esenial pentru utilizator. O modalitate de afiare este oferit de comenzile DISPLAY i LIST LIST/DISPLAY[<listaexpr>][<domeniu>][FOR<cond>] [WHILE<cond>][TO PRINTER/TO FILE <fis.txt>] [OFF] n absena oricrei clauze, comanda LIST va afia ntreaga baz de date, iar DISPLAY doar un singur articol: cel pe care ne-am poziionat ca urmare a unor manevre anterioare. Clauzele <domeniu>, FOR, WHILE permit selectarea articolelor ce vor fi afiate. Clauza <list-exp> enumr fie cmpurile, fie expresii care se vor afia cu aceste cmpuri. n lipsa acestei clauze se vor afia toate cmpurile. Clauzele TO PRINTER permite trimiterea coninutului fiierului la imprimant iar TO FILE <fis.txt> permite trimiterea coninutului bazei de date ntr-un fiier text. Clauza OFF inhib afiarea numrului de articol dinaintea primului cmp. Afiarea cmpurilor memo se va face numai dac n <listaexpr> figureaz denumirea lor. Exemplu: use student studeni list # 1 2 3 4 5 cods 1 2 3 4 5 && presupunem un fiier cu date despre && list are domeniul implicit ALL numes Mihai Andrei Boila Adela Albu Andrei Fratean Doina Suceava Dana grupa 1 1 1 2 3 anul 1 1 2 1 2 numec info mate info engleza chineza

61

Exemplu: USE mijloacef DISPLAY FIELDS cod, denumire, valoare NOTE se afiseaza doar campurile din lista DISPLAY ALL FOR stare=.T. NOTE se afiseaza doar mijloacele fixen folosinta USE Observaie: Afiarea afirii numelor de cmpuri n comenzile LIST/DISPLAY este reglementat de comanda SET HEADING ON/OFF. Implicit comanda este pe valoarea OFF. Exemplu: USE mijloacef SET HEADING ON LIST && se afiseaza cu antet SET HEADING OFF LIST && se afiseaza fara antet USE

Cutarea inregistrarilor intr-o baza dedate Poziionarea ntr-o baz de date se poate face i prin cutarea unui anumit articol care ndeplinete o condiie. Sunt mai multe posibiliti de acces rapid la o baz de date ordonat (indexat) sau nu. Vom prezenta cteva comenzi i funcii pentru baze neordonate. Comanda de cutare secvenial LOCATE: LOCATE FOR <COND> [<domeniu>] Se caut primul articol care ndeplinete condiia <cond> i, dac se gsete indicatorul de nregistrare, se poziioneaz pe articolul respectiv. Dac nu se gsete nici un articol care s verifice condiia, pointerul de fiier va indica sfritul fiierului sau domeniului indicat prin clauza <domeniu>.

62

Funcii de testare a succesului sau insuccesului cutrii cu LOCATE sunt: 1. FOUND () 2. EOF () && ntoarce .T. dac articolul a fost gsit && ntoarce .F. dac articolul a fost gsit

Atenie! Nu se poate folosi funcia EOF() dac <domeniu> este diferit de ALL. Comanda de continuare a cutrii urmtorului articol cu aceeai cheie este. CONTINUE Comanda gsete urmtoarea nregistrare care respect condiia specific n ultima comand LOCATE aplicat asupra bazei de dateactive. Funcia de cutare i poziionare LOOKUP: LOOKUP ( <camp1), <exp>, <camp2> [,<expc>]) Funcia caut ntr-o baz de date prima apariie a unei expresii date. n caz de reuit indicatorul de nregistrare se poziioneaz pe nregistrarea cutat, funcia returnnd valoarea cmpului <cmp1>. Dac articolul nu se gsete, funcia returneaz irul vid; <cmp2> este cmpul a crei valoare este cercetat, <exp> este expresia de cutat. Exemplu: sa se gaseasca primele doua mijloace fixen folosinta din baza de date mijloacef: CLOSE ALL USE mijloacef LOCATE FOR stare=.t. ? FOUND ( ) .T. ? EOF ( ) .F.

63

? RECNO ( ) 1 CONTINUE ? FOUND ( ) .T. ? EOF ( ) .F. ? RECNO ( ) 3 USE Exemplu: sa se afiseze numele primului mijloc fix nefolosit din baza de date mijloacef. CLOSE ALL USE mijloacef LIST ? LOOKUP ( denumire, .F. , stare ) ?REXNO ( ) ??denumire 3 Autocamion M100 USE Comanda de salt i poziionare: GO [TO] <n>/TOP/BOTTOM Comanda GOTO <n> poziioneaz pe articolul cu numrul <n> n baza de date activ. GO TOP pe primul articol n baza de date activ, GO BOTTOM pe ultimul articol n baza de date activ. Exemplu: USE mijloacef GOTO 2 && inregistrarea curenta va fi 2 ? RECNO ( ) 2 GO RECORD RECNO ( ) + 1 NOTE pozitionarea pe inregistrarea urmatoare ( inregistrarea curenta + 1 ) DISPLAY NEXT 1 GO TOP &&pozitionare pe inregistrarea 1

64

? RECNO ( ) 1 GO BOTTOM && inregistrare

pozitionare

pe

ultima

? RECNO ( ) 4 USE Urmatoarele instructiuni sunt echivalente ( pentru o baza de date neindexata ): GO 1 GOTO 1 GO RECORD 1 GO TOP GO TOPn SELECT Comanda de avans i poziionare: SKIP [+/-] <n> Comanda face avansul (+) sau devansul (-) n baza de date peste <n> articole. Observaie: Deschiderea unei baze de date se face cu poziionarea pe primul articol. Exemplu: USE mijloacef ? RECNO ( ) 1 SKIP 2 DISPLAY RECORD RECNO ( ) SKIP 1 ?RECNO ( ) 2 USE Urmatoarele instructiuni sunt echivalente ( pentru o baza de date neindexata ): SKIP SKIP 1

65

SKIPn SELECT ( ) GO TO RECORD RECNO ( ) + 1 Duplicarea unei baze de date Una din operaiile frecvent folosite n aplicaiile economice este copierea ntregului coninut al unei baze de date, sau o parte din el, n alt fiier. Cu aceast ocazie se creeaz o nou baz de date care poate avea ca structur toate cmpurile din vechea baz de date, sau o parte din ele. Copierea (duplicarea) unei baze de date se poate realiza prin comanda: COPY TO <fis.dbf> [FIELDS <lista-cmp>] [<domeniu>] [FOR <conditie>][WHILE <conditie>] Se vor copia articolele bazei de date active ntr-o nou baz de date cu numele precizat n clauza TO <fis.dbf>. Clauza FIELDS enumer cmpurile care vor forma structura noii baze de date. Clauzele de selecie <domeniu>, FOR, WHILE permit preluarea parial a articolelor. Dac exist un fiier baz de date cu numele dat n clauza TO, se cere acordul de suprascriere. Exemplu: use mijloacef && obinem exact aceleai date n dou fiiere copy to manevra copy to manevra fields denumire for stare=.t. && se va crea o manevr cu mijloacele fixe existente

66

Actualizarea bazelor de date Punerea la zi a bazelor de date se face prin diferite operaii grupate de obicei n termenul de actualizare. Astfel, la o baz de date se pot aduga articole noi, se pot insera articole nainte sau dup o anumit nregistrare a bazei de date curente, se pot modifica valorile cmpurilor din baza de date, sau, n fine, se pot terge logic sau fizic articole. Adugarea articolelor: Completarea interactiv de date n continuarea celor existente ntr-o baz de date se poate face prin comanda APPEND pe care am discutat-o la operaia de ncrcare (vzut n termenii bazelor de date ca o adugare pe o structur vid). O alt posibilitate de adugare ntr-o baz de date este dat de comanda: APPEND BLANK La sfritul bazei de date activ se va aduga un articol vid urmnd ca ulterior acesta s fie completat cu valori potrivite. Reamintim c un cmp vid are una din valorile: zero pentru cmpul numeric, spaiu pentru cmpul caracter, .F. pentru cmpurile logice, valoarea {} sau {//} pentru dat calendaristic. Adugarea articolelor din alt baz de date se face prin comanda: APPEND FROM <fis.dbf> [FOR <cond>] Baza de date activ primete n continuarea articolelor sale nregistrrile din alt baz de date specificat n clauza FROM. n mod implicit se preiau toate cmpurile. Condiia dat n clauza FOR este testat dup plasarea articolului pe noua structur, aceasta fiind explicaia pentru care expresia logic <cond> trebuie s conin cmpuri ale bazei de date destinaie.

67

Exemplu: USE mijloacef APPEND BLANK articol vid Inserarea articolelor: De multe ori avem nevoie ca noile articole care trebuiesc trecute ntr-o baz de date s fie plasate fizic ntr-o anumit poziie, ntre articolele existente deja, sau naintea primului, etc. Comanda INSERT are urmtoarea sintax: INSERT [BLANK] [BEFORE] Comanda INSERT asigur deschiderea ecranului de introducere a datelor i permite operatorului trecerea direct a valorilor fiecrui cmp n parte (ca la comanda APPEND; se completeaz un singur articola care va fi plasat dup articolul curent). Clauza BEFORE permite ca articolul introdus de operator s se aranjeze naintea articolului curent. Clauza BLANK determin inserarea unui articol vid fr a deschide ecranul de introducere date. Inserarea articolului vid se va face dup (implicit) sau naintea articolului curent (dac este prezent clauza BEFORE). Exemplu: USE mijloacef_n GOTO 2 && se pozitioneaza indicatorul de inregistrari pe inregistrarea 2 INSERT BEFORE && se insereaza o noua inregistraren pozitia 2 USE && adugm un

68

Modificarea bazelor de date Activitatea de corectare a valorilor depuse n cmpuri la ncrcarea bazei de date se poate face interactiv sau prin comenziprogram. Interactiv, sistemul deschide un ecran de editare i utilizatorul intervine direct asupra datelor necesare a fi modificate (EDIT, CHANGE, BROWSE). Uneori cutarea direct a zonelor de corectat este inutil sau prea obositoare sau vrem ca utilizatorul s nu vad chiar tot; atunci se utilizeaz o comand de corectare mai puternic REPLACE. Comanda REPLACE are formatul general: REPLACE <cmp1> WITH <exp1> [<cmp2> WITH <exp2>] [domeniu] [FOR<cond>][WHILE <cond>] Comanda REPLACE permite nlocuirea valorii existente n cmpul <cmp1> cu valoarea expresiei <exp1>, a valorii existente n <cmp2> cu valoarea <exp2> .a.m.d. Corecia vechilor valori se face pe domeniul indicat n clauza <domeniu>, pentru acele articole din domeniu care verific condiiile din clauzele FOR i WHILE (dac exist). Domeniul implicit este articolul curent. Exemplu: la baza de date mijloacef se va adauga o noua inregistrare, cu urmatorul continut; COD: vopsea DENUMIRE: vopsean ulei, albastra .. secventa de comenzi care realizeaza acest lucru este: USE mijloacef APPEND BLANK REPLACE cod WITH vopsea denumire WITH vopsean ulei, albastra; .

69

LIST USE tergerea articolelor din baza de date Punerea la zi a bazei de date este de nerealizat fr posibilitatea tergerii articolelor care, fie au fost introduse eronat de operator, fie nu mai sunt valabile pentru colecia de date respectiv. De exemplu, ntr-o eviden BIBLIOTECA, necesar prelucrrilor curente relativ la cri i cititori, ce rost ar avea s reinem informaii despre crile pierdute, sau scoase din uz, sau informaii despre cititorii bibliotecii care i-au retras legitimaiile de intrare i nu mai au acces la bibliotec? Desigur, astfel de date sunt uneori interesante dar, s nu uitm c viteza de rspuns la interogri este direct dependent de mrimea fiierului. Pentru situaiile n care, eventual, cineva ar cere date despre crile sau persoanele care au fost n evidenele bibliotecii i nu mai sunt, se pot crea arhive (istorice), elibernd spaiul fiierelor de lucru. tergerea articolelor se poate face logic, folosind o marcare vizibil la afiare prin caracterul * naintea primului cmp. Marcarea pentru tergere poate fi anulat sau, dac s-a considerat oportun tergerea articolului, atunci acesta se poate terge fizic din baza de date. Comanda de marcare pentru tergere este DELETE: DELETE[<domeniu>][FOR<cond>] [WHILE<cond>] Comanda marcheaz pentru tergere articolele din domeniul precizat n clauza <domeniu> care ndeplinesc condiiile puse n clauzele FOR i WHILE. Implicit comanda acioneaz pe articolul curent. Exemplu : USE mijloacef CLEAR SET DELETED OFF

70

DELETE FOR MOD ( RECNO ( ), 2) = 0 NOTE se terg inregistrarile cu numr de ordine par LIST NOTE toate inregistrrile din baza de date sunt afiate, cele terse avand un asterisc; n dreptul lor GO TO 2 DISPLAY && nregistrarea este afiata chiar dac este marcat pentru tergere; Display avnd ca domeniu implicit inregistrarea curent USE Observaie: Starea de articol marcat pentru tergere nu influeneaz n mod obinuit nici comanda de afiare (observm * naintea primului cmp!), nici o eventual cutare prin LOCATE, o copiere (COPY), o sortare (SORT), etc. Acest lucru se datoreaz valorii OFF pe care este poziionat implicit comanda comutator SET DELETED ON/OFF. Valoarea ON determin ignorarea articolelor marcate pentru tergere. tergerea fizic a articolelor se poate face prin dou comenzi: PACK i ZAP. PACK ZAP

Comanda PACK permite tergerea fizic din fiier a tuturor articolelor marcate anterior. Nu mai este nici o posibilitate de recuperare a acestor date. Exemplu: se sterge inregistrarea a 5-a din baza de date mijloacef. USE mijloacef LIST DELETE RECORD 5 && se marcheaz pentru tergere a 5-a inregistrare PACK && se terge fizic a 5-a inregistrare LIST USE

71

Comanda ZAP permite tergerea definitiv din fiier a tuturor articolelor, fr ca n prealabil s fi avut loc o operaie de marcare. Este similar secvenei de comenzi: delete all pack Observaie: Trebuie s fim ateni la poziionarea comutatorului SET SAFETY ON/OFF care, pe valoarea ON cere acordul la tergere.

Anularea marcajelor de tergere se face prin comanda RECALL:


RECALL [<domeniu>] [FOR <cond>] [WHILE<cond>] Comanda RECALL permite revenirea unui articol la starea anterioar operaiei de tergere numai dac tergerea a fost logic (prin comanda DELETE). Aciunea comenzii are ca domeniu implicit articolul curent. Prin specificarea clauzelor [<domeniu>], FOR i WHILE putem selecta articolele terse prin comanda DELETE, a cror marcaje dorim s le anulm. Exemplu: USE mijloacef DELETE FOR RECNO ( ) <=3 && se terg primele 3 inregistrri LIST && se observ efectul tergerii RECALL ALL && sunt refcute nregistrrile. Cele care nu erau; marcate pentru tergere nu sunt afectate LIST USE

toate

72

Actualizarea interactiv a bazelor de date Actualizarea datelor din bazele de date se poate face direct de ctre utilizator prin intermediul ecranelor de actualizare EDIT i BROWSE, deschise la comenzile cu acelai nume. Prin intermediul acestor ecrane se pot vizualiza, introduce, edita i terge date. Comanda EDIT are formatul general:

EDIT / CHANGE [NOEDIT] <lista-cmp>]

[NOINIT] [NOAPPEND] [NOMENU] [NODELETE] <nr-articol>[FIELDS

[<domeniu>] [FOR <cond> ] [WHILE <cond>]


Comanda deschide ecranul EDIT afind nregistrarea cu numrul <nr-articol> a bazei de date active. Structura va cuprinde toate cmpurile dac lipsete clauza FIELDS sau cmpurile enumerate n <lista-cmp>. Dup efectuarea coreciilor asupra articolului curent, se trece automat la urmtorul articol. Se poate iei cu salvare <ctrl>w<> sau cu abandonare <ctrl><q>. Clauza FIELDS permite limitarea editrii numai la cmpurile enumerate; n lips se vor afia i manevra toate cmpurile din structur. Clauza NOINIT permite folosirea clauzelor unei comenzi EDIT anterioar fr a le mai specifica n comanda curent. Clauzele care urmeaz sunt folosite n program n vederea limitrii aciunii unui utilizator oarecare la o baz de date. Astfel, clauza NOAPPEND interzice adugarea de noi articole n fiier; n lipsa clauzei, acest lucru este posibil. NOMENU nu afieaz linia de meniuri i mpiedic accesul la meniuri. NODELETE mpiedic tergerea accidental de articole. Cu NOEDIT articolele sunt doar afiate, se interzice editarea lor. Exemplul : avnd baza de date mijloacef, vom deschide o ferestr de editare n care vom afia doar cmpurile COD, VECHIME, STARE. Primul i ultimul sunt cmpuri simple ale bazei de date, VECHIME

73

fiind un cmp calculat n funcie de data instalrii ( cmpul DATA_INST din baza de date ) i data curent. Exemplul: CLOSE ALL USE mijloacef CHANGE FIELDS cod:R, stare NOTE se afiseaza cmpurile cod si stare, dar se poate modifica doar cmpul stare USE Comanda BROWSE afieaz articolele din baza de date sub forma unui tabel: BROWSEE [FIELDS<cmp1> [/R][/<dim>] [/cmp-calc1>=<exp1>] [, <cmp2> [/R][/<dim>] [/<cmp-calc2=<exp2>],..] [LOCK <nr>] [WIDTH <exp2>] [FREEZE <nume-cmp>] [NOINIT][NOAPPEND][NOMENU][NOEDIT] [NODELETE] Comanda BROWSE permite deschiderea unui ecran special, numit ecran BROWSE, prin intermediul cruia se pot actualiza baza de date, cu toate operaiile ce in de acest lucru. Clauza FIELDS permite enumerarea cmpurilor care vor forma coloanele tabelului; n lipsa clauzei se rein toate cmpurile din baza de date, n ordinea structurii. Pentru un cmp putem interzice editarea: /R, putem preciza dimensiunile la afiare /<dim>. n lista de cmpuri pot apare i cmpuri calculate care primesc un nume i o expresie de calculat. Cmpurile calculate nu sunt editate ci numai afiate; dar valorile din acestea se modific odat cu modificrile n cmpurile care conin expresia de calculat. Clauza LOCK <nr> permite nghearea pe ecran a primelor <nr> coloane (cmpuri) n timpul defilrii tabloului BROWSE spre stnga sau spre dreapta. Se recomand ca n structura conceptual s se aranjeze la nceput informaiile de identificare a unui obiect. Dac acest lucru nu este realizat, putem schimba ordinea de afiare pe ecran a cmpurilor

74

cu clauza FIELDS, astfel nct s avem pe primele coloane succesive, informaiile necesare. Clauza WIDTH <lung> d posibilitatea programatorului s fixeze dimensiunea maxim a coloanelor. Desigur, dac lungimea cmpurilor este mai mic dect dimensiunea indicat n clauza WIDTH, aceasta din urm este ignorat. Clauza FREEZE <nume-cmp> permite meninerea cursorului pe o singur coloan. Clauzele celelalte sunt identice cu cele ale comenzii EDIT/CHANGE. Meniul ferestrei BROWSE este prezentat n caietul de laborator. Observaii: Sunt cteva particulariti FoxPro legate de actualizare: 1. Comanda APPEND FROM are clauza FIELDS <lista-cmpuri> prin care se poate indica lista de cmpuri n care se vor introduce valori din fiierul surs: APPEND FROM <fis.dbf> [FOR <cond>] [FIELDS <lista- cmp>] 2. Comanda PACK are dou clauze n plus [MEMO] [DBF]. Clauza MEMO se folosete atunci cnd se dorete diminuarea spaiului disc nefolosit din fiierul memo asociat, fr a afecta fiierul bazei de date. Clauza DBF se folosete pentru a terge nregistrrile marcate pentru tergere din baza de date, fr a modifica fiierul memo. Lucrul cu cmpurile memo Sunt situaii cnd, ntr-un anumit cmp al unei baze de date, trebuiesc memorate cantiti variabile de informaii. Astfel, ntr-o eviden a personalului unei uniti, informaia studii poate avea lungimea variind de la cteva caractere (Liceu Informatic, Iai) la cteva zeci de caractere (Academia de Studii Economice, Facultatea de Cibernetic Economic, Bucureti). Care va fi dimensiunea cmpului (de tip caracter) care va reine aceast informaie?

75

Desigur, cmpul va fi dimensionat maxim (s zicem 100 caractere) pentru a putea reine corect toate informaiile, dar s nu neglijm faptul c la o parte din articole, poate chiar la majoritatea, vor rmne zone nefolosite. Pe de alt parte, este tiut faptul c lungimea articolului determin direct mrimea timpului de rspuns la interogrile utilizatorilor. Deci, informaia este n ntregime memorat, dar n defavoarea timpului de acces i a utilizrii spaiului pe disc. Ce se ntmpl dac, n majoritatea aplicaiilor nu avem nevoie de aceste informaii despre studiile personalului? O soluie ar fi memorarea studiilor ntr-o baz de date auxiliar, legat de fiierul principal prin intermediul unui cod. O alt soluie este folosirea tipului memo. O baz de date, care conine cel puin un cmp memo, are asociat un fiier suplimentar n care sunt depuse informaiile propriuzise. Fiierul asociat poart acelai nume ca baza de date i se deschide simultan cu aceasta. Accesul sistemului la coninutul unui cmp memo al unui anumit articol se face n modul urmtor: se selecteaz articolul i cmpul memo dorit; se citete adresa nregistrat n cmpul memo; se localizeaz zona din fiierul memo care corespunde adresei citite; se permite accesul la informaia de la aceast adres. ncrcarea unor date ntr-un cmp memo, la o anumit nregistrare, se face dup urmtoarele etape: se gsete un spaiu liber n fiierul memo asociat bazei de date, suficient pentru memorarea tuturor datelor i se ncarc aceste date n spaiul respectiv; se completeaz la nregistrarea dorit, n cmpul memo, adresa zonei din fiierul memo unde s-au ncrcat datele. ncrcarea unor date ntr-un cmp memo se poate face fie direct de ctre utilizator, caracter cu caracter, ntr-o fereastr de editare, fie prin citirea acestor caractere dintr-un fiier text.

76

Introducerea direct de ctre utilizator se face prin intermediul comenzilor de actualizare APPEND, EDIT, BROWSE. Dup poziionarea pe articolul al crui cmp memo dorim s-l introducem sau s-l editm, vom deschide fereastra de editare prin tastele <ctrl><home>. Ieirea cu salvare se face prin tastele <ctrl><end> / <ctrl><w>. Pentru a edita un cmp memo, fr a mai trece prin fereastra de editare Change, se poate folosi comanda MODIFY MEMO, care deschide direct o fereastr de editare pentru cmpul memo specificat, al nregistrrii curente din baza de date activ. MODIFY MEMO <cmp memo 1>[,<cmp memo 2>.,] [ NOEDIT] [NOWAIT][RANGE <expN1>, <expN2>] [WINDOW<nume fereastra>] Clauza NOEDIT nu permite modificarea coninutului cmpului memo. Clauza NOWAIT se folosete numai n interiorul unui program i are ca efect continuarea execuiei programului, dup deschiderea ferestrei de editare, fr a mai atepta ca utilizatorul s modifice cmpul memo respectiv. Clauza RANGE se folosete atunci cnd se dorete ca numai o poriune din cmpul memo s fie editat, i anume partea cuprins ntre <expN1> i <expN2>. Clauza WINDOW permite deschiderea ecranului de editare ntr-o fereastr. Exemplu: USE mijloacef GO TO 2 MODIFY MEMO loc_folos RANGE 1,40 NOTE se modific nregistrarea 2, cmpul loc_folos, numai primele 40 de caractere. GO TO 4 MODIFY MEMO loc_folos NOEDIT NOTE se afieaz cmpul loc_folos al nregistrrii 4 fr a se permite modificarea sa. USE

77

nchiderea ferestrei memo de editare se poate face folosind comanda CLOSE MEMO. CLOSE MEMO <cmp memo> [ , <cmp memo2>.....] | ALL Se vor nchide ferestrele de editare corespunztoare cmpurilor memo specificate n list, salvndu-se eventualele modificri fcute acestor cmpuri. La nchiderea unei baze de date se vor nchide, de asemenea, i ferestrele memo deschise n acel moment, pentru cmpurile memo ale bazei de date. Clauza ALL are ca efect nchiderea tuturor ferestrelor memo deschise, pentru toate zonele de lucru. Exemplu: USE mijloacef MODIFY MEMO loc_folos NOWAIT NOTE se deschide fereastra de editare a cmpului memo loc_folos; Fr a atepta modificarea cmpului WAIT Ateptai TIMEOUT 5 NOTE se face o pauz de 5 secunde CLOSE MEMO loc_folos NOTE se nchide fereastra memo respectiv USE Introducerea datelor dintr-un fiier text se face prin comanda: APPEND MEMO <cmp memo> FROM <fisier> [OVERWRITE ] ntregul coninut al fiierului se adaug sau se suprascrie (clauza OVERWRITE) n cmpul memo. Exemplu: se va aduga o nou nregistrare la baza de date mijloacef, cmpul LOC_FOLOS fiind completat din fiierul ADRESA.TXT ce conine informaiile respective. USE mijloacef

78

APPEND BLANK REPLACE cod WITH Maina REPLACE denimire WITH DACIA 1410 break REPLACE data_inst WITH ( 08 /21/99) REPLACE stare WITH .T. APPEND MEMO loc_folos FROM adresa.txt OVERWRITE Operaiunea invers, de extragere dintr-un cmp memo a informaiilor ntr-un fiier text peste, sau n continuarea vechiului coninut, se face prin comanda: COPY MEMO <cmp memo> to <fiier> [ ADDITIVE] Exemplu: USE mijloacef COPY MEMO loc_folos TO adresa.txt NOTE se copiaz prima adres GO TO 2 COPY MEMO loc_folos TO adresa.txt ADDITIVE NOTE se copiaz a doua adres GO TO 3 COPY MEMO loc_folos TO adresa.txt ADDITIVE NOTE se copiaz a treia adres MODIFY FILE adresa.txt NOEDIT NOTE se vizualizeaz fiierul adresa.txt USE Exemplu: s considerm baza de date mijloacef n care se dorete schimbarea ntre ele a locurilor de folosin ale nregistrrilor 2 i 4. Aceasta se va realiza folosind ca intermadiar fiierul ADRESA.TXT. CLOSE ALL USE mijloacef USE mijloacefn 2 AGAIN NOTE se deschide baza de date mijloacef i n zona de lucru 2 GO TO 2 COPY MEMO loc_folos TO adresa.txt

79

NOTE se copiaz cmpul memo loc_folos al nregistrrii 2 n fiierul adresa.txt GO TO 4 n B REPLACE loc_folos WITH b. loc_folos NOTE se nlocuiete cmpul memo loc_folos al nregistrrii 2 ( zona de lucru 1 ); cu cmpul memo loc_folos al nregistrrii 4 ( zona de lucru 2 ) GO TO 4 APPEND MEMO loc_folos FROM adresa.txt OVERWRITE NOTE se copiaz coninutul fiierului adresa.txt n cmpul loc_folos al nregistrrii 4; ( zona de lucru 1 ) BROWSE CLOSE ALL O alt modalitate de a schimba cele dou cmpuri memo din baza de date este reprezentat de urmtorul program: CLOSE ALL USE mijloacef USE mijloacefn 2 AGAIN GO TO 2 V= loc_folos GO TO 4 n B REPLACE loc_folos WITH b. loc_folos GO TO 4 REPLACE loc_folos WITH v BROWSE CLOSE ALL

Funcii relative la cmpurile memo: 1. MLINE(<cmp memo>, <numar>) extrage din cmpul memo linia dat prin numrul ei. 2. MEMLINES (<cmp memo>) d numrul de linii al cmpului memo.

80

Observaii: Ambele funcii sunt influenate de comanda: Exemplu: s presupunem c n cmpul loc_folos al nregistrrii curente din baza de date mijloacef avem urmtorul text: Bucureti Strada Cuza Vod, nr. 54 Sector 4 Atunci: ? MEMLINE (loc_folos ) NOTE numrul de linii din cmpul memo 3 ? MLINE (loc_folos, 2 ) Strada Cuza Vod, nr. 54 ? MLINE (loc_folos, 1, 0 ) Bucureti ? MLINE (loc_folos, 1, 1 ) ucureti ? MLINE (loc_folos, 1, 11 ) Strada Cuza Vod, nr. 54 ? MLINE (loc_folos, 1, 12 ) trada Cuza Vod, nr. 54 ? MLINE (loc_folos, 4 ) == .T. Valorile returnate de funciile MEMLINE ( ) i MLINE ( ) sunt influenate de comanda: SET MEMOWIDTH TO <numr> Comanda fixeaz lungimea liniilor din cmpul memo la <numr>. Implicit lungimea maxim este de 50 caractere; minim pot fi 8 caractere. Exemplu: vom folosi acelai cmp memo ca i la exemplul anterior: SET MEMOWIDTH TO 60 ? loc_folos Bucureti Strada Cuza Vod, nr. 54 Sector 4

81

? MEMLINE (loc_folos ) 3 ? MLINE (loc_folos, 2 ) Strada Cuza Vod, nr. 54 SET MEMOWIDTH TO 12 ? loc_folos Bucureti Strada Cuz a Vod, nr. 54 Sector 4 ? MEMLINE (loc_folos ) 5 ? MLINE (loc_folos, 2 ) Strada Cuz Observaii: exist o comand FoxPro prin care se poate deschide o fereastr de editare pentru fiecare cmp memo: Transfer de date ntre fiiere i tablouri De multe ori folosirea tablourilor de date este preferabil folosirii fiierelor de date, pentru c viteza de accesare a memoriei este net superioar vitezei de accesare a discului. De exemplu, sortarea unui masiv este mult mai rapid dect sortarea unui fiier. Comunicarea ntre baze de date i tablouri se realizeaz n ambele sensuri prin comenzi corespunztoare. Adugarea datelor dintr-un tablou ntr-o baz de date se poate face prin comanda: APPEND FROM ARRAY <tablou> [FOR<cond>] Se adaug la baza de date articolele preluate dintr-un tablou; fiecare linie corespunde unei nregistrri; coloanele se copiaz n ordinea cmpurilor; se ignor elementele n plus; cmpurile suplimentare se completeaz automat cu valori vide. Se face

82

conversia la tipul cmpului, iar dac lungimea este mai mic pentru cmpuri caracter, se nlocuiete cu asterisc. Trecerea articolelor din baza de date ntr-un tablou se face cu ajutorul comenzii: COPY TO ARRAY <tablou> [FIELDS <lista cmpuri>] [<domeniu>] [FOR<cond>] [WHILE<cond>] Fiecare articol devine o linie. Dac numrul de nregistrri depete numrul de linii, se ignor cele n plus. Spre deosebire de APPEND, se pot selecta cmpurile care vor fi copiate n tablou prin clauza FIELDS <lista cmpuri>. Corecia unor valori ale bazei de date prin utilizarea tablourilor se face la comanda: REPLACE FROM ARRAY <tablou> [FIELDS<lista cmpuri>] [<domeniu>][FOR<cond>] [WHILE<cond>] Se nlocuiesc cu elementele din tabloul specificat acele valori care corespund cmpurilor din clauza FIELDS (implicit toate cmpurile) pentru articolele selectate prin clauzele de selecie: <domeniu>, FOR, WHILE. Comanda REPLACE are ca domeniu implicit articolul curent. Observaii: Sunt cteva comenzi noi n FoxPro relativ la comunicarea ntre tablouri i baze de date: GATHER, SCATTER: a.Adugarea datelor dintr-un tablou n baza de date se face prin: GATHER FROM <tablou>/MEMVAR [FIELDS<listacmp>][MEMO]

83

Comanda permite copierea coninutului tabloului <tablou> sau a unei variabile de memorie n baza de date activ, n nregistrarea curent, n cmpurile precizate n clauza FIELDS. MEMVAR desemneaz variabilele de memorie folosite avnd acelai nume cu cmpurile n care se vor copia. MEMO este necesar dac printre cmpurile de copiat se gsete i un cmp memo. b. Copierea datelor din baza de date ntr-un tablou se face prin comanda: SCATTER [FIELDS <tablou>/MEMVAR <lista-cmp>][memo] TO

Cmpurile din baza de date activ specificate n clauza FIELDS (sau toate cmpurile, opiune implicit) se vor copia n tabloul din clauza TO <tablou> sau n variabilele speciale (clauza MEMVAR). Funcii relative n fiiere nrc funcia explicaii 1 FIELD (<expn>) d numele cmpului cu numr de ordine [,<alias>] <expN> 2 RECSIZE () [<alias>] ntoarce dimensiunea n octei a structurii bazei 3 TYPE (<cmp>) ntoarce tipul unui cmp precizat ca ir de caractere 4 FLDCOUNT () ntoarce numrul de cmpuri din structura fiierului 5 RECHO() [<alias>] ntoarce numrul articolului curent 6 EOF() [<alias>] ntoarce .T. dac s-a ajuns la sfritul de fiier 7 BOF() [<alias>] ntoarce .T. dac s-a ajuns naintea primului articol 8 RECCOUNT() [<alias>] ntoarce numrul de articole din baza de date activ 9 FOUND() ntoarce .T. dac articolul cutat a fost

84

10 11 12 13

gsit SELECT() d prima zon liber (ca numr) MLINE(<cmp>, extrage din cmpul memo linia dat prin <numar>) numrul ei MEMLINES (<cmp>) d numrul de linii al cmpului memo LOOKUP (<cmp1>, ntoarce valoarea <cmp1> a articolului <exp>, <cmp2>) care verific <exp> n cmpul <cmp2>

Programare structurat
Programarea structurat este o metod independent de limbajul de programare care impune reguli stricte n conceperea algoritmilor de rezolvare a problemelor. Ea disciplineaz realizarea algoritmilor prin restrngerea structurilor de control utilizabile la un numr redus de tipuri. Acest principiu de baz deriv din teorema de structur a lui Bhm-Jacobini care arat c orice algoritm se poate construi folosind doar trei tipuri de structuri de control: secvenial, alternativ, repetitiv. Limbajul dBASE (ca i FoxPro) permite descrierea acestor structuri prin comenzi corespunztoare: Structuri de control de baz Structura secvenial controlul este transferat de la o operaie la alta n secven.

instruciune 1

instruciune 2

Structura alternativ - permite alegerea ntre dou alternative. n unele situaii algoritmul de rezolvare a problemei impune ramificarea programului n dou ramuri condiionat de valoarea de adevr a unei condiii , astfel nct, la executarea acestuia , n funcie

85

de datele problemei, calculatorul s poat executa una din cele dou aciuni posibile.

Instruciunea IF
Aceast facilitate este asigurat de instruciunea IF. Forma general (dou variante ) a acestei instruciuni este: 1.Formatul pentru structura alternativ cu dou ramuri IF condiie < instruciuni1> ELSE <instruciuni2> ENDIF 2.Formatul pentru structura alternativ cu o ramur vid IF condiie < instruciuni> ENDIF n limba englez IF nseamn dac , iar ELSE nseamn altfel. Funcionarea instruciunii IF poate fi explicat prin urmtoarele diagrame. 1.Formatul pentru structura alternativ cu dou ramuri este urmtoarea:

DA Condiie

NU

Aciune 1

Aciune 2

2.Formatul pentru structura alternativ cu o ramur vid

86

DA Condiie

NU

instruciune .

La ntlnirea unei instruciuni IF se va evalua n primul rnd valoarea de adevr a expresiei booleene condiie. n cazul n care aceasta are valoarea TRUE se va executa grupul de instruciuni <instruciuni1>, dup care execuia comenzii se va termina. Dac condiia are valoarea FALSE i dac exist ELSE se va executa instruciunile din grupul <instruciuni2>, dup care execuia comenzii se va termina. n ambele cazuri urmtoarea instruciune care se va executa este cea de dup terminarea instruciunii. Exemplu: SET TALK OFF CLEAR a=0 b=0 @4,10 SAY Primul numar GET a PICTURE 9999 @5,10 SAY Al doilea numar GET b PICTURE 9999 READ IF a>b ? Primul numr este mai mare && se execut cnd a>b ELSE

87

? Al doilea numr este mai mare sau sunt egale NOTE se execut cnd a<=b ENDIF ? IF b<> 0 NOTE se execut cnd b este diferit de 0 ? a, :,b,=,a/b ENDIF Un efect asemntor, de selecie dintre dou variante, se obine prin funcia IIF () avnd sintaxa: IIF ( <expL>, <expr1>, <expr2>) Aceast funcie evalueaz expresia logic <expl> i n funcie de rezultatul obinut, returneaz valoarea uneia dintre expresiile <expr1> i <expr2>: - returneaz valoarea obinut prin evaluarea expresiei <expr1> dac <expl> este evaluat la .T. - returneaz valoarea obinut prin evaluarea expresiei <expr2> dac <expl> este evaluat la .F. Cele dou expresii <expr1> i <expr2> nu trebuie neaprat s aib acelai tip, acestea putnd fi de tip ir de caractere, dat calendaristic, logic sau numeric. Exemplu: SET TALK OFF CLEAR a=0 b=0 @4,10 SAY Primul numar GET a PICTURE 9999 @5,10 SAY Al doilea numar GET b PICTURE 9999 READ sir1= Primul numr este mai mare sir2= Al doilea numr este mai mare sau sunt egale ? IIF a>b, sir1, sir2

88

Mai multe comenzi IF ..ENDIF pot fi imbricate, incluse una n alta, obinndu-se condiionarea unui grup de instruciuni prin mai multe expresii logice, sau obinndu-se selecii diverse ntre mai multe grupuri de instruciuni. Exemplu: SET TALK OFF CLEAR a=0 b=0 @4,10 SAY Primul numar GET a PICTURE 9999 @5,10 SAY Al doilea numar GET b PICTURE 9999 READ sir1= Primul numr este mai mare sir2= Al doilea numr este mai mare sau sunt egale sir3= Numerele sunt egale IF a>b ? sir1 && a>b ELSE IF a<b ? sir2 && a<b ELSE ? sir3 && a=b ENDIF ENDIF n acest exemplu structura de comenzi IF.ENDIF poate fi nlocuit cu: ? IIF ( a>b, sir1, IIF ( a<b, sir2 , sir3)) n care avem dou apeluri ale funciei Iif ( )incluse unul n altul.

Instruciunea CASE
Instruciunea IF permite selectarea uneia dintre cele dou aciuni n concordan cu valoarea unei expresii booleene. Instruciunea CASE este o generalizare a instruciunii IF n sensul c asigur executarea condiionat a uneia din cele cteva

89

aciuni posibile, n funcie de valoarea unei expresii de tip scalar sau subdomeniu ( numit selector ), ca urmare permite alegerea din attea instruciuni cte valori distincte are tipul expresiei. Sintaxa este: DO CASE CASE <expL1> < instruciuni1> [CASE <expL2> < instruciuni2> .. CASE <expLN> < instruciuniN>] [ OTHERWISE < instruciuni>] ENDCASE Comanda va determina execuia grupului de instruciuni pentru care expresia logic corespunztoare are valoarea .T.. Execuia comenzii va decurge n modul urmtor: Se evalueaz prima expresie logic <expL1> i dac valoarea obinut este .T. se execut grupul de instruciuni <instruciuni1>. Dac expresia logic <expL1> are valoarea .F. se trece la evaluarea urmtoarei expresii logice. Dup gsirea primei expresii logice cu valoarea .T. i executarea grupului de instruciuni corespunztor, execuia comenzii se ncheie, programul continund cu prima comand de dup ENDCASE. Dac nici una dintre expresiile <expL1>, <expL2>..<expLN> nu are valoarea .T., apar dou cazuri: - cnd nu exist clauza OTHERWISE, execuia comenzii se ncheie; - n prezena clauzei OTHERWISE, se va executa grupul de instruciuni <instruciuni>, dup care se trece la prima comand de dup ENDCASE. Observaie: numai unul dintre grupurile de instruciuni <instruciuni1> <instruciuniN> i <instruciuni> va fi executat i anume acela pentru care expresia logic este .T.

90

DA
c1
s = c1

NU

NU
Instruciune1

S = c2
DA
Instruciune2

NU S = c3 DA
Instruciune3

Exemplu: SET TALK OFF

91

CLEAR DIMENSION a (4 ) a (1) = Primvara a (2) = Vara a (3) = Toamna a (4) = Iarna anotimp = Prim[vara @ 6,26 GET anotimp FROM a FUNCTION & READ @ 15,10 SAY Acest anotimp conine lunile: DO CASE CASE anotimp = Primvara ?? Martie, Aprilie, Mai CASE anotimp = Vara ?? Iunie, Iulie, August CASE anotimp = Toamna ?? Septembrie, Octombrie, Noiembrie OTHERWISE ?? Decembrie, Ianuarie, Februarie ENDCASE

Structura repetitiv a) Structura clclic aceasta folosete un contor de ciclu care va determina numrul de repetri al executrii aciunilor din cadrul corpului ciclului ( grup de aciuni care se pot repeta de mai multe ori).

92

c: = inc

Corpul ciclului

c:=c+1

DA C<=sf

NU
Unde: c contor de ciclu inc expresie sf expresie Instruciunea FOR In unele situaii trebuie ca un grup de instruciuni s fie repetat de un anumit numr de ori bine precizat i dinainte cunoscut. n aceast situaie se utilizeaz instruciunea FOR. Sintaxa instruciunii este:

93

a) Instruciunea FOR pentru valori cresctoare ale variabilei contor: FOR <var> = <expN1> TO <expN2> [ STEP <expN3>] <instruciuni> [EXIT] [LOOP] ENDFOR La utilizarea instruciunii FOR trebuie s se in seama de urmtoarele observaii: 1. Nu este indicat modificarea variabilei contor n cadrul ciclului. 2. La ieirea din ciclu, variabila contor va avea valoarea sfrit ( n cazul n care ieirea din ciclu s-a fcut n pasul normal). 3. Ieirea forat din ciclul FOR se poate realiza cu instruciunea EXIT (prezent n corpul ciclului ). n acest caz, contorul va avea valoarea cu care a fost surprins de instruciunea EXIT. 4. Dac nceput > sfrit ( sau sfrit < nceput ) este fals, se execut instruciunea imediat urmtoare dup FOR. Instruciunea FOR funcioneaz dup urmtorul algoritm: Valoarea iniial a variabilei contor va fi dat de evaluarea expresiei <expN1>. Dup fiecare execuie a grupului de instruciuni <instruciuni> variabila va fi incrementat sau decrementat cu o valoare constant, dat de evaluarea expresiei <expN3>, dac este prezent clauza STEP, sau 1 cnd STEP lipsete (absena clauzei STEP este echivalent cu construcia STEP 1 ) Cnd valoarea variabilei <var> crete peste valoarea expresiei <expN2> ( strict mai mare), n cazul unei valori pozitive a lui <expN3>, sau scade sub valoarea expresiei <expN2>, pentru o valoare negativ a expresiei <expN3>, se va iei din bucl, programul continund cu urmtoarea comand de dup ENDFOR. Exemplu: comanda FOR i = 1 TO 4 ?i

94

ENDFOR Este echivalent cu grupul de comenzi: ?1 ?2 ?3 ?4 n exemplul de mai sus i este variabila contor, 1 este valoarea iniial a variabilei, iar 4 este valoarea final a acesteia. La fiecare execuie a lui ENDFOR variabila i va fi incrementat cu 1. La ultima execuie a comenzii ? i valoarea lui i va fi 4. execuia lui ENDFOR are ca efect creterea lui i cu 1, deci valoarea lui i va fi 5, dup care depete valoarea final 4. programul va continua cu prima instruciune de dup ENDFOR. Comanda: FOR i=4 to 1 STEP -2 ?i ENDFOR Este echivalent cu : ?4 ?2 Atenie! : cele trei expresii numerice, <expN1>, <expN2>, <expN3> sunt evaluate doar la intrarea n bucla FOR, modificarea acestora n cadrul buclei neavnd nici un efect asupra numrului de executri ale instruciunilor. Exemplu: a=3 FOR i=1 TO a a=10 ? i*2 ENDFOR In acest exemplu comenzile a=10 si ? i*2 vorfi executate de 3 ori ( i va lua pe rand valorile 1, 2 si 3), chiar daca la prima executie a acestora o noua eveluare a lui <expN2> ar duce la o noua valoare finala a contorului ( aceasta evaluare nu mai are loc). In schimb modificarea valorii contoruluin interiorul buclei va inflyenta numarul de executii ale grupului de instructiuni, testarea valorii contor facandu-se la fiecare noua executie a <instructiuni>.

95

Exemplu: FOR i = 1 TO 10 ?i i = 15 ENDFOR Comanda ? i va fi executata o singura data ( pentru i = 1 ), dupa care datorita valorii 15 a contorului, care depaseste valoarea finala 10, se va iesi din bucla continuandu-se cu prima instruciune de dupa ENDFOR. Doua comenzi speciale pot fi folositen interiorul buclei FOR.. ENDFOR: EXIT determina iesirea fortata din bucla ;i continuarea executiei programului cu prima comanda care urmeaza dupa ENDFOR, indiferent de valoarea variabilei contor; LOOP care determina saltul peste urmatoarele instructiuni ale buclei ( dintre LOOP si ENDFOR ), incrementarea sau decrementarea contorului si trecerea la o noua executare a grupului de instructiuni, daca se respecta conditia de ramaneren bucla. Exeplme: Suma=0 FOR i=1 To 10 Suma=suma+1 IF i=5 EXIT ENDIF ENDFOR Urmatorul program este identic ca rezultat, cu cel precedent: Suma=0 FOR i=0 TO 10 IF i>5 LOOP ENDIF Suma=suma+1 ENDFOR Primul program din acest exemplu functioneaza astfel: se executa comanada suma=suma+1 de 5 ori, pentru i=1,2,3,4 si 5.La

96

i=5 este respectata conditia comenzii IF si deci fa executata comanda EXIT caredetermina saltul la ultima instruciunea programului. Cel de-al 2 lea program din exemplul are urmatoarea functionare: se executa comanada suma=suma+1 de 5 ori, pentru i=1,2,3,4 si 5, atata timp cat nu este respectata conditia comenzii IF. Candaceasta conditie devine adevarata, pentru i=6,7,8,9 si 10, se va executa comanda LOOP care determina ignorarea comenzilor urmatoare din bucla, deci a comenzii suma=suma+1.Se va iesi din buclan mod normal, cand i=11. Un tip special de bucla, foarte asemanatoare cu FOR .ENDFOR, dar specialiazatan lucrul pe o baza de date, este reprezentata de comanada SCAN.ENDSCAN, cu sintaxa de forma: SCAN [ NOOPTIMIZE] [ <domeniu> ] [ FOR <exoL1> ] <expL2> ] <instructiuni> [ LOOP ] [ EXIT ] ENDSCAN [ WHILE

Aceasta comanda realizeaza parcurgerea bazei de date curente si executarea grupului de unstructiuni <instructiuni>,pentru fiecare inregistrare care aparatine domeniului specificat prin <domeniu>, FOR sau WHILE. Clauzele LOOP si Exit au acelasi efect can cazul comenzi FORENDFOR, iar clauza NOOPTIMIZE inhiba optimizarea RUSHMORE. Exemplu: avem urmatoarele 4 echivalente: 1. SCAN TO RECCOUNT ( ) <instructiuni> GOTO i ENDSCAN <instructiuni> ENDFOR 2. FOR I=1

97

3. SCAN; NEXT 10 FOR MOD(RECNO( ),2)=0 <instructiuni> ENDSCAN 4. FOR i= RECNO ( ) TO RECNO ( ) +9 IF MOD(RECNO( ),2)=0 <instructiuni> ENDIF ENDFOR Cel de-al doilea tip de bucla, cu numr nedefinit de pai, este implementat n FoxPro prin comanda DO WHILE ENDDO, avand sintaxa: DO WHILE <expL> <instructiuni> [ LOOP ] { EXIT ] ENDDO Aceast comand determin execuia repetat a grupului de instrctiuni <instructiuni>, atata timp cat valoarea expresiei logice <expl> este adevarata . Executia comenzii se va desfasura astfel:se evalueaza expresia <expl > si, daca acesta are valoarea .F. , executia comenzii se incheie. Daca valoarea acesteia este .T. se vor executa instructiunile din <instructiuni>. La intalnirea lui ENDDO se sare la linia continand DO WHILE si expresia <expL> este reevaluata. Acest ciclu se continua pana cand o evaluare a expresiei logice <expL> va conduce la valoarea .F., cand executia comenzii DO WHILW . ENDDO se incheie, programul continuand cu prima instruciune de dupa ENDDO. Comenzile LOOP si EXIT au aceeasi semnificatie ca si la comanda FOR, prima determinand ignorarea restului de comenzi si reevaluarea lui <expL>, iar cea de-a doua determinand iesirea fortata din bucla, indiferent de valoarea expresiei logice <expL>. Exemplu:

98

Suma=0 P=1 DO WHILE suma < 100 suma= suma + p p= p+ 1 ENDDO suma= suma + p a= p- 1 ? S-au adunat primele , a , numere naturale ? obtinandu-se suma de , suma acest program calculeaza suma a p numere naturale, p fiind numarul maxim de asemenea numere astfel incat suma lor sa nu depasesca 100. Structura alternativ generalizat Este o dezvoltare a structurii alternative pentru cazul cnd se continu ramificarea algoritmului numai pe o ramur. Urmrind schema de mai jos, execuia unei structuri CASE are loc astfel: se evalueaz prima condiie <c1> i dac este adevrat se execut secvena de comenzi <secv1> dup care se prsete structura CASE. Dac condiia <c1> nu este adevrat se va testa condiia notat <c2>, .a.m.d. Se ajunge deci la testarea condiiei <cn> atunci cnd nici una din condiiile precedente nu a avut valoarea adevrat. Comanda DO CASE : DO CASE CASE <conditie1> <secv1> CASE <conditie2> <secv2> CASE <conditieN> <secvn> [OTHERWISE <secv.m>] ENDCASE

99

Comanda DO CASE este o comand multi-linie. Fiecare condiie, notat n formatul general prin construcia <cond1>... <condn>, este precedat de cuvntul cheie CASE. Dac niciuna din condiii nu a fost adevrat, se va executa <secv.m> plasat dup cuvntul OTHERWISE. Depanarea programelor i tratarea erorilor n scrierea unui program , deseori apar erori datorate fie neateniei, fie nunei cunoasteri insuficientente a limbazului de programare, fie neluarin seama a unor cazuri particulare ale evolutiei programului. Doua mari clase de erori pot aparea la executia a unui program: -erori de sintacsa, cand programul este incorect scris, ducand fie la intreruperea rularii, fie la executarea unor rutine pentru tratarea erorilor. -erori de rulare, cand programul este corect scris, dar el nu functioneaza cum dorim, rezultatele obtinute nefiind cele asteptate de noi. Primul tip de erori sunt mai usori de detectata si de corectata, pe cand cele din cea de-a doua grupa necesita, de obicei, mai mult pentru detectare si mai multa munca pentru corectare. La rularea unui program, aparaitia uei erori de sintaxa determina, de obicei, intreruperea procesului de executie si afisarea unui mesaj de erore, indicand timpul erori aparaute si cerand utilizatorului luarea unei decizi, astfel: -intreruperea programului, actionand declansatorul Cancel, care este si cel implicit; -suspendarea executiei programului, obtinuta prin actionarea declansatorului Suspend; -continuarea executiei, ignorand eroarea aparuta, prin alegerea declasatorului Ignore. Detectarea erorilor de rulare presupune tehnici de lucru mai avansate, cum ar fi rularea pas cu pas, folosind punctele de intrerupere, vizualizarea continutului unor variabilen paralel cu

100

executarea programlor, etc.Vom prezentan continuare cateva tehnici folositen depanarea programelor realizate cu ajutorul adoua ferestre sistem ale FoxPro, fereastra Trace si fereastra Debug, acesibile din submeniul,n partea de jos a acestuia. Rularea pas cu pas a unui program reprezinta o tehnica speciala folosita la depanarea programelor, constandn exexcutarea unei singure instructiuni a programului la o comanda a utilizatorului.In intervalul de timp dintre executia a doua instructiuni consecutive, programatorul poate observa eventualele functionari incorecte ale programului, detectand astfel cauzele ce au dus la erorile de rulare respective. Punctele de intrerupere reprezinta pozitii fixen cadrul programului de depanat, la care executia programului respectiv se opreste, utlizatorul avand satefel posibilitatea dea verifica starea de moment a variabilelor din program, modul cum decurge executia programului,n vederea detectari eventualelor surse de eroare. Aceste doua tehnici prezentate mai sus sunt disponibile prin intermediul ferestrei Trace, care se deschide prin selectareaoptiuni Trace. Pentru ca un program sa poat fie depanatn fereastra Trace,acesta mai tebuie deschisn acesta fereastra specificanduse programul de depanat. Dupa deschiderea programului se poate trece la executia lui, aceasta putanduse executan mai mute moduri: -pas cu pas, cate o instruciune la fiecare comanda a utlizatorului; -pana la un punct de intrerupere care va determina suspendarea programului; -executarea continua, la viteza maxima; -executarea continua cu viteza controlata, cand dupa executia fiecarei instructiuni se face o pauza dupa carea se continua rularea Vom discuta mai rularea pas cu pas a unui program deschis n fereastra Trace. Pentru execuia fiecrei instrciuni a programului, utilizatorul va alege opiunea Over sau Step, acestea determinnd execuia instruciunii curente, dup care se ateapt o nou comand de executare de la utilizator Diferena dintre cele dou opiuni este dat de modul de tratare a comenzilor de apel al unei rutine:

101

-Step determin executarea unei instruciuni a programului, iar n cazul cnd aceasta este un apel al unei rutine, se va trece n interiorul rutinei, pentru executarea instruciunilor acesteia; -Over, de asemenea, execut o instruciune, dar cnd aceasta este un apel al unei rutine (program, procedur, funcie ) aceasta este executat n ntregime, ntr-un singur pas, fr a se trece la executarea pas cu pas a instrciunilor respectivei rutine. Instruciunea curent care va fi executat prin intermediul opiunilor Step sau Over va aprea pe ecran supraluminat sau evideniat prin intermediul unui semn, indicnd aceast stare a liniei respective. n combinaie cu instruciunea Step, se folosete i opiunea bar Out, care determin executarea continu a restului de instruciuni din programul curent, urmnd ca dup revenirea n programul apelant, execuia s fie suspendat pe prima instruciune care urmeaz instruciunii de apel al rutinei. Acesta este echivalent cu ieirea din rutina curent i oprirea imediat n rutina apelant. O alt modalitate de rulare a uni program este cea prin puncte de ntrerupere, adic, programul se va executa n mod continuu pn la primul punc de ntrerupere ntlnit. Pentru stabilirea punctelor de ntrerupere, n care execuia programului va fi suspendat, se va deplasa cursorul pe linia respectiv, dup care se va tasta Space sau Enter. O nou acionare a tastei Space sau Enter, cnd cursorul se afl pe o linie care conine un punct de ntrerupere, va determina anularea punctului de ntrerupere respectiv, linia revenind la starea iniial. tergerea, anularea tuturor punctelor de ntrerupere se poate face prin alegerea opiunii Clear Breakpoints. Un punct de ntrerupere nu determin terminarea execiei programului, ci numai suspendarea acestuia, pn la o nou comand a utilizatorului cu privire la continuarea rulrii. Opiunea bar Resume determin continuarea execuiei contunue a programului, pn la un nuo punc de ntrerupere, pn la sfritul programului sau pn la acionarea tastei Escape. O modalitate special de rulare a programului este obinut prin rularea opiunii Throttle, constnd n executarea continu a programului, instruciune cu instruciune fcndu-se o pauz, stabilit de utilizator.

102

Oprirea execuiei programului se poate face n orice moment, selectnd opiunea Cancel. n paralel cu executarea unui program n fereastra Trace, se poate vizualiza coninutul unor variabile folosite n program, sau chiar rezultatul evalurii unor expresii folosind aceste variabile, prin intermediul ferestrei Debug. Se recomand ca fereastra Trace i Debug s fie deschise i vizibile simultan pa ecran,urmrindu-se astfel efectul fiecrei instruciuni executate n fereastra Trace asupra variabilelor din fereastra Debug. Ferestra Debug este format din dou pri, astfel: n partea dreapt se introdun variabilele i expresiile care se doresc a fi vizualizate n timpul executrii porgramului, n partea stng aprnd valorile de moment ale variabilelor sau expresiilor respective. De asemenea, n fereastra Debug se pot specifica puncte de ntrerupere a programului dependente de valorile variabilelor sau expresiilor din fereastra respectiv, spre deosebire de punctele de ntrerupere stabilite n fereastra Trace, care reprezint puncte fixe ale programului, independente de valorile variabilelor. Pentru a poziiona un astfel de punct de ntrerupere, n dreptul variabilei sau expresiei dorite, pe bara ce separ cele dou pri ale ferestrei, se va amplasa un marcaj. Acest lucru se va realiya fie cu mouse-ul , poyiionnd cursorul acestuia n locu dorit i acionnd butonul stng, fie prin intermediul tastaturii, deplasndu-se pa bara separatoare folosind tasta Tab, poyiionndu-se n dreptul variabilei sau expresiei dorite, cu ajutorul sgeilor direcionale i acionnd tasta Space, pentru marcare. Execuia programului se va suspenda ori de cte ori valoarea variabilei sau expresiei corespunytoare unui astfel de punct de ntrerupere se va modifica. Exemplu: dorim s calculm suma primelor yece numere naturale, pentru aceasta sciind urmtorul program: CLEAR SET TALK OFF suma= 0 FOR i = 0 TO 10 suma = suma+i ENDFOR ? Suma primelor yece numere naturale este: , suma

103

acest program funcionaey corect, n urma executrii lui obinnduse pe ecran mesajul: Suma primelor yece numere naturale este 55 Dar s presupunem c la introducerea programului n memoria calculatorului n locul semnului + din instruciunea suma = suma + 1, s-a tastat semnul * . Suma primelor yece numere naturale este 0 Pentru detectarea erorii vom deschide cele dou ferestre, Trace i Debug simultan pe ecran, dup care n fereastra Debug, n partea dreapt, vom introduce variabilele de viyualiyat, suma i I, iar n fereastra Trace, care va fi fereastra activ, vom deschide programul de depanat, SUMA.PRG, dup care se va trece la rularea pas cu pas a programului. Pentru aceasta se va selecta opiunea bar Step a meniului ferestrei Trace, prin acionarea tastei S cnd fereastra respectiv este activ. Acionai de ase ori consecutiv tasta S obsevnd n fereastra Debug modificrile celor dou variabile suma i i, dup fiecare executare a unei instruciuni. Dup cea de a asea acionare a testei S , ultima instruciune executat a fost sums = suma + i , care trebuie s aib ca reyultat valoarea 1 depus n variabila sums. n schimb noi vom observa c suma va avea valoarea 0 dup executarea acestei comenyi, indicnd c programul nu funcioneay corect. Se va examina mai atent linia respectiv, detectndu-se astfel eroarea de scriere ( * n loc de + ). Pentru corectarea erorii se anuleaz executarea programului selectnd opiunea Cancel dup care se reediteaz programul ntr-o fereastr de editare.

Intrare / ieire
Gestiunea ecranului Ecranul are n mod uzual 24 linii i 80 coloane dar, de fapt, zona utilizator este limitat la liniile [1, 21] pentru c linia 0 este linia de meniu principal, iar liniile [22, 24] sunt liniile de stare. Putem avea acces la aceste linii prin folosirea unor comenzicomutator.

104

linie meniu zona utilizator linii de stare, mesaje

linia zero poate fi activat/dezactivat cu SET SCOREBOARD ON/OFF liniile 22,23,24 pot fi activate/dezactivate cu: SET STATUS ON/OFF

Observaie: Numrul de linii i de coloane depinde de modul de lucru al monitorului. Exist o comand care poate fixa modul de lucru explicit: SET MONO/COLOR/EGA25/EGA43/VGA25/VGA50 DISPLAY

Pentru a indica o anumit poziie pe ecran, trebuiesc date linia i coloana respectiv. Linia este un numr ntre 0 i numrul maxim de linii al ecranului (standard 24), iar coloana este un numr ntre 0 i numrul maxim de coloane al ecranului (standard 79). ***Observaie: n FoxPro exist funciile SROW() care ntoarce numrul maxim de linii al monitorului i SCOL() care ntoarce numrul maxim de coloane. 0,0 0 X cursoru l este pe linia row() 0,79 coordonatele punctului x row()+3,col()+3

23, 0 COL() cursorul este pe coloana col()

23,7 9

105

Unele comenzi i funcii de afiare pe ecran conin explicit linia i coloana unde se face afiarea respectiv, altele nu specific poziia de afiare ci folosesc poziia cursorului de pe ecran. Poziia cursorului se poate afla prin funciile ROW() care ntoarce numrul liniei i COL() care ntoarce numrul coloanei.

Gestiunea culorilor Pentru c principalul dispozitiv periferic de ieire este monitorul, desigur c un efect deosebit l are afiarea datelor prin culori diferite n funcie de importana lor. Programatorul are la dispoziie o palet larg de culori, poate obine efecte de intensitate sporit (bright) sau de plpire (flash). TABELE DE CULORI nrc culoare 1 negru 2 albastru 3 verde 4 turcoaz 5 invizibil 6 rou 7 ciclamen 8 maro 9 galben 10 alb cod N B G BG X R RB+ GR GR+ W Culorile sunt indicate printr-un cod (abreviere). Astfel, pentru a specifica culoarea ALB va trebui s folosim caracterul W, iar pentru rou, caracterul R.

Putem obine culori cu intensitate crescut punnd + dup codul de culoare, iar efectul de flash este obinut prin caracterul * dup cod culoare. De exemplu: gri nchis N+, albastru intens B+, portocaliu R+, bleu BG+, violet deschis RB+. Afiarea pe monitor a unui anumit caracter presupune specificarea a dou culori: una pentru caracterul propriu-zis, numit culoarea cernelii (ink), iar cealalt pentru fondul pe care se afieaz caracterul, numit culoarea de fond (paper). De exemplu: caracterul rou pe alb se va indica prin R/W, galben pe negru GR+/N. Cele dou culori separate prin caracterul /

106

(slash) se grupeaz ntr-o pereche de culori: descris n sintaxa comenzilor prin construcia <per-color> sau <ink>/<paper>. Schimbarea strii color a monitorului se poate face prin comanda: SET COLOR ON/OFF Fixarea perechilor de culori pentru elementele principale ale ecranului se face prin: SET COLOR TO [<std>][,<ext>][,<marg>][,<fond>] Comanda fixeaz n clauza <std> perechea de culori pentru texte obinuite; pentru text subliniat sau evideniat (opiunile selectate din meniuri, poziia cursorului la BROWSE etc.) este utilizat clauza <ext>, pentru margine clauza <marg>, iar pentru fond clauza <fond>. Exemplu: set color to w+/b, gr+/n && afiaj standard litere albe pe fond albastru, && extins litere galbene pe fond negru set color to gr+, r, g, w && scriere cu litere galbene, selecia se observ && cu rou, bordura este verde Revenirea la culorile setate n CONFIG.DB se face prin comanda: SET COLOR TO Fixarea explicit a perechilor de culori pentru zone ale ecranului se poate face prin SET COLOR NORMAL/MESSAGES/TITLES/BOX/ OF

107

HIGHLIGHT/ INFORMATION/ FIELD TO <per-color> Comanda fixeaz culorile: pentru textul neselectat cu afiare obinuit (NORMAL), mesaje (MESSAGES), titluri, nume de cmpuri (TITLES), chenare (BOXES), informaiile selectate (HIGHLIGHT), informaiile sistem (INFORMATION), cmpuri (FIELDS).

Formatul de afiare i citire


Formatul de afiare sau introducere a unei date reprezint o deschiere simbolic a modului n care o dat este afiat pe dispozitivul de ieire sau este citit de la tastatur. Formatul se descrie prin dou clauze: PICTURE, FUNCTION urmate de un ir de coduri. Codurile FUNCTION se refer la toate caracterele din format, iar codurile din PICTURE se refer la un singur caracter, cel de pe poziia codului. De exemplu: afiarea numrului 1234 depinde de ablonul deschis n clauza PICTURE, astfel: picture 999 .... > va determina trunchierea numrului picture 99, 999 .... >determin introducerea separatorilor: 1, 234 ablonul este util la introducerea de valori din exterior controlnd tipul datei. De exemplu, dac trebuie s citim numai cifre, atunci ablonul pus n comanda care realizeaz citirea va avea ablonul 99999 pentru ca, n caz de introducere a unui caracter nenumeric, s se avertizeze sonor eroarea. Coduri de ablon pentru PICTURE ! conversie n majuscule # afieaz irul definit de SET CURRENCY n locul unui zero nesemnificativ * afieaz * n locul unui zero nesemnificativ

108

9 , . A L N X Y

permite cifre i semnul pentru numere separator (n numeric) poziia punctului zecimal permite doar litere date logice permite introducerea de litere i cifre permite introducerea oricrui caracter permite introducerea de valori logice {.Y./.y./.N./.n.}

Coduri de funcie pentru clauza FUNCTION cod Semnificaie ! convertete toate literele n majuscule ^ afieaz numrul n format tiinific (mantis i exponent) $ afieaz simbolul monetar definit de SET CURRENCY ( afieaz numerele negative ntre paranteze A permite numai caractere alfabetice B aliniaz textul la stnga unui cmp C afieaz litera C (credit) dup numerele pozitive D utilizarea formatului curent pentru dat calendaristic E utilizarea formatului european de dat calendaristic I centreaz textul n cadrul unui cmp (numai SAY) J aliniaz textul la dreapta n cadrul unui cmp numeric (numai SAY) L afieaz zerourile nesemnificative ntr-un cmp numeric M definete opiunile acceptabile pentru o variabil GET R permite introducerea n ablon a unor caractere fr semnificaie S <n> activeaz un mecanism de defilare orizontal ntr-o fereastr T elimin spaiile din fa i din spate n cadrul unui cmp X afieaz DB(debit) dup numerele negative Z nlocuiete valorile nule cu spaii

109

Comenzile ? i ?? Comanda de afiare pe care am folosit-o pn acum este ?/??. Ea poate avea i clauze de specificare a formatului. n format general comanda ?/?? este: ?/?? <exp> [PICTURE <sablon>][FUNCTION <functie>] [AT <coloana>] [, <exp> [PICTURE <sablon>][FUNCTION <functie>] [AT <coloana>]..] [STYLE <tip-caracter>] Se afieaz valorile unei expresii sau a mai multora, conform clauzelor care le nsoesc: PICTURE <sablon> definete restricii i formatul de afiare a fiecrui caracter din expresie: FUNCTION <funcii> specific formatul global pentru expresie. Clauza AT <coloana> definete coloana unde se va afia expresia. Clauza STYLE <tip-caracter> este o opiune pentru imprimant definind stilul de imprimare. Ambele comenzi folosesc ca punc de referin n calculul coordonatelor de afiare, poziia curent a cursorului. Comanda ?? ncepe afearea datelor exact de la poziia cursorului, pe cnd comanda ? ncepe afiarea datelor de la nceputul primei linii care urmeaz celei pe care se afl cursorul. Dac imprimanta nu suport stilul specificat, atunci opiunea se ignor. Stilul este dat printr-o liter: B: pentru caractere ngroate; I: pentru caractere italice; U: pentru subliniere; R: pentru indexare sus; L: pentru indexare jos. Exemple: ?(2+4)*5 32 ? Salutri din ?? Bucureti Salutri din Bucureti

110

.............................................................................? 2 + 3 = , 2 + 3 2+3=5 Observaie: Afiarea se face n mod implicit pe ecran, dar poate fi dirijat i ctre imprimant dac exist comanda de activare a imprimantei (comutator ON). Comanda de activare/dezactivare a imprimantei este: SET PRINTER ON /OFF Comanda @ SAY Este o alt comand de afiare cu format: @ <linie,coloan> SAY <exp> [PICTURE <sablon>] [FUNCTION <functie>][[OPEN] WINDOW <nume-fereastra>] [COLOR <per-color>] Comanda afieaz valoarea expresiei <exp> ncepnd din punctul de coordonate <linie>, <coloan> conform ablonului dat n clauza PICTURE, i/sau a funciei din FUNCTION. Clauza WINDOW permite afiarea ntr-o fereastr anterior definit a unui cmp memo. Clauza COLOR stabilete atributele culoare sub forma <ink>/<paper>. Exemplu: alfa = Lucrez n FoxPro @ 10 ,10 SAY alfa @ 12 ,10 SAY alfa SIZE 2 , 10 efectul este urmtorul: prima comand: Lucrez n FoxPro a doua comand: Lucrez n FoxPro Exemplu: CLEAR mesaj = la muli ani ! @ 10 ,10 SAY mesaj PICTURE ' ! xxxxxxxxxxxxx '

111

La muli ani ! @ 12 ,10 SAY mesaj FUNCTION ' ! ' LA MULI ANI ! @ 13 ,10 SAY mesaj PICTURE ' ! xx ! xxxxx ! xxxx ' La Muli Ani ! @ 14 ,10 SAY 2 / 3 PICTURE ' 99 . 9999 ' 0 . 6700 @ 15 ,10 SAY ' alternative ' FUNCTION ' ! x ! x ! x ! x ! x ' AlTeRnAtIv Urmtoarele formate sunt echivalente : PICTURE ' aaaaaa ' FUNCTION ' ! ' PICTURE ' ' FUNCTION ' a ! ' PICTURE ' @ ! aaaaaa ' PICTURE ' @ a !!!!!! ' Exemplu:

CLEAR
nume = ' ' prenume = ' ' data_n = { / / } data_cs = { / / } @ 10 ,10 GET nume @ 10 ,10 GET prenume @ 10 ,10 GET data_n @ 10 ,10 GET data_cs DISABLE NOTE acest cmp este doar afiat dar nu poate fi accesat datirit clauzei ; DISABLE READ Exemplu: CLEAR STORE 0 TO a , b @ 10 ,10 GET a PICTURE ' 9999 ' @ 10 ,10 GET b PICTURE ' 9999 ' WHEN a<> 0 NOTE al doilea numr va fi citit doar dac primul este diferit de zero READ Exemplu: CLEAR

112

data_n = { / / } @ 10 ,10 GET data_n ; MESSAGE ' Data naterii n format ll / zz / aa ' READ ? ' Nscut la ' , data_n Exemplu: pentru citirea unei valori numerice , situat ntre 0 i 19 , se va folosi urmtoarea secven: CLEAR a= 0 @ 10 ,10 GET a RANGE 0, 19 READ iar pentru citirea unei date calendaristice, anterioar datei de 1 ianuarie 1970, se va folosi: data = { } @ 10 ,10 GET data RANGE { 01 / 01/ 70 } READ Exemplu: CLEAR a=0 b = SPACE ( 5 ) c = '1 2 3 4 5 6 7 ' @ 10 ,10 GET a SIZE 1 , 4 && se va citi pe 4 caractere @ 11 ,10 GET b SIZE 1 , 7 && se va citi pe 7 caractere @ 12 ,10 GET c SIZE 1 , 5 NOTE citirea se va face ntr-o fereastr de 5 caractere, cmpul de ; 7 caractere defilnd n aceast fereastr READ CLEAR @ 10 ,10 GET a PICTURE ' 99999 ' SIZE 1 , 7 && se va citi pe 5 caractere @ 11 ,10 GET b PICTURE ' xxxxxx ' SIZE 1 , 4 NOTE pe ecran se va edita n 4 caractere, cmpul GET de ; 7 caractere defilnd n aceast fereastr READ CLEAR Exemplu: CLEAR

113

a=0 b=0 c=0 @ 10 ,10 SAY ' Introducei numerele ' @ 11 ,15 GET a PICTURE ' 99999 ' @ 11 ,10 GET b PICTURE ' 99999 ' VALID a < b NOTE se primete numai o valoare mai mare dect cea anterioar @ 13 ,15 GET c PICTURE ' 99999 ' VALID c < c READ suma = a + b + c @ 14 ,15 SAY suma PICTURE ' 99999 ' Exemplu: se vor citi datele personale ale unui salariat, n vederea unor prelucrri ulterioare SET TALK OFF CLEAR nume = SPACE ( 10 ) prenume = SPACE ( 15 ) data_n = { / / } strada = SPACE ( 15 ) nr = 0 localitate = SPACE ( 15 ) @ 5 ,10 SAY ' Introducei numele ' @ 5 ,40 GET nume PICTURE REPLICATE (' x ' , 10) @ 6 ,10 SAY ' Introducei prenumele ' @ 6 ,40 GET prenume PICTURE REPLICATE (' x ' , 15) @ 7 ,10 SAY ' data naterii ' @ 7 ,40 GET data_n FUNCTION ' d ' RANGE { 01 / 01 / 60 } @ 8 ,10 SAY ' Introducei strada ' @ 8 ,40 GET strada PICTURE REPLICATE (' x ' , 15) @ 9 ,10 SAY ' numrul ' @ 9 ,40 GET nr RANGE 1 , 999 PICTURE @ 10 ,10 SAY ' Introducei localitate ' @ 10 ,40 GET localitate PICTURE REPLICATE (' x ' , 15) FUNCTION READ

114

O comand SAY i o comand GET pot fi grupate, formnd o singur comand : CLEAR @ 10 ,10 SAY ' Introducei un numr ' GET a DEFAULT 0 PICTURE ' 99999 ' READ @ 15 ,10 SAY ' Ai introdus numrul ' ?? a Exemplu: se citesc dou numere strct pozitive, de maxim dou cifre, astfel nct primul numr s fie mai mic dect al doilea, iar suma lor s fie egal cu 11. o prim variant de rezolvare a acestei probleme este reprezentat de urmtorul porgram: SET TALK OFF CLEAR a=0 b=0 ? ' Introducei 2 numere strict pozitive care nsumate s dea 11' @ 10 ,10 SAY ' Introducei primul numr ' GET a PICTURE ' 99 ' VALID a > b @ 11 ,10 SAY ' Introducei al doilea numr ' GET b PICTURE ' 99 ' ; VALID a < b and a + b = 11 and b > 0 READ ? a , ' < '' , b , ' i ' , a , ' + ', b , ' = ' , a + b Acest program testeaz datele introduse de utilizator prin clauza VALID la nivelul comenzilor GET. Dac, din greeal, utilizatorul introduce 11 ca valoare a primului numr, la citirea celui de al doilea numr nu mai exeist nici o posibilitate de a corecta eroare anterioar. Dac se incearc introducerea valorii 0 pentru cel de-al doilea numr (singura care corespunde condiiei a + b = 11), clauza VALID a celei de-a doua comenzi GET se opune acestui lucru ( trebuie ca b> 0 i a < b ). Nu se va permite nici mcar trecerea la cmpul GET anterior pentru a corecta eroarea i a introduce o alt valoare pentru primul numr. Programul trebuie ncheiat printr-o apsare a tastei Esc , dup care se poate reexecuta, pentru introducerea altor valori.

115

Problema aceasta i gsete o rezolvare mai bun prin folosirea unei clauze VALID la nivelul comanzii READ, avnd, spre exemplu, urmtoarea variant de program: SET TALK OFF CLEAR a=0 b=0 ? ' Introducei 2 numere strict pozitive care nsumate s dea 11' @ 10 ,10 SAY ' Introducei primul numr ' GET a PICTURE ' 99 ' VALID a > 0 @ 11 ,10 SAY ' Introducei al doilea numr ' GET b PICTURE ' 99 ' VALID b > 0 READ VALID a < b and a + b = 11 ? a , ' < '' , b , ' i ' , a , ' + ', b , ' = ' , a + b n acest caz, dac pentru primul numr se introduce valoarea 11, iar pentru cel de-al doilea numr valoarea 1, se va reveni n ultimul cmp GET. n acest moment se pot modifica ambele valori ale celor dou variabile, testarea condiiilor a +b = 11 i a < b fcndu-se numai la ieirea din comanda READ. CLEAR a=0 b=0 @ 10 ,10 SAY ' Introducei primul numr ' GET a @ 11 ,10 SAY ' Introducei al doilea numr ' GET b READ && citirea ncepe cu cel de-al doilea numr ?a+b Exemplu: se vor citi patru numere, pozitive, aflate n progresie aritmetic, dup care se va afia suma acestora: SET TALK OFF CLEAR a=0 b=0 c=0 d=0 @ 10 ,10 SAY ' Introducei numr 1 ' GET a PICTURE ' 99 ' VALID a >= 0

116

@ 11 ,10 SAY ' Introducei numr 2 ' GET b PICTURE ' 99 ' VALID b >= 0 @ 12 ,10 SAY ' Introducei numr 3 ' GET c PICTURE ' 99 ' VALID c >= 0 @ 13 ,10 SAY ' Introducei numr 4 ' GET d PICTURE ' 99 ' VALID d >= 0 READ OBJECT 2 TIMEOUT 5 NUMOUSE VALID a + d = b + c COLOR , R+/BG ? ' uma este :' , a + b +c + d Citirea ncepe cu cel de-al doilea numr ( OBJECT 2 ), mouse-ul nu poate fi folosit pentru selectarea cmpurilor ( NOMOUSE ), iar timpul maxim de gndire al utilizatorului este 5 secunde ( TIMEOUT 5 ). Culorile folosite pentru cmpurile GET sunt : cerneal roie pe fond albastru deschis. Condiia ca numerele s fie n progresie aritmetic este dat n clauza VALID a comenzii READ ( a + b = c + d ). Observaie: Afiarea expresiilor are loc implicit pe ecran dar poate fi direcionat i ctre imprimant, dac aceasta este activat prin comanda SET PRINTER ON sau ctre un fiier de tip text. O comand necesar este SET DEVICE. SET DEVICE TO PRINTER/SCREEN/FILE <fis.txt> Comanda direcioneaz efectul comenzilor de afiare ctre imprimant, ecran, sau fiier de tip text. Caracteristicile de culoare ale mediului FoxPro pot fi reinute n fiierul FOXUSER.DBF sub numele unui set de culori. Un set de culori este o combinaie de 24 scheme de culori, fiecare schem descriind un anumit obiect al mediului Fox: ferestre utilizator, fereastra BROWSE, meniuri i submeniuri, zona de mesaje, etc. O schem de culori va avea un numr de perechi de culori (maxim 10) pentru a defini elementele obiectului respectiv. De exemplu, schema de culori pentru fereastra BROWSE va trebui s conin perechile de culori pentru definirea cadrului, a interiorului, a numelui de cmp, a informaiilor selectate, a mesajelor. ntr-o schem, perechile de culori de forma <ink>/<paper> sunt separate prin virgul i au o poziie semnificativ.

117

Setul de culori curent poate fi modificat indicndu-se schema ce se modific prin comanda: SET COLOR OF SCHEME <nr1> TO <lista-per-cul>/SCHEMA <nr2> unde <list-per-cul> specific lista de perechi de culori care vor forma schema cu numr <nr1>. Comanda de salvare pe disc n fiierul FOXUSER a schemei curente sub numele <nume-set>. CREATE COLOR SET <nume-set> ncrcarea unui set de culori din fiierul FOXUSER.DBF, salvat anterior, pentru a desemna setul curent se face prin comanda: SET COLOR SET <nume-set> Crearea unui set de culori precum i salvarea pe disc se poate realiza i interactiv, prin meniul WINDOW/COLOR.

Ordonarea unei baze de date


Multe din cererile de informaii ale utilizatorului unei baze de date necesit parcurgerea ordonat a articolelor. Ordonarea datelor poate fi impus de un timp scurt de regsire a unui anumit articol: o cutare (LOCATE) secvenial se poate face ntr-un timp rezonabil pentru fiiere mici, dar pentru colecii mari de date tipul de rspuns la solicitate poate deveni inacceptabil de lung. Operaia de ordonare presupune compararea articolelor ntre ele i, n funcie de valorile cheilor de ordonare, accesul la un articol naintea altuia. Criteriul de comparare ntre dou articole poate fi cresctor (asimilat cu un operator >) sau descresctor (asimilat cu operatorul >). Aplicat la dou valori ale unei expresii, fiecare corespunznd uneia din nregistrrile bazei de date, criteriul va da ca

118

rezultat adevrat (da, articolele se gsesc n relaia cerut i putem s ne folosim aa cum se gsesc ele ca poziie!) sau fals (nu, articolele nu verific relaia, deci va trebui s facem n aa fel nct s avem acces la cel de-al doilea articol naintea primului !). Operaia de ordonare a unei baze de date se poate face prin dou comenzi SORT i INDEX, pe care le vom prezenta pe rnd. Sortarea datelor SORT TO<fis.dbf>ON<cmp1>[/A][/D][/C] [,<cmp2>[/A][/D][/C] [DESCENDING/ASCENDING] [<domeniu>][FOR <cond>][WHILE <cond>] Comanda rearanjeaz fizic articolele bazei de date active, depunndu-le ntr-o alt baz de date indicat n comand prin clauza TO. Criteriul de ordonare poate fi unul sau mai multe cmpuri ale bazei de date. Pentru fiecare cheie se specific sensul ordonrii. /A=ascending (cresctor) /D=descending (descresctor) /C=se folosete pentru cmpuri de tip ir de caractere pentru a face compararea valorilor acestor cmpuri insensibil la tipul literei (majuscul sau minuscul). Clauzele ASCENDING/DESCENDING se folosesc atunci cnd toate cheile de sortare au acelai sens, fie cresctor, fie descresctor. Dac odat cu clauzele locale de indicare a sensului asupra unei chei apar i cele globale, primele au prioritate. Operaia de rearanjare a articolelor se poate face nu pe ntreaga baz de date (opiune implicit) ci pe o parte a acesteia, parte fixat prin cauzele de selecie <domeniu>, FOR, WHILE. Aranjarea articolelor atunci cnd sunt mai multe chei de sortare se face n modul urmtor: pentru aceleai valori ale primei chei se aranjeaz articolele dup valorile celei de a doua chei. Dac i acum sunt valori egale, se trece la verificarea relaiei date de a treia cheie, .a.m.d. Cheile de sortare nu pot fi cmpuri logice sau tip memo.

119

Exemplu: se ordoneaz baza de date Mijloacef.dbf, cheia de ordonare fiind codul mijlocului fix, iar ordinea cresctoare. Noua bay de date se va numi Mfixe_s.dbf. USE mijloacef LIST SORT TO mfixe_s ON cod / AC USE mfixe_s LIST USE S se obin din aceeai baz de date, lista tuturor mijloacelor fixe care nu sunt n folosin, n ordinea invers a valorii, la valori egale ordinea fiind dat de data instalrii, a punerii n funciune. USE mijloacef LIST SORT TO mfixe_s ON valoare / D, data_inst ASCENDING FOR stare = . F . USE mfixe_s LIST USE Sunt cteva particulariti FoxPro legate de sortare. 1. Comanda SORT are o clauz n plus i anume FIELDS <listcmpuri> prin care se poate descrie structura bazei de date rezultate. 2. O alt particularitate este posibilitatea sortrii tablourilor prin funcia ASORT: ASORT (<tablou>[, <poz>[, <nr>[, <sens>]]]) Se sorteaz elementele tabloului n ordine cresctoare (dac <sens>=0 sau lipsete) sau n ordine descresctoare (dac <sens>0). Pentru a se putea sorta, toate elementele trebuie s fie de acelai tip. Dac masivul este unidimensional, atunci se vor sorta elementele acestuia ncepnd cu elementul de pe poziia <poz>. Parametrul <nr> d numrul elementelor care vor fi supuse operaiei de sortare. Dac acesta lipsete, se vor sorta toate elementele.

120

Indexarea bazelor de date Indexarea presupune crearea unui fiier nou numit fiieridex, asociat bazei de date, n care se memoreaz ordinea nregistrrilor din baza de date. Accesul la baza de date se face prin intermediul acestui fiier index. S lum un exemplu: o baz de date n care avem ncrcate 7 materiale, cu seria, cantitatea i valoarea acestora. Indexarea acestei baze de date, dup valoare, n ordinea cresctoare, presupune crearea fiierului MATERIAL.CDX n care se vor memora poziiile nregistrrilor din baza de date, n ordinea dorit. Accesul la nregistrri se face prin intermediul fiierului index asociat . Indexii pot fi depui: 1. n fiiere simple index, care rein un singur index; ele trebuiesc deschise pentru a avea acces la acesta, fie n vederea parcurgerii ordonate a bazei de date asociate, fie pentru a reflecta i n fiierul index modificrile din baza de date. Dificultatea apare odat cu creterea numrului de astfel de fiiere, care trebuie ntreinute i actualizate. 2. n fiiere multi-index, care pot permite accesul, odat cu deschiderea multifiierului la toi membrii lui. Fiierele multiindex pot fi: a. Asociate bazei de date (au acelai nume i se deschid sau se nchid odat cu baza de date, orice operaie de actualizare asupra bazei reflectndu-se automat i asupra tuturor fiierelor index membre); b. Izolate: au nume propriu diferite de al bazei de date, sunt create prin depunerea unui prim fiier index i gestionate (deschise, actualizate, nchise) prin comenzi explicite. Fiiere index simple: Crearea unui fiier index simplu se face prin comanda INDEX: INDEX ON <exp> TO <fis.ndx> [UNIQUE]

121

Comanda permite crearea unui fiier index cu numele specificat n clauza TO avnd cheia de indexare dat n clauza ON <exp>. Clauza UNIQUE permite evitarea accesului cheii de indexare la articolele cu aceeai valoare. Acelai efect l are i comanda SET UNIQUE ON anterioar unei comenzi de creare (INDEX). Exemplu: crearea unui fiier index simplu pentru baza de date mijloacef.dbf USE mijloacef INDEX ON cod TO mijloace_n NOTE se creaz fiierul index simplu mijloace_n.idx LIST && nregistrrile sunt n ordinea cmpului cod USE Crearea unei etichete ntr-un fiier index compus nestructurat se face astfel: USE mijloacef INDEX ON valoare TAG val_n OF mijloacef_d NOTE se creaz eticheta val_n n fiierul index compus nestructural mijloacef_d.cdx LIST USE Adugarea unei noi etichete la fiierul index anterior: USE mijloacef INDEX ON SUBSTR ( cod, 1, 4 ) + SUBSTR ( denumire ,1 , 4 ) TAG codden OF mijloacef_d; FOR data_inst > { 01 / 01 / 90 } NOTE se adaug eticheta codden la fiierul index mijloacef_d se va prdona dup cod i denumire, doar; Primele patru caractere din aceste cmpuri fiind semnificative. Se selecteaz doar mijloacele; fixe ce s-au instalat dup 1 ianuarie 1990 LIST USE Indexarea unei baye de date folosind un fiier index compus structural, n care se vor introduce patru etichete, corespunztoare ordonrii dup cmpurile bazei de date: USE mijloacef INDEX ON cod TAG tcod INDEX ON valoare TAG tvaloare

122

INDEX ON amortizare TAG tamortizare DESCENDING INDEX ON stare TAG tstare USE nchiderea unui fiier index se face prin nchiderea bazei de date asociat, (USE, CLOSE DATABASES), prin crearea unui alt index (INDEX ON) sau prin comenzi explicite de nchidere: SET INDEX TO CLOSE INDEX

Deschiderea unui fiier index se poate face i odat cu deschiderea bazei de date creia i-a fost asociat, prin indicarea numelui de index n comanda USE. Pentru c prin aceeai comand se pot deschide i alte fiiere index (simple sau multiple), vom nota lista acestora <lista-index> fr s precizm tipul fiierului index. USE <fis.dbf> INDEX <lista-index> ORDER <nume-index> Exemplu: se deschide baza de date mijloacef i odat cu ea o serie de fiiere index create n exemplele precedente. CLOSE ALL NOTE prima etichet din mijloacef.cdx ca fi cea activ, adic ordonarea dup cod LIST USE USE mijloacef INDEX mijloacef_n.idx, mijloacef_d.cdx , mijloacef.cdx ORDER mijloacef_n NOTE se selecteaz ca activ primul fiier index simplu, cheia de indexare fiind cmpul cod LIST USE USE mijloacef INDEX mijloacef ORDER TAG tvaloare NOTE se selecteaz eticheta tvaloare din fiierul index compus structural mijloacef.cdx LIST USE Deschiderea unui fiier index se poate face i prin comanda explicit:

123

SET INDEX TO <lista-index> [ORDER <nume-index>] Exemplu: CLOSE ALL USE mijloacef SET INDEX TO mijloacef ORDER TAG tcod ADDITIVE LIST USE Chiar dac prin comand s-a deschis o list de fiiere index, numai primul din list este considerat principal. Clauza ORDER fixeaz la deschidere fiierul index principal. Schimbarea ordinii de prioritate se face printr-o comand explicit: SET ORDER TO <nume-index>] Exemplu: CLOSE ALL USE mijloacef INDEX mijloacef_n.idx, mijloacef_d.cdx , mijloacef.cdx SET ORDER TO 2 LIST SET ORDET TO codden OF mijloacef_d. LIST USE Comanda permite indicarea indexului principal din lista de indexi deschii. Actualizarea unui fiier index nu se face automat dac acesta nu a fost deschis n momentul actualizrii bazei de date. O actualizare posibil se face fie prin o nou creare a fiierului fie prin comanda REINDEX: REINDEX Pentru o list de fiiere index deschis, comanda permite reactualizarea acestora n funcie de baza de date asociat. Exemplu: USE mijloacef INDEX mijloacef_n. mijloacef_d

124

REINDEX USE Funcii standard relativ la indexare: 1) NDX ([ [<nr-zona>][, <nr-ord>] ]) ntoarce numele fiierului index deschis ntr-o zon specificat prin <nr-zona> (implicit zona ultim selectat) i a crui ordine n lista fiierelor active este <nr-ord>. 2) ORDER ([<nr-zona>]) ntoarce numele fiierului index activ n zona dat prin numrul ei; implicit este zona curent. 3) KEY ([ [<nr-ord>][, <nr-zona>] ]) ntoarce expresia cheii de indexare a fiierului index identificat prin <nr-ord> n lista deschis n zona de lucru indicat prin numrul ei, implicit zona curent. Cutarea rapid i poziionare n baza de date Una din funciile importante ale unui SGBD este accesarea rapid a bazei de date. Cutarea i poziionarea pe un anumit articol se poate face prin mai multe comenzi i funcii. Reamintim comanda LOCATE (caut secvenial un articol care verific o condiie indicat n clauza FOR pe domeniul precizat), CONTINUE (reia cutarea n continuarea fiierului, poziionndu-se pe urmtorul articol care verific condiia), funcia LOOKUP (caut i poziioneaz). Alte posibiliti de cutare rapid sunt dependente de starea de indexare a bazei de date. 1. Comanda FIND permite cutarea ntr-o baz de date indexat a primului articol care are cheia de indexare egal cu expresia de cutare: FIND <expC>/<expC> Cutarea se oprete la primul articol gsit, sau la sfritul fiierului. <exp-ir> din comand este ncadrat obligatoriu de delimitatorii de ir, dac expresia de cutare ncepe cu spaii.

125

2. Comanda SEEK permite cutarea ntr-o baz de date indexat a primului articol care are aceeai valoare a cheii de indexare cu a expresiei din comand: SEEK <exp> Comanda SEEK se execut ntocmai ca i comanda FIND, numai c <exp> de cutare nu mai este neaprat un ir ci poate fi orice variabil, constant sau expresie n general. Cutarea se oprete la primul articol din baza de date care are cheia de indexare egal cu valoarea expresiei dac o astfel de nregistrare exist sau la sfritul fiierului. Exemplu: CLOSE ALL USE mijloacef INDEX mijloacef ORDER tcod SEEK C1 ? FOUND ( ) .T. ? EOF ( ) .F. ? RECNO ( ) 1 ? RECNO ( 0 ) 0 DISPLAY USE

Funcii de test asupra succesului sau insuccesului cutrii sunt. 1) funcia FOUND() (ntoarce .T. dac articolul s-a gsit) 2) funcia EOF() (ntoarce .T. dac articolul nu s-a gsit) 3. Funcii de cutare: SEEK (<exp>[,<nr-zona>/<alias>]) caut prima nregistrare pentru care cheia de indexare este egal cu <exp>. Dac se gsete funcia, ntoarce valoarea .T., iar indicatorul de nregistrri se va poziiona pe nregistrarea gsit. Dac nu se gsete articolul dorit, funcia va

126

ntoarce valoarea .F., iar indicatorul de nregistrare se va afla dup ultimul articol. Funcia SEEK nlocuiete secvena: - .SEEK<exp> - ?.FOUND() Calcule statistice cu datele din bazele de date Scopul principal pentru care sunt create bazele de date l reprezint obinerea ntr-un timp ct mai scurt, a unor informaii cu privire la datele coninute n bazele de date. Aceste informaii pot fi de natur diferit, mai detaliate, sau mai sintetizate, sub form de liste, tabele, sau simple valori, informaii statistice, totalizatoare. Comanda COUNT numr nregistrrile din domeniul specificat prin < domeniu >, FOR i WHILE, depunnd rezultatul n variabila < var >, care va fi creat n cazul cnd nu exist anterior execuiei comenzii. COUNT [TO <var>] [<domeniu>][FOR <cond>][WHILE <cond>] Exemplu: numrarea mijloacelor fixe a cror valoare depete 10000000 se face prin urmtoarea secven de comenzi: CLOSE ALL USE mijloacef COUNT FOR valoare > 10000000 TO nrmijloacef ? n vaza de date avem , nrmijloacef, mijloace fixe ? cu valoare mai mare dect 10000000 n baza de date avem 3 mijloace fixe Cu valoare mai mare dect 10000000 USE Comanda numr articolele din baza de date activ i, dac este prezent clauza TO <var>, depune rezultatul n variabila specificat. Clauzele <domeniu>, FOR, WHILE limiteaz aciunea comenzii. Observaie: Afiarea pe ecran a rezultatelor diferitelor comenzi dBASE (FoxPro) depinde de comutatorul SET TALK ON/OFF. Pentru valoarea OFF se inhib afiarea rezultatelor.

127

Un alt tip de calcul ce se poate efectua asupra unei baze de date este sumarea valorii unor cmpuri numerice, din nregistrrile selectate. Comanda folosit este SUM i are sintaxa: SUM [<lista-exp>] [TO <lista-var>/TO ARRAY <tablou>] [<domeniu>][FOR <cond>][WHILE <cond>] Comanda permite nsumarea valorilor fiecrei expresii n parte pentru toate articolelel bazei de date active din domeniul precizat n <domeniu>, care verific condiia din FOR i/sau condiia din clauza WHILE. Clauza <lista-exp> conine expresii cu cmpuri ale bazei de date active. Rezultatul poate fi afiat direct pe ecran (! atenie la starea comenzii SET TALK!), depus ntr-o list de variabile sau ntr-un tablou (clauza TO ARRAY). Implicit se vor nsuma toate cmpurile numerice ale bazei de date i rezultatele se vor afia pe ecran. Exemplu: avnd baza de date mijloacef.dbf, s se calculeze procentul valoric al amortizrii relativ la valoarea total a mijloacelor fixe: USE mijloacef SUM amortizare TO val_am SUM VALOARE to val_tot ? S-a amortizat , val_am / val_tot * 100, % ? din valoarea total a mijloacelor fixe S-a amortizat 42.33 % din valoarea total a mijloacelor fixe USE O comand asemntoare cu comanda SUM este AVERAGE AVERAGE [<lista-exp>] [TO <lista-var>/TO ARRAY <tablou>][<domeniu>][FOR <cond>][WHILE <cond>] Comanda permite calculul mediei aritmetice a valorilor expresiilor din <lista-exp>, pentru articolele din baza de date activ care se ncadreaz n domeniul precizat i verific condiiile din FOR i WHILE.

128

Clauza <list-expr> conine expresii avnd cmpuri ale bazei de date. Parametrul TO <list-var> conine lista de variabile n care se depun valorile mediilor calculate. Rezultatele pot fi depuse i ntr-un tablou (clauza TO ARRAY). Dac lipsesc toate clauzele, se va face media tuturor valorilor cmpurilor numerice, iar rezultatul se va afia pe ecran (dac SET TALK este ON). Exemplu: s se calculeze valoarea medie a unui automobil folosind datele din baza de date mijloacef. USE MIJLOACEF AVERAGE VALOARE FOR UPPER ( SUBSTR ( cod, 1 , 1 )) = A TO medie ? Valoarea medie a unui automobil: , medie Valoarea medie a unui automobil: 5432000 USE Acelai lucru se poate realiza i folosind comenzile SUM i COUNT, cu ajutorul crora se poate simula comanda AVERAGE: USE MIJLOACEF SUM VALOARE FOR UPPER ( SUBSTR ( cod, 1 ,1 )) = A TO val_tot COUNT FOR UPPER ( SUBSTR ( cod, 1 ,1 )) = A TO nr_auto medie = val_tot / nr_auto ? Valoarea medie a unui automobil: , medie Valoarea medie a unui automobil: 5432000 USE Pentru o serie de calcule financiare i statistice asupra cmpurilor bazei de date se folosete comanda CALCULATE, cu urmtoarea sintax: CALCULATE [<lista-exp>] [TO <lista-var>/TO ARRAY <tablou>][<domeniu>][FOR <cond>][WHILE <cond>] Comanda poate calcula valorile mai multor expresii, pe care le depune ntr-o list de variabile sau ntr-un tablou. Diferena fa de comenzile anterioare const n coninutul expresiilor din <list-exp>.

129

n alctuirea unei expresii pot intra urmtoarele funcii: 1. AVG(<expn>): permite calculul mediei aritmetice a expresiei <expn> ce poate conine cmpuri numerile ale bazei de date active; 2. CNT(): permite numrarea articolelor selectate din baza de date activ; 3. SUM(<expn>): permite nsumarea valorilor expresiei <expn> ce conine cmpuri numerice a bazei de date; 4. MAX(<exp>): extrage cea mai mare valoare a expresiei <expn> calculat pentru fiecare articol selectat al bazei de date active; 5. MIN(<exp>): extrage cea mai mic valoare a expresiei calculat pentru fiecare articol selectat al bazei de date active. Exemplu: s presupunem c avem o baz de date n care am stocat rezultatele unei experiene, valori numerice. Vom lua spre exemplu urmtoarea serie de valori: 13, 47, 35, 9, 89, 123, 75, depozitate n cmpul numr al bazei de date NUMERE.DBF USE numere CALCULATE avg ( numr ) TO media ? Media numerelor este : , media CALCULATE cnt ( ) TO nr_inreg ? Numrul de valori este : , nr_inreg CALCULATE max ( numr ) , min ( numr ) , sum ( numr ) ; TO maxim, minim, suma ? Valoarea maxim este : , maxim ? Valoarea minim este : , minim ? Suma numerelor : , suma CALCULATE npv ( 0.1, numr, 100 ) TO val_p ? Valoarea prezent este : , val_p CALCULATE std ( numr ) TO dev_std, ? Deviaia standard este : , dev_std ? Abaterea ptratic medie este , ab_patr USE Un alt tip de rapoarte obinute dintr-o baz de date este reprezentat de listele totalizatoare. Comnda care realizeaz acest total este urmtoarea:

130

TOTAL ON <cheie> TO <fis.dbf> [FIELDS <lista-cmp>] [<domeniu>][FOR <cond>][WHILE <cond>] TOTAL creaz o nou baz de date numit <fis.dbf> cu aceeai structur ca a bazei de date active. Baza de date activ este parcurs n ntregime i pentru fiecare grup de articole care au aceeai valoare a expresiei <cheie>, se adaug n baza de date <fis.dbf> cte un articol cu cheia unic a grupului i avnd n cmpurile numerice specificate n clauza FIELDS (sau toate cmpurile numerice dac lipsete clauza FIELDS) valoarea nsumat a valorilor fiecrui articol din grup n cmpul respectiv. Exemplu: pentru a afla suma de bani pltit de fiecare persoan din baza de date PLI .DBF, se folosete programul: CLOSE ALL USE pli INDEX ON pltitor TAG pltitor ORDER 1 TOTAL TO totpli ON pltitor SELECT 2 USE totpli LIST SELECT 1 CLOSE ALL Pentru cele trei nregistrri din baza de date, se va genera n baza de date totalizatoare TOTPLI.DBF nregistrarea care va conine suma totalizatoare.

Proceduri i funcii definite de utilizator


Un program structurat este format din uniti funcionale bine conturate, ierarhizate conform naturii intrinseci a problemei, obinut printr-un proces de rafinare treptat a prelucrrilor necesare rezolvrii problemei. Unul din principiile de baz din programarea structurat este programarea descendent. Aceasta presupune descompunerea problemei complexe n subprobleme mai simple, descompunerea

131

continund pn la atingerea unui nivel de dificultate acceptabil. Fiecrei subprobleme i va corespunde cte un modul-program cvasiindependent de celelalte module. Avantajele programrii modulare sunt urmtoarele: a. structura problemei determin o definire precis a funciilor fiecrui modul, fapt ce diminueaz probabilitatea apariiei erorilor de logic n rezolvarea problemei; b. scrierea programului i punerea lui la punct se face mai simplu i mai rapid, deoarece modulele se pot realiza simultan, fiecare de ctre alt persoan; c. modificarea sau extinderea programului se face mai uor, prin modificarea sau scrierea unor module noi; d. fiecare modul se poate scrie n limbajul de programare cel mai avantajos n raport cu funcia sa. Modulele sau unitile funcionale pot fi: subprograme, proceduri i funcii. Vom examina fiecare tip de modul n parte:

Proceduri i funcii
sunt uniti funcionale de program tratate ca fiiere cu extensia .PRG. Se construiesc cu orice editor de texte. Apelarea editorului de programe se poate face prin comanda: MODIFY COMMAND <fis.prg> Lansarea n execuie a unui subprogram se face prin DO: DO <fis.prg> Comanda caut fiierul specificat, l deschide i, dup execuia comenzilor, naintea revenirii n programul apelant, l nchide. O procedur reprezint un grup de instruciuni ce primete de la programul apelant un grup de parametrii, realizeaz anumite prelcrri, dup care se revine n programul apelant. O procedur definit de utilizator nu poate intra n alctuirea unei expresii ca

132

operand. Trebuie s se fac distincie ntre definiia funciei sau procedurii i apelul acesteia. La definirea unei funcii sau proceduri se stabilesc prelucrrile ce au loc n interiorul ei, parametrii care se primesc spre prelucrare i rezultatele ce se vor transmite dup prelucrare. La apelul unei funcii sau proceduri apare doar numele care identific respectiva funcie sau procedur, nsoit eventual de lista parametrilor ce se vor transmite. Variabilele definite n interiorul funciilor i procedurilor sunt cunoscute doar n acest interval, n sensul c pentru programul ce apeleaz funcia sau procedura, aceste variabile nu exist. O procedur ncepe cu comanda PROCEDURE i conine o serie de comenzi executate pn la ntlnirea unei comenzi de sfrit (RETURN, CANCEL, RETRY) sau pn la o nou comand PROCEDURE. Definirea unei proceduri se face prin comanda: PROCEDURE <nume-procedur> Apelul unei proceduri se face tot prin comanda DO prin care se lanseaz n execuie programe sau subprograme: DO <nume-procedur> Revenirea n programul apelant se poate face prin comenzile RETURN, CANCEL, RETRY. Comanda RETURN poate avea clauza TO MASTER care ntoarce controlul n programul principal. RETURN [TO MASTER] Comanda CANCEL foreaz renunarea la toate unitile program intermediare i revenirea la prompterul sistemului dBASE (FoxPro): CANCEL Comanda RETRY permite revenirea chiar la instruciunea de apel a procedurii i nu dup aceasta, ca n cazul comenzii RETURN:

133

RETRY O funcie reprezint un grup de instruciuni independent, care primete un set de parametrii de la programul apelant i i returneaz acestuia o valoare carezultat al prelucrrilor asupra parametrilor transmii. O funcie definit de utilizator poate intra n componena unei expresii ca operand. Definirea unei funcii se face prin comanda FUNCTION: FUNCTION <nume-functie> Apelul pentru execuia funciei se face prin numele acesteia n cadrul unei expresii. La execuie, n locul identificatorului se va introduce valoarea returnat de funcie ca rezultat al prelucrrilor sale. Comunicarea rezultatului funciei se face prin comanda RETURN prezent n corpul funciei: RETURN <expr>

Transferul parametrilor la i de la module de program


n mod uzual, comunicarea ntre unitile funcionale ale unui program se face prin intermediul parametrilor. Parametrii permit ca la fiecare activare a unui modul, acesta s opteze cu entiti care se cunosc doar n momentul apelului. Deoarece valorile acestea difer de la un apel la altul, iar operaiile care li se aplic sunt aceleai, rezult c instruciunile subprogramului vor trebui s se refere la entiti exprimate simbolic, aa numiii parametri formali. La activarea modulului se specific parametrii actuali, sau efectivi. Declararea parametrilor PARAMETERS: formali se face prin comanda

134

PARAMETERS <lista-var> Aceast comand , care trebuie s fie prima comand a unui modul, definete lista de variabile locale care vor prelua parametrii transmii de la programul apelant. Lista variabilelor locale trebuie s aib ntotdeauna mai multe elemente ( sau cel mult egal ) dect lista parametrilor transmii, pentru ca fiecare parametru s aib un corespondent n subprogram. Exemplu: SET TALK OFF CLEAR a = 14 b = 37 ? a , + , b , = , suma ( a , b ) c = 12 d = 17 prod = 0 DO produs WHIT c , d , prod ? c , + , d , = , prod FUNCTION suma PARAMETERS a 1, a 2 RETURN a 1 + a 2 PROCEDURE produs PARAMETERS a 1, b 1, c 1 c1 = a 1 + b 1 RETURN Parametrii formali sunt variabile locale unitii funcionale. Transmiterea parametrilor actuali se face prin comenzi de apel. Apelul unei proceduri se face prin comanda DO care va avea clauza WITH. DO <identif> WITH <lista-exp> Apelul unei funcii se face ntr-o expresie, parametrii fiind pui ntre parantezele specifice funciei:

135

<nume-functie>(<lista-exp>) Corespondena ntre parametri se face prin poziia n lista de parametrii din programul apelat i din comanda de apel. Exemplu: SET TALK OFF CLEAR DO cadru @ 12, 32 SAY mesaj ( ) READ CLEAR FUNCTION mesaj RETURN nvm FoxPro PROCEDURE cadru @ 10 , 10, 14, 70 BOX n acest exemplu DO cadru determin execuia procedurii cadru, definit dup PROCEDURE cadru, iar mesaj ( ) este construcia de apelare a funciei mesaj, definit prin linia care urmeaz comenzii FUNCTION mesaj. S lum urmtorul exemplu: calculul combinrilor, care se realizeaz pe baza formulei: n! Cnk = ----------------------k! *(nk)! Calculul factorialului n ! = 1 * 2 *..*n se face cu urmtoarea secven de instruciuni: n=6 FACT = 1 FOR i = 1 TO n FACT = FACT * 1 ENDFOR Pentru calculul combinrilor, aceast secven se va repeta de trei ori, unde pe poziia lui n, vom avea pe rnd n, k, n k. Programul pentru calculul combinrilor va fi:

136

n=6 k=3 FACT1 = 1 FOR i = 1 TO 6 FACT = FACT * 1 ENDFOR FACT2 = 1 FOR i = 1 TO k FACT = FACT * 1 ENDFOR FACT3 = 1 FOR i = 1 TO n - k FACT = FACT * 1 ENDFOR COMBIN = FACT1 / FACT 2 / FACT 3 Acest mod de scriere a unui program este ineficient pentru c acelai grup de instruciuni este scris de trei ori. n situaii ca acestea, pentru scrierea programului se folosesc funciile i procedurile definite de utilizator. Folosind pentru calculul factorialului o funcie, programul de calcul al combinrilor va cpta urmtoarea form: n=6 k=3 COMBIN = FACT( n ) / FACT ( k ) / FACT ( n k ) FUNCTION FACT PARAMETERS n FACT = 1 FOR i = 1 TO n FACT = FACT * 1 ENDFOR RETURN FACT Primele trei linii reprezint programul propriu-zis de calcul al combinrilor. n acesta se face de trei ori apel la funcia FACT ( ), care este definit n urmtoarele sapte linii de program.

137

Variabile globale i locale


Variabilele definite ntr-o unitate program prin STORE, INPUT, etc. Exist n memorie atta timp ct programul este n execuie, fiind terse automat la terminarea acestuia. Spunem c variabilele sunt locale sau private. Variabilele locale sunt recunoscute n subprogramele, procedurile sau funciile apelate din unitatea program care a definit variabilele, dar nu vor putea fi folosite n unitile aflate pe acelai nivel sau superioare. n vederea comunicrii cu uniti funcionale superioare, variabilele se declar ca fiind globale sau publice. Declararea variabilelor publice, cele care vor fi recunoscute n toate unitile programului respectiv, se face prin comanda: PUBLIC [ARRAY] <lista-var> Variabilele simple se enumer n <lista-var> fr s apar clauza ARRAY. Exemplu: SET TALK OFF CLEAR PRIVATE a PUBLIC b a=1 b=2 DO test NOTE aici se cunosc variabilele a , b , c dar nu se cunoate variabila c ?a=,a ?b=,b ? d= , d PROCEDURE test PRIVATE c PUBLIC d c=3 d=4

138

NOTE aici se cunosc toate variabilele: a , b,c,d ?a=,a ?b=,b ?c=,c ?d=,d Statutul implicit al unei variabile este privat. Modificarea unei variabile private nu afecteaz valoarea variabilelor cu acelai nume din alte programe. Sunt situaii ns cnd o unitate funcional a fost conceput de alt persoan, sau n alt moment de timp i ea folosete ca nume de variabile exact variabilele declarate public n alte uniti program. Nu are rost s schimbm numele variabilelor, peste tot unde apar: soluia este s le declarm private. Declararea variabilelor locale unei uniti funcionale se face prin comanda: PRIVATE <lista-var> / ALL LIKE / EXCEPT <salon> Declararea variabilelor se poate face prin enumerarea lor n <lista-var>. Clauza ALL LIKE permite declararea privat a tuturor variabilelor care verific un anumit <ablon>. Clauza ALL EXCEPT declar locale toate variabilele definite n programul respectiv cu excepia celor care verific <ablon>. Observaii : n FoxPro sunt cteva particulariti legate de proceduri: 1. Pentru a determina cutarea unei proceduri numai ntr-un anumit fiier, acesta se va include n clauzan a comenzii: DO <nume-proc>n <fisier> 2. Folosirea unei variabile cu acelai nume n diferite pri ale unui program, este permis dac se declar regiunile programului cu comanda REGION: #REGION <numar>

139

O regiune a programului ine pn la o nou declarare REGION sau pn la sfritul programului. Comanda REGIONAL declar variabilele dintr-o list ca fiind locale unei regiuni. REGIONAL <lista-variabile> Exemplu: # REGION 1 REGIONAL a && prima regiune a=1 ?a # REGION 2 REGIONAL a && a doua regiune a=2 ?a n acest exemplu se folosesc dou variabile cu acelai nume, a , acestea fiind definite ca regionale, n regiuni diferite. Deci comenzile a = 1 i a = 2 se refer la variabile distincte.

Meniuri
n tendina general de mbuntire a interfeelor cu utilizatorul ale aplicaiilor soft dezvoltate n ultima perioad se nscrie i nzestrarea acestora cu meniuri, dintre cele mai diverse i mai performante. Alturi de ferestre, meniurile dau Windows-ului, n general, i FoxPro ului, n particular, o putere deosebit, att datorit eficienei i comoditii cu care se lucreaz cu aceste elemente, ct i datorit aspectului deosebit de plcut pe care cele dou elemente l ofer programelor de aplicaie i mediului FoxPro. Meniul reprezint un element de interfa prin care se ofer utilizatorului posibilitatea executrii unei anumite opiuni, dintr-o mulime finit de aciuni posibile, afiat pe ecran total sau parial, urmnd ca, n funcie de selectarea fcut, s se declaneze anumite aciuni, corespunztoare opiunii alese.

140

Un meniu este format dintr-o bar a meniului i mai multe submeniuri. Bara meniului conine la rndul ei mai multe opiuni, numite opiuni de bar, fiecreia dintre acestea putndu-i-se ataa un submeniu. Fiecare submeniu este format la rndul su din opiuni. Modul de lucru cu submeniurile definite de utilizator este urmtorul: - mai nti se definete meniul respectiv, prin urmtoarele etape: - definirea barei meniului; - definirea opiunilor bar; - definirea submeniurilor; - definirea opiunilor; - definirea aciunilor ce se execut la alegerea unei opiuni sau a unei opiuni bar a meniului; - se activeaz meniul, urmnd a se selecta de ctre utilizator opiunea dorit; - se efectueaz diferite operaii specifice meniului ( afiare, ascundere, etc. ); - n final se elimin meniul din memorie, aceasta nsemnnd sfritul lucrului cu acest element.

Comenzi pentru lucrul cu meniuri


Definirea barei unui meniu se face prin intermediul comenzii DEFINE MENU: DEFINE MENU < nume meniu > [ BAR [ AT LINE < expN1 > ]] [n [ WINDOW ] < nume fereastr > | n SCREEN ] [ KEY < etichet tast > ] [ MARK < expC1 > ] [ MESSAGE < expC2 > ] [ NOMARGIN ] [COLOR <list perechi culori> |COLOR SCHEME <expN2> ]

141

barei meniului I se atribuie un nume, < nume meniu >, urmnd ca n continuare acest element s fie identificat prin numele atribuit. Clauza BAR se folosete cu scopul de a prelua caracteristicile noii bare de meniu de la cea a meniului sistem al FoxPRO ului. Urmtoarele aspecte sunt caracteristice meniului sistem: - dup alegerea unei opiuni bara de meniu se dazactiveaz; - bara de meniu va acoperi o singur linie a ecranului sau a ferestrei n care este plasat, de la un capt la altul; - poziia submeniurilor va fi stabilit de FoxPro, n mod automat; - dac bara va avea dimensiuni mai mari dect ecranul sau fereastra n care s-a introdus , se va folosi metoda defilrii pentru accesarea opiunilor bar. Clauza AT LINE determina afiarea barei meniului pe linia cu numarul expN1 a ecranului sau a ferestrei respective.Clauzelen WINDOW sin SCREEN sunt folosite pentru a specifica locul unde va fi plasata bara meniului: -n fereastra nume fereastra,dacn comanda se include cauzan WINDOW; -n fereastra curent,dac aceasta ezista si n camand nu este prezent nici una din cele dou clauze; -in ecranul FoxProW dac se precizeaz clauzan SCREEN sau nu se specific nici una din cele dou clauze,iar ieirea curent este direcionat spre ecran. Clauza MESSAGE determin afiarea irului de caractere < expC > pe ultima linie a ecranului, n centrul acestuia sau n barea de stare de la partea inferioar a ferestrei, dac aceasta exist. Clauza este nfluenat de comanda SET MESSAGE. Opiunile bar ameniului vor fi afiate una dup alta, pe bara meniului, acestea fiind separate prin blancuri. Eliminarea blancurilor separatoare se face introducnd clauza NOMARGIN n comanda DEFINE MENU respectiv. Clauza COLOR i COLOR SCHEME controleaz culorile folosite pentru afiarea meniului. Implicit, afiarea meniului se va

142

face folosind culorile schemei 2 de culori, Meniuri definite de utilizator, pentru folosirea altei cheme folosindu-se una dintre cele dou clauze COLOE i COLOR SCHEME. Dup definirea unei bare a meniului trebuie s definim opiunile bar care vor aparine barei respective, aceasta relizndu-se cu comanda DEFINE PAD: DEFINE PAD < opiune bar > OF < nume meniu > PROMPT < expC1 > [ AT < linie >, < coloan >] [ BEFORE <opiune bar2> | AFTER < opiune bar3 >] [ KEY < etichet tast > [ , < expc2 > ]] [ MARK < expc3 > ] [ SKIP [ FOR < expL > ]] [ MESSAGE < expc4 > ] [ COLOR < list perechi culori > | COLOR SCHEME < expn > ] Numele opiunii bar va fi < opiune bar >, iar bara de meniu de care aceasta va aparine va fi < nume meniu >. Textul care va fi afiat pe bara meniului va fi cel dat de clauza PROMPT, adic irul de caractere < expC1 >. Stabilirea unei taste directe de alegere a opiunii bar respective se realizeaz prin plasarea combinaiei \ < naintea caracterului ce va desemna tasta direct, n textul clauzei PROMPT. Exemplu: .. PROMPT \ < Stergere .. Va defini un text a unei opiuni bar, Stergere , n care tasta direct de alegere va fi S . Dac n textul clauzei PROMPT caracterul selectat care reprezint tasta direct nu este primul de acest tip, atunci ca tast direct de alegere va fi aleas prima apariie a caracterului respectiv din ir. Exemplu: . PROMPT Alb\ < astru . n acest caz vom avea textul Albastru n care A va reprezenta tasta direct de alegere ( de fapt selectarea se poate face att prin tastarea lui A ct i tastarea lui a ). Clauza AT determin poziia de pe ecran sau fereastra unde va fi afiat opiunea bar respectiv: linia va fi desemnat prin <

143

linie >, iar coloana prin <coloan>. n felul acesta se pot opine att meniuri verticale i orizontale, ct i alte genuri de meniuri, neregulate. n cazul n care clauza AT lipsete, afiarea opiunilor bar se va face ncepnd de la linia 0, coloana 0, una dup alta, pe direcia orizontal. Clauza AT nu se poate folosi pentru o bar a meniului definit cu clauza BAR ( acestea sunt ntotdeauna orizontale, iar poziia opiunilor bar este controlat automat de ctre FoxPro ). Ordinea de apariie i selectarea opiunilor bar ale unui meniu este dat de ordinea definirii acestora prin comenzile DEFINE PAD corespunztoare. Dac dup definirea unui numr de opiuni bar se dorete inserarea uneia noi ntre cele definite anterior, se folosete una dintre clauzele BEFORE sau AFTER. Clauza BEFORE determin nserarea lui < opiune bar1 > imediat nainte de < opiune bar2 >, iar clauza AFTER determin nserarea lui < opiune bara1 > imediat dup < opiune bar3 > . Exemplu: DEFINE MENU test DEFINE PAD opt1 OF test PROMPT ' Opt \ < 1 ' DEFINE PAD opt2 OF test PROMPT ' Opt \ < 2 ' DEFINE PAD opt3 OF test PROMPT ' Opt \ < 3 ' Acelai lucru se poate obine cu una din urmtoarele secvene: DEFINE MENU test DEFINE PAD opt1 OF test PROMPT ' Opt \ < 1 ' DEFINE PAD opt3 OF test PROMPT ' Opt \ < 3 ' DEFINE PAD opt2 OF test PROMPT ' Opt \ < 2 ' BEFORE opt3 Sau DEFINE MENU test DEFINE PAD opt1 OF test PROMPT ' Opt \ < 1 ' DEFINE PAD opt3 OF test PROMPT ' Opt \ < 3 ' DEFINE PAD opt2 OF test PROMPT ' Opt \ < 2 ' AFTER opt1 test: Opt 1 Opt 2 Opt 3 clauza KEY se folosete pentru definirea unei ci directe de alegere a opiunii bar respective. Calea direct de alegere reprezint o combinaie de taste care acionate la un moment dat, determin

144

alegerea opiunii respective. Combinaia de taste va fi desemnat printr-o etichet, < etichet tast >. O opiune bar care este prevzut cu o cale direct de alegere va fi afiat avnd la dreapta ei eticheta respectiv. Dac se dorete inhibarea acestei afiri, sau afiarea unui alt text n locul etichetei, se va folosi irul de caractere < expC2 > care poate conine : - textul de afiat n dreapta opiunii bar, sau - poate fi irul vid, cnd se dorete suprimarea afirii cii directe alturi de opiunea bar. Exemplu: DEFINE PAD opt1 OF test PROMPT ' Opt \ < 1 ' KEY Ctrl + H, ^H Opt 1 ^H Opt 2 Opt 3 Pentru stabilirea condiiilor de accesare a unei opiuni bar se folosete clauza SKIP. Dac aceast clauz se folosete fr FOR, optiunea bar respectiv nu va putea fi accesat, adic ea este dezactivat. De asemenea dezactivarea unei opiuni bar se poate face prin plasarea caracterului \ naintea textului din clauza PROMPT. Clauza MESSAGE determin afiarea textului din irul < expC4 > ct timp opiunea bar respectiv este selectat. Afiarea mesajului este controlat de comanda SET MESSAGE. Exemplu: comenzile urmtoare sunt echivalente: DEFINE PAD opt1 OF test PROMPT \ Alea DEFINE PAD opt1 OF test PROMPT \ Alea SKIP Clauzele COLOR i COLOR SCHEME specific culorile folosite pentru afiarea opiunii bar, implicit folosindu-se schema de culori 2. Exemplu : vom defini bara de meniu de mai jos: Modificare Adugare ^N tergere Listare Vizualizare Ieire ^ K

145

n care opiunile mai terse sunt dezactivate, literele subliniate reprezint taste directe de alegere, ^N , ^K reprezint ci directe de alegere. DEFINE MENU aciune DEFINE PAD mod OF aciune PROMPT \ < Modificare DEFINE PAD adaug OF aciune PROMPT \ < Adugare KEY Ctrl + N , ^N DEFINE PAD sterg OF aciune PROMPT \ < tergere SKIP BEFORE adaug DEFINE PAD listare OF aciune PROMPT \ < Listare DEFINE PAD viz OF aciune PROMPT \ < Vizualizare DEFINE PAD ies OF aciune PROMPT \ < Ieire KEY Ctrl + X, ^ K AFTER viz Submeniurile se definesc prin comanda DEFINE POPUP : DEFINE POPUP < nume submeniu > [ FROM < linie1 >, < coloan1 > ] [ TO < linie2>, < coloan2> ] [n [WINDOW] <nume fereastr > | n SCREEN ] [ FOOTER <exp C1 > ] [ TITLE < expC2 > ] [ KEY < etichet tast > ] [ MARGIN ] [ MARK <expC3 > ] [ MESSAGE <expC4 > ] [ MOVER ] [ MULTISELECT ] [ PROMPT FIELD <expr> | PROMPT FILES [LIKE <masc>] | PROMPT STRUCTURE] [ RELATIVE ] [ SCROLL] ]SHADOW ] [ COLOR <list perechi culori > | COLOR SCHEME <expN>]

146

Un submeniu reprezint o list de opiuni care pot fi de urmtoarele tipuri: -opiuni definite de utilizator ( prin comenzi DEFINE BAR ); -opiuni calculate pe baza coninutului unor nregistrri ale unei baze de date ( PROMPT FIELD ) -cmpuri ale unei baze de date ( PROMPT STRUCTURE ); -o list de fiiere dintr-un anumit director, de pe un anumit disc ( PROMPT FILES ). Numele submeniului va fi < nume submeniu >. Poziia acestuia pe ecran sau ntr-o fereastr va fi dat de clauza FROM, n care < linie1 >, < coloan1 > indic poziia colului din stnga sus al submeniului. Dac aceast clauz lipsete, submeniul va fi plasat n colul din stnga sus al ecranului FoxPro sau al ferestrei active, n poziia 0,0 Clauza TO este folosit pentru a indica poziia colului din dreapta jos al submeniului, prin coordonatele < linie2 >, < coloan2 >, acestea determinnd i mrimea submeniului pe ecran. n cazul cnd aceast clauz lipsete, FoxPro va calcula automat dimensiunea submeniului. Pentru ca submeniul s fie plasat ntr-o fereastr definit de utilizator, numele acesteia, < nume fereastr >, va fi inclus n clauzan WINDOW. Dac aceast clauz lipsete, submeniul va putea fi introdus ntr-o fereastr n cazul cnd ieirea este direcionat ctre acea fereastr ( fereastra curent ) i n comanda DEFINE POPUP nu s-a inclus clauzan SCREEN. Submeniul va fi plasat pe ecranul FoxPro dac este prezent clauzan SCREEN sau dac nu s-a specificat nici clauzan WINDOW i nici clauzan SCREEN i ieirea este direcionat spre ecran. Clauza TITLE se folosete pentru afiarea textului dat de irul < expC2 >n centrul laturii superioare a chenarului submeniului, iar clauza FOOTER permite afiarea textului din irul < expC! > n latura inferioar a chenarului submeniului. Clauza KEY se folosete n scopul de a specifica o cale direct pentru activarea submeniului, cale dat de eticheta < etichet tast >. Ct timp submeniul este activat se poate afia un text explicativ, un mesaj, pe ultima linie a ecranului sau a ferestrei respective. Mesajul este dat prin < expC4 > , expresie de tip ir de

147

caractere, inclus n clauza MESSAGE. Clauza aceasta este controlat de comanda SET MESSAGE. Clauza MARGIN se include n comand pentru ca opiunile s fie separate de chenar printr-un spaiu suplimentar, la dreapta i la stnga acestora. MOVER este o clauz ce permite rearanjarea opiunilor ntrun submeniu, cnd acesta este activat. n prezena acestei clauze, opiunile submeniului vor avea n dreapta lor caracterul | indicnd posibilitatea de mutare a acestora. Clauza MOVER nu are efect n cazul submeniurilor create cu PROMPT. O alt posibilitate a submeniului este cea a seleciilor multiple, adic posibilitatea utilizatorului de a selecta mai mult de o opiune. Fiecare dintre opiunile selectate va fi marcat n stnga ei, cu un caracter de marcaj. Aceast facilitate este condiionat de prezena clauzei MULTISELECT n comanda DEFINE POPUP. Modul de selectare a mai multor opiuni depinde de comanda SET KEYCOMP. Dup realizarea unei multiselectri, testarea n program a selectrii unei opiuni a unui submeniu se realizeaz cu funcia MRKBAR(). Clauza MULTISELECT nu poate fi folosit n acelai timp cu clauza PROMPT. Tipul de submeniu va fi determinat de clauza PROMPT. Dac acest clauz lipsete, opiunile submeniului urmeaz a fi definite cu comenzi de tipul DEFINE BAR. n cazul clauzei PROMPT FIELD opiunile submeniului vor fi preluate dintr-o baz de date deschis ntr-una din zonele de lucru, pentru fiecare nregistrare cte o opiune. La activarea submeniului se va selecta automat zona de lucru respectiv. Expresia < expr > va determina modul de obinere a unei opiuni din nregistrarea corespunztoare. Aceast expresie poate conine cmpuri ale bazei de date deschis n alt zon de lucru, n care se poate aplica operatorul de concatenare. Numrul maxim de opiuni ale unui submeniu creat dintr-o baz de date este nelimitat. Exemplu: CLEAR USE agenda DEFINE POPUP ag FROM 10 ,10 TO 20 , 23 MARGIN ; PROMPT FIELD SUBSTR ( nume, 1 ,4 ) + + SUBSTR ( prenume, 1 , 4 ) ACTIVATE POPUP ag && se activeaz meniul

148

CLEAR POPUPS && se terge submeniul definit USE Cea de-a treia comand a exemplului definete un submeniu numit ag, ale crui opiuni se obin din primele patru caractere ale cmpurilor NUME i PRENUME, concatenate, cu un blanc ntre ele. Pentru ca opiunile submeniului s reprezinte fiiere de pe un disc, dintr-un anumit dosar, se folosete clauza PROMPT FILES. Exemplu: se va defini un submeniu n care se vor afia toate bazele de date din rdcina discului A: DEFINE POPUP test FROM 10, 10 MARGIN PROMPT FILES A: \ *. DBF ACTIVATE POPUP test CLEAR POPUPS Clauza SCROOL are ca efect afiarea unei bare de derulare verticale, pe latura dreapta a chenarului submeniului, cnd nu pot fi afiate simulta n submeniu toate opiunile. Pentru definirea opiunilor uni submeniu, ce a fost definit anterior cu o comand DEFINE POPUP, vom folosi comanda DEFINE BAR, cu sintaxa: DEFINE BAR < expN1 > | < nume opiune sistem > OF < nume submeniu > PROMPT < expC1 > [ BEFORE < expN2 > | AFTER < expN3 > ] [ KEY <etichet tasta > [ , < expC2 > ]] [ MARK < expC43> ] [ MESSAGE <expC4 > ] [ SKIP [ FOR < expL > ]] [ COLOR < list perechi culori > | COLOR SCHEME < expN > ] Definirea opiunilor ntr-un submeniu se face asemntor cu definirea opiunilor bar, ntr-o bar a unui meniu , ca urmare comenzile DEFINE BAR i DEFINE PAD sunt asemntoare. Datorit acestui lucru, vom prezenta doar diferenele dintre cele dou comenzi. Pentru fiecare opiune a unui submeniu se va introduce cte o comand DEFINE BAR. Identificarea opiunilor ntr-un submeniu se face prin poziia acesteia n cadrul submeniului.

149

n cadrul comenzii DEFINE BAR referirea la o opiune se face prin < expN1 >, aceasta desemnnd opiune cu numrul de ordine < expN1 > a submeniului < nume submeniu >. n cadrul submeniului definit de utilizator pot intra ca opiuni i cele ale meniului sistem, aceast variant fiind desemnat n comanda DEFINE BAR prin < nume opiune sistem>. Prin clauza PROMPT se specific textul ce va fi afiat pe poziia opiunii n submeniul respectiv. n irul de caractere < expC1> ce desemneaz textul respectiv, se pot introduce combinaiile \ < , pentru desemnarea unei taste directe de alegere, sau \ pentru a indica o opiune dezactivat. Spre deosebire de comanda DEFINE PAD, irul de caractere al clauzei PROMPT al comenzii DEFINE BAR, poate fi de forma \_ , indicnd c pe poziia opiunii respective se va introduce o linie de separare a opiunilor, permind astfel gruparea logic a acestora. Clauzele BEFORE i AFTER sunt urmate de expresii numerice indicnd naintea creia, respectiv dup ce opiune va fi introdus noua opiune a submeniului. Aceste clauze nu pot fi folosite dect n prezena clauzei RELATIVE n comanda de creare a submeniului. n expresiile numerice ale acestor clauze pot fi incluse i variabilele sistem _ MFIRST i _MLAST, indicnd primul i, respectiv, ultimul articol dintr-un submeniu. Exemplu: se va defini urmtorul submeniu: Albastru .. Verde Rou Negru Alb Galben DEFINE POPUP culori FROM 6 , 10 MULTISELECT DEFINE BAR 1 OF culori PROMPT DEFINE BAR 2 OF culori PROMPT DEFINE BAR 3 OF culori PROMPT TO 14, 21 MARGIN Alb\<astru \<Verde SKIP \<Rou

150

DEFINE BAR 4 OF culori PROMPT DEFINE BAR 5 OF culori PROMPT DEFINE BAR 6 OF culori PROMPT DEFINE BAR 7 OF culori PROMPT ACTIVATE POPUP culori CLEAR MENUS

\_ \<Negru \<Alb SKIP \<Galben

Definirea unei bare de meniu sau a unui submeniu nu este suficient pentru lucrul cu aceste elemente. Mai este necesar i afiarea i activarea lor, n acest mod bara de meniu sau submeniul aprnd pe ecran i cursorul trecnd pe una din opiunile elementului respectiv. Afiarea i activarea unei bare de meniu se face cu comanda ACTIVATE MENU. ACTIVATE MENU < nume meniu > [ NOWAIT ] [ PAD < nume opiune bar > ] Comanda afieaz i activeaz bara < nume bar >, selectnd iniial prima opiune bar. pentru selectarea iniial a altei opiuni bar se va folosi clauza PAD n care se va specifica opiunea bar dorit. Clauza NOWAIT determin continuarea execuiei programului dup afiarea i activare barei de meniu ( n mod normal programul se oprete, ateptnd selectarea unei opiuni bar ). Bara de meniu va rmne activ, utilizatorului dndu-i-se posibilitatea selectrii unei opiuni bar ori de cte ori programul ateapt introducerea unor date de la tastatur. Exemplu: CLEAR DEFINE MENU domeniu DEFINE PAD fizica OF domeniu PROMPT \<Fizica DEFINE PAD chimie OF domeniu PROMPT \<Chimie DEFINE PAD literat OF domeniu PROMPT \<Literatura DEFINE PAD sport OF domeniu PROMPT \<Sport ACTIVATE MENU domeniu PAD sport NOWAIT

151

@ 10, 10 SAY domeniu GET dom DEFAULT READ CLEAR DEACTIVATE MENU domeniu Fizica Sport Chimie Literatura

domeniu Analog afirii i activrii barei de meniu se face i afiarea i activarea submeniului. n acest caz folosindu-se comanda ACTIVATE POPUP, cu sintaxa: ACTIVATE POPUP < nume submeniu > [ AT < linie >, <coloan > ] [ BAR < expN > ] [ NOWAIT ] [ REST ] Aceast comand va afia i activa submeniul < nume meniu > , la coordonatele specificate n clauza AT, < linie > i < coloan >. Exemplu: bara de meniu domeniu, definit i activat n exemplul anterior, o vom defini acum sub forma unui submeniu: DEFINE POPUP domeniu FROM 10 , 10 MARGIN DEFINE BAR 1 OF domeniu PROMPT \<Fizica DEFINE BAR 2 OF domeniu PROMPT \<Chimie DEFINE BAR 3 OF domeniu PROMPT \<Literatura DEFINE BAR 4 OF domeniu PROMPT \<Sport ACTIVATE POPUP domeniu BAR 4 NOWAIT AT 2, 5 @ 10, 10 SAY domeniu GET dom DEFAULT READ CLEAR DEACTIVATE POPUP domeniu

152

Fizic Chimie Literatur Sport domeniu Observm analogiile dintre cele dou exemple , care practic realizeaz acelai lucru, difernd doar formatul de afiare. Afiarea pe ecran sau n fereastra activ , a barelor de meniu sau a submeniurilor fr activarea acestora, se realizeaz cu comenzile SHOW MENU I SHOW POPUP cu urmtoarele sintaxe: SHOW MENU < nume meniu1 > [ , < nume meniu2 > ] | ALL [ PAD < nume opiune bar > ] [ SAVE ] realizeaz afiarea barelor de meniu enumerate n lista ce urmeaz comenzii, sau a tuturor barelor de meniu, dac n locul listei se folosete clauza ALL. Pentru afiarea unei opiuni bar ca fiind selectat, aceasta se specific prin clauza PAD. Pentru reinerea imaginii bar de meniu pe ecran, fr activarea acesteia, se folosete clauza SAVE n comanda SHOW MENU. Aceast imagine va putea fi tears prin comanda CLEAR. Pentru afiarea submeniurilor vom folosi comanda SHOW POPUP. SHOW POPUP < nume submeniu1 > [ , < nume submeniu2 > ] | ALL [ SAVE ] funcionarea acesteia fiind identic cu cea a comenzii anterioare. Comanda HIDE MENU:

153

HIDE MENU < nume meniu1 > [ , < nume meniu2 > ] | ALL [ SAVE ] ascunde barelor de meniu enumerate n lista ce urmeaz comenzii, sau a tuturor barelor de meniu, dac n locul listei se folosete clauza ALL, dar nu le elimin din memorie. Comanda HIDE POPUP : HIDE POPUP < nume submeniu1 > [ , < nume submeniu2 > ] | ALL [ SAVE ] ascunde submeniu enumerate n lista ce urmeaz comenzii, sau a tuturor barelor de meniu, dac n locul listei se folosete clauza ALL legtura dintre barele de meniu i submeniuri este de o importan deosebit pentru realizarea de meniuri complexe. O simpl bar de meniu sau un simplu meniu se poate folosi independent n program ca orice alt meniu, dar majoritatea aplicaiilor necesit meniuri mai complexe, care se obin prin mbinarea acestor elemente. O prim modalitate de a lega la o bar de meniu un submeniu, sau o alt bar de meniu, este dat de comanda ON PAD: ON PAD < nume opiune bar > OF < nume meniu > [ ACTIVATE POPUP < nume submeniu > ] ACTIVATE MENU < nume meniu2 > ] Comanda va avea urmtorul efect: la alegerea opiunii bar < nume opiune bar > a barei de meniu < nume meniu1 > se va activa submeniul < nume submeniu > sau bara de meniu < nume meniu2 >, n funcie de clauza folosit n comand. Atenie: activarea submeniului sau a barei de meniu se va face la selectarea opiunii bar respective ) fr a fi nevoie de acionarea tastei Enter sau Space ). Pentru activarea unui submeniu se folosete clauza ACTIVATE POPUP urmat de numele submeniului, iar pentru

154

activarea unei alte bare de meniu se folosete clauza ACTIVATE MENU, dup care se include numele barei respective. Dac nu se folosete nici una dintre cele dou clauze, alegerea opiunii nu va mai determina activarea nici unuia dintre cele dou elemente, comanda folosindu-se n acest caz la eliberarea opiunii barei respective. Exemplu: vom crea urmtorul meniu: Calitate Culoare Pre Stare Negru Satisfctoare Alb Bun Albastru Foarte bun Verde Rou Galben Format dintr-o bar de meniu i dou submeniuri. CLEAR DEFINE MENU art DEFINE PAD calit OF PROMPT \< Calitate DEFINE PAD cul OF PROMPT CU\<loare DEFINE PAD pre OF PROMPT \< Pret DEFINE PAD stare OF PROMPT \< Stare DEFINE POPUP culori DEFINE BAR 1 OF culori PROMPT \< Negru DEFINE BAR 2 OF culori PROMPT \< Alb DEFINE BAR 3 OF culori PROMPT AL\<bastru DEFINE BAR 4 OF culori PROMPT \< - DEFINE BAR 5 OF culori PROMPT \< Verde DEFINE BAR 6 OF culori PROMPT \< Rou DEFINE BAR 7 OF culori PROMPT Galben DEFINE POPUP stri

155

DEFINE BAR 1 OF stri PROMPT \< Satisfctoare DEFINE BAR 2 OF stri PROMPT \< Bun DEFINE BAR 3 OF stri PROMPT \< Foarte bun ON PAD cul OF Art ACTIVATE POPUP culori ON PAD stare OF Art ACTIVATE POPUP stri ACTIVATE MENU art DEACTIVATE MENU art CLEAR POPUPS CLEAR MENUS Corespunztoare comenzii ON PAD pentru opiuni bar, avem o comand pentru opiunile unui submeniu, ON BAR, cu sintaxa: ON BAR < expN > OF < nume submeniu1 > [ ACTIVATE POPUP < nume submeniu > ] | ACTIVATE MENU < nume meniu > ] La selectarea opiunii < expN > a submeniului < nume submeniu 1> se va activa submeniul < nume submeniu2 >, dac se include clauza ACTIVATE POPUP, sau bara de meniu < nume meniu > , n cazul precizrii clauzei ACTIVATE MENU. Dac nici una din cele dou clauze nu se include n comand, opiunea < expN > a submeniului < nume submeniu1 > va fi eliberat ( nu va mai determina activarea unui element la alegerea sa ). Pot fi create n acest fel mai multe nivele de submeniuri, sau mai multe submeniuri care coordoneaz bare de meniu ( mai rar ). Exemplu: la meniul creat anterior se adaug dou submeniuri de nivel doi, unul pentru opiunea 3 ( Albastru ) a submeniului culori i altul pentru opiunea 2 ( Bun ) a submeniului stari. CLEAR DEFINE MENU art DEFINE PAD calit OF PROMPT \< Calitate DEFINE PAD cul OF PROMPT CU\<loare DEFINE PAD pre OF PROMPT \< Pret

156

DEFINE PAD stare OF PROMPT \< Stare DEFINE POPUP culori DEFINE BAR 1 OF culori PROMPT \< Negru DEFINE BAR 2 OF culori PROMPT \< Alb DEFINE BAR 3 OF culori PROMPT AL\<bastru DEFINE BAR 4 OF culori PROMPT \< - DEFINE BAR 5 OF culori PROMPT \< Verde DEFINE BAR 6 OF culori PROMPT \< Rou DEFINE BAR 7 OF culori PROMPT Galben DEFINE POPUP stri DEFINE BAR 1 OF stri PROMPT \< Satisfctoare DEFINE BAR 2 OF stri PROMPT \< Bun DEFINE BAR 3 OF stri PROMPT \< Foarte bun ON PAD cul OF Art ACTIVATE POPUP culori ON PAD stare OF Art ACTIVATE POPUP stri DEFINE POPUP nuana DEFINE BAR 1 OF nuana PROMPT \< Deschis DEFINE BAR 2 OF nuana PROMPT \< Normal DEFINE BAR 3 OF nuana PROMPT \< nchis DEFINE POPUP verif DEFINE BAR 1 OF Verificat DEFINE BAR 2 OF Neverificat verif verif PROMPT \< PROMPT \<

ON PAD cul OF Art ACTIVATE POPUP culori

157

ON PAD stare OF Art ACTIVATE POPUP stri ON BAR 3 OF culori ACTIVATE POPUP nuana ON BAR 2 OF Stri ACTIVATE POPUP verif ACTIVATE MENU art DEACTIVATE MENU art n acest exemplu avem urmtorul meniu: Calitate Stare Negru Satisfctoare Alb Bun Foarte bun Verificat Albastru Deschis Neverificat Verde Normal Rou nchis Galben Pentru ca la alegerea unei opiuni bar, sau a unei opiuni a unui submeniu, s se execute operaii mai complexe vom folosi grupul de comenzi ON SELECTION, format din urmtoarele patru comenzi: ON SELECTION MENU ON SELECTION PAD ON SELECTION POPUP ON SELECTION BAR Aceste comenzi determin executarea unei singure comenzi la alegerea unei opiuni bar sau a unei opiuni. Aceast comand poate fi un apel de procedur sau o instruciune care s conin apelul unei funcii definite de utilizator, n cadrul creia se pot executa o mulime de operaii, n funcie de opiunea aleas. Comanda ON SELECTION MENU are sintaxa: ON SELECTION MENU < nume meniu > | ALL [ < instruciune > ] < instruciune > va fi executat la alegerea oricrei opiuni bar a barei de meniu < nume meniu > sau a oricrei bare de meniu definit Culoare Pre

158

cnd se folosete clauza ALL. Comanda ON SELECTION MENU trebuie plasat ntre DEFINE MENU i ACTIVATE MENU. O utilizare asemntoare o are comanda ON SELECTION PAD, cu sintaxa: ON SELECTION PAD < nume opiune bar > OF < nume meniu > [ < instruciune > ] < instruciune > va fi executat numai la alegerea opiunii bar < nume opiune bar > a barei < nume meniu >.

Corespondentele submeniuri, sunt:

celor

dou

comenzi,

pentru

ON SELECTION POPUP < nume submeniu > | ALL [ < instruciune > ] ON SELECTION BAR < expN > OF < nume submeniu > [ < instruciune > ]

159

BIBLIOGRAFIE: 1.Dan marinescu, Mihai Trandafirescu Manualul nceptorului, Ed. TEORA, Bucureti, 1996 2.Ion Lungu .a. Sistemul FOXPRO Prezentare i aplicaii, Ed. ALL, Bucureti, 1993. 3.Mariana Paniru Informatic Economic, Ed. PETRION, Bucureti, 1996. 4.Lucian Vasiu, Sabin Ielceanu FOXPRO- Programe, Editura Albastr, Cluj- Napoca, 1995. 5.Gabriel Dima, Mihai Dima FOXPRO 2.6 sub WINDOWS, Ed. TEORA, Bucureti, 1996. 6. Marin Fotache, Ioan Brava, .a. VISUAL FOXPRO, Ed. POLIROM, Bucureti, 2002.

160

NOIUNEA DE ALGORITM...........................................................3

Scrierea algoritmului de rezolvare a problemei...............................................3 Operaii utilizate n algoritmi...............4 Simboluri grafice...................................5 Operaii ..................................................5 Exemple de scheme logice..................7 Etapele de execuie a unui program. 15
LIMBAJUL FOXPRO....................................................................18

161

Tipuri de fiiere...................................18 Variabile i masive..............................19 Tipuri de date i funcii standard......38 Operaii elementare asupra bazelor de date.......................................................49 Programare structurat......................85 Intrare / ieire....................................104 Formatul de afiare i citire.............108 Ordonarea unei baze de date...........118 Proceduri i funcii definite de utilizator.............................................131 Meniuri ............................................140

162

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