100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > AS400银行核心系统开发中的技术总结–交易和组件写法

AS400银行核心系统开发中的技术总结–交易和组件写法

时间:2023-11-10 11:44:54

相关推荐

AS400银行核心系统开发中的技术总结–交易和组件写法

php教程|php手册

android

php教程-php手册

AS400银行核心系统开发中的技术总结–交易和组件写法

工程进度 源码,vscode最好插件,UBUNTU硬盘安装宽带,tomcat 网站破解,sqlite语句保存,没有网站服务器空间如何用ftp,html页面跳转插件,前端框架组件详解,wordexcel爬虫,php培训无锡,广州网站seo哪家好,自定义颜色 网站,border 网页,app注册页面模板,操作引导页面,手机端 管理系统,pb 调用 其他程序lzw

*交易和组件写法

彩虹下单系统源码,ubuntu切换到tty,多人如何在Tomcat开发,爬虫框架详解,php项目管理开源系统,广州seo都选乐云seolzw

cms源码免费视频模板,ubuntu信号无输入,tomcat可以用多大并发量,python爬虫苏宁,php编程 第三版,玖搜seolzw

Firebird核心系统的整体结构,是由主控–交易–组件这几个层次组成的。联机交易主控由C程序编写,异步交易主控和日终批量主控由CL和RPGLE程序编写。主控通过交易码调用相应的交易RPGLE程序,交易程序又通过CALLP调用不同模块的组件RPGLE程序,完成整个处理逻辑。交易程序和组件程序都总结了一套模版样例,下面就介绍样例程序的写法。

在介绍交易和组件程序写法之前,先介绍统一由/COPY引入的通用程序,这部分程序放在DSCPPGM中。注意/COPY不宜滥用,一定要结合命名规范,否则极易导致程序可读性差。

首先是HEAD。这个文件定义了copyright和几个日期fmt规则。

**BEGIN*****************************************************************程序名称:程序公共控制头 ***功能描述:程序公共控制头 *** ***版本:-10-21_1*** ***设计人员:PACMAN开发人员:AUTOGEN ***设计日期:-08-30开发日期:-08-30 *** ***END*******************************************************************HCOPYRIGHT(‘Firebird V2.1 corebanking system, CSW SHANGHAI’)HDATFMT(*ISO) TIMFMT(*ISO) DATEDIT(*YMD)

然后是ENUM,这个文件是引入枚举常量定义,在数据字典和枚举值部分已经有了介绍,这里就不重复了。

接下来是PGDS,这个文件定义了每个程序都会引入的PSDS和INFDS结构定义,错误结构定义,错误信息数组,接口数组条数,以及特殊用途变量等。

**BEGIN*****************************************************************程序名称:程序公共控制头 ***功能描述:程序公共控制头 *** ***版本:-11-23_1*** ***设计人员:PACMAN开发人员:AUTOGEN ***设计日期:-08-30开发日期:-08-30 *** ***END*********************************************************************公共常量**输出传票数组条数DC_NBOTVC C CONST(100)**输入券别数组条数DC_NBINCS C CONST(30)**输入费用数组条数DC_NBINFE C CONST(30)**输出费用数组条数DC_NBOTFE C CONST(30)**替换错误参数条数DC_NBMSDS C CONST(9)**记录被锁错误信息DC_MGLOCK C CONST(‘记录被锁’)************************************************************************错误处理结构**程序状态结构DRPGPSDS SDSD PG_MAINPROC 110AD PG_STATUS 1115AD PG_PRVSTAT 1620AD PG_SRCLINE 2128AD PG_ROUTINE 2936AD PG_PARMNUM 3739S 0D PG_MSID4046AD PG_PGMLIB 8190AD PG_EXCPDT 91 170AD PG_LSERRFL 175 184AD PG_JOBDATE 191 198AD PG_FLINFO 209 243AD PG_JOBNAME 244 253AD PG_JOBUSER 254 263AD PG_JOBNUM 264 269S 0D PG_RUNDATE 276 281S 0D PG_RUNTIME 282 287S 0D PG_SRCFILE 304 313AD PG_SRCLIB 314 323AD PG_SRCMBR 324 333AD PG_PGMNAME 334 343AD PG_MODNAME 344 353AD PG_SRCLNADD 354 355B 0D PG_FLILNADD 356 357B 0D PG_USRPRF 358 367AD PG_EXTERR 368 371I 0**文件状态结构DFILESDSDS BASED(FILEDSP)D FL_FILE 18AD FL_OPNIND99AD FL_EOFIND 1010AD FL_STATUS 1115S 0D FL_OPCODE 1621AD FL_ROUTINE 2229AD FL_SRCLINE 3037AD FL_RECORD 3845AD FL_MSID4652AD FL_SRCLNADD 7778B 0D FL_ODPTYPE 8182AD FL_FILENAME 8392AD FL_LIBRARY 93 102AD FL_SPLFILE 103 112AD FL_SPLLIB 113 122AD FL_RCDLEN 125 126I 0D FL_KEYLEN 127 128I 0D FL_MEMBER 129 138AD FL_TYPE147 148I 0D FL_RCDNUM 156 159I 0D FL_SPLNUM 160 163I 0D FL_OVERFLOW 188 189I 0D FL_BASEDMBRS211 212I 0D FL_OPENID 214 215B 0D FL_RCDFMTLEN216 217I 0D FL_CCSID 218 219I 0D FL_FBSIZE 367 370I 0D FL_KEYNUM 387 388I 0D FL_FBKEYLEN 393 394I 0D FL_MBRNUM 395 396I 0D FL_RRN397 400I 0D FL_KEY401 2400A**文件状态结构指针DFILEDSPS*************************************************************************公共结构**引入数据字典DDICT E DS EXTNAME(DICT) QUALIFIED TEMPLATE**公共错误信息接口DPMG E DS EXTNAME(MESG) QUALIFIED**错误信息替换数组DA_MSDS S DIM(C_NBMSDS) LIKE(DICT.@@MSDS)************************************************************************特殊变量**是否执行过错误处理程序DPG_ERYNFG S LIKE(DICT.@@YNFG) INZ(YNFG_NO)**是否程序已执行初始化DPG_FRYNFG S LIKE(DICT.@@YNFG) INZ(YNFG_YES)

最后是通用处理过程PGCM,这个程序定义了错误捕获程序以及检查,退出等通用过程,并以#开头的过程名,与交易中普通@开头过程名以示区分。

**BEGIN*****************************************************************程序名称:程序公共子程序 ***功能描述:程序公共子程序 *** ***版本:-10-21_1*** ***设计人员:PACMAN开发人员:AUTOGEN ***设计日期:-08-30开发日期:-08-30 *** ***END******************************************************************************************************************************************* #EXIT返回**********************************************************************C#EXIT BEGSR**C EVALPG_FRYNFG = YNFG_NOC/IF DEFINED(USELR)C EVAL*INLR = *ONC/ENDIFC RETURN**C ENDSR************************************************************************ #ERR 取错误信息**********************************************************************C#ERRBEGSR**C EVALPMG.MSFLNM = PG_SRCMBRC IF PMG.BKMSDS = *BLANKSC CALL‘SCNCMMG’C PARM PMGC PARM A_MSDSC ENDIFC EXSR#EXIT**C ENDSR************************************************************************ #CHKMSG检查程序返回信息**********************************************************************C#CHKMSG BEGSR**C IF PMG.BKMSID *BLANKSC EXSR#EXITC ENDIF**C ENDSR************************************************************************ *PSSR程序异常处理**********************************************************************C*PSSR BEGSR**C IF PG_ERYNFG = YNFG_NOC EVALPG_ERYNFG = YNFG_YESC EVALPMG.MSFLNM = PG_SRCMBRC EVALPMG.MSCDLN = PG_SRCLINEC EVALPMG.BKMSID = ‘F’ + PG_MSIDC EVALPMG.BKMSDS = PG_EXCPDTC EVALPMG.OTMSDS = PG_STATUS+’ ‘+PG_PGMLIB+’ ‘+CPG_PGMNAMEC EXSR#EXITC ENDIF**C ENDSR************************************************************************ #FLEX文件异常处理**********************************************************************C#FLEX BEGSR**C EVALPMG.MSFLNM = PG_SRCMBRC EVALPMG.MSCDLN = FL_SRCLINEC EVALPMG.BKMSID = ‘F’ + FL_MSIDC IF FL_STATUS = 1218C CALL‘GETOBJTXT’C PARMFL_LIBRARY V_FLEXLIB 10C PARMFL_FILENAME V_FLEXOBJ 10C PARM‘*FILE’ V_FLEXTYP 7C PARM*BLANKS V_FLEXTEXT 50C EVALPMG.BKMSDS = %TRIM(V_FLEXTEXT) +C%TRIM(FL_FILENAME) + ‘.’ +C%TRIM(FL_MEMBER) + C_MGLOCK +C‘,’ + PG_EXCPDTC ELSEC EVALPMG.BKMSDS = PG_EXCPDTC ENDIFC EVALPMG.OTMSDS = PG_FLINFOC EXSR#EXIT**C ENDSR

交易程序样例以6位交易码000000为例,交易程序名为T000000A,有两个输入T000000I1,T000000I2,两个输出T000000O1,T00000O2。其中I2和O2是数组。

T000000I1程序如下。

AREF(DICT)AR RT000000I1A BKBRNO RREFFLD(@@BRNO)ACOLHDG(‘机构’)ATEXT(‘机构’)

T000000I2程序如下。

AREF(DICT)AR RT000000I2A BKTLNO RREFFLD(@@TLNO)ACOLHDG(‘柜员’)ATEXT(‘柜员’)

T000000O1程序如下。

AREF(DICT)AR RT000000O1A BKTRWB RREFFLD(@@TRWB)ACOLHDG(‘交易流水号’)ATEXT(‘交易流水号’)

T000000O1程序如下。

AREF(DICT)AR RT000000O2A BKACNO RREFFLD(@@ACNO)ACOLHDG(‘账号’)ATEXT(‘账号’)

交易程序T000000A程序如下。

**BEGIN*****************************************************************程序名称:交易程序模板 ***功能描述:交易程序开发规范 *** ***设计人员:CSWWM 开发人员:CSWWM***设计日期:-08-30开发日期:-08-30 ***——————————————————————-***维护人员:CSWYJ ***维护日期:-10-17 ***维护内容:按新规范改写 *** ***END*****************************************************************H/COPY DSCPPGM,HEAD************************************************************************引入数据字典枚举常量D/COPY DSCPPGM,ENUM**引入公共程序体D/COPY DSCPPGM,PGDS************************************************************************决定是否以*LR=*ON结束,统一使用激活组管理则保持注释D*/DEFINE USELR**定义常量DC_I1 C CONST(‘交易程序模版’)DC_MGBRNO C CONST(‘机构号’)DC_NBI2 C CONST(20)DC_NBO2 C CONST(20)***************************引入调用服务原型D/COPY CETPEXP,SCETPSVPD/COPY CNCMSVC,SCNCMTAP**定义参照外部结构的结构、数组DT_INHD E DS EXTNAME(INHD)QUALIFIED TEMPLATEDT_INFE E DS EXTNAME(INFE)QUALIFIED TEMPLATEDT_INCS E DS EXTNAME(INCS)QUALIFIED TEMPLATEDT_OTHD E DS EXTNAME(OTHD)QUALIFIED TEMPLATEDT_OTVC E DS EXTNAME(OTVC)QUALIFIED TEMPLATEDT_I1 E DS EXTNAME(T000000I1) QUALIFIED TEMPLATEDT_I2 E DS EXTNAME(T000000I2) QUALIFIED TEMPLATEDT_O1 E DS EXTNAME(T000000O1) QUALIFIED TEMPLATEDT_O2 E DS EXTNAME(T000000O2) QUALIFIED TEMPLATE***************************定义参照内部结构、变量(LIKE)的结构、数组DPIN DS QUALIFIEDD INHDLIKEDS(T_INHD)D INFEDIM(C_NBINFE) LIKEDS(T_INFE)D INCSDIM(C_NBINCS) LIKEDS(T_INCS)D I1 LIKEDS(T_I1)D I2 DIM(C_NBI2) LIKEDS(T_I2)**DPOT DS QUALIFIEDD OTHDLIKEDS(T_OTHD)D OTVCDIM(C_NBOTVC) LIKEDS(T_OTVC)D O1 LIKEDS(T_O1)D O2 DIM(C_NBO2) LIKEDS(T_O2)***************************临时变量(无法参照定义)的结构体DD_VARS DS**定义参照数据字典(LIKE)的变量D V_BKTRWB LIKE(DICT.@@TRWB)**定义无法参照(自定义)的临时变量D V_NUM5P 0************************************************************************定义程序入口C*ENTRY PLISTC PARM PMGC PARM PINC PARM POT/FREEEXSR @INIT;EXSR @CHEK;EXSR @MAIN;EXSR @RETN;EXSR #EXIT;//—————————————//程序初始化//—————————————BEGSR @INIT;//初始化公共定义的结构CLEAR PMG;CLEAR A_MSDS;//初始化交易自有输出接口,注意已在覆盖方法中初始化过OTHD,OTVC的不要清CLEAR POT.O1;CLEAR POT.O2;//初始化自定义结构CLEAR D_VARS;ENDSR;//—————————————//检查输入接口值的正确性//—————————————BEGSR @CHEK;//机构号必输IF PIN.I1.BKBRNO = *BLANKS;EVAL PMG.BKMSID = ‘EIOND’;EVAL A_MSDS(1) = C_I1;EVAL A_MSDS(2) = C_MGBRNO;EXSR #ERR;ENDIF;//—————————————//程序的主流程//—————————————BEGSR @MAIN;//变更CLEAR TPSVF1;CLEAR TPSVF2;EVAL TPSVF1.BKBRNO = PIN.I1.BKBRNO;CALLP SCETPSV(PMG:TPSVF1:TPSVF2);EXSR #CHKMSG;//调用某模块记账服务//CALLP SCETPAC(PMG:TPSVF1:POT.OTVC);//EXSR #CHKMSG;ENDSR;//—————————————//程序返回处理//—————————————BEGSR @RETN;//登记返回数组条数CLEAR TPSVF1;EVAL CMTAF1.RDYNFG = YNFG_NO;EVAL CMTAF1.WTYNFG = YNFG_YES;EVAL CMTAF1.FDFLNM = ‘O2RECD’;EVAL CMTAF1.FDSQNU = V_NUM;CALLP SCNCMTA(PMG:CMTAF1);EXSR #CHKMSG;ENDSR;/END-FREEC/COPY DSCPPGM,PGCM

在交易程序中,如果需要调用模块组件,那么会用/COPY引入组件的PROTOTYPE声明和组件参数结构定义,这部分在组件样例中介绍。

交易的参数统一为3个。先是PMG,错误信息结构,用于将出错信息返回主控,判断交易是否成功,组织出错报文。再是PIN,输入复合结构,依次由INHD输入应用头,INFE输入费用数组,INCS输入券面数组,I1,I2等交易自身结构组成。最后是POT,输出复合结构,依次由OTHD输出应用头,OTVC输出记账传票数组,O1,O2等交易自身结构组成。这部分可以参见报文格式一节内容。

程序中将所有临时变量都定义在D_VARS结构下,这样方便一开始的初始化,可以用CLEAR D_VARS直接清值。

交易程序中调用了组件程序模版SCETPSV,同样第一个参数要是PMG,这样结合#CHKMSG,可以让出错信息层层传递返回。接着是组件自己的参数。如果是记账组件,那么最后一个参数必须是传票数组POT.OTVC层层传递,以实现将交易所有产生的记账传票流水按套顺序重组,返回前端打印。现有的很多系统,只能体现交易所有借贷传票,无法体现传票先后顺序,也不能按会计原理进行最小成套归类,并保证每套不会出现多借多贷,而Firebird则做到了这一点。

在返回处理过程中,特别注意如果是输出有数组,需要在这段中调用SCNCMTA设置输出数组实际有值的条数,主控会根据实际条数去简化返回报文。

组件程序样例SCETPSV,除了固定的PMG参数外,有F1,F2两个自有参数。组件由SCETPSVP组件声明,SCETPSVF1,SCETPSVF2两个参数结构定义,SCETPSV组件程序这几个部分组成。

SCETPSVF1参数文件如下。

AREF(DICT)AR RSCETPSVF1A BKBRNO RREFFLD(@@BRNO)ACOLHDG(‘机构号’)ATEXT(‘机构号’)

SCETPSVF2参数文件如下。

AREF(DICT)AR RSCETPSVF2A MTTLNO RREFFLD(@@TLNO)ACOLHDG(‘柜员号’)ATEXT(‘柜员号’)

SCETPSVP组件声明文件如下。

**BEGIN*****************************************************************程序名称:服务程序模板原型 ***功能描述:服务程序模版原型及参数接口定义 *** ***版本:-10-21_1*** ***设计人员:CSWWM 开发人员:CSWWM***设计日期:-08-30开发日期:-08-30 ***——————————————————————-***维护人员:CSWYJ ***维护日期:-10-17 ***维护内容:按新规范改写 *** ***END*******************************************************************常量定义DC_NBTPSVF2 C CONST(50)***************************参数接口定义DTPSVF1 E DS EXTNAME(SCETPSVF1) QUALIFIEDDT_TPSVF2 E DS EXTNAME(SCETPSVF2) QUALIFIED TEMPLATEDTPSVF2 DS QUALIFIEDD RECDLIKE(DICT.@@RECD)D ARR DIM(C_NBTPSVF2) LIKEDS(T_TPSVF2)***************************程序原型定义DSCETPSVPR EXTPGM(‘SCETPSV’)D PMG LIKEDS(PMG)D TPSVF1 LIKEDS(TPSVF1)D TPSVF2 LIKEDS(TPSVF2)

这里要注意的是,组件的数组与交易接口数组不同,全部是带上RECD实际记录条数的复合结构。这样才能知道最大容量的数组,实际存放了多少条有效记录。

组件程序SCETPSV文件如下。

**BEGIN*****************************************************************程序名称:组件程序模板 ***功能描述:组件程序开发规范 *** ***设计人员:CSWWM 开发人员:CSWWM***设计日期:-08-30开发日期:-08-30 ***——————————————————————-***维护人员: ***维护日期: ***维护内容: *** ***END*****************************************************************H/COPY DSCPPGM,HEAD************************************************************************在F表中声明的程序操作的数据表,且同时声明数据表的操作方式**数据表声明顺序如下:**1)、声明操作方式为只读(I)的数据表;**2)、声明操作方式为读(I)、写(A)的数据表;**3)、声明操作方式为更改(U)的数据表;**4)、声明操作方式为更新(U)、写(A)的数据表;**5)、声明操作方式为只写(O)的数据表;FACNBRMF UF E K DISK INFSR(#FLEX) INFDS(S_CNBRMF)FQUALIFIEDFACNTLMF UF A E K DISK INFSR(#FLEX) INFDS(S_CNTLMF)FQUALIFIED COMMIT************************************************************************引入数据字典枚举常量D/COPY DSCPPGM,ENUM**引入程序公共结构D/COPY DSCPPGM,PGDS***************************文件结构定义DS_CNBRMF DS LIKEDS(FILESDS)DK_CNBRMF DS LIKEREC(ACNBRMF.RACNBRMF:*KEY)DR_CNBRMF DS LIKEREC(ACNBRMF.RACNBRMF:*INPUT)DW_CNBRMF DS LIKEREC(ACNBRMF.RACNBRMF:*OUTPUT)DS_CNTLMF DS LIKEDS(FILESDS)DR_CNTLMF DS LIKEREC(ACNTLMF.RACNTLMF:*INPUT)***************************决定是否以*LR=*ON结束D*/DEFINE USELR**常量定义DC_F1 C CONST(‘组件程序模版’)DC_MGBRMF C CONST(‘机构表’)DC_MGBRNO C CONST(‘机构号’)***************************引入调用服务原型D/COPY CETPEXP,SCETPSVP**定义参照外部结构(EXTNAME)的结构、数组**定义参照内部结构、变量(LIKE)的结构、数组***************************临时变量结构DD_VARS DS**定义参照数据字典(LIKE)的变量D V_BKBRNO LIKE(DICT.@@BRNO)**定义无法参照的临时变量D V_NUM5P 0**********************************************************************程序入口定义C*ENTRY PLISTC PARM PMGC PARM TPSVF1C PARM TPSVF2/FREEEXSR @INIT;EXSR @CHEK;EXSR @MAIN;EXSR #EXIT;//———————————————————//程序初始化//———————————————————BEGSR @INIT;//初始化公共定义的结构CLEAR PMG;CLEAR A_MSDS;//初始化文件读取操作结构,除文件异常结构外CLEAR K_CNBRMF;CLEAR R_CNBRMF;CLEAR R_CNTLMF;//初始化自定义结构CLEAR D_VARS;ENDSR;//———————————————————//检查接口传递值的正确性//———————————————————BEGSR @CHEK;//机构号为空IF TPSVF1.BKBRNO = *BLANKS;PMG.BKMSID = ‘EIOND’;A_MSDS(1) = C_F1;A_MSDS(2) = C_MGBRNO;EXSR #ERR;ENDIF;ENDSR;//———————————————————//程序的主流程//———————————————————BEGSR @MAIN;K_CNBRMF.BKBRNO = TPSVF1.BKBRNO;FILEDSP = %ADDR(S_CNBRMF);CHAIN %KDS(K_CNBRMF) ACNBRMF.RACNBRMF R_CNBRMF;IF NOT %FOUND(ACNBRMF);PMG.BKMSID = ‘ENTRD’;A_MSDS(1) = C_MGBRMF;A_MSDS(2) = C_MGBRNO + K_CNBRMF.BKBRNO;EXSR #ERR;ENDIF;EVAL-CORR W_CNBRMF = R_CNBRMF;UPDATE ACNBRMF.RACNBRMF W_CNBRMF;EVAL-CORR TPSVF2.ARR(1) = W_CNBRMF;ENDSR;/END-FREEC/COPY DSCPPGM,PGCM

这里值得注意的是,组件程序本身也要/COPY引入组件声明,以为声明包含了原型定义,以及参数结构定义。另外,由于引入了异常处理程序,现在应用程序编写起来就清晰多了,无需考虑各种文件操作的异常报错处理,是不是很方便呢。

至此,组件和交易模版介绍完了,按照这个模版,就可以编写实际使用的各个模块程序,挂在交易主控中执行了。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。