程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> AS400銀行核心系統開發中的技術總結--交易和組件寫法

AS400銀行核心系統開發中的技術總結--交易和組件寫法

編輯:JAVA綜合教程

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引入組件聲明,以為聲明包含了原型定義,以及參數結構定義。另外,由於引入了異常處理程序,現在應用程序編寫起來就清晰多了,無需考慮各種文件操作的異常報錯處理,是不是很方便呢。



至此,組件和交易模版介紹完了,按照這個模版,就可以編寫實際使用的各個模塊程序,掛在交易主控中執行了。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved