capitolul 14 - · pdf filev pdl lqwurgxfhp r gdw qxphoh fodvhl vq ]rqd gh ghvfulhuh...

31
Capitolul 14 $SOLFDLL9LVXDO)R[3URSH:HE Internet Server Application Programing Interface mp real la baze de date. Vorbind despre acces real la date se poate conecta (ORACLE, SQL-SERVER). – Visual FoxPro este constitu FOXISAPI.dll componentele COM (Common Object Model FoxISAPI este dedicat serverului de Internet MIIS (Microsoft Internet Information Server). 14.1. )R[,6$3,œL6HUYHUH&20IXQGDPHQWXODSOLFDLLORU VFP pe Web conector între browserul- HTML. 14.1.1. foxisapi.dll foxisapi.ini, -ul, pe calea: …\MSDN98\98VSa\1033\SAMPLES\VFP98\Servers\Foxisapi sau pe site-ul Microsoft. 62 : Extensie Web de tip Server Side Foxisapi.dll -end-ul serverului de Internet MIIS (Microsoft Internet Information Server -un singur apel (pentru fi - 62. Rick Strahl, Building applications with FoxISAPI, http://www.west-wind.com/ .

Upload: hakien

Post on 07-Feb-2018

215 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

Capitolul 14

$SOLFD LL�9LVXDO�)R[3UR�SH�:HE

3RDWH SHQWUX PXO L SDUH LQWULJDQW� GDU 9LVXDO )R[3UR ��� RIHU� R H[WHQVLH ,6$3, �Internet Server Application Programing Interface� VXILFLHQW GH SXWHUQLF� SHQWUX GH]YROWDUHD GH

DSOLFD LL SH ,QWHUQHW FX DFFHV vQ WLmp real la baze de date. Vorbind despre acces real la date QX QH UHIHULP GRDU OD WDEHOH 9LVXDO )R[3UR� FL úL OD DOWH WLSXUL GH ED]H GH GDWH OD FDUH DFHVWD

se poate conecta (ORACLE, SQL-SERVER). 7HPHOLD XQHL DSOLFD LL ,QWHUQHW – Visual FoxPro este constituLW� GLQ XWLOLWDUXO

FOXISAPI . dll úL componentele COM (Common Object Model�� $FHVWHD GLQ XUP�

VXQW ELEOLRWHFL GH FODVH SXEOLFH� FUHDWH vQ 9LVXDO )R[3UR� FH SRW IL XWLOL]DWH GH DOWH DSOLFD LL� FoxISAPI este dedicat serverului de Internet MIIS (Microsoft Internet Information Server).

14.1. �)R[,6$3,�úL�6HUYHUH�&20�–�IXQGDPHQWXO�DSOLFD LLORU� VFP pe Web

)R[,6$3, UHSUH]LQW� R ELEOLRWHF� GH IXQF LL �UHDOL]DW� GH 0LFURVRIW� VFULV� vQ &��� FX URO

GH DSOLFD LH conector între browserul-FOLHQW FDUH WULPLWH R FHUHUH úL VHUYHUXO &20 F�UXLD vL

HVWH DGUHVDW�� $FHVWD GLQ XUP� YD HIHFWXD GLYHUVH SUHOXFU�UL �HYHQWXDO FX LPSOLFD LL DVXSUD

XQRU FROHF LL GH GDWH� úL YD WULPLWH XQ U�VSXQV VXE IRUP� GH WH[W HTML.

14.1.1. )R[,6$3,� 1R LXQH úL IXQF LRQDOLWDWH

1XFOHXO )R[,6$3, HVWH DOF�WXLW GLQ GRX� ILúLHUH� foxisapi.dll úL foxisapi.ini , IXUQL]DWH R GDW� FX SDFKHWXO 9LVXDO 6WXGLR� PDL SUHFLV FX 06'1 /LEUDU\� $FHVWH ILúLHUH SRW

IL UHJ�VLWH vQ GLUHFWRUXO GH ED]� XQGH D L LQVWDODW 06'1-ul, pe calea: …\MSDN98\98VSa\1033\SAMPLES\VFP98\Servers\Foxisapi sau pe site-ul Microsoft.

&DUDFWHULVWLFLOH HVHQ LDOH FH GHILQHVF )R[,6$3, VXQW62:

• Extensie Web de tip Server Side Foxisapi.dll VH H[HFXW� vQ H[FOXVLYLWDWH SH VHUYHU� FD DSOLFD LH ,6$3, vQ EDFN-end-ul serverului de Internet MIIS (Microsoft Internet Information Server�� $úDGDU� FOLHQ LL QX YRU

DYHD QHYRLH GH ELEOLRWHFLOH GH ED]� DOH 9LVXDO )R[3UR SHQWUX D UXOD DSOLFD LD� $YDQWDMHOH

PDMRUH DO DFHVWXL WLS GH DSOLFD LH �6HUYHU 6LGH� SULYHVF� SH GH R SDUWH� GLVSRQLELOLWDWHD

LPHGLDW� D DFWXDOL]�ULORU F�WUH WR L FOLHQ LL� LDU SH GH DOW� SDUWH� VHFXULWDWHD VSRULW� D GDWHORU� • ,QWHUID � GLUHFW�� GH PDUH SHUIRUPDQ �� FX DSOLFD LLOH VFULVH vQ 9LVXDO )R[3UR

(ILFLHQ D VSRULW� FRQVW� vQ IDSWXO F� )R[,6$3, VH FRQHFWHD]� OD VHUYHUXO :HE SULQWU-un singur apel (pentru fiHFDUH FHUHUH D FOLHQWXOXL� FH DFFHVHD]� vQ PRG GLUHFW FRPSRQHQWD &20

úL XWLOL]HD]� UH]XOWDWXO DFHVWHLD SULQ vQJOREDUHD VD vQWU-R SDJLQ� :HE�

62. Rick Strahl, Building applications with FoxISAPI, http://www.west-wind.com/.

Page 2: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

478 Visual FoxPro

• 8WLOL]HD]� ,QWHUQHW 6HUYHU $3, �,6$3,� ,6$3, HVWH R H[WHQVLH H[WUHP GH SHUIRUPDQW�� GH WLS PXOWLILU �multi-threaded�� FH OXFUHD]�

FD LQWHUID � OD QLYHO GH VLVWHP GH RSHUDUH� • 8WLOL]HD]� &20 SHQWUX WUDQVIHUXO PHVDMHORU 3H OkQJ� IDSWXO F� IXUQL]HD]� R LQWHUID � low-level F�WUH VHUYHUXO ,,6 �Internet

Information Server�� ,6$3, XWLOL]HD]� &RPPRQ 2EMHFW 0RGHO SHQWUX D FRPXQLca cu DSOLFD LD 9LVXDO )R[3UR� 3H GH DOW� SDUWH� DSOLFD LD 9)3 HVWH FRPSLODW� FD RELHFW &20 úL VH

FRPSRUW� FD VHUYHU SHQWUX FOLHQWXO )R[,6$3,� ÌQ ILJXUD ���� REVHUY�P DUKLWHFWXUD XQHL DSOLFD LL :HE vQ 9LVXDO )R[3UR�

Figura 14.1. FoxISAPI – LQWHUID � vQWUH DSOLFD LD 9LVXDO )R[3UR úL VHUYHUXO :HE

7DEHOXO GH PDL MRV SUH]LQW� FRPSDUDWLY FHOH GRX� WLSXUL GH ELEOLRWHFL GH IXQF LL FH

FRQWULEXLH OD FUHDUHD XQHL DSOLFD LL 9LVXDO )R[3UR SH :HE�

foxisapi.dll Serverul COM Visual FoxPro • Win32 DLL scris în C++ • 6XSRUW� H[HFX LL PXOWLILU �multi-

threaded) • $SOLFD LH GH WLS FRQHFWRU

• Client COM

• COM EXE sau DLL • Monofir (single-threaded – un proces

QX SRDWH H[HFXWD PDL PXOWH DF LXQL

simultan) • $SOLFD LH FH DFFHVHD]� ED]H GH GDWH

• Server COM

SarcinaGH ED]� D H[WHQVLHL )R[,6$3, HVWH DFHHD GH D FUHD R LQVWDQ � D FRPSRQHQWHL

&20 9LVXDO )R[3UR úL GH D LQYRFD XQD GLQWUH PHWRGHOH DFHVWHLD� ,QGLIHUHQW GDF� PHWRGD

UHVSHFWLY� H[HFXW� VDX QX DQXPLWH SUHOXFU�UL� HD WUHEXLH REOLJDWRULX V� UHWXUQH]H XQ WH[W vQ

format HTMLFDUH YD IL WUDQVPLV vQDSRL� GH F�WUH )R[,6$3,� VHUYHUXOXL :HE� $VWIHO� vQ PRPHQWXO vQ FDUH FOLHQWXO WULPLWH R FHUHUH GH DFFHV VSUH R FRPSRQHQW� &20�

VHUYHUXO :HE FHUH GH IDSW vQF�UFDUHD PDL vQWkL D ELEOLRWHFLL foxisapi.dll úL DELD DSRL�

prin intermediul acesteia, are loc invocarea metodei solicitate. Mecanismul de care vorbim VH GHFODQúHD]� SULQWU-R OHJ�WXU� �link) URL de genul:

http://NumeServerWeb/scripts/foxisDSL�GOO�1XPH6HUYHU9)3�&ODV��0HWRG� 3ULQ DFHDVWD� VHUYHUXO :HE HVWH GHWHUPLQDW V� vQFDUFH )R[,6$3, vQ VSD LXO V�X GH

PHPRULH� 3HQWUX F� )R[,6$3, HVWH :LQ�� '//� VH vQFDUF� R VLQJXU� GDW� úL SHUVLVW� SH

WRDW� GXUDWD H[HFX LHL SURFHVXOXL DSHODQW� )LLQG GH WLp multifir, el poate prelua mai multe FHUHUL VLPXOWDQ �GDF� �� FOLHQ L DFFHVHD]� DFHODúL 85/ FDUH VH H[HFXW�� V� ]LFHP� vQ ��

VHFXQGH� YRP DYHD �� SURFHVH FDUH vQFHDUF� V� DFFHVH]H DFHODúL RELHFW &20�� 'LQ

QHIHULFLUH� R DSOLFD LH 9LVXDO )R[3UR �GHFL úL XQ server COM) este monofir (single-

Page 3: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 479

threaded� úL QX SRDWH UH]ROYD VLPXOWDQ FHUHUL PXOWLSOH� 6-DU S�UHD� DVWIHO� F�

foxisapi.dll DU WUHEXL V� LQ� HYLGHQ D FHUHULORU UHVSHFWLYH úL V� OH WULPLW� VHFYHQ LDO

VHUYHUXOXL &20� 7RWXúL� QX HVWH GHORF DúD� )R[,6$3, SRDWH FUHD LQVWDQ H PXOWLSOH DOH

DFHOXLDúL VHUYHU &20� 9RP UHYHQL DVXSUD DFHVWXL DVSHFW VSUH VIkUúLWXO DFHVWXL FDSLWRO� 'H DVHPHQHD� )R[,6$3, HVWH VXILFLHQW GH ELQH FRQVWUXLW SHQWUX D vQF�UFD �vQ XUPD XQHL

FHUHUL GH DFFHV� R VLQJXU� GDW� FRPSRQHQWD VHUYHU vQ PHPRULD LQWHUQ�� SHQWUX FD DSRL V�

UH]ROYH XUP�WRDUHOH FHUHUL SULQ UHIHULQ � OD DFHVWD� 3UDFWLF� SULPD FHUHUH D XQXL FOLHQW YD IL

UH]ROYDW� PDL vQFHW� GDWRULW� vQF�UF�ULL vQWUHJLORU ELEOLRWHFL GH IXQF LL 9)3 QHFHVDUH

H[HFX LHL DSOLFD LHL &20� vQ WLPS FH XUP�WRDUHOH YRU IL SURFHVDWH H[WUHP GH UDSLG� SHQWUX F�

YRU DFFHVD VHUYHUXO JDWD vQF�UFDW vQ PHPRULH� Configurarea FoxISAPI FRQVW�� vQ SULP� ID]�� vQ FRSLHUHD ILúLHUHORU foxisapi.dll

úL D ILúLHUXOXL GH LQL LDOL]DUH FRUHVSXQ]�WRU foxisapi.ini într-un director accesibil serverului Web, de obicei: C:\Inetpub\Scripts .

14.1.2. Componente COM în Visual FoxPro

Componentele COM (Common Object Model� UHSUH]LQW� GH IDSW ELEOLRWHFL GH FODVH FH

vQFDSVXOHD]� VHFYHQ H GH FRG FDUH SRW UH]ROYD SUREOHPH FRPXQH PDL PXOWRU WLSXUL GH

DSOLFD LL� &ODVHOH UHVSHFWLYH VXQW GHFODUDWH SXEOLFH úL VH vQUHJLVWUHD]� vQ UHJLúWULL :LQGRZV�

GHYHQLQG DFFHVLELOH RULF�UHL DSOLFD LL FDUH VXSRUW� &20� $FFHVXO VH UHDOL]HD]� SULQ

LQWHUPHGLXO XQRU SDUDPHWUL SH ED]D F�URUD DSOLFD LD H[HFXW� GLYHUVH SUHOXFU�UL úL UHWXUQHD]�

un rezultat intrepretat de procesul apelant. Practic, în Visual FoxPro construim un server COM prin compilarea unui proiect ce

cuprinde clase (în general de tip CUSTOM) declarate OLE Public . Doar acestor clase le va fi asociat un identificator unic global (GUID) în Windows Registry úL YRU IL

DFFHVLELOH DOWRU DSOLFD LL �FD GH H[HPSOX )R[,6$3,�� 3HQWUX H[HPSOLILFDUH� YRP LQL LD SURLHFWXO Test_COM cu un singur program, prin care

VH GHILQHúWH R FODV� FX QXPHOH ComTest FH FRQ LQH PHWRGD PaginaStart (listingul ������ )XQF LRQDOLWDWHD DFHVWHLD FRQVW� vQ UHWXUQDUHD XQXL WH[W HTMLFDUH V� FXSULQG� GDWD úL

RUD OD FDUH D IRVW JHQHUDW� SUHFXP úL YDORULOH FXUHQWH DOH SDUDPHWULORU �GHVSUH DFHúWLD YRP

discuta imediat).

/LVWLQJ ����� 6HFYHQ � GH FRG SHQWUX Frearea unei componente COM (clasacom1 )

�'(),1( &5 &+5�����&+5���� VDOW OD UkQGXO XUP�WRU �SHQWUX +70/� DEFINE CLASS clasacom1 AS Custom OLEPUBLIC FUNCTION PaginaStart LPARAMETER pVariabile, pIniFile, pReleaseFlag LOCAL text_html *** HTTP header - necesar unor versiuni mai vechi de browsere Text_html="HTTP/1.0 200 OK"+CR+; "Content-type: text/html"+CR+CR *** construim textul in format HTML text_html=text_html+; "<HTML><BODY>"+CR+; "<H1>Pagina TEST</H1><HR>"+CR+; "Acesta pagina a fost generata de Visual FoxPro astazi: "; +DTOC(DATE())+" la ora :"+TIME()+ "<HR>"+CR+;

Page 4: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

480 Visual FoxPro

+"Variabile : "+pVariabile+" /Fis. initializare:"+pIniFile+" /flag: "+str(pReleaseFlag)+CR+; "</HTML></BODY>" RETURN text_html ENDDEFINE

ÌQ FD]XO vQ FDUH OXFU�P vQ PRG DVLVWDW� SHQWUX D RE LQH R FODV� SXEOLF� DSHO�P PHQLXO

Class → Class Info în Class Designer úL ELI�P RS LXQHD FRUHVSXQ]�WRDUH

(figura 14.2).

6HOHF LH SHQWUX D RE LQH R

FRPSRQHQW� &20

Obligatoriu numele clasei SHQWUX UHXúLWD FRPSLO�ULL úL

vQUHJLVWU�ULL VHUYHU-ului

)LJXUD ����� &RQVWUXLUHD YL]XDO� D XQHL FODVH OLE Public

'XS� FXP REVHUY�P úL vQ ILJXU�� vQ FD]XO FODVHORU FUHDWH vQ PRG DVLVWDW� HVWH REOLJDWRULX

V� PDL LQWURGXFHP R GDW� QXPHOH FODVHL vQ ]RQD GH GHVFULHUH� Description . Conform WHVWHORU HIHFWXDWH� GDF� QX SURFHG�P DVWIHO� RE LQHP R FRPSRQHQW� F�UHLD� GHúL L Ve atribuie un identificator unic în Windows Registry � DFHVWD QX VH OHDJ� GH QXPHOH FRPSRQHQWHL�

ILLQG vQ ILQDO LQXWLOL]DELO�� AA tt eenn ii ee!! (VWH H[WUHP GH LPSRUWDQW V� vQ HOHJHP F� R DVHPHQHD FODV� �GHILQLW� SHQWUX D

UXOD FD DSOLFD LH :HE� FRQ LQH vQ JHQHUDO GRX� FDWHJRULL GH PHWRGH� • Metode ce vor fi accesate de serverul InternetvQ XUPD XQRU FHUHUL DOH FOLHQ LORU�

Aceste metode sunt apelate de fapt prin intermediul FoxISAPI, care le trimite în mod implicit trei parametri� &D DWDUH� RULFH PHWRG� GH DFHVW WLS YD WUHEXL V�-L SRDW�SUHOXD� DOWPLQWHUL ULVF�P V� RE LQHP R HURDUH FH YD GXFH OD EORFDUHD VHUYHUXOXL�

• 0HWRGH FH H[HFXW� GLYHUVH SUHOXFU�UL LQWHUQH, apelate exclusiv de alte metode DOH FODVHL UHVSHFWLYH� $FHVWHD YRU DYHD XQ QXP�U YDULDELO GH SDUDPHWUL �VDu nu vor DYHD GHORF�� vQ IXQF LH GH QHFHVLW� L�

6HPQLILFD LD SDUDPHWULORU vQ FD]XO PHWRGHORU SXEOLFH �FRQIRUP QXPHORU GDWH vQ listingul

����� HVWH XUP�WRDUHD� • pVariabile – XQ úLU GH FDUDFWHUH FH FXSULQGH YDULDELOHOH �SDUDPHWULL DFWXDOL�

furnizate de clieQWXO :HE SHQWUX SUHOXFU�UL VSHFLILFH� 2 PHWRG� SRDWH IL DSHODW�

vQV� úL I�U� SDUDPHWUL DFWXDOL� FD] vQ FDUH )R[,6$3, WUDQVPLWH R YDORDUH YLG�� (VWH

VLQJXUXO SDUDPHWUX FH DVLJXU� LQWHUDF LXQHD GLUHFW� FX XWLOL]DWRULL DSOLFD LHL� • pIniFile – QXPHOH XQXL ILúLHr .ini creat de foxisapi.dll OD LQVWDQ LHUHD

XQXL VHUYHU &20 9LVXDO )R[3UR� )LHFDUH DVHPHQHD ILúLHU GH LQL LDOL]DUH HVWH FUHDW

Page 5: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 481

în directorul Scripts �DFROR XQGH VH DIO� foxisapi.dll úL

foxisapi.ini � úL DUH XQ QXPH IRUPDOL]DW� GH JHQXO� FOXnn.ini (exemplu: FOX55.ini �� $FHVWD YD FRQ LQH WRDWH YDULDELOHOH VHUYHUXOXL� DOH EURZVHUXOXL úL GH

VLVWHP� FX SRVLELOLWDWHD GH D H[WUDJH LQIRUPD LL GLYHUVH �H[HPSOX� DGUHVD ,3 D

EURZVHUXOXL FH DFFHVHD]� PHWRGD� SULQ LQWHUPHGLXO IXQF LHL $3,

GetPrivateProfileString() ; • pReleaseFlag – parametru de tip numeric WUDQVPLV SULQ UHIHULQ �

63 de foxisapi.dll , SULQ FDUH VH VSHFLILF� GDF� LQVWDQ D FRPSRQHQWHL &20 SHUVLVW�

�U�PkQH UH]LGHQW� vQ PHPRULH� GXS� H[HFX LD PHWRGHL DSHODWH� ,QVWDQ D SHUVLVW�

GXS� H[HFX LD PHWRGHL QXPDL GDF� pReleaseFlag are valoarea 0 (zero). În mod LPSOLFLW� SDUDPHWUXO HVWH WUDQVPLV FX R YDORDUH JHQHUDW� GH )R[,6$3, PDL PDUH

GHFkW �� 3HQWUX SHUIRUPDQ H RSWLPH� vQ PXOWH FD]XUL DFHVW SDUDPHWUX WUHEXLH VHWDW

SH � vQ FDGUXO DSOLFD LHL :HE� DOWIHO ILHFDUH QRX� FHUHUH de acces va necesita UHvQF�UFDUHD VHUYHUXOXL vQ PHPRULH úL GHFL vQWkU]LHUHD U�VSXQVXOXL DFHVWXLD�

8Q DOW DVSHFW GH PD[LP� LPSRUWDQ � FH WUHEXLH DYXW vQ YHGHUH OD FUHDUHD DSOLFD LHL :HE

VH UHIHU� OD IDSWXO F� DFHDVWD QX WUHEXLH V� JHQHUH]H VXE QLFL XQ PRWLY YUHR IRUP� GH GLDORJ

cu utilizatorul de tip GUI (Graphical User Interface). Cu alte cuvinte, singura modalitate GH U�VSXQV D XQHL PHWRGH FH YD IL DSHODW� GH VHUYHUXO :HE YD IL vQWRWGHDXQD XQ WH[W vQ

format HTML� 2ULFDUH GLQ XUP�WRDUHOH VLWXD LL YD GXFH Oa blocarea componentei COM:

• XWLOL]DUHD IXQF LHL MESSAGEBOX()sau a comenzii WAIT WINDOW; • încercarea de a deschide un formular (DO FORM); • HURDUH QHWUDWDW� FDUH YD vQFHUFD V� JHQHUH]H XQ PHVDM GH WLS *8, VDX R IHUHDVWU� GH

dialog de tip File Open .

2 GDW� O�PXULWH DFHVWH DVSHFWH� SDVXO XUP�WRU FRQVW� vQ FRPSLODUHD VHUYHUXOXL� 'XS�

FXP REVHUY�P úL vQ ILJXUD ����� vQ Project Manager vom utiliza butonul Build úL

RS LXQHD Win32 executable . Numele proiectului este Test_com , iar programul Test FRQ LQH VHFYHQ D GH FRG pentru definirea componentei clasacom1 (listingul 14.1). &D XUPDUH� YRP RE LQH XQ ILúLHU H[HFXWDELO� �HYHQWXDO� FX DFHODúL QXPH FD úL DO SURLHFWXOXL�

Toate clasele publice definite în proiect vor fi înregistrate în Windows Registry , devenind astfel componHQWH &20 FH YRU IL DFFHVLELOH RULF�UHL DOWH DSOLFD LL FDUH VXSRUW�

apeluri COM. AA tt eenn ii ee!! 'DF� QX D L LQVWDODW úL 9LVXDO 6WXGLR ��� 6HUYLFH3DFN �� fereastra Build Options YD DU�WD SX LQ GLIHULW�

63. Mai multe despre modul de transmitere a parametrilor, în capitolul 4.

Page 6: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

482 Visual FoxPro

Figura 14.3. Compilarea serverului

ÌQ 9LVXDO )R[3UR SXWHP FUHD FHOH GRX� PDUL WLSXUL GH FRPSRQHQWH &20� • proces extern (out-of-process) – RE LQHP XQ ILúLHU H[HFXWDELO (.exe) care se

H[HFXW� FD SURFHV GLVWLQFW ID � GH DSOLFD LD FH-l va accesa. Comunicarea între cele GRX� SURFHVH �FOLHQWXO DSHODQW úL VHUYHUXO DSHODW� HVWH GHQXPLW� FRPXQLFD LH cross--process (inter-procese);

• proces intern (in-process) – RE LQHP R ELEOLRWHF� OHJDW� GLQDPLF �DLL) care se H[HFXW� vQ DFHODúL VSD LX GH PHPRULH FD úL SURFHVXO-FOLHQW �VH FRPSRUW� FD R

SURFHGXU� LQWHUQ� D SURFHVXOXL DSHODQW�� ([LVW� DYDQWDMH úL GH]DYDQWDMH DOH ILHF�UXLD GLQ SHUVSHFWLYD XWLOL]�ULL ORU SH :HE� $VWIHO�

serverele de tip in-process pot fi caracterizate prin: • LQWHUID D H[WUHP GH UDSLG� FX SURFHVHOH-client apelante; • blocarea lor duce în cele mai multe cazuri la blocarea serverului Web; • QX SRW IL GHVF�UFDWH FRPSOHW R GDW� FH DX IRVW vQF�UFDWH GH VHUYHUXO 0,,6. Aceasta

SRDWH GHYHQL R SUREOHP� PDMRU� GDF� DYHP vQ YHGHUH F� RULFH DSOLFD LH WUHFH SULQ

mai multe versiuni intermediare,FX PRGLILF�UL GLQWUH FHOH PDL GLYHUVH� SkQ� OD

RE LQHUHD SURGXVXOXL ILQDO� • VXQW GHVWXO GH JUHX GH vQWUH LQXW úL GHSDQDW�

Componentele de tip out-of-processSUH]LQW� FkWHYD DYDQWDMH GHPQH GH OXDW vQ

FRQVLGHUDUH SHQWUX GH]YROWDWRULL GH DSOLFD LL� ILLQG FDUDFWHUL]DWH SULQ� • EORFDUHD ORU QX GHWHUPLQ� EORFDUHD VHUYHUXOXL GH :HE� 0,,6� WRFPDL GDWRULW�

IDSWXOXL F� VH H[HFXW� FD SURFHVH GLVWLQFWH� • SRW IL GHVF�UFDWH XúRU IRORVLQG PHWRGD Reset IXUQL]DW� GH )R[,6$3, �QH YRP

referi la ea în finalul capitolului); • RIHU� GLVSRQLELOLWDWH SHQWUX LQVWDQ LHUHD PXOWLSO�� FDUDFWHULVWLF� IRDUWH LPSRUWDQW� vQ

UH]ROYDUHD VLPXOWDQ� D PDL PXOWRU FHUHUL GH DFFHV OD DFHHDúL FRPSRQHQW�� • pot fi apelate via DCOM (Distributed COM). Doar componentele construite ca

ILúLHU H[HFXWDELO SRW IL UH]LGHQWH SH R VWD LH RDUHFDUH vQ UH HD úL DFFHVDWH GH SH

serverul de Internet; • WLPS GH DFFHV PDL PDUH GDWRULW� FRPXQLF�ULL LQWHU-procese (cu toate acestea,

YRUELP vQF� GH PLOLVHFXQGH��

Page 7: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 483

(VWH PRPHQWXO V� SUHFL]�P F�� vQ WHVWHOH QRDVWUH� DP XWLOL]DW QXPDL FRPSRQHQWH GH WLS

out-of-process. &RPSLODUHD XQXL SURLHFW FDUH FRQ LQH FODVH GHILQLWH OLE Public duce la crearea a

WUHL ILúLHUH FX DFHODúL QXPH� XQXO GH WLS .exe sau .dll , unul de tip .tlb (Type Library) úL DOWXO GH WLS .vbr �ILúLHU Registry�� $FHVWD GLQ XUP� FXSULQGH LGHQWificatorii unici globali �*8,'� SHQWUX FODVHOH SXEOLFH SUHFXP úL DOWH HOHPHQWH VSHFLILFH FRPSRQHQWHORU &20 FH

vor fi scrise în Windows Registry (figura 14.4).

)LJXUD ����� )LúLHU GH WLS Registry creat la compilarea serverului

'XS� FRPSLODUH� SURLHFWXO QH SRDWH RIHUL FkWHYD LQIRUPD LL DVXSUD VHUYHUHORU &20 SH

FDUH OH vQJOREHD]�� $VWIHO� GDF� VHOHFW�P RS LXQHD Project →Project Info din meniul-VLVWHP VDX H[HFXW�P XQ FOLFN-dreapta în Project Manager � YRP RE LQH R

IHUHDVWU� FD vQ ILJXUD �����

Figura 14.5. InIRUPD LL SULYLQG FODVHOH SXEOLFH DOH XQXL SURLHFW FRPSLODW

8Q DVSHFW GHRVHELW GH LPSRUWDQW VH UHIHU� OD IDSWXO F�� vQ PRPHQWXO FRPSLO�ULL� 9LVXDO

)R[3UR UHDOL]HD]� DXWRPDW vQUHJLVWUDUHD FODVHORU SXEOLFH� $YHP vQV� úL SRVLELOLWDWHD

vQUHJLVWU�ULL�úWHUJHULL FRPSRQHQWHORU &20 vQ UHJLúWULL :LQGRZV vQ PRG LQGHSHQGHQW� Pentru înregistrarea unei componente .exe ODQV�P vQ H[HFX LH ILúLHUXO H[HFXWDELO FX

parametrul /REGSERVER, LDU SHQWUX HOLPLQDUHD HL XWLOL]�P SDUDPHWUXO /UNREGSERVER.

Page 8: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

484 Visual FoxPro

Spre exemplu, d:\Teste_Web\test_com.exe /unregserver va determina eliminarea serverului test_com din Windows Registry .

În cazul componentelor .dll XWLOL]�P XWLOLWDUXO REGSVR32 astfel: REGSVR32 d:\Teste_Web\test_com.dll

va înregistra serverul test_com �GDF� DFHVWD DU IL IRVW �dll ), pe când, REGSVR32 /U d:\Teste_Web\test_com.dll

îl va elimina.

14.1.3. 7HVWDUHD úL GHSDQDUHD FRPSRQHQWHORU &20

$VHPHQHD RULF�UHL DSOLFD LL� vQDLQWH GH D IL H[SORDWDW� HIHFWLY SH :HE� R FRPSRQHQW�

&20 WUHEXLH PDL vQWkL WHVWDW�� În acest scop, pentru exemplul nostru,YRP LQWURGXFH vQ IHUHDVWUD GH FRPDQG� D 9LVXDO

)R[3UR XUP�WRDUHOH OLQLL GH FRG� X=CREATEOBJECT(“test_com.clasacom1”) ? x.paginastart(“param1”,”param2”,0) RELEASE x Prima linie va crea un obiect64

FX QXPHOH Ä[´ SULQ LQVWDQ LHUHD FODVHL clasacom1 ce se J�VHúte în biblioteca test_com.exe .

$ GRXD OLQLH YD DILúD GLUHFW SH HFUDQXO 9)3 UH]XODWXO PHWRGHL paginastart , care a IRVW DSHODW� FX FHL � SDUDPHWUL GH WHVW – ELQHvQ HOHV� UHVSHFWkQG WLSXO DFHVWRUD�

)LJXUD ����� 5H]XOWDWXO WHVW�ULL VHUYHUXOXL &20 test_com.exe

&UHDUHD RELHFWXOXL JHQHUHD]� vQF�UFDUHD ILúLHUXOXL H[HFXWDELO FH FRQ LQH FODVD LQVWDQ LDW��

FD SURFHV GLVWLQFW vQ PHPRULH� )LJXUD ���� SUH]LQW� FDGUXO GH SDJLQ� Processes din fereastra Windows Task Manager .

64. 9H]L úL FDSLWROXO �� – Ä3URJUDPDUH RULHQWDW�-obiect în VFP”.

Page 9: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 485

Figura 14.7. ServeU &20 DIODW vQ H[HFX LH

3URFHVXO YD U�PkQH UH]LGHQW vQ PHPRULH SkQ� OD H[HFX LD XQHL LQVWUXF LXQL GH GHVF�UFDUH

(distrugerea obiectului „x ” prin comanda RELEASE x� VDX SkQ� OD LQWHUYHQ LD GLUHFW� FX

butonul End Process în Task Manager � $FHDVW� XOWLP� RS LXne o vom folosi în cazul EORF�ULL DSOLFD LHL FD XUPDUH D DSDUL LHL XQXLD GLQWUH HYHQLPHQWHOH GHVSUH FDUH DP YRUELW vQ

subcapitolul anterior. Spre exemplu, apelul metodei paginastart I�U� SDUDPHWUL YD GXFH

la blocarea serverului: x=CREATEOBJECT(“test_com.clasacom1”) ? x.paginastart &H VH vQWkPSO� GH IDSW" ùWLP F� RULFH SDUDPHWUX GHFODUDW� GDF� QX DUH XQ FRUHVSRQGHQW

actual, va avea implicit valoarea .F.(False) � 3HQWUX F� YDORULOH SDUDPHWULORU VXQW

utilizate, pe parcursul metodei, prin concatenarea lor cu un úLU GH FDUDFWHUH� QHFRQFRUGDQ D

între tipul caracter úL WLSXO logic YD JHQHUD R HURDUH� (URULOH QHWUDWDWH JHQHUHD]� XQ

mesaj de avertizare de tip GUI FDUH QX YD DMXQJH QLFLRGDW� OD SURFHVXO DSHODQW �PHGLXO

9LVXDO )R[3UR� úL YD ILQDOL]D SULQ EORFDUHD VHUYHUXOXL vQ DúWHSWDUHD XQXL U�VSXQV� ÌQ DFHVW

caz, singura modalitate de deblocare este butonul End Process din Task Manager .

14.1.4. Utilizarea serverelor COM pe Web. Configurarea drepturilor de acces

3HQWUX D SXWHD XWLOL]D R DSOLFD LH 9LVXDO )R[3UR SH :HE HVWH QHFHVDU� SDUFXUJHUHD

DQXPLWRU SDúL� • FRSLHUHD ILúLHUHORU foxisapi.dll úL foxisapi.ini în directorul de

scripturi al serverului Web (în general c:\inetpub\scripts ); • DFRUGDUH GUHSWXUL GH H[HFX LH SH GLUHFWRUXO UHVSHFWLY� • compilarea ca server out-of-process�ILúLHU H[HFXWDELO� D DSOLFD LHL 9)3 FH FRQ LQH

clase OLE Public ; • configurarea serverului COM; • configurarea drepturilor de acces la date. $úDGDU� FRSLHUHD FHORU GRX� ILúLHUH FH FRPSXQ H[WHQVLD )R[,6$3, vQWU-un director

accesibil serverului de Internet nu este sXILFLHQW�� 3H DFHVW GLUHFWRU WUHEXLH V� H[LVWH GUHSWXUL

GH H[HFX LH FDUH� SHQWUX 0LFURVRIW ,QWHUQHW ,QIRUPDWLRQ 6HUYHU� VH UHDOL]HD]� DVWIHO� vQ

Internet Services Manager � H[SDQG�P QRGXULOH SkQ� OD GLUHFWRUXO XQGH VH DIO�

Page 10: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

486 Visual FoxPro

Foxisapi.dll úL� vQ IHUHDVWUD GH VHW�UL Properties , VHOHFW�P SHQWUX RS LXQHD

Execute Permissions valoarea Scripts and Executables (figura 14.8).

)LJXUD ����� $FRUGDUHD GUHSWXOXL GH H[HFX LH SHQWUX GLUHFWRUXO

FH FRQ LQH ILúLHUHOH FoxISAPI

ÌQ FHHD FH SULYHúWH FRQILJXUDUHD FRPSRQHQWHORU &OM, pentru a da drepturi de DFFHV úL GH H[HFX LH FRQWXULORU XWLOL]DWRULORU GH ,QWHUQHW� YRP IRORVL XWLOLWDUXO :LQGRZV

DCOMCNFG �ODQVDUHD vQ H[HFX LH D DFHVWXLD R UHDOL]�P GLQ PHQLXO SULQFLSDO DO :LQGRZV-ului, Start →Run�� $FHVW XWLOLWDU OLVWHD]� WRDWH FRPSRnentele COM de tip .exe instalate pe FRPSXWHU �ILJXUD ������ (VWH LPSHULRV QHFHVDU V� UHJ�VLP FRPSRQHQWD QRDVWU� vQ OLVWD

UHVSHFWLY�� vQ FD] FRQWUDU� VHUYHUXO QX D IRVW FRPSLODW ELQH úL QX SRDWH IL XWLOL]DW�

Figura 14.9. Utilitarul Windows DCOMCNFG

Page 11: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 487

ConfLJXUDUHD SRDWH IL UHDOL]DW� la nivel global�SHQWUX WRDWH FRPSRQHQWHOH &20� úL OD

QLYHO LQGLYLGXDO �SHQWUX ILHFDUH vQ SDUWH�� ÌQ ID]D GH WHVWDUH HVWH PDL VLPSOX V� OXFU�P OD

QLYHO JOREDO� DVWIHO� vQ FDGUXO GH SDJLQ� Default Security vom configura drepturile de acces (Default Access Permissions � úL GUHSWXULOH GH H[HFX LH (Default Launch Permissions ) pentru conturile-utilizator Windows NT/2000 specifice browserilor: IUSR_NumeCalculator ; IWAM_NumeCalculator (figura 14.10):

1

2

Figura 14.��� &RQILJXUDUHD JOREDO� D GUHSWXULORU GH DFFHV úL H[HFX LH COM

2EVHUY�P� vQ ILJXUD GH PDL VXV� F� QXPHOH FDOFXODWRUXOXL �QXPHOH GH UH HD� vQ H[HPSOXO

nostru este webtest � ÌQ ILQDO� IHUHDVWUD GH FRQILJXUDUH YD DU�WD FD vQ ILJXUD ������ FX

precizarea implicLW� F� QXPHOH VHUYHUXOXL :HE YD IL� DSURDSH VLJXU� DOWXO�

Figura 14.11. Drepturi de acces la componentele COMSHQWUX FRQWXULOH FOLHQ LORU ,QWHUQHW

ÌQ VIkUúLW� XOWLPD FRQILJXUDUH QHFHVDU� SHQWUX FD DSOLFD LD QRDVWU� V� IXQF LRQH]H SH :HE

FRQVW� vQ acordarHD GUHSWXULORU GH DFFHV úL PRGLILFDUH D GDWHORU GLQ ED]D GH GDWH. Asta vQVHDPQ� F� RULFH GLUHFWRU FDUH FRQ LQH ILúLHUH FH YRU IL DFFHVDWH�PRGLILFDWH GH

FRPSRQHQWHOH &20 XWLOL]DWH SH :HE VDX DOWH DSOLFD LL DGLDFHQWH YD WUHEXL V� SHUPLW� DFHVW

lucru contului de utilizator NT/2000 specific browserilor: IUSR_NumeCalculator (figura 14.12).

Page 12: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

488 Visual FoxPro

Figura 14.12. Configurarea drepturilor de acces/modificare pe directorul vQ FDUH VH DIO� ED]D GH GDWH

AA tt eenn tt ii ee!! $FHOHDúL VHW�UL VXQW REOLJDWRULL úL SHQWUX GLUHFWRUXO XQGH VH DIO�

foxisapi.dll (c:\Inetpub\Scripts ), GDWRULW� IDSWXOXL F�� OD ILHFDUH DSHO�

DFHVWD JHQHUHD]� XQ ILúLHU GH LQL LDOL]DUH �FOXnn.ini � SH FDUH DSRL vQFHDUF� V�-l úWHDUJ�� 8OWLPD RSHUD LXQH QX YD UHXúL� ELQHvQ HOHV� GDF� QX DFRUG�P GUHSWXUL GH

úWHUJHUH� ÌQ DFHVW FD] YD WUHEXL V� HIHFWX�P úWHUJHUHD SHULRGLF� D ILúLHUHORU UHVSHFWLYH�

14.2. �3ULPD�DSOLFD LH�9LVXDO�)R[3UR�SH�:HE

2 GDW� FH DP SDUFXUV FX VXFFHV HWDSHOH SUHPHUJ�WRDUH� SXWHP WUHFH OD WHVWDUHD HIHFWLY� D

PRGXOXL GH IXQF LRQDUH D XQHL FRPSRQHQWH &20 SH :HE. Ne vom opri în primul rând asupra serverului creat anterior: test_com � ÌQ DFHVW VHQV� IXUQL]�P EURZVHUXOXL GH

,QWHUQHW XUP�WRDUHD DGUHV��

http://NumeServerWeb/scripts/foxisapi.dll/test_com.clasacom1.paginastart

Un asemenea URL (Universal Resource Locator� YD GHWHUPLQD XUP�WRDUHOH HYH-nimente:

• VHUYHUXO :HE� LGHQWLILFDW SULQ QXPH� vQFDUF� vQ PHPRULH ELEOLRWHFD

foxisapi.dll ; • foxisapi.dll ODQVHD]� vQ H[HFX LH test_com.exe úL LQYRF� PHWRGD

paginastart SULQ LQVWDQ LHUHD FODVHL SXEOLFH clasacom1 ; • metoda va returna un text în format HTML; • foxisapi.dll SUHLD U�VSXQVXO PHWRGHL� vO vQJOREHD]� vQWU-un document HTML

úL vO WULPLWH VHUYHUXOXL :HE� • procesul test_com este oprit. 5H]XOWDWXO ILQDO� vQ IHUHDVWUD EURZVHUXOXL� DU WUHEXL V� ILH FHO GLQ ILJXUD ������

Page 13: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 489

Figura 14.23. Testarea unei componente pe Web

'XS� FXP REVHUY�P� FHL WUHL SDUDPHWUL GH DSHO DL PHWRGHL VXQW� • SULPXO SDUDPHWUX DUH R YDORDUH YLG�� SHQWUX F� QX DP VSHFLILFDW QLFL R YDORDUH vQ

DGUHVD IXUQL]DW� EURZVHUXOXL� • al doilea parametru: c:\inetpub\scripts\FOX39.ini ; • al treilea parametru: 651612 �R YDORDUH DOHDWRDUH JHQHUDW� GH )R[,6$3,� PDL

mare decât 0). 3HQWUX D IXUQL]D PHWRGHL DQXPLWH YDORUL FH VH GRUHVF D IL SUHOXFUDWH� FRPSOHW�P DGUHVD

GH PDL VXV FX VHPQXO Ä"´ úL YDORULOH Gorite:

http://webtest/scripts/foxisapi.dll/test_com.clasacom1.paginastart?456%ETC%386

5H]XOWDWXO vO UHJ�VLP vQ ILJXUD ������

Figura 14.14. Utilizarea parametrilor în apelul metodelor pe Web

([HPSOXO� GHúL OXDW OD vQWkPSODUH� vQFHDUF� V� HYLGHQ LH]H IRORVirea unor caractere de GHOLPLWDUH vQ FD]XO vQ FDUH GRULP V� WUDQVPLWHP PDL PXOWH YDORUL FH YRU IL SUHOXFUDWH

distinct.

Page 14: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

490 Visual FoxPro

14.3. Interogarea bazei de date. �����,QWHUDF LXQHD�FX�XWLOL]DWRUXO

,QWHUDF LXQHD FX XWLOL]DWRUXO FRQVWLWXLH ODWXUD HVHQ LDO� D PDMRULW� LL DSOLFD LLORU FH

LPSOLF� ED]H GH GDWH� 'DF� vQ SDUDJUDIHOH DQWHULRDUH DP LQVLVWDW SH WHKQLFD GH FRQVWUXLUH D

XQXL PRGXO 9LVXDO )R[3UR XWLOL]DELO SH :HE� vQ FHOH FH XUPHD]� YRP HYLGHQ LD PRGDOLW� L

de conectare on line a utilizatorului (browserului) la date. ÌQ DFHVW FRQWH[W� SRUQLQG GH OD ED]D GH GDWH XWLOL]DW� FX WLWOX GH H[HPSOX SH SDUFXUVXO

vQWUHJLL F�U L65� SUHVXSXQHP F� GRULP V� RE LQHP XQ UDSRUW vQ IRUPDW HTMLFDUH V� SUH]LQWH

VLWXD LD YkQ]�ULORU SH FOLHQ L úL SURGXVH �ILJXUD �������

Figura 14.35. Raport HTMLSULYLQG VLWXD LD YkQ]�ULORU SH FOLHQ L úL SURGXVH

ÌQ DFHODúL WLPS� GRULP V� RIHULP XWLOL]DWRUXOXL SRVLELOLWDWHD GH D ILOWUD OLVWD vQ IXQF LH GH

SURGXVXO úL�VDX FOLHQWXO GRULW� DVWIHO vQFkW UDSRUWXO V� FRQ LQ� ILH WR L FOLHQ LL úL SURGXVHOH

FXPS�UDWH GH ILHFDUH� ILH XQ DQXPLW SURGXV úL�VDX XQ DQXPLW FOLHQW� ÌQ DFHVW VFRS� YRP

construi un formular HTMLFH YD FXSULQGH XQ RELHFW GH WLS F�VX � GH WH[W úL DOWXO GH WLS OLVW��

vQ FDUH V� VH SRDW� LQWURGXFH�VHOHFWH]H Xn cod de client sau un produs anume (figura 14.16).

Figura 14.16. Formular HTMLGH SUHOXDUH D RS LXQLORU XWLOL]DWRULORU

65. Vezi capitolul 2.

Page 15: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 491

'HVLJXU� XWLOL]DUHD XQXL RELHFW GH WLS F�VX � GH WH[W SHQWUX LQWURGXFHUHD FRGXOXL

FOLHQWXOXL HVWH SX LQ FDP IRU DW�� VFRSXO �SXU GLGactic, de altfel) declarat fiind acela de a YHULILFD� vQ DSOLFD LD 9)3� GDF� UHVSHFWLYXO FRG GH FOLHQW H[LVW� vQ ED]D GH GDWH�

'DF� DQDOL]�P FRGXO-VXUV� HTML66 pentru formularul de mai sus (listingul 14.2) REVHUY�P F�� SH GH R SDUWH� HOHPHQWHOH OLVWHL �FX Qumele Combo1) trebuie generate dinamic vQ IXQF LH GH SURGXVHOH H[LVWHQWH OD XQ PRPHQW GDW vQ WDEHOD PRODUSE, LDU SH GH DOW� SDUWH�

OD DS�VDUHD EXWRQXOXL OKYD IL LQYRFDW� PHWRGD Query_parametrizat a componentei clasa1 .

Listing 14.2. Sursa HTML a formularului din figura 14.16 <HTML> <BODY> <H2> <b><i> SELECTATI UN PRODUS SI/SAU UN CLIENT</i></b></H2><HR> <FORM method="POST" ACTION="/scripts/foxisapi.dll/web_Test1.clasa1.query_parametrizat"> <p align="left"><BR> <b>Introduceti un cod de client:&nbsp; </b><input type="text" name="text1" size="20"

value="toti"><BR> <b>Selectati produsul dorit:</b>; <SELECT NAME="COMBO1" size="1"> <OPTION SELECTED VALUE="toate"> Toate produsele <OPTION VALUE=1> Produs 1 <OPTION VALUE=2> Produs 2 <OPTION VALUE=3> Produs 3 <OPTION VALUE=4> Produs 4 <OPTION VALUE=5> Produs 5 <OPTION VALUE=6> Produs 6 </SELECT> <BR><BR> <input type="submit" name="OK" value=" OK "><input type="reset"> </form> </body> $úDGDU� YRP FRQVWUXL XQ VHUYHU &20 FX QXPHOH web_test1 în care vom defini clasa

SXEOLF� GHQXPLW� clasa1 �OLVWLQJXO ����� FH YD FRQ LQH XUP�WRDUHOH PHWRGH� • Init – DVLJXU� GHVFKLGHUHD WDEHOHORU QHFHVDUH vQ PRPHQWXO LQVWDQ LHULL FODVHL� • Query_form – construieúWH XQ WH[W HTML ce constituie codul-VXUV� DO

formularului din figura 14.16; • Query_parametrizat – pe baza datelor de intrare (valorile obiectelor de tip

Input � SUHOXDWH GLQ IRUPXODU GH SULPXO SDUDPHWUX DO PHWRGHL� UHDOL]HD]� LQWHUR-JDUHD ED]HL GH GDWH úL FRQVWUXLHúWH FRGXO-VXUV� SHQWUX UDSRUWXO GLQ ILJXUD ������

• Destroy – închide toate tabelele în momentul în care componenta este GHVF�UFDW� GLQ PHPRULH�

AA tt eenn ii ee!! Ca UHJXO� JHQHUDO YDODELO� SHQWUX RULFH IRUPXODU HTML, atunci când clientul :HE DSDV� XQ EXWRQ de tip Submit (exemplu: OK), foxisapi.dll transmite primului parametru al metodei invocate (în cazul nostru, parametrul p_input_form , metoda Query_parametrizat � XQ úLU GH FDUDFWHUH GH JHQXO�

text1=toti&COMBO1=1&OK=+++OK++++.

66. Pentru simplificare, formularul poate fi creat cu ajutorul unui editor HTML� GXS� FDUH VH YD XWLOL]D úL PRGLILFD

codul-VXUV� vQ FDGUXO DSOLFD LHL 9)3�

Page 16: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

492 Visual FoxPro

'XS� FXP VH REVHUY�� úLUXO FRQ LQH QXPHOH WXWXURU RELHFWHORU GH WLS Input ce se UHJ�VHVF SH IRUPXODU� vPSUHXQ� FX YDORULOH LQWURGXVH GH XWLOL]DWRU vQ RUGLQHD vQ FDUH VXQW

DúH]DWH vQ SDJLQD HTMLúL GHOLPLWDWH SULQ VHPQXO &� 'H DVHPHQHD� YD FRQ LQH QXPHOH úL

valoarea butonului de tip Submit FH D IRVW DS�VDW� LDU VSD LLOH YRU IL vQORFXLWH FX VHPQXO +. &D XUPDUH� úLUXO GH FDUDFWHUH YD WUHEXL V� ILH DQDOL]DW SHQWUX D H[WUDJH GLQ HO QXPDL DFHOH

segmente ce contribuie la îndeplinirea obiectivului metodei.

Listing 14.3. Cod-VXUV� SHQWUX GHILQLrea componentei COM clasa1

#DEFINE CR CHR(13)+CHR(10) DEFINE CLASS clasa1 AS CUSTOM OLEPUBLIC FUNCTION INIT SET DEFAULT TO C:\database_web\ USE produse IN 0 SHARED USE liniifact IN 0 SHARED USE facturi IN 0 SHARED USE localitati IN 0 SHARED USE clienti IN 0 SHARED RETURN FUNCTION QUERY_FORM LPARAMETER lcFormVars, lcIniFile, lnReleaseFlag LOCAL v_pagina_form1 v_pagina_form1= ; [<HTML>]+CR+; [<BODY>]+CR+; [<H2> <b><i> SELECTATI UN PRODUS SI/SAU UN CLIENT</i></b></H2><HR>]+CR+; [<FORM method="POST" ACTION="/scripts/foxisapi.dll/web_Test1.clasa1.query_parametrizat">]+CR+; [<p align="left"><BR>]+CR+; [<b>Introduceti un cod de client:</b><input type="text" name="text1" size="20" value="toti"><BR>]+CR+; [<b>Selectati produsul dorit :</b>; <SELECT NAME="COMBO1" size="1">]+CR+; [<OPTION SELECTED VALUE="toate"> Toate produsele]+CR ** generam lista de elemente SELECT produse SCAN v_pagina_form1=v_pagina_form1+; [<OPTION VALUE=]+ALLTRIM(STR(produse.codpr))+[> ]+produse.denpr+CR ENDSCAN v_pagina_form1=v_pagina_form1+; [</SELECT> <BR><BR>]+CR+; [<input type="submit" name="OK" value=" OK "><input type="reset">]+CR+; [</form>]+CR+; [</body>]+CR RETURN v_pagina_form1 FUNCTION Query_parametrizat LPARAMETER p_input_form,lcIniFile, lnReleaseFlag LOCAL v_codcl,v_codpr,poz_delimitator,poz_egal *** RETU p_input_form && doar in faza de testare *** stim ordinea in care sunt asezate valorile introduse in sirul de caractere ce vine ca parametru

Page 17: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 493

poz_delimitator=AT('&',p_inputBIRUP� SUHOX�P SR]L LD SULPXOXL VHPQ ´´ vQ VLUXO GH FDUDFWHUH v_codcl=LEFT(p_input_form,poz_delimitator-1) && poz_delimitator-1 :eliminam '&' poz_egal=AT('=',v_codcl) v_codcl=RIGHT(v_codcl,LEN(v_codcl)-poz_egal) && este de tip CHAR!!!!! p_input_form=RIGHT(p_input_form,LEN(p_input_form)-poz_delimitator) poz_delimitator=AT('&',p_input_form) v_codpr=LEFT(p_input_form,poz_delimitator-1) poz_egal=AT('=',v_codpr) v_codpr=RIGHT(v_codpr,LEN(v_codpr)-poz_egal) && este de tip CHAR!!!!! v_text_html="HTTP/1.0 200 OK"+CR+; "Content-type: text/html"+CR+CR && neaparat si o linie libera (al doilea CR) v_text_html=v_text_html+ ; [<HTML><BODY BGCOLOR="#FFFFFF">] + ; [<H1>Situatia Livrarilor de Produse</H1>] + [<p>] *** test exista cod client x=SEEK(v_codcl,'clienti','codcl') IF x=.F. AND v_codcl<>' toti ' v_codcl='toti' && dam toti clientii daca a introdus un cod gresit v_text_html=v_text_html+; [<H3> Pentru toti clientii deoarece CODUL introdus NU este valid</H3><HR><p>] ENDIF ** construim cursorul in functie de valorile introduse DO CASE CASE v_codcl='toti' AND v_codpr='toate' SELECT denpr,codcl,SUM(cantitate) AS cant,SUM(1+proctva)*cantitate*pretunit AS valoare ; FROM facturi F,liniifact l,produse p ; WHERE l.nrfact=F.nrfact AND p.codpr=l.codpr; GROUP BY codcl,p.codpr; INTO CURSOR c1 CASE v_codcl='toti' SELECT denpr,codcl,SUM(cantitate) AS cant,SUM(1+proctva)*cantitate*pretunit AS valoare ; FROM facturi F,liniifact l,produse p ; WHERE l.nrfact=F.nrfact AND p.codpr=l.codpr AND p.codpr=VAL(v_codpr); GROUP BY codcl,p.codpr; INTO CURSOR c1 CASE v_codpr='toate' SELECT denpr,codcl,SUM(cantitate) AS cant,SUM(1+proctva)*cantitate*pretunit AS valoare ; FROM facturi F,liniifact l,produse p ; WHERE l.nrfact=F.nrfact AND p.codpr=l.codpr AND codcl=VAL(v_codcl); GROUP BY codcl,p.codpr; INTO CURSOR c1 OTHERWISE && avem valori valide selectate pe ambele SELECT denpr,codcl,SUM(cantitate) AS cant,SUM(1+proctva)*cantitate*pretunit AS valoare ; FROM facturi F,liniifact l,produse p ; WHERE l.nrfact=F.nrfact AND p.codpr=l.codpr AND p.codpr=VAL(v_codpr); AND codcl=VAL(v_codcl); GROUP BY codcl,p.codpr; INTO CURSOR c1 ENDCASE SELECT dencl,loc,denpr,cant,valoare; FROM clienti C,c1,localitati l;

Page 18: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

494 Visual FoxPro

WHERE C.codcl=c1.codcl AND C.codpost=l.codpost; INTO CURSOR c2 ORDER BY dencl,denpr v_text_html=v_text_html+ ; [<TABLE BGCOLOR=#EEEEEE CELLPADDING=4 BORDER=1 WIDTH=100%>]+CR+; [<TR BGCOLOR=#FFFFCC><TH>Client</TH><TH>Localitate</TH><TH>NumeProdus</TH>]+; [<TH>cantitate</TH><TH>valoare</TH></TR>]+CR SCAN && cursorul C2 este in zona curenta de lucru *** Construim liniile tabelului ce va constitui raportul din figura 14.15 v_text_html=v_text_html+ [<TR><TD>]+; ALLTRIM(IIF(EMPTY(c2.dencl),"<BR>",c2.dencl))+[</TD><TD>]+; ALLTRIM(IIF(EMPTY(c2.loc),"<BR>",c2.loc))+[</a></TD><TD>]+; ALLTRIM(IIF(EMPTY(c2.denpr),"<BR>",c2.denpr))+[</TD><TD>]+; ALLTRIM(STR(c2.cant))+[</TD><TD>]+; ALLTRIM(STR(c2.valoare))+[</TD></TR>]+CR ENDSCAN RETURN v_text_html FUNCTION DESTROY CLOSE TABLES ALL CLOSE DATA ALL RETURN ENDDEFINE

Observ�P vQ OLVWLQJXO GH PDL VXV F� SHQWUX FRQVWUXLUHD WH[WXOXL HTML am utilizat SDUDQWH]H S�WUDWH vQ ORFXO JKLOLPHOHORU� $FHVW OXFUX HVWH QHFHVDU DWkW SHQWUX VSRULUHD

OL]LELOLW� LL FRGXOXL� FkW úL GDWRULW� IDSWXOXL F� WH[WXO JHQHUDW FRQ LQH HO vQVXúL JKLOLPHOH� 2 GDW� FRQVWUXLW� úL WHVWDW� DFHDVW� FRPSRQHQW�� R SXWHP DSHOD ILH GLUHFW GLQ EURZVHU

(http://NumeServerWeb/scripts/foxisapi.dll/web_test1.clasa1.query_form), fie putem intro-duce un link în HomePage-ul serverului Web astfel:

<a HREF="/scripts/foxisapi.dll/web_test1.clasa1.query_form"> <i>INTEROGARI PARAMETRIZATE</i></a> <p>

14.4. �)RUPXODU�GH�YL]XDOL]DUH�DFWXDOL]DUH�vQUHJLVWU�UL

2ULFH DSOLFD LH :HE FDUH vúL SURSXQH V� RIHUH DFFHV vQ WLPS UHDO OD GDWH FRQ LQH P�FDU XQ

IRUPXODU GH DFWXDOL]DUH vQUHJLVWU�UL vQ ED]D GH GDWH� 0RGDOLWDWHD GH DERUGDUH D XQHL

asemenea probleme constituie scopul exemplului ce-l vom prezenta în continuare. $úDGDU� SUHVXSXQHP F� VH GRUHúWH UHDOL]DUHD XQui formular de actualizare a facturilor.

Având în vederea organizarea bazei de date VINZARI 67� úWLP F� GDWHOH XQHL IDFWXUL VXQW

GLVWULEXLWH vQ GRX� WDEHOH� FACTURI úL LINIIFACT , UHOD LRQDWH SULQ QXP�UXO GH IDFWXU� (câmpul Nrfact ). Ca urmare, pe formular treEXLH V� UHJ�VLP OD XQ PRPHQW GDW R

înregistrare din tabela FACTURI úL WRDWH vQUHJLVWU�ULOH FRUHVSXQ]�WRDUH �FX DFHODúL QXP�U

GH IDFWXU�� GLQ WDEHOD LINIIFACT (figura 14.17).

67. Pentru structura tabelelor, vezi capitolul 2.

Page 19: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 495

Figura 14.47. Formular pe Web pentru vizualizare/actualizare date în timp real

Codul-VXUV� HTML SHQWUX IRUPXODUXO GLQ ILJXUD GH PDL VXV vO UHJ�VLP vQ OLVWLQJXO

XUP�WRU� Listing 14.4. Codul-VXUV� HTML al formularului din figura 14.17

<HTML> <BODY bgcolor="#C0C0C0"> <BODY> <H2> <b><i>FORMULAR FACTURI</i></b></H2><HR><p>Inregistrare curenta: 1 <FORM method="POST" ACTION="/scripts/foxisapi.dll/web_Test1.actualizari.actiune"> <p align="center"> <input type="submit" name="primul" value="Prima"><input type="submit" name="anterior"

value="Anterior"><input type="submit" name="urmator" value="Urmator"><input type="submit" name="ultimul" value="Ultima">

<input name="NR_INREGISTRARE" type="hidden" value = 1><p> <table border="0" width="100%"> <tr> <td width="21%"><b>Numar factura:</b></td> <td width="79%"><input type="text" name="TxtNrfact" size="20" value= 1111></td> </tr> <tr> <td width="21%"><b>Data Factura:</b></td> <td width="79%"><input type="text" name="TxtDatafact" size="20" value=08/01/00></td> </tr> <tr> <td width="21%"><b>Client:</b></td> <td width="79%"><SELECT NAME="CboClient" size="1"> <OPTION SELECTED VALUE=1005>Client 5 SRL <OPTION VALUE=1001>Client 1 SRL <OPTION VALUE=1002>Client 2 SA <OPTION VALUE=1003>Client 3 <OPTION VALUE=1004>Client 4 <OPTION VALUE=1006>Client 6 SA <OPTION VALUE=1007>Client 7 SRL </SELECT></td> </tr> <tr>

Page 20: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

496 Visual FoxPro

<td width="21%"><b>Gestiune:</b></td> <td width="79%"><SELECT NAME="CboGestiune" size="1"> <OPTION SELECTED VALUE=002>Depozit Suceava <OPTION VALUE=001>Depozit Pacurari <OPTION VALUE=003>Sectie Pascani </SELECT></td> </tr> </table> <HR> <p align="center"> <input type="submit" name="modifica" value="Salvez Modificari"><input type="reset"

value="Anulez Modificari"><p> <table border="3" width="100%"> <tr> <td width="1%" align="center"><b>Linie</b></td> <td width="12%" align="center"><b>Produs</b></td> <td width="27%" align="center"><b>Cantitate</b></td> <td width="20%" align="center"><b>Pret</b></td> </tr> <tr> <td width="1%"> <p align="left">1</td> <td width="12%"> <p align="center"><SELECT NAME=CboProd1 size="1"> <OPTION SELECTED VALUE=2>Produs 2 <OPTION VALUE=1>Produs 1 <OPTION VALUE=3>Produs 3 <OPTION VALUE=4>Produs 4 <OPTION VALUE=5>Produs 5 <OPTION VALUE=6>Produs 6 </SELECT></td> <td width="27%"> <p align="center"><input type="text" name=TxtCant1 size="20" value=300></p> </td> <td width="20%"> <p align="center"><input type="text" name=TxtPret1 size="20" value=454></p> </td> </tr> <tr> <td width="1%"> <p align="left">2</td> <td width="12%"> <p align="center"><SELECT NAME=CboProd2 size="1"> <OPTION SELECTED VALUE=4>Produs 4 <OPTION VALUE=1>Produs 1 <OPTION VALUE=2>Produs 2 <OPTION VALUE=3>Produs 3 <OPTION VALUE=5>Produs 5 <OPTION VALUE=6>Produs 6 </SELECT></td> <td width="27%"> <p align="center"><input type="text" name=TxtCant2 size="20" value=1000></p> </td> <td width="20%"> <p align="center"><input type="text" name=TxtPret2 size="20" value=58></p> </td> </tr> <tr> <td width="1%"> <p align="left">3</td>

Page 21: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 497

<td width="12%"> <p align="center"><SELECT NAME=CboProd3 size="1"> <OPTION SELECTED VALUE=5>Produs 5 <OPTION VALUE=1>Produs 1 <OPTION VALUE=2>Produs 2 <OPTION VALUE=3>Produs 3 <OPTION VALUE=4>Produs 4 <OPTION VALUE=6>Produs 6 </SELECT></td> <td width="27%"> <p align="center"><input type="text" name=TxtCant3 size="20" value=100></p> </td> <td width="20%"> <p align="center"><input type="text" name=TxtPret3 size="20" value=200></p> </td> </tr> </table> <p><H4> ADRESA BROWSER-ULUI: 194.176.165.151</h4> </form> </body> La proiectarea unui formular ce va actualiza date în dou� WDEHOH UHOD LRQDWH

�S�ULQWH→copil) apar câteva probleme conceptuale suplimentare. $VWIHO� SHQWUX F� PDL PXO L FOLHQ L SRW DFFHVD GLYHUVH vQUHJLVWU�UL VLPXOWDQ� PHWRGD FH

DVLJXU� QDYLJDUHD úL�VDX DFWXDOL]DUHD vQUHJLVWU�ULORU YD WUHEXL V� GLVSXQ� GH XQ ÄSXnct de reper” care V� LGHQWLILFH vQ PRG XQLF vQUHJLVWUDUHD SH FDUH VH DIO� FOLHQWXOXL [ VDX \ OD XQ

PRPHQW GDW �QX XLW�P F� QXP�UXO GH IDFWXU� HVWH PRGLILFDELO�� 8Q DVHPHQHD LGHQWLILFDWRU

unic poate fi considerat QXP�UXO vQUHJLVWU�ULL, care este alocat fizic la introducerea acesteia vQ WDEHO� úL QX VH PRGLILF� SkQ� OD úWHUJHUHD GHILQLWLY� D OLQLHL UHVSHFWLYH� ÌQ H[HPSOXO GH

mai sus (listingul 14.4), obiectul de tip Hidden cu numele Nr_inregistrare introdus vQ IRUPXODU DUH WRFPDL UROXO GH D VWRFD DFHDVW� YDORDUH vQ YHGHUHD XWLOL]�ULL HL SHQWUX

navigare/actualizare. ùWLP GHMD F� OD DS�VDUHD XQXLD GLQWUH EXWRDQHOH GH WLS Submit , foxisapi.dll

WUDQVPLWH FD SDUDPHWUX XQ úLU GH FDUDFWHUH FH FXSULQGH QXPHOH RELHFWHORU GH WLS Input úL

valorile introduse sau selectate GH XWLOL]DWRU� &D XUPDUH� vQ FD]XO PRGLILF�ULL XQHL YDORUL vQ

tabela Liniifact � WUHEXLH V� H[LVWH XQ PHFDQLVP FDUH V� LGHQWLILFH vQUHJLVWUDUHD SH FDUH

WUHEXLH HIHFWXDW� DFWXDOL]DUHD� O modalitate de rezolvare a acestei probleme ar fi utilizarea unei tabele derivate (view)

cu numele Vliniifact_1 (listingul 14.5) FDUH V� SUHLD GLQ WDEHOD Liniifact doar liniile aferente facturii curente. Câmpurile modificabile din acest view vor fi apoi plasate pe IRUPXODU SULQ LQWHUPHGLXO XQRU RELHFWH D F�URU QXPH YD XUPD R DQXPLW� FRGLILFDUH� DVWIHO�

CboProd i , TxtCant i , TxtPret i , unde i FRQVWLWXLH QXP�UXO GH OLQLH �FRUHVSXQ]�WRU

câmpului Liniifact.linie � OD FDUH VH UHIHU� RELHFWXO� 3H ED]D DFHVWXL FRG LQWHUQ�

PHWRGD GH DFWXDOL]DUH YD PRGLILFD YDORULOH FkPSXULORU FRUHVSXQ]�WRDre (codpr, cantitate, pretunit � vQ WDEHOD GHULYDW�� SH OLQLD SH FDUH V-D I�FXW DFWXDOL]DUHD�

8Q DOW DVSHFW IRDUWH LPSRUWDQW VH UHIHU� OD IDSWXO F�� DWXQFL FkQG H[LVW� PDL PXOWH

butoane de tip Submit SH XQ IRUPXODU� vQ úLUXO FH YD IL WUDQVPLV FD SDUDPHWUX VH YD UHJ�VL

GRDU QXPHOH úL YDORDUHD EXWRQXOXL DS�VDW� $VWIHO� vQ VLWXD LD GLQ ILJXUD ������ DS�VDUHD

butonului „Urmator” va trimite, ca prim parametru al metodei Actiune , XQ úLU GH

caractere de genul:

Page 22: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

498 Visual FoxPro

urmator=Urmator&NR_INREGISTRARE=1&TxtNrfact=1111&TxtDatafact=08%2F01%2F00&CboClient=1005&CboGestiune=002&CboProd1=2&TxtCant1=300&TxtPret1=454&CboProd2=4&TxtCant2=1000&TxtPret2=58&CboProd3=5&TxtCant3=100&TxtPret3=200

$FHVW úLU YD WUHEXL DQDOL]DW vQ VFRSXO H[WUDJHULL YDORULORU FH FRUHVSXQG FkPSXULORU GLQ

cele dRX� WDEHOH� (VWH GH OD VLQH vQ HOHV F� úLUXO YD DYHD R OXQJLPH YDULDELO�� vQ IXQF LH GH

QXP�UXO OLQLLORU XQHL IDFWXUL �QXP�UXO GH OLQLL GLQ WDEHOD GHULYDW� vliniifact_1 ). Componenta COM, cu numele Actualizari (LQFOXV� vQ DFHODúL VHUYHU Web_test1 ),

prin care s-D UHDOL]DW DSOLFD LD �OLVWLQJXO ������ FXSULQGH XUP�WRDUHOH PHWRGH� • Init – deschide tabelele necesare în mod partajat; • Start_Page – HVWH PHWRGD DSHODW� OD SULPD FHUHUH GH DFFHV D FOLHQWXOXL :HE OD

IRUPXODU FX URO GH SR]L LRQDUH SH SULPD vQUHJLVWUDUH vQ tabela Facturi úL GH DSHO

al metodei Gen_Html ; • Gen_Html – JHQHUHD]� FRGXO HTMLDO IRUPXODUXOXL �YH]L úL OLVWLQJXO ������ vQ

IXQF LH GH SR]L LD FXUHQW� D FOLHQWXOXL :HE vQ WDEHOD Facturi � (VWH DSHODW� GH

metodele Start_Page úL $F LXQH cu parametrul p_adresaIP , ce cores-SXQGH DGUHVHL EURZVHUXOXL FOLHQWXOXL �SUHOXDW GLQ ILúLHUXO GH LQL LDOL]DUH FX DMXWRUXO

IXQF LHL GetPrivateProfileString() ); • $F LXQH – PHWRG� DSHODW� GH IRUPXODU FH DQDOL]HD]� úLUXO SULPLW FD SDUDPHWUX

GH OD IRUPXODU úL H[HFXW� DF LXQHD VROLFLWDW� GH FOLHQW� GHSODVDUH GH OD R vQUHJLVWUDUH

la alta sau actualizare date; • Comite_Modificari – FRPSDU� GDWHOH H[LVWHQWH FX YDORULOH SULPLWH FD

SDUDPHWUX úL� GDF� H[LVW� GLIHUHQ H� ÄFRPLWH´ PRGLILF�ULOH vQ ED]D GH GDWH� • Parsing_Input_Form – DQDOL]HD]� úLUXO GH FDUDFWHUH SULPLW FD SDUDPHWUX úL�

vQ IXQF LH GH SR]L LD GHOLPLWDWRUXOXL &, extrage „blocurile” ce cuprind numele obiectului de tip Input úL YDORDUHD VD �XQ H[HPSOX GH DVHPHQHD ÄEORF´ H[WUDV GLQ

úLUXO GH PDL VXV DU IL� TxtCant3=100 ). Fiecare segment de caractere este apoi transmis metodei Repartizare ;

• Repartizare – SRSXOHD]� XQ FXUVRU FX GRX� FRORDQH� numeobiect úL

valoareobiect , prin analiza unui segment furnizat de metoda Parsing_Input_Form úL H[WUDJHUHD D GRX� VXEúLUXUL vQ IXQF LH GH SR]L LD

semnului „=´ vQ úLUXO LQL LDO� ÌQ ILQDO YRP RE LQH XQ FXUVRU FX WRDWH QXPHOH

RELHFWHORU GH SH IRUPXODU úL YDORULOH ORU �ILJXUD ������� • Destroy – vQFKLGH ED]D GH GDWH OD GHVF�UFDUHD FRPSRQHQWHL GLQ PHPRULH�

)LJXUD ������ &XUVRU RE LQXW vQ XUPD DQDOL]HL úLUXOXL GH caractere transmis

ca parametru de formularul Web

Page 23: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 499

/LVWLQJ ����� 'HILQL LD view-ului utilizat de componenta Actualizari pentru vizualizarea/actualizarea facturilor

nrfact_=1111 && variabila initializata cu o valoare aleatoare in scopul functionarii codului ce urmeaza

CREATE SQL VIEW vliniifact_1 AS ; SELECT nrfact,linie,l.codpr,cantitate,pretunit,denpr ; FROM liniifact l,produse p WHERE p.codpr=l.codpr AND nrfact=nrfact_ ORDER BY linie DBSETPROP('vliniifact_1','view','tables','liniifact') DBSETPROP('vliniifact_1.nrfact','field','keyfield',.T.) DBSETPROP('vliniifact_1.linie','field','keyfield',.T.) DBSETPROP('vliniifact_1.nrfact','field','updatename','liniifact.nrfact') DBSETPROP('vliniifact_1.linie','field','updatename','liniifact.linie') DBSETPROP('vliniifact_1.codpr','field','updatename','liniifact.codpr') DBSETPROP('vliniifact_1.cantitate','field','updatename','liniifact.cantitate') DBSETPROP('vliniifact_1.pretunit','field','updatename','liniifact.pretunit') DBSETPROP('vliniifact_1.nrfact','field','updatable',.T.) DBSETPROP('vliniifact_1.linie','field','updatable',.T.) DBSETPROP('vliniifact_1.codpr','field','updatable',.T.) DBSETPROP('vliniifact_1.cantitate','field','updatable',.T.) DBSETPROP('vliniifact_1.pretunit','field','updatable',.T.) DBSETPROP('vliniifact_1', 'view', 'SendUpdates', .T.)

Listing 14.6. Program pentru definirea componentei Actualizari SHQWUX RE LQHUHDformularului Web din figura 14.17

#DEFINE CR CHR(13)+CHR(10)

DEFINE CLASS actualizari AS CUSTOM OLEPUBLIC

FUNCTION INIT **asiguram tratarea erorilor neprevazute PUBLIC a_fost_o_eroare a_fost_o_eroare='nu' ON ERROR a_fost_o_eroare=STR(ERROR())+" " +MESSAGE() SET DEFAULT TO c:\database_web\ OPEN DATA vinzari SHARED USE produse IN 0 SHARED USE liniifact IN 0 SHARED USE facturi IN 0 SHARED USE localitati IN 0 SHARED USE clienti IN 0 SHARED USE gestiuni IN 0 SHARED

RETURN

FUNCTION START_PAGE LPARAMETER p_input_form,lcIniFile, lnReleaseFlag **Vom extrage (din fisierul .ini trimis ca parametru de foxisapi.dll) cu ajutorul functiei API **GetPrivateProfileString, adresa IP a browser-ului client

Page 24: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

500 Visual FoxPro

DECLARE INTEGER GetPrivateProfileString IN win32api STRING,STRING,STRING,; STRING @, INTEGER,STRING adresaIP = SPACE(500) nlen = GetPrivateProfileString("FOXISAPI","Remote Host","",@adresaIP,LEN(adresaIP),lcIniFile) adresaIP= LEFT(m.adresaIP,m.nlen) SELECT facturi GO TOP

RETURN this.gen_html(adresaIP)

FUNCTION ACTIUNE LPARAMETER p_input_form,lcIniFile, lnReleaseFlag *return p_input_form && numai pentru teste LOCAL v_codcl,v_codpr,poz_delimitator,poz_egal lnReleaseFlag=0 && pastreaza serverul incarcat in memorie SET SAFETY OFF DECLARE INTEGER GetPrivateProfileString IN win32api STRING,STRING,STRING,; STRING @, INTEGER,STRING adresaIP = SPACE(500) nlen = GetPrivateProfileString("FOXISAPI","Remote Host","",@adresaIP,LEN(adresaIP),lcIniFile) adresaIP= LEFT(m.adresaIP,m.nlen) ** extragem numarul de inregistrare pe care se afla browser-ul x=AT('NR_INREGISTRARE=',p_input_form) trunc_sir=RIGHT(p_input_form,LEN(p_input_form)-(x+15)) x=AT('&',trunc_sir) v_nr_inregistrare=VAL(LEFT(trunc_sir,x-1)) && v_nr_inregistrare trebuie transformat in tip numeric SELECT facturi GO v_nr_inregistrare a_fost_pozitionare=.F. * vom folosi operatorul $ pentru a verifica daca un sir de caractere se regaseste in altul. &RQFUHW� YRP F�XWD QXPHOH EXWRQXOXL FH D IRVW DSDVDW SHQWUX D VWL FH WUHEXLH VD IDFHP DO CASE CASE “primul=”$p_input_form a_fost_pozitionare=.T. GO TOP CASE “anterior=”$p_input_form a_fost_pozitionare=.T. SKIP -1 IF BOF() SKIP 1 ENDIF CASE “urmator=”$p_input_form a_fost_pozitionare=.T. SKIP 1 IF EOF() SKIP -1 ENDIF CASE “ultimul=”$p_input_form a_fost_pozitionare=.T. GO BOTTOM ENDCASE IF a_fost_pozitionare=.T. RETURN THIS.gen_html(adresaIP) ENDIF DO CASE

Page 25: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 501

CASE 'modifica='$p_input_form && utilizatorul a apasat butonul de comitere a modificarilor THIS.comite_modificari(p_input_form,v_nr_inregistrare) IF a_fost_o_eroare<>'nu' RETURN a_fost_o_eroare ELSE RETURN THIS.gen_html(adresaIP) ENDIF ENDCASE

RETURN

FUNCTION comite_modificari LPARAMETER p_sir_preluat,p_inreg_curenta ** ne vom pozitiona pe inregistrarea corespunzatoare in Facturi SELECT facturi GO p_inreg_curenta SET DATA TO vinzari nrfact_=facturi.nrfact IF !USED("vliniifact_1") USE vliniifact_1 IN 0 ENDIF REQUERY("vliniifact_1") THIS.parsing_input_form(p_sir_preluat) ** cursorul Cparsing generat de metoda anterioara cuprinde numele obiectelor de pe formular si **valorile lor SELECT valoarecontrol FROM cparsing ; WHERE ALLTRIM(LOWER(numecontrol)) IN ("txtnrfact","txtdatafact","cboclient","cbogestiune"); INTO ARRAY a_modif_facturi ** efectuam modificarile in Facturi daca e nevoie IF VAL(a_modif_facturi(1))<>facturi.nrfact REPLACE facturi.nrfact WITH VAL(a_modif_facturi(1)) ENDIF IF VAL(a_modif_facturi(3))<>facturi.codcl REPLACE facturi.codcl WITH VAL(a_modif_facturi(3)) ENDIF IF ALLTRIM(a_modif_facturi(4))<>ALLTRIM(facturi.gestiune) REPLACE facturi.gestiune WITH ALLTRIM(a_modif_facturi(4)) ENDIF * efectuam modificarile in view, acolo unde este cazul, pe baza numarului de linie ce se regaseste * in numele obiectelor de pe formular SELECT vliniifact_1 a_fost_modificare=.F.

SCAN nr_rec=ALLTRIM(STR(RECNO())) **ordinea din cursor o stim ; si sigur avem tot atatea linii in pagina web cate in view SELECT valoarecontrol FROM cparsing ; WHERE ALLTRIM(LOWER(numecontrol)) IN ("cboprod"+nr_rec,"txtcant"+nr_rec,"txtpret"+nr_rec); INTO ARRAY a_modif_linie IF vliniifact_1.codpr<>VAL(a_modif_linie(1)) REPLACE vliniifact_1.codpr WITH VAL(a_modif_linie(1)) a_fost_modificare=.T. ENDIF

IF vliniifact_1.cantitate<>VAL(a_modif_linie(2)) REPLACE vliniifact_1.cantitate WITH VAL(a_modif_linie(2))

Page 26: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

502 Visual FoxPro

a_fost_modificare=.T. ENDIF IF vliniifact_1.pretunit<>VAL(a_modif_linie(3)) REPLACE vliniifact_1.pretunit WITH VAL(a_modif_linie(3)) a_fost_modificare=.T. ENDIF IF a_fost_modificare=.T. x=TABLEUPDATE() IF x=.F. TABLEREVERT() ENDIF a_fost_modificare=.F. ENDIF

ENDSCAN RETURN

FUNCTION parsing_input_form

LPARAMETER p_input poz_delimit_stg=0 CREATE CURSOR cparsing(numecontrol c(50), valoarecontrol c(50)) FOR i=1 TO LEN(p_input) IF SUBSTR(p_input,i,1)="&" && am ajuns la un delimitator ** vom extrage bucata de sir din stanga pana la delimitatorul anterior ** va iesi ceva de genul: numecontrol=valoare sir_extras=SUBSTR(p_input,poz_delimit_stg+1,i-1-poz_delimit_stg) * repartizam bucatile de sir din stg. si dr. egalului THIS.repartizare(sir_extras) poz_delimit_stg=i ENDIF ENDFOR ** metoda "repartizare" mai trebuie lansata o data pentru a extrage si ultimul Txtpret ** pentru ca acesta nu mai este urmat de un delimitator sir_extras=SUBSTR(p_input,poz_delimit_stg+1,LEN(p_input)) THIS.repartizare(sir_extras)

RETURN

FUNCTION repartizare LPARAMETER p_sir ** separam sirul din stanga egalului de cel din dreapta poz_egal=0 FOR m=1 TO LEN(p_sir) IF SUBSTR(p_sir,m,1)="=" poz_egal=m ENDIF ENDFOR sir_dreapta=LEFT(p_sir,poz_egal-1) sir_stanga=RIGHT(p_sir,LEN(p_sir)-poz_egal) INSERT INTO cparsing VALUES (sir_dreapta,sir_stanga)

RETURN

Page 27: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 503

FUNCTION gen_html LPARAMETERS p_adresaIP PUBLIC nrfact_ nrfact_=facturi.nrfact SET DATA TO vinzari IF !USED("vliniifact_1") USE vliniifact_1 IN 0 ENDIF REQUERY("vliniifact_1")

v_text_html=; [<HTML>]+CR+[<BODY bgcolor="#C0C0C0">]+CR+; [<BODY>]+CR+; [<H2> <b><i>FORMULAR FACTURI</i></b></H2><HR><p>Inregistrare curenta: ]+;

STR(RECNO("facturi"))+CR+; [<FORM method="POST" ACTION="/scripts/foxisapi.dll/web_Test1.actualizari.actiune">]+CR+; [<p align="center">]+CR+; [<input type="submit" name="primul" value="Prima"><input type="submit" name="anterior" ; value="Anterior"><input type="submit"]+; [ name="urmator" value="Urmator"><input type="submit" name="ultimul" value="Ultima">]+CR+; [<input name="NR_INREGISTRARE" type="hidden" value = ]+ ; ALLTRIM(STR(RECNO("facturi")))+[><p>]+CR+; [<table border="0" width="100%">]+CR+; [ <tr>]+CR+; [ <td width="21%"><b>Numar factura:</b></td>]+CR+; [ <td width="79%"><input type="text" name="TxtNrfact" size="20"

value=]+STR(facturi.nrfact)+[></td>]+CR+; [ </tr>]+CR+; [ <tr>]+CR+; [ <td width="21%"><b>Data Factura:</b></td>]+CR+;

[ <td width="79%"><input type="text" name="TxtDatafact" size="20" value=]+; DTOC(facturi.datafact)+[></td>]+CR+;

[ </tr>]+CR+; [ <tr>]+CR+; [ <td width="21%"><b>Client:</b></td>]+CR+; [ <td width="79%"><SELECT NAME="CboClient" size="1"> ]+CR ** vom adauga obiectele de tip lista. Valoarea implicit selectata va fi valoarea curenta a clientului ** sau gestiunii din tabela Facturi v_codcl=facturi.codcl x=SEEK(v_codcl,"clienti","codcl") && cauta si pozitioneaza pe numele clientului din factura

curenta v_dencl=clienti.dencl v_gestiune=facturi.gestiune x=SEEK(v_gestiune,"gestiuni","gestiune") v_dengest=gestiuni.den_gest v_text_html=v_text_html+; [<OPTION SELECTED VALUE=]+ALLTRIM(STR(v_codcl))+[>]+ ALLTRIM(v_dencl)+CR SELECT clienti SCAN FOR codcl<>v_codcl v_text_html=v_text_html+; [<OPTION VALUE=]+ALLTRIM(STR(clienti.codcl))+[>]+ALLTRIM(clienti.dencl)+CR ENDSCAN

Page 28: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

504 Visual FoxPro

v_text_html=v_text_html+; [</SELECT></td>]+CR+; [ </tr>]+CR+; [ <tr>]+CR+; [ <td width="21%"><b>Gestiune:</b></td>]+CR+; [ <td width="79%"><SELECT NAME="CboGestiune" size="1"> ]+CR+; [<OPTION SELECTED VALUE=]+ALLTRIM(v_gestiune)+[>]+ ALLTRIM(v_dengest)+CR SELECT gestiuni SCAN FOR gestiune<>v_gestiune v_text_html=v_text_html+; [<OPTION VALUE=]+ALLTRIM(gestiuni.gestiune)+[>]+ALLTRIM(gestiuni.den_gest)+CR ENDSCAN

v_text_html=v_text_html+; [</SELECT></td>]+CR+; [ </tr>]+CR+; [</table>]+CR+; [<HR>]+CR+; [<p align="center">]+CR+; [<input type="submit" name="modifica" value="Salvez Modificari"><input type="reset" ; value="Anulez Modificari"><p>]+CR ** adaugam liniile facturii ** incepem cu generarea capului de tabel v_text_html=v_text_html+; [<table border="3" width="100%">]+CR+; [ <tr>]+CR+; [ <td width="1%" align="center"><b>Linie</b></td>]+CR+; [ <td width="12%" align="center"><b>Produs</b></td>]+CR+; [ <td width="27%" align="center"><b>Cantitate</b></td>]+CR+; [ <td width="20%" align="center"><b>Pret</b></td>]+CR+; [ </tr>]+CR SELECT vliniifact_1 **continuam cu generarea liniilor efective preluate din view SCAN text_linie_de_adaugat=”” SELECT codpr,denpr FROM produse WHERE produse.codpr<> vliniifact_1.codpr; INTO ARRAY elemente_combo nume_controlCombo="CboProd"+ALLTRIM(STR(RECNO())) nume_controlTxtcant="TxtCant"+ALLTRIM(STR(RECNO())) nume_controlTxtpret="TxtPret"+ALLTRIM(STR(RECNO())) text_elemente_combo='' FOR I=1 TO ALEN(elemente_combo,1) && pentru toate liniile din matricea generata anterior text_elemente_combo=text_elemente_combo+;

[<OPTION VALUE=]+ALLTRIM(STR(elemente_combo(I,1)))+[>]+ALLTRIM(elemente_combo(I,2))+CR

ENDFOR text_linie_de_adaugat=; [<tr>]+CR+; [<td width="1%">]+CR+; [ <p align="left">]+ALLTRIM(STR(RECNO()))+[</td>]+CR+; && asta-i numarul liniei [<td width="12%">]+CR+; [ <p align="center"><SELECT NAME=]+nume_controlCombo+[ size="1"> ]+CR+; [<OPTION SELECTED VALUE=]+ALLTRIM(STR(vliniifact_1.codpr))+[>]+vliniifact_1.denpr+CR+; text_elemente_combo+; && are deja CR de la ultimul element generat din FOR [</SELECT></td>]+CR+; [ <td width="27%">]+CR+; [ <p align="center"><input type="text" name=]+nume_controlTxtcant+[ size="20" value=]+;

Page 29: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 505

ALLTRIM(STR(vliniifact_1.cantitate))+[></p>]+CR+; [ </td>]+CR+; [ <td width="20%">]+CR+; [ <p align="center"><input type="text" name=]+nume_controlTxtpret+[ size="20" value=]+; ALLTRIM(STR(vliniifact_1.pretunit))+[></p>]+CR+; [ </td>]+CR+; [ </tr>]+CR v_text_html=v_text_html+text_linie_de_adaugat ENDSCAN v_text_html=v_text_html+; [</table>]+CR+; [<p><H4> ADRESA BROWSER-ULUI: ]+p_adresaIP+[</h4>]+CR+; [</form>]+CR+; [</body>]

RETURN v_text_html FUNCTION DESTROY

CLOSE DATA ALL RETURN ENDDEFINE

'HúL� OD SULPD YHGHUH� PHWRGD GenHtml SDUH FRPSOLFDW�� HD VH UHDOL]HD]� IRDUWH VLPSOX

GDF� XWLOL]�P XQ HGLWRU HTML pentru generarea formularului cu date de test pentru FRQWURDOH� GXS� FDUH LQWHUYHQLP vQ FRGXO-VXUV� QXPDL SHQWUX D JHQHUD HOHPHQWHOH OLVWHORU úL

YDORDUHD FXUHQW� SHQWUX ILHFDUH RELHFW vQ SDUWH� 2EVHUY�P vQ OLVWLQJXO GH PDL VXV úL XWLOL]DUHD IXQF LHL $3, GetPrivateProfile

String() , FX DMXWRUXO F�UHLD SXWHP RE LQH GLYHUVH LQIRUPD LL GLQ ILúLHUXO GH LQL LDOL]DUH

creat de foxisapi.dll OD ILHFDUH H[HFX LH D XQHL FRPSRQHQWH &20� &RQ LQXWXO XQXL

DVHPHQHD ILúLHU vO UHJ�VLP vQ OLVWLQJXO XUP�WRU�

/LVWLQJ ����� )LúLHU �ini creat de foxisapi .dll OD LQVWDQ LHUHD FRPSRQHQWHL Actualizari

[FOXISAPI] Request Method=GET Query String= Logical Path=/web_test1.actualizari.start_page Physical Path=C:\Inetpub\wwwroot\web_test1.actualizari.start_page FoxISAPI Version=FoxISAPI v1.2 Request Protocol=HTTP/1.1 Referer=/scripts/foxisapi.dll Server Software=Microsoft-IIS/5.0 Server Name=webtest Server Port=80 Remote Host=194.176.165.152 Remote Address=194.176.165.152 [ALL_HTTP] HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-

powerpoint, application/vnd.ms-excel, application/msword, */* HTTP_ACCEPT_LANGUAGE=en-us HTTP_CONNECTION=Keep-Alive HTTP_HOST=webtest HTTP_REFERER=http://webtest/ HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; .NET CLR 1.0.2914) HTTP_ACCEPT_ENCODING=gzip, deflate [Accept] image/gif=Yes

Page 30: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

506 Visual FoxPro

image/x-xbitmap=Yes image/jpeg=Yes image/pjpeg=Yes application/vnd.ms-powerpoint=Yes application/vnd.ms-excel=Yes application/msword=Yes */*=Yes [SYSTEM] GMT Offset=7200

14.5. �0DQDJHUXO�LQVWDQ HORU�Pultiple în FoxISAPI

'XS� FXP SUHFL]DP úL OD vQFHSXWXO FDSLWROXOXL� RULFH DSOLFD LH 9LVXDO )R[3UR HVWH GH WLS

monofir (single-threaded), pe când extensia ISAPI este multifir (multi-threaded). Ca XUPDUH� VLQJXUD PRGDOLWDWH GH D EHQHILFLD GH DYDQWDMXO SURFHV�rii simultane a mai multor FHUHUL GH DFFHV OD DFHHDúL FRPSRQHQW� &20 FRQVW� vQ XWLOL]DUHD XQRU LQVWDQ H PXOWLSOH DOH

DFHVWHLD� $VWIHO� vQ WLPS FH R LQVWDQ � D VHUYHUXOXL SUHLD R FHUHUH FH GHWHUPLQ� SUHOXFU�UL

FHYD PDL VXEVWDQ LDOH� R DOW� LQVWDQ � SRDWH SUHOXD R FHUHUH LGHQWLF� VDX GH XQ DOW WLS �FDUH

SRDWH IL HYHQWXDO UH]ROYDW� vQWU-un timp mai scurt).

Figura 14.5�� 5H]ROYDUHD VLPXOWDQ� D PDL PXOWRU FHUHUL SULQ LQVWDQ LHUHD PXOWLSO�

D DFHOXLDúL VHUYHU COM

Figura de mai sus SUH]LQW� R VLWXD LH GH PDQDJHPHQW DO PDL PXOWRU FHUHUL VSUH DFHODúL

VHUYHU &20� SRUQLQG GH OD SUHPLVD F� SXWHP DYHD PD[LP WUHL LQVWDQ H FH SRW H[LVWD

VLPXOWDQ� 2EVHUY�P F� FHUHULOH FH DSDU LQ SULPLORU WUHL FOLHQ L �[� \ úL ]� VXQW WULPLVH VSUH

prelucrare îQ SDUDOHO WRW DWkWRU LQVWDQ H DOH VHUYHUXOXL� ÌQ DFHVW WLPS� R D SDWUD FHUHUH HVWH

PHQ LQXW� vQWU-R ]RQ� GH PHPRULH vQ DúWHSWDUHD HOLEHU�ULL XQHLD GLQWUH HOH� 3HQWUX FD )R[,6$3, V� DSHOH]H OD PDQDJHUXO GH LQVWDQ H� WUHEXLH V� DG�XJ�P vQ ILúLHUXO

de configurare foxisapi.ini GRX� QRL OLQLL GH FRG� QXPHOH FRPSRQHQWHL &20 vQWUH

SDUDQWH]H S�WUDWH úL QXP�UXO PD[LP GH LQVWDQ H FH YRU SXWHD IL FUHDWH� ÌQ XUPD DFHVWHL

LQWHUYHQ LL� ILúLHUXO GH FDUH YRUELP YD DU�WD FD vQ OLVWLQJXO �����

/LVWLQJ ����� &RQ LQXWXO ILúLHrului Foxisapi.ini

[foxisapi] busytimeout=30 releasetimeout=40 statusurl=Status reseturl=Reset

Page 31: Capitolul 14 -   · PDF fileV PDL LQWURGXFHP R GDW QXPHOH FODVHL vQ ]RQD GH GHVFULHUH Description. ... [HFXW GLYHUVH SUHOXFU UL LQWHUQH , apelate exclusiv de alte metode

$SOLFD LL 9LVXDO )R[3UR SH :HE 507

SingleModeUrl=SingleMode MultiModeUrl=MultiMode [web_test1.actualizari] web_test1.actualizari=3 ([WHQVLD )R[,6$3, GLVSXQH úL GH GRX� PHWRGH SURSULL� • Status – cX DMXWRUXO HL SXWHP DIOD LQIRUPD LL GHVSUH LQVWDQ HOH VHUYHUHORU &20

DIODWH vQ H[HFX LH OD XQ PRPHQW GDW �ILJXUD ������� • Reset – vQFKLGH WRDWH LQVWDQ HOH VHUYHUHORU UH]LGHQWH vQ PHPRULH OD XQ PRPHQW

GDW úL UHVHWHD]� SDUDPHWULL GH VWDUH� Ele pot fi apelate astfel: http://webtest/scripts/foxisapi.dll/status.

Figura 14.60. Metoda Status a extensiei FoxISAPI