EasyCICS编程_第1页
EasyCICS编程_第2页
EasyCICS编程_第3页
EasyCICS编程_第4页
EasyCICS编程_第5页
免费预览已结束,剩余41页可下载查看

下载本文档

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

文档简介

1、EasyCICS编程我经常听一些人大谈把两层C/S结构的应用转为三层C/S结构的应用,无论说的,还是听的,都兴高采烈,频频点头:好,好!转吧。不过,具体怎么“转”呢?是不是把两层C/S结构的程序放到什么容器里“煮”一下,再取出来就可以“吃”了?当然不行,看来一个“转”字还颇有点儿学问。如果您原来靠游泳过河,那我教您一种划船过河的方法,这条船就是中间件CICS当然您不能靠划船的经验来驱动它,CICS需要的是一一编程。学划船很简单,学CICS编程也一样简单,读了本章的内容就会知道。如果读者想用COBOL或JAVA来开发CICS的服务程序,请参阅CICS的其它技术资料,这里只提供了C语言的例子。不过

2、,这里提供了几乎所有常用的前端开发工具作为CICS客户的例子,也许这正是您所需要的,那么,请认真阅读后面的内容。如果您已经有足够多的预备知识,可以先阅读下一章,在建好一个实验环境后,再回到本章。1建立一个简单的CICS应用1.1 您的第一个CICS程序:GETTIME我们将要看到的这个CICS程序基本没有用到CICS强大的事务处理监控能力,所以更象是一个两层C/S的应用。但是因为它如此简单,我还是把它做为您学习CICS的入门程序。做过UNIX或NT的服务程序(UNIX经常叫DAEMON程序)朋友,会发现CICS服务程序非常容易实现,因为您不必去处理Socket、NamedPipe或FIFO之类

3、的东西。是的,如果不考虑价格因素,用CICS去实现许多一般的服务程序可是个省事的好办法。设想某公司要投资开发一个叫GETTIME的服务程序,其功能是公布服务器的时间,供他们的各种前端客户程序使用。这些程序必须能运行于各种常用的UNIX平台和WINDOWSNT,甚至可以移植到AS400和旧M大型机上。正在公司的编程高手们纷纷摩拳擦掌,准备大干一场时,一个初级的CICS程序员突然宣布他已在5分钟内完成了任务,并将得到一笔可观的报酬一一有这种好事吗?那我们不妨就来看看GETTIME的CICS解决方案。这是C语言作的CICS服务程序的清单(注意,这个源程序可以不加修改的运行在支持CICS的各种操作系统

4、平台上):#include<time.h>#include"easycics.h"voidmain()structtm*newtime;time_taclock;if(InitEasyCics()ExitEasyCics();/*A*/BeginWrite();/*B*/time(&aclock);newtime=localtime(&aclock);SetValue("TIME",asctime(newtime);/*C*/ExitEasyCics();/*D*/清单1-1(gettime.ccs)客户程序更加简单,下面是一

5、些例子:1、ANSIC的客户程序见清单1-2:#include"ec.h"voidmain()chars200;ConnectServer("CICSNT01","TEST","TEST");/*A*/CallProgramAndCommit("GETTIME");/*B*/GetValue("TIME",s);/*C*/puts(s);清单1-2以下是运行结果:D:cics>gettimeThuJan2717:35:142000清单1-32、使用OLE可以支持Wind

6、ows上的各种开发工具,例如:VisualC,VisualBasic,PowerBuilder,Delphi,C+Builder,LotusNotes,InternetExplorer等。下面是VisualBasic的例子(PowerBuilder和Delphi的客户程序几乎可以照搬这段代码):Submain()DimoEcAsObjectDimr%SetoEc=CreateObject("EasyCics.App"),Ar=oEc.ConnectServer("CICSNT01","TEST","TEST"),B

7、oEc.CallProgramAndCommit"GETTIME",CMsgBoxoEc.GetValue("TIME"),DEndSub清单1-4以下是运行结果:图1-13、如果使用JAVA,可以无须重新编译地移植您的程序。下面是JAVA的例子:importeasycics.*;publicclassGetTimestaticpublicvoidmain(StringastrArg口)tryAppoEc=neweasycics.App();/AoEc.ConnectServer("CICSNT01","TEST"

8、,"TEST");/BoEc.CallProgramAndCommit("GETTIME");/CSystem.out.println(oEc.GetValue("TIME");/Dcatch(ServerErrorExceptionse)/ESystem.out.println(se.getMessage();System.out.println(se.getErrorCode();清单1-6以下是运行结果:D:cics>javaGetTimeSatJan2921:22:162000清单1-7我还能罗列出一大堆编程工具访问CI

9、CS的源码,是的,它们非常类似。您可能注意到了GetValuaSetValueConnectServerCallProgramAndCommit,是的,记住这些就差不多了,常用的调用很少,使用CICS确实非常简单。我们先来分析一下服务程序,就是清单1-1展示的C程序。这个程序采用的接口方法叫做EasyCICS,所以我们引入了“easycics.fi头文件,上面列举的那些函数都是EasyCICS的函数。InitEasyCics函数的作用是初始化环境,如果返回值非零,表示初始化失败。ExitEasyCics函数的作用是退出CICS服务程序,并把返回信息传给客户程序。注意,任何情况下退出CICS服务

10、程序,必须调用ExitEasyCics函数,或与其相当的CICSAPI,不能使用操作系统调用exit或_exit等。程序在A处的意思是,如果初始化失败,就退出CICS服务程序。程序在B处调用了BeginWrite函数,表示开始写通信用的公共数据区,它的真正作用是清除该公共数据区。程序在C处调用了SetValue函数,其作用是把一个字符串作为值赋予一个关键字(也是一个字符串),并存储在公共数据区。在这里,“TIME”是关键字,日期和时间字符串(由asctime函数获得)是值。这样做的意义何在?我们可以把很多值赋予不同的关键字,只要根据关键字就可以取出这些值。于是,客户机和服务器就可以利用这种方法

11、进行通信。程序在D处调用了ExitEasyCics函数,任何情况下退出CICS服务程序,必须调用该函数。只有C源程序还不够,我们还需要把它编译成执行文件或库文件(在WindowsNT系统,CICS服务程序最终要被编译成为.DLL文件,即动态连接库)。一些程序员习惯于使用集成编译工具,但无法使用在UNIX等操作系统。我们采用更加通用的makefile方式进行编译。以下是在NT系统中,编译GETTIME服务程序的makeMe(在各种UNIX系统,要进行必要的修改):gettime.dll:gettime.ccssetUSERLIB=easycics.objcicstcl-e-d-lCgettime

12、.ccs清单1-8如果您使用的是CICSforWindowsNT,您可以使用图形界面把编译好的程序(gettime.dll)加入CICS域(region)。请参照如下插图:Sulsyst/ViwwpDescriptionStatusDestroy.Consolem虺苫与ag电eGate*syLi5tenrTwmporwpStorageTerminalTransactionTr必占iemtDat右QueveSLRPCNe”CICSPropertieeStwt.Communiuati印MunitoringPreduct“IBMTraiksactionServerAdministration收件箱C

13、ICSNT01RegiondefimtionStoppedFrogrsffi图1-3(在CICS域中选择program资源设置)图1-5(program资源设置)当然,也可以使用如下指令(注意大小写):cicsadd-cpd-rCICS域名你的程序名(GETTIME)PathName=路彳5RSLKey=public再看看ANSIC的客户程序,就是清单1-2展示的C程序。这个程序采用的接口方法也是EasyCICS,所以我们引入了“ec.h”头文件(注意服务程序使用的是叫做“easycics.h的头文件)。程序在A处执行了ConnectServer函数。该函数的第一个参数是CICS的系统名称,相

14、当于CICS域(Region)的连接字符串;函数的后两个参数分别是CICS的用户名称和口令。程序在B处执行了CallProgramAndCommit函数,我们一般使用此函数来调用服务程序(Program)。该函数的唯一参数就是要调用的CICS的服务程序名称,在此处,即GETTIME程序。程序在C处执行了GetValue函数,此函数通过其参数指定的关键字来获取服务器方面通过SetValue函数来设置的字符用值。注意,可以通过多个SetValue和GetValue函数来传递多个字符串值。另外,如果客户机方面调用SetValue函数,而服务器方面调用GetValue函数也完全可以。SetValue和

15、GetValue函数对是EasyCICS传递值的标准方法之一。这个客户程序的makefile如下:all:gettime.exegettime.exe:gettime.objlinkgettime.objec.objcclwin32.libgettime.obj:gettime.ccl-cgettime.c清单1-9再看看使用VisualBasic的客户程序,就是清单1-4展示的程序。这个程序采用EasyCICS组件。使用面向对象的术语,我们将反复提到组件的“方法”,或接口的“方法”,而不能说组件或接口的函数。程序在A处调用了VB的函数CreateObject创建了连接EasyCICS的对象。

16、程序在B处执行了组件的ConnectServerT法。该方法的第一个参数是CICS的系统名称,相当于CICS域(Region)的连接字符串;函数的后两个参数分别是CICS的用户名称和口令。程序在C处执行了组件的CallProgramAndCommit方法,我们一般使用此函数来调用服务程序(Program)。该函数的唯一参数就是要调用的CICS的服务程序名称,在此处,即GETTIME程序。程序在D处执行了组件的GetValue方法,此函数通过其参数指定的关键字来获取服务器方面通过SetValue函数来设置的字符用值。注意,可以通过多个SetValue和GetValue函数来传递多个字符串值。另外

17、,如果客户机方面调用SetValue函数,而服务器方面调用GetValue函数也完全可以。SetValue和GetValue函数对是EasyCICS传递值的标准方法之一。VisualBasic不需要make巾le之类的东西,可见使用组件是多么的简单。我们在PowerBuilder和Delphi中,都是通过组件访问CICS。最后,我们研究一下JAVA的例子。JAVA通过GateWay来访问CICSClient,我们也可以采用EasyCICS,所以,我们首先引入了easycics.*,这为我们访问CICSClient奠定了基础。程序在A处创建了easycics.App的类实例对象。程序在B处执行了

18、类的ConnectServer方法。该方法的第一个参数是CICS的系统名称,相当于CICS域(Region)的连接字符串;函数的后两个参数分别是CICS的用户名称和口令。程序在C处执行了类的CallProgramAndCommit方法,我们一般使用此函数来调用服务程序(Program)。该函数的唯一参数就是要调用的CICS的服务程序名称,在此处,即GETTIME程序。程序在D处执行了类的GetValue方法,此函数通过其参数指定的关键字来获取服务器方面通过SetValue函数来设置的字符用值。注意,可以通过多个SetValue和GetValue函数来传递多个字符串值。另外,如果客户机方面调用S

19、etValue函数,而服务器方面调用GetValue函数也完全可以。SetValue和GetValue函数对是EasyCICS传递值的标准方法之一。JAVA也不需要makefile之类的东西,而且可以不用重新编译,就移植到各种操作系统平台上。1.2 EasyCICS的标准示例:TELECOM也许您对对上面介绍的示例程序GETTIME不以为然,因为它太简单了。那么,下面将介绍另一个示例程序TELECOM,一个同样简单但功能健全的标准示例程序。您可以通过这个程序,清晰地掌握CICS实现三层C/S结构的机制。之所以我把这个程序称为EasyCICS的标准示例,是因为所有编程工具的EasyCICS演示程

20、序都有这个称为TELECOM的例子。那么,这个例子实现什么功能?TELECOM的客户程序向服务程序提供一个移动电话设备号码,服务程序根据这个号码查出相关的计费单据后返回给客户程序,客户程序立即显示此单据。整个过程都是在线同步执行,这也是一个OLTP的典型例子。以下是C语言作的CICS服务程序的清单(注意,这个源程序可以不加修改的运行在支持CICS的各种操作系统平台上):/*/*HEADERFILES*/#include"easycics.h/*/*DEFINES*/#ifdef_WIN32#defineDLLIMPORT_declspec(dllimport)#defineDLLEX

21、PORT_declspec(dllexport)#defineCDECL_cdecl#else#defineDLLIMPORT#defineDLLEXPORT#defineCDECL#endif/*#defineeitherORAorDB2here*/defineDB2#defineSQLNOTFOUND100ifdefined(DB2)#include<sql.h>elifdefined(ORA)#defineSQLNOTFOUND1403#endif/*/*GlobalVariables*/EXECSQLINCLUDEsqlca;EXECSQLBEGINDECLARESECTI

22、ON;charUsr_name61;charDev_no9;longCall_flg;charCalled_arno11;charCalled_no15;charCall_dat21;doubleCall_dur;doubleCall_rate;doubleCall_fee;doubleAdd_fee;charas_dev_no9;EXECSQLENDDECLARESECTION;/*/"Functions*/*/*/voidGetValueNum(char*Key,char*Value,intNum)chars4096;GetValue(Key,s);strncpy(Value,s

23、,Num);ValueNum-1=''0'/*/voidmain()charstatusbuf1024,s30;if(InitEasyCics()ExitEasyCics();/*Read:*/GetValueNum("NO",as_dev_no,sizeof(as_dev_no);/*Write:*/BeginWrite();SetValue("VER","Telecom1.0");RsCreate(10);RsSetColNameList("Usr_name,Dev_no,Call_flg,Cal

24、led_arno,Called_no,Call_dat,Call_dur,Call_rate,Call_fee,Add_fee");/*可省略*/EXECSQLDECLAREc1CURSORFORSELECTbas_infot.Usr_name,auto10a_list.Dev_no,auto10a_list.Call_flg,auto10a_list.Called_arno,auto10a_list.Called_no,auto10a_list.Call_dat,auto10a_list.Call_dur,auto10a_list.Call_rate,auto10a_list.Ca

25、ll_fee,auto10a_list.Add_feeFROMauto10a_list,bas_infotWHERE(auto10a_list.Dev_no=bas_infot.Dev_no)ANDauto10a_list.Dev_no=:as_dev_no;sprintf(statusbuf,"declearcursorcode=%dn",sqlca.sqlcode);PrintStatus(statusbuf);EXECSQLOPENc1;sprintf(statusbuf,"opencursorcode=%dn",sqlca.sqlcode);Pr

26、intStatus(statusbuf);doEXECSQLFETCHclINTO:Usr_name,:Dev_no,:Call_flg,:Called_arno,:Called_no,:Call_dat,:Call_dur,:Call_rate,:Call_fee,:Add_fee;sprintf(statusbuf,"fetchcode=%dn",sqlca.sqlcode);PrintStatus(statusbuf);if(sqlca.sqlcode=SQLNOTFOUND)|(sqlca.sqlcode<0)break;elseRsAddRow();spri

27、ntf(statusbuf,"%s,%s,%d,%s,%s,%s,%7.0f,%8.3f,%7.2f,%6.2fn",Usr_name,Dev_no,Call_flg,Called_arno,Called_no,Call_dat,Call_dur,Call_rate,Call_fee,Add_fee);PrintStatus(statusbuf);RsSetCol(1,Usr_name);RsSetCol(2,Dev_no);sprintf(s,"%lu",Call_flg);RsSetCol(3,s);RsSetCol(4,Called_arno);R

28、sSetCol(5,Called_no);RsSetCol(6,Call_dat);sprintf(s,"%6.2f",Call_dur);RsSetCol(7,s);sprintf(s,"%6.2f",Call_rate);RsSetCol(8,s);sprintf(s,"%6.2f",Call_fee);RsSetCol(9,s);sprintf(s,"%6.2f",Add_fee);RsSetCol(10,s);RsSaveRow();while(1);EXECSQLCLOSEc1;/*#ifdef(SYBA

29、SE)EXECSQLDEALLOCATECURSORc1;#endif*/sprintf(statusbuf,"closecursorcode=%dn",sqlca.sqlcode);PrintStatus(statusbuf);ExitEasyCics();)清单1-10(telecom.sqc)这是个典型的E-SQL程序(在ORACLE中叫PROC),如果您不熟悉E-SQL编程,不用着急,本书有详细的说明。由于后面的内容有对本程序的详细分析,这里仅简要说明一下程序的流程。如果不特别注重程序的移植性、健壮性和调试信息,可以把清单1-10的程序简化成下面的程序:#inclu

30、de"easycics.h"#include<sql.h>#defineSQLNOTFOUND100EXECSQLINCLUDEsqlca;EXECSQLBEGINDECLARESECTION;charUsr_name61;charDev_no9;longCall_flg;charCalled_arno11;charCalled_no15;charCall_dat21;doubleCall_dur;doubleCall_rate;doubleCall_fee;doubleAdd_fee;charas_dev_no9;EXECSQLENDDECLARESECTIO

31、N;/*/voidmain()chars30;if(InitEasyCics()ExitEasyCics();/*Read:*/GetValue("NO",as_dev_no);/*Write:*/BeginWrite();RsCreate(10);RsSetColNameList("Usr_name,Dev_no,Call_flg,Called_arno,Called_no,Call_dat,Call_dur,Call_rate,Call_fee,Add_fee");/*可省略*/EXECSQLDECLAREc1CURSORFORSELECTbas_i

32、nfot.Usr_name,auto10a_list.Dev_no,auto10a_list.Call_flg,auto10a_list.Called_arno,auto10a_list.Called_no,auto10a_list.Call_dat,auto10a_list.Call_dur,auto10a_list.Call_rate,auto10a_list.Call_fee,auto10a_list.Add_feeFROMauto10a_list,bas_infotWHERE(auto10a_list.Dev_no=bas_infot.Dev_no)ANDauto10a_list.De

33、v_no=:as_dev_no;EXECSQLOPENc1;doEXECSQLFETCHc1INTO:Usr_name,:Dev_no,:Call_flg,:Called_arno,:Called_no,:Call_dat,:Call_dur,:Call_rate,:Call_fee,:Add_fee;if(sqlca.sqlcode=SQLNOTFOUND)|(sqlca.sqlcode<0)break;elseRsAddRow();RsSetCol(1,Usr_name);RsSetCol(2,Dev_no);sprintf(s,"%lu",Call_flg);R

34、sSetCol(3,s);RsSetCol(4,Called_arno);RsSetCol(5,Called_no);RsSetCol(6,Call_dat);sprintf(s,"%6.2f",Call_dur);RsSetCol(7,s);sprintf(s,"%6.2f",Call_rate);RsSetCol(8,s);sprintf(s,"%6.2f",Call_fee);RsSetCol(9,s);sprintf(s,"%6.2f",Add_fee);RsSetCol(10,s);RsSaveRow()

35、;while(1);EXECSQLCLOSEc1;ExitEasyCics();清单1-11(简化telecom.sqc)清单1-11所示的程序可以用于CICSforNT,访问DB2数据库。我们来简单分析一下简化的telecom.sqc程序:这个程序采用的接口方法是EasyCICS,所以引入了“easycics.h头文件。程序的开始声明了一些宿主变量(在EXECSQLBEGINDECLARESECTION;和EXECSQLENDDECLARESECTION;之间),所谓“宿主变量”即可以同时用于C语言变量和SQL变量。注意,以EXECSQL打头的语句都可以通过数据库的预编译程序转化成相应的C语

36、言代码。在执行部分,程序首先调用InitEasyCics函数来初始化环境。接着调用GetValue函数,此函数通过其参数指定的关键字“NO”来获取客户机方面通过SetValue函数来设置的字符用值。再调用了BeginWrite函数,表示开始写通信用的公共数据区,它的真正作用是清除该公共数据区。接着调用了几个以“Rs”为字头的函数,表示要设置结果集(ResultSet)。函数RsCreate表示要创建结果集,其参数是结果集的列数。函数RsSetColNameList设置结果集各列的名称,如果客户机仅通过相对位置来获取各列的值(这样效率更高),则可以省略此调用。接着程序声明并打开SQL游标,并在一

37、个循环中不断获取数值存入宿主变量,直到游标最后结束(sqlca.sqlcode=SQLNOTFOUND)或出错(sqlca.sqlcode<0)。注意每从数据库取出一行,调用RsAddRow函数使EasyCICS的结果集增加一行。取到宿主变量中的数值可以再通过RsSetCol函数写到EasyCICS的结果集中,注意此函数的第一个参数是列序号(从1开始),第二个参数是字符串值(EasyCICS只接受字符串值)。各列写完之后,要调用RsSaveRow函数存储止匕行数据。程序最后在关闭游标后调用了ExitEasyCics函数,注意在任何情况下退出CICS服务程序,必须调用该函数。只有C源程序还

38、不够,我们还需要把它编译成执行文件或库文件(在WindowsNT系统,CICS服务程序最终要被编译成为.DLL文件,即动态连接库)。一些程序员习惯于使用集成编译工具,但无法使用在UNIX等操作系统。我们采用更加通用的makefile方式进行编译。以下是在NT系统中,编译TELECOM服务程序的makeMe(在各种UNIX系统,要进行必要的修改):all:telecom.dlltelecom.ccs:telecom.sqcdb2connecttocicstestdb2preptelecom.sqcbindfiledb2bindtelecom.bnddb2grantexecuteonpackage

39、telecomtopublicdb2connectresetcopytelecom.ctelecom.ccstelecom.dll:telecom.ccssetCICS_MSC_FLAGS=-I$(DB2PATH)includesetUSERLIB=$(DB2PATH)libdb2api.libeasycics.objcicstcl-e-d-lCtelecom.ccsclean:deltelecom.bndtelecom.ctelecom.ccstelecom.dlltelecom.exptelecom.libtelecom.obj清单1-12再看看ANSIC的客户程序,就是清单1-13展示的

40、C程序#include"ec.h"/*/voidmain()inti,j,rc,cc,r;chars100,c,cr;r=ConnectServer("CICSNT01","TEST","TEST");printf("ConnectCode:%dn",r);printf("EnterQueryNumber:");scanf("%s",s);scanf("%c",&cr);BeginWrite();SetValue("N

41、O",s);r=CallProgramAndCommit("TELECOM");if(r)puts("CallProgramError!");return;RsOpen();rc=RsGetRowNum();cc=RsGetColNum();for(i=1;i<=rc;i+)RsFetchRow();for(j=1;j<cc;j+)RsGetCol(j,s);printf(s);printf(",");puts("");清单1-13以下是运行结果(按提示输入查询的号码,程序返回查询的结果):D

42、:cics>testecConnectCode:0EnterQueryNumber:2020088宋阮,2020088,105011031,0595,01385995193,Apr17199910:55PM,0,宋阮,2020088,105011031,0595,01385990145,Apr16199912:22PM,0,宋阮,2020088,105011031,0595,01385922328,Apr0,宋阮,2020088,105011031,0595,01385922328,Apr0,宋阮,2020088,105011031,0595,01385995193,Apr0,宋阮,20

43、20088,105011031,0595,01385995193,Apr0,宋阮,2020088,105011031,0595,01385995193,Apr0,宋阮,2020088,105011031,0595,01385995193,Apr0,宋阮,2020088,105011031,0595,01385995183,Apr919996:42PM,7199912:50PM,6199912:57PM,5199911:29AM,5199910:08AM,319993:50PM,3199910:15AM,919996:42PM,7199912:50PM,6199912:57PM,5199911:

44、29AM,5199910:08AM,319993:50PM,3199910:15AM,0,3.00,1.00,1.51.00,1.00,1.01.00,1.00,1.02.00,1.00,2.03.00,1.00,3.01.00,1.00,1.01.00,1.00,1.04.00,1.00,2.01.00,1.00,0.56.00,1.00,3.03.00,1.00,1.51.00,1.00,1.01.00,1.00,1.02.00,1.00,2.03.00,1.00,3.01.00,1.00,1.01.00,1.00,1.04.00,1.00,2.01.00,1.00,0.56.00,1.0

45、0,3.0宋阮,2020088,105011031,0595,01385995193,Mar3119999:48PM,0,宋阮,2020088,105011031,0595,01385995193,Mar2919994:49PM,5.00,1.00,5.00,宋阮,2020088,105011031,0595,01385995193,Mar2719993:03PM,9.00,1.00,4.50,宋阮,2020088,105011031,0595,01385995193,Mar21199910:48PM,3.00,1.00,1.50,清单1-14这个程序采用的接口方法也是EasyCICS,所以我

46、们引入了“ec.h”头文件(注意服务程序使用的是叫做“easycics.h的头文件)。程序首先执行了ConnectServer函数。该函数的第一个参数是CICS的系统名称,相当于CICS域(Region)的连接字符串;函数的后两个参数分别是CICS的用户名称和口令。接着根据用户输入的号码调用SetValue函数,其作用是把一个字符串作为值赋予一个关键字(也是一个字符串),并存储在公共数据区。在这里,“NO”是关键字。注意所谓关键字是用户随意定义的,但最好客户程序和服务程序能相互匹配,如果没有通过SetValue函数设置某关键字的值就直接调用GetValue函数取此关键字的值,则取出空字符串。再

47、下面程序执行了CallProgramAndCommit函数,我们一般使用此函数来调用服务程序(Program)。该函数的唯一参数就是要调用的CICS的服务程序名称,在此处,即TELECOM程序。接下来程序调用了一些结果集函数(以“Rs”为字头)。RsOpen函数用于打开结果集。注意,RsCreate和RsOpen函数对是EasyCICS传递二维值的标准方法,而SetValue和GetValue函数对是EasyCICS传递单值(零维值)的标准方法。结果集的行数和列数可以通过函数RsGetRowNum和RsGetRowNum得到。函数RsFetchRow用于取出结果集的一行,而函数RsGetCol

48、用于取出当前行的一列值。所有返回的值经格式化后写到屏幕上。这个客户程序的makefile如下:all:testec.exetestec.exe:testec.objlinktestec.objec.objcclwin32.libtestec.obj:testec.ccl/ctestec.c清单1-15卜面是VisualBasic客户程序的源代码:OptionExplicitDimoEcAsNewEasyCics.AppPrivateSubbtnAbout_Click()oEc.AboutEndSubPrivateSubbtnQuery_Click()Dimr%,s$,i%,j%,rc%,cc%

49、IstTest.ClearoEc.BeginWrites=txtNo.TextoEc.SetValue"NO",soEc.CallProgramAndCommit"TELECOM"s=oEc.GetErrIfs<>""ThenMsgBox"GotanerrorwhencallCICSServerprogram:"+Chr(13)+Chr(10)+sExitSubEndIfoEc.RsOpenrc=oEc.RsGetRowNumcc=oEc.RsGetColNums=""Fori=1T

50、orcoEc.RsFetchRowForj=1Toccs=s+oEc.RsGetCol(j)+","NextlstTest.AddItemss=""NextEndSubPrivateSubForm_Load()Dimr%r=oEc.ConnectServer("CICSNT01","TEST","TEST")Ifr<>0ThenMsgBox"Can'tconnect"ExitSubEndIfEndSubPrivateSubForm_Unload(Cance

51、lAsInteger)SetoEc=NothingEndSub清单1-16VisualBasic程序采用EasyCICS组件(PowerBuilder和Delphi也是通过组件访问CICS)。使用面向对象的术语,我们将反复提到组件的“方法”,或接口的“方法”,而不能说组件或接口的函数。程序预先创建了连接EasyCICS的对象。程序首先执行了组件的ConnectServer方法。该方法的第一个参数是CICS的系统名称,相当于CICS域(Region)的连接字符串;函数的后两个参数分别是CICS的用户名称和口令。接着根据用户输入的到文本框中的号码调用了组件的SetValue方法,其作用是把一个字符

52、串作为值赋予一个关键字(也是一个字符串),并存储在公共数据区。在这里,“NO”是关键字。注意所谓关键字是用户随意定义的,但最好客户程序和服务程序能相互匹配,如果没有通过SetValue方法设置某关键字的值就直接调用GetValue方法取此关键字的值,则取出空字符串。再下面程序执行了组件的CallProgramAndCommit方法,我们一般使用此方法来调用服务程序(Program)。该函数的唯一参数就是要调用的CICS的服务程序名称,在此处,即TELECOM程序。接下来程序调用了一些结果集方法(以“Rs”为字头)。RsOpen方法用于打开结果集。注意,RsCreate和RsOpen方法对是Ea

53、syCICS传递二维值的标准方法,而SetValue和GetValue方法对是EasyCICS传递单值(零维值)的标准方法。结果集的行数和列数可以通过RsGetRowNum方法和RsGetRowNum方法得到。RsFetchRow方法用于取出结果集的一行,而RsGetCol方法用于取出当前行的一列值。所有返回的值经格式化后加入一个列表框里。以下是运行结果(在文本框中输入号码,点击查询按钮):ffL-?D?DDB8J05Q11031,0595,01385995193,Apr1713991D:55PM.3.00,1.DD,1.50,05>%g,202000aj05011031.0595.01

54、385990145J)r16199912:22PM,KOOLL00fLOOL0.1&,20200BBJ05011031,0595,0138592232B,Apr919996:42PM,1.00F1.00,1.00,0.15,ZD2DO88J05011031,0595,013859Z?328,Apr7199912:50PM,2.0Q,1.D0,2.00,0,30,L,Z020088/105011031,0595,01385995193,Apr6199312:57PM,3.00,1.00,3.U0,0,45,g,.2020088J05011Q3L059E,01385995193,Apr51

55、99911:29AM,1.0(1.1.00,1.0020088,105011031,0595,01385995193,Apr5199S10:fl8AM,1.0Q,1.00,Ulfi,0.15,20200BBJ05011031,0595,01385995193,Apr319993:50PM,4.00(1.00,2,00,0.60,束阮,2。2口。眄105011。?1,口595川385g95183,Apr3199910;15AM.1.0(1.1.DDr0.50.Q.16.宏园202。08比105011031.0595/138599519瓦吊制3119999:48PMf6.00,1.

56、00,3.00,Q.9。,宋恒,.20211088,1。6。11。31595,0门85995193,Mar2919994:49PM,5,00,LOO,5.00.0.75.?D2D088J05011031,0595,01385995193,Mar2719993:03PM,9.OU,LUO,4.6。,1.35,C?020088J05011031,0595,01385995193,Mar21199910:48PM,3.00,1.00,1.50,0,45,IMI查询号就IMI查询号就20200BB关于E图1-6最后是JAVA的例子:packageec;importeasycics.*;,*public

57、classTelecomstaticpublicvoidmain(StringastrArg口)longstime=System.currentTimeMillis();tryAppoEc=newApp();/oEc.strJGateName="local:"oEc.ConnectServer("CICSNT01","TEST","TEST");oEc.BeginWrite();oEc.SetValue("NO","2020088");oEc.CallProgramAndCommit("TELECOM");oEc.RsOpen();intrc=oEc.RsGetRowNum();intcc=oEc.RsGetColNum()

温馨提示

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

评论

0/150

提交评论