收藏 分享(赏)

第四章cics高级编程.doc

上传人:dzzj200808 文档编号:5749297 上传时间:2019-03-15 格式:DOC 页数:32 大小:202KB
下载 相关 举报
第四章cics高级编程.doc_第1页
第1页 / 共32页
第四章cics高级编程.doc_第2页
第2页 / 共32页
第四章cics高级编程.doc_第3页
第3页 / 共32页
第四章cics高级编程.doc_第4页
第4页 / 共32页
第四章cics高级编程.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、1第四章 高级编程 1第一节 CICS 服务程序的相互调用 11.1 一个调用其它服务程序的例子 .11.2 跨域调用其它服务程序 .5第二节 CICS 事务的作用域 7第三节 深入 CICS 编程 .93.1 CICS API 简介 93.2 SFS 的应用 113.3 使用 ECI .17第四章 高级编程相对其它的软件产品,CICS 可谓历史悠久,因此也就有 非常丰富的内涵和开发手段。本章所讲解的所谓“高级编程” ,不过是为了引导熟悉 EasyCICS 的程序员再深入地了解一些 CICS 而已。我听到很多用户抱怨说,Microsoft Word 提供了几千种功能,可一般人只用几十种就够了,

2、为什么要付钱去那些不用的功能?其实,大多数成熟的软件产品都难以避免这样的尴尬问题。不过,有时,靠软件吃饭的使用者倒可以从反面考虑一下问题:我们如果花费一份时间和精力,学到了某产品 10%的功能,而满足了自己 80%的需求,往往我们要再花费十份时间和精力,才能学到该产品 30%的功能,而最终结果是满足了自己 85%的需求。这样的买卖未必总是划算的,对吗?当然,如果某种产品对您关系重大,还是要认真钻研一下。如果您是这样的读者,我要再强调本书仅仅能把您引进 CICS 的大门,并提供给您一些十分有效的手段。每种 CICS 产品都附带大量的联 机文档,这些文档能为您深入学习 CICS提供很多帮 助。俗语

3、道:师傅领进门 ,修行在个人。第一节 CICS 服务程序的相 互调用1.1 一个调用其它服务程序的例子如果您读完并理解了本章以前的所有内容,那您已经是非常不错的EasyCICS 程序员了。您应该很熟悉 CICS的客户程序如何调用 CICS 的服务程序,对了,调用 CallProgramAndCommit 函数。有人曾经问 我 CICS的客户程序是否可以调用 CICS的客户程序 ,当然不行,因为如果仅 仅是客户的话,是不能接受和应答任何请求的,请再复习一下 Client/Server 系统机构的概念。但与其它 Client/Server 系统类似 ,CICS 的服务程序确实可以调用CICS 的服

4、务程序。2我们来看一个简单的例子。有两个非常简单的服务:EC04 和 EC05。EC04基本上什么事都不做,只调用 EC05,并根据 EC05 返回的信息设置返回值。而EC05把当前的日期和时间写到公共数据区里。以下是它们 的代码:/*/*- HEADER FILES -*/#include “easycics.h“/*/*- Global Variables -*/char Ca1BUF_SIZE=“;/*/*Functions*/*/*/void main()char s100;if( InitEasyCics() ) ExitEasyCics();SetCurrentCA(Ca1);Be

5、ginWrite();CallProgram( “EC05“ );GetValue( “TIME5“, s );SetCurrentCA(0);BeginWrite();SetValue( “TIME5“, s );ExitEasyCics();3清单 4-1-1 服务程序 EC04/*/*- HEADER FILES -*/#include #include “easycics.h“/*/*Functions*/*/*/void main()struct tm *newtime;time_t aclock;if( InitEasyCics() ) ExitEasyCics();BeginWr

6、ite();time( /* Get time in seconds */newtime= localtime( /* Convert time to struct tm form */SetValue( “TIME5“, asctime(newtime) );PrintStatus( “TIME5“ );ExitEasyCics();清单 4-1-2 服务程序 EC05我们可以用WSH(Windo ws Scripting Host)作一个最简单的客户程序来访问EC04。以下是代码清单:set oEc = Wscript.CreateObject(“EasyCics.App“)r = oEc

7、.ConnectServer(“CICSNT01“, “TEST“, “TEST“)4if rsfsadmin list filesFiles:CICSNT01cicsnlqfileCICSNT01cicsnrectsqfilCICSNT01cicsplqfileCICSNT01cicsrectsqfileCICSNT01cicstdqlgfileCICSNT01cicstdqnofileCICSNT01cicstdqphfilePAYFILED:cicssfsadmin query file PAYFILEFile name: PAYFILEFile organization: btree

8、clusteredRecord fields:Name: sn, Type: string, Size: 32Name: bind_index, Type: string, Size: 19Primary index name: PAYINDUnique: noIndex fields:Name: sn, Ordering: ascendingVolume: sfs_SLRPC, Allocated pages: 0, Utilized pages: 0Max number of records: 3486869406227236544Number of records: 0File stat

9、e: file OKCreation time: 00-02-13 13:00:08Last read time: 00-02-13 13:00:08Last write time: 00-02-13 13:00:08Last administer time: 00-02-13 13:00:08Primary index status:Number of entries: 0Btree level: 0Number of leaves: 0No secondary indices.14可以用 cicssdt工具维护此文件,下面是示例:D:cicscicssdtERZ037223W/0764:

10、(You are not DCE logged in)ERZ037068I/0500: CICSSDT talking to: /.:/cics/sfs/LRPCERZ037069I/0501: Version 2.1 : 12-07-1995ERZ037070I/0502: Contacting server .ERZ037103I/0704: (Server OK)cicssdt: - ?ERZ037081I/0519: SFS Diagnostic Tool - Help Valid commands are: help (or ?) commandName - setopen - li

11、st l - create fileName - read fileName, (with delete/update) - write fileName - empty fileName - delete fileName - free fileName - addindex fileName - delindex fileName - info fileName - server serverName - qtos QSAMfileName - stof SFSfileName - ftos SFSfileName - ! (ksh) - quitcicssdt: - write PAYF

12、ILEsn string Size:00032110101700302201bind_index string Size:00019EverythingAnother ? Y/N Ysn string Size:00032110101700303201bind_index string Size:00019CICSAnother ? Y/N n2 Record(s) Added OK.cicssdt: - read PAYFILEIndex To Use .: PAYINDRead From Beginning ? Y/N : YContinuous Read ? Y/N : yRead #0

13、0000001sn 110101700302201bind_index EverythingRead #00000002sn 110101700303201bind_index CICS2 Record(s) Readcicssdt: - q15D:cics 现在,文件 PAYFILE 被填写了两条记录。我们现在用一个 CICS 程序读 PAYFILE,并再加入一条记录。这个 CICS 程序内容如下:/*/*- HEADER FILES -*/#include #include “easycics.h“/*/*- DEFINES -*/#define KEY_LEN 32/*/*- Globa

14、l Variables -*/struct C_Datachar SnKEY_LEN;char Bi19;Data;/*/*Functions*/*/*/void main()char file_name= “PAYSN“, key_sKEY_LEN= “110101700302“;short int len;/long r_code;16if( InitEasyCics() )ExitEasyCics();return;/*Read:*/*Write:*/BeginWrite();len= sizeof(Data);EXEC CICS READ FILE( file_name ) INTO(

15、 /if ( r_code != DFHRESP(NORMAL) )/PrintStatus( “Error !n“ );PrintStatus( Data.Sn );PrintStatus( Data.Bi );SetValue( “Sn“, Data.Sn );SetValue( “Bi“, Data.Bi );len= sizeof(Data);memset( key_s, 0, KEY_LEN );strcpy( key_s, “110101700306201“ );memcpy( Data.Sn, key_s, KEY_LEN );strcpy( Data.Bi, “IBM RS60

16、00“ );EXEC CICS WRITE FILE( file_name ) FROM( ExitEasyCics();读者可以自己写一个客户程序,执行后用 cicssdt 验证 PAYFILE文件是否增加了一行记录。173.3 使用 ECICICS 客户程序通常使用 ECI(External Call Interface)调用 CICS 服务程序或事务,二者通过一块称为公共数据区的内存空间来传递数据。ECI 提供两个基本函数,其声明如下: cics_sshort_t CICSCALL CICS_EciListSystems( cics_char_t CICSPTR *NameSpace,

17、cics_ushort_t CICSPTR *Systems, CICS_EciSystem_t CICSPTR *List ); cics_sshort_t CICSCALL CICS_ExternalCall( ECI_PARMS CICSPTR *EciParms );ECI 仅仅支持操作系统最常用的C 编译工具,所以,一般来说,可以通过使用 EasyCICS 的客户支持,避免直接调用 CICS ECI。但如果希望用到 ECI的全部特性及其与 C 语言配合的独到之处,就需要直接调用 ECI了。ECI 真正有用的是函数 CICS_ExternalCall,它只有一个 参数,是一个复杂的结构

18、的指针。我们现在通过一个示例程序来了解函数 CICS_ExternalCall 的使用方法。下面是调用的 CICS服务程序:/* Structure to build up the data and time to be output. Note that */* the front end ECI calling program expects to pass and receive a */* comm area of size 18 bytes. */typedef structchar DateArea?(8?);char Space;char TimeArea?(8?);char L

19、owValue; CommAreaDetail;/* *Transaction entry point, to be invoked by CICS. No parameters. */void main( void )/* Variable to recieve response codes from CICS.long r_c; */char abs_time?(8?); /* Variable to hold the number of milliseconds returned by CICS. */CommAreaDetail * pcomm; /* Declare pointer

20、to the comm area. */* Get addressability to the EIB to validate the expected comm area length. If the comm area 18length was not of the expected length, write an error message to the console and exit, otherwise get the date and time to pass back. */EXEC CICS ADDRESS EIB( dfheiptr );/* Get addressabi

21、lity to the comm area. */EXEC CICS ADDRESS COMMAREA( pcomm );/* Initialise the padding character and the terminating null in */* the ConsoleMessage structure. */pcomm-Space = ;pcomm-LowValue = 0;/* Get the number of milliseconds from CICS. */EXEC CICS ASKTIME ABSTIME( abs_time );/* Use CICS to conve

22、rt the elapsed milliseconds to a displayable */* date and time format. */EXEC CICS FORMATTIME ABSTIME(abs_time) DDMMYY( pcomm-DateArea )DATESEP(/) TIME( pcomm-TimeArea ) TIMESEP(:);/* Transaction completed, return control to CICS */EXEC CICS RETURN;清单 4-3-1这段程序的作用是把格式化的时间信息写到一个 C 语言结构里,并以此结构作为公共数据区。

23、我们再来看一下客户程序,这是一个支持 Windows 平台的程序:/*/*- HEADER FILES -*/#include #include #include #include #include #include “ec01_c.h“19/*/*- DEFINES -*/* wParam */*#define ECI_ITEM_GO 255#define ECI_ITEM_QUIT 256*/#define READY 99 /* State messages */#define CALL_ECISTATESYNC 100#define CALL_ECISYNC 101#define CA

24、LL_ECIASYNC 102#define CALL_ECIGETREPLY 103/* Msg */#define ECI_MSG (WM_USER+10)/* Other */#define ECI_SYNC_SIZE 18/*/*- Global Variables -*/* Used for ECI */ECI_PARMS EciParms;char Server9= “CICSNT01“; /* 注意:FILL IN YOUR SERVER HERE */char UserID9= “; /* FILL IN YOUR USER ID HERE */char PassWd9= “;

25、 /* FILL IN YOUR PASSWORD HERE */* General Window handles */HANDLE Instance;HWND hwndMain;HWND hwndList;/*/*Functions*/*/*Tools:-*/*Print20This function will print a string of text to the window and look after the cursor movement.*/void Print(char *Format, .)va_list arg_ptr;WORD index;char buffer512

26、;va_start(arg_ptr, Format);vsprintf(buffer, Format, arg_ptr);va_end(arg_ptr);index= SendMessage(hwndList, LB_INSERTSTRING, -1, (LONG)buffer);SendMessage(hwndList, LB_SETTOPINDEX, index, 0L);/*ErrorDisplay the System Error response from an ECI Call*/void Error(void)/ Print( “SysErr returns: %d(0x%04.

27、4X)“, EciParms.eci_sys_return_code, EciParms.eci_sys_return_code );Print( “SysErr returns“ );/*ResponseDisplay the immediate response code from an ECI call*/void Response(char *Call, short rc, char *Abend)char *p;switch(rc)case ECI_NO_ERROR:p= “ECI_NO_ERROR “;break;case ECI_ERR_INVALID_DATA_LENGTH:p

28、= “ECI_ERR_INVALID_DATA_LENGTH“;break;case ECI_ERR_INVALID_EXTEND_MODE:21p= “ECI_ERR_INVALID_EXTEND_MODE“;break;case ECI_ERR_NO_CICS:p= “ECI_ERR_NO_CICS “;break;case ECI_ERR_CICS_DIED:p= “ECI_ERR_CICS_DIED “;break;case ECI_ERR_REQUEST_TIMEOUT:p= “ECI_ERR_REQUEST_TIMEOUT “;break;case ECI_ERR_RESPONSE

29、_TIMEOUT:p= “ECI_ERR_RESPONSE_TIMEOUT “;break;case ECI_ERR_TRANSACTION_ABEND:p= “ECI_ERR_TRANSACTION_ABEND “;break;case ECI_ERR_EXEC_NOT_RESIDENT:p= “ECI_ERR_EXEC_NOT_RESIDENT “;break;case ECI_ERR_SYSTEM_ERROR:p= “ECI_ERR_SYSTEM_ERROR “;break;case ECI_ERR_NULL_WIN_HANDLE:p= “ECI_ERR_NULL_WIN_HANDLE

30、“;break;case ECI_ERR_NULL_MESSAGE_ID:p= “ECI_ERR_NULL_MESSAGE_ID “;break;case ECI_ERR_THREAD_CREATE_ERROR:p= “ECI_ERR_THREAD_CREATE_ERROR“;break;case ECI_ERR_INVALID_CALL_TYPE:p= “ECI_ERR_INVALID_CALL_TYPE “;break;case ECI_ERR_ALREADY_ACTIVE:p= “ECI_ERR_ALREADY_ACTIVE “;break;case ECI_ERR_RESOURCE_S

31、HORTAGE:p= “ECI_ERR_RESOURCE_SHORTAGE “;break;case ECI_ERR_NO_SESSIONS:p= “ECI_ERR_NO_SESSIONS “;break;22case ECI_ERR_NULL_SEM_HANDLE:p= “ECI_ERR_NULL_SEM_HANDLE “;break;case ECI_ERR_INVALID_DATA_AREA:p= “ECI_ERR_INVALID_DATA_AREA “;break;case ECI_ERR_INVALID_VERSION:p= “ECI_ERR_INVALID_VERSION “;br

32、eak;case ECI_ERR_UNKNOWN_SERVER:p= “ECI_ERR_UNKNOWN_SERVER “;break;case ECI_ERR_CALL_FROM_CALLBACK:p= “ECI_ERR_CALL_FROM_CALLBACK “;break;case ECI_ERR_INVALID_TRANSID:p= “ECI_ERR_INVALID_TRANSID “;break;case ECI_ERR_MORE_SYSTEMS:p= “ECI_ERR_MORE_SYSTEMS “;break;case ECI_ERR_NO_SYSTEMS:p= “ECI_ERR_NO

33、_SYSTEMS “;break;case ECI_ERR_SECURITY_ERROR:p= “ECI_ERR_SECURITY_ERROR “;break;case ECI_ERR_MAX_SYSTEMS:p= “ECI_ERR_MAX_SYSTEMS “;break;case ECI_ERR_MAX_SESSIONS:p= “ECI_ERR_MAX_SESSIONS “;break;case ECI_ERR_ROLLEDBACK:p= “ECI_ERR_ROLLEDBACK “;break;default:p= “!Unknown!“;Print (“Unknown Return Cod

34、e : %d“, rc);Print( “%s returned: %s“, Call, p );if( rc!=ECI_NO_ERROR )Print( “Abend code was “%4.4s“, Abend );23if( rc=ECI_ERR_SYSTEM_ERROR )Error();/*/*ECI Call:-*/*CallBackProcThis is the function that was registered on the ECI_ASYNC call. It gets called when there is a reply ready.*/void CICSEXI

35、T CallBackProc (cics_ushort_t idx)PostMessage(hwndMain, ECI_MSG, CALL_ECIGETREPLY, 0);/*EciStateSyncIssue a CICS_Externalcall for an ECI_STATE_SYNC*/void EciStateSync(void)char *name= “ECI_STATE_SYNC“;short rc;char c_aECI_STATUS_LENGTH;ECI_STATUS eci_sta;char *p, *q, *r;Print (“ECI Sample Program“);

36、Print (“-“);Print (“);Print (“%s test“, name);memset( c_a, 0, ECI_STATUS_LENGTH );memset( EciParms.eci_version = ECI_VERSION_1;24EciParms.eci_call_type = ECI_STATE_SYNC;memcpy(memcpy(memcpy(EciParms.eci_commarea = c_a;EciParms.eci_commarea_length = ECI_STATUS_LENGTH;EciParms.eci_extend_mode = ECI_ST

37、ATE_IMMEDIATE;EciParms.eci_luw_token = ECI_LUW_NEW;EciParms.eci_timeout = 0;rc= CICS_ExternalCall(Response(name, rc, EciParms.eci_abend_code);if( rc=ECI_NO_ERROR )memcpy (switch(eci_sta.ConnectionType)case ECI_CONNECTED_NOWHERE:p= “ECI_CONNECTED_NOWHERE“;break;case ECI_CONNECTED_TO_SERVER:p= “ECI_CO

38、NNECTED_TO_SERVER“;break;case ECI_CONNECTED_TO_CLIENT:p= “ECI_CONNECTED_TO_CLIENT“;break;Print (“Connection Type: %s“, p);switch(eci_sta.CicsServerStatus)case ECI_SERVERSTATE_UNKNOWN:q= “ECI_SERVERSTATE_UNKNOWN“;break;case ECI_SERVERSTATE_UP:q= “ECI_SERVERSTATE_UP“;break;case ECI_SERVERSTATE_DOWN:q=

39、 “ECI_SERVERSTATE_DOWN“;break;Print (“Server Status: %s“, q);switch(eci_sta.CicsClientStatus)case ECI_CLIENTSTATE_UNKNOWN:r= “ECI_CLIENTSTATE_UNKNOWN“;25break;case ECI_CLIENTSTATE_UP:r= “ECI_CLIENTSTATE_UP“;break;case ECI_CLIENTSTATE_INAPPLICABLE:r= “ECI_CLIENTSTATE_INAPPLICABLE“;break;Print (“Clien

40、t Status: %s“, r);Print (“%s test complete“, name);/*EciSyncIssue a CICS_Externalcall for an ECI_SYNC*/void EciSync(void)char *name= “ECI_SYNC“;short rc;char c_aECI_SYNC_SIZE;Print (“);Print (“%s test“, name);memset (c_a, 0, ECI_SYNC_SIZE);memset (EciParms.eci_version = ECI_VERSION_1;EciParms.eci_ca

41、ll_type = ECI_SYNC;memcpy(memcpy(memcpy(memcpy(EciParms.eci_commarea = c_a;EciParms.eci_commarea_length = ECI_SYNC_SIZE;EciParms.eci_extend_mode = ECI_NO_EXTEND;EciParms.eci_luw_token = ECI_LUW_NEW;EciParms.eci_timeout = 0;26rc= CICS_ExternalCall(Response(name, rc, EciParms.eci_abend_code);if( rc=ECI_NO_E

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报