市场营销第七章TUXEDO的客户端编程 融金教育_第1页
市场营销第七章TUXEDO的客户端编程 融金教育_第2页
市场营销第七章TUXEDO的客户端编程 融金教育_第3页
市场营销第七章TUXEDO的客户端编程 融金教育_第4页
市场营销第七章TUXEDO的客户端编程 融金教育_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第七章:TUXEDO的客户端编程7.1 Tuxedo的客户端简介:tuxedo有两种客户端: 本地客户端和远程客户端。NATIVE CLIENT(本地客户端): 是指与TUXEDO服务器在同一台机器上,不用通过网络就可以访问到TUXEDO服务器的客户端 。WORSTATION CLIENT(本地客户端):是指要通过网络才可以访问到TUXEDO服务器的客户端。下图为TUXEDO应用系统的客户端访问TUXEDO服务器上的服务的过程图。说明:WS(Workstation Extension Product) 用于指TUXEDO产品的客户端部分WSC Workstation ClientWSL(Wor

2、kstation Listener)TUXEDO系统自带的一个SERVER,它侦听一个指定的端口,WSC最初与该SERVER建立连接WSH(Workstation Handler)TUXEDO系统自带的一个SERVER,由它处理WSC与TUXEDO SERVER之间的通讯。Bulletin Board(公告板)TUXEDO把系统的配置保存在一个共享内存中,该共享内存称为公告板(BB)BBLTUXEDO的管理进程,主要对公告板等进行管理Workstation Client与TUXEDO SERVER建立连接的过程为:WSC 调用tpinit()或tpchkauth()WSC采用在WSNADDR中

3、指定的IP地址与服务端的WSL建立连接WSL为该WSC指定一个WSH,并把该WSH的侦听端口返回给WSCWSC采用返回的端口与指定的WSH建立连接,并与WSL断开连接,这之后WSC与TUXEDO SERVER之间的通讯通过WSH进行处理,与WSL无关。tpinit()或tpchkauth()调用返回。本地客户端与远程客户端的主要区别本地客户端只能用C语言或COBAL语言编写,远程客户端可以用几乎所有的编程语言编写。在远程客户端所在的机器上要安装TUXEDO的客户端软件,并且在设置相应的环境变量;在本地客户端上不用用buildclient编译远程客户端程序时要加 W,编译本地客户端则不用与远程客

4、户端有关的配置:在MACHINES中要配置MAXWSCLIENTS,即最多可以有多少个远程客户端同时连接到该服务器上。在SERVERS中要配置SERVER:WSLWSL SRVGRP=GROUP1 SRVID=1116 CLOPT=-A - -n /13:8888 -m 2 -M 5 -x 6CLOPT中可带的参数为:CLOPT= -A servopts_options - -n netaddr -d device -w WSHname-t timeout_factor-T Client_timeout -m minh-M maxh-x mpx_factor -p m

5、inwshport-P maxwshport -I init_timeout-c compression_threshold -k compression_threshold -z bits-Z bits-H external_netaddr -N network_timeout-Kclient|handler|both|none参数说明:-n netaddr: WSL的侦听端口,远程客户端通过该端口与服务器建立连接-m minh : 最少启动多少个WSH进程-M maxh: 最多启动多少个WSH进程,默认值为MAXWSCLIENTS/m-x mpx_factor:每个WSH进程可以同时与多少

6、个远程客户端建立连接-c compression_threshold如果在远程客户端与服务器之间传送的数据包大小(单位为字节)超过-c指定的参数,就自动进行数据压缩,-T Client_timeout: 指定一个远程客户端的空闲时间,如果该远程客户端在client_timeout这么长的时间内没有做任何调用,WSH将断开与该远程客户端的连接。单位为分钟,如果没有指点该参数,那么WSH永远不会自动断开远程客户端的连接-t timeout_factor: 指定远程客户端与WSH建立连接的时间,如果在-t指定的时间内还没有建立连接,那么连接将失败。如果没有采用安全认证方式默认为3*SCANUNIT秒

7、,。如果采用安全认证方式默认为6*SCANUNIT秒,-p minwshport-P maxwshport:指定WSH可以使用的端口范围:如果远程客户端要跨越防火墙才能访问该TUXEDO应用系统,在WSL中要指定该参数,指定WSH可以使用的端口范围,并让防火墙允许访问这些端口。如果不指定,TUXEDO会根据系统端口的使用情况进行分配,而分配的端口防火墙不允许通过,造成CLIENT无法调用TUXEDO SERVER。如下面的设置指定WSH可用的端口范围为17010 17030。WSLSRVGRP=GROUP1SRVID=1CLOPT=-A - -n /6:17009 -m

8、10 -M 10 -x 10 -p 17010 -P 17030在远程客户端的机器上要设置的环境变量TUXDIR (必需):TUXEDO客户端在该机器上的安装目录WSNADDR(必需):远程客户端通过该IP地址与服务器建立连接,它的值为-n参数的值,如在上面的配置中为:SET WSNADDR= /13:8888WSTYPE(可选): 该客户端的类型,如果与服务器的类型一样,那么在它们之间进行数据传送时不用进行编码解码工作。其他不常用的环境变量可参考TUXEDO的联机文档。客户端的编程模式:在3层结构中,CLIENT是属与表示层,表示层主要处理与用户交互,它的功能可概括

9、为:1、提供应用的用户交互接口,即主要通过图形化的用户界面,取的用户的输入数据2、与TUXEDO 应用服务器建立连接3、调用TUXEDO应用服务器上的服务(SERVICE),把客户端的输入参数放入输出缓冲区。4、TUXEDO应用服务器调用相应的SERVICE处理客户端的请求,把处理结果通过客户端的输入缓冲区返回给客户端。 客户端与服务端之间的通讯方式有以下几种:1、同步调用:2、异步调用3、会话方式:4、可靠消息队列5、广播方式6、发布/订阅在下一章我们再具体介绍7.2 CLIENT的ATMI介绍客户端通过调用TUXEDO提供的编程API(ATMI)来编写程序,下面介绍一些客户端主要的ATMI

10、与连接的建立与断开有关的ATMI为了与TUXEDO SERVER建立连接,TUXEDO CLIENT要调用TPCHKAUTH()检查该TUXEDO SERVER所采用的安全方式,并根据得到的值做相应的处理,然后调用TPINIT()建立与TUXEDO的连接,在TUXEOD SERVER的结果返回之后,调用TPTERM()断开与TUXEDO SERVER的连接.int tpchkauth()描述: 检查该TUXEDO SERVER所采用的安全方式参数:无返回值: TPNOAUTH:不需要认证 TPSYSAUTH:需要口令认证 TPAPPSUTH:需要口令认证,并且还需要应用级的认证或授权. -1:

11、调用失败, 错误号保存在全局变量tperrno中。int tpinit(TPINIT *tpinfo)描述: 与TUXEDO SERVER建立连接参数:TPINFO返回值: 失败返回-1, 错误号保存在全局变量tperrno中。TPINIT结构体在atmi.h中的定义如下structtpinfo_t charusrnameMAXTIDENT+2;/* client user name */charcltnameMAXTIDENT+2;/* application client name */charpasswdMAXTIDENT+2;/* application password */char

12、grpnameMAXTIDENT+2;/* client group name */longflags;/* initialization flags */longdatalen;/* length of app specific data */longdata;/* placeholder for app data */;typedefstructtpinfo_t TPINIT;说明:username,cltname,passwd,grpname,data,datalen用于安全认证中flags:用于定义以何种方式通知该客户端一个UNSOLICTED MESSAGE的到来.它的值可以为:TP

13、U-SIGTPU-DIPTPU-IGNTPSA-FASTPATHTPSA-PROTECTEDint tpterm()描述: 断开与TUXEDO SERVER建立连接参数:无返回值: 失败返回-1, 错误号保存在全局变量tperrno中。与请求TUXEDO SERVER 有关的ATMIint tpcall(char *svc, char *idata, long ilen, char *odata, long *olen, long flags)描述:客户端同步调用服务端的名为svc的SERVICE,参数: *svc:SERVICE的名称char *idata: 输入缓冲区的地址,客户端传给服务

14、端的参数放在该缓冲区内long ilen: 输入缓冲区的长度char *odata 输出缓冲区的地址,服务端传给客户端的结果放在该缓冲区内long *olen:输出缓冲区的长度 long flags: 调用标志,由以下几个:TPNOTRAN如果调用svc的客户端当前在TRANSACTION方式下,那么svc不参与当前的TRANSACTION。TPNOCHANGE如果服务端返回的缓冲区类型与客户端定义的缓冲区(odata)类型不一致,默认情况下,odata会转换成与服务端返回的缓冲区类型一致的类型,如果设置了该FLAG,那么当出现这种情况时,不进行缓冲区类型转换,并且会保错。TPNOBLOCK默

15、认情况下,如果客户端有阻塞条件存在(如CLIENT的TCP/IP中的缓冲区满,磁盘I/O忙等),那么客户端会阻塞在那里,直到阻塞消除或超时出错。如果设置了TPNOBLOCK,当客户端有阻塞条件存在时,TPCALL()会立刻返回并报错. 注意TPNOBLOCK只对发送请求时起作用,如果在接收服务端返回的结果时有阻塞条件存在,客户端会在那里等待,直到阻塞消除或超时出错TPNOTIME如果客户端有阻塞条件存在,客户端会一直阻塞在那里,即使到了超时时间也不返回,但如果该客户端是在TRANSACTION模式下,当到了事务的超时时间,还是会报超时错误并返回。TPSIGRSTRT如果在进行系统调用时,被信号

16、中断,该系统调用会重新进行。调用成功返回0,失败返回-1, 错误号保存在全局变量tperrno中。int tpacall(char *svc, char *data, long len, long flags)描述: 客户端异步调用服务端的名为svc的SERVICE,不等服务端返回结果,程序可继续往下走,在某个地方调用tpgetrply()取的服务端的返回参数:char *svc, char *data, long len参数的含义与tpcall()中的一样flags可设置为:TPNOTRAN, TPNOREPLY, TPNOBLOCKTPNOTIME, TPSIGRSTRT.TPNOTRAN

17、, TPNOBLOCKTPNOTIME, TPSIGRSTRT的含义与与tpcall()中的一样TPNOREPLY:调用tpacall()的客户端不想接收SEVER端的应答。如果设置了TPNOREPLY:服务端不会给该客户端发送应答。返回值: 失败返回-1,成功返回一个HANDLER,可作为tpgetrply的参数,用于取应答int tpgetrply(int *cd, char *data, long *len, long flags)描述:取出服务端对tpacall()的应答。参数: cd tpacall()返回的HANDLERchar *data返回缓冲区的地址,服务端传给客户端的结果放

18、在该缓冲区内long *len:返回缓冲区的长度flags:可以是:TPNOBLOCK, TPNOTIME,TPSIGRSTRT,TPGETANY(不管cd的值,从服务器的应答队列中取第一个可用的消息),TPNOCHANGE返回值: 失败返回-1,错误号保存在全局变量tperrno中。inttpcancel(int handle)描述: 如果当前的程序不处于事务模式中,取消对tpacall()的应答, 如果处于事务模式中,则不能取消对tpacall()的应答,该调用会失败.参数: tpacall()返回的HANDLER返回值: 失败返回-1,错误号保存在全局变量tperrno中。inttpgp

19、rio()描述:返回最近发送(tpcall(),tpacall()或接收(tpgetrply()的一个消息的优先级参数:无返回值: 1-100消息的优先级,值越高, 优先级越高 失败返回-1, 错误号保存在全局变量tperrno中。struct int hdl; /* handle*/int pr; /* priority*/ paSIZE;for (i=0; irequests; i+) /* Determine service and data for request */pa i.hdl = tpacall(Svc, buf, len, flags);/* Save priority u

20、sed to send request */pai.pr = tpgprio();/* Use qsort(3) routine to sort handles in priority order */qsort(char*) pa, requests, sizeof(pa0), cmpfcn);for (i=0; i requests; i+) tpgetrply(&pai.hdl, &rbufp, &rlen, rflags);inttpsprio (int prio, long flags)描述: 设置下一个要发送的消息的优先级参数: 0- prio为相对值, 设置下一个要发送的消息的优

21、先级为现在的优先级加上prioTPABSOLUTE: prio为绝对值, 设置下一个要发送的消息的优先级为prio返回值: 失败返回-1,错误号保存在全局变量tperrno中。与请求错误处理有关的ATMIchar *tpstrerror(int tperrno) 描述:返回错误号为tperrno的错误描述参数: tperrno:在atmi.h中定义的全局变量,用于标识错误号,类似于C中的errno返回值: 失败返回NULL,成功返回错误号为tperrno的错误描述.int tperrordetail(long flags)描述: 返回当前进程或线程最近调用ATMI的出错的更详细的描述参数:设为

22、0返回值: 如果没有错误返回0,有错误返回错误描述号char * tpstrerrordetail(int err, long flags)描述: 返回错误描述号err的详细描述信息参数:err: tperrordetail()的返回值,flags: 设为0返回值: 失败返回NULL,成功返回详细描述信息7.3 采用C语言编写TUXEDO的客户端程序如果是采用C语言编写TUXEDO的客户端程序,可直接采用ATMI的函数,这些函数在atmi.h中定义.采用C语言编写TUXEDO的客户端的例子在此不列举,可参考simpapp,bankapp等例子.采用C语言编写客户端的编译是用buildclien

23、t命令进行的,它的使用格式如下:buildclient -C -v -w | -r rmname -o outfile -f firstfiles -l lastfiles参数说明:-C: 编译用COBOL写的客户端 -v: 输出详细的编译信息-w: 编译成REMOTE CLIENT,如果不带该参数,那么将编译成NATIVE CLIENT.-o: 编译生成的可执行文件名-f: 要编译的C文件名-l: 指定要编译生成该可执行文件名要连接的其他库文件,如果有多个库文件要连接,它们之间用空格隔开.-r: 指定该CLIENT要连接的RMbuildclient 调用C或C+编译器来进行编译工作.所以客户

24、端所在的机器要有C,C+编译器才能编译C客户端的程序.如果是WINDOWS客户端,可安装VC,并在DOS环境下编译C客户端的程序. 如果在安装VC时没有把自动设置环境变量的选项选上,VC中设置环境变量的文件在VC安装目录下的binvcvars32.bat中,可手工执行它或在设置环境变量的文件中用CALL调用它,如:call d:vs6vc98binvcvars32.batset TUXDIR=d:tuxedo65set WSNADDR=/4:9000set APPDIR=d:tuxdemoconnset PATH=%TUXDIR%bin;%APPDIR%;%PATH%se

25、t TUXCONFIG=%APPDIR%tuxconfigset FIELDTBLS=%APPDIR%myfmlset FLDTBLDIR=%APPDIR%如果是UNIX客户端,可安装CC,GCC等C或C+编译器.并在CC环境变量中设置所用的C编译器路径.7.4 采用VC编写TUXEDO客户端程序采用VC编写客户端程序与采用C语言编写客户端的方式一样,但要对VC要进行一些设置才能进行编译,说明如下:在/project/setting/link下的object/library modules中加上wtuxws32.lib,如图所示:在tools/options/directories下的show

26、 direcries中选include files,然后加上TUXEDO的INCLUDE目录,如图所示:3. 在tools/options/directories下的show direcries中选library files,然后加上TUXEDO的LIB目录,如图所示:7.5采用PB编写客户端程序1. ATMI函数的声明对PB,VB,DELPHI,VC等客户端,TUXEDO提供一个DLL编程接口,该DLL文件名为wtuxws32.dll,首先要在这些语言中声明所要用到的函数。因为PB中没有指针,我们把它们声明为LONG型。如果是双重指针,可声明为ref long. 下面声明采用PB编写CLIE

27、NT段程序常用到的函数function integer tpinit( long tpinfo ) library wtuxws32.dllfunction integer tpterm( ) LIBRARY wtuxws32.dllfunction long tpalloc( string buftype, string subtype, long bufsize ) LIBRARY wtuxws32.dllfunction long lstrcpyPtr( long buffer, string str ) library kernel32.dll alias for lstrcpyfun

28、ction long lstrcpyStr( ref string str, long buffer ) library kernel32.dll alias for lstrcpyfunction integer tpcall(string svcname, long ibuffer , long ilen, ref long obuffer, ref long olen, long flags ) library wtuxws32.dllsubroutine tpfree( long buffer ) library wtuxws32.dllfunction integer gettper

29、rno( ) library wtuxws32.dllfunction string tpstrerror( integer errno ) library wtuxws32.dllfunction integer tperrordetail( long flag ) library wtuxws32.dllfunction string tpstrerrordetail( integer errno, long flag ) library wtuxws32.dllfunction integer fchgd32( long fbfr, long fldif, long occ,ref do

30、uble buf, long flen ) library wtuxws32.dll alias for Fchg32function integer fchgl32( long fbfr, long fldif, long occ,ref long buf, long flen ) library wtuxws32.dll alias for Fchg32function integer fchgs32( long fbfr, long fldif, long occ, string buf, long flen ) library wtuxws32.dll alias for Fchg32

31、function integer getFerror32() library wtuxws32.dll alias for getFerror32function string Fstrerror32(integer errno) library wtuxws32.dll alias for Fstrerror32function integer fgets32( long fbfr, long fldid, long occ, ref string buf, ref long flen ) library wtuxws32.dll alias for Fget32function integ

32、er fgetd32( long fbfr, long fldid, long occ, ref double buf, ref long flen ) library wtuxws32.dll alias for Fget32function integer fgetl32( long fbfr, long fldid, long occ, ref long buf, ref long flen ) library wtuxws32.dll alias for Fget32function long focc32( long fbfr, long fldid ) library wtuxws

33、32.dll alias for Foccur32function long fneeded32( long occ, long len) library wtuxws32.dll function long flen32( long fbfr, long id, long occ) library wtuxws32.dll alias for Flen32function long fprint32( long fbfr) library wtuxws32.dll alias for Fprint32Function Long foccur32(Long RCVBUF,long FLDID

34、) LIBRARY wtuxws32.dll alias for Foccur32Function Long finit32(Long RCVBUF,long BUFSIZE) LIBRARY wtuxws32.dll alias for Finit32Function Long tprealloc (Long buffer , Long BUFSIZE ) LIBRARY wtuxws32.dllfunction long fsizeof32(long fbfr) library wtuxws32.dllfunction integer tpenqueue( string qspace,st

35、ring qname, REF TPQCTL ctl, long data, long len, long flags) library wtuxws32.dll function integer tpdequeue( string qspace,string qname, REF TPQCTL ctl, REF long data, REF long len, long flags) library wtuxws32.dll 2. FML(FML32)缓冲区的定义在C,C+中FML32缓冲区中字段的ID在*.H文件中定义,在PB中可以把它们定义为常量3.编程方式的改变在两层的C/S结构中,客

36、户端直接访问数据库,当采用TUXEDO中间件后,形成三层结构。这时,客户端不直接访问数据库,而是改为调用中间件TUXEDO服务端上的服务,由TUXEDO服务端访问数据库,并把结果返回给客户端。所以这时候客户端上不用安装数据库的客户端,PB中的数据窗口的数据源也只能采用外部数据源。因为PB不能直接与数据库建立连接.4.对存储过程的处理推荐的做法是把存储过程转换为TUXEDO 的SERVICE,这样做工作量比较大,但是完全的3层结构,另一种方式是存储过程不变,用一个TUXEDO 的SERVICE去调用该存储过程,把结果返回给客户端.4.例子下面我们举两个例子来说明在PB中编写TUXEDO客户端程序

37、的方法.为了方便在例子中调用,我们重新定义对FML32缓冲区进行操作的函数如下:int pchgd32(long fbfr,long fldid,long occ,double buf)/*作用:写一个浮点型数据到FML32缓冲区的指定位置中输入参数:fbfr: FML32缓冲区fldid: ID号occ: 位置buf: 要写入的浮点型数据输入参数:无返回值: 0 成功,-1失败*/long flen =0long ferror =0flen=Flen32(fbfr,fldid,0);if fchgd32(fbfr,fldid,occ,buf,flen) = -1 thenferror = g

38、etferror32()MessageBox( pchgd32( + string(fldid) + )出错: ,fstrerror32(ferror)return -1end ifreturn 0int pchgl32(long fbfr,long fldid,long occ,long buf)/*作用:写一个整型数据到FML32缓冲区的指定位置中输入参数:fbfr: FML32缓冲区fldid: ID号occ: 位置buf: 要写入的整型数据输入参数:无返回值: 0 成功,-1失败*/long flen =0long ferror =0flen=Flen32(fbfr,fldid,0);

39、if fchgl32(fbfr,fldid,occ,buf,flen) = -1 thenferror = getferror32()MessageBox( pchg32( + string(fldid) +)出错: ,fstrerror32(ferror)return -1end ifreturn 0int pchgs32(long fbfr,long fldid,long occ,string buf)/*作用:写一个字符型数据到FML32缓冲区的指定位置中输入参数:fbfr: FML32缓冲区fldid: ID号occ: 位置buf: 要写入的字符型数据输入参数:无返回值: 0 成功,失

40、败返回相应的*/long ll_len=0long ll_error=0ll_len=len(buf)if fchgs32(fbfr,fldid,occ,buf,ll_len) = -1 thenll_error = getferror32()MessageBox( fchgs32( + string(fldid) + )出错: ,fstrerror32(ll_error)return -1end ifreturn 0int pgetd32(long fbfr,long fldid,long occ, ref double buf)/*作用:从FML32缓冲区的指定位置中取浮点型数据到输入参数

41、BUF中输入参数:fbfr: FML32缓冲区fldid: ID号occ: 位置buf: 取出的数据储存到BUF中输入参数:无返回值: 0 成功,-1失败*/long ll_flen =0long ll_ferror =0double lf_tmp=0if fgetd32(fbfr, fldid, occ, lf_tmp, ll_flen) = -1 thenll_ferror = getferror32()MessageBox( fgetl32( + string(fldid) + )出错: ,fstrerror32(ll_ferror)return -1end ifbuf = lf_tmp

42、return 0int pgetl32(long fbfr,long fldid,long occ, ref long buf)/*作用:从FML32缓冲区的指定位置中取整型数据到输入参数BUF中输入参数:fbfr: FML32缓冲区fldid: ID号occ: 位置buf: 取出的数据储存到BUF中输入参数:无返回值: 0 成功,-1失败*/long ll_flen =0long ll_ferror =0long ll_tmp=0if fgetl32(fbfr, fldid, occ, ll_tmp, ll_flen) = -1 thenll_ferror = getferror32()Me

43、ssageBox( fgetl32( + string(fldid) + )出错: ,fstrerror32(ll_ferror)return -1end ifbuf = ll_tmpreturn 0int pgetd32(long fbfr,long fldid,long occ, ref string buf)/*作用:从FML32缓冲区的指定位置中取字符型数据到输入参数BUF中输入参数:fbfr: FML32缓冲区fldid: ID号occ: 位置buf: 取出的数据储存到BUF中(长度不能超过1000)输入参数:无返回值: 0 成功,-1失败*/long ll_flen =0long

44、ll_ferror =0string ls_tmplong ll_len=0ll_len = flen32(fbfr,fldid,occ)if ll_len = -1 thenll_ferror = getferror32()MessageBox( flen32()出错: ,fstrerror32(ll_ferror)return -1end ifls_tmp = space(ll_len)if ls_tmp= thenmessagebox(提示,space()出错)return -1end ifif fgets32(fbfr, fldid, occ, ls_tmp, ll_flen) = -

45、1 thenll_ferror = getferror32()MessageBox( fgets32( + string(fldid) + )出错: ,fstrerror32(ll_ferror)return -1end ifbuf = ls_tmpreturn 0例子中用到的FML32文件 myfml的内容:*base1000EMPNO1long-ENAME2string-JOB3stringMGR4longHIREDATE5stringSAL6doubleCOMM7doubleDEPTNO8longROW 9 long - -ERRINFO 10 string - -SQLCODE 11

46、long - -SQLTEXT 12 string - -CROSSTAB13 string - -NODENO14 string - -BEGIN_DATE15 string - -END_DATE16 string - -对应的myfml.h的内容:/*fnamefldid */*- */#defineEMPNO(FLDID32)33555433)/* number: 1001 type: long */#defineENAME(FLDID32)167773162)/* number: 1002 type: string */#defineJOB(FLDID32)167773163)/*

47、number: 1003 type: string */#defineMGR(FLDID32)33555436)/* number: 1004 type: long */#defineHIREDATE(FLDID32)167773165)/* number: 1005 type: string */#defineSAL(FLDID32)134218734)/* number: 1006 type: double */#defineCOMM(FLDID32)134218735)/* number: 1007 type: double */#defineDEPTNO(FLDID32)3355544

48、0)/* number: 1008 type: long */#defineROW(FLDID32)33555441)/* number: 1009 type: long */#defineERRINFO(FLDID32)167773170)/* number: 1010 type: string */#defineSQLCODE(FLDID32)33555443)/* number: 1011 type: long */#defineSQLTEXT(FLDID32)167773172)/* number: 1012 type: string */#defineCROSSTAB(FLDID32

49、)167773173)/* number: 1013 type: string */在PB中的定义为INSTANCE 变量:例子一:在PB中调用EMP_SEL,往EMP表中插入一条记录,并把该表中的记录全部取出,在客户端的数据窗口中显示出来PB客户端数据窗口定义:数据窗口D_EMP的数据源只能采用外部数据源,定义如下:PB客户端程序如下:long ll_sendbuf=0long ll_rcvbuf=0long ll_sendlen=0long ll_rcvlen=0long ll_tperrno=0long ll_empno=1000string ls_ename=scottstring l

50、s_job=computerlong ll_mgr=2345date ld_hiredate = date(2001/01/01)double lf_sal=30000.45double lf_comm=1234.5long ll_deptno=30string ls_tuxerr=long lL_sqlcode=0string ls_sqlerr=long i=0long j=0long ll_row =0string ls_hiredate=dw_emp.reset()/与TUXEDO服务器建立连接if tpinit(0) = -1 thenMessageBox( tpinit() fai

51、lure, tpstrerror(gettperrno(), Information!, OkCancel! )tpterm( )returnend if/分配FML32发送缓冲区ll_sendlen = 12000ll_sendbuf = tpalloc(FML32, , ll_sendlen)if ll_sendbuf = 0 thenMessageBox( tpalloc(ll_sendbuf) failure, tpstrerror(gettperrno(), Information!, OkCancel! )returnend if/分配FML32接收缓冲区ll_rcvlen = 1

52、2000ll_rcvbuf=tpalloc(FML32,ll_rcvlen)if ll_rcvbuf = 0 thentpfree(ll_sendbuf)MessageBox( tpalloc(ll_rcvbuf) failure, tpstrerror(gettperrno(), Information!, OkCancel! )returnend if/清空缓冲区if Finit32(ll_sendbuf,ll_sendlen) = -1 or & Finit32(ll_rcvbuf,ll_rcvlen) = -1 thenMessageBox(Finit32() failure, tps

53、trerror(gettperrno()tpfree(ll_sendbuf)tpfree(ll_rcvbuf)tpterm()returnend if/传给服务器端的参数if pchgl32(ll_sendbuf,EMPNO,0,ll_empno) = -1 or &pchgs32(ll_sendbuf,ENAME,0,ls_ename) = -1 or & pchgs32(ll_sendbuf,JOB,0,ls_job) = -1 or &pchgl32(ll_sendbuf,MGR,0,ll_mgr) = -1 or &pchgd32(ll_sendbuf,SAL,0,lf_sal) =

54、-1 or &pchgd32(ll_sendbuf,COMM,0,lf_comm) = -1 or &pchgl32(ll_sendbuf,DEPTNO,0,ll_deptno) = -1 or &pchgs32(ll_sendbuf,HIREDATE,0,string(ld_hiredate,yyyy/mm/dd) = -1 then/退出时要注意释放已分配的缓冲区,并调用TPTERM()tpfree( ll_sendbuf )tpfree( ll_rcvbuf )tpterm()return end if/调用TUXEDO SERVICEif tpcall( DEMO_SEL, ll_se

55、ndbuf, 0, ll_rcvbuf, ll_rcvlen, 0 ) = -1 thenll_tperrno = gettperrno()MessageBox( tpcall(DEMO_SEL) failure,ll_tperrno= + string(ll_tperrno) + + tpstrerror(ll_tperrno), Information!, OkCancel! )/取出错信息pgetl32(ll_rcvbuf, SQLCODE, 0, ll_sqlcode)pgets32(ll_rcvbuf, ERRTEXT, 0, ls_tuxerr)if ll_sqlcode 0 th

56、enpgets32(ll_rcvbuf, SQLTEXT, 0, ls_sqlerr)messagebox(tpcall(DEMO_SEL) failure,ls_tuxerr+ rn sqlcode= + string(ll_sqlcode) + rnSQLTEXT= + ls_sqlerr)elsemessagebox(tpcall(DEMO_SEL) failure,ls_tuxerr)end if /退出时要注意释放已分配的缓冲区,并调用TPTERM()tpfree(ll_sendbuf)tpfree(ll_rcvbuf)tpterm( )returnend if/取返回的记录数ll_

57、row = pgetl32(ll_rcvbuf, EMPNO, 0, ll_empno)/如果没有数据返回if ll_row =0 then/退出时要注意释放已分配的缓冲区,并调用TPTERM()tpfree( ll_sendbuf )tpfree( ll_rcvbuf )tpterm()messagebox(提示,没有符合条件的记录)returnend if/从返回的缓冲区中取记录并把记录插到数据窗口中for i = 0 to ll_row -1ll_empno=0ls_ename=ls_job=ll_mgr=0ls_hiredate=lf_comm=0lf_sal=0ll_deptno=0

58、if pgetl32(ll_rcvbuf, EMPNO, i, ll_empno) = -1 or &pgets32(ll_rcvbuf, ENAME, i, ls_ename) = -1 or &pgets32(ll_rcvbuf, JOB, i, ls_job) = -1 or &pgetl32(ll_rcvbuf, MGR, i, ll_mgr) = -1 or &pgets32(ll_rcvbuf, HIREDATE, i, ls_hiredate) = -1 or &pgetd32(ll_rcvbuf, COMM, i, lf_comm) = -1 or &pgetd32(ll_rc

59、vbuf, SAL, i, lf_sal) = -1 or &pgetl32(ll_rcvbuf, DEPTNO, i, ll_deptno) = -1 then/退出时要注意释放已分配的缓冲区,并调用TPTERM()tpfree( ll_sendbuf )tpfree( ll_rcvbuf )tpterm()return end ifj=dw_emp.insertrow(0)dw_emp.setitem(j,empno,ll_empno)dw_emp.setitem(j,ename,ls_ename)dw_emp.setitem(j,job,ls_job)dw_emp.setitem(j,m

60、gr,ll_mgr)ld_hiredate=date(ls_hiredate)dw_emp.setitem(j,hiredate,ld_hiredate)dw_emp.setitem(j,comm,lf_comm)dw_emp.setitem(j,sal,lf_sal)dw_emp.setitem(j,deptno,ll_deptno)next /退出时要注意释放已分配的缓冲区,并调用TPTERM()tpfree( ll_sendbuf )tpfree( ll_rcvbuf )tpterm()return例子二:在采用两层结构时,常用PB做CROSS TABLE方式的报表,如何在三层结构中实现

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论