Chinaunix首页 | 论坛 | 博客
  • 博客访问: 302213
  • 博文数量: 40
  • 博客积分: 1
  • 博客等级: 民兵
  • 技术积分: 670
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-31 11:19
个人简介

从事银行核心系统设计开发的程序猿

文章存档

2019年(1)

2018年(4)

2017年(11)

2016年(6)

2015年(18)

分类: 信息化

2016-04-13 02:46:06

*交易和组件写法


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


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

  1. **BEGIN***************************************************************
  2. **程序名称:程序公共控制头 *
  3. **功能描述:程序公共控制头 *
  4. ** *
  5. **版本:2014-10-21_1 *
  6. ** *
  7. **设计人员:PACMAN 开发人员:AUTOGEN *
  8. **设计日期:2011-08-30 开发日期:2011-08-30 *
  9. ** *
  10. **END*****************************************************************
  11. **
  12. HCOPYRIGHT('Firebird V2.1 corebanking system, CSW SHANGHAI')
  13. HDATFMT(*ISO) TIMFMT(*ISO) DATEDIT(*YMD)
然后是ENUM,这个文件是引入枚举常量定义,在数据字典和枚举值部分已经有了介绍,这里就不重复了。
接下来是PGDS,这个文件定义了每个程序都会引入的PSDS和INFDS结构定义,错误结构定义,错误信息数组,接口数组条数,以及特殊用途变量等。
  1. **BEGIN***************************************************************
  2. **程序名称:程序公共控制头 *
  3. **功能描述:程序公共控制头 *
  4. ** *
  5. **版本:2014-11-23_1 *
  6. ** *
  7. **设计人员:PACMAN 开发人员:AUTOGEN *
  8. **设计日期:2011-08-30 开发日期:2011-08-30 *
  9. ** *
  10. **END*****************************************************************
  11. **
  12. **公共常量
  13. **输出传票数组条数
  14. DC_NBOTVC C CONST(100)
  15. **输入券别数组条数
  16. DC_NBINCS C CONST(30)
  17. **输入费用数组条数
  18. DC_NBINFE C CONST(30)
  19. **输出费用数组条数
  20. DC_NBOTFE C CONST(30)
  21. **替换错误参数条数
  22. DC_NBMSDS C CONST(9)
  23. **记录被锁错误信息
  24. DC_MGLOCK C CONST('记录被锁')
  25. **********************************************************************
  26. **错误处理结构
  27. **程序状态结构
  28. DRPGPSDS SDS
  29. D PG_MAINPROC 1 10A
  30. D PG_STATUS 11 15A
  31. D PG_PRVSTAT 16 20A
  32. D PG_SRCLINE 21 28A
  33. D PG_ROUTINE 29 36A
  34. D PG_PARMNUM 37 39S 0
  35. D PG_MSID 40 46A
  36. D PG_PGMLIB 81 90A
  37. D PG_EXCPDT 91 170A
  38. D PG_LSERRFL 175 184A
  39. D PG_JOBDATE 191 198A
  40. D PG_FLINFO 209 243A
  41. D PG_JOBNAME 244 253A
  42. D PG_JOBUSER 254 263A
  43. D PG_JOBNUM 264 269S 0
  44. D PG_RUNDATE 276 281S 0
  45. D PG_RUNTIME 282 287S 0
  46. D PG_SRCFILE 304 313A
  47. D PG_SRCLIB 314 323A
  48. D PG_SRCMBR 324 333A
  49. D PG_PGMNAME 334 343A
  50. D PG_MODNAME 344 353A
  51. D PG_SRCLNADD 354 355B 0
  52. D PG_FLILNADD 356 357B 0
  53. D PG_USRPRF 358 367A
  54. D PG_EXTERR 368 371I 0
  55. **文件状态结构
  56. DFILESDS DS BASED(FILEDSP)
  57. D FL_FILE 1 8A
  58. D FL_OPNIND 9 9A
  59. D FL_EOFIND 10 10A
  60. D FL_STATUS 11 15S 0
  61. D FL_OPCODE 16 21A
  62. D FL_ROUTINE 22 29A
  63. D FL_SRCLINE 30 37A
  64. D FL_RECORD 38 45A
  65. D FL_MSID 46 52A
  66. D FL_SRCLNADD 77 78B 0
  67. D FL_ODPTYPE 81 82A
  68. D FL_FILENAME 83 92A
  69. D FL_LIBRARY 93 102A
  70. D FL_SPLFILE 103 112A
  71. D FL_SPLLIB 113 122A
  72. D FL_RCDLEN 125 126I 0
  73. D FL_KEYLEN 127 128I 0
  74. D FL_MEMBER 129 138A
  75. D FL_TYPE 147 148I 0
  76. D FL_RCDNUM 156 159I 0
  77. D FL_SPLNUM 160 163I 0
  78. D FL_OVERFLOW 188 189I 0
  79. D FL_BASEDMBRS 211 212I 0
  80. D FL_OPENID 214 215B 0
  81. D FL_RCDFMTLEN 216 217I 0
  82. D FL_CCSID 218 219I 0
  83. D FL_FBSIZE 367 370I 0
  84. D FL_KEYNUM 387 388I 0
  85. D FL_FBKEYLEN 393 394I 0
  86. D FL_MBRNUM 395 396I 0
  87. D FL_RRN 397 400I 0
  88. D FL_KEY 401 2400A
  89. **文件状态结构指针
  90. DFILEDSP S *
  91. **********************************************************************
  92. **公共结构
  93. **引入数据字典
  94. DDICT E DS EXTNAME(DICT) QUALIFIED TEMPLATE
  95. **公共错误信息接口
  96. DPMG E DS EXTNAME(MESG) QUALIFIED
  97. **错误信息替换数组
  98. DA_MSDS S DIM(C_NBMSDS) LIKE(DICT.@@MSDS)
  99. **********************************************************************
  100. **特殊变量
  101. **是否执行过错误处理程序
  102. DPG_ERYNFG S LIKE(DICT.@@YNFG) INZ(YNFG_NO)
  103. **是否程序已执行初始化
  104. DPG_FRYNFG S LIKE(DICT.@@YNFG) INZ(YNFG_YES)
最后是通用处理过程PGCM,这个程序定义了错误捕获程序以及检查,退出等通用过程,并以#开头的过程名,与交易中普通@开头过程名以示区分。
  1. **BEGIN***************************************************************
  2. **程序名称:程序公共子程序 *
  3. **功能描述:程序公共子程序 *
  4. ** *
  5. **版本:2014-10-21_1 *
  6. ** *
  7. **设计人员:PACMAN 开发人员:AUTOGEN *
  8. **设计日期:2011-08-30 开发日期:2011-08-30 *
  9. ** *
  10. **END*****************************************************************
  11. **
  12. **********************************************************************
  13. ** #EXIT返回
  14. **********************************************************************
  15. C #EXIT BEGSR
  16. **
  17. C EVAL PG_FRYNFG = YNFG_NO
  18. C/IF DEFINED(USELR)
  19. C EVAL *INLR = *ON
  20. C/ENDIF
  21. C RETURN
  22. **
  23. C ENDSR
  24. **********************************************************************
  25. ** #ERR 取错误信息
  26. **********************************************************************
  27. C #ERR BEGSR
  28. **
  29. C EVAL PMG.MSFLNM = PG_SRCMBR
  30. C IF PMG.BKMSDS = *BLANKS
  31. C CALL 'SCNCMMG'
  32. C PARM PMG
  33. C PARM A_MSDS
  34. C ENDIF
  35. C EXSR #EXIT
  36. **
  37. C ENDSR
  38. **********************************************************************
  39. ** #CHKMSG检查程序返回信息
  40. **********************************************************************
  41. C #CHKMSG BEGSR
  42. **
  43. C IF PMG.BKMSID <> *BLANKS
  44. C EXSR #EXIT
  45. C ENDIF
  46. **
  47. C ENDSR
  48. **********************************************************************
  49. ** *PSSR程序异常处理
  50. **********************************************************************
  51. C *PSSR BEGSR
  52. **
  53. C IF PG_ERYNFG = YNFG_NO
  54. C EVAL PG_ERYNFG = YNFG_YES
  55. C EVAL PMG.MSFLNM = PG_SRCMBR
  56. C EVAL PMG.MSCDLN = PG_SRCLINE
  57. C EVAL PMG.BKMSID = 'F' + PG_MSID
  58. C EVAL PMG.BKMSDS = PG_EXCPDT
  59. C EVAL PMG.OTMSDS = PG_STATUS+' '+PG_PGMLIB+' '+
  60. C PG_PGMNAME
  61. C EXSR #EXIT
  62. C ENDIF
  63. **
  64. C ENDSR
  65. **********************************************************************
  66. ** #FLEX文件异常处理
  67. **********************************************************************
  68. C #FLEX BEGSR
  69. **
  70. C EVAL PMG.MSFLNM = PG_SRCMBR
  71. C EVAL PMG.MSCDLN = FL_SRCLINE
  72. C EVAL PMG.BKMSID = 'F' + FL_MSID
  73. C IF FL_STATUS = 1218
  74. C CALL 'GETOBJTXT'
  75. C PARM FL_LIBRARY V_FLEXLIB 10
  76. C PARM FL_FILENAME V_FLEXOBJ 10
  77. C PARM '*FILE' V_FLEXTYP 7
  78. C PARM *BLANKS V_FLEXTEXT 50
  79. C EVAL PMG.BKMSDS = %TRIM(V_FLEXTEXT) +
  80. C %TRIM(FL_FILENAME) + '.' +
  81. C %TRIM(FL_MEMBER) + C_MGLOCK +
  82. C ',' + PG_EXCPDT
  83. C ELSE
  84. C EVAL PMG.BKMSDS = PG_EXCPDT
  85. C ENDIF
  86. C EVAL PMG.OTMSDS = PG_FLINFO
  87. C EXSR #EXIT
  88. **
  89. C ENDSR


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

  1. A REF(DICT)
  2. A R RT000000I1
  3. A BKBRNO R REFFLD(@@BRNO)
  4. A COLHDG('机构')
  5. A TEXT('机构')
T000000I2程序如下。
  1. A REF(DICT)
  2. A R RT000000I2
  3. A BKTLNO R REFFLD(@@TLNO)
  4. A COLHDG('柜员')
  5. A TEXT('柜员')
T000000O1程序如下。
  1. A REF(DICT)
  2. A R RT000000O1
  3. A BKTRWB R REFFLD(@@TRWB)
  4. A COLHDG('交易流水号')
  5. A TEXT('交易流水号')
T000000O1程序如下。
  1. A REF(DICT)
  2. A R RT000000O2
  3. A BKACNO R REFFLD(@@ACNO)
  4. A COLHDG('账号')
  5. A TEXT('账号')
交易程序T000000A程序如下。
  1. **BEGIN***************************************************************
  2. **程序名称:交易程序模板 *
  3. **功能描述:交易程序开发规范 *
  4. ** *
  5. **设计人员:CSWWM 开发人员:CSWWM *
  6. **设计日期:2011-08-30 开发日期:2011-08-30 *
  7. **-------------------------------------------------------------------*
  8. **维护人员:CSWYJ *
  9. **维护日期:2014-10-17 *
  10. **维护内容:按新规范改写 *
  11. ** *
  12. **END*****************************************************************
  13. H/COPY DSCPPGM,HEAD
  14. **********************************************************************
  15. **引入数据字典枚举常量
  16. D/COPY DSCPPGM,ENUM
  17. **引入公共程序体
  18. D/COPY DSCPPGM,PGDS
  19. **********************************************************************
  20. **决定是否以*LR=*ON结束,统一使用激活组管理则保持注释
  21. D*/DEFINE USELR
  22. **定义常量
  23. DC_I1 C CONST('交易程序模版')
  24. DC_MGBRNO C CONST('机构号')
  25. DC_NBI2 C CONST(20)
  26. DC_NBO2 C CONST(20)
  27. *************************
  28. **引入调用服务原型
  29. D/COPY CETPEXP,SCETPSVP
  30. D/COPY CNCMSVC,SCNCMTAP
  31. **定义参照外部结构的结构、数组 
  32. DT_INHD E DS EXTNAME(INHD) QUALIFIED TEMPLATE
  33. DT_INFE E DS EXTNAME(INFE) QUALIFIED TEMPLATE
  34. DT_INCS E DS EXTNAME(INCS) QUALIFIED TEMPLATE
  35. DT_OTHD E DS EXTNAME(OTHD) QUALIFIED TEMPLATE
  36. DT_OTVC E DS EXTNAME(OTVC) QUALIFIED TEMPLATE
  37. DT_I1 E DS EXTNAME(T000000I1) QUALIFIED TEMPLATE
  38. DT_I2 E DS EXTNAME(T000000I2) QUALIFIED TEMPLATE
  39. DT_O1 E DS EXTNAME(T000000O1) QUALIFIED TEMPLATE
  40. DT_O2 E DS EXTNAME(T000000O2) QUALIFIED TEMPLATE
  41. *************************
  42. **定义参照内部结构、变量(LIKE)的结构、数组
  43. DPIN DS QUALIFIED
  44. D INHD LIKEDS(T_INHD)
  45. D INFE DIM(C_NBINFE) LIKEDS(T_INFE)
  46. D INCS DIM(C_NBINCS) LIKEDS(T_INCS)
  47. D I1 LIKEDS(T_I1)
  48. D I2 DIM(C_NBI2) LIKEDS(T_I2)
  49. **
  50. DPOT DS QUALIFIED
  51. D OTHD LIKEDS(T_OTHD)
  52. D OTVC DIM(C_NBOTVC) LIKEDS(T_OTVC)
  53. D O1 LIKEDS(T_O1)
  54. D O2 DIM(C_NBO2) LIKEDS(T_O2)
  55. *************************
  56. **临时变量(无法参照定义)的结构体
  57. DD_VARS DS
  58. **定义参照数据字典(LIKE)的变量 
  59. D V_BKTRWB LIKE(DICT.@@TRWB)
  60. **定义无法参照(自定义)的临时变量 
  61. D V_NUM 5P 0
  62. **********************************************************************
  63. **定义程序入口
  64. C *ENTRY PLIST
  65. C PARM PMG
  66. C PARM PIN
  67. C PARM POT
  68. /FREE
  69. EXSR @INIT;
  70. EXSR @CHEK;
  71. EXSR @MAIN;
  72. EXSR @RETN;
  73. EXSR #EXIT;
  74. //---------------------------------------
  75. //程序初始化
  76. //---------------------------------------
  77. BEGSR @INIT;
  78. //初始化公共定义的结构
  79. CLEAR PMG;
  80. CLEAR A_MSDS;
  81. //初始化交易自有输出接口,注意已在覆盖方法中初始化过OTHD,OTVC的不要清
  82. CLEAR POT.O1;
  83. CLEAR POT.O2;
  84. //初始化自定义结构
  85. CLEAR D_VARS;
  86. ENDSR;
  87. //---------------------------------------
  88. //检查输入接口值的正确性
  89. //---------------------------------------
  90. BEGSR @CHEK;
  91. //机构号必输
  92. IF PIN.I1.BKBRNO = *BLANKS;
  93. EVAL PMG.BKMSID = 'EIOND';
  94. EVAL A_MSDS(1) = C_I1;
  95. EVAL A_MSDS(2) = C_MGBRNO;
  96. EXSR #ERR;
  97. ENDIF;
  98. //---------------------------------------
  99. //程序的主流程
  100. //---------------------------------------
  101. BEGSR @MAIN;
  102. //变更
  103. CLEAR TPSVF1;
  104. CLEAR TPSVF2;
  105. EVAL TPSVF1.BKBRNO = PIN.I1.BKBRNO;
  106. CALLP SCETPSV(PMG:TPSVF1:TPSVF2);
  107. EXSR #CHKMSG;
  108. //调用某模块记账服务
  109. //CALLP SCETPAC(PMG:TPSVF1:POT.OTVC);
  110. //EXSR #CHKMSG;
  111. ENDSR;
  112. //---------------------------------------
  113. //程序返回处理
  114. //---------------------------------------
  115. BEGSR @RETN;
  116. //登记返回数组条数
  117. CLEAR TPSVF1;
  118. EVAL CMTAF1.RDYNFG = YNFG_NO;
  119. EVAL CMTAF1.WTYNFG = YNFG_YES;
  120. EVAL CMTAF1.FDFLNM = 'O2RECD';
  121. EVAL CMTAF1.FDSQNU = V_NUM;
  122. CALLP SCNCMTA(PMG:CMTAF1);
  123. EXSR #CHKMSG;
  124. ENDSR;
  125. /END-FREE
  126. C/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参数文件如下。

  1. A REF(DICT)
  2. A R RSCETPSVF1
  3. A BKBRNO R REFFLD(@@BRNO)
  4. A COLHDG('机构号')
  5. A TEXT('机构号')
SCETPSVF2参数文件如下。
  1. A REF(DICT)
  2. A R RSCETPSVF2
  3. A MTTLNO R REFFLD(@@TLNO)
  4. A COLHDG('柜员号')
  5. A TEXT('柜员号')
SCETPSVP组件声明文件如下。
  1. **BEGIN***************************************************************
  2. **程序名称:服务程序模板原型 *
  3. **功能描述:服务程序模版原型及参数接口定义 *
  4. ** *
  5. **版本:2014-10-21_1 *
  6. ** *
  7. **设计人员:CSWWM 开发人员:CSWWM *
  8. **设计日期:2011-08-30 开发日期:2011-08-30 *
  9. **-------------------------------------------------------------------*
  10. **维护人员:CSWYJ *
  11. **维护日期:2014-10-17 *
  12. **维护内容:按新规范改写 *
  13. ** *
  14. **END*****************************************************************
  15. **常量定义
  16. DC_NBTPSVF2 C CONST(50)
  17. *************************
  18. **参数接口定义
  19. DTPSVF1 E DS EXTNAME(SCETPSVF1) QUALIFIED
  20. DT_TPSVF2 E DS EXTNAME(SCETPSVF2) QUALIFIED TEMPLATE
  21. DTPSVF2 DS QUALIFIED
  22. D RECD LIKE(DICT.@@RECD)
  23. D ARR DIM(C_NBTPSVF2) LIKEDS(T_TPSVF2)
  24. *************************
  25. **程序原型定义
  26. DSCETPSV PR EXTPGM('SCETPSV')
  27. D PMG LIKEDS(PMG)
  28. D TPSVF1 LIKEDS(TPSVF1)
  29. D TPSVF2 LIKEDS(TPSVF2)
这里要注意的是,组件的数组与交易接口数组不同,全部是带上RECD实际记录条数的复合结构。这样才能知道最大容量的数组,实际存放了多少条有效记录。
组件程序SCETPSV文件如下。
  1. **BEGIN***************************************************************
  2. **程序名称:组件程序模板 *
  3. **功能描述:组件程序开发规范 *
  4. ** *
  5. **设计人员:CSWWM 开发人员:CSWWM *
  6. **设计日期:2011-08-30 开发日期:2011-08-30 *
  7. **-------------------------------------------------------------------*
  8. **维护人员: *
  9. **维护日期: *
  10. **维护内容: *
  11. ** *
  12. **END*****************************************************************
  13. H/COPY DSCPPGM,HEAD
  14. **********************************************************************
  15. **在F表中声明的程序操作的数据表,且同时声明数据表的操作方式
  16. **数据表声明顺序如下:
  17. **1)、声明操作方式为只读(I)的数据表;
  18. **2)、声明操作方式为读(I)、写(A)的数据表;
  19. **3)、声明操作方式为更改(U)的数据表;
  20. **4)、声明操作方式为更新(U)、写(A)的数据表;
  21. **5)、声明操作方式为只写(O)的数据表;
  22. FACNBRMF UF E K DISK INFSR(#FLEX) INFDS(S_CNBRMF)
  23. F QUALIFIED
  24. FACNTLMF UF A E K DISK INFSR(#FLEX) INFDS(S_CNTLMF)
  25. F QUALIFIED COMMIT
  26. **********************************************************************
  27. **引入数据字典枚举常量
  28. D/COPY DSCPPGM,ENUM
  29. **引入程序公共结构
  30. D/COPY DSCPPGM,PGDS
  31. *************************
  32. **文件结构定义
  33. DS_CNBRMF DS LIKEDS(FILESDS)
  34. DK_CNBRMF DS LIKEREC(ACNBRMF.RACNBRMF:*KEY)
  35. DR_CNBRMF DS LIKEREC(ACNBRMF.RACNBRMF:*INPUT)
  36. DW_CNBRMF DS LIKEREC(ACNBRMF.RACNBRMF:*OUTPUT)
  37. DS_CNTLMF DS LIKEDS(FILESDS)
  38. DR_CNTLMF DS LIKEREC(ACNTLMF.RACNTLMF:*INPUT)
  39. *************************
  40. **决定是否以*LR=*ON结束
  41. D*/DEFINE USELR
  42. **常量定义
  43. DC_F1 C CONST('组件程序模版')
  44. DC_MGBRMF C CONST('机构表')
  45. DC_MGBRNO C CONST('机构号')
  46. *************************
  47. **引入调用服务原型
  48. D/COPY CETPEXP,SCETPSVP
  49. **定义参照外部结构(EXTNAME)的结构、数组 
  50. **定义参照内部结构、变量(LIKE)的结构、数组
  51. *************************
  52. **临时变量结构
  53. DD_VARS DS
  54. **定义参照数据字典(LIKE)的变量 
  55. D V_BKBRNO LIKE(DICT.@@BRNO)
  56. **定义无法参照的临时变量 
  57. D V_NUM 5P 0
  58. ********************************************************************
  59. **程序入口定义
  60. C *ENTRY PLIST
  61. C PARM PMG
  62. C PARM TPSVF1
  63. C PARM TPSVF2
  64. /FREE
  65. EXSR @INIT;
  66. EXSR @CHEK;
  67. EXSR @MAIN;
  68. EXSR #EXIT;
  69. //---------------------------------------------------------
  70. //程序初始化
  71. //---------------------------------------------------------
  72. BEGSR @INIT;
  73. //初始化公共定义的结构
  74. CLEAR PMG;
  75. CLEAR A_MSDS;
  76. //初始化文件读取操作结构,除文件异常结构外
  77. CLEAR K_CNBRMF;
  78. CLEAR R_CNBRMF;
  79. CLEAR R_CNTLMF;
  80. //初始化自定义结构
  81. CLEAR D_VARS;
  82. ENDSR;
  83. //---------------------------------------------------------
  84. //检查接口传递值的正确性
  85. //---------------------------------------------------------
  86. BEGSR @CHEK;
  87. //机构号为空
  88. IF TPSVF1.BKBRNO = *BLANKS;
  89. PMG.BKMSID = 'EIOND';
  90. A_MSDS(1) = C_F1;
  91. A_MSDS(2) = C_MGBRNO;
  92. EXSR #ERR;
  93. ENDIF;
  94. ENDSR;
  95. //---------------------------------------------------------
  96. //程序的主流程
  97. //---------------------------------------------------------
  98. BEGSR @MAIN;
  99. K_CNBRMF.BKBRNO = TPSVF1.BKBRNO;
  100. FILEDSP = %ADDR(S_CNBRMF);
  101. CHAIN %KDS(K_CNBRMF) ACNBRMF.RACNBRMF R_CNBRMF;
  102. IF NOT %FOUND(ACNBRMF);
  103. PMG.BKMSID = 'ENTRD';
  104. A_MSDS(1) = C_MGBRMF;
  105. A_MSDS(2) = C_MGBRNO + K_CNBRMF.BKBRNO;
  106. EXSR #ERR;
  107. ENDIF;
  108. EVAL-CORR W_CNBRMF = R_CNBRMF;
  109. UPDATE ACNBRMF.RACNBRMF W_CNBRMF;
  110. EVAL-CORR TPSVF2.ARR(1) = W_CNBRMF;
  111. ENDSR;
  112. /END-FREE
  113. C/COPY DSCPPGM,PGCM
这里值得注意的是,组件程序本身也要/COPY引入组件声明,以为声明包含了原型定义,以及参数结构定义。另外,由于引入了异常处理程序,现在应用程序编写起来就清晰多了,无需考虑各种文件操作的异常报错处理,是不是很方便呢。



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


阅读(28620) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

尹守铖2016-05-07 16:11:32

您好,我现在遇到AS400方面的问题,希望您能指导一下,QQ:779675377,微信:yinshoucheng。非常感谢