検索
ホームページphp教程php手册AS400银行核心系统开发中的技术总结--交易和组件写法

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

*交易和组件写法


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引入组件声明,以为声明包含了原型定义,以及参数结构定义。另外,由于引入了异常处理程序,现在应用程序编写起来就清晰多了,无需考虑各种文件操作的异常报错处理,是不是很方便呢。



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


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
如何在 iPhone 和 Android 上关闭蓝色警报如何在 iPhone 和 Android 上关闭蓝色警报Feb 29, 2024 pm 10:10 PM

根据美国司法部的解释,蓝色警报旨在提供关于可能对执法人员构成直接和紧急威胁的个人的重要信息。这种警报的目的是及时通知公众,并让他们了解与这些罪犯相关的潜在危险。通过这种主动的方式,蓝色警报有助于增强社区的安全意识,促使人们采取必要的预防措施以保护自己和周围的人。这种警报系统的建立旨在提高对潜在威胁的警觉性,并加强执法机构与公众之间的沟通,以共尽管这些紧急通知对我们社会至关重要,但有时可能会对日常生活造成干扰,尤其是在午夜或重要活动时收到通知时。为了确保安全,我们建议您保持这些通知功能开启,但如果

在Android中实现轮询的方法是什么?在Android中实现轮询的方法是什么?Sep 21, 2023 pm 08:33 PM

Android中的轮询是一项关键技术,它允许应用程序定期从服务器或数据源检索和更新信息。通过实施轮询,开发人员可以确保实时数据同步并向用户提供最新的内容。它涉及定期向服务器或数据源发送请求并获取最新信息。Android提供了定时器、线程、后台服务等多种机制来高效地完成轮询。这使开发人员能够设计与远程数据源保持同步的响应式动态应用程序。本文探讨了如何在Android中实现轮询。它涵盖了实现此功能所涉及的关键注意事项和步骤。轮询定期检查更新并从服务器或源检索数据的过程在Android中称为轮询。通过

如何在Android中实现按下返回键再次退出的功能?如何在Android中实现按下返回键再次退出的功能?Aug 30, 2023 am 08:05 AM

为了提升用户体验并防止数据或进度丢失,Android应用程序开发者必须避免意外退出。他们可以通过加入“再次按返回退出”功能来实现这一点,该功能要求用户在特定时间内连续按两次返回按钮才能退出应用程序。这种实现显著提升了用户参与度和满意度,确保他们不会意外丢失任何重要信息Thisguideexaminesthepracticalstepstoadd"PressBackAgaintoExit"capabilityinAndroid.Itpresentsasystematicguid

Android逆向中smali复杂类实例分析Android逆向中smali复杂类实例分析May 12, 2023 pm 04:22 PM

1.java复杂类如果有什么地方不懂,请看:JAVA总纲或者构造方法这里贴代码,很简单没有难度。2.smali代码我们要把java代码转为smali代码,可以参考java转smali我们还是分模块来看。2.1第一个模块——信息模块这个模块就是基本信息,说明了类名等,知道就好对分析帮助不大。2.2第二个模块——构造方法我们来一句一句解析,如果有之前解析重复的地方就不再重复了。但是会提供链接。.methodpublicconstructor(Ljava/lang/String;I)V这一句话分为.m

如何在2023年将 WhatsApp 从安卓迁移到 iPhone 15?如何在2023年将 WhatsApp 从安卓迁移到 iPhone 15?Sep 22, 2023 pm 02:37 PM

如何将WhatsApp聊天从Android转移到iPhone?你已经拿到了新的iPhone15,并且你正在从Android跳跃?如果是这种情况,您可能还对将WhatsApp从Android转移到iPhone感到好奇。但是,老实说,这有点棘手,因为Android和iPhone的操作系统不兼容。但不要失去希望。这不是什么不可能完成的任务。让我们在本文中讨论几种将WhatsApp从Android转移到iPhone15的方法。因此,坚持到最后以彻底学习解决方案。如何在不删除数据的情况下将WhatsApp

同样基于linux为什么安卓效率低同样基于linux为什么安卓效率低Mar 15, 2023 pm 07:16 PM

原因:1、安卓系统上设置了一个JAVA虚拟机来支持Java应用程序的运行,而这种虚拟机对硬件的消耗是非常大的;2、手机生产厂商对安卓系统的定制与开发,增加了安卓系统的负担,拖慢其运行速度影响其流畅性;3、应用软件太臃肿,同质化严重,在一定程度上拖慢安卓手机的运行速度。

Android中动态导出dex文件的方法是什么Android中动态导出dex文件的方法是什么May 30, 2023 pm 04:52 PM

1.启动ida端口监听1.1启动Android_server服务1.2端口转发1.3软件进入调试模式2.ida下断2.1attach附加进程2.2断三项2.3选择进程2.4打开Modules搜索artPS:小知识Android4.4版本之前系统函数在libdvm.soAndroid5.0之后系统函数在libart.so2.5打开Openmemory()函数在libart.so中搜索Openmemory函数并且跟进去。PS:小知识一般来说,系统dex都会在这个函数中进行加载,但是会出现一个问题,后

iOS 16.2 引入“自定义辅助功能模式”,为 iPhone 和 iPad 提供简化的体验iOS 16.2 引入“自定义辅助功能模式”,为 iPhone 和 iPad 提供简化的体验Apr 13, 2023 am 11:07 AM

苹果公司周二向开发人员发布了iOS 16.2 beta 2,因为该公司准备在 12 月向公众提供更新。正式地,它添加了新的 Freeform 协作应用程序和对 Home 应用程序的改进。在后台,9to5Mac发现 Apple 一直在开发一种新的“自定义辅助功能模式”,该模式将为 iPhone 和 iPad 提供“流线型”体验。自定义辅助功能模式这种代号为“Clarity”的新模式基本上用更精简的模式取代了 Springboard(这是 iOS 的主要界面)。该功能在当前测试版中仍对用户不可用,将

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境