Sunteți pe pagina 1din 30

31

PRELUCRAREA
DATELOR

2.1. Deschiderea / nchiderea unei tabele


Orice prelucrare a unei tabele trebuie s fie precedat de operaia de deschidere a acesteia. n urma
acestei operaii utilizatorul are acces la coninutul tabelei, adic la orice nregistrare a acesteia, cu precizarea
c, la un moment dat este accesibil doar o singur nregistrare, numit nregistrarea curent. De asemenea,
ncheierea oricrei prelucri asupra unei tabele este marcat prin nchiderea acesteia.
n Visual FoxPro, spre deosebire de versiunile pentru DOS i WINDOS, baza de date se
concretizeaz ntr-un fiier distinct, reprezentnd un mijloc de organizare a unui volum mare de informaie
ntr-o structur coerent. Din punct de vedere logic, o baz de date ( .DBC) reprezint o mulime de obiecte
conform SGBD-ului folosit pentru gestiunea ei. In sistemul Visual FoxPro, o baz de date poate conine
obiecte de tip: tabel (table) sau vedere (view).
OPEN DATABASE <baz_de_date>
USE <tabel>
[IN <zon_de_lucru>]
[ORDER [TAG] <etichet_index>
[ASCENDINGDESCENDING]]
[ALIAS <alias>]
USE CLOSE TABLES
CLOSE DATABASES
Pentru a opera cu datele dintr-o tabel deja creat, ea trebuie mai nti deschis. La deschidere,
sistemul i aloc o zon de memorie special, numit zon de lucru. n aceast zon de memorie sunt
memorai o serie de parametri ai tabelei, parametri necesari gestiunii tabelei, ca de exemplu numrul
nregistrrii curente, numrul total de nregistrri din tabel etc. ntr-o zon de lucru nu poate fi deschis
dect o singur tabel. Lucrul cu dou sau mai multe tabele simultan implic folosirea a dou sau mai multe
zone de lucru distincte. Visual FoxPro posed o multitudine de zone de lucru (de ordinul zecilor de mii),
astfel nct, practic, nu exist restricii din acest punct de vedere.
Dup deschidere, asupra tabelei se pot executa o serie de operaii de prelucrare dintre care cele mai
importante sunt: adugarea de noi nregistrri, modificarea unor date din nregistrrile existente, tergerea
unor nregistrri, cutarea anumitor date, ordonarea datelor dup diferite criterii etc. Cnd se termin lucrul
cu o tabel, aceasta trebuie nchis, eliberndu-se astfel zona de lucru respectiv.
O observatie important legat de lucrul cu datele din tabele este c operaiile se efectueaz la nivel
de nregistrare. Prin urmare, ntr-o tabel nu putem aduga sau terge dect o nregistrare complet. Pentru a
ine evidena nregistrrii curent prelucrate dintr-o tabel, sistemul folosete o variabil special, numit
indicatorul de nregistrri. Aceast variabil indic totdeauna nregistrarea asupra creia va aciona
urmtoarea comand.
Pentru prelucrarea datelor din bazele de date se pot folosi dou metode:
una interactiv, constnd din utilizarea diferitelor instrumente ale mediului Visual FoxPro.
Operaiile de prelucrare sunt realizate prin intermediul interfeei sistemului, sarcina utilizatorului
constnd n alegerea de opiuni, ntrebuinarea unor ferestre de dialog etc.; metoda este folosit
atunci cnd operaiile de prelucrare sunt executate de un cunosctor al mediului i nu n mod

32

repetat (caz n care este mai avantajoas realizarea unui program, a unei forme, care s
automatizeze operaiile respective);
una prin cod sau prin intermediul limbajului FoxPro: aceast metod const n folosirea
diferitelor comenzi, fie n diferite programe sau metode ale unor forme, rapoarte etc; realizarea
unui sistem informatic necesit folosirea acestei metode, prin construirea unor forme, rapoarte i
a altor elemente, n ale cror cmpuri sunt introduse comenzi de prelucrare a datelor din bazele
de date.
Comanda USE deschide tabela <tabel>, ce face parte din <baz_de_date>, n zona de lucru curent
sau ntr-o alt zon specificat n comand. Modul de acces la coninutul tabelei, adic modalitatea n care se
ajunge la nregistrrile acesteia, poate fi:
secvenial, cnd pentru obinerea unei informaii anumite trebuie s parcurgem toate
nregistrrile anterioare;
direct, cnd putem stabili unde anume pe suport este nregistrarea vizat i o utilizm fr s ne
preocupm de nregistrrile anterioare; acest tip de acces este asigurat de o etichet index
adecvat ataat tabelei - <etichet_index>; prin indexare, ordinea fizic a nregistrrilor din
tabel nu se modific, se schimb ns modul n care utilizatorul are acces la datele acesteia;
prima nregistrare a tabelei indexate o constituie cea corespunztoare celei mai mici
(ASCENDING)/mari (DESCENDING) valori a cheii de indexare, iar ultima nregistrare a
fiierului indexat este cea care conine cea mai mare (ASCENDING)/mic (DESCENDING)
valoare a cheii de indexare.
Pentru tabela nou deschis, se poate defini un pseudonume <alias>, ce va putea fi folosit n
comenzile de prelucrare a tabelei, n locul numelui acesteia.

2.2. Accesul la baza de date


1. Detectarea nceputului respectiv a sfritului unei tabele
Funciile logice BOF (Bottom Of File) i EOF (End Of File) permit detectarea, n parcurgerea
tabelei, a nceputului respectiv a sfritului acesteia.
BOF ([<zon_de_lucru> <alias>])
EOF ([<zon_de_lucru> <alias>])
Tabela, al crei nceput respectiv sfrit se testeaz, poate fi cea curent sau cea specificat prin
numrul zonei de lucru n care a fost deschis sau prin pseudonumele <alias> al ei. Funciile returneaz
valoarea logic .T., atunci cnd indicatorul de nregistrri este poziionat la nceputul, respectiv la sfritul
tabelei respective.
2. Comenzi de poziionare a indicatorului de nregistrri
Pentru a ine evidena nregistrrii curent prelucrate dintr-o tabel, sistemul folosete o variabil
special, numit indicatorul de nregistrri. Aceast variabil indic totdeauna nregistrarea asupra creia va
aciona urmtoarea comand.
GO TOP | BOTTOM [IN <zon_de_lucru>]
GO [RECORD] <expr1> [IN <zon_de_lucru>]
SKIP [<expr2>] [IN <zon_de_lucru>]
Comenzile GO i SKIP poziioneaz indicatorul de nregistrri, al tabelei curente sau specificate prin
<zon_de_lucru>, ntr-o anumit poziie:

33

TOP | BOTTOM : mut indicatorul de nregistrri pe prima, respectiv pe ultima nregistrare a


tabelei;
RECORD <expr1> : mut indicatorul de nregistrri pe nregistrarea cu numrul de ordine dat de
valoarea lui <expr1>;
comanda SKIP fr clauza <expr2> mut indicatorul de nregistrri la nregistrarea urmtoare
celei curente;
dac <expr2> este o valoare pozitiv, indicatorul de nregistrare va avansa spre sfritul tabelei
cu <expr2> poziii, iar dac <expr2> este negativ, deplasarea se va face spre nceputul tabelei.
n cazul tabelelor indexate, prima nregistrare, ultima nregistrare, nregistrarea urmtoare i
respectiv precedent sunt date de ctre eticheta index activ.
3. Comenzi de localizare a nregistrrilor n acces secvenial
LOCATE FOR <cond1>
<domeniu>] [WHILE <cond2>]

CONTINUE
Comanda LOCATE parcurge tabela curent cutnd prima nregistrare pentru care <cond1> este
ndeplinit. Dac comanda are succes, funcia RECNO ( ) va returna numrul nregistrrii localizate, iar
funcia FOUND ( ) va lua valoarea logic .T. Dac LOCATE gsete o nregistrare, se poate folosi comanda
CONTINUE pentru a cuta urmtoarele nregistrri din tabela curent care ndeplinesc condiia <cond1>. La
execuia comenzii CONTINUE, procesul de cutare continu de la nregistrarea imediat urmtoare celei
gsite anterior. Comanda CONTINUE poate fi executat repetat pn la detectarea sfritului de fiier sau
pn la epuizarea domeniului de cutare stabilit prin clauza <domeniu> a comenzii LOCATE sau pn la
execuia unei alte comenzi LOCATE.
Dac LOCATE nu gsete nici o nregistrare corespunztoare, funcia RECNO ( ) va returna o
valoare egal cu numrul total de nregistrri plus 1 (RECCOUNT ( ) + 1), iar FOUND ( ) valoarea .F. n
mod implicit, comanda LOCATE caut prima nregistrare care ndeplinete condiia <cond1> n ntreaga
tabel. Se poate reduce domeniul de cutare (ALL) incluznd clauza <domeniu> n sintaxa comenzii, n una
din urmtoarele forme: NEXT, RECORD sau REST. Totodat, se poate limita cutarea incluznd clauza
WHILE <cond2> n sintaxa comenzii LOCATE, aceasta avnd loc atta timp ct condiia <cond2> este
adevrat.
4. Comenzi de localizare a nregistrrilor n acces direct
SEEK <expr>
[ORDER [TAG] <etichet_index>
[ASCENDING | DESCENING]]
[IN <zon_de_lucru>]
Comanda SEEK caut prima nregistrare din tabela curent sau din cea deschis n zona de lucru
specificat prin <zon_de_lucru>, pentru care valoarea cheii de indexare este egal cu <expr>. Cutarea se
poate face pe baza etichetei index curente sau prin intermediul celei specificate prin <etichet_index>.
Dac valoarea <expr> nu se regsete printre valorile cheii de indexare, dar setarea curent SET
NEAR are valoarea ON, prin comanda SEEK se va localiza nregistrarea corespunztoare celei mai
apropiate -mai mari- valori a cheii de indexare de valoarea expresiei <expr>.
Dac expresia <expr> este alfanumeric i nu se regsete exact printre valorile cheii de indexare, dar
setarea curent SET EXACT are valoarea OFF, prin comanda SEEK se va localiza nregistrarea pentru care
<expr> constituie un subir stng al cheii de indexare.

34

Numrul nregistrrii localizate prin intermediul comenzii SEEK este returnat de funcia RECNO ( ),
iar funcia logic FOUND ( ) va lua, n aceast situaie, valoarea .T.

5.

Implementarea mecanismului de cutare secvenial i direct

do form form2
do form form3

Fig. 2.1 Interfaa aplicaiei


nregistrrile localizate prin cutare secvenial sunt vizualizate ntr-o fereastr Browse figura 2.2.

LOCATE

CONTINUE
Fig. 2.2 Cutarea secvenial. Comenzile LOCATE i CONTINUE
procedura cmdAfisare_Click( )
open database aplic
use magazin
locate for val(cod) = val(thisform.txtcod.value)
do while found( ) and not eof( )
browse noedit nodelete title "afisare"
continue

35

enddo
use
close databases

SEEK

Fig. 2.3 Cutarea direct. Comanda SEEK


Prima apariie a valorii cutate se localizeaz cu ajutorul comenzii SEEK figura 2.3, celelalte
apariii urmndu-i acesteia i putndu-se identifica cu ajutorul comenzii SKIP.
procedura cmdAfisare_Click( )
open database aplic
use magazin order codr
seek thisform.cbocod.value
if found( )
do while cod = thisform.cbocod.value and not eof( )
browse
skip
enddo
endif
close databases

6.

Tehnici de parcurgere a tabelelor

36

Exist diferite modaliti de acces la nregistrrile unei tabele n vederea implementrii algoritmilor de
prelucrare a datelor coninute de ctre acestea.

comanda SCAN ENDSCAN


OPEN DATABASE <baz_de_date>
USE <tabel> [ORDER <etichet_index>]
SCAN [<domeniu>] [FOR <cond1>] WHILE <cond2>]
<prelucrare_nregistrare>
[LOOP]
[EXIT]
ENDSCAN
CLOSE TABLES
CLOSE DATABASES

Comanda SCANENDSCAN realizeaz parcurgerea tabelei curente i executarea operaiilor


<prelucrare_nregistrare> pentru fiecare nregistrare a tabelei care aparine domeniului specificat prin
<domeniu>, clauza FOR sau WHILE.
Se poate reduce domeniul de prelucrare (ALL) incluznd clauza <domeniu> n sintaxa comenzii, n
una din urmtoarele forme: NEXT, RECORD sau REST.
Totodat, se poate limita prelucrarea nregistrrilor incluznd clauza WHILE <cond2> n sintaxa
comenzii SCANENDSCAN, aceasta avnd loc atta timp ct condiia <cond2> este adevrat. Clauza
FOR <cond1> limiteaz prelucrarea nregistrrilor la cele care ndeplinesc condiia <cond1> din cadrul
domeniului luat n considerare.
comenzile DO WHILE ENDDO i FOR ENDFOR
OPEN DATABASE <baz_de_date>
USE <tabel> [ORDER <etichet_index>]
DO WHILE NOT EOF ( )
<prelucrare_nregistrare_curent>
SKIP
ENDDO

n = RECCOUNT ( )
FOR i = 1 TO n
<prelucrare_nregistare_curent>
SKIP
ENDFOR

CLOSE TABLES
CLOSE DATABASES
7. Vizualizarea coninutului tabelelor

comenzile ? i ??
? | ?? [<expr1> [ PICTURE <format 1>] [FUNCTION <format 2>]
[ AT <nr> ]
[, <expr2> ..]]

Comenzile ? i ?? afieaz rezultatul expresiilor <expr1>, <expr2> pe ecran, n cadrul formei sau
ferestrei curent active. Comanda ? face ca afiarea s aib loc de la nceputul liniei urmtoare celei curente,
iar ?? determin ca aceasta s aib loc ncepnd cu poziia curent a cursorului. Prin clauza AT se poate
impune i o anumit coloan de nceput a afirii. <expr1>, <expr2> vor fi afiate conform formatului de
afiare specificat printr-o clauz PICTURE sau FUNCTION.

37

comanda @ SAY
@<lin>,<col>SAY <expr> [PICTURE <expc1>]
[FUNCTION <coduri_functie>]
[SIZE <expn1>,<expn2>]
[FONT <expc2>[,<expn3>]][STYLE <expc3>]
[COLOR <culori> COLOR SCHEME <expn4>]

Comanda permite afiarea pe ecran, ncepnd cu o anumit poziie i ntr-un anumit format, a valorii
expresiei <expr>.

comenzile DISPLAY i LIST


DISPLAY
[[FIELDS] <list_cmpuri>]
[<domeniu>] [FOR <cond1>] [WHILE <cond2>]
[OFF]
[TO PRINTER | TO FILE <fiier>]

Comanda permite vizualizarea coninutului tabelei curente, n mod implicit fiind afiat coninutul
nregistrrii curente n cadrul formei sau ferestrei curent active. Se poate limita afiarea la anumite cmpuri
prin introducerea clauzei [FIELDS] <list_cmpuri> n sintaxa comenzii. Afiarea coninutul unui cmp de
tip memo este posibil numai prin includerea numelui acestuia n <list_cmpuri>.
Se poate extinde domeniul de afiare prin includerea clauzei <domeniu> n sintaxa comenzii, n una
din variantele: ALL, NEXT, RECORD sau REST.
Totodat, se poate limita afiarea nregistrrilor incluznd clauza WHILE <cond2> n sintaxa
comenzii DISPLAY, aceasta avnd loc atta timp ct condiia <cond2> este adevrat. Clauza FOR
<cond1> limiteaz afisarea nregistrrilor la acelea care ndeplinesc condiia <cond1> din cadrul domeniului
luat n considerare.
Prin introducerea clauzei OFF n sintaxa comenzii DISPLAY se omite afiarea numerelor de
nregistrare n faa nregistrrilor vizualizate. Inregistrarile vizate pot fi tiprite la imprimant, prin
introducerea clauzei TO PRINTER n sintaxa comenzii sau pot fi memorate ntr-un fiier separat (clauza TO
FILE).
LIST
[[FIELDS] <list_cmpuri>]
[<domeniu>] [FOR <cond1>] [WHILE <cond2>]
[OFF]
[TO PRINTER | TO FILE <fiier>]
Comanda LIST este similar comenzii DISPLAY, n mod implicit fiind ns vizualizat ntregul
coninut al tabelei curente.
5.

Introducerea datelor de la tastatur

comenzile INPUT i ACCEPT


INPUT ACCEPT [<expc>] TO <var>

Comenzile permit introducerea de la tastatur a unei valorii pentru variabila <var>, textul <expc>
precednd pe ecran poziia de introducere a acesteia. Particularitatea comenzii ACCEPT const n faptul c,
prin intermediul ei se pot introduce de la tastatur numai valori alfanumerice.

38

comanda @ GET i combinaia @ SAY GET


@<lin>,<col>GET<var> <cmp> [PICTURE<expc1>]
[FUNCTION <expc2>]
[DEFAULT <expr1>] [MESSAGE <expc3>]
[WHEN <expl2>]
[RANGE [<expr2>][,<expr3>]] [VALID <expl1>]
[FONT <expc4>[,<expn1>]][STYLE <expc5>]
[SIZE <expn2>,<expn3>]
[COLOR <culori> COLOR SCHEME <expn4>]

Comanda permite editarea unei variabile sau a unui cmp al unei tabele fie la coordonatele specificate
prin <lin>,<col>, fie la poziia urmtoare de pe ecran care urmeaz dup SAY (atunci cnd comenzile SAY
i GET sunt grupate mpreun). O comand @GET (sau grup de comenzi @GET) este urmat de o
comand READ, care va declana citirea cmpului GET i atribuirea valorii citite lui <var> <cmp>.
6.

Adugarea unor noi nregistrri n cadrul unei tabele

comenzile de tip APPEND


APPEND [BLANK] [IN <zon_de_lucru> <alias>]

Comanda adaug o nregistrare la sfritul tabelei cuente sau celei specificate prin IN
<zon_de_lucru> <alias>. Clauza BLANK adaug o nregistrare vid. Comanda APPEND fr BLANK
este folosit pentru adugarea de nregistrri prin intermediul unei ferestre de editare.
APPEND FROM <fiier> [FIELDS <list_cmpuri>]
[FOR <expl1>]
[DELIMITED WITH TAB WITH<delimitator> WITH BLANK]
[TYPE]
[DIF FW2 MOD PDOX RPD SDF SYLK WK1 WK3
WKS WR1 WRK XLS]
Tabela curent poat fi mbogit cu noi nregistrri, al cror coninut va fi preluat dintr-un alt fiier
specificat. <list_cmpuri> reprezint cmpurile ale cror valori vor fi adugate n tabela curent.
n mod implicit sunt preluate din <fiier> toate nregistrrile i adugate la coninutul tabelei curente.
Se poate limita setul de nregistrri din <fiier> care se vor aduga la acelea care ndeplinesc o anumit
condiie <expl1>. Dac fiierul surs nu este o tabel de date (.DBF), atunci trebuie specificat tipul acestuia
n conformitate cu opiunile oferite de ctre sintaxa general a comenzii.
comanda INSERT -SQL
INSERT INTO <tabela1> [(<cmp1> [, <cmp2>, ...] )]
VALUES (<expr1> [,<expr2>, ...])
Comanda INSERT SQL adaug o nregistrare n <tabela1>. Cmpurile specificate ale noii
nregistrri se vor completa cu valorile precizate. Dac tabela nu este deschis, ea se va deschide ntr-o nou
zon de lucru, n mod exclusiv.
7.

Modificarea coninutului tabelelor

comanda REPLACE

39

REPLACE <cmp1> WITH <expr1> [ADDITIVE]


[, <cmp2> WITH <expr2> [ADDITIVE] ]
[<domeniu>]
[FOR <cond1>] [WHILE <cond2>]
Comanda REPLACE actualizeaz nregistrrile tabelei curente prin nlocuirea datelor din cmpurile
<cmp1>, <cmp2>, cu valorile expresiilor <expr1>, <expr2>Prin ataarea clauzei ADDITIVE
cmpului <cmpi> specificat n comanda REPLACE, la coninutul curent al acestuia se va aduna valoarea
expresiei <expri>.
n mod implicit, sunt afectate cmpurile nregistrrii curente. Se poate extinde domeniul de aciune al
comenzii prin includerea clauzei <domeniu> n sintaxa comenzii, n una din variantele: ALL, NEXT,
RECORD sau REST.
nregistrrile din <domeniu> afectate de comanda REPLACE pot fi numai acelea pentru care
condiia <cond1> din clauza FOR este ndeplinit. Totodat, nlocuirea stabilit prin comanda REPLACE
poate avea loc atta timp ct condiia <cond2> este adevrat. Deoarece comanda REPLACE actualizeaz i
index-urile active, este important ca operaia de nlocuire s nu fie efectuat asupra cmpului cheie atunci
cnd exist o clauz <domeniu>, FOR sau WHILE efectiv.
Pot fi actualizate prin REPLACE i cmpuri din tabele deschise n alte zone de lucru, dac pentru
acestea se va utiliza sintaxa <alias>.<cmpi>.

comanda UPDATE - SQL


UPDATE [<baz_de_date>] <tabela1>
SET <cmp1> = <expr1>
[, SET <cmp2> = <expr2> ...]
[WHERE <expl1>]

Modificarea valorilor cmpurilor unei tabele se poate realiza cu ajutorul comenzii UPDATE SQL.
Modificrile se vor efectua n <tabela1> i vor afecta cmpurile <cmp1>, <cmp2>, ... ale acesteia
conform setrilor stabilite. Prin includerea clauzei WHERE n sintaxa comenzii, se va limita domeniul
nregistrrilor luate n considerare la acelea care ndeplinesc condiia <expl1>.
8.

tergerea de nregistrri dintr-o tabel

comenzile DELETE i PACK


DELETE [<domeniu>] [FOR <expl1>] [WHILE <expl2>]

Comanda marcheaz nregistrri pentru tergere din tabela curent deschis. nregistrrile marcate pot
fi recuperate prin comanda RECALL.
DELETE FROM [<baz_de_date>] <tabela1>
[WHERE <expl1> ]
Din tabela specificat se vor terge logic toate nregistrrile pentru care condiia <expl1> este
ndeplinit.
PACK
Comanda PACK se folosete pentru tergerea fizic a nregistrrilor care anterior au fost marcate
logic.
9.

Operaii de baz cu o tabel. Exemplificare

40

Ne propunem s prezentm o variant nepretenioas de implementare a operaiilor de baz asupra


datelor dintr-o tabel tabel1 cu ajutorul comenzilor prezentate n cadrul acestui paragraf figura 2.4. Pe
suprafaa unei forme distincte se proiecteaz o machet de introducere a datelor cu ajutorul combinaiei
@SAYGET. Intregul coninut al tabelei va fi vizualizat cu ajutorul unui control de tip GRID respectiv cu
ajutorul comenzii @SAY. In cea de-a doua variant este necesar s se implementeze algoritmul de
parcurgere al tabelei nregistrare cu nregistrare. Totodat este implementat i operaia de tergere a
anumitor nregistrri specificate.

Fig. 2.4 Inregistrare date cu ajutorul comenzilor @SAY/GET


procedura frminreg_Activate
open database aplic3
use tabel1
opt = "d"
do while upper (opt) = "D"
append blank
@ 2,2 say "Cod client:" get cod_cl picture "9999"
@ 3,2 say "Nume :" get nume function "!xxxxxxxxxxxxxxx"
@ 4,2 say "Prenume:" get prenume function "!xxxxxxxxxx"
@ 5,2 say "Factura:" get fact picture "99999999"
@ 6,2 say "Cantitate:" get cant picture "9999999999"
@ 7,2 say "Pret:" get pret picture "99999999"
@ 8,2 say "Data facturii:" get data_fact
@ 11,2 say "Dorit sa continuati introducerea de date?D/N" get opt
read
replace valoare with cant*pret
enddo
use
close databases

41

Fig. 2.5 Afiarea cu ajutorul unui control de tip GRID

Fig. 2.6 Afiarea cu ajutorul comenzii @SAY

(*)

procedura frmAfisare_Activate
open database aplic3
use tabel1
go top
@ 2,1 say "Numele"
@ 2,17 say "Valoare"
@ 2,33 say "Data facturii"
linie = 3
do while not eof( )
@ linie,1 say nume
@ linie,17 say valoare
@ linie,33 say data_fact
linie = linie+1
skip
enddo
use
close databases

( ** )

Fig. 2.7 Controlul de tip Grid i operaia de tergere a nregistrrilor

42

Operaia de tergere a nregistrrilor este implementat cu ajutorul unui control de tip GRID, prin
intermediul cruia este vizualizat coninutul tabelei tabel1. nregistrarea ce urmeaz a fi ters se
selecteaz n cadrul controlului de tip GRID prin poziionare pe o anumit linie a acestuia, iar operaiile ce
urmeaz a fi executate vor fi incluse n corpul procedurii eveniment AfterRowColChange asociate grid-ului.
procedura frmstergere_Activate
public poz
thisform.cmdstergere.visible = .F.
open database aplicatie
procedura grid1_AfterRowColChange
poz = recno( )
if deleted( )
thisform.cmdstergere.visible = .F.
cls
else
thisform.cmdstergere.visible = .T.
endif

(*)

Controlul de tip GRID afieaz toate nregistrrile tabelei asociate, cele terse logic prin comenzi de
tip DELETE fiind marcate corespunztor. Distincia ntre o nregistrare efectiv i una tears logic se poate
face cu ajutorul funciei logice DELETED( ).
procedura cmdstergere_Click
go poz
@ 7,60 say "Nume: " + nume
@ 8,60 say "Valoare: " + ltrim(str(valoare))
thisform.command1.visible = .F.
on key label del delete

( ** )

Pe ecran sunt afiate informaii extrase din nregistrarea selectat, pentru tergere urmnd a se apsa
tasta <Del>. Conform specificrii efectuate prin comanda ON KEY LABEL, comanda DELETE va fi
executat dup apsarea acestei taste.
procedura cmdintoarcere_Click
close tables
use tabel1
pack
use
close databases
on key
thisform.release

2.3. Comenzile BROWSE,


BROWSE, CHANGE i EDIT
BROWSE
[FIELDS <cmp1> [, <cmp2> ...]]
[FONT <font> [, <dimensiune>]] [STYLE <stil>]
[FOR <expr1> ]
[FREEZE <cmpi>]
[KEY <expr2 [, <expr3>]]
[NOAPPEND] [NODELETE][NOEDIT | NOMODIFY]
[PARTITION <coloan> [LEDIT] [REDIT]]
[TITLE <titlu>]

43

[WIDTH <lungime>]
Comanda BROWSE determin apariia pe ecran, n cadrul formei sau ferestrei curente, a ferestrei
speciale Browse. Aceasta reprezint principalul instrument pentru realizarea diferitelor operaii de prelucrare
asupra datelor din tabela curent. n cadrul ferestrei Browse este afiat coninutul tabelei, n mod implicit
ntr-un format tabelar, coloanele reprezentnd cmpuri, iar liniile nregistrri), coninut care poate fi
modificat de utilizator n mod interactiv. Se pot aduga noi nregistrri sau terge nregistrri existente, se
poate interveni asupra coninutului oricrui cmp i al oricrei nregistrri, se pot cuta diferite date, etc. n
mod implicit sunt afiate toate cmpurile din structura tabelei. Se poate restrnge afiarea la anumite cmpuri
utiliznd clauza FIELDS. Printre cmpurile specificate pot s apar i cmpuri dintr-o tabel referit,
deschis ntr-o alt zon de lucru. n acest caz se va utiliza sintaxa <pseudonume>.<cmp>.
Formatul de afiare al datelor vizualizate n cadrul ferestrei Browse, poate fi impus prin intermediul
clauzelor FONT i STYLE. n absena acestor clauze, pentru afiarea datelor n cadrul ferestrei Browse se
va utiliza fontul MS Sans Serif, stilul de afiare va fi cel normal, iar caracterele vor fi de dimensiune 8.
n mod implicit sunt afiate toate nregistrrile tabelei curente. Se poate restrnge afiarea la anumite
nregistrri care ndeplinesc o anumit condiie impus prin intermediul clauzei FOR.
n mod implicit, prin intermediul ferestrei Browse este posibil modificarea coninutului oricrui
cmp afiat n fereastr. Dac se va dori modificarea coninutului a numai unui singur cmp, atunci se va
specifica acest cmp i prin clauza FREEZE <cmpi>.
n cazul tabelelor indexate, se poate limita afiarea la acele nregistrri care conin o anumit valoare a
cheii de indexare <expr2> sau care conin valori ale acesteia cuprinse n intervalul [<expr2>, <expr3>].
Operarea n cadrul ferestrei Browse poate fi limitat prin introducerea clauzelor NOAPPEND,
NODELETE, NOEDIT sau NOMODIFY.
Fereastra Browse poate fi mprit n dou subferestre (partiii) de vizualizare, limita dintre cele dou
ferestre fiind specificat printr-un numr de coloan PARTITION <coloan>. Dac se apeleaz la clauza
LEDIT/REDIT, atunci partiia (subfereastra) stnga/dreapt va corespunde modului EDIT de afiare,
partiia dreapt/stng fiind n modul standard Browse de afiare.
n mod implicit, n bara de titlu a ferestrei Browse apare numele tabelei vizualizate. Se poate impune
un text oarecare prin intermediul clauzei TITLE.
Clauza WIDTH <lungime> impune limea coloanelor de afiare din ferestra Browse, indiferent de
dimensiunea cmpurilor tabelei. n cazul cmpurilor de dimensiuni mai mari dect <lungime>, coloanele
aferente acestora vor fi prevzute cu bare de difilare pe orizontal.
Comenzile CHANGE i EDIT prezint o sintax similar lui BROWSE, fereastra de vizualizare a
coninutului tabelei fiind ns diferit.
CHANGE | EDIT
[FIELDS <cmp1> [, <cmp2> ...]]
[FONT <font> [, <dimensiune>]] [STYLE <stil>]
[<domeniu> [FOR <expr1> ] [WHILE <expr2>]
[FREEZE <cmpi>]
[KEY <expr3 [, <expr4>]]
[NOAPPEND][NODELETE][NOEDIT | NOMODIFY]
[PARTITION <coloan> [LEDIT] [REDIT]]
[WIDTH <lungime>]
Prin clauza <domeniu> se poate stabili mulimea nregistrrilor din tabela curent ce vor fi afiate
ntr-o fereastr de tip Change sau Edit. Clauzele FOR i WHILE se vor aplica numai nregistrrilor din
<domeniu>. Acesta poate fi ALL, NEXT n, REST sau RECORD n.

44

2.4. Comenzile SCATTER i GATHER


SCATTER
[FIELDS <cmp1> [,<cmp2> ...]
| FIELDS LIKE <cond1> | FIELDS EXCEPT <cond2>] [MEMO]
TO <tablou1> | TO <tablou2> BLANK | MEMVAR | MEMVAR BLANK
Comanda copiaz coninutul cmpurilor din nregistrarea curent ntr-un set de variabile simple sau
ntr-un tablou. Dac se utilizeaz clauza FIELDS, atunci se vor lua n considerare doar cmpurile specificate
explicit prin intermediul acesteia. Incluznd clauza FIELDS LIKE respectiv FIELDS EXCEPT n sintaxa
comenzii, se poate condiiona transferul cmpurilor n memorie la acelea care ndeplinesc <cond1> respectiv
la acelea care nu ndeplinesc <cond2>. n mod implicit, cmpurile de tip memo sunt ignorate de ctre
comanda SCATTER. Pentru a transfera i coninutul acestor cmpuri, se va introduce clauza MEMO n
sintaxa comenzii.
Clauza TO <tablou1> specific tabloul n care se copiaz coninutul cmpurilor nregistrrii curente:
primul element al tabloutui va conine valoarea primului cmp, al doilea element al tabloului valoarea celui
de-al doilea cmp, etc. Dac tabloul are mai multe elemente disponibile dect cmpuri n nregistrare,
elementele nefolosite rmn neschimbate. Dac tabloul nu exist sau dimensiunea sa este prea mic, el este
creat automat, tipurile de date ale elementelor tabloului vor fi cele ale cmpurilor de unde se copiaz
coninutul. Clauza TO <tablou2> BLANK creaz un tablou cu elemente vide de acelai tip i de aceeai
dimensiune ca i cmpurile tabelei curente. Clauza MEMVAR determin transferul coninutului cmpurilor
tabelei curente ntr-un set de variabile, pentru fiecare cmp transferat generndu-se o variabil cu acelai
nume ca i cmpul respectiv, de acelai tip i de aceeai dimensiune ca acesta. O astfel de variabil, obinut
n urma execuiei unei comenzi SCATTER, se refer utiliznd notaia
M.<nume_cmp>.
Clauza MEMVAR BLANK creeaz un set de variabile fr coninut.
GATHER FROM <tablou> | MEMVAR
[FIELDS <cmp1> [, <cmp2>...]
| FIELDS LIKE <cond1> | FIELDS EXCEPT <cond2>] [MEMO]
Comanda mut coninutul unui set de variabile sau al unor elemente de tablou n cmpurile
nregistrrii curente, fiind opus comenzii SCATTER.

2.5 Dezvoltarea aplicaiilor. Interfee vizuale


O aplicaie Visual FoxPro este o aplicaie dirijat de evenimente, respectnd regulile de comportare a
aplicaiilor sub sistemul de operare Windows. Dezvoltarea unei aplicaii ncepe cu proiectarea interfeei
vizuale a acesteia i continu cu formularea procedurilor eveniment necesare implementrii aplicaiei.
1. O aplicaie elementar cu forme de tip SDI
Interfaa aplicaiei este proiectat n stil SDI (Single Document Interface), constnd din trei forme
independente. Forma principal conine trei butoane de comanda cmdcreare, cmdadaugare i
cmdvizualizare. Acestea permit utilizatorului executarea unui click pe ele pentru a ndeplini anumite aciuni.
Ori de cte ori utilizatorul execut un click pe un buton de comand, procedura corespunztoare
evenimentului Click este invocat. Pentru a ndeplini aciunea dorit, se va plasa codul respectiv n
procedura evenimentului Click figura 2.8.
Se propune utilizarea comenzii CALCULATE pentru numerotarea liniilor unei facturi i n
determinarea valorii totale a acesteia . Comanda va efectua calculele indicate de utilizator prin intermediul

45

expresiilor <expr1>, <expr2>, , n formularea crora se pot utiliza funcii statistice i/sau financiare
standard, cum ar fi AVG, CNT, MAX, MIN, NVP, STD, SUM i VAR.

CALCULATE <expr1> [ expr2 ]


[<domeniu>] [FOR <expl1>] [WHILE <expl2>]
[TO <var1> [<var2> ] TO ARRAY <tablou>]
Operaiile specificate se vor aplica asupra valorilor unor cmpuri ale tabelei curent deschise i/sau
variabile. Prelucrarea se poate limita la nregistrrile care aparin unui anumit <domeniu> i/sau ndeplinesc
o anumit condiie <expl1> i/sau prelucrarea poate avea loc atta timp ct o anumit condiie <expl2>
rmne adevrat. Rezultatul poate fi memorat n variabile sau ntr-un tablou.
procedura - cmdcreare_Click
create table linie_factura (nr_factura N(8), nr_linie N(2), cod_material N(8),;
pret N(8),cantitate N(8))
use

Fig. 2.8 Evidena facturilor


procedura - cmdadaugare_Click
do form frmadaugare
thisform.release
procedura - cmdvizualizare_Click
do form frmvizualizare
thisform.release
Introducerea liniilor unei facturi are loc prin intermediul unei forme distincte, pe care sunt plasate
controale de tip caset de text. Coninutul curent al unei casete de text este dat de valoarea proprietii Value
a acesteia. Instruciunile de iniializare a formei se vor ataa procedurii eveniment Activate.
procedura - frmadaugare_Activate
thisform.txtnrfactura.value = ""
thisform.txtcod.value = ""
thisform.txtpret.value = ""
thisform.txtcantitate.value = ""
use linie_factura
Numrul noii linii se calculeaz n funcie de poziiile existente pe factur.
procedura - cmdinreg_Click
set talk off
linie = 0
calculate max(nr_linie) for nr_factura = val(thisform.txtnrfactura.value) to linie
append blank
replace nr_factura with val(thisform.txtnrfactura.value)
replace nr_linie with linie + 1

replace cod_material with val(thisform.txtcod.value)


replace pret with val(thisform.txtpret.value)
replace cantitate with val(thisform.txtcantitate.value)
thisform.txtnrfactura.value = ""
thisform.txtcod.value = ""
thisform.txtpret.value = ""
thisform.txtcantitate.value = ""
procedura cmdrev_Click
use
thisform.release
do form frmoptiuni
Vizualizarea facturii specificate prin nr are loc ntr-o fereastr Browse. Totodat se va calcula
valoarea total a facturii i se va afia n bara de titlu a acesteia.
procedura frmvizualizare_Activate
set talk off
nr = 0
total = 0
use linie_factura
@2,10 say "NR. FACTURA: " get nr picture '99999999'
read
calculate sum(pret*cantitate) for nr = nr_factura to total
titlu = 'Factura: ' + ltrim(str(nr)) + ' Total: ' + ltrim(str(total))
browse fields nr_linie,cod_material,pret,cantitate nomodify noappend nodelete;
title titlu for nr = nr_factura
use
clear
set talk on

2. Combinarea formelor i a ferestrelor WINDOW


Crearea unei ferestre utilizator, specificarea atributelor i a caracteristicilor sale se realizeaz prin
comanda DEFINE WINDOW. Ferestrele utilizate sunt create ntr-o etap distinct activrii i afirii lor pe
ecran prin comenzile ACTIVATE WINDOW i SHOW WINDOW. Ferestrele astfel definite i activate vor
rmne afiate pe ecran pn la executarea unei comenzi DEACTIVATE WINDOW sau HIDE WINDOW.
DEFINE WINDOW <nume> FROM <lin1,col1> TO <lin2,col2>
AT <lin3,col3> SIZE <lin4,col4>
[IN [WINDOW] <fer> IN SCREEN]
ACTIVATE SHOW DEACTIVATE HIDE WINDOW <nume>
Este implementat att operaia de nregistrare a intrrilor/ieirilor de material ct i actualizarea
stocului curent. Materialul se specific cu ajutorul unui control de tip list derulant ComboBox ce afieaz
o list cu codurile tuturor materialelor din gestiune. Cele trei controale cbocod, txtpret i txtstoc sunt legate
de cmpurile tabelei stocuri, astfel nct n casetele de text s fie preluat automat informaia din
nregistrarea ce conine codul materialului selectat.
Totodat, ntr-o fereastr Browse sunt afiate operaiile de intrare/ieire pentru materialul ales. Orice
modificare n cadrul ferestrei Browse se va reflecta i n actualizarea stocului curent dup nchiderea acestei
ferestre. Fereastra Browse se va deschide n cadrul unei ferestre utilizator definite prin DEFINE WINDOW.

Legarea unui control de un cmp dintr-o tabel deschis este posibil prin setarea corespunztoare a
valorii proprietii ControlSource (stocuri.cod) a controlului respectiv. n ceea ce privete controlul de tip
ComboBox, lista de elemente ataat acestuia se genereaz conform specificrilor fcute prin proprietile
RowSource Type (6-Fields) i RowSource (stocuri.cod ) ale controlului.

Fig. 2.9 Interfaa aplicaiei de gestiune a stocurilor


procedura - frmlocaliz_Load
set talk off
public p
open database magazie
use stocuri order cod alias stocuri in 1
use io order cod alias io in 2
p=0
procedura frmlocaliz_Activate
if p = 1
wait ""
endif
thisform.txtpret.visible = .F.
thisform.txtstoc.visible = .F.
thisform.lblpret.visible = .F.
thisform.lblstoc.visible = .F.
n fereastra utilizator op se vor afia toate ntrrile/ieirile ale materialului cod_spec. Deoarece, n
fereastra Browse se afieaz numai coninutul cmpurilor data_op i cantitate, nregistrrile noi adugate
prin intermediul acestei ferestre au cmpul cod necompletat. Acesta se va completa ulterior cu valoarea
cod_spec. Apoi se va recalcula, printr-o comanda CALCULATE, stocul curent al acestui material.
procedura cbocod_Click
p=1
cod_spec = val(thisform.cbocod.text)
define window op from 3,28 to 16,55
select stocuri
seek cod_spec
thisform.txtpret.value = pret
thisform.txtstoc.value = stoc
thisform.txtpret.visible = .T.
thisform.txtstoc.visible = .T.
thisform.lblpret.visible = .T.

thisform.lblstoc.visible = .T.
activate window op
select io
browse fields data_op,cantitate for cod = cod_spec
replace cod with cod_spec for cod<1
calculate sum(cantitate) to stoc_curent for cod = cod_spec
frmlocaliz.txtstoc.value = stoc_curent
deactivate window op
procedura frmlocaliz_Unload
close databases
set talk on

3. Forme generate cu ajutorulWizard-ului

Fig. 2.10 nlnuirea formelor n crearea interfeei aplicaiei

procedura cmdCreare_Click
create database gest
create table produse (codp N(5) primary key check codp>10000;
error "Codul produsului trebuie sa fie de 5 cifre !",;
denp C(16) not null check substr(denp,1,1)=upper(substr(denp,1,1));
error "Prima litera din denumire este obligatoriu majuscula !",ump C(3))
create table beneficiari (codb N(5) primary key check codb>0;
error "Codul beneficiarului trebuie sa fie mai mare ca zero !",;
denb C(30) not null, str C(20),nr n(3),loc c(20), tel n(7),ctbc c(15))
create table contracte (codp N(5) check codp>10000 ;
error "Codul produsului trebuie sa fie de 5 cifre !",;
codb N(5) check codb>0 error "Codul trebuie sa fie mai mare ca zero !",;
prl N(8,2),cantl N(7),termenl D(8), cl M(4),;
foreign key codp tag codp references produse,;
foreign key codb tag codb references beneficiari)
close tables
close databases
procedura cmdInreg_Click
thisform.release
do form frminreg
procedura cmdcb_Click
thisform.release
do form frmcontrbenef
Forma de ntegistrare frminreg conine un grup de butoane de comand, acionarea unui buton
activnd o form specific pentru introducerea datelor. n ceea ce privete operaia de nregistrare a unui nou
contract s-a proiectat forma CONTRACTE (figura 2.10), pentru introducerea produselor i a clienilor
apelndu-se ns la ajutorul FormWizard-ului figura 2.11.
procedura - frmContracte_Activate
open database gest
use produse order codp alias pr in 1
use beneficiari order codb alias benef in 2
thisform.txtprl.value = ""
thisform.txtcantl.value = ""
thisform.txttermen.value = { / / }
thisform.edit1.value = ""
procedura cmdInregistrare_Click
p = val (thisform.combo1.text)
b = val (thisform.combo2.text)
insert into contracte (codp,codb,prl,cantl,termenl,cl);
values p,b,val (thisform.txtprl.value),val (thisform.txtcantl.value),;
thisform.txttermen.value,thisform.edit1.value)
thisform.txtprl.value = ""
thisform.txtcantl.value = ""
thisform.txttermen.value = { / / }
thisform.edit1.value = ""
thisform.combo1.value = ""
thisform.combo2.value = ""
procedura cmdQuit_Click
close tables
close databases

thisform.release
do form frminreg

Fig. 2.11 Forme generate cu ajutorul FormWizard-ului

Ne propunem s afism ntr-o fereastr Browse contractele destinate unui anumit beneficiar specificat
cu ajutorul unui control de tip ComboBox legat de cmpul "codb" al tabelei "Beneficiari". Datorit relaiilor
definite ntre cele trei tabele, n fereastra Browse vor fi afiate contractile solicitate.
procedura frmcontrbenef_Activate
open database gest
use produse order codp alias pr in 1
use beneficiari order codb alias benef in 2
use contracte alias contr in 3
procedura cmdOk_Click
b = val(thisform.combo1.text)
select 3
browse fields codp, pr.denp, prl, cantl for codb = b title benef.denb

4. Controale & elemente de programare avansat


A). n formularea primului exemplu am apelat la un control de tip ListBox ce va fi utilizat n
identificarea unui anumit element - figura 2.12. Procedura de cutare localizeaz un anumit cont, specificat
prin simbolul su, n planul de conturi Planctb.dbf - vizualizat prin intermediul controlului de tip ListBox.

Fig. 2.12 Cutarea binar i controlul de tip ListBox


procedura cmdCauta_Click( )
if isblank (thisform.txtCautare.text)
messagebox("Completati text box-ul ''Cont cautat'' !",48,"Avertizare")
return
endif
cautat = thisform.txtCautare.value
inf = 1
sup = thisform.lstPlan_ctb.listcount
do while inf < sup
val_cautat = (inf+sup)/2
if cautat == thisform.lstPlan_ctb.list (val_cautat)
exit
endif
if cautat > thisform.lstPlan_ctb.list (val_cautat)
inf = val_cautat
else
sup = val_cautat

endif
enddo
if inf = sup
messagebox ("Contul "+cautat+" nu este un cont valid !",48,"Avertizare")
else
thisform.lstPlan_ctb.selected (val_cautat) = .T.
thisform.lstPlan_ctb.topindex = val_cautat
endif
thisform.txtCautare.value = ""

B). n urmtorul exemplu vom programa coninutul unui control de tip ListBox cu ajutorul unei
interogri SQL. Proprietatea RowSourceType a unui control de tip list specific tipul sursei de date pentru
acesta. Optndu-se pentru 3-SQL statement, n proprietatea RowSource se poate include comanda SELECT
SQL pentru generarea listei de informaii a controlului. Proprietatea RowSource se poate seta i prin
program, caz n care comanda SELECT se va pune ntre ghilimele. n secvena de iniializare a formei,
comanda SELECT afieaz cmpurile "nume" + "prenume", "nrbi", "nrpass" i "idcli" ntr-un cursor.

Fig. 2.13 Programarea coninutului unui ListBox


procedura frmClienti_Init
select clients
set order to idcli
thisform.list1.rowsource = "select alltrim(nume)+' '+alltrim(prenume) as numcli,;
nrbi, nrpass, idcli from clients;
into cursor mylist order by nume,prenume"
if thisform.list1.listcount >= 1
thisform.list1.enabled = .T.
thisform.list1.listitemid = 1
thisform.cmddel.enabled = .T.
thisform.cmdmod.enabled = .T.
else
thisform.list1.enabled = .F.
thisform.cmddel.enabled = .F.
thisform.cmdmod.enabled = .F.
endif

C). Considernd baza de date evid figura 1.13 creat conform metodologiei prezentate n cadrul
paragrafului 1.6, vom prezenta un algoritm de nregistrare a unei note la o anumit disciplin dintr-un an de
studiu figura 2.14.

(*)

Fig. 2.14 Interfaa aplicaiei


procedura frmInreg_Activate
public zona
open database evid
* se populeaz primul ComboBox cu studentii luai n eviden
use date_pers order nr_leg in 5
thisform.cbostud.rowsource = "select date_pers.nr_leg from date_pers;
into cursor c"
* zona marcat cu ( * ) nu va apare pe ecran dect dup ce s-a selectat un anumit student,
* dar ea se pregtete cu informaiile adecvate apariiei sale ulterioare; totodat se vor
* deschide, n zone diferite, cele patru fiiere de note;
< se ascunde zona ( * )>
for i = 1 to 4
a = "anul" + ltrim(str(i))
select (i)
use &a
endfor
thisform.optiongroup1.option1.value = 1
select 1
zona = 1
nr_campuri = afields(t)-1
for i = 1 to nr_campuri
nota = "n" + ltrim(str(i))
thisform.cbonote.additem((nota),i)
next i
procedura cmdOkStud_Click( )
nr = val(thisform.cbostud.text)
seek nr in 5
* n cazul specificrii unui student nou, acesta va fi luat n eviden i i se va
* insera cte o nregistrare n cele 4 fiiere de note
if not found(5)
insert into date_pers (nr_leg) values (nr)
for i = 1 to 4
a = "anul" + ltrim(str(i))
insert into &a (nr_leg) values (nr)

next i
endif
< se face vizibil zona ( * )>
Disciplinele vizualizate de ctre cel de-al doilea ComboBox depind de anul selectat din cadrul
grupului de butoane de opiune.
procedura optiongroup1_Click( )
with thisform
.cbonote.clear
do case
case .optiongroup1.option1.value = 1
select 1
case .optiongroup1.option2.value = 1
select 2
case .optiongroup1.option3.value = 1
select 3
case .optiongroup1.option4.value = 1
select 4
endcase
zona = select(0)
nr_campuri = afields(t)-1
for i = 1 to nr_campuri
nota = "n" + ltrim(str(i))
.cbonote.additem((nota),i)
next i
endwith
n final, nregistrarea unei note efectundu-se dup cum urmeaz, n variabila global "zona"
fiind memorat anul selectat.
procedura - cmdOkNota_Click( )
select (zona)
camp_nota = thisform.combo1.value
replace &camp_nota with val(thisform.text1.value)
procedura cmdQuit_Click( )
thisform.release
close databases

D). n exemplul urmtor figura 2.15 este propus o variant de parcurgere a unor tabele legate,
fiind definite n acest scop dou butoane de comand speciale. Deplasarea n tabela printe este
implementat cu ajutorul comenzii SKIP, fiind tratat explicit momentul atingerii sfritului/nceputului
fiierului. Controalele de tip TextBox utilizate sunt legate de cmpurile al cror coninut trebuie s-l
vizualizeze.
procedura frmAfis_Activate( )
use salar order marca in 2
use personal order marca in 1
select 1
set relation to marca into 2
procedura cmdUrmator_Click ( )
if not bof ( )
thisform.cmdPredecesor.Enabled = .T.

endif
if not eof ( )
skip
if eof ( )
skip -1
thisform.cmdUrmator.Enabled = .F.
endif
endif
procedura cmdPredecesor_Click ( )
if not eof ( )
thisform.cmdUrmator.Enabled = .T.
endif
if not bof ( )
skip -1
if bof ( )
skip
thisform.cmdPredecesor.Enabled = .F.
endif
endif

Fig. 2.15 O variant de parcurgere a tabelelor

2.6. Elemente de programare orientat obiect


Un obiect 7 este un model informaional al unei entiti reale, care posed o mulime de proprieti i
care are n acelai timp un anumit comportament. Avnd n vedere proprietile comune i comportamentul
similar al entitilor pe care le modeleaz, obiectele pot fi mprite n mulimi. O mulime de obiecte de
acelai fel constituie o clas, care poate fi descris prin modelul comun al obiectelor sale. Se poate afirma c
o clas de obiecte se manifest ca un tip de obiect, modelul comun al obiectelor constituind modelul de
definire a tipului obiect. n consecin, obiectele individuale constituie manifestri, realizri sau instanieri
ale unei clase. O definiie minimal a unei clase trebuie s cuprind descrierea proprietilor i metodelor
acesteia. Proprietile sunt acele trsturi ale obiectului care au fost reinute ca importante n procesul de
abstractizare, iar cu ajutorul metodelor se definete comportamentul tuturor obiectelor din clasa respectiv.
DEFINE CLASS <nume_clas> AS <tip_baz1>
[<list_proprieti1>]
[ADD OBJECT <nume_obiect> AS <tip_baz2>
[WITH <list_proprieti2>]]...
[PROCEDURE <nume_procedur>
<comenzi>
ENDPROC]...
ENDDEFINE
Obiectele grafice aparinnd clasei <nume_clas> sunt de tipul <tip_baz1> i sunt nzestrate cu
proprietile specificate n <list_proprieti1>. Ele pot conine o serie de alte obiecte <nume_obiect> de
tipul <tip_baz2> i avnd proprietile specificate prin <list_proprieti2>. Comportamentul tuturor
acestor obiecte este stabilit cu ajutorul procedurilor (metodelor) incluse n definiia clasei. n exemplul de
mai jos fiierul de proceduri conine definiia unei clase de forme frmutil, a unui grup de butoane de
opiune optutil, precum i a unei liste - lstutil.
procedure def_clasa
define class frmutil as form
left = 300
top = 150
width = 375
height = 250
caption = 'Forma definita cu DEFINE CLASS'
add object cmdinreg as commandbutton;
with caption = 'Inregistrare',top = 40,left = 130,width = 115,;
height = 25, fontbold = .T.
add object cmdlist as commandbutton;
with caption = 'Listare',top = 80,left = 130,width = 115,height = 25,fontbold = .T.
add object cmdrev as commandbutton;
with caption = 'Revenire',top = 120,left = 130,width = 115,;
height = 25,fontbold = .T.
procedure cmdinreg.click
do form frminreg
endproc
procedure cmdlist.click
do form frmlist
endproc
procedure cmdrev.click
X.release
do form frmprinc
7

Roca I. Gh., Ghilic-Micu B., Apostol C., Roca V., Cocianu C.L., Programarea calculatoarelor, Editura ASE, 2002

endproc
enddefine
define class optutil as optiongroup
buttoncount = 3
top = 60
left=75
height = 70
width = 110
procedure click
do case
case thisform.Y.value = 1
messagebox("S-a ales prima optiune !")
case thisform.Y.value = 2
messagebox("S-a ales a doua optiune !")
case thisform.Y.value = 3
messagebox("S-a ales a treia optiune !")
endcase
endproc
enddefine
define class lstutil as listbox
left = 80
top = 60
procedure click
for i = 1 to thisform.Z.listcount
if thisform.Z.selected(i)
messagebox("S-a selectat - " + thisform.Z.list(i))
endif
endfor
endproc
enddefine
return

obiectul X definit ca
instan a clasei frmutil
Fig. 2.16 Definirea i utilizarea claselor de obiecte

procedura frmprinc_click
public X
set procedure to fisproc
procedura cmdcont_click
thisform.release
X = createobject("frmutil")
X.activate
X.cmdinreg.setfocus
procedura cmdiesire_click
thisform.release
X, Y i Z sunt definite ca variablile globale la nivelul aplicaiei i reprezint obiecte componente ale
claselor definite figura 2.16. Conform codului procedurii eveniment cmdinreg.click inclus n definiia
clasei frmutil, acionarea acestui buton aduce n prim plan forma frminreg. Apariia ferestrei MessageBox
are loc n conformitate cu cele stabilite n codul procedurii eveniment Click incluse n definiia clasei
optutil.

Fig. 2.17 Includerea obiectului Y n cadrul formei frminreg


procedura frminreg_Activate
public Y
set procedure to fisproc
thisform.addobject('Y','optutil')
thisform.Y.option1.caption = 'Optiunea I'
thisform.Y.option2.caption = 'Optiunea a II-a'
thisform.Y.option3.caption = 'Optiunea a III-a'
thisform.Y.setall('width',110)
thisform.Y.visible = .T.
procedura cmdrev_Click
release Y
thisform.release
n procedura eveniment Activate, asociat formei frmlist este inclus secvena de creeare a obiectului
de tip list Z, iar comportamentul su este descris n procedura eveniment Click specificat n cadrul
definiiei clasei lstutil figura 2.18.
procedura frmlist_Activate

public Z
public tablou(3)
tablou(1) = "Unu"
tablou(2) = "Doi"
tablou(3) = "Trei"
set procedure to fisproc
thisform.addobject('Z','lstutil')
thisform.Z.rowsourcetype = 5
thisform.Z.rowsource = 'tablou'
thisform.Z.visible=.T.
procedura cmdrev_Click
release Z
thisform.release

Fig. 2.18 Includerea obiectului Z n cadrul formei frmlist


Pe lng un bogat sortiment de clase predefinite, Visual FoxPro dispune de faciliti ce ofer
programatorului posibilitatea crerii i utilizrii propriilor clase 8. Acesta va decide dac va creea sau nu cte
o clas pentru fiecare form sau control pe care dorete s-l utilizeze n cadrul aplicaiei sale. Acest lucru
poate avea ns consecine nedorite n ceea ce privete fiabilitatea aplicaiei, i anume:

o redundan nedorit, dat de clasele ale cror obiective se suprapun ntr-o oarecare msur, dar
care trebuie ntreinute separat ;

un grad redus de reutilizare a software-lui, dat de numai cele cteva utilizri ale unei clase n
gradul aplicaiei i/sau n cadrul altor aplicaii.

Fotache M., Brava I., Strmbei C., Creu L., Visual FoxPro. Ghidul dezvoltrii aplicaiilor profesionale, Editura Polirom,
Iai, 2002

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