Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq...

44
Capitolul 4 Programarea în Visual FoxPro -obiect, oferind suficien - obiect. 4.1. 6FXUWLQWURGXFHUHvQWHRULDSURJUDPULL - - analiza problemei se pot reprezenta formal, este b sub forma algoritmului - date de intrare . Într-un algoritm, aceste date se împart în variabile constante simboli - tate. Practic, în , elementare proiectarea acestuia, dar programatorii s- i necesare transferului unui text din - COPY,

Transcript of Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq...

Page 1: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Capitolul 4

Programarea în Visual FoxPro

3H OkQJ� PRWRUXO GH ED]H GH GDWH� 9LVXDO )R[3UR RIHU� XQ OLPEDM GH SURJUDPDUH SURSULX

GHVWXO GH SXWHUQLF� FH vPELQ� SHUIHFW VWLOXO GH SURJUDPDUH FODVLF �SURFHGXUDO� FX

SURJUDPDUHD RULHQWDW�-obiect, oferind suficienWH LQVWUXPHQWH GH GH]YROWDUH UDSLG� D XQRU

DSOLFD LL SXWHUQLFH úL IOH[LELOH� ÌQ DFHVW FDSLWRO YRP SUH]HQWD PRGHOXO GH SURJUDPDUH

VWUXFWXUDW�� XUPkQG FD vQ FDSLWROXO �� V� DERUG�P FDUDFWHULVWLFLOH SURJUDP�ULL RULHQWDWH-obiect.

4.1. �6FXUW��LQWURGXFHUH�vQ�WHRULD�SURJUDP�ULL

3URJUDPDUHD FDOFXODWRDUHORU HVWH R GLVFLSOLQ� GHVWXO GH QRX�� GDU VXSRUWXO V�X PDWHPDWLF

HVWH FHYD PDL YHFKL� ÌQ WHRULD SURJUDP�ULL FDOFXODWRDUHORU VH VSHFLILF� PDL PXO L SDúL vQ

FUHDUHD XQXL SURJUDP FDUH V� UH]ROYH R DQXPLW� SUREOHP�� $FHúWL SDúL PHUJ GH OD IRUPX-ODUHD úL VSHFLILFDUHD SUREOHPHL OD GHILQLUHD XQHL VROX LL� OD LPSOHPHQWDUH� WHVWDUH úL GRFX-PHQWDUH úL� vQ ILQH� OD HYDOXDUHD VROX LHL� 'DF� DQXPLWH DVSHFWH DOH SUREOHPHL GHVSULQVH GLQ

analiza problemei se pot reprezenta formal, este bLQH V� VH SURFHGH]H DVWIHO� GHRDUHFH R

SUREOHP�� R GDW� IRUPDOL]DW�� HVWH PDL XúRU GH DQDOL]DW SULQ SULVPD H[LVWHQ HL XQXL PRG GH

UH]ROYDUH �vQ FD]XO QRVWUX� DFHVW PRG GH UH]ROYDUH VH FRQFUHWL]HD]� vQ SURJUDPXO LQIRUPDWLF�� 'DF� SUREOHPD QRDVWU� DUH XQ PRGHO PDWHPDWLF� SDVXO XUP�WRU FRQVW� vQ J�VLUHD VROX LHL

sub forma algoritmului� 9RP VSXQH� SH VFXUW� F� XQ DOJRULWP HVWH R VXLW� ELQH GHILQLW� GH

LQVWUXF LXQL ÄFODUH´ FDUH VH SRW H[HFXWD ÄFX R FDQWLWDWH ILQLW� GH HIRUW úL vQWU-R SHULRDG� ILQLW�

GH WLPS´ úL FDUH ÄGXF vQWRWGHDXQD OD RE LQHUHD XQXL UH]XOWDW´� ÌQ WHKQLFD SURJUDP�ULL FDOFXODWRDUHORU� DOJRULWPXO DF LRQHD]� vQWRWGHDXQD DVXSUD XQRU

date de intrare� GXFkQG OD RE LQHUHD GDWHORU GH LHúLUH. Într-un algoritm, aceste date se împart în variabile úL constante� GXS� PRGXO vQ FDUH vúL PRGLILF� VDX QX YDORDUHD SH SDUFXUVXO

H[HFX LHL DOJRULWPXOXL� 'DF� GDWHOH GH LQWUDUH VXQW QXPHULFH� DWXQFL SUHOXFU�ULOH SH FDUH OH

YD UHDOL]D DOJRULWPXO VXQW SUHOXFU�UL QXPHULFH� GDF� H YRUED GH WH[WH� SUHOXFU�ULOH YRU IL

simboliFH� &kW GHVSUH LQVWUXF LXQH� DFHDVWD HVWH R RSHUD LH FDUH� FHO SX LQ WHRUHWLF� QX SRDWH

IL GHVFRPSXV� vQ RSHUD LL GH QLYHO PDL PLF I�U� D-úL SLHUGH VHQVXO� $VWIHO� DGXQDUHD QX SRDWH

IL GHVFRPSXV�� GDU vQPXO LUHD SRDWH IL FRQVLGHUDW� R VXLW� GH DGXQ�UL UHSHtate. Practic, în LQIRUPDWLF�, elementareVXQW QXPDL LQVWUXF LXQLOH ÄWXUQDWH´ vQ FLUFXLWHOH SURFHVRUXOXL OD

proiectarea acestuia, dar programatorii s-DX RELúQXLW V� QXPHDVF� LQVWUXF LXQL úL RSHUD LL GH

XQ QLYHO FHYD PDL PDUH� FD GH H[HPSOX VXLWD GH RSHUD Li necesare transferului unui text din PHPRULD LQWHUQ� SH HFUDQXO PRQLWRUXOXL� 8QLL YRUELWRUL �úL VFULLWRUL� IRORVHVF QR LXQLOH

FRPDQG� úL LQVWUXF LXQH FD VLQRQLPH� GHúL DFHVWHD QX VXQW FKLDU DVWIHO� $úDGDU� R FRPDQG�

DUH R VIHU� PDL ODUJ� GHFkW R LQVWUXF LXQH� 'H H[HPSOX� R FRPDQG� GH FUHDUH D XQHL WDEHOH

GLQ 9LVXDO )R[3UR VDX R FRPDQG� GH F�XWDUH D XQRU GDWH vQWU-R WDEHO� ODQVHD]� GH IDSW XQ

vQWUHJ DOJRULWP� /D IHO VH vQWkPSO� úL FX R FRPDQG� D VLVWHPXOXL GH RSHUDUH �GH H[HPSOX

COPY, FDUH� GHúL DFHVW OXFUX QX HVWH HYLGHQW� H[LVW� FKLDU úL vQ :LQGRZV��

Page 2: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 83

Într-XQ DOJRULWP DYHP XUP�WRDUHOH tipuri de LQVWUXF LXQL: • de atribuire; • de calcul; • de decizie; • de intrare-LHúLUH�

4.2. Structuri de control

,QVWUXF LXQLOH DOJRULWPXOXL XUPHD]� F�L GH H[HFX LH QXPLWH structuri de control. Am IRORVLW DLFL SOXUDOXO GHRDUHFH� vQ IXQF LH GH DQXPLWH FRQGL LL� SUHOXFUDUHD GDWHORU SRDWH OXD

F�L �UDPLILFD LL� GLIHULWH� 6WUXFWXULOH GH FRQWURO IXQGDPHQWDOH VXQW VHFYHQ D, VHOHF LD úL

LWHUD LD (vezi figura 4.1).

Instruc LXQH �

Instruc LXQH �

Instruc LXQH Q

Secven D Selec LD

Itera LD

Instruc LXQH �

Instruc LXQH � Instruc LXQH �

Condi LH

Instruc LXQH �

Instruc LXQH �Condi LH

DA

DA

NU

NU

Figura 4.1. Structuri de control fundamentale

ÌQ ����� %RHKP úL -DFRSLQL DX IXQGDPHQWDW WHRUHPD FDUH OH SRDUW� QXPHOH� FRQIRUP

F�UHLD RULFH DOJRULWP SRDWH IL UHSUH]HQWDW SULQ FRPELQDUHD FHORU WUHL WLSXUL GH VWUXFWXUL GH

control fundamentale.

Page 3: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

84 Visual FoxPro

$úDGDU� vQ SURJUDPDUHD VWUXFWXUDW�� DYHP XUP�WRDUHOH SRVLELOLW� L� • LQVWUXF LXQLOH VH H[HFXW� VHFYHQ LDO vQ RUGLQHD vQ FDUH DSDU �GH VXV vQ MRV�� SkQ� OD

XOWLPD �VHFYHQ D�� • vQ IXQF LH GH HYDOXDUHD XQHL FRQGL LL OD XQ PRPHQW GDW� VH H[HFXW� XQ JUXS GH

LQVWUXF LXQL VDX DOWXO �VHOHF LD VDX VWUXFWXULOH DOWHUQDWLYH�� 7UHEXLH SUHFL]DW DLFL F�

SXWHP DYHD VWUXFWXUL DOWHUQDWLYH FX R UDPXU� YLG�� FHHD FH YUHD V� vQVHPQH F�� vQ IXQF LH GH HYDOXDUHD XQHL FRQGL LL� VH SRDWH H[HFXWD VDX QX XQ DQXPLW JUXS GH LQVWUXF LXQL�

• un grup de insWUXF LXQL VH H[HFXW� GH XQ DQXPLW QXP�U �ILQLW� GH RUL� FXQRVFXW

GLQDLQWH VDX FkW WLPS R FRQGL LH HVWH vQGHSOLQLW� �LWHUD LD VDX VWUXFWXULOH UHSHWLWLYH�� ÌQ SUDFWLF�� GLQ LWHUD LH DX GHULYDW DOWH GRX� WLSXUL GH VWUXFWXUL GH FRQWURO �ILJXUD ����� • structuri UHSHWLWLYH FRQGL LRQDWH DQWHULRU� FDUDFWHUL]DWH SULQ IDSWXO F� PDL vQWkL VH

YHULILF� R FRQGL LH úL� GDF� H DGHY�UDW�� VH H[HFXW� R VHFYHQ � GH LQVWUXF LXQL, GXS�

care bucla se reia ; • VWUXFWXUL UHSHWLWLYH FRQGL LRQDWH SRVWHULRU� FDUDFWHUL]DWH SULQ IDSWXO F� PDL vQWkL VH

H[HFXW� R VHFYHQ � GH LQVWUXF LXQL� DSRL VH YHULILF� R FRQGL LH úL� GDF� H DGHY�UDW��

bucla se reia.

Structura repetitiv� FRQGL LRQDW�anterior

Structura repetitiv�condi LRQDW� SRVWHULRU

Instruc LXQH �

Instruc LXQH �

Condi LH DA

NU

Instruc LXQH �

Instruc LXQH �

Condi LHDA

NU

Figura 4.2. Subtipurile structurii fundamentale LWHUD LH

Primii algoritmi cu aplicabilitate în domeniul prelucr�ULL DXWRPDWH D GDWHORU VH

GDWRUHD]�� VH SDUH� OXL &KDUOHV %DEEDJH� SURLHFWDQWXO ÄPDúLQLL DQDOLWLFH´ GLQ DQLL �����

O GDW� FX DSDUL LD FDOFXODWRDUHORU HOHFWURQLFH� SURJUDPDWRULL V-au aplecat asupra algoritmilor ca baze ale conceperii programelor. Aceste prHRFXS�UL DX GHYHQLW WRW PDL LQWHQVH SH P�VXU�

ce limbajele de programare s-DX SHUIHF LRQDW� • SULPD JHQHUD LH �FRG PDúLQ�� HVWH HWDSD SURJUDP�ULL ÄDUWL]DQDOH´ D FDOFXODWRDUHORU�

vQ FDUH SURJUDPDWRUXO SXWHD IL XúRU DVHPXLW FX XQ ÄPDUH SUHRW´� • JHQHUD LD D GRXD �OLPEDMH GH DVDPEODUH� VLPXOHD]� VWUXFWXULOH GH FRQWURO SULQ

LQVWUXF LXQL GH VDOW �jump � úL DSHOXUL GH SURFHGXUL �call ); • JHQHUD LD D WUHLD �OLPEDMH GH QLYHO vQDOW� GLVSXQH GH LQVWUXF LXQL SXWHUQLFH SHQWUX

codificarea structurilor de control, pentru atribuLUH úL SHQWUX FDOFXO� 7RWRGDW� DSDUH

SURJUDPDUHD VWUXFWXUDW�� FRQIRUP F�UHLD R SUREOHP� PDUH HVWH GHVFRPSXV� vQ

module mai mici, ce pot fi atacate separat, urmând a fi recombinate;

Page 4: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 85

• JHQHUD LD D SDWUD DGDXJ� OD SXWHUHD OLPEDMHORU GH JHQHUD LD D WUHLD LQVWUXPente de DVLVWDUH D SURJUDPDWRUXOXL FDSDELOH FKLDU V� JHQHUH]H FRG-VXUV� FRQIRUP XQRU

VSHFLILFD LL JUDILFH úL WH[WXDOH vQWRFPLWH GH SURJUDPDWRU� $P IRORVLW DLFL QR LXQHD GH cod-VXUV�. Acesta este codul scris de om într-un anumit

limbaj de programare, traduckQG LQVWUXF LXQLOH DOJRULWPXOXL vQ LQVWUXF LXQL DOH UHVSHFWLYXOXL

limbaj. Trecerea de la codul-VXUV� OD FRGXO H[HFXWDELO DUH ORF SULQWU-un proces de LQWHUSUHWDUH �LQVWUXF LXQLOH vQ FRG-VXUV� VXQW WUDGXVH úL H[HFXWDWH SH UkQG� VDX GH FRPSLODUH

(tot codul-suUV� HVWH PDL vQWkL WUDGXV vQ FRG H[HFXWDELO� DSRL SRW DYHD ORF RULFkWH H[HFX LL DOH

SURJUDPXOXL I�U� D PDL IL QHYRLH GH ÄWUDGXFHUHD´ SUHDODELO��� Codificarea structurilor de control în Visual FoxPro (VWH GH OD VLQH vQ HOHV F� QX VH SRDWH FRQFHSH XQ SURJUDP vQ SURJUDPDUHD VWUXFWXUDW�

I�U� D IDFH DSHO OD LQVWUXF LXQLOH FDUH FRGLILF� VWUXFWXUL GH FRQWURO� 9LVXDO )R[3UR LPSOH-PHQWHD]� DVHPHQHD VWUXFWXUL SULQ FkWHYD VLQWD[H VSHFLILFH�

6WUXFWXUD DOWHUQDWLY� �VHOHF LD� VH FRGLILF� SULQ� ,) �FRQGL LH! >7+(1@ … [ELSE]

[...] ENDIF VDX� SHQWUX VWUXFWXUD DOWHUQDWLY� JHQHUDOL]DW�� DO CASE CASE <conditie-1> ... [CASE <conditie-2>] [...] [CASE <conditie-n>] [...] [OTHERWISE] [...] ENDCASE 7RW DLFL DYHP úL YDULDQWD IXQF LHL ,,)��FRQGL LH!��YDORDUH- GDF�-

DGHY�UDW!��YDORDUH- GDF�-fals>) , care se poate folosi atât în programe, cât mai FX VHDP� vQ VFULHUHD UHJXOLORU GH YDOLGDUH OD QLYHO GH FkPS RUL GH vQUHJLVWUDUH SH FDUH OH-am Y�]XW vQ FDSLWROXO ��

6WUXFWXULOH UHSHWLWLYH VH FRGLILF� ILH SULQ DO WHILE...ENDDO , fie prin FOR... ENDFOR:

'2 :+,/( �FRQGL LH-de-ciclare> ... [LOOP] [EXIT] ENDDO Clauza LOOPWULPLWH H[HFX LD SURJUDPXOXL vQDSRL OD OLQLD DO WHILE, iar EXIT la

XUP�WRDUHD LQVWUXF LXQH GXS� ENDDO (cu LOOP se poate relua, iar cu EXIT VH SRDWH S�U�VL

bucla atunci când în interioUXO DFHVWHLD VH DWLQJH R DQXPH FRQGL LH� DOWD GHFkW FHD GH

FLFODUH�� ,QVWUXF LXQLOH GLQ FRUSXO EXFOHL VH H[HFXW� DWkW WLPS FkW FRQGL LD SUHFL]DW� HVWH

DGHY�UDW��

Page 5: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

86 Visual FoxPro

,QVWUXF LXQHD FORVHUYHúWH OD FRGLILFDUHD VWUXFWXULL UHSHWLWLYH FX XQ QXP�U ILQLW GH SDúL� FOR 9DULDELO�&RQWRU 9DORDUH,QL LDO� 72 9DORDUH)LQDO�

[STEP increment] ... [EXIT] [LOOP] ENDFOR | NEXT Clauzele LOOPúL EXIT DX DFHOHDúL UROXUL FD OD LQVWUXF LXQHD DO WHILE de mai sus. 9LVXDO )R[3UR� FD RULFH SURGXV [%DVH� GLVSXQH úL GH R LQVWUXF LXQH

SCAN...ENDSCAN� FDUH SHUPLWH H[HFX LD XQRU DQXPLWH LQVWUXF LXQL FRQFRPLWHQW FX

SDUFXUJHUHD VHFYHQ LDO� D XQHL WDEHOH �DBF: 6&$1 >�GRPHQLX! )25 �FRQGL LH-1> WHILE <condi ie-2>] ... [LOOP] [EXIT] ENDSCAN Toate acestea vor fi exemplificate prin cod-VXUV� VSUH ILQDOul acestui capitol.

4.3. �9DULDELOH�úL�FRQVWDQWH��,QVWUXF LXQL�GH�DWULEXLUH� în Visual FoxPro

)LHFDUH OLPEDM DUH SURSULLOH VDOH LQVWUXF LXQL úL SURSULLOH WLSXUL GH GDWH� $ L I�FXW

FXQRúWLQ � FX WLSXULOH GH GDWH GLQ 9LVXDO )R[3UR vQ FDSLWROXO �� LDU FX FkWHva dintre comenzile modului de lucru direct v-D L vQWkOQLW úL vQ FDSLWROXO ��

$WkW YDULDELOHOH� FkW úL FRQVWDQWHOH VXQW DEVWUDFWL]�UL DOH XQRU ]RQH GH PHPRULH�

3URJUDPDWRULL QX SRW PHPRUD DGUHVH úL GHSODVDPHQWH GH PHPRULH� DIDU� GH FD]XO vQ FDUH

chiar le-aU SO�FHD DFHVW H[HUFL LX PHQWDO� ÌQ SOXV� HVWH SX LQ SUHGLFWLELO FD R DQXPLW�

YDULDELO� V� VH J�VHDVF� GH GRX� RUL OD DFHHDúL DGUHV� �FRPSLODWRUXO H[HFXW� R DORFDUH

GLQDPLF� D DGUHVHORU� vQ IXQF LH GH PHPRULD OLEHU� OD ODQVDUHD SURJUDPXOXL�� 6XQW GRX�

motive care cer folosirea de nume pentru aceste zone. Constantele nu au nevoie de nume; SURJUDPDWRUXO VFULH H[SUHVLLOH ORU GLUHFW vQ FRG� FD GH H[HPSOX �VSHU�P F� ]HFLPDOHOH OXL π sunt suficiente):

Listing 4.1� 9DULDELOH úL FRQVWante

STORE 0 to arie STORE 20 to raza ARIE=3.141592653*raza^2 ?arie ùL FRQVWDQWHOH QHFHVLW� VSD LX vQ PHPRULH� GDU UH]HUYDUHD DFHVWXLD QX FDGH vQ VDUFLQD

SURJUDPDWRUXOXL� 8QHRUL vQV� HVWH XWLO V� VH GHD úL FRQVWDQWHORU QLúWH QXPH� SHQWUX D OH IDFH

PDL XúRr de manipulat; acest lucru este posibil în Visual FoxPro prin directiva de precompilare �XQ WLS VSHFLDO GH LQVWUXF LXQH� #DEFINE:

Listing 4.2. Directiva #DEFINE

#DEFINE pi 3.141592653 STORE 0 to arie

Page 6: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 87

STORE 20 to raza arie=pi*raza^2 ?arie ÌQ WUHDF�W ILH ]LV� GHILQL LD GH PDL VXV QX-úL DUH URVWXO� GHRDUHFH 9LVXDO )R[3UR GLVSXQH

GH IXQF LD PI() � FDUH DUH H[DFW UROXO GH D UHWXUQD QXP�UXO π cu primele 6 zecimale. Dar GHILQL LL GH JHQXO�

Listing 4.3. Directiva #DEFINE varianta 2

#DEFINE LINIENOUA CHR(13)+CHR(10) #DEFINE MESAJ “Acest program a executat o operatiune incorecta ” + ; “si va fi oprit de Windows.” + linienoua +“Consultati asistenta tehnica.” #DEFINE TITLU “Eroare” #DEFINE BUTOANE 1+16 && butoanele OK si Cancel, semnul STOP MESSAGEBOX(MESAJ, BUTOANE, TITLU)

VH GRYHGHVF IRDUWH XWLOH� PDL DOHV GDF� WUHEXLH LQYRFDW� IXQF LD MESSAGEBOX()vQ DFHODúL

FRQWH[W GH PDL PXOWH RUL SH SDUFXUVXO H[HFX LHL XQXL SURJUDP� (VWH ELQH FD SHQWUX QXPHOH

de constante s� IRORVLP PDMXVFXOH� LDU SHQWUX QXPHOH GH YDULDELOH� OLWHUH PLFL.

NNoo tt �� � ÌQ VHFYHQ D GH SURJUDP GH PDL VXV V-au folosit semnele &&, care preced un comentariu. Un alt caracter pentru introducerea comentariilor este asteriscul (* ), plasat OD vQFHSXWXO UkQGXOXL� ÌQ ORF GH DVWHULVF VH SRDWH IRORVL úL FXYkQWXO-cheie NOTE. CRPHQWDULLOH DX UROXO GH D P�UL OL]LELOLWDWHD SURJUDPXOXL�

)LJXUD ���� 5H]XOWDWXO H[HFX LHL IXQF LHL MESSAGEBOX() din codul de mai sus

5HQXQ DUHD OD GHQXPLUHD FRQVWDQWHL VH IDFH FX GLUHFWLYD #UNDEF nume-constanta . /XFUXO FX YDULDELOH VH GRYHGHúWH D IL FHva mai complicat decât lucrul cu constante. În

SULPXO UkQG� SHQWUX D IRORVL YDULDELOH� WUHEXLH V� OH GHFODU�P� 'HFODUDUHD LPSOLF� UH]HUYDUHD

XQXL VSD LX GH PHPRULH VXILFLHQW GH PDUH SHQWUX UHVSHFWLYXO WLS GH GDW�� ÌQ FDSLWROXO � DP

Y�]XW FDUH VXQW WLSXULOH de date folosite în bazele de date Visual FoxPro. Programele Visual )R[3UR vQV� QX FHU QLFL GHFODUDUHD H[SOLFLW�� QLFL VSHFLILFDUHD XQXL WLS SHQWUX R YDULDELO� �VH

VSXQH F� HVWH XQ OLPEDM weak typed – vQ RSR]L LH FX OLPEDMH strong typed, care cer declararHD H[SOLFLW� D YDULDELOHORU GH XQ DQXPLW WLS� Pascal , C).

ÌQFHSkQG FX WHKQLFD SURJUDP�ULL VWUXFWXUDWH� VH RELúQXLHúWH FD SURJUDPXO V� ILH FRPSXV

GLQ SURFHGXUL úL IXQF LL FDUH VH DSHOHD]� XQHOH SH DOWHOH� /LPEDMXO GH SURJUDPDUH 9LVXDO

)R[3UR UHVSHFW� úL HO SDUDGLJPD SURFHGXUDO�� 'LQ DFHVW SXQFW GH YHGHUH� VH SRDWH OXFUD FX

variabile publice�GXS� GHFODUDUH� SRW IL DSHODWH vQ RULFH SURFHGXU� VDX IXQF LH GLQ FXSULQVXO

DSOLFD LHL� RUL FX YDULDELOH private (sunt accesibile numai în interiorul procedurii sau func LHL

în care au fost declarate). În Visual FoxPro, pentru GHFODUDUHD H[SOLFLW� a variabilelor se pot IRORVL LQVWUXF LXQLOH�

• PUBLIC nume-variabila1[,nume-variabila2…]

Page 7: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

88 Visual FoxPro

SHQWUX GHFODUDUHD XQRU YDULDELOH SXEOLFH �JOREDOH� úL� • LOCAL nume-variabila1[,nume-variabila2…]

vQ VFRSXO GHFODU�ULL XQRU YDULDELOH ORFDOH� ,QVWUXF LXQHD� • DIMENSION nume-tablou1(nrlinii1 [,nrcoloane1]

[, nume-tablou2(nrlinii2 [,nrcoloane2]…] VH IRORVHúWH OD GHFODUDUHD GH WDEORXUL FX R GLPHQVLXQH �YHFWRUL� VDX FX GRX� GLPHQVLXQL

�PDWULFH�� DO F�URU GRPHQLX GH YL]LELOLWDWH HVWH WRW ORFDO� 'DF� VH GRUHúWH GHFODUDUHD XQRU

tablouri globale, DIMENSIONVH vQORFXLHúWH FX PUBLIC ARRAY. NNoo tt �� .. 1XPHOH YDULDELOHORU SRW FRQ LQH OLWHUH� FLIUH úL FDUDFWHUXO GH VXEOLQLHUH

(underscore� úL VH UHFRPDQG� V� QX vQFHDS� FX FLIU�� úL QLFL FX OLQLX D GH VXEOLQLHUH

(pentru a evita confuzia cu variabilele de mediu, care au fost amintite în capitolul 1). ÌQ 9LVXDO )R[3UR H[LVW� úL LQVWUXF LXQHD PRIVATE� GDU IXQF LXQHD VD H SX LQ GLIHULW�

ID � GH DOWH OLPEDMH SUHFXP BASIC sau C� $VWIHO� VFULV� vQWU-XQ VXESURJUDP �R SURFHGXU��

GXS� WHUPLQRORJLD 9LVXDO )R[3UR�� GHFODUD LD PRIVATE <lista-de-variabile> sau 35,9$7( $// /,.( �úDEORQ!

20 permite „ascunderea” valorilor variabilelor globale VSHFLILFDWH vQ OLVW� ID � GH SURJUDPXO FXUHQW �GHFL SRVLELOLWDWHD PDQLSXO�ULL GXS� GRULQ � D

XQRU YDULDELOH JOREDOH SH SDUFXUVXO VXESURJUDPXOXL� OD LHúLUHD GLQ DFHVWD UHJ�VLQG YDORULOH

lor originale):

Listing 4.4. Declararea variabilelor PRIVATE

CLEAR && sterge ecranul PUBLIC m_nume, m_annastere, ancalend m_nume="Popescu M. Raluca" m_annastere=1979 ancalend=2001 DO afiseaza_datele_persoanei && apelul procedurii afiseaza_datele_persoanei * se va afisa Popescu M. Raluca 1979 2001 ?m_nume, m_annastere, ancalend RELEASE ALL && sterge toate variabilele PROCEDURE afiseaza_datele_persoanei && inceput de subprogram PRIVATE ALL LIKE m_* && se ascund variabilele publice && ale caror nume incep cu "m_" m_nume="Ionescu Eugen" m_annastere=1909 * se va afisa Ionescu Eugen 1909 2001 ?m_nume, m_annastere, ancalend RETURN && sfarsit de subprogram 7LSXO XQHL YDULDELOH GHFODUDWH H[SOLFLW HVWH VWDELOLW R GDW� FX SULPD LQVWUXF LXQH GH

DWULEXLUH FDUH VH UHIHU� OD YDULDELOD UHVSHFWLY� úL� vQ OLQLL PDUL� SXWHP YRUEL GHVSUH YDULDELOH

dH WLS QXPHULF� úLU GH FDUDFWHUH� GDW� FDOHQGDULVWLF�� ORJLF úL RELHFW� 'H UHPDUFDW F�

variabilele publice (folosirea comenzii PUBLIC într-XQ SURJUDP� DX GXS� GHFODUDUH WLSXO GH

20. 3ULQ ÄúDEORQ´ �WHUPHQXO IRORVLW de Visual FoxPro este skeleton� OLWHUDO ÄVFKHOHW´� VH vQ HOHJH RULFH FRPELQD LH

GH OLWHUH� FLIUH� FDUDFWHUXO ÄB´ úL FDUDFWHUHOH Ä"´ �vQORFXLHúWH R OLWHU� RUL o FLIU�� VDX Ä ´ �vQORFXLHúWH XQ JUXS GH

caractere).

Page 8: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 89

GDW� Logical úL YDORDUHD .F. /D XUP�WRDUHOH DWULEXLUL� WLSXO GH GDW� SRDWH IL Vchimbat (cu DOWH FXYLQWH� R YDULDELO� VH SRDWH UHIRORVL��

)LJXUD ���� 5H]XOWDWXO H[HFX LHL SURJUDPXOXL GLQ OLVWLQJXO ���

'H DVHPHQHD� 9LVXDO )R[3UR SHUPLWH GHFODUDUHD LPSOLFLW� D YDULDELOHORU� DGLF� R GDW� FX

SULPD LQVWUXF LXQH GH DWULEXLUH� ,QVWUXF LXQLOH GH DWULEXLUH VXQW XUP�WRDUHOH� • operatorul „egal”; nume-variabila=valoare • LQVWUXF LXQHD STORE: STORE valoare1 TO nume-variabila1 [,valoare2 TO nume-variabila2…] 3HQWUX YDULDELOHOH GH WLS RELHFW VH IRORVHúWH RSHUDWRUXO Ä=´� FRPELQDW FX IXQF LD

CREATEOBJECT(<nume-ELEOLRWHF��QXPH- FODV�!), pe care o vom mai întâlni în capitolul 11.

NNoo tt �� .. Variabilele declarate implicit sunt locale, în afara celor declarate ad-hoc în fereastra de comenzi, care sunt globale.

8OWHULRU FUH�ULL XQHL YDULDELOH� WLSXO DFHVWHLD VH SRDWH YHULILFD SULQ LQYRFDUHD IXQF LHL

TYPE (<nume- YDULDELO�!�� $FHDVWD UHWXUQHD]� XQ QXP�U FDUH DUDW� WLSXO YDULDELOHL

(vezi tabelul 4.1).

Tabelul 4.1� 9DORUL SRVLELOH DOH IXQF LHL TYPE

Rezultat 7LS GH GDW� C Character N Numeric (inclusiv float, double, integer) Y Currency D Date T DateTime L Logical M Memo O Object G General U 1HGHILQLW �YDULDELOD QX H[LVW��

NNoo tt �� .. 2ULFDUH DU IL WLSXO YDULDELOHL� QXPHOH V�X VH VFULH vQWUH JKLOLPHOH VDX DSRVWURIXUL

(în VisuDO )R[3UR DFHVWH VHPQH DX DFHODúL VHQV��

Page 9: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

90 Visual FoxPro

)XQF LD VARTYPE(nume-variabila,[valoare pentru NULL]) DUH DFHODúL

URO FD úL TYPE() , GDU HVWH PDL UDSLG� úL QX QHFHVLW� VFULHUHD QXPHOXL YDULDELOHL vQWUH

ghilimele; în plus, cel de-DO GRLOHD DUJXPHQW� RS LRQDO� SHUPLte specificarea unui rezultat FRQYHQ LRQDO vQ FD] F� YDULDELOD HVWH NULL� $VWIHO� GDF� DO GRLOHD DUJXPHQW DUH YDORDUHD

.T. úL YDULDELOD HVWH NULL� VH YD UHWXUQD WLSXO YDULDELOHL� GDF� DO GRLOHD DUJXPHQW HVWH RPLV

sau este .F. , se va returna „X”, ceea ce înVHDPQ� NULL� 3UHVXSXQkQG F� var1 este de tip N (numeric) úL GHRFDPGDW� DUH YDORDUHD NULL, VARTYPE(var1, .T.) va returna rezultatul „N”, pe când VARTYPE (var1) ori VARTYPE (var1,.F.) vor returna ambele rezultatul „X”.

9LVXDO )R[3UR SHUPLWH úL IRORVLUHD YDUiabilelor de tip tablou (cu o dimensiune – vector VDX FX GRX� GLPHQVLXQL – PDWULFH�� $FHVWHD VH GHFODU� FX DIMENSION sau cu PUBLIC. 3HQWUX DGUHVDUHD HOHPHQWHORU VH IRORVHúWH QRWD LD <nume-tablou>(i,j) . De asemenea, pentru tablouri sunt disponibile multe fuQF LL XWLOH FXP DU IL�

ALEN(nume-tablou[, atribut]) – SHQWUX DIODUHD QXP�UXOXL WRWDO GH

HOHPHQWH �I�U� DUJXPHQWXO DWULEXW�� D QXP�UXOXL GH OLQLL �GDF� atribut este 1) ori de FRORDQH �GDF� atribut este 2);

ASCAN(nume-tablou, expresie- F�XWDW� >� HOHPHQW-de-pOHFDUH >� QXP�U-elemente-de-parcurs]]) – DIO� QXP�UXO GH RUGLQH DO

HOHPHQWXOXL FDUH FRQ LQH H[SUHVLH-F�XWDW�� UHWXUQHD]� � �]HUR� GDF� QX H[LVW� XQ DVWIHO GH

element. 2ULFH YDULDELO� 9LVXDO )R[3UR SRDWH IL GLVWUXV� H[SOLFLW SULQ XQD GLQWUH FRPHQ]LOH�

CLEAR ALL – úWHUJH QHFRQGL LRQDW GLQ PHPRULH WRDWH YDULDELOHOH� FRPDQGD CLEAR DUH vQV� XQ VSHFWUX PDL ODUJ�

RELEASE <lista-de-variabile> – úWHUJH GLQ PHPRULH YDULDELOHOH

specificate; RELEASE ALL – úWHUJH GLQ PHPRULH RULFH YDULDELO� RUL WDEORX� RELEASE ALL LIKE �úDEORQ!_ (;&(37 �úDEORQ! – úWHUJH YDULDELOHOH

FDUH VXQW�QX VXQW FRQIRUPH FX úDEORQXO�

NNoott�� � 'DF� HVWH LQWHJUDW� vQWU-un program, comanda RELEASE ALL QX DIHFWHD]�

YDULDELOHOH SXEOLFH� ÌQ FD] F� VH GRUHúWH DFHVW OXFUX� VH YD IRORVL FRPDQGD RELEASE ALL EXTENDED.

9LVXDO )R[3UR SHUPLWH úL S�VWUDUHD YDORULORU XQRU YDULDELOH vQ ILúLHUH VSHFLDOH� GHQXPLWH

ILúLHUH PHPR� $VWIHO� SXWHUQLFD LQVWUXF LXQH� SAVE TO <nume-fisier> ALL LIKE <sablon> |ALL EXCEPT

�úDEORQ! PHPRUHD]� vQWU-XQ ILúLHU YDULDELOHOH FDUH VXQW�QX VXQW FRQIRUPH úDEORQXOXL� LDU FRPDQGD�

RESTORE FROM <nume-fisier> [ADDITIVE] UHIDFH YDULDELOHOH VWRFDWH DQWHULRU vQ ILúLHUXO VSHFLILFDW� FODX]D ADDITIVE vPSLHGLF�

GLVWUXJHUHD YDULDELOHORU FDUH GHMD H[LVW� vQ PHPRULH� 'H UHPDUFDW F� YDULDELOHOH vúL S�VWUHD]�

duS� UHVWDXUDUH FDUDFWHUXO SXEOLF VDX ORFDO� Comenzile SAVE TO…úL RESTORE FROM…vúL J�VHVF XWLOLWDWHD vQ VWDELOLUHD XQRU

RS LXQL GH FRQILJXUDUH D XQHL DSOLFD LL �SDUROH� GLUHFWRDUH GH OXFUX� OXQL FDOHQGDULVWLFH HWF��� )DSWXO F� 9LVXDO )R[3UR QX LPSXQH GHFODUDUHD H[SOLFLW� D YDULDELOHORU úL QLFL R

FRQVHFYHQ � SULYLQG WLSXULOH GH GDWH SH SDUFXUVXO H[HFX LHL SURJUDPXOXL RIHU� R PDUH

IOH[LELOLWDWH� GDU SRDWH FRQVWLWXL úL R VXUV� GH HURUL�

Page 10: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 91

4.4. ,QVWUXF LXQL�GH�LQWUDUH-LHúLUH

ÌQ 9LVXDO )R[3UR� FHD PDL VLPSO� LQVWUXF LXQH GH LHúLUH HVWH I�U� vQGRLDO� Ä"´� (D DUH FD

VFRS DILúDUHD SH HFUDQXO SULQFLSDO D XQHL H[SUHVLL �FRQVWDQW�� YDULDELO�� FRPELQD LL GH

FRQVWDQWH úL YDULDELOH HWF��� )LHFDUH FRPDQG� " vQFHSH DILúDUHD GLQ FRORDQD � �PDUJLQHD

VWkQJ�� úL SURGXFH XQ DYDQV GH UkQG� 'DF� VH IRORVHVF GRX� VHPQH GH vQWUHEDUH vQ ORF GH

XQXO� DILúDUHD DUH ORF SH OLQLD FXUHQW�� LDU GDF� VH IRORVHVF WUHL VHPQH GH vQWUHEDUH� DILúDUHD

YD DYHD ORF GLUHFW OD LPSULPDQW�� 2 DOW� LQVWUXF LXQH GH LHúLUH PDL YHFKH HVWH LQVWUXF LXQHD GH DILúDUH IRUPDWDW�� @ <linie>, <coloana> SAY <expresie> $PEHOH LQVWUXF LXQL SUH]HQWDWH VH XWLOL]DX SH ODUJ vQ YHUVLXQLOH )R[3UR SHQWUX DOS, în

FDUH DILúDUHD SH HFUDQ DYHD ORF vQ PRG FDUDFWHU ��� GH OLQLL úL �� GH FRORDQH�� &kW GHVSUH

DILúDUHD OD LPSULPDQW� D XQRU VLWXD LL FRPSOH[H� DFHDVWD D DYXW vQWRWGHDXQD OD ED]�

machetele de raport, cu care ne vom întâlni în capitolul 7. &D LQVWUXF LXQL GH LQWUDUH� 9LVXDO )R[3UR� PHQ LQH PDL YHFKLOH INPUT úL ACCEPT, ca

úL� # �OLQLH!� �FRORDQD! *(7 �YDULDELO�!, XUPDW� GH READ. În versiunile Visual FoxPro,DFHVWH LQVWUXF LXQL VXQW FRQVLGHUDWH GHS�úLWH� 5ROXO

LQVWUXF LXQLORU GH LQWUDUH�LHúLUH �SHQWUX DILúDUHD SH HFUDQ� D IRVW SUHOXDW GH RELHFWHOH GH

control (Label , TextBox , ListBox HWF�� XWLOL]DWH vQ IRUPXODUH� vQ FDUH PRGXO GH DILúDre HVWH H[FOXVLY JUDILF �YH]L FDSLWROXO ��� ,QVWUXF LXQLOH @…SAY…GET…READ, INPUT, ACCEPTVXQW PHQ LQXWH GLQ UD LXQL GH FRPSDWLELOLWDWH FX DSOLFD LLOH FRQFHSXWH vQ PRG WH[W�

,QVWUXF LXQHD Ä?´ VH SRDWH IRORVL vQ HWDSD WHVW�ULL úL GHSDQ�ULL XQRU SURJUDPH� vQWUXFkW RIHU�

R PRGDOLWDWH VLPSO� úL UDSLG� GH DILúDUH�

4.5. 3URFHGXUL�úL�IXQF LL�vQ�9LVXDO�)R[3UR

3URJUDPDUHD VWUXFWXUDW� QH vQYD � F� R DSOLFD LH HVWH FX DWkW PDL VLPSOX GH vQWUH LQXW FX

cât codul-VXUV� HVWH PDL ELQH vPS�U LW vQ PRGXOH FkW PDL PLFL úL VSHFLDOL]ate. Modularea codului constituie o metodologie de construire a unui program pe baza unor

S�U L GLVWLQFWH �PRGXOH�� FDUH vQGHSOLQHVF ILHFDUH R VDUFLQ� VSHFLILF� vQ VHQVXO DWLQJHULL

VFRSXOXL ILQDO DO SURJUDPXOXL� $FHDVW� WHKQLF� �FD úL SURJUDPDUHD VWUXFWXUDW� vQ VLQH� vúL DUH

U�G�FLQLOH vQ SUDFWLFD GH WRDWH ]LOHOH� HD SUH]HQWkQG R VHULH GH DYDQWDMH PDMRUH úL DQXPH� • IOH[LELOLWDWHD úL SRVLELOLWDWHD GH UHXWLOL]DUH D FRGXOXL� DFHVWHD ILLQG FX DWkW PDL

SXWHUQLFH FX FkW PRGXOHOH VXQW PDL PLFL úL PDL VSHFLDOL]DWH� • OL]LELOLWDWHD úL XúRDUD PHQWHQDQ � D XQHL DSOLFD LL vQ WRWDOLWDWHD HL� 'LIHUHQ D vQWUH SURFHGXUL úL IXQF LL WUHEXLH SULYLW� PDL PXOW GLQ SXQFW GH YHGHUH WHRUHWLF-

-FRQFHSWXDO� HD HYLGHQ LLQGX-VH FKLDU GLQ GHILQL LLOH FHORU GRX� WLSXUL GH PRGXOH� O procedur� UHSUH]LQW� R vQúLUXLUH ORJLF� D XQXL QXP�U ILQLW GH LQVWUXF LXQL úL VWUXFWXUL

GH FRQWURO JUXSDWH VXE DFHODúL QXPH úL FDUH GXF OD vQGHSOLQLUH R VDUFLQ� VSHFLILF�� SRDWH IL

DSHODW� GH DOWH PRGXOH – prin comanda DO <nume- SURFHGXU�! (eventual cu unul sau maL PXO L SDUDPHWUL�� GDU I�U� D UHWXUQD QHDS�UDW YUHR YDORDUH �ILJXUD �����

)XQF LD DUH R GHILQL LH DSURDSH LGHQWLF�� QXPDL F�� REOLJDWRULX� YD UHWXUQD R YDORDUH

�XQD úL QXPDL XQD��

Page 11: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

92 Visual FoxPro

5H]ROY� R SUREOHP� DQXPH

5H]ROY� R SUREOHP� DQXPH

Procedura y

)XQF LD [

Date

Date

Rezultat

Figura 4.5. 'LIHUHQ D GLQWUH SURFHGXUL úL IXQF LL

$úDGDU� VSUH GHRVHELUH GH SURFHGXUL FDUH SRW IL DSHODWH GLUHFW �HOH IXQF LRQkQG GH VLQH VW�W�WRU�� R IXQF LH DUH vQWRWGHDXQD XQ UH]XOWDW úL� FD XUPDUH� R SXWHP XWLOL]D SULQ DVLJQDUHD

acestui rezultat unei variabile sau prin includerea ei într-o comanG� 9LVXDO )R[3UR VDX

într-R IUD]� SELECT - SQL � ([LVW� úL YDULDQWD QXPHIXQF LH�� �I�U� QLFL R YDULDELO�

în stânga egalului). &UHDUHD SURJUDPHORU �SURFHGXUL VDX IXQF LL� vQ 9LVXDO )R[3UR SUHVXSXQH SDUFXUJHUHD

XUP�WRULORU SDúL� • lansarea editorului de text SURSULX SULQ XWLOL]DUHD vQ IHUHDVWUD GH FRPDQG� D

comenzii: MODIFY COMMAND [<NumeProgram>] FH YD GHVFKLGH R IHUHDVWU�

VSHFLILF� SHQWUX LQWURGXFHUHD VHFYHQ HORU GH FRG GRULWH� • DOW� SRVLELOLWDWH R FRQVWLWXLH XWLOL]DUHD Project Manager -ului, cadrul de pagin�

Code úL XWLOL]DUHD EXWRDQHORU New sau Modify , GXS� QHFHVLW� L� $FHDVWD HVWH� GH

altfel, modalitatea standard de lucru pentru crearea programelor, ea fiind UHFRPDQGDW� GDWRULW� IDSWXOXL F� XWLOL]DUHD FRPHQ]LL GH PDL VXV GXFH OD FUHDUHD

programului, GDU QX úL OD LQFOXGHUHD OXL vQ SURLHFW �DVSHFW IRDUWH LPSRUWDQW DWXQFL

FkQG GRULP OLYUDUHD XQRU DSOLFD LL FRPSLODWH vQ IRUPDW H[HFXWDELO�. • compilarea codului-VXUV� �RS LXQHD Program|Compile GLQ PHQLX�� RSHUD LXQH

care va duce la transformarea lui într-un format interpretabil de UCP. Compilatorul YD DVLJXUD úL FRUHFWLWXGLQHD VLQWD[HL� DVWIHO vQFkW RULFH LQDGYHUWHQ � vQ VFULHUHD XQHL

LQVWUXF LXQL VDX XWLOL]DUHD GHIHFWXRDV� D VWUXFWXULORU GH FRQWURO YD JHQHUD XQ PHVDM

GH HURDUH VSHFLILF� &RPSLODUHD DUH ORF úL GDF� vQ IHUHDVWUD GH FRPHQ]L VH VFULH

COMPILE <nume-program>|< úDEORQ21>;

• ODQVDUHD FRGXOXL vQ H[HFX LH – VH UHDOL]HD]� ILH GLQ Project Manager , prin VHOHF LD SURJUDPXOXL GRULW vQ FDGUXO GH SDJLQ� Code úL FOLFN SH EXWRQXO Run, fie prin utilizarea (în fereastUD GH FRPDQG� VDX vQWU-R SURFHGXU� DSHODQW�� D FRPHQ]LL�

DO NumeProgram [WITH <lista-parametri>] .

NNoo tt �� .. ÌQWUHUXSHUHD H[HFX LHL XQXL SURJUDP VH UHDOL]HD]� DS�VkQG WDVWD Esc .

Codul-VXUV� 9LVXDO )R[3UR VH PHPRUHD]� vQ ILúLHUH FX H[WHQVLD �PRG. Codul compilat se J�VHúWH vQ ILúLHUH FX H[WHQVLD �FXP �GDF� QX D DYXW ORF FRPSLODUHD H[SOLFLW�� XQ DVHPHQHD

ILúLHU VH FUHHD]� DXWRPDW OD ODQVDUHD vQ H[HFX LH D SURJUDPXOXL �PRGFRUHVSXQ]�WRU�� 3XWHP

DYHD vQV� FRG-VXUV� 9LVXDO )R[3UR úL vQ DOWH WLSXUL GH ILúLHUH� SURFHGXULOH VWRFDWH úL

21. De exemplu, compile m*.prg va compila toate SURJUDPHOH DOH F�URU QXPH vQFHS FX OLWHUD m.

Page 12: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 93

GHFODQúDWRDUHOH �IDF SDUWH GLQ GLF LRQDUXO GH GDWH UHSUH]HQWDW GH FXSOXO GH ILúLHUH

.DBC/.DCT �� PHQLXULOH �ILúLHUHOH JHQHUDWH� FDUH DX H[WHQVLD .MPR� úL IRUPXODUHOH

�ILúLHUHOH .SCT ). 2ULFH IXQF LH VDX SURFHGXU� SRDWH IL GHFODUDW� �FRQVWUXLW�) în 3 moduri: • FD SURJUDP GLVWLQFW� FD] vQ FDUH YD IL DFFHVLELO� �YD SXWHD IL DSHODW�� GLQ RULFDUH DOW

modul (ca în exemplele anterioare); • FD SDUWH LQWHJUDQW� D XQHL DOWH SURFHGXUL VDX IXQF LL� FD] vQ FDUH YD IL DFFHVLELO� vQ

mod normal numai modulului resSHFWLY� ILLQG ÄLQYL]LELO�´ DOWRU SURJUDPH22.

$VHPHQHD PRGXOH VH GHFODU� vQWRWGHDXQD OD VIkUúLWXO VHFYHQ HL GH FRG FH FRQVWLWXLH

programul apelant (pentru exemplificare,YH]L úL FDSLWROXO �� SDUWHD UHIHULWRDUH OD

rapoarte dinamice) astfel: • pentru proceduri:

PROCEDURE nume_proc [PARAMETERS parametri…] �LQVWUXF LXQL! ENDPROC

• SHQWUX IXQF LL� FUNCTION nume_funct [PARAMETERS parametri…] �LQVWUXF LXQL! RETURN valoare ENDFUNC

NNoo tt �� .. RETURNI�U� YDORDUH UHDOL]HD]� LHúLUHD IRU DW� GLQ PRGXO úL UHvQWRDUFHUHD OD

instruF LXQHD LPHGLDW XUP�WRDUH GLQ PRGXOXO DSHODQW�

2 IXQF LH VDX R SURFHGXU� SRDWH IL FUHDW� úL FD SURFHGXU� VWRFDW� �FDSLWROXO ��� FD] vQ

FDUH YD IL LQWHJUDW� vQ GLF LRQDUXO ED]HL GH GDWH� ILLQG GLVSRQLELO� RULF�UXL PRGXO GH

SURJUDP� FX FRQGL LD FD UHVSHFWLYD ED]� GH GDWH V� ILH GHVFKLV�� Atunci când într-XQ SURJUDP �VDX FKLDU vQ IHUHDVWUD GH FRPHQ]L� HVWH DSHODW� R SURFHGXU�

VDX R IXQF LH GHILQLW� GH XWLOL]DWRU� 9LVXDO )R[3UR FDXW� PRGXOXO UHVSHFWLY vQ XUP�WRDUHOH

locuri (în ordine): • programul curent (cel în FDUH VH DIO� DSHOXO IXQF LHL VDX SURFHGXULL�� • programul specificat într-R FRPDQG� DO <nume-procedura> IN <nume-

program> VDX GDF� vQDLQWH GH LQVWUXF LXQHD GH DSHO �DO <nume-procedura> ) s-a introdus comanda SET PROCEDURE TO <nume-program> ;

• procedurile stocate; • WRDWH PRGXOHOH GH SURJUDP GLQ GLUHFWRUXO FXUHQW úL GLQ GLUHFWRDUHOH VSHFLILFDWH vQ

comanda SET PATH. )LJXUD ��� SUH]LQW� WRDWH HOHPHQWHOH QHFHVDUH OXFUXOXL FX SURJUDPH vQ 9LVXDO )R[3UR�

22. Vezi, în continuare, modalitatea de apel cu DO <nume- SURFHGXU�! ,1 �QXPH-program> SUHFXP úL

comanda SET PROCEDURE TO.

Page 13: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

94 Visual FoxPro

&RPSLODUHD FRGXOXL OD FUHDUH úL GXS�

orice modificare

%XWRQ GH FRPSLODUH úL ODQVDUH vQ H[HFX LH

$G�XJDUHD OD SURLHFW D XQXL SURJUDP

creat cu MODIFY COMMAND sau adus din alte proiecte

Figura 4.6. Lucrul cu programe în Visual FoxPro 'XS� FXP VSXQHDP� R SURFHGXU� VDX R IXQF LH SRDWH IL DSHODW� vQ GRX� PRGXUL� FX

SDUDPHWUL �XQXO VDX PDL PXO L� vQ IXQF LH GH VSHFLILFXO PRGXOXOXL UHVSHFWLY� VDX I�U�

parametri. Parametrii sunt variabile locale (declarate obligatoriu explicit la începutul modulului23

DSHODW� FDUH SUHLDX YDORULOH IXUQL]DWH GH PRGXOXO DSHODQW vQ VFRSXO XWLOL]�ULL ORU

vQ SUHOXFU�ULOH LQWHUQH� 3XWHP YRUEL GHFL GHVSUH� • parametri formali – numele variabilelor locale declarate la începutul procedurii sau

IXQF LHL� • parametri actuali – valorile efective preluate de la modulul apelant. $úDGDU� vQ 9LVXDO )R[3UR� REOLJDWRULX SULPD LQVWUXF LXQH D XQHL SURFHGXUL VH UHIHU� OD

declararea parametrilor formali cu ajutorul sintaxei: PARAMETERS ParamFormal1, ParamFormal2 …

În loc deGHFODUD LD PARAMETERSVH SRDWH XWLOL]D úL LPARAMETERS. $SHODUHD XQHL SURFHGXUL FX SDUDPHWUL VH UHDOL]HD]� FRQIRUP VLQWD[HL�

'2 1XPH3URFHGXU� :,7+ 3DUDP$FWXDO�� 3DUDP$FWXDO�« $SHODUHD XQHL IXQF LL GLIHU� UDGLFDO GLQ SXQFW GH YHGHUH DO VLQWD[HL�

9DULDELO� 1XPH)XQF LH�3DUDP$FWXDO�� 3DUDP$FWXDO�«� Sau (apel direct într-R IUD]� 64/ – cu care ne vom întâlni în capitolul 5):

6(/(&7 FkPS��FkPS��«�1XPH)XQF LH�3DUDP$FWXDO��

ParamActual2…) [AS alias ] 2UGLQHD vQ FDUH VXQW SUHOXD L SDUDPHWULL DFWXDOL GH F�WUH FHL IRUPDOL HVWH FHD QDWXUDO�� GH

OD VWkQJD OD GUHDSWD� vQ IXQF LH GH YLUJXO� FD VHSDUDWRU� LDU WLSXO SDUDPHWULORU IRUPDOL HVWH

23. 3ULQ PRGXO VH vQ HOHJH R SURFHGXU� VDX R IXQF LH�

Page 14: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 95

GHWHUPLQDW GH WLSXO SDUDPHWULORU DFWXDOL� 'DF� DSHOXO VH IDFH I�U� QLFL XQ SDUDPHWUX DFWXDO�

FHL IRUPDOL VXQW GHFODUD L LPSOLFLW GH WLS logic (boolean).

)LJXUD ���� $SHOXO SURFHGXULORU úL WUDQVPLWHUHD SDUDPHWULORU vQ 9LVXDO )R[3UR

)LJXUD ��� SUH]LQW� R SURFHGXU� FX QXPHOH Test_Parametri úL R SURFHGXU� FX

numele ApelTest_Parametri carH R YD DSHOD SH SULPD FX úL DSRL I�U� SDUDPHWUL�

tocmai în ideea de a demonstra modalitatea standard de lucru cu proceduri în Visual )R[3UR� )XQF LD PARAMETERS()UHWXUQHD]� QXP�UXO GH SDUDPHWUL DFWXDOL FX FDUH HVWH

apelat un modul. Un parametru formal care nu are la un moment dat un corespondent actual esWH vQWRWGHDXQD GH WLS ORJLF úL DUH YDORDUHD �F.(False) .

ÌQ 9LVXDO )R[3UR� GH OD XQ PRGXO DSHODQW F�WUH XQ PRGXO DSHODW VH SRW WUDQVPLWH

maximum 27 de parametri. Modul implicit de transmitere în Visual FoxPro este transmiterea prin valoare (modulul apelat lXFUHD]� FX FRSLL DOH YDULDELOHORU WUDQVPLVH GH

modulul apelant). Pentru a trece la WUDQVPLWHUHD SULQ UHIHULQ � (modulul apelat preia DGUHVHOH YDULDELOHORU WUDQVPLVH GH PRGXOXO DSHODQW� GHFL DPEHOH PRGXOH OXFUHD]� FX H[DFW

DFHODúL VHW GH GDWH�� VH SRDWH IROosi comanda de configurare SET UDFPARMS TO REFERENCE� FDUH DUH FD HIHFW WUDQVPLWHUHD WXWXURU SDUDPHWULORU SULQ UHIHULQ �� 'DF� VH

GRUHúWH WUDQVPLWHUHD QXPDL DQXPLWRU SDUDPHWUL SULQ UHIHULQ �� DWXQFL SDUDPHWUXO GRULW VH

SUHIL[HD]� FX @. Astfel se pot transmite ca parametri tablouri (arrays) întregi (transmiterea SULQ YDORDUH DU FRQVLGHUD QXPDL SULPXO HOHPHQW DO WDEORXOXL�� 2 DOW� XWLOLWDWH D WUDQVPLWHULL

SULQ UHIHULQ � DSDUH DWXQFL FkQG VH DSHOHD]� SURJUDPH�SURFHGXUL H[WHUQH �VFULVH vQ C sau C++� GH SLOG�� FDUH FHU FD SDUDPHWUL UHIHULQ H RUL SRLQWHUL�

Page 15: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

96 Visual FoxPro

/LVWLQJ ���� ,OXVWUDUHD WUDQVPLWHULL SDUDPHWULORU SULQ UHIHULQ �

* declararea unui tablou pentru pastrarea datelor salariale DIMENSION vSp2001(3,4) *--------------------------------------------- * consideram urmatoarea structura a sporurilor * 1 2 3 4 * salar vechime cond_grele altele *--------------------------------------------- * popularea tabloului cu date de test pentru 3 salariati * prima linie: vSp2001(1,1)=2456000 vSp2001(1,2)=0.2 vSp2001(1,3)=0.15 vSp2001(1,4)=365000 * a doua linie: vSp2001(2,1)=3500000 vSp2001(2,2)=0.15 vSp2001(2,3)=0.0 vSp2001(2,4)=100000 * a treia linie: vSp2001(3,1)=4200000 vSp2001(3,2)=0.3 vSp2001(3,3)=0.02 vSp2001(3,4)=0 * apelul procedurii: tabloul se transmite prin adresa CalcSporuri(@vSp2001) * procedura pentru calculul si afisarea sporurilor PROCEDURE CalcSporuri LPARAMETERS vSporuri local lnSpor FOR i = 1 TO ALEN(vSporuri,1) && pentru fiecare linie din tablou lnSpor=vSporuri(i,1)*(vSporuri(i,2)+vSporuri(i,3))+vSporuri(i,4) ? "Salariatul nr. " + allt (str(i)) + ; " are salariul de baza de " +allt(str(vSporuri(i,1))) +; " si totalul sporurilor de " + allt(str(lnSpor)) ENDFOR ENDPROC Într-R SULP� HWDS�� DSHOXO SURFHGXULL �OLQLD UHGDW� vQ FDUDFWHU bold� IXVHVH VFULV� DVWIHO�

CalcSporuri(vSp2001) – GHFL WUDQVPLWHUHD YDORULL� FDUH HVWH LPSOLFLW� vQ

Visual FoxPro. $FHVW OXFUX FDX]HD]� R HURDUH� YL]LELO� vQ ILJXUD ����

Page 16: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 97

Figura 4.8. TransmLWHUHD YDORULL XQXL WDEORX vQ SURFHGXUD DSHODW� FDX]HD]� R HURDUH

'XS� FRUHFWDUHD HURULL� UH]XOWDWXO H[HFX LHL HVWH FHO GLQ ILJXUD ����

Figura 4.9. Rezultatele programului din listingul 4.5

Vom prezenta în continuare câteva exemple de programe în Visual FoxPro. Exemplul 1 'DW� ILLQG ED]D GH GDWH VINZARI � GRULP V� DIO�P FDUH VXQW IDFWXULOH vQFDVDWH LQWHJUDO�

În acest scop avem nevoie de datele din tabelele FACTURIúL INCASFACT. Vom parcurge tabela FACTURI� F�XWkQG SHQWUX ILHFDUH QXP�U GH IDFWXU� vQUHJLVWU�ULOH

FRUHVSXQ]�WRDUH �GDF� VXQW� vQ WDEHOD INCASFACT úL FXPXOkQG YDORULOH FkPSXOXL

Transa . 3HQWUX vQ HOHJHUHD GHSOLQ� D PRGXOXL GH FDOFXO� DOJRULWPXO D IRVW UHGDW VXE IRUPD

VFKHPHORU ORJLFH GLQ ILJXULOH ���� úL �����

Page 17: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

98 Visual FoxPro

START

Deschide FACTURI, INCASFACT

NOTEOF(FACTURI)?

CALCUL_INCASARE

STOP

DA

NU

PROGRAM SITUATIA_INCASARILOR

Inchide FACTURI, INCASFACT

FiJXUD ����� 6FKHPD ORJLF� SHQWUX SURJUDPXO SULQFLSDO SITUATIA_INCASARILOR

PROCEDURA CALCUL_INCASARE

INCEPUT

Cauta FACTURI.CODFACTURA

valincas:=0

Pozitionare la inceput de fisier in INCASFACT

NOTEOF(INCASFACT)

?

DAvalincas:=vaincas+INCASFACT.TRANSA

SFARSIT

NU

Afiseaza INCASFACT.NRFACT, valincas

)LJXUD ����� 6FKHPD ORJLF� SHQWUX SURFHGXUD CALCUL_INCASARE

Page 18: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 99

Codul-VXUV� DO SURJUDPXOXL 9LVXDO )R[3UR SITUATIA_INCASARILOR.PRG este prezentat în listingul 4.6.

Listing 4.6. Varianta cu DO WHILE

* program pentru afisarea situatiei incasarilor *********************************************** CLEAR SET TALK OFF && pentru inhibarea afisarii mesajelor-sistem STORE 0 TO nrf, valfact, valincas * deschidem baza de date IF !DBUSED("vinzari") OPEN DATABASE "k:\database\vinzari" SHARED ENDIF SET DATABASE TO vinzari && BD vinzari devine curenta * deschidem tabelele IF !USED("facturi") USE facturi IN 0 SHARED ENDIF IF !USED("incasfact") USE incasfact IN 0 SHARED ENDIF SELECT facturi GO TOP ? "factura nr. ", "valoare cu TVA", "valoare incasata", "valoare de incasat" DO WHILE NOT EOF() nrf=facturi.nrfact valfact=facturi.valftva*1.19 SELECT incasfact SUM TRANSA TO valincas FOR nrfact=nrf ? nrf, valfact, valincas, valfact-valincas SELECT facturi SKIP ENDDO SET TALK ON CLOSE TABLES ALL CLOSE DATABASE *********************************************** ÌQ ORFXO FRPELQD LHL DO WHILE NOT EOF() úL SKIP se poate utiliza structura

SCAN…ENDSCAN� FDUH DUH DYDQWDMXO F� QX QHFHVLW� R SR]L LRQDUH SUHDODELO� OD vQFHSXWXO

WDEHOHL úL UHDOL]HD]� XQ DYDQV DXWRPDW OD vQUHJLVWUDUHD XUP�WRDUH� 3DUWHD GLQ FRGXO-VXUV�scriV� vQ FDUDFWHUH bold VH SRDWH PRGLILFD GXS� FXP VH DUDW� vQ OLVWLQJXO ����

Listing 4.7. Varianta cu SCANúL SUM

SELECT facturi ? "factura nr. ", "valoare cu TVA", "valoare incasata", "valoare de incasat" SCAN nrf=facturi.nrfact valfact=facturi.valftva*1.19 SELECT incasfact SUM TRANSA TO valincas FOR nrfact=nrf ? nrf, valfact, valincas, valfact-valincas SELECT facturi ENDSCAN

Page 19: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

100 Visual FoxPro

În plus, comanda SCANSHUPLWH FKLDU SDUFXUJHUHD FRQGL LRQDO� D WDEHOHL �SCAN NEXT 3 vQVHDPQ� vQ FD]XO GH PDL VXV FRQVXOWDUHD VLWXD LHL SULPHORU WUHL IDFWXUL�� ÌQ DFHVW SURJUDP

DP EHQHILFLDW úL GH SH XUPD FRPHQ]LL SUM� I�U� GH FDUH SURJUDPXO DU IL IRVW PDL FRPSOLFDW

úL PDL JUHX OL]LELO� GLQ FDX]D SUH]HQ HL XQHL VWUXFWXUL UHSHWLWLYH VXSOLPHQWDUH� 5HG�P vQ

listingul 4.8, cu caractere bold� SRU LXQHD PRGLILFDW��

/LVWLQJ ���� 9DULDQWD I�U� FRPDQGD SUM

SELECT facturi ? "factura nr. ", "valoare cu TVA", "valoare incasata", "valoare de incasat" SCAN nrf=facturi.nrfact valfact=facturi.valftva*1.19 valincas=0 SELECT incasfact GO TOP DO WHILE NOT EOF() LOCATE FOR nrfact=nrf IF FOUND() valincas=valincas+transa DO WHILE NOT EOF() CONTINUE valincas=valincas+transa ENDDO ENDIF ENDDO ? nrf, valfact, valincas, valfact-valincas SELECT facturi ENDSCAN

În interpretarea acestui prRJUDP WUHEXLH V� LQH L FRQW úL GH IDSWXO F�� GDF� LQVWUXF LXQHD

LOCATE/CONTINUEQX J�VHúWH QLFL R vQUHJLVWUDUH FDUH vQGHSOLQHúWH FRQGL LD VSHFLILFDW��

DWXQFL IXQF LD EOF() are valoarea .T. 9DULDQWHOH GH SURJUDP SUH]HQWDWH PDL VXV QX SUHD UHVSHFW� VFKHPD ORJLF�� vQ FDUH

FDOFXOXO YDORULL vQFDVDWH SHQWUX ILHFDUH IDFWXU� VH UHDOL]D SULQWU-R IXQF LH GLVWLQFW�� 2

YDULDQW� PRGXODU� D SURJUDPXOXL HVWH RIHULW� vQ OLVWLQJXO ����

/LVWLQJ ���� 9DULDQW� FDUH IRORVHúWH R SURFHGXU� úL IXQF LH GHILQLW� GH XWLOL]DWRU

* program pentru afisarea situatiei incasarilor – YDULDQWD VWUXFWXUDW� *********************************************** CLEAR SET TALK OFF && pentru inhibarea afisarii mesajelor-sistem STORE 0 TO nrf, valfact, valincas * deschidem baza de date IF !DBUSED("vinzari") OPEN DATABASE "k:\database\vinzari" SHARED ENDIF SET DATABASE TO vinzari && BD vinzari devine curenta * deschidem tabelele IF !USED("facturi") USE facturi IN 0 SHARED ENDIF IF !USED("incasfact") USE incasfact IN 0 SHARED ENDIF

Page 20: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 101

SELECT facturi ? "factura nr. ", "valoare cu TVA", "valoare incasata", "valoare de incasat" SCAN DO calculeaza_si_afiseaza ENDSCAN SET TALK ON CLOSE TABLES ALL CLOSE DATABASE *********************************************** PROCEDURE calculeaza_si_afiseaza nrf=facturi.nrfact valfact=facturi.valftva*1.19 SELECT incasfact valincas=insumeaza_valoare(nrf) ? nrf, valfact, valincas, valfact-valincas SELECT facturi ENDPROC *********************************************** FUNCTION insumeaza_valoare PARAMETERS nr STORE 0 TO vi SUM TRANSA TO vi FOR nrfact=nr RETURN vi 2ULFDUH DU IL YDULDQWD XWLOL]DW�� UH]XOWDWXO H[HFX LHL DUDW� FD vQ ILJXUD �����

)LJXUD ����� 6LWXD LD vQFDV�ULL IDFWXULORU

2 YDULDQW� PXOW PDL VLPSO� �IRORVLQG LQVWUXF LXQL SQL� VH RE LQH SULQ FRPELQDUHD D

GRX� FRPHQ]L SELECT� SULPD FXPXOHD]� WUDQúHOH vncasate din fiecare factur�, a doua HIHFWXHD]� R MRQF LXQH H[WHUQ� vQWUH WDEHOD FACTURI úL WDEHOD WHPSRUDU� FX vQFDV�UL

cumulate.

Page 21: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

102 Visual FoxPro

/LVWLQJ ��� ELV� 9DULDQWD FX LQWHURJ�UL 64/

*********************************************** CLEAR * deschidem baza de date IF !DBUSED("vinzari") OPEN DATABASE "k:\database\vinzari" SHARED ENDIF SET DATABASE TO vinzari && BD vinzari devine curenta * selectam intr-o tabela temporara incasarile grupate pe facturi SELECT nrfact, SUM(TRANSA) AS val_incasata ; INTO CURSOR temp1 ; FROM incasfact GROUP BY nrfact * efectuam o jonctiune externa * cu tabela FACTURI * (sunt si facturi pentru care nu este nici o plata) SELECT F.nrfact AS factura_nr, F.valftva*1.19 AS val_cu_tva, ; NVL(val_incasata,0) as val_incasata, ; NVL(F.valftva*1.19-val_incasata,0) AS val_de_incasat ; FROM facturi F LEFT OUTER JOIN temp1 T ON T.nrfact=F.nrfact CLOSE TABLES ALL CLOSE DATABASE *********************************************** $ L REVHUYDW vQ SURJUDPXO GH PDL VXV XWLOL]DUHD IUHFYHQW� D FDUDFWHUXOXL ÄSXQFW úL

YLUJXO�´ IRORVLW vQ VFRSXO IUDJPHQW�ULL SH PDL PXOWH UkQGXUL D XQHL FRPHQ]L OXQJL� Exemplul 2 3HQWUX HYLGHQ LHUHD PRGXOXL GH OXFUX FX IXQF LL� SUHFXP úL D FkWRUYD GLQWUH VWUXFWXULOH GH

control enumerate anterior vom recurge la exemplul calculului totalului facturat pe fiecare FOLHQW vQ SDUWH� YDULDQWD ÄSXU� [%DVH´ �I�U� XWLOL]DUHD SQL). Pentru îndeplinirea acestui RELHFWLY YRP SDUFXUJH XUP�WRULL SDúL�

• FRQVWUXLP R IXQF LH �Funct_tot_factura – ILJXUD ����� FDUH WRWDOL]HD]� OLQLLOH

unei facturi inclusiv TVA (procentul este luat din tabela PRODUSE pentru fiecare SURGXV vQ SDUWH�� FH YD DYHD FD SDUDPHWUX QXP�UXO GH IDFWXU��

• FRQVWUXLP R IXQF LH �Funct_total_client – ILJXUD ����� FDUH WRWDOL]HD]�

IDFWXULOH ILHF�UXL FOLHQW SULPLQG FD SDUDPHWUX FRGXO FOLHQWXOXL úL YD DSHOD IXQF LD

Funct_tot_factura SHQWUX ILHFDUH IDFWXU� D FOLHQWXOXL [ �WUDQVPL kQG FD

SDUDPHWUX QXP�UXO IDFWXULL�� • FRQVWUXLP� vQ ILQDO� R SURFHGXU� �Proc_totalfacturat_client – figura

4.13) care parcurge tabela CLIENTIúL� SHQWUX ILHFDUH FOLHQW� DSHOHD]� IXQF LD

Funct_total_client WUDQVPL kQG FD SDUDPHWUX FRGXO FOLHQWXOXL FXUHQW úL

DILúkQG DSRL XQ PHVDM FX WRWDOXO FOLHQWXOXL UHVSHFWLY�

Page 22: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 103

)LJXUD ����� 3URFHGXUD GH DILúDUH D WRWDOXOXL IDFWXUDW SHQWUX XQ FOLHQW

)LJXUD ����� )XQF LD GH FDOcul al totalului facturat pentru un client

)LJXUD ����� )XQF LD GH FDOFXO DO WRWDOXOXL XQHL IDFWXUL

Page 23: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

104 Visual FoxPro

4.6. 0DFURVXEVWLWX LD��vQWU-XQ�FXYkQW��PDL�PXOW��SXWHUH

3XWHP VSXQH F� PDFURVXEVWLWX LD HVWH ÄPDQ� FHUHDVF�´ SHQWUX RULFH GH]YROWDWRU GH

DSOLFD LL PDL ÄU�V�ULWH´ FDUH VH FRQIUXQW� FRQWLQXX FX SUREOHPD JHQHUDOL]�ULL PRGXOHORU�

8QXO GLQWUH RELHFWLYHOH XUP�ULWH OD R DSOLFD LH SRDWH IL� FkW PDL SX LQ FRG-VXUV� FDUH V�

U�VSXQG� XQRU QHFHVLW� L FkW PDL YDULDWH úL vQ FkW PDL PXOWH PRGXUL SRVLELO� &X DOWH FXYLQWH�

R DSOLFD LH LQIRUPDWLF� SURIHVLRQDO� WUHEXLH V� YLQ� vQ vQWkPSLQDUHD FHULQ HORU QRL DOH

XWLOL]DWRULORU úL FKLDU WUHEXLH V� OH SURYRDFH SHQWUX D-L PXO XPL SH GHSOLQ� 3URJUDPDWRUXO QX

WUHEXLH vQWRWGHDXQD V� LGHQWLILFH úL V� FRGLILFH RS LXQL VWDWLFH SHQWUX QHFHVLW� L VSHFLILFH� FL�

GH PXOWH RUL� WUHEXLH V� DLE� R YL]LXQH ODUJ� DVXSUD VSHFWUXOXL GH SRVLELOH RS LXQL úL FHULQ H

úL V� FRQVWUXLDVF� PRGXOH FX XQ FRPSRUWDPHQW GLQDPLF� IOH[LELOH úL vQ DFHODúL WLPS ILDELOH

(in limita posibilului). $úDGDU� PDFURVXEVWLWX LD GRWHD]� FX XQ FRPSRUWDPHQW GLQDPLF GLYHUVH RELHFWH DOH XQHL

DSOLFD LL� (D VH UHDOL]HD]� SULQ XWLOL]DUHD VHPQXOXL & (ampersand) înaintea unei variabile de WLS FDUDFWHU� $FHDVW� YDULDELO� VWRFKHD]� R LQVWUXF LXQH VDX R H[SUHVLH HYDOXDELO� úL VH

H[HFXW� Dstfel: &nume-YDULDELO�

6SUH H[HPSOX� VHFYHQ D XUP�WRDUH HVWH LQWURGXV� vQ IHUHDVWUD GH FRPDQG�� x='1+1' ? x ? &x

(D YD DYHD XUP�WRUXO UH]XOWDW �YH]L úL ILJXUD ������ • VH FUHHD]� YDULDELOD GH WLS FDUDFWHU Ä[´ úL L VH DWULEXLH úLUXO GH FDUDFWHUH Ä���´� • în feUHDVWUD SULQFLSDO� VH YD DILúD �FRPDQGD "� úLUXO FD DWDUH� ���� • vQ IHUHDVWUD SULQFLSDO� VH DILúHD]� QXP�UXO � FD UH]XOWDW DO HYDOX�ULL H[SUHVLHL Ä���´� 'H DVHPHQHD� VHFYHQ HOH�

x='liniifact' use &x in 0

sau x= 'use liniifact in 0' &x

vor avea ca rezultat deschiderea tabelei LINIIFACT.

Atribuirea úLUXOXL GH caractere '1+1' variabilei x

AfiúDUHD con LQXWXOXL variabilei x

AfiúDUHD rezultatului interpret�ULL úL execu ieicon LQXWXOXL variabilei x

Figura 4.1�� ([HPSOX GH PDFURVXEVWLWX LH

Page 24: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 105

$FFHQWX�P IDSWXO F� úLUXO GH FDUDFWHUH DWULEXLW YDULDELOHL FH YD FRQVWLWXL VXUVD

PDFURVXEVWLWX LHL WUHEXLH V� ILH R H[SUHVLH FRUHFW� GLQ SXQFW GH YHGHUH VLQWDFWLF úL LQWHUpre-WDELO� GH FRPSLODWRUXO 9LVXDO )R[3UR� ùLUXO UHVSHFWLY QX SRDWH FRQ LQH HO vQVXúL VHPQXO &.

8UP�WRDUHOH OLVWLQJXUL VXQW� VSHU�P� VXILFLHQW GH FRQFOXGHQWH SHQWUX D GHPRQVWUD

XWLOLWDWHD IDQWDVWLF� D DFHVWXL LQVWUXPHQW QXPLW PDFURVXEVWLWX LH úL SH FDUH� GLQ S�FDWH� QX-l UHJ�VLP vQ PXOWH 6*%'-uri sau limbaje de programare.

Listing 4.50. Deschiderea tuturor tabelelor bazei de date curente

* exemplu de cod generalizat pentru * deschiderea tabelelor unei baze de date * varianta cu macrosubstitutie & CLOSE TABLES ALL clear * extragem din containerul bazei de date(este tot o tabela) numele tabelelor OPEN DATABASE "k:\aplicatie\database\vinzari" SHARED *functia ADBOBJECTS populeaza un vector cu obiectele bazei de date curente ADBOBJECTS(vTabele, "TABLE") FOR i= 1 TO ALEN(vTabele,1) USE &vTabele(i) IN 0 ENDFOR

În listingul 4.10 s-a utLOL]DW XQD GLQ PXOWHOH IXQF LL ÄXWLOLWDUH´ DOH 9LVXDO )R[3UR� DQXPH

ADBOBJECTS(nume-tablou, tip-obiect) , care are rolul de a plasa într-un tablou QXPHOH RELHFWHORU GLQ ED]D GH GDWH GHVFKLV�� )LOWUDUHD DFHVWRU RELHFWH GHSLQGH GH YDORDUHD

celui de-al doilea DUJXPHQW DO IXQF LHL� FDUH SRDWH IL ÄTABLE”, „ VIEW”, „ RELATION” sau „CONNECTION”. În exemplul nostru s-a optat pentru tabele.

3URGXF�WRUXO PHGLXOXL 9LVXDO )R[3UR UHFRPDQG� vQORFXLUHD �DFROR XQGH HVWH SRVLELO� D

PDFURVXEVWLWX LHL �FRQVLGHUDW� OHQW�� FX ÄQXPele de expresii” (named expressions). Acestea UHSUH]LQW� R FRQYHQ LH GH LQFOXGHUH D XQHL YDULDELOH GH WLS úLU GH FDUDFWHUH vQWUH SDUDQWH]H� OD

H[HFX LH HYDOXkQGX-VH QX úLUXO GH FDUDFWHUH� FL YDULDELOD VDX FRQVWDQWD UHSUH]HQWDW� GH

acesta, ca în listingul 4��� ELV� 'LIHUHQ D HVWH OLQLD VFULV� FX FDUDFWHUH bold.

Listing 4.10 bis. Deschiderea tuturor tabelelor bazei de date curente (varianta 2)

* exemplu de cod generalizat pentru * deschiderea tabelelor unei baze de date * varianta cu „named expression” CLOSE TABLES ALL clear * extragem din containerul bazei de date(este tot o tabela) numele tabelelor OPEN DATABASE "k:\aplicatie\database\vinzari" SHARED *functia ADBOBJECTS populeaza un vector cu obiectele bazei de date curente ADBOBJECTS(vTabele, "TABLE") FOR i= 1 TO ALEN(vTabele,1) USE (vTabele(i)) IN 0 ENDFOR

Alt exemplu: strAstazi="Astazi este " + dtoc(date()) ?(strAstazi)

În fine, oarecum DVHP�Q�WRDUH PDFURVXEVWLWX LHL HVWH úL IXQF LD

EVALUATE(<expresie-de-tip-caracter>). De data aceasta expresia trebuie VFULV� vQWUH JKLOLPHOH�

Page 25: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

106 Visual FoxPro

strAstazi="Astazi este " + dtoc(date()) ?evaluate("strAstazi")

$OWH H[HPSOH vQ FDUH PDFURVXEVWLWX LD FRQVWLWXLH R VROX LH VDOYDWRDUH YRU IL SUH]HQWDWH vQ

capitolul 5, consacrat dialectului SQL GLQ 9LVXDO )R[3UR� SUHFXP úL vQ FDSLWROXO �� SDUWHD

rapoartelor dinamice.

4.7. ,PSRUWXO�úL�H[SRUWXO�GH�GDWH

,QVWUXF LXQLOH SHQWUX DFFHV OD ILúLHUH GH WLS ED]� GH GDWH DX IRVW WUDWDWe în capitolele XOWHULRDUH� 9LVXDO )R[3UR DUH úL IDFLOLW� L SHQWUX OXFUXO FX ILúLHUH GH WLS WH[W �ASCII � úL

ILúLHUH ELQDUH� $FFHVDUHD ILúLHUHORU $6&,, vQ 9LVXDO )R[3UR 3HQWUX DILúDUHD XQRU ILúLHUH WH[W VH SRDWH XWLOL]D FRPDQGD TYPE <nume-

fisier.extensie> � FDUH HVWH DVHP�Q�WRDUH FD HIHFW FX FRPDQGD TYPE din MS-DOS. Comenzile

COPY TO <nume- ILúLHU! 7<3( �WLS- ILúLHU! úL

APPEND FROM <nume-ILúLHU>�H[WHQVLH@! >7<3( �WLS- ILúLHU!@ se pot folosi pentru exportul/importul de date din tabele .dbf F�WUH R PXOWLWXGLQH Ge IRUPDWH� SULQWUH FDUH úL FHO WH[W �ASCII ).

'LVSXQHP GH XQ ILúLHU ASCII prezentat în figura 4.17.

Figura 4.2�� )LúLHU ASCII de tip delimited with blank

$FHVW ILúLHU DUH R VWUXFWXU� ÄWUDGL LRQDO�´ IRUPDW� GLQ FkPSXUL� GLQWUH FDUH FHOH GH WLS úLU

GH FDUDFWHUH VXQW vQFDGUDWH GH JKLOLPHOH� (VWH XQ IRUPDW IRDUWH U�VSkQGLW� DO�WXUL GH FHO CSV (comma-separated values) – vezi figura 4.18, la care rolul de delimitator este jucat de YLUJXO�� LDU SULPD OLQLH FRQ LQH QXPHOH FkPSXULORU�

Page 26: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 107

)LJXUD ����� )LúLHU ASCII de tip CSV (comma-separated values)

$YHP QHYRLH V� LPSRUW�P DFHVWH GDWH vQWU-R WDEHO�� D F�UHL VWUXFWXU� DP FUHDW-o în SUHDODELO úL FDUH DUDW� DVWIHO�

NUME, C, 40 DATANAST, D ( � RFWH L� GDU QX VH VFULH) LOCALITATE, C, 20 Vom concepe, în vederea importului, programul din listingul 4.11.

Listing 4.61

* program pentru importul din fisiere ASCII *************************************************** * deschidem baza de date IF !DBUSED("vinzari") OPEN DATABASE "k:\database\vinzari" SHARED ENDIF * deschidem tabela de test IF !USED("teste_diverse") USE teste_diverse IN 0 SHARED ENDIF SELECT teste_diverse * importam textul din fisierul ASCII APPEND FROM "k:\fisier1.txt" DELIMITED WITH BLANK * adaugam inca o persoana APPEND BLANK REPLACE nume WITH "Christine Perfect",; datanast WITH {^1943-07-12}, ; localitate WITH "Grenodd" * afisam rezultatul BROWSE TITLE "Apasati ESC pentru continuare..." * inchidem tabela USE ***************************************************

'DF� VH GRUHúWH LPSRUWXO GLQ FHD GH-D GRXD YDULDQW� GH ILúLHU �QXPHOH ILLQG

fisier2.txt �� OLQLD PDUFDW� FX FDUDFWHUH bold se va înlocui cu linia: APPEND FROM "k:\fisier2.txt" TYPE CSV 2ULFDUH DU IL YDULDQWD GH SURJUDP� UH]XOWDWXO DUDW� DVWIHO�

Page 27: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

108 Visual FoxPro

Figura 4.19. Rezultatul comenzii APPEND FROMOD LPSRUWXO XQXL ILúLHU WH[W

$YHP QHYRLH V� H[SRUW�P DFHVWH GDWH vQWU-XQ DOW IRUPDW� V� ]LFHP R IRDLH GH FDOFXO

([FHO �� $FHDVW� SUREOHP� VH UH]ROY� SULQ FRPDQGD COPY TO� GXS� FXP VH DUDW� vQ

programul din listingul 4.12:

Listing 4.17

* program pentru exportul datelor dintr-o tabela *************************************************** * deschidem baza de date IF !DBUSED("vinzari") OPEN DATABASE "k:\database\vinzari" SHARED ENDIF * deschidem tabela de test IF !USED("teste_diverse") USE teste_diverse IN 0 SHARED ENDIF SELECT teste_diverse * exportam primele 3 inregistrari GO TOP && prima inregistrare COPY TO „k:\export1.xls” type XL5 next 3 USE ***************************************************

5H]XOWDWXO DUDW� FD vQ ILJXUD ���� �VXQW H[SRUWDWH QXPHOH FkPSXULORU SH SULPD OLQLH��

)LJXUD ����� 5H]XOWDWXO H[SRUWXOXL F�WUH R IRDLH GH FDOFXO ([FHO

3HQWUX FUHDUHD GH ILúLHUH WH[W H[LVW� úL YDULDQWD IRORVLULL FRPHQ]LORU Ä\ ”, respectiv „\\ ”. DeosebLUHD GLQWUH FHOH GRX� YDULDQWH HVWH DFHHDúL FD OD FRPHQ]LOH Ä?´ úL Ä??”. Comenzile \ úL \\ VH XWLOL]HD]� vQ FRPELQD LH FX FRPDQGD SET TEXTMERGE� $VWIHO� GDF� YRP ODQVD

Page 28: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 109

comanda SET TEXTMERGE ON, variabilele incluse între semnele << >> vor fi evaluate úL vQORFXLWH FX YDORDUHD ORU� vQ FD] FRQWUDU� YRU DS�UHD vQ WH[W FD DWDUH� &RPDQGD SET TEXTMERGE TO <nume-ILúLHU�W[W! DUH FD HIHFW UHGLUHF LRQDUHD LHúLULL FRPHQ]LL

�WULPLWHUHD WH[WHORU vQ ILúLHUXO WH[W VSHFLILFDW vQ ORF GH HFUDQXO SULQFLSDO 9LVXDO )R[3UR��

Anularea acestui comportament se face cu SET TEXTMERGE TO�FDUH vQFKLGH ILúLHUXO� úL

SET TEXTMERGE OFF�FDUH vQFHWHD]� HYDOXDUHD YDULDELOHORU GLQWUH VHPQHOH �� !!��

Listing 4.18

* program de test pentru interclasare CLEAR if !DBUSED('vinzari') && daca baza de date nu-i deschisa OPEN DATABASE 'database\vinzari' SHARED && cale relativa: BD vinzari && din directorul database ENDIF IF !USED('clienti') && daca tabela clienti nu-i deschisa USE clienti IN 0 SHARED ENDIF SELECT clienti SET TEXTMERGE ON SCAN FOR RECNO()<=4 && parcurgem primele 4 linii ale tabelei \Clientul ce are codul \\ <<ALLTRIM(str(codcl))>> \\ se numeste <<ALLTRIM(dencl)>> \\ cu sediul pe \\ <<ALLTRIM(adresa)>>, cod <<ALLTRIM(codpost)>> ENDSCAN SET TEXTMERGE OFF CLOSE ALL &&inchide tabelele si baza de date

3URJUDPXO IRORVHúWH úL IXQF LLOH DBUSED(<nume-ED]�-de-date>) úL

USED(<nume-WDEHO�!�, FDUH SHUPLW V� YHULILF�P GDF� R ED]� GH GDWH� UHVSHFWLY R

WDEHO�� VXQW VDX QX GHVFKLVH� ùL vQF� FHYD� RSHUDWRUXO ORJLF NOT în Visual FoxPro se poate vQORFXL FX VHPQXO H[FODP�ULL Ä! ”, deci !USED() HVWH DFHODúL OXFUX FX NOT USED() � ,DW�rezultatul, în figura 4.21:

)LJXUD ����� 5H]XOWDWHOH H[HFX LHL SURJUDPXOXL GLQ OLVWLQJXO ����

'DF� OLQLD VFULV� vQ bold (vezi listingul ����� VH vQORFXLHúWH FX OLQLLOH� SET TEXTMERGE ON SET TEXTMERGE TO 'iesire.txt'

vQ ORF GH XQ UH]XOWDW DILúDW SH HFUDQ VH YD RE LQH ILúLHUXO iesire.txt , în directorul curent, FX H[DFW DFHODúL FRQ LQXW�

Page 29: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

110 Visual FoxPro

Comenzile SET TEXTMERGE, „\ ´ úL Ä\\ ´ PHULW� D IL OXDWH vQ VHDP� DWXQFL FkQG GRULP

V� HIHFWX�P R LQWHUFODVDUH �FD GH SLOG� WULPLWHUHD XQHL VFULVRUL FX FRQ LQXW VWDQGDUG F�WUH WR L

FOLHQ LL�� &RPHQ]LOH COPY TO... , APPEND FROM... , \ úL \\ sunt utile atunci când DYHP QHYRLH V� IDFHP VFKLPE GH GDWH FX DSOLFD LL GH pe alte platforme. Formatul ASCII este universal, pe când formatele .dbf , .xls , .wks úL DOWHOH VLPLODUH QX VXQW�

4.7.1. $FFHVDUHD ILúLHUHORU ELQDUH vQ 9LVXDO )R[3UR� 5HFXSHUDUHD GDWHORU din tabele cu antetul (header-ul) eronat

9H L DYHD SUREDELO QHYRLH GH DVHPHQHD IDFLOLW� L vQ FD]XO vQ FDUH GRUL L V� UHDOL]D L R

DSOLFD LH PDL VRILVWLFDW�� &D úL XQ ILúLHU ASCII � XQ ILúLHU ELQDU HVWH XQ úLU GH RFWH L SH GLVF�

GDU VSUH GHRVHELUH GH SULPXO� vQ FDUH ILHFDUH RFWHW UHSUH]LQW� XQ FDUDFWHU �OLWHU� VDX FLIU���

aici oFWH LL DX VHPQLILFD LL GLIHULWH� ÌQ 9LVXDO )R[3UR� XQ QXP�U VH PHPRUHD]� SH � RFWH L

(similar cu tipul Windows DWORD – double din C++ sau Basic �� R GDW� GH WLS ORJLF SH �

RFWHW� XQ úLU GH FDUDFWHUH SH DWk LD RFWH L FkWH FDUDFWHUH DUH HWF� În citirea/scrieUHD XQXL ILúLHU ELQDU� GH R LPSRUWDQ � FDSLWDO� VXQW SRLQWHUXO úL GHSOD-

samentul (offset�� 3RLQWHUXO HVWH XQ IHO GH LQGLFDWRU FH DUDW� SR]L LD vQ ILúLHU� LDU RIIset-ul, un QXP�U GH RFWH L QXP�UD L GH OD vQFHSXWXO ILúLHUXOXL� $VWIHO� GDF� úWLP F� XQ ILúLHU Einar vQFHSH FX XQ QXP�U úL GRULP V�-O FLWLP� WUHEXLH V� DYDQV�P FX � RFWH L SULQWU-R LQVWUXF LXQH

DGHFYDW� �RSHUD LLOH GH FLWLUH-VFULHUH SURGXF úL DYDQVXO SRLQWHUXOXL�� ÌQ 9LVXDO )R[3UR�

ILúLHUHOH ELQDUH VXQW DFFHVDWH SULQWU-XQ VHW GH IXQF LL QXPLWH IXQF Li pentru acces low-level. )XQF LD FOPEN(<nume-ILúLHU!>�DWULEXW@� UHWXUQHD]� XQ QXP�U FH SRDWH IL

IRORVLW XOWHULRU GHVFKLGHULL ILúLHUXOXL VSHFLILFDW� FD úL alias SHQWUX ILúLHU úL FDUH vQ SDJLQLOH

XUP�WRDUH YD IL UHIHULW FD QXP�U- ILúLHU �GHQXPLUHD FRQVDFUDW� este file handler�� 'DF�

ILúLHUXO QX D SXWXW IL GHVFKLV� DWXQFL UH]XOWDWXO DFHVWHL IXQF LL HVWH –1.

7DEHOXO ���� 0RGXUL GH GHVFKLGHUH D XQXL ILúLHU ELQDU

Atribut Drepturi Mod de citire/scriere a datelor 0 Read Only (implicit) cu buffer 1 Write-Only cu buffer 2 Read / Write cu buffer 10 Read-Only I�U� EXIIHU 11 Write-Only I�U� EXIIHU 12 Read / Write I�U� EXIIHU

'DF� QX VH VSHFLILF� R YDORDUH SHQWUX atribut � VH FRQVLGHU� �� GHFL ÄPRG GH DFFHV

read-only cu buffer”. )XQF LD FCREATE((<nume- ILúLHU!>�DWULEut]) DUH UROXO GH D FUHD �úL

GHVFKLGH� XQ ILúLHU FX QXPHOH VSHFLILFDW� 'DF� DFHODúL ILúLHU H[LVW� GHMD� HO HVWH GLVWUXV�

$UJXPHQWXO DWULEXW SRDWH OXD XQD GLQWUH YDORULOH GLQ WDEHOXO GH PDL MRV� FX VHPQLILFD LLOH

respective.

Tabelul 4.3. Atribute posibile lD FUHDUHD XQXL ILúLHU ELQDU

Atribut $WULEXWHOH ILúLHUXOXL FUHDW 0 Read-Write (implicit) 1 Read-Only 2 Hidden 3 Read-Only/Hidden 4 System

Page 30: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 111

Atribut $WULEXWHOH ILúLHUXOXL FUHDW 5 Read-Only/System 6 System/Hidden 7 Read-Only/Hidden/System

2 GDW� ILúLHUXO GHVFKLV� SXWHP VFULH vQ HO FX DMXWRUXO IXQF LLORU� ):5,7(�QXP�U-ILúLHU, H[SUHVLH>�QXP�U- RFWH L-de-scris]) sau )3876�QXP�U- ILúLHU, H[SUHVLH>�QXP�U- RFWH L-de-scris]).

$PEHOH IXQF LL UHWXUQHD]� XQ QXP�U FH vQVHDPQ� QXP�UXO GH RFWH L VFULúL vQ ILúLHU

(0 GDF� VFULHUHD QX D Sutut avea loc). FPUTSVFULH FD XOWLP FDUDFWHU R FRPELQD LH FDUULDJH-return+formfeed (CRLF VDX DYDQV GH OLQLH� FDUH vQ 9LVXDO )R[3UR VH VLPXOHD]� SULQ

CHR(13)+CHR(10) ). 3HQWUX FLWLUH VH SRW IRORVL IXQF LLOH�

)5($'�QXP�U- ILúLHU�QXP�U- RFWH L-de-citit) sau

FG(76�QXP�U- ILúLHU>�QXP�U- RFWH L-de-citit]). $ GRXD IXQF LH FLWHúWH RFWH LL SkQ� OD SHUHFKHD GH FDUDFWHUH CRLF� GDF� QX V-a specificat

altfel prin argumentul QXP�U- RFWH L-de-citit . Deplasarea într-XQ ILúLHU ELQDU DUH ORF FX DMXWRUXO IXQF LHL�

)6((.�QXP�U- ILúier, deplasament-ca-nr-de- RFWH L >�

SR]L LH- UHODWLY�@� FDUH ÄVDUH´ XQ QXP�U VSHFLILFDW GH RFWH L� vQFHSkQG GH OD SR]L LD LQGLFDW� SULQ FHO GH-al WUHLOHD DUJXPHQW� $FHVWD SRDWH DYHD XQD GLQWUH YDORULOH � �vQFHSXWXO ILúLHUXOXL�� � �SR]L LD

FXUHQW�� VDX � �VIkUúLWXO ILúLHUXOXL�� 5H]XOWDWXO IXQF LHL DUDW� GHSODVDPHQWXO �vQ RFWH L� ID � GH

vQFHSXWXO ILúLHUXOXL� )XQF LD )(2)�QXP�U- ILúLHU� UHWXUQHD]� .T. sau .F. , GXS� FXP QH DIO�P VDX QX

OD VIkUúLWXO ILúLHUXOXL� 8WLO� HVWH úL IXQF LD ))/86+�QXP�U- ILúLHU�, ce are misiunea de D VFULH LQIRUPD LLOH GLQ EXIIHU SH GLVF� vQ FD]XO DFFHVXOXL ÄEXIIHUL]DW´ OD ILúLHUXO ELQDU� ÌQ

ILQH� IXQF LD )&/26(�QXP�U- ILúLHU� UHDOL]HD]� vQFKLGHUHD ILúLHUXOXL VSHFLILFDW� Utilitatea acestor comenzi pentru un programator de FoxPro se poate dovedi în mai

PXOWH FD]XUL� 9RP DQDOL]D DLFL R SUREOHP� OHJDW� GH FRUXSHUHD IRUPDWXOXL XQXL ILúLHU �DBF, FDUH IDFH LPSRVLELO� GHVFKLGHUHD VD FX USE.

Dispunem de tabela teste_diverse.DBF � D F�UHL VWUXFWXU� úWLP F� DUDW� DVWIHO� NUME, C, 40 DATANAST, D (8 octe L� LOCALITATE, C, 20 Header-ul unei tabele .DBF�]RQ� FX PHWDGDWH� PHPRUHD]� PXOWH LQIRUPD LL LPSRUWDQWH

�QXPHOH ED]HL GH GDWH GH FDUH DSDU LQH WDEHOD� QXP�UXO GH FkPSXUL� QXP�UXO GH vQUHJLVWU�UL�

QXPHOH úL RUGLQHD FkPSXULORU HWF��� 3UHVXSXQkQG F� header-ul unei tabele a fost compromis DFFLGHQWDO úL� FD XUPDUH� FRPDQGD USE QX PDL IXQF LRQHD]�� QH UHYLQH PLVLXQHD GH D

UHFXSHUD FkW PDL PXOW GLQ GDWHOH U�PDVH vQ WDEHO�� $FHVW OXFUX QX HVWH LPSRVLELO FX SX LQ

H[HUFL LX vQ IRORVLUHD IXQF LLORU low-level. TrebuiH V� FXQRDúWHP VWUXFWXUD WDEHOHL

�FkPSXULOH� FX WLSXULOH úL OXQJLPLOH ORU� úL FkWH FHYD GHVSUH IRUPDWXO XQXL ILúLHU �DBF (de mare ajutor aici ne este sistemul de help al Visual FoxPro; Programmer’sGuide → Appendix →TableFileStructure �� $IO�P GH DLFL F� header-ul unei tabele are o lungime de ��� RFWH L��� RFWH L QXP�UXO GH FkPSXUL GLQ VWUXFWXU�.

Page 31: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

112 Visual FoxPro

În cazul nostru sunt 3 câmpuri, deci header-ul tabelei are o lungime de 296+32*3=392 RFWH L� 'DWHOH SURSULX-]LVH YRU vQFHSH GH OD RFWHWXO ���� )LUHúWH� vQ ORF GH WRDWH aceste FDOFXOH DP IL SXWXW XWLOL]D IXQF LD HEADER (<nume- WDEHO�!�� FDUH UHWXUQHD]� FKLDU

GLPHQVLXQHD vQ RFWH L D header-XOXL WDEHOHL� GDU UHDPLQWL L-Y� F� DFHDVWD IXQF LRQHD]� GRDU

pe tabele valide, care se pot deschide cu USE. 6HFYHQ D GH FRG SH FDUH R YRP SUH]HQWD vQ OLVWLQJXO ���� GHVFKLGH ILúLHUXO vQ PRG ELQDU�

VDUH SHVWH SULPLL ��� GH RFWH L �P�ULPHD FDOFXODW� D header-XOXL�� H[HFXW� FLWLUHD FkPS FX

FkPS úL DILúHD]� GDWHOH FLWLWH GLUHFW SH HFUDQXO SULQFLSDO 9LVXDO )R[3UR�

Listing 4.94. Program pentru citirea unor date în format binar

* incercare de recuperare a datelor dintr-o * tabela .DBF compromisa * numele si structura tabelei: * TESTE_DIVERSE(nume, C(40), datanast D, localitate C(20)) CLEAR * deschidem fisierul (extensia e obligatorie) nTabela=FOPEN("k:\database\teste_diverse.dbf") IF nTabela=-1 MESSAGEBOX("Nu pot deschide fisierul. Exista sau e cumva deschis deja?") ELSE * deplasare 392 de octeti (296+3cimpuri*32octeti per camp) FSEEK(nTabela,392) * in fiecare inregistrare primul octet * constituie marcajul de stergere marcaj=FREAD(nTabela,1) * citim tabela pana la sfarsit DO WHILE NOT FEOF(nTabela) camp1=FREAD(nTabela,40) camp2=FREAD(nTabela,8) camp3=FREAD (nTabela, 20) ? marcaj, camp1 ?? DATE(VAL(LEFT(camp2,4)),VAL(SUBSTR(camp2, 5,2)), VAL(SUBSTR(camp2,7,2))) ?? " ", camp3 * citim primul octet de pe inregistrare: dupa ultima inregistrare * el nu mai este marcaj de stergere, ci caracterul EOF marcaj=FREAD(nTabela,1) ENDDO * inchidem fisierul FCLOSE(nTabela) ENDIF 5H]XOWDWXO H[HFX LHL HVWH SUH]HQWDW vQ ILJXUD ����� $VWHULVFXO GH OkQJ� SULPD vQUHJLVWUDUH

DUDW� PDUFDUH SHQWUX úWHUJHUH� 'H REVHUYDW F� vQ FD]XO FkPSXOXL GH WLS GDW� FDOHQGDULVWLF�

s-D HIHFWXDW R UHWUDWDUH FX DMXWRUXO IXQF LLORU SHQWUX OXFUXO FX úLUXri de caractere: LEFT() úL

SUBSTR() � IXQF LHL GH FRQYHUVLH GLQ úLU GH FDUDFWHUH vQ QXP�U VAL() úL IXQF LHL DATE �DQ� OXQ�� ]L�� $FHVW OXFUX D IRVW QHFHVDU GHRDUHFH vQ ILúLHU� GDWD FDOHQGDULVWLF� VH

VWRFKHD]� FD XQ úLU GH RFWH L vQ IRUPD AAAALLZZ.

Page 32: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 113

Figura ����� 'DWH UHFXSHUDWH GLQ ILúLHUXO teste_diverse.dbf

'HRFDPGDW� DILúDUHD D DYXW ORF SH HFUDQ� &X WLWOX GH H[HUFL LX� vQFHUFD L V� ÄWUHFH L SH

curat” (într-R WDEHO� FX VWUXFWXU� VLPLODU�� GDWHOH UHFXSHUDWH�

4.8. Tratarea erorilor în programele Visual FoxPro

PutHP VSXQH� SH VFXUW� F� HURULOH GLQWU-XQ SURJUDP VXQW GH GRX� PDUL FDWHJRULL� erori de VLQWD[� �SRW IL GHSLVWDWH GHRDUHFH vPSLHGLF� HWDSHOH GH FRPSLODUH úL GH H[HFX LH D

SURJUDPXOXL� úL HURUL GH H[HFX LH� FDUH QX SRW IL GHVFRSHULWH vQDLQWH GH H[HFX LD SURJUamului �SHQWUX GHWHF LD ORU� SURJUDPXO VH H[HFXW� IRORVLQG date de test� DGLF� GDWH SHQWUX FDUH

UH]XOWDWHOH SUHOXFU�ULORU VXQW GLQDLQWH FXQRVFXWH��

Testarea este activitatea de descoperire a erorilor, iar depanareaHVWH RSHUD LD GH L]RODUHúL FRUHFWDUH D Dcestora.

ÌQ UHDOL]DUHD XQHL DSOLFD LL� SURJUDPDWRUXO SRDWH DYHD vQ YHGHUH GLIHULWH QLYHOXUL DOH

UREXVWH LL DFHVWHLD� • H[HFX LD I�U� EORFDMH úL PHVDMH GH HURDUH GHUXWDQWH SHQWUX XWLOL]DWRUXO ILQDO� • DF LXQL DGHFYDWH vQ VFHQDULLOH FHOH PDL IUHFYHQWH� • posibilitDWHD XQHL DF LXQL UH]RQDELOH VDX RIHULUHD XQXL PHVDM GH HURDUH HGLILFDWRU

pentru o varietate de scenarii; • FDSDFLWDWHD UHVWDELOLULL DSOLFD LHL GXS� R DF LXQH QHDúWHSWDW� D XWLOL]DWRUXOXL� 3UXGHQ D HVWH PDPD vQ HOHSFLXQLL� DúD F�� vQDLQWH GH D DúWHSWD FD HURULOH V� DSDU� OD ORFXO

GH H[SORDWDUH D DSOLFD LHL� UHDOL]DWRUXO DFHVWHLD WUHEXLH V� R YHULILFH� V� HOLPLQH HURULOH

HYLGHQWH úL V� UHGXF� SH FkW SRVLELO ULVFXO DSDUL LHL GH QRL HURUL� 6WXGLLOH DX DU�WDW F� R

SUDFWLF� GLVFLSOLQDW� GH VFULHUH D FRGXOXL-VXUV� �IRORVLUHD FRPHQWDULLORU úL D OLQLLORU OLEHUH�

UHVSHFWDUHD XQRU FRQYHQ LL SHQWUX GHQXPLUHD YDULDELOHORU úL FRQVWDQWHORU HWF�� GXFH OD

UHGXFHUHD VHPQLILFDWLY� D QXP�UXOXL GH HURUL� ÌQ DO GRLOHD UkQG� R FDOH GH D SUHYHQL HURULOH OD H[HFX LH HVWH FRGLILFDUHD algoritmilor de o

DúD PDQLHU� vQFkW vQDLQWHD XQHL FRPHQ]L V� DLE� ORF R YHULILFDUH PLQLPDO� D FRQWH[WXOXL

acesteia. De exemplu, comada SKIP JHQHUHD]� R HURDUH GDF� VH vQWkOQHúWH VIkUúLWXO WDEHOHL�

'DU� SHQWUX FD R DVWIHO GH HURDUH V� QX DSDU� QLFLRGDW�� SUogramatorul poate folosi o VHFYHQ � GH SURJUDP GH IRUPD XUP�WRDUH�

IF !EOF() SKIP

Page 33: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

114 Visual FoxPro

ELSE GO BOTTOM ENDIF Visual FoxPro, ca orice mediu de dezvoltare din categoria sa, dispune de mecanisme

LPSOLFLWH GH VHPQDODUH D HURULORU úL GH FRUHF LH D DFHORU HURUL FDUH QX VXQW IDWDOH� 7RWXúL�

multe dintre erorile Visual FoxPro cer, atunci când survin într-XQ SURJUDP� RSULUHD LPHGLDW�

D DFHVWXLD� 'DU GDF� DU H[LVWD R SURFHGXU� FDUH V� LQWUH vQ DF LXQH DXWRPDW úL FDUH� vQ IXQF LH

GH QDWXUD HURULL� V� RIHUH� SULQ VWUXFWXUL GH FRQWURO DGHFYDWH� F�L �PDL IOH[LELOH� GH UH]ROYDUH

D DFHVWHLD " (VWH LPSRVLELO D FXQRDúWH GLQDLQWH PXOWLWXGLQHD DFHVWRU VLWXD LL� 3URJUDPDWRUXO

vQV� SRDWH DF LRQD vQ GLUHF LD ÄDGDSW�ULL OD SUREOHP�´� D PDQLSXO�ULL XQRU HURUL SH FDUH OH

DQWLFLSHD]� �OLSVD XQRU ILúLHUH GH GDWH� DEVHQ D XQRU GUHSWXUL GH DFFHV HWF��� 'HFL 9LVXDO

FoxPro este dotat cu mecanisme implicite de captare a erorilor, cu un mare caracter de JHQHUDOLWDWH� LDU SURJUDPDWRUXOXL GH DSOLFD LL vL UHYLQH VDUFLQD GH D FRQFHSH úL SXQH vQ

praFWLF� SURSULLOH VDOH PRGXOH GH WUDWDUH D HURULORU� $FHVW GHPHUV DO SURJUDPDWRUXOXL HVWH IDYRUL]DW GH H[LVWHQ D LQVWUXF LXQLL ON ERROR, a

F�UHL VLQWD[� FRPSOHW� HVWH 21 (5525 >FRPDQG�@ úL VH SODVHD]� GH UHJXO� OD vQFHSXWXO

programelor pentru care dorim o trDWDUH ÄSHUVRQDOL]DW�´ D HURULORU� ÌQ FD]XO DSDUL LHL XQHL

HURUL SH SDUFXUVXO H[HFX LHL SURJUDPXOXL� FRQWUROXO VH WUDQVIHU� LQVWUXF LXQLL GH GXS� ON ERRORúL QX PDL LQWU� vQ DF LXQH PHFDQLVPXO LPSOLFLW GH VHPQDODUH D HURULORU� (IHFWXO

DFHVWHL LQVWUXF LXQL VH SURSDJ� GH OD PRGXOXO DSHODQW F�WUH PRGXOXO DSHODW� GHFL vQ FD]XO

FRQFHSHULL XQHL UXWLQH GH WUDWDUH D HURULORU SHQWUX R DSOLFD LH FX PDL PXOWH PRGXOH GH

SURJUDP� DFHDVW� LQVWUXF LXQH VH SODVHD]� vQ SURJUDPXO SULQFLSDO� NNoo tt �� .. ON ERRORDUH HIHFW úL vQ IHUeastra de comenzi. 3UHVXSXQkQG F� SURFHGXUD GHVWLQDW� WUDW�ULL HURULORU VH QXPHúWH trat_erori ,

FRPDQGD SHQWUX DFWLYDUHD VD DU WUHEXL V� DUDWH DVWIHO� ON_ ERROR DO trat_erori 'DF� YRP VFULH GRDU ON ERROR� I�U� QLPLF DOWFHYD� DWXQFL YD DYHD ORF UHDFWLYDUHa

mecanismului implicit de manipulare a erorilor din Visual FoxPro. 'XS� FXP VH DUDW� vQ ILJXUD ����� VH SRDWH SURYRFD LQWHQ LRQDW R HURDUH SULQ VFULHUHD

XQHL FRPHQ]L JUHúLWH�

)LJXUD ����� 3URYRFDUHD LQWHQ LRQDW� D XQHL HURUL

Page 34: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 115

De asemenea, se poate folosL LQVWUXF LXQHD� (5525 QXP�U-eroare [,parametru eroare]|[mesaj eroare]

SHQWUX D JHQHUD R HURDUH 9LVXDO )R[3UR DO F�UHL QXP�U VH FXQRDúWH �GRFXPHQWD LD 9LVXDO

)R[3UR VSHFLILF� úL FDUH VXQW FRGXULOH GH HURDUH�� 3XWHP IRORVL DFHDVW� LQVWUXF LXQH vQ

scopuri de test, ca de exemplu: ERROR 13 – YD DILúD IHUHDVWUD GLQ ILJXUD ���� VWkQJD� ERROR 13, „participatii” – YD DILúD PHVDMXO GLQ GUHDSWD DFHOHLDúL ILJXUL�

Figura 4.24. Erori generate de utilizator

Listing 4.14 bis. Procedura de tratare a erorilor

* program demonstrativ pentru * simularea erorilor ON ERROR DO "k:\aplicatie\progs\trat_erori.prg" USE nimic IN 0 SHARED && stim ca nu exista tabela "nimic" ON ERROR 8UPHD]� SURFHGXUD SURSULX-]LV� GH WUDWDUH D HURULORU� UHGXV� OD FHD PDL VLPSO� H[SUHVLH� MESSAGEBOX("A aparut o eroare!") La lansarea programului simulare_erori prin comanda DO k:\aplicatie\

simulare_erori.prg YD DS�UHD PHVDMXO GLQ ILJXUD �����

)LJXUD ����� 0HVDMXO DILúDW GH SURFHGXUD trat_erori

Exemplul prezentat este pe cât de simplu, pe atât deLQXWLO� &� D DS�UXW R HURDUH DP IL

DIODW úL I�U� V� IL IRORVLW DFHDVW� LQVWUXF LXQH� úL WRW Q-DP IL SXWXW OXD P�VXUL� ÌQ FD]XO GH ID �

DU IL IRVW LQGLFDW V� FHUHP GH OD XWLOL]DWRU SUHFL]DUHD WDEHOHL GH GHVFKLV úL V� FRQWLQX�P

OXFUXO� 'DU QX úWLP FH DQXPH D FDX]DW HURDUHD� V� ILH FRPDQGD DO� V� ILH FRPDQGD USE ? E XWLO V� úWLP F�� vQ FD] GH XWLOL]DUH D LQVWUXF LXQLL 21 (5525 >FRPDQG�@, putem afla LQIRUPD LL VXSOLPHQWDUH GH OD XUP�WRDUHOH IXQF LL�

• ERROR() – IXUQL]HD]� QXP�UXO HURULL� 3HQWUX R OLVW� H[KDXVWLY� D QXPHUHORU GH

HURDUH� VH YD FRQVXOWD GRFXPHQWD LD DWDúDW� SURGXVXOXL 9LVXDO )R[3UR �FKLDU úL

help-ul în format electronic, la rubrica Reference →Error Messages );

Page 35: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

116 Visual FoxPro

• MESSAGE() – UHWXUQHD]� WH[WXO PHVDMXOXL GH HURDUH �GHVFULHUHD HURULL�� 3HQWUX

detalii priviQG PXOWLWXGLQHD PHVDMHORU GH HURDUH� VXQW YDODELOH REVHUYD LLOH SULYLQG

sistemul de help� 2 FDOH UDSLG� GH DIODUH D GHVFULHULL XQHL HURUL HVWH WDVWDUHD XQHL

comenzi voit eronate în fereastra de comenzi; • LINENO([1]) – RE LQH QXP�UXO OLQLHL FXUHQWH GH SURJUDm, începând cu prima

OLQLH D SURJUDPXOXL FXUHQW �VDX� GDF� VH VFULH LINENO(1) , începând cu prima linie a programului principal).

NNoo tt �� .. ÌQ QXP�U�WRDUHD OLQLLORU VXQW LQFOXVH úL OLQLLOH GH FRPHQWDULL� OLQLLOH GH FRQWLQXDUH

�FHOH FDUH XUPHD]� FDUDFWHUXOXL ÄSXQFW úL YLUJXO�´� úL OLQLLOH YLGH� • PROGRAM([nivel-program]) sau SYS(16 [, nivel-program])

UHWXUQHD]� QXPHOH SURJUDPXOXL vQ FXUV GH H[HFX LH� 'DF� QX VH VSHFLILF�

argumentul nivel-SURJUDP� VH RE LQH QXPHOH SURJUDPXOXL FXUHQW� 'DF� VH VSHFLILF�

0 sau 1, se RE LQH QXPHOH SURJUDPXOXL SULQFLSDO� LDU GDF� VH VSHFLILF� DOW� FLIU�

�SkQ� OD ����� VH UHWXUQHD]� QXPHOH SURJUDPXOXL GH OD QLYHOXO UHVSHFWLY �YH]L

figura 4.26).

*PROG0*program principal…DO prog1…

*PROG1…DO prog2…

*PROG2……

Figura 4.26. Niveluri de imbricare a programelor Visual FoxPro

Vom UHVFULH FHOH GRX� SURJUDPH FD vQ OLVWLQJXULOH ���� úL ���� ELV�

Listing 4.105. Programul de test

* simulare_erori * program demonstrativ pentru * simularea erorilor ON ERROR DO "k:\aplicatie\progs\trat_erori.prg" ; WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() USE nimic IN 0 SHARED && stim ca nu exista tabela "nimic" ON ERROR && dupa terminare, dezactiveaza tratarea erorilor

Listing 4.15 bis. Procedura de tratare a erorilor

* trat_erori * procedura de tratare a erorilor * cateva definitii de constante pentru functia MESSAGEBOX() PARAMETERS nreroare, descriere, numeprogram, nrlinie #DEFINE CRLF CHR(10)+CHR(13) && ENTER #DEFINE MBOK 0 && numai butonul OK

Page 36: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 117

#DEFINE MBOKCANCEL 1 && OK si Cancel #DEFINE MBEXCLAMATION 48 && semnul exclamarii #DEFINE TITLU "Eroare captata de utilizator" * semnalarea erorii MESSAGEBOX("Eroare nr. " +ALLT(STR(nreroare)) + ". " + ; descriere +CHR(13)+CHR(10)+ ; " in modulul " + numeprogram + ", pe linia " + ; ALLT(STR(nrlinie)) + "." , ; MBOK+MBEXCLAMATION, TITLU)

Figura 4.27� ,QGLFDUHD GHWDOLDW� D HURULL

0HVDMXO DILúDW GH VXEUXWLQD GH WUDWDUH D HURULORU HVWH GH GDWD DFHDVWD FHYD PDL FRQFOXGHQW

(figura 4.27). 2DUHFXP VLPLODU� IRORVLULL FHORU SDWUX IXQF LL GH PDL VXV HVWH XWLOL]DUHD IXQF LHL

AERROR(<nume-tablou>) , care populeaz� FX LQIRUPD LL GHWDOLDWH SULYLQG HURDUHD XQ

WDEORX FX � FRORDQH� ÌQ FD]XO DSDUL LHL XQHL HURUL ÄQDWLYH´ 9LVXDO )R[3UR� WDEORXO DUH R

VLQJXU� OLQLH �DGLF� HVWH YHFWRU�� 6HPQLILFD LLOH HOHPHQWHORU VXQW SUH]HQWDWH vQ WDEHOXO ����

Tabelul 4.4. Elementele vectorului de erori

1XP�U

FRORDQ� Descriere

1 1XPHULF� &RGXO HURULL �VLPLODU IXQF LHL ERROR( ) ). 2 &DUDFWHU� 7H[WXO PHVDMXOXL GH HURDUH �VLPLODU IXQF LHL MESSAGE( ) ).

3 NULL� 7RWXúL� GDF� HURDUHD DUH XQ SDUDPHWUX VXSOLPHQWDU

24� FRQ LQH WH[WXO

acestui parametUX �VLPLODU IXQF LHL SYS(2018) ).

4 NULL� 'DF� HURDUHD VH UHIHU� OD R WDEHO� GHVFKLV�� FRQ LQH QXP�UXO

respectivei zone de lucru .

5

NULL� 7RWXúL� GDF� HURDUHD HVWH 1539 – ÄWULJJHU IDLOHG´� FRQ LQH XQD

GLQWUH XUP�WRDUHOH YDORUL QXPHULFH� 1 –D HúXDW GHFODQúDWRUXO Insert ; 2 –D HúXDW GHFODQúDWRUXO Update ; 3 –D HúXDW GHFODQúDWRUXO Delete .

6 NULL. 7 NULL. Folosind un vector pentru preluarea erorilor, putem modifica fragmentele de cod

SUH]HQWDWH PDL VXV FD vQ OLVWLQJXULOH ���� úL ���� ELV�

24. 'H H[HPSOX� XQ QXPH GH ILúLHU� XQ QXPH GH YDULDELO� HWF�

Page 37: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

118 Visual FoxPro

Listing 4.16. Programul de test

* simulare_erori versiunea 2 * program demonstrativ pentru * simularea erorilor ON ERROR DO "k:\aplicatie\progs\trat_erori.prg" ; WITH PROGRAM(), LINENO() USE nimic IN 0 SHARED && stim ca nu exista tabela "nimic" ON ERROR && dupa terminare, dezactiveaza tratarea erorilor

Listing 4.16 bis. Procedura de tratare a erorilor

* trat_erori versiunea 2 * procedura de tratare a erorilor PARAMETERS numeprogram, nrlinie #DEFINE CRLF CHR(10)+CHR(13) && ENTER #DEFINE MBOK 0 && numai butonul OK #DEFINE MBOKCANCEL 1 && OK si Cancel #DEFINE MBEXCLAMATION 48 && semnul exclamarii #DEFINE TITLU "Eroare captata de utilizator" * preluarea erorii AERROR(vErori) && se creeaza automat vectorul „vErori” * semnalarea erorii MESSAGEBOX("Eroare nr. " +ALLT(STR(vErori(1,1))) + ". " + ; vErori(1,2) +CHR(13)+CHR(10)+ ; " in modulul " + numeprogram + ", pe linia " + ; ALLT(STR(nrlinie)) + "." , ; MBOK+MBEXCLAMATION, TITLU) $P UHFXUV WRWXúL OD R YDULDQW� FRPELQDW� AERRORS(), PROGRAM()úL LINENO() ,

GHRDUHFH YHFWRUXO GH HURUL QX SUHFL]HD]� QLPLF vQ OHJ�WXU� FX SURJUDPXO úL OLQLD OD FDUH D

DS�UXO HURDUHD� (VWH DGHY�UDW F� DFHVWH LQIRUPD LL vO SULYHVF PDL PXOW SH SURJUDPDWRU� vQ

HWDSD GH GHSDQDUH D SURJUDPXOXL� úL YRU DYHD IRDUWH SX LQ� UHOHYDQ � SHQWUX XQ XWLOL]DWRU

ILQDO� GH DFHHD QLFL QX VH UHFRPDQG� RIHULUHD ORU vQWU-R YHUVLXQH ILQDO� D DSOLFD LHL� )DSWXO F� LQIRUP�P XWLOL]DWRUXO GHVSUH R HURDUH QX-O DMXW� FkW DU GRUL DFHVWD� 7UHEXLH V�-i

RIHULP úL R FDOH GH DF LXQH� 3HQWUX DFHDVWD� FRQVLGHUkQG WRW FD]XO GH PDL VXV� YD WUHEXL V�

GLVRFLHP HURDUHD QU� � �OLSV� ILúLHU� GH DOWH HURUL úL V�-L DSOLF�P XQ WUDWDPHQW VSHFLDO� 9RP

UHGD vQ FRQWLQXDUH QXPDL YDULDQWD PRGLILFDW� D SURFHGXULL trat_erori .

/LVWLQJ ����� 9DULDQWD vPEXQ�W� LW� D WUDW�ULL HURULORU

* trat_erori versiunea 3 * procedura de tratare a erorilor *************************************************************************** PARAMETERS numeprogram, nrlinie #DEFINE CRLF CHR(10)+CHR(13) && ENTER #DEFINE MBOK 0 && numai butonul OK #DEFINE MBOKCANCEL 1 && OK si Cancel #DEFINE MBRETRYCANCEL 5 && Retry si Cancel #DEFINE MBQUESTION 32 && semnul intrebarii #DEFINE MBEXCLAMATION 48 && semnul exclamarii #DEFINE IDOK 1 && raspuns OK #DEFINE IDRETRY 4 && raspuns Retry #DEFINE IDCANCEL 2 && raspuns Cancel #DEFINE TITLU "Eroare captata de utilizator" * preluarea erorii AERROR(vErori) && se creeaza automat vectorul vErori

Page 38: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 119

* semnalarea erorii DO CASE CASE vErori(1,1)=1 && file does not exist IF IDRETRY=MESSAGEBOX("Nu gasesc fisierul " +vErori(1,3)+"." +CRLF + ; "Il cautati (Retry) sau abandonati (Cancel)?", ; MBRETRYCANCEL +MBQUESTION,TITLU) * functia GETFILE afiseaza dialogul Open (in care alegem un fisier) USE GETFILE("DBF", "Numele fisierului", "Deschide", 0, ; "Alegeti un fisier .DBF:") IN 0 SHARED ENDIF OTHERWISE && eroare netratata (inca) MESSAGEBOX("Eroare nr. " +ALLT(STR(vErori(1,1))) + ". " + ; vErori(1,2) +CHR(13)+CHR(10)+ ; " in modulul " + numeprogram + ", pe linia " + ; ALLT(STR(nrlinie)) + "." , ; MBOK+MBEXCLAMATION, TITLU) ENDCASE *************************************************************************** Într-R SURFHGXU� GH DFHVW WLS� SURJUDPDWRUXO SRDWH FRPSOHWD UDPXULOH VWUXFWXULL DO

CASE…ENDCASEFX DOWH VHFYHQ H GH FRG FDUH V� SHUPLW� WUDWDUHD HURULL vQ IXQF LH GH FRGXO

acesteia.

4.9. Depanarea programelor cu instrumentul Debugger

Visual FoxPro dispune de un instrument sofisticat pentru depanarea programelor, numit Debugger (depanator)� $FHVWD VH DSHOHD]� ILH GLQ PHQLXO Tools →Debugger , fie în mod direct, prin lansarea comenzii DEBUG� ,QGLIHUHQW FH PRG GH DSHODUH YH L IRORVL� YD WUHEXL V�

OXFUD L vQWU-un sistem de ferestre cu aspectul din figura 4.28. 9RP H[SOLFD SH UkQG UROXO ILHF�UHLD GLQWUH IHUHVWUHOH YL]LELOH vQ ILJXU� �FDUH SRW IL

DVFXQVH�DILúDWH úL FX EXWRDQHOH PDUFDWH FX FLIUH vQWUH ��� úL ������ • Trace – DILúHD]� FRGXO-VXUV� vQ FXUV GH WHVWDUH� • Watch – SUH]LQW� YDORDUHD OD XQ PRPHQW GDW D XQRU H[SUHVLL D F�URU ÄXUP�ULUH´ D

fost speFLILFDW� DQWHULRU GH F�WUH SURJUDPDWRU �SULQ VFULHUH vQ F�VX D GH WH[W Watch VDX SULQ GUDJGURS GLQ RULFH IHUHDVWU� FDUH DU FRQ LQH H[SUHVLD GRULW�);

• Call Stack – SUH]LQW� QXPHOH SURJUDPHORU H[HFXWDWH� vQ RUGLQHD DSHO�ULL

(modulul cel mai recent apelat estH SULPXO vQ OLVW��� GDF� QX VXQW PRGXOH DSHODWH�

DWXQFL vQ DFHDVW� IHUHDVWU� YRP DYHD QXPHOH XQXL VLQJXU SURJUDP� • Debug Output – DILúHD]� PHVDMHOH JHQHUDWH GH XWLOL]DUHD vQ SURJUDPH D

LQVWUXF LXQLL DEBUGOUT <expresie> � DFHDVW� LQVWUXF LXQH VH SRDWH XWLOL]D pentru a marca trecerea printr-R DQXPLW� VHF LXQH D FRGXOXL-VXUV��

• Locals – permite supravegherea valorilor variabilelor locale din procedura în curs de testare.

3HQWUX D GHPRQVWUD IRORVLUHD DFHVWXL SXWHUQLF LQVWUXPHQW� DP UHFXUV OD FHOH GRX�

programe simulare_erori , respectiv tratare_erori. Am inclus în codurile--VXUV� DOH SURJUDPHORU OLQLD DEBUGOUT „Lansare program „ + PROGRAM() ca SULP� OLQLH �FD D GRXD OLQLH vQWU-R SURFHGXU�� GHRDUHFH SULPD WUHEXLH V� ILH QHDS�UDW

GHFODUD LD PARAMETERS�� SHQWUX D XUP�ri în fereastra Debug Output FkQG VH DSHOHD]�

Page 39: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

120 Visual FoxPro

ILHFDUH PRGXO� $SRL DP vQF�UFDW ILúLHUXO simulare_erori.prg în Debugger , prin click pe butonul marcat cu (1).

/DQVDUHD vQ H[HFX LH D SURJUDPXOXL vQF�UFDW DUH ORF SULQ FOLFN SH EXWRQXO PDUFDW FX ����

iar oprirea înainte de final, prin click pe butonul marcat cu (3) (vezi figura 4.28). 'XS� FXP VH REVHUY�� vQ PRPHQWXO H[HFX LHL IHUHVWUHOH GHSDQDWRUXOXL VXQW IRDUWH

animate: • în fereastra Debug Output s-DX DILúDW FHOH GRX� PHVDMH GH OD vQFHSXWXO ILHF�UXL

modul de program;

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

Figura 4.28. Ferestrele utilitarului Debugger (modul inactiv)

• în fereastra Call Stack R V�JHDW� LQGLF� PRGXOXO vQ FXUV GH H[HFX LH� • în fereastra Locals VXQW DILúDWH YDULDELOHOH ORFDOH GLQ PRGXOXO FXUHQW �YHFWRUXO

verori a fost expandat pentru a consulta valorile elementelor sale);

Page 40: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 121

• fereastra Watch QX FRQ LQH GHRFDPGDW� QLPLF� GHRDUHFH QX V-a optat pentru XUP�ULUHD QLFL XQHL YDULDELOH�

• pe ecran s-D DILúDW R FDVHW� GH PHVDM FDUH SURYLQH GLQ SURFHGXUD GH WUDWDUH D HURULORU� • în fereastra Trace VH DILúHD]� FRGXO-VXUV� DO PRGXOXOXL FXUHQW� LDU XQ YkUI GH

V�JHDW� LQGLF� OLQLD vQ FXUV GH H[HFX LH�

)LJXUD ����� 3URJUDP vQ FXUV GH H[HFX LH vQ XWLOLWDUXO Debugger

ÌQ DQXPLWH FD]XUL VH GRUHúWH R H[HFX LH SH SRU LXQL D SURJUDPXOXL �QXPDL R SURFHGXU�

VDX QXPDL R IXQF LH�� 3HQWUX D IDFH DFHDVWD� H[LVW� XUP�WRDUHOH SRVLELOLW� L �YH]L

figura 4.28):

Page 41: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

122 Visual FoxPro

• Step into (4) – UHDOL]HD]� H[HFX LD SDV FX SDV D XQHL IXQF LL VDX SURFHGXUL – la ILHFDUH DS�VDUH SH EXWRQXO ��� VH H[HFXW� FkWH R LQVWUXF LXQH;

• Step over (5) –VDUH SHVWH IXQF LD �SURFHGXUD� FXUHQW�� • Step out (6) –UHDOL]HD]� LHúLUHD GLQ IXQF LD �SURFHGXUD� FXUHQW�� • Run to cursor (7) – H[HFXW� SURJUDPXO SkQ� OD SR]L LD FXUHQW� D FXUVRUXOXL

�FDUH VH VWDELOHúWH H[HFXWkQG FOLFN vQ IHUHDVWUD Trace , SH OLQLD GRULW��� OObb sseerr vv aa ii ee: YLWH]D GH H[HFX LH D SURJUDPXOXL SRDWH IL LQIOXHQ DW� GH YDULDELOD GH

mediu _THROTTLE� 9DORULL DFHVWHL YDULDELOH vL FRUHVSXQGH R SDX]� vQWUH GRX� OLQLL GH

FRG VXFFHVLYH� YDULLQG GH OD � �I�U� SDX]�� OD FLUFD ��� VHFXQGH� 9DORarea acestei variabile se poate modifica din fereastra de comenzi, de exemplu _THROTTLE=0.5. 8QHRUL H QHYRLH V� VXVSHQG�P H[HFX LD SURJUDPXOXL vQWU-XQ DQXPLW SXQFW úL V�

YHULILF�P DQXPLWH FRQGL LL RUL YDORDUHD DQXPLWRU H[SUHVLL� ÌQWU-R IRUP� UXGLPHQWDU�� aceasta VH SRDWH IDFH SULQ SODVDUHD XQHL LQVWUXF LXQL SUSPEND în punctul dorit din codul-VXUV�� ÌQDWDUH FRQGL LL� H[HFX LD SURJUDPXOXL VH RSUHúWH úL GDF� HO HVWH H[HFXWDW vQ PRG QRUPDO �QX

QHDS�UDW vQ GHSDQDWRU�� 'XS� YHULILFDUHD FRQGL LLORU UHVSHFWLYH� Srogramul poate fi reluat prin comanda RESUME�vQ IHUHDVWUD GH FRPHQ]L� GDF� SURJUDPXO VH H[HFXW� vQ PRG GLUHFW�

RUL SULQ EXWRQXO ���� GDF� H[HFX LD DUH ORF vQ GHSDQDWRU� 2SULUHD H[HFX LHL DUH ORF SULQ

comada CANCEL (în fereastra de comenzi) sau prin butonuO ���� GDF� H[HFX LD DUH ORF vQ

depanator (vezi figura 4.28).

Figura 4.30. Dialogul Breakpoints

Page 42: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 123

2 PRGDOLWDWH GH VXVSHQGDUH D H[HFX LHL PXOW PDL HOHJDQW� HVWH VWDELOLUHD GH SXQFWH GH

oprire (breakpoints) în codul-VXUV�� SULQ SR]L LRQDUHD FXUVRUXOXL vQ IHreastra Trace , pe OLQLD GRULW� úL SULQ FOLFN SH EXWRQXO Toggle Breakpoint (marcat cu [13] în figura 4.28). ÌQ PDUJLQHD VWkQJ� D IHUHVWUHL Trace YD DS�UHD XQ SXQFW URúX� vQ GUHSWXO OLQLHL UHVSHFWLYH�

$FHODúL OXFUX VH SRDWH IDFH úL SULQ GXEOX-click în chiar PDUJLQHD VWkQJ� D IHUHVWUHL Trace , OD OLQLD GRULW�� 2 DS�VDUH UHSHWDW� D EXWRQXOXL ���� DUH FD HIHFW DQXODUHD SXQFWXOXL GH RSULUH�

LDU EXWRQXO PDUFDW FX ���� SHUPLWH DQXODUHD WXWXURU SXQFWHORU GH RSULUH GLQ SURJUDP� 'DF�

VH GRUHúWH VSHFLILFDUHD XQRU SXQFWH GH RSULUH VRILVWLFDWH �FDUH V� LQWUH vQ DF LXQH QXPDL OD

vQWUXQLUHD XQRU FRQGL LL >Break if… , Break when… ] ori la a n-a parcurgere, de exemplu), se poate folosi butonul Breakpoint Dialog ����� D F�UXL DS�VDUH DILúHD]� R

IHUHDVWU� SH FDUH R SXWHP YHGHD vQ figura 4.30. (YDOXDUHD SHUIRUPDQ HL H[HFX LHL DSOLFD LLORU 9LVXDO )R[3UR VH SRDWH IDFH FX DMXWRUXO

XQHL DOWH RS LXQL DFFHVLELOH GLQ GHSDQDWRU� DQXPH Toggle Coverage Logging (butonul 16 din figura 4.28). Acest buton este de tip „toggle” (comutator) – un click DFWLYHD]� RS LXQHD� DOW FOLFN R GH]DFWLYHD]�� /D DFWLYDUHD VD �QXPDL GDF� vQ Debugger este vQF�UFDW GHMD XQ SURJUDP� DSDUH SH HFUDQ IHUHDVWUD GLQ ILJXUD ����� VROLFLWkQGX-se un nume GH ILúLHU�

)LJXUD ����� 6WDELOLUHD RS LXQLL Coverage Logging

ExtensLD ILúLHUXOXL SULQFLSDO HVWH LPSOLFLW .log �MXUQDO� úL� GH IDSW� DFHVWD HVWH úL UROXO

RS LXQLL� GH D MXUQDOL]D H[HFX LD SURJUDPXOXL� $VWIHO� GDF� vQ IHUHDVWUD GLQ ILJXUD ���� VH

H[HFXW� FOLFN SH EXWRQXO OK LDU DSRL VH ODQVHD]� SURJUDPXO� VH YD RE LQH ILúLHrul simulare_erori.log � FDUH SRDWH IL FRQVXOWDW XOWHULRU� GH SLOG� FX SURJUDPXO

Notepad . AA tt eenn ii ee!! 3HQWUX GHVFKLGHUHD ILúLHUXOXL .log cu Notepad HVWH QHFHVDU FD DFHVWD V�

ILH vQFKLV GH 9LVXDO )R[3UR SULQ GH]DFWLYDUHD RS LXQLL Coverage Logging �YHULILFD L FD EXWRQXO V� QX ILH DS�VDW�� $FWLYDUHD HVWH HFKLYDOHQW� FX H[HFX LD FRPHQ]LL SET COVERAGE TO <nume-

ILúLHU!, dezactivarea – cu comanda SET COVERAGE TO.

Page 43: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

124 Visual FoxPro

,DW� FXP DUDW� FRQ LQXWXO ILúLHUXOXL-jurnal:

)LJXUD ����� -XUQDOXO H[HFX LHL XQXL SURJUDP

)LúLHUXO .log are atâtea rânduri câte linii de program s-au executat (incluzând modulele DSHODWH�� (OHPHQWHOH GH SH R OLQLH D DFHVWXL ILúLHU DX XUP�WRDUHOH VHPQLILFD LL�

• GXUDWD GH H[HFX LH� vQ VHFXQGH� • QXPHOH FODVHL vQ FDUH VH DIO� OLQLD GH FRG �GDF� H FD]XO�� • numelH PRGXOXOXL vQ FDUH VH DIO� OLQLD GH FRG� • QXP�UXO OLQLHL GH FRG �OLQLLOH FDUH OLSVHVF VXQW OLQLL DOEH VDX FRPHQWDULL�� • QXPHOH úL FDOHD FRPSOHW� D ILúLHUXOXL FRPSLODW GLQ FDUH IDFH SDUWH OLQLD GH FRG� • RUGLQHD DSHO�ULL PRGXOXOXL UHVSHFWLY �Call Stack ). Execu LD OLQLHL �� GLQ SURFHGXUD trat_erori a durat mai mult de 18 secunde! E

QRUPDO " 'D� GHRDUHFH DFHD OLQLH FRQ LQH IXQF LD GETFILE() , FDUH DILúHD]� XQ GLDORJ GH

tip Open úL DúWHDSW� SkQ� FH XWLOL]DWRUXO VHOHFWHD]� XQ ILúLHU� ùL VH SDUH F� XWLOL]DWRUXO O-a selectat în 18,65 secunde…

2 DQDOL]� PDL HOHJDQW� GHFkW VLPSOD FLWLUH FX Notepad R UHDOL]HD]� DFFHVRULXO

Coverage Profiler , apelabil din meniul Tools al ferestrei principale Visual FoxPro� ÌQF�UFDUHD XQXL ILúLHU �log se face prin File →Open. În bara de titlu (vezi figura ����� VH REVHUY� ILúLHUXO �log creat mai înainte.

Figura 4.33. Instrumentul Coverage Profiler în modul Profile (1)

Page 44: Capitolul 4 Programarea în Visual FoxPro · PDF file84 visual foxpro $údgdu vq surjudpduhd vwuxfwxudw dyhp xup wrduhoh srvlelolw l • lqvwuxf lxqloh vh h[hfxw vhfyhq ldo vq ruglqhd

Programarea în Visual FoxPro 125

6H SRDWH RSWD SHQWUX YL]XDOL]DUHD VLPSO� D ILúLHUXOXL �Coverage Mode ) sau pentru DILúDUHD XQRU LQGLFDWRUL GH SHUIRUPDQ � �Profile Mode �� $FHúWL LQGLFDWRUL VXQW PDL

FRQFOXGHQ L GDF� SURJUDPXO VH H[HFXW� GH PDL PXOWH RUL� 3HQWUX DFHDVWD� VH vQFKLGH ILúLHUXO

.log �SUHIHUDELO úL LQVWUXPHQWXO Coverage Profiler ) úL VH UHYLQH OD Debugger ; în dialogul prezentaW vQ ILJXUD ���� VH DOHJH DFHODúL ILúLHU .log � VH VWDELOHúWH RS LXQHD

Append �DGDXJ� OD SUHFHGHQWXO MXUQDO QRLOH UH]XOWDWH� úL VH UHSHW� H[HFX LD SURJUDPXOXL�

$SRL VH UHODQVHD]� DFFHVRULXO Coverage Profiler .

Figura 4.34. Instrumentul Coverage Profiler în modul Profile (2)

6H REVHUY� GH DFHDVW� GDW� F�� • VH DUDW� QXP�UXO GH H[HFX LL DOH SURJUDPXOXL �� +LWV�� • YDORULOH PHGLL DOH WLPSXOXL GH H[HFX LH �vQFDGUDWH vQ GUHSWXQJKLXUL SH FHOH GRX�

ILJXUL� GLIHU�� VHPQ F� OD ILHFDUH H[HFX LH s-DX vQUHJLVWUDW DO L WLPSL� &DX]HOH SRW IL

PXOWLSOH� GH OD GLVSRQLELOLWDWHD VLVWHPXOXL GH FDOFXO SkQ� OD WLPSXO GH UHDF LH DO

XWLOL]DWRUXOXL OD vQWUHE�UL SUHFXP GETFILE() ori MESSAGEBOX(), ca în H[HPSOXO GH ID �� 3H GH DOW� SDUWH� LQVWUXPHQWXO Coverage Profiler poate DMXWD SURJUDPDWRUXO V� WHVWH]H GLIHULWH YDULDQWH GH FRGLILFDUH vQDLQWHD RIHULULL

versiunii finale a produsului-SURJUDP �ÄDMXVWkQG´ VHFYHQ HOH GH SURJUDP PDUL

consumatoare de timp).

ÌQ ILQH� EXWRQXO ���� GLQ ILJXUD ���� SUH]LQW� vQF� R RS LXQH IRDUWH LQWHUHVDQW�� Toggle Event Logging � FkW VH SRDWH GH XWLO� SHQWUX GHSDQDUHD IRUPXODUHORU� $FHDVW� RS LXQH

SHUPLWH MXUQDOL]DUHD DSDUL LHL HYHQLPHQWHORU vQ IHUHDVWUD Debug Output sau scrierea lor într-XQ ILúLHU .log .