Documente Academic
Documente Profesional
Documente Cultură
LIMBAJUL FoxPro
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.
3
Mrimile pot fi succesiuni de caractere alfabetice, numerice i chiar
speciale. Este indicat ca aceste numere atribuite mrimilor s fie
sugestive.
4
Simboluri grafice
Schema logic este forma grafic de reprezentare a unui
algoritm utiliznd simbolurile de reprezentare a operaiilor.
DA NU
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
6
Exemple de scheme logice
start
P: = 0
Citete
M,N
P:=M*N
Tiprete p
End
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
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
Scrie M
end
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
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
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
Variabile i masive
Variabile
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:
DECLARARE <lista-tablou>
Operaia de atribuire:
<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:
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:
23
mesajul poate lipsi; n acest caz sistemul are un mesaj standard de
tipul:
Press and key to continue
tergerea variabilelor
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.
25
5+3=8
RESTORE FROM fvar
? a , + , b , ? , suma
1+2=3
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.
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.
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>.
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)
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.
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:
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
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 )
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.
39
zecimalelor
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:
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.
Tipul ir de caractere
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.
43
Compararea irurilor de caractere de lungimi diferite este
controlat de comanda :
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
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
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.
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
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.
CREATE <fis.dbf>
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:
USE<fis.dbf>
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).
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
MODIFY STRUCTURE
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
54
COPY STRUCTURE TO <fis.dbf> [FIELDS<lista-
camp>]
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
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.
57
RECORD <n>semnific articolul cu numrul <n>.
APPEND
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).
59
LIST/DISPLAY[<listaexpr>][<domeniu>][FOR<cond>]
[WHILE<cond>][TO PRINTER/TO FILE <fis.txt>]
[OFF]
Exemplu:
use student && presupunem un fiier cu date despre
studeni
list && list are domeniul implicit ALL
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
61
Atenie! Nu se poate folosi funcia EOF() dac <domeniu> este
diferit de ALL.
CONTINUE
GO [TO] <n>/TOP/BOTTOM
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
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.
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
65
cmpurilor din baza de date, sau, n fine, se pot terge logic sau fizic
articole.
Adugarea articolelor:
APPEND BLANK
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.
Exemplu:
USE mijloacef_n
GOTO 2 && se pozitioneaza indicatorul de
inregistrari pe inregistrarea 2
INSERT BEFORE && se insereaza o noua
inregistraren pozitia 2
USE
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:
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>]
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
PACK ZAP
delete all
pack
70
Observaie: Trebuie s fim ateni la poziionarea comutatorului SET
SAFETY ON/OFF care, pe valoarea ON cere acordul la tergere.
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
71
acestor ecrane se pot vizualiza, introduce, edita i terge date.
Comanda EDIT are formatul general:
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
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.
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.
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
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:
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
82
b. Copierea datelor din baza de date ntr-un tablou se face prin
comanda:
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:
instruciune 2
DA NU
Condiie
Aciune 1 Aciune 2
DA NU
Condiie
instruciune
85
.
86
Un efect asemntor, de selecie dintre dou variante, se
obine prin funcia IIF () avnd sintaxa:
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
88
..
CASE <expLN>
< instruciuniN>]
[ OTHERWISE
< instruciuni>]
ENDCASE
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:
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
SCAN [ NOOPTIMIZE]
[ <domeniu> ] [ FOR <exoL1> ] [ WHILE
<expL2> ]
<instructiuni>
[ LOOP ] [ EXIT ]
ENDSCAN
3. SCAN;
NEXT 10 FOR MOD(RECNO( ),2)=0
<instructiuni>
ENDSCAN
DO WHILE <expL>
<instructiuni>
[ LOOP ]
{ EXIT ]
ENDDO
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.
DO CASE
CASE <conditie1>
<secv1>
CASE <conditie2>
<secv2>
CASE <conditieN>
<secvn>
[OTHERWISE
<secv.m>]
ENDCASE
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
103
Exist o comand care poate fixa modul de lucru explicit:
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>.
105
SET COLOR TO [<std>][,<ext>][,<marg>][,<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
SET COLOR TO
106
Formatul de afiare i citire
Comenzile ? i ??
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:
109
Comanda @ SAY
Este o alt comand de afiare cu format:
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
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
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.
116
ncrcarea unui set de culori din fiierul FOXUSER.DBF, salvat
anterior, pentru a desemna setul curent se face prin comanda:
Sortarea datelor
SORT TO<fis.dbf>ON<cmp1>[/A][/D][/C]
117
[,<cmp2>[/A][/D][/C]
[DESCENDING/ASCENDING]
[<domeniu>][FOR <cond>][WHILE <cond>]
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
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.
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:
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
123
deschis n zona de lucru indicat prin numrul ei, implicit zona
curent.
FIND <expC>/<expC>
SEEK <exp>
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
125
de natur diferit, mai detaliate, sau mai sintetizate, sub form de
liste, tabele, sau simple valori, informaii statistice, totalizatoare.
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:
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
129
FIELDS) valoarea nsumat a valorilor fiecrui articol din grup n
cmpul respectiv.
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:
DO <fis.prg>
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.
PROCEDURE <nume-procedur>
DO <nume-procedur>
CANCEL
RETRY
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>
RETURN <expr>
PARAMETERS <lista-var>
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
Apelul unei funcii se face ntr-o expresie, parametrii fiind pui ntre
parantezele specifice funciei:
<nume-functie>(<lista-exp>)
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
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.
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:
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.
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>
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
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.
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.
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 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 > ]
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.
READ
CLEAR
DEACTIVATE MENU domeniu
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:
READ
CLEAR
DEACTIVATE POPUP domeniu
Fizic
Chimie
Literatur
Sport
domeniu
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 ]
HIDE MENU < nume meniu1 > [ , < nume meniu2 >
] | ALL
[ SAVE ]
ON PAD < nume opiune bar > OF < nume meniu >
[ ACTIVATE POPUP < nume submeniu > ]
ACTIVATE MENU < nume meniu2 > ]
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
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
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