Descărcați ca doc, pdf sau txt
Descărcați ca doc, pdf sau txt
Sunteți pe pagina 1din 158

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.

3
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

4
Simboluri grafice
Schema logic este forma grafic de reprezentare a unui
algoritm utiliznd simbolurile de reprezentare a operaiilor.

Simbol Denumire Semnificaie


simbol
Sgeat 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 Reprezint condiiile puse

DA NU

Conectori a)Cnd mai multe variante


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

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

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

Operaie Rezultat
0 OR 0 0
0 OR 1 1
1 OR 0 1
1 OR 1 1
0 AND 0 0
0 AND 1 0
1 AND 0 0
1 AND 1 1
NOT 0 1
NOT 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.

6
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.

7
start

Citete A,B,C

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

NU DA

D>0

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

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.

8
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.

9
I = 1, M
start
J = 1, N

I:=1

J:=1

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

J:=j+1

DA
J<N

NU

I:=i+1
NU
DA

I< M

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
NU

x<B

DA

M:=M+1

i:=i+1
Se iniializeaz numrul M
DA
cu 0. se iau apoi
i<N elementele irului pe rnd
i dac sunt n interval se
NU mrete contorul M cu 1,
dac nu M rmne
Scrie M
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
7.Se d un ir de N numere
A >A
reale A
A1 .. CA: n= . S se deseneze
A : = A i+1
schema logic a unui algoritmi dei + 1 calcul careAi s ordonezei irul
cresctor. A :=C
i+1

k:=1
NU
Ui : = i + 1

DA
A i<N

NU
NU
U
U k=0
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 fiier-
executabil.
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 fiierul-
surs 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
de interpretor posed n prezent i compilatoare care ncearc s-l
menin n atenia programatorilor.
17
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;
9. fiierele .DBO, .FRO, .FMO, .LBO sunt rezultatul
compilrii programelor i proiectelor.

18
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

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
19
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.
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

20
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>.
a) Crearea unei variabile sau modificarea valorii acesteia
se realizeaz prin operatorul de atribuire, cu urmtoarea
sintax:

<variabil> = <exp>

21
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.
STORE {12 \01 \70} TO data
NOTE se creaz variabila data, de tip dat calendaristic i
se iniializeaz cu valoarea {12 \01 \70}

22
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>]

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

23
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 ntr-
un 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
Operaia de tergere a tuturor variabilelor poate fi realizat prin alte
dou comenzi:

CLEAR MEMORY CLEAR ALL

24
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
NOTE se salveaz variabilele a , b i suma n fiierul
fvar.mem
a=5
b=3
suma = a + b
? a , + , b , ? , suma

25
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
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

26
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
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

27
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:
unidimensional, cnd este prezent o singur expresie, i
bidimensional, cnd sunt prezente dou valori numerice ntre
parantezele rotunde.

28
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
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

29
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
Marimea si dimensiunile unui tablou creat anterior se pot
schimba printr-o noua comanda DIMENSION sau DECLARE, prin
redefinirea acestuia.
Se pot realiza astfel:

30
- 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
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
31
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 2 3
4 5 6

1 2 3 4
5 6 .F. .F.
.F. .F. .F. .F.
Vom prezenta n continuare funciile referitoare la
prelucrarea masivelor.
Numrul elementelor unui masiv, numrul liniilor sau
numrul colanelor acestuia, se obine prin funcia ALEN ( ), aceasta
avnd sintaxa:

ALEN ( < masiv> [ , < expN > ] )

32
< 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 ] )

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,
33
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

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
34
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
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:
35
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 ))
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
36
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
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.

37
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
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:

calculeaz maximul dintre dou valori <e1> i <e2>


MAX (<e1>,<e2>)
calculeaz minimul dintre dou valori <e1> i <e2>
MIN (<e1>,<e2>)
ntoarce litera corespunztoare tipului de dat.
TYPE(<eC>)

38
ntoarce <e1> dac <eL> este adevrat i <e2>n caz
IIF(<eL>,<e1>,<e2>
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:

calculeaz valoarea absolut din <eN>


ABS (<eN>)
calculeaz radical din <eN> (strict pozitiv)
SQRT (<eN>)
ROUND <eN1> este rotunjit la zecimala dat de <eN2>
(<eN1>,<eN2>)
calculeaz restul mpririi ntregi a lui <eN1> la
MOD
<eN2>
(<eN1>,<eN2>)
INT (<eN>) ntoarce un ntreg rezultat prin trunchierea

39
zecimalelor

ntoarce cel mai mic ntreg mai mare sau egal cu


CEILING (<eN>) argumentul <eN>

ntoarce cel mai mare ntreg mai mic sau egal cu


FLOOR (<eN>) argumentul <eN>

ntoarce valoarea 1 pentru argument negativ, 1


SIGN (<eN>) pentru argument pozitiv i 0 pentru argument nul.

returneaz un numr aleator n intervalul (0, 1)


RAND ()
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
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

40
?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
? 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
41
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.

42
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.

43
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


extrage un subir din irul <eC> ncepnd cu
SUBSTR (<eC>,
caracterul de pe poziia <eN1> pe lungime
<eN1>,<eN2>)
<eN2>
LEFT (<eC>, <eN>) extrage primele <eN> caractere din irul <eC>
RIGHT (<eC>, <eN>) extrage ultimele <eN> caractere din irul <eC>
LEN (<eC>) ntoarce lungimea irului <eC>
ntoarce un ir avnd <eC> multiplicat de
REPLICATE (<eC>, <eN>)
<eN> ori
ntoarce un ir de <eN> spaii
SPACE (<eN>)
elimin spaiile de la stnga irului <eC>
LTRIM (<eC>)
ex.: LTRIM(MIA)=MIA
elimin spaiile de la dreapta irului <eC>
RTRIM (<eC>)/ TRIM (<eC>)
ex.: RTRIM(MAI)=MAI
ntoarce poziiile irului <eC1> n <eC2>
AT (<eC1>, <eC2>)
testeaz dac irul ncepe cu o liter
ISALPHA (<eC>)
testeaz dac irul ncepe cu minuscul
ISLOWER (<eC>)
testeaz dac irul ncepe cu majuscul
ISUPPER (<eC>)
transform irul n minuscule
LOWER (<eC>)
transform irul n majuscule
UPPER (expC)

44
nlocuiete n <eC1> ncepnd cu poziia
STUFF (<eC1>, <eN1>, <eN2>,
<eN1> un subir de lungime <eN2> prin
<eC2>)
irul <eC2>
realizeaz conversia unui ir la data
CTOD (<eC>)
calendaristic
VAL (<eC>) realizeaz conversia unui ir la numr
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

45
? 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>

unde <format> poate fi: AMERICAN / GERMAN / ANSI / ITALIAN


/ DMY /BRITISH /JAPAN /FRENCH /USA /MDY /YMD

46
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 :

ntoarce data curent de la sistem


DATE()
extrage nr. zilei din dat
DAY (<eD>)
extrage nr. lunii din dat
MONTH(<eD>)
ntoarce numele lunii
CMONTH(<eD>)
YEAR(<eD>) extrage anul din data calendaristic

47
extrage ora sistem sub forma irului HH:MM:SS
TIME()
ntoarce data sub forma secol an lun zi
DTOS(<eD>)
ntoarce data sub forma zi nume-lun an
DMY(<eD>)
ntoarce data sub forma nume lun zi an
MDY(<eD>)
conversie data la ir
DTOC(<eD>)

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.
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

48
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
DENUMIRE character 30 denumirea
VALOARE numeric 10 valoarea
AMORTIZAREnumeric 10 valoarea amortizata
49
LOC_FOLOS memo 10 locul de
folosinta
STARE logical 1 starea (n
folosinta .T. , nefolosit .F.)
DATA_INST date 8 data
instalarii, puneriin functionare
se realizeaza cu comanda:

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

Zone de lucru

50
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
Comenzile de poziionare ca i funciile asupra bazelor de
date pot avea referire direct n zona cercetat. Astfel clauzan poate
completa comenzile:
51
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
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
52
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
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.

53
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

Duplicarea structurii conceptuale:

54
COPY STRUCTURE TO <fis.dbf> [FIELDS<lista-
camp>]

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.

Funcii standard relativ la structura bazei de date:

55
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

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
56
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,


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;

57
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).
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

58
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).

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

59
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 <lista-
expr> figureaz denumirea lor.

Exemplu:
use student && presupunem un fiier cu date despre
studeni
list && list are domeniul implicit ALL

# cods numes grupa anul numec


1 1 Mihai Andrei 1 1 info
2 2 Boila Adela 1 1 mate
3 3 Albu Andrei 1 2 info
4 4 Fratean Doina 2 1 engleza
5 5 Suceava Dana 3 2 chineza

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
60
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>.

Funcii de testare a succesului sau insuccesului cutrii cu LOCATE


sunt:

1. FOUND () && ntoarce .T. dac articolul a fost gsit


2. EOF () && ntoarce .F. dac articolul a fost gsit

61
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 date-
active.

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.
? RECNO ( )
1
CONTINUE
? FOUND ( )
.T.
? EOF ( )
62
.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
? RECNO ( )
1
GO BOTTOM && pozitionare pe ultima
inregistrare
? RECNO ( )
4
63
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
SKIPn SELECT ( )
GO TO RECORD RECNO ( ) + 1

Duplicarea unei baze de date

64
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

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

65
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.

Exemplu:
USE mijloacef
APPEND BLANK && adugm un
articol vid

Inserarea articolelor:
66
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

Modificarea bazelor de date

Activitatea de corectare a valorilor depuse n cmpuri la


ncrcarea bazei de date se poate face interactiv sau prin comenzi-
program.

67
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;
.
LIST
USE

tergerea articolelor din baza de date

68
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
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
69
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

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
70
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 toate
nregistrrile. Cele care nu erau;
marcate pentru tergere nu sunt afectate
LIST
USE

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

71
acestor ecrane se pot vizualiza, introduce, edita i terge date.
Comanda EDIT are formatul general:

EDIT / CHANGE [NOINIT] [NOAPPEND] [NOMENU]


[NOEDIT]
[NODELETE] <nr-articol>[FIELDS
<lista-cmp>]
[<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
fiind un cmp calculat n funcie de data instalrii ( cmpul
DATA_INST din baza de date ) i data curent.

Exemplul:
CLOSE ALL
USE mijloacef

72
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
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.

73
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?
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

74
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 propriu-
zise. 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.
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
75
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

nchiderea ferestrei memo de editare se poate face folosind


comanda CLOSE MEMO.

CLOSE MEMO <cmp memo> [ , <cmp memo2>.....] |


ALL

76
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
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

77
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
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 )
78
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.

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:
79
? 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
? MEMLINE (loc_folos )
3
? MLINE (loc_folos, 2 )
Strada Cuza Vod, nr. 54
SET MEMOWIDTH TO 12
? loc_folos
Bucureti
Strada Cuz
80
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
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>]


81
[<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<lista-


cmp>][MEMO]

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.

82
b. Copierea datelor din baza de date ntr-un tablou se face prin
comanda:

SCATTER [FIELDS <lista-cmp>][memo] TO


<tablou>/MEMVAR

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

83
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 instruciune 1
de la o operaie la alta n secven.

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
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
84
<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 NU
Condiie

Aciune 1 Aciune 2

2.Formatul pentru structura alternativ cu o ramur vid

DA NU

Condiie

instruciune
85
.

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
? 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

86
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

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

87
@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
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>

88
..
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
DA NU
trece la evaluarea urmtoarei expresii logice. Dup gsirea primei
expresii logice cu valoarea .T. i executarea grupului de instruciuni
corespunztor, execuia
s = c1 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, NU execuia comenzii
se ncheie; S = c2
Instruciune1
- n prezena clauzei OTHERWISE, se va executa grupul
de instruciuni <instruciuni>, dup care se trece la prima
comand deDA dup ENDCASE.
Observaie: numai unul dintre grupurile de instruciuni
<instruciuni1> <instruciuniN> i <instruciuni> va fi executat
Instruciune2
i anume acela pentru care expresia logic este .T.

NU

S = c3

DA
c1
Instruciune3

89
Exemplu:
SET TALK OFF
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:
90
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).

c: = inc

Corpul ciclului

c:=c+1

DA

C<=sf 91

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:
a) Instruciunea FOR pentru valori cresctoare ale variabilei contor:

FOR <var> = <expN1> TO <expN2> [ STEP


<expN3>]
<instruciuni>
[EXIT]
[LOOP]
ENDFOR

92
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
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.
93
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>.
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.
94
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
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.
95
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> ] [ WHILE
<expL2> ]
<instructiuni>
[ LOOP ] [ EXIT ]
ENDSCAN

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 2. FOR I=1


TO RECCOUNT ( )
<instructiuni>
GOTO i
ENDSCAN
<instructiuni>
ENDFOR

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
96
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:
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
97
? 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

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

98
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
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

99
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:
-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
100
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.
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.

101
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
acest program funcionaey corect, n urma executrii lui obinndu-
se 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
102
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 comenzi-
comutator.

linia zero poate fi activat/dezactivat cu


linie meniu
SET SCOREBOARD ON/OFF
zona utilizator

liniile 22,23,24 pot fi activate/dezactivate


linii de stare, mesaje
cu: SET STATUS ON/OFF

Observaie: Numrul de linii i de coloane depinde de modul de


lucru al monitorului.

103
Exist o comand care poate fixa modul de lucru explicit:

SET DISPLAY MONO/COLOR/EGA25/EGA43/VGA25/VGA50

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,00 0,79 coordonatele


punctului x
row()+3,col()+3
X
cursoru
l
este pe
linia
row() 23,0 23,79
COL()
cursorul este pe coloana
col()
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

104
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 cod Culorile sunt indicate printr-un
1 negru N cod (abreviere).
2 albastru B Astfel, pentru a specifica culoarea
3 verde G ALB va trebui s folosim
4 turcoaz BG caracterul W, iar pentru rou,
5 invizibil X caracterul R.
6 rou R
7 ciclamen RB+ Putem obine culori cu intensitate
8 maro GR crescut punnd + dup codul
9 galben GR+ de culoare, iar efectul de flash
10 alb W 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 /
(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:

105
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 OF NORMAL/MESSAGES/TITLES/BOX/


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).

106
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
9 permite cifre i semnul pentru numere
, separator (n numeric)
. poziia punctului zecimal
A permite doar litere
L date logice
N permite introducerea de litere i cifre
X permite introducerea oricrui caracter
Y permite introducerea de valori logice {.Y./.y./.N./.n.}

Coduri de funcie pentru clauza FUNCTION


107
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

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>]

108
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
.............................................................................? 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

109
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 '
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 :

110
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
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
111
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
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
112
@ 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

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,

113
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.
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
114
@ 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
@ 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
115
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.
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>

116
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
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]
117
[,<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.
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,

118
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 <list-
cmpuri> 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.

Indexarea bazelor de date

Indexarea presupune crearea unui fiier nou numit fiier-


idex, 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 .

119
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]

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

120
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
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
121
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:

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.

122
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
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

123
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.

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.

124
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
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

125
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.

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.
126
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.
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
127
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>.

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;

128
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:

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

129
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
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;

130
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
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.

131
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:

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

132
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 formali se face prin comanda


PARAMETERS:

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

133
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:

<nume-functie>(<lista-exp>)

Corespondena ntre parametri se face prin poziia n lista de


parametrii din programul apelat i din comanda de apel.
Exemplu:
134
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:
n=6
k=3
FACT1 = 1
FOR i = 1 TO 6
FACT = FACT * 1
ENDFOR
135
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.

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

136
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
NOTE aici se cunosc toate variabilele: a ,
b,c,d
?a=,a
?b=,b
?c=,c
?d=,d

137
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>

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>

138
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.
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:

139
- 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> ]

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

140
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
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:
141
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 <
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

142
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
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 :
143
- 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

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

144
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>]
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 ).
145
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
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 ntr-
un 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.
146
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
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:
147
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.
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
148
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 TO 14, 21 MARGIN


MULTISELECT
DEFINE BAR 1 OF culori PROMPT Alb\<astru
DEFINE BAR 2 OF culori PROMPT \<Verde SKIP
DEFINE BAR 3 OF culori PROMPT \<Rou
DEFINE BAR 4 OF culori PROMPT \_
DEFINE BAR 5 OF culori PROMPT \<Negru
DEFINE BAR 6 OF culori PROMPT \<Alb SKIP
DEFINE BAR 7 OF culori PROMPT \<Galben
ACTIVATE POPUP culori
CLEAR MENUS

Definirea unei bare de meniu sau a unui submeniu nu este


suficient pentru lucrul cu aceste elemente. Mai este necesar i

149
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
@ 10, 10 SAY domeniu GET dom DEFAULT

READ
CLEAR
DEACTIVATE MENU domeniu

Fizica Chimie Literatura


Sport

domeniu
150
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

Fizic
Chimie
Literatur
Sport

domeniu

Observm analogiile dintre cele dou exemple , care practic


realizeaz acelai lucru, difernd doar formatul de afiare.

151
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:

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
152
[ 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
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

153
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


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
154
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
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

155
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 verif PROMPT \< Verificat

DEFINE BAR 2 OF verif PROMPT \<
Neverificat

ON PAD cul OF Art ACTIVATE POPUP culori


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 Culoare Pre


Stare
Negru
Satisfctoare
156
Alb
Bun Verificat
Albastru Deschis
Foarte bun 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
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 celor dou comenzi, pentru
submeniuri, sunt:
ON SELECTION POPUP < nume submeniu > | ALL
[ < instruciune > ]

157
ON SELECTION BAR < expN > OF < nume submeniu
> [ < instruciune > ]

158
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.

159
CUPRINS

A. NOIUNEA DE ALGORITM......................................................3
Scrierea algoritmului de rezolvare a problemei......................3
Operaii utilizate n algoritmi.................................................4
Simboluri grafice...................................................................5
B. Etapele de execuie a unui program.............................................14
C. LIMBAJUL FOXPRO................................................................17
Tipuri de fiiere....................................................................17
Variabile i masive...............................................................18
Tipuri de date i funcii standard..........................................37
Operaii elementare asupra bazelor de date..........................47
Programare structurat.........................................................83
Intrare / ieire.....................................................................102
Formatul de afiare i citire................................................106
Ordonarea unei baze de date..............................................116
Proceduri i funcii definite de utilizator...........................129
Meniuri..............................................................................138

160

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