목차
AS400银行核心系统开发中的技术总结--交易和组件写法
백엔드 개발 PHP 튜토리얼 AS400银行核心系统开发中的技术总结--交易和组件写法_PHP教程

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

Jul 12, 2016 am 08:54 AM
android

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



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


www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1119675.htmlTechArticleAS400银行核心系统开发中的技术总结--交易和组件写法 *交易和组件写法 Firebird核心系统的整体结构,是由主控--交易--组件这几个层次组成的...
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 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 Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
2 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

새로운 보고서는 소문난 삼성 갤럭시 S25, 갤럭시 S25 플러스, 갤럭시 S25 울트라 카메라 업그레이드에 대한 비판적인 평가를 제공합니다. 새로운 보고서는 소문난 삼성 갤럭시 S25, 갤럭시 S25 플러스, 갤럭시 S25 울트라 카메라 업그레이드에 대한 비판적인 평가를 제공합니다. Sep 12, 2024 pm 12:23 PM

최근 아이스 유니버스는 삼성의 차기 플래그십 스마트폰으로 널리 알려진 갤럭시 S25 울트라에 대한 세부 정보를 꾸준히 공개해 왔습니다. 무엇보다도 유출자는 삼성이 카메라 업그레이드를 하나만 가져올 계획이라고 주장했습니다.

삼성 갤럭시 S25 울트라, 디자인 변경 루머가 공개된 첫 번째 렌더링 이미지 유출 삼성 갤럭시 S25 울트라, 디자인 변경 루머가 공개된 첫 번째 렌더링 이미지 유출 Sep 11, 2024 am 06:37 AM

OnLeaks는 이제 Android Headlines와 제휴하여 X(이전 Twitter) 팔로어로부터 4,000달러 이상의 수익을 창출하려는 시도가 실패한 지 며칠 후 Galaxy S25 Ultra에 대한 첫 번째 모습을 제공합니다. 맥락에 따라 h 아래에 포함된 렌더링 이미지

IFA 2024 | TCL의 NXTPAPER 14는 성능 면에서는 Galaxy Tab S10 Ultra와 일치하지 않지만 크기에서는 거의 일치합니다. IFA 2024 | TCL의 NXTPAPER 14는 성능 면에서는 Galaxy Tab S10 Ultra와 일치하지 않지만 크기에서는 거의 일치합니다. Sep 07, 2024 am 06:35 AM

TCL은 두 가지 새로운 스마트폰을 발표하는 것과 함께 NXTPAPER 14라는 새로운 Android 태블릿도 발표했는데, TCL의 거대한 화면 크기는 판매 포인트 중 하나입니다. NXTPAPER 14는 TCL의 시그니처 브랜드인 무광택 LCD 패널 버전 3.0을 갖추고 있습니다.

새로운 보고서는 소문난 삼성 갤럭시 S25, 갤럭시 S25 플러스, 갤럭시 S25 울트라 카메라 업그레이드에 대한 비판적인 평가를 제공합니다. 새로운 보고서는 소문난 삼성 갤럭시 S25, 갤럭시 S25 플러스, 갤럭시 S25 울트라 카메라 업그레이드에 대한 비판적인 평가를 제공합니다. Sep 12, 2024 pm 12:22 PM

최근 아이스 유니버스는 삼성의 차기 플래그십 스마트폰으로 널리 알려진 갤럭시 S25 울트라에 대한 세부 정보를 꾸준히 공개해 왔습니다. 무엇보다도 유출자는 삼성이 카메라 업그레이드를 하나만 가져올 계획이라고 주장했습니다.

Vivo Y300 Pro는 7.69mm의 슬림한 본체에 6,500mAh 배터리를 탑재했습니다. Vivo Y300 Pro는 7.69mm의 슬림한 본체에 6,500mAh 배터리를 탑재했습니다. Sep 07, 2024 am 06:39 AM

Vivo Y300 Pro는 방금 완전히 공개되었으며 대용량 배터리를 갖춘 가장 얇은 중급 Android 휴대폰 중 하나입니다. 정확히 말하면 스마트폰의 두께는 7.69mm에 불과하지만 배터리 용량은 6,500mAh입니다. 최근 출시된 것과 동일한 용량이다.

Samsung Galaxy S24 FE는 4가지 색상과 2가지 메모리 옵션으로 예상보다 낮은 가격으로 출시될 예정 Samsung Galaxy S24 FE는 4가지 색상과 2가지 메모리 옵션으로 예상보다 낮은 가격으로 출시될 예정 Sep 12, 2024 pm 09:21 PM

삼성전자는 팬에디션(FE) 스마트폰 시리즈를 언제 업데이트할지 아직 힌트를 주지 않았다. 현재 상태로 Galaxy S23 FE는 2023년 10월 초에 출시된 회사의 최신 버전으로 남아 있습니다.

Xiaomi Redmi Note 14 Pro Plus는 Light Hunter 800 카메라를 탑재한 최초의 Qualcomm Snapdragon 7s Gen 3 스마트폰으로 출시됩니다. Xiaomi Redmi Note 14 Pro Plus는 Light Hunter 800 카메라를 탑재한 최초의 Qualcomm Snapdragon 7s Gen 3 스마트폰으로 출시됩니다. Sep 27, 2024 am 06:23 AM

Redmi Note 14 Pro Plus는 이제 작년 Redmi Note 13 Pro Plus(Amazon에서 현재 $375)의 직접적인 후속 제품으로 공식화되었습니다. 예상대로 Redmi Note 14 Pro Plus는 Redmi Note 14 및 Redmi Note 14 Pro와 함께 Redmi Note 14 시리즈를 주도합니다. 리

Motorola Razr 50s는 초기 유출에서 가능한 새로운 예산 폴더블을 보여줍니다. Motorola Razr 50s는 초기 유출에서 가능한 새로운 예산 폴더블을 보여줍니다. Sep 07, 2024 am 09:35 AM

모토로라는 올해 셀 수 없이 많은 기기를 출시했지만 그 중 폴더블 기기는 2개뿐이었습니다. 맥락에 따라 전 세계 대부분이 Razr 50 및 Razr 50 Ultra로 쌍을 받았지만 Motorola는 북미에서 Razr 2024 및 Razr 2로 제공합니다.

See all articles