亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 2455 | 回復(fù): 17
打印 上一主題 下一主題

為什么這段文章回復(fù)以后就不見了? [復(fù)制鏈接]

論壇徽章:
5
2015亞冠之阿爾艾因
日期:2015-08-10 02:23:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-08-13 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:1715-16賽季CBA聯(lián)賽之山西
日期:2016-04-13 02:36:59操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-14 06:20:00
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2016-04-11 01:50 |只看該作者 |倒序?yàn)g覽
自己寫的一段文章,在連載中回復(fù)了好多次,每次貼進(jìn)去就不見了。。。

論壇徽章:
5
2015亞冠之阿爾艾因
日期:2015-08-10 02:23:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-08-13 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:1715-16賽季CBA聯(lián)賽之山西
日期:2016-04-13 02:36:59操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-14 06:20:00
2 [報(bào)告]
發(fā)表于 2016-04-11 01:50 |只看該作者
*面向?qū)ο髮?shí)現(xiàn)

在核心系統(tǒng)這樣大型的軟件系統(tǒng)設(shè)計(jì)中,面向?qū)ο蟮脑O(shè)計(jì)方法,有助于分解復(fù)雜度,既保持抽象統(tǒng)一,又有靈活性。這里說的面向?qū)ο笤O(shè)計(jì)方法,不是指使用面向?qū)ο蟮木幊陶Z言就可以,而是指設(shè)計(jì)系統(tǒng)的思想。系統(tǒng)架構(gòu)不進(jìn)化,即使用Java這樣的面向?qū)ο缶幊陶Z言,也一樣只會(huì)寫出流水賬似的程序。

面向?qū)ο蟮脑O(shè)計(jì),主要體現(xiàn)在封裝、繼承、多態(tài)。封裝表現(xiàn)為,系統(tǒng)應(yīng)當(dāng)進(jìn)行合理的層次劃分和粒度劃分,識(shí)別出哪些是對(duì)象,并綁定對(duì)象的功能和屬性。對(duì)照來看,產(chǎn)品工廠就是一種面向?qū)ο笤O(shè)計(jì)的典型場(chǎng)景。存貸等產(chǎn)品,對(duì)應(yīng)編程語言的類,是一種抽象封裝。用這個(gè)產(chǎn)品開立的具體賬戶,就是這個(gè)類的實(shí)例。產(chǎn)品可以定義各種使用功能,這個(gè)對(duì)應(yīng)類的成員函數(shù)。產(chǎn)品的功能用到各種參數(shù)做邏輯控制,這個(gè)對(duì)應(yīng)類的成員變量。最簡單的基本產(chǎn)品,可以組合成組合產(chǎn)品,這個(gè)類似于多個(gè)類組合成新的類。產(chǎn)品的定義有層次關(guān)系,例如存款產(chǎn)品--定期存款產(chǎn)品--整存整取--人民幣整存整取--人民幣一年期整存整取,這個(gè)就像類的繼承關(guān)系。上層產(chǎn)品的參數(shù)和功能會(huì)繼承到下層產(chǎn)品中。如果在產(chǎn)品繼承時(shí),下層產(chǎn)品差異化了功能的實(shí)現(xiàn)行為,這就是多態(tài)。產(chǎn)品工廠在RPGLE中的實(shí)現(xiàn)方法并不復(fù)雜。將參數(shù)按記錄方式保存,取產(chǎn)品參數(shù)后,如果有賬戶層定制,讀取賬戶參數(shù)值覆蓋掉產(chǎn)品參數(shù)值,就實(shí)現(xiàn)了參數(shù)的繼承。通過產(chǎn)品號(hào)的規(guī)則,可以體現(xiàn)產(chǎn)品層次關(guān)系,方便判斷具體產(chǎn)品是否歸屬于某一類。產(chǎn)品的功能實(shí)現(xiàn)多態(tài),可以按字符串方式保存組件名字,動(dòng)態(tài)調(diào)用即可。

不過在Firebird中通過技術(shù)寫法體現(xiàn)面向?qū)ο蠖鄳B(tài)實(shí)現(xiàn),在聯(lián)機(jī)交易主控流程中更為明顯。核心系統(tǒng)的聯(lián)機(jī)交易,有一些步驟是所有交易共有的,如獲取交易日期時(shí)間,獲取流水號(hào),機(jī)構(gòu)柜員檢查等等。因此,有必要定義通用的交易流程,簡化交易應(yīng)用程序的編寫。一方面避免交易應(yīng)用程序的處理遺漏,另一方面當(dāng)需要新增或改動(dòng)共有處理時(shí),防止出現(xiàn)所有交易全面修改的情況。以前的系統(tǒng),通常很少有共有交易流程,依賴于每個(gè)交易應(yīng)用程序本身的檢查處理完備性。在Firebird的主控中,細(xì)分出交易流程層,引入面向?qū)ο缶幊谭椒,將每個(gè)交易公共的步驟集中處理。交易主流程中,由兩種類型的方法組成,一種是非覆蓋方法,各交易不能取代重寫,程序名為PPLMNN1到PPLMNN9,另一種是覆蓋方法,默認(rèn)程序名為SPLMNV1到SPLMNV9,可以由交易根據(jù)情況單獨(dú)定制(根據(jù)程序名實(shí)現(xiàn)對(duì)應(yīng))。例如020001交易,交易處理程序名為T020001A,則交易主流程中可覆蓋的多態(tài)方法名字則為T020001A1到T020001A9,分別覆蓋SPLMNV1到SPLMNV9,如果未生成對(duì)應(yīng)的多態(tài)程序,主控會(huì)調(diào)用默認(rèn)程序,一旦生成了多態(tài)程序,無需進(jìn)行配置,主控就會(huì)識(shí)別并調(diào)用交易自定義的多態(tài)程序。
下面展示在主控中如何組織交易主流程,實(shí)現(xiàn)識(shí)別覆蓋方法。

  1. /*BEGIN***************************************************************/
  2. /*程序名稱:TRANFUNC_H                                             */
  3. /*功能描述:通用交易聲明                                           */
  4. /*                                                                   */
  5. /*設(shè)計(jì)人員:PACMAN          開發(fā)人員:PACMAN                     */
  6. /*設(shè)計(jì)日期:2011-11-11      開發(fā)日期:2011-11-11                 */
  7. /*-------------------------------------------------------------------*/
  8. /*維護(hù)人員:                                                       */
  9. /*維護(hù)日期:                                                       */
  10. /*維護(hù)內(nèi)容:                                                       */
  11. /*                                                                   */
  12. /*END*****************************************************************/

  13. #ifndef TRANFUNC_H
  14. #define TRANFUNC_H

  15. #include "msginfo_h"

  16. typedef void (Tran1)(rpg_msg_info* msg, char* in, char* out);
  17. #pragma linkage(Tran1, OS)
  18. typedef void (Tran2)(rpg_msg_info* msg, char* in, char* out, char* fe);
  19. #pragma linkage(Tran2, OS)

  20. #endif
復(fù)制代碼
這段頭文件聲明了兩類RPGLE程序給主控調(diào)用,一類是參數(shù)不帶收費(fèi)數(shù)組的,一類是參數(shù)帶收費(fèi)數(shù)組的。根據(jù)處理內(nèi)容的不同,主控流程中的方法都可以歸到這兩類中。

  1. /*BEGIN***************************************************************/
  2. /*程序名稱:TRANFUNC                                               */
  3. /*功能描述:調(diào)度交易主流程程序                                     */
  4. /*                                                                   */
  5. /*設(shè)計(jì)人員:PACMAN          開發(fā)人員:PACMAN                     */
  6. /*設(shè)計(jì)日期:2011-11-11      開發(fā)日期:2011-11-11                 */
  7. /*-------------------------------------------------------------------*/
  8. /*維護(hù)人員:                                                       */
  9. /*維護(hù)日期:                                                       */
  10. /*維護(hù)內(nèi)容:                                                       */
  11. /*                                                                   */
  12. /*END*****************************************************************/

  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <except.h>
  17. #include <mih/triml.h>
  18. #include <mih/rslvsp.h>

  19. #include "dscppgm/cpyrgt_h"
  20. #include "config_h"
  21. #include "tranfunc_h"
  22. #include "msginfo_h"

  23. extern void DBCTL(char*);
  24. extern int trim_str(char *buf, const char *str, int len);
  25. extern void get_msginfo(msg_info *, const rpg_msg_info *);

  26. extern msg_info msginfo;
  27. static int rsl_flag;
  28. static char rsl_pgm[FILENM_LEN+1];

  29. void RSLVSP_PGM_HDLR(_INTRPT_Hndlr_Parms_T *errmsg)
  30. {
  31.   if(strncmp(errmsg->Msg_Id, "MCH3401", 7) == 0)
  32.   {
  33.     strcpy(msginfo.msgid, "EPLMNPGNF ");
  34.     sprintf(msginfo.msgtext, "調(diào)用程序%s未找到", rsl_pgm);
  35.     rsl_flag = 1;
  36.   }
  37.   else
  38.   {
  39.     strcpy(msginfo.msgid, "EPLMNPGER ");
  40.     sprintf(msginfo.msgtext, "查找程序%s時(shí)出錯(cuò)%7.7s",
  41.             rsl_pgm, errmsg->Msg_Id);
  42.     rsl_flag = 2;
  43.   }
  44. }

  45. int execute_rslvsp(char* pgm_nm, int type, Tran1** pt1, Tran2** pt2)
  46. {
  47.   rsl_flag = 0;
  48.   strcpy(rsl_pgm, pgm_nm);
  49.   #pragma exception_handler (RSLVSP_PGM_HDLR,rsl_flag,0,_C2_MH_ESCAPE,\
  50.                              _CTLA_HANDLE_NO_MSG)
  51.   if(type == 1)
  52.     *pt1 = rslvsp(_Program, pgm_nm, "*LIBL", _AUTH_OBJ_MGMT);
  53.   else
  54.     *pt2 = rslvsp(_Program, pgm_nm, "*LIBL", _AUTH_OBJ_MGMT);
  55.   #pragma disable_handler
  56.   return rsl_flag;
  57. }

  58. void clear_msg(void)
  59. {
  60.   msginfo.msgid[0]='\0';
  61.   msginfo.msgtext[0]='\0';
  62. }

  63. int check_msgid(void)
  64. {
  65.   if (triml(msginfo.msgid, ' ')!=0)
  66.   {
  67.     if (strncmp(msginfo.msgid, "EPLMNREST", 9)==0)
  68.       return 1;
  69.     else
  70.       return -1;
  71.   }
  72.   return 0;
  73. }

  74. int execute_overpgm(char* overwt, char* dft, int type,
  75.                     char* in, char* out, char* fe)
  76. {
  77.   Tran1 *tran1;
  78.   Tran2 *tran2;
  79.   rpg_msg_info rpginfo;
  80.   int ret;

  81.   memset(&rpginfo, ' ', sizeof(rpginfo));
  82.   if (type==1)
  83.   {
  84.     ret=execute_rslvsp(overwt, 1, &tran1, &tran2);
  85.     if (ret==1)
  86.     {
  87.       clear_msg();
  88.       ret=execute_rslvsp(dft, 1, &tran1, &tran2);
  89.     }
  90.     if (ret!=0)
  91.       return -2;
  92.     tran1(&rpginfo, in, out);
  93.   }
  94.   else
  95.   {
  96.     ret=execute_rslvsp(overwt, 2, &tran1, &tran2);
  97.     if (ret==1)
  98.     {
  99.       clear_msg();
  100.       ret=execute_rslvsp(dft, 2, &tran1, &tran2);
  101.     }
  102.     if (ret!=0)
  103.       return -2;
  104.     tran2(&rpginfo, in, out, fe);
  105.   }
  106.   get_msginfo(&msginfo, &rpginfo);
  107.   return check_msgid();
  108. }

  109. int execute_pgm(char* pgm_nm, int type, char* in, char* out, char* fe)
  110. {
  111.   Tran1 *tran1;
  112.   Tran2 *tran2;
  113.   rpg_msg_info rpginfo;
  114.   int ret;

  115.   memset(&rpginfo, ' ', sizeof(rpginfo));
  116.   if (type == 1)
  117.   {
  118.     ret=execute_rslvsp(pgm_nm, 1, &tran1, &tran2);
  119.     if (ret!=0)
  120.       return -2;
  121.     tran1(&rpginfo, in, out);
  122.   }
  123.   else
  124.   {
  125.     ret=execute_rslvsp(pgm_nm, 2, &tran1, &tran2);
  126.     if (ret!=0)
  127.       return -2;
  128.     tran2(&rpginfo, in, out, fe);
  129.   }
  130.   get_msginfo(&msginfo, &rpginfo);
  131.   return check_msgid();
  132. }

  133. int process_tran(const char* tr_cd, char* tr_pgm,
  134.                  char* in, char* out, char* fe, char flg)
  135. {

  136.   char pgms[9][FILENM_LEN+1];
  137.   char trpgm[FILENM_LEN+1];
  138.   int ret=0, i;

  139.   if (trim_str(trpgm, tr_pgm, FILENM_LEN) > FILENM_LEN-1)
  140.   {
  141.     strcpy(msginfo.msgid, "EPLMNPGTL ");
  142.     sprintf(msginfo.msgtext, "交易程序名%s太長", trpgm);
  143.     return -2;
  144.   }

  145.   /*給該交易的每個(gè)覆蓋方法賦值*/
  146.   for (i=0; i<9; i++)
  147.     sprintf(pgms[i], "%s%1d", trpgm, i+1);

  148.   for (;;)
  149.   {
  150.     /* 交易初始化*/
  151.     if (ret==0)
  152.       ret = execute_pgm("PPLMNN1", 1, in, out, fe);

  153.     /* 覆蓋方法1交易預(yù)處理 */
  154.     if (ret==0)
  155.       ret = execute_overpgm(pgms[0], "SPLMNV1", 1, in, out, fe);

  156.     /* 柜員歸屬檢查 */
  157.     if (ret==0)
  158.       ret = execute_pgm("PPLMNN2", 1, in, out, fe);

  159.     /* 覆蓋方法2交易機(jī)構(gòu)柜員檢查*/
  160.     if (ret==0)
  161.       ret = execute_overpgm(pgms[1], "SPLMNV2", 1, in, out, fe);

  162.     /* 生成交易流水號(hào)*/
  163.     if (ret==0)
  164.       ret = execute_pgm("PPLMNN3", 1, in, out, fe);

  165.     /* 覆蓋方法3交易收費(fèi)計(jì)算*/
  166.     if (ret==0)
  167.       ret = execute_overpgm(pgms[2], "SPLMNV3", 2, in, out, fe);

  168.     /* 費(fèi)用核對(duì)*/
  169.     if (ret==0)
  170.       ret = execute_pgm("PPLMNN4", 2, in, out, fe);

  171.     /* 調(diào)用交易程序*/
  172.     if (ret==0)
  173.       ret = execute_pgm(trpgm, 1, in, out, fe);

  174.     /* 調(diào)用費(fèi)用收費(fèi)并進(jìn)行傳票重整服務(wù)*/
  175.     if (ret==0)
  176.       ret = execute_pgm("PPLMNN5", 1, in, out, fe);

  177.     /* 覆蓋方法4寫輸出接口*/
  178.     if (ret==0)
  179.       ret = execute_overpgm(pgms[3], "SPLMNV4", 1, in, out, fe);

  180.     /* 返回處理*/
  181.     if (ret==0)
  182.       ret = execute_pgm("PPLMNN6", 1, in, out, fe);

  183.     if (ret==0 && flg==DEBUG_NO)
  184.       DBCTL(DB_COMMIT);
  185.     else
  186.       DBCTL(DB_ROLLBACK);

  187.     if (ret!=1)
  188.       break;
  189.     clear_msg();
  190.   }

  191.   return ret;
  192. }
復(fù)制代碼
這段程序中,最重要的是rslvsp()這個(gè)系統(tǒng)函數(shù),這個(gè)函數(shù)用來在指定的庫列表中獲取系統(tǒng)對(duì)象指針。在這里我們用來獲取覆蓋方法的*PGM程序?qū)ο。通過外面用#pragma exception_handler的包圍,指定了RSLVSP_PGM_HDLR()作為rslvsp()的異常捕獲函數(shù),當(dāng)捕獲MCH3401時(shí),即不存在程序?qū)ο。execute_rslvsp()這個(gè)函數(shù)的功能,就實(shí)現(xiàn)了獲取指定名字的*PGM,設(shè)置指針變量,返回是否找到的標(biāo)志。execute_overpgm()實(shí)現(xiàn)了如果有交易自定義覆蓋方法程序存在,則調(diào)用,否則調(diào)用默認(rèn)的程序。execute_pgm()實(shí)現(xiàn)了調(diào)用非覆蓋方法。最后的process_tran()實(shí)現(xiàn)了交易主流程,依次按流程組織調(diào)用非覆蓋方法和覆蓋方法,進(jìn)行事務(wù)回滾或提交。
    注意交易主流程中,識(shí)別是否出現(xiàn)交易重新執(zhí)行的特殊錯(cuò)誤代碼EPLMNREST,如果出現(xiàn)則原事務(wù)回滾并重新開始執(zhí)行整個(gè)交易流程。這能解決一些特定場(chǎng)景,例如第三方來賬如果入賬不成功,需要直接掛待銷賬。通過修改輸入結(jié)構(gòu)的某些字段值,并返回EPLMNREST錯(cuò)誤代碼,這樣在核心系統(tǒng)一次交易即可實(shí)現(xiàn)入賬或掛賬功能。

論壇徽章:
5
2015亞冠之阿爾艾因
日期:2015-08-10 02:23:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-08-13 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:1715-16賽季CBA聯(lián)賽之山西
日期:2016-04-13 02:36:59操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-14 06:20:00
3 [報(bào)告]
發(fā)表于 2016-04-11 01:50 |只看該作者
我一點(diǎn)一點(diǎn)的貼進(jìn)來看看。

論壇徽章:
5
2015亞冠之阿爾艾因
日期:2015-08-10 02:23:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-08-13 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:1715-16賽季CBA聯(lián)賽之山西
日期:2016-04-13 02:36:59操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-14 06:20:00
4 [報(bào)告]
發(fā)表于 2016-04-11 01:51 |只看該作者
*面向?qū)ο髮?shí)現(xiàn)

在核心系統(tǒng)這樣大型的軟件系統(tǒng)設(shè)計(jì)中,面向?qū)ο蟮脑O(shè)計(jì)方法,有助于分解復(fù)雜度,既保持抽象統(tǒng)一,又有靈活性。這里說的面向?qū)ο笤O(shè)計(jì)方法,不是指使用面向?qū)ο蟮木幊陶Z言就可以,而是指設(shè)計(jì)系統(tǒng)的思想。系統(tǒng)架構(gòu)不進(jìn)化,即使用Java這樣的面向?qū)ο缶幊陶Z言,也一樣只會(huì)寫出流水賬似的程序。

面向?qū)ο蟮脑O(shè)計(jì),主要體現(xiàn)在封裝、繼承、多態(tài)。封裝表現(xiàn)為,系統(tǒng)應(yīng)當(dāng)進(jìn)行合理的層次劃分和粒度劃分,識(shí)別出哪些是對(duì)象,并綁定對(duì)象的功能和屬性。對(duì)照來看,產(chǎn)品工廠就是一種面向?qū)ο笤O(shè)計(jì)的典型場(chǎng)景。存貸等產(chǎn)品,對(duì)應(yīng)編程語言的類,是一種抽象封裝。用這個(gè)產(chǎn)品開立的具體賬戶,就是這個(gè)類的實(shí)例。產(chǎn)品可以定義各種使用功能,這個(gè)對(duì)應(yīng)類的成員函數(shù)。產(chǎn)品的功能用到各種參數(shù)做邏輯控制,這個(gè)對(duì)應(yīng)類的成員變量。最簡單的基本產(chǎn)品,可以組合成組合產(chǎn)品,這個(gè)類似于多個(gè)類組合成新的類。產(chǎn)品的定義有層次關(guān)系,例如存款產(chǎn)品--定期存款產(chǎn)品--整存整取--人民幣整存整取--人民幣一年期整存整取,這個(gè)就像類的繼承關(guān)系。上層產(chǎn)品的參數(shù)和功能會(huì)繼承到下層產(chǎn)品中。如果在產(chǎn)品繼承時(shí),下層產(chǎn)品差異化了功能的實(shí)現(xiàn)行為,這就是多態(tài)。產(chǎn)品工廠在RPGLE中的實(shí)現(xiàn)方法并不復(fù)雜。將參數(shù)按記錄方式保存,取產(chǎn)品參數(shù)后,如果有賬戶層定制,讀取賬戶參數(shù)值覆蓋掉產(chǎn)品參數(shù)值,就實(shí)現(xiàn)了參數(shù)的繼承。通過產(chǎn)品號(hào)的規(guī)則,可以體現(xiàn)產(chǎn)品層次關(guān)系,方便判斷具體產(chǎn)品是否歸屬于某一類。產(chǎn)品的功能實(shí)現(xiàn)多態(tài),可以按字符串方式保存組件名字,動(dòng)態(tài)調(diào)用即可。

不過在Firebird中通過技術(shù)寫法體現(xiàn)面向?qū)ο蠖鄳B(tài)實(shí)現(xiàn),在聯(lián)機(jī)交易主控流程中更為明顯。核心系統(tǒng)的聯(lián)機(jī)交易,有一些步驟是所有交易共有的,如獲取交易日期時(shí)間,獲取流水號(hào),機(jī)構(gòu)柜員檢查等等。因此,有必要定義通用的交易流程,簡化交易應(yīng)用程序的編寫。一方面避免交易應(yīng)用程序的處理遺漏,另一方面當(dāng)需要新增或改動(dòng)共有處理時(shí),防止出現(xiàn)所有交易全面修改的情況。以前的系統(tǒng),通常很少有共有交易流程,依賴于每個(gè)交易應(yīng)用程序本身的檢查處理完備性。在Firebird的主控中,細(xì)分出交易流程層,引入面向?qū)ο缶幊谭椒ǎ瑢⒚總(gè)交易公共的步驟集中處理。交易主流程中,由兩種類型的方法組成,一種是非覆蓋方法,各交易不能取代重寫,程序名為PPLMNN1到PPLMNN9,另一種是覆蓋方法,默認(rèn)程序名為SPLMNV1到SPLMNV9,可以由交易根據(jù)情況單獨(dú)定制(根據(jù)程序名實(shí)現(xiàn)對(duì)應(yīng))。例如020001交易,交易處理程序名為T020001A,則交易主流程中可覆蓋的多態(tài)方法名字則為T020001A1到T020001A9,分別覆蓋SPLMNV1到SPLMNV9,如果未生成對(duì)應(yīng)的多態(tài)程序,主控會(huì)調(diào)用默認(rèn)程序,一旦生成了多態(tài)程序,無需進(jìn)行配置,主控就會(huì)識(shí)別并調(diào)用交易自定義的多態(tài)程序。
下面展示在主控中如何組織交易主流程,實(shí)現(xiàn)識(shí)別覆蓋方法。

  1. /*BEGIN***************************************************************/
  2. /*程序名稱:TRANFUNC_H                                             */
  3. /*功能描述:通用交易聲明                                           */
  4. /*                                                                   */
  5. /*設(shè)計(jì)人員:PACMAN          開發(fā)人員:PACMAN                     */
  6. /*設(shè)計(jì)日期:2011-11-11      開發(fā)日期:2011-11-11                 */
  7. /*-------------------------------------------------------------------*/
  8. /*維護(hù)人員:                                                       */
  9. /*維護(hù)日期:                                                       */
  10. /*維護(hù)內(nèi)容:                                                       */
  11. /*                                                                   */
  12. /*END*****************************************************************/

  13. #ifndef TRANFUNC_H
  14. #define TRANFUNC_H

  15. #include "msginfo_h"

  16. typedef void (Tran1)(rpg_msg_info* msg, char* in, char* out);
  17. #pragma linkage(Tran1, OS)
  18. typedef void (Tran2)(rpg_msg_info* msg, char* in, char* out, char* fe);
  19. #pragma linkage(Tran2, OS)

  20. #endif
復(fù)制代碼
這段頭文件聲明了兩類RPGLE程序給主控調(diào)用,一類是參數(shù)不帶收費(fèi)數(shù)組的,一類是參數(shù)帶收費(fèi)數(shù)組的。根據(jù)處理內(nèi)容的不同,主控流程中的方法都可以歸到這兩類中。

論壇徽章:
5
2015亞冠之阿爾艾因
日期:2015-08-10 02:23:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-08-13 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:1715-16賽季CBA聯(lián)賽之山西
日期:2016-04-13 02:36:59操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-14 06:20:00
5 [報(bào)告]
發(fā)表于 2016-04-11 01:51 |只看該作者

  1. /*BEGIN***************************************************************/
  2. /*程序名稱:TRANFUNC                                               */
  3. /*功能描述:調(diào)度交易主流程程序                                     */
  4. /*                                                                   */
  5. /*設(shè)計(jì)人員:PACMAN          開發(fā)人員:PACMAN                     */
  6. /*設(shè)計(jì)日期:2011-11-11      開發(fā)日期:2011-11-11                 */
  7. /*-------------------------------------------------------------------*/
  8. /*維護(hù)人員:                                                       */
  9. /*維護(hù)日期:                                                       */
  10. /*維護(hù)內(nèi)容:                                                       */
  11. /*                                                                   */
  12. /*END*****************************************************************/

  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <except.h>
  17. #include <mih/triml.h>
  18. #include <mih/rslvsp.h>

  19. #include "dscppgm/cpyrgt_h"
  20. #include "config_h"
  21. #include "tranfunc_h"
  22. #include "msginfo_h"

  23. extern void DBCTL(char*);
  24. extern int trim_str(char *buf, const char *str, int len);
  25. extern void get_msginfo(msg_info *, const rpg_msg_info *);

  26. extern msg_info msginfo;
  27. static int rsl_flag;
  28. static char rsl_pgm[FILENM_LEN+1];

  29. void RSLVSP_PGM_HDLR(_INTRPT_Hndlr_Parms_T *errmsg)
  30. {
  31.   if(strncmp(errmsg->Msg_Id, "MCH3401", 7) == 0)
  32.   {
  33.     strcpy(msginfo.msgid, "EPLMNPGNF ");
  34.     sprintf(msginfo.msgtext, "調(diào)用程序%s未找到", rsl_pgm);
  35.     rsl_flag = 1;
  36.   }
  37.   else
  38.   {
  39.     strcpy(msginfo.msgid, "EPLMNPGER ");
  40.     sprintf(msginfo.msgtext, "查找程序%s時(shí)出錯(cuò)%7.7s",
  41.             rsl_pgm, errmsg->Msg_Id);
  42.     rsl_flag = 2;
  43.   }
  44. }

  45. int execute_rslvsp(char* pgm_nm, int type, Tran1** pt1, Tran2** pt2)
  46. {
  47.   rsl_flag = 0;
  48.   strcpy(rsl_pgm, pgm_nm);
  49.   #pragma exception_handler (RSLVSP_PGM_HDLR,rsl_flag,0,_C2_MH_ESCAPE,\
  50.                              _CTLA_HANDLE_NO_MSG)
  51.   if(type == 1)
  52.     *pt1 = rslvsp(_Program, pgm_nm, "*LIBL", _AUTH_OBJ_MGMT);
  53.   else
  54.     *pt2 = rslvsp(_Program, pgm_nm, "*LIBL", _AUTH_OBJ_MGMT);
  55.   #pragma disable_handler
  56.   return rsl_flag;
  57. }

  58. void clear_msg(void)
  59. {
  60.   msginfo.msgid[0]='\0';
  61.   msginfo.msgtext[0]='\0';
  62. }

  63. int check_msgid(void)
  64. {
  65.   if (triml(msginfo.msgid, ' ')!=0)
  66.   {
  67.     if (strncmp(msginfo.msgid, "EPLMNREST", 9)==0)
  68.       return 1;
  69.     else
  70.       return -1;
  71.   }
  72.   return 0;
  73. }

  74. int execute_overpgm(char* overwt, char* dft, int type,
  75.                     char* in, char* out, char* fe)
  76. {
  77.   Tran1 *tran1;
  78.   Tran2 *tran2;
  79.   rpg_msg_info rpginfo;
  80.   int ret;

  81.   memset(&rpginfo, ' ', sizeof(rpginfo));
  82.   if (type==1)
  83.   {
  84.     ret=execute_rslvsp(overwt, 1, &tran1, &tran2);
  85.     if (ret==1)
  86.     {
  87.       clear_msg();
  88.       ret=execute_rslvsp(dft, 1, &tran1, &tran2);
  89.     }
  90.     if (ret!=0)
  91.       return -2;
  92.     tran1(&rpginfo, in, out);
  93.   }
  94.   else
  95.   {
  96.     ret=execute_rslvsp(overwt, 2, &tran1, &tran2);
  97.     if (ret==1)
  98.     {
  99.       clear_msg();
  100.       ret=execute_rslvsp(dft, 2, &tran1, &tran2);
  101.     }
  102.     if (ret!=0)
  103.       return -2;
  104.     tran2(&rpginfo, in, out, fe);
  105.   }
  106.   get_msginfo(&msginfo, &rpginfo);
  107.   return check_msgid();
  108. }

  109. int execute_pgm(char* pgm_nm, int type, char* in, char* out, char* fe)
  110. {
  111.   Tran1 *tran1;
  112.   Tran2 *tran2;
  113.   rpg_msg_info rpginfo;
  114.   int ret;

  115.   memset(&rpginfo, ' ', sizeof(rpginfo));
  116.   if (type == 1)
  117.   {
  118.     ret=execute_rslvsp(pgm_nm, 1, &tran1, &tran2);
  119.     if (ret!=0)
  120.       return -2;
  121.     tran1(&rpginfo, in, out);
  122.   }
  123.   else
  124.   {
  125.     ret=execute_rslvsp(pgm_nm, 2, &tran1, &tran2);
  126.     if (ret!=0)
  127.       return -2;
  128.     tran2(&rpginfo, in, out, fe);
  129.   }
  130.   get_msginfo(&msginfo, &rpginfo);
  131.   return check_msgid();
  132. }

  133. int process_tran(const char* tr_cd, char* tr_pgm,
  134.                  char* in, char* out, char* fe, char flg)
  135. {

  136.   char pgms[9][FILENM_LEN+1];
  137.   char trpgm[FILENM_LEN+1];
  138.   int ret=0, i;

  139.   if (trim_str(trpgm, tr_pgm, FILENM_LEN) > FILENM_LEN-1)
  140.   {
  141.     strcpy(msginfo.msgid, "EPLMNPGTL ");
  142.     sprintf(msginfo.msgtext, "交易程序名%s太長", trpgm);
  143.     return -2;
  144.   }

  145.   /*給該交易的每個(gè)覆蓋方法賦值*/
  146.   for (i=0; i<9; i++)
  147.     sprintf(pgms[i], "%s%1d", trpgm, i+1);

  148.   for (;;)
  149.   {
  150.     /* 交易初始化*/
  151.     if (ret==0)
  152.       ret = execute_pgm("PPLMNN1", 1, in, out, fe);

  153.     /* 覆蓋方法1交易預(yù)處理 */
  154.     if (ret==0)
  155.       ret = execute_overpgm(pgms[0], "SPLMNV1", 1, in, out, fe);

  156.     /* 柜員歸屬檢查 */
  157.     if (ret==0)
  158.       ret = execute_pgm("PPLMNN2", 1, in, out, fe);

  159.     /* 覆蓋方法2交易機(jī)構(gòu)柜員檢查*/
  160.     if (ret==0)
  161.       ret = execute_overpgm(pgms[1], "SPLMNV2", 1, in, out, fe);

  162.     /* 生成交易流水號(hào)*/
  163.     if (ret==0)
  164.       ret = execute_pgm("PPLMNN3", 1, in, out, fe);

  165.     /* 覆蓋方法3交易收費(fèi)計(jì)算*/
  166.     if (ret==0)
  167.       ret = execute_overpgm(pgms[2], "SPLMNV3", 2, in, out, fe);

  168.     /* 費(fèi)用核對(duì)*/
  169.     if (ret==0)
  170.       ret = execute_pgm("PPLMNN4", 2, in, out, fe);

  171.     /* 調(diào)用交易程序*/
  172.     if (ret==0)
  173.       ret = execute_pgm(trpgm, 1, in, out, fe);

  174.     /* 調(diào)用費(fèi)用收費(fèi)并進(jìn)行傳票重整服務(wù)*/
  175.     if (ret==0)
  176.       ret = execute_pgm("PPLMNN5", 1, in, out, fe);

  177.     /* 覆蓋方法4寫輸出接口*/
  178.     if (ret==0)
  179.       ret = execute_overpgm(pgms[3], "SPLMNV4", 1, in, out, fe);

  180.     /* 返回處理*/
  181.     if (ret==0)
  182.       ret = execute_pgm("PPLMNN6", 1, in, out, fe);
復(fù)制代碼

論壇徽章:
5
2015亞冠之阿爾艾因
日期:2015-08-10 02:23:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-08-13 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:1715-16賽季CBA聯(lián)賽之山西
日期:2016-04-13 02:36:59操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-14 06:20:00
6 [報(bào)告]
發(fā)表于 2016-04-11 01:52 |只看該作者

  1. /*BEGIN***************************************************************/
  2. /*程序名稱:TRANFUNC                                               */
  3. /*功能描述:調(diào)度交易主流程程序                                     */
  4. /*                                                                   */
  5. /*設(shè)計(jì)人員:PACMAN          開發(fā)人員:PACMAN                     */
  6. /*設(shè)計(jì)日期:2011-11-11      開發(fā)日期:2011-11-11                 */
  7. /*-------------------------------------------------------------------*/
  8. /*維護(hù)人員:                                                       */
  9. /*維護(hù)日期:                                                       */
  10. /*維護(hù)內(nèi)容:                                                       */
  11. /*                                                                   */
  12. /*END*****************************************************************/

  13. #include <stdlib.h>
  14. #include <stdio.h>
  15. #include <string.h>
  16. #include <except.h>
  17. #include <mih/triml.h>
  18. #include <mih/rslvsp.h>

  19. #include "dscppgm/cpyrgt_h"
  20. #include "config_h"
  21. #include "tranfunc_h"
  22. #include "msginfo_h"

  23. extern void DBCTL(char*);
  24. extern int trim_str(char *buf, const char *str, int len);
  25. extern void get_msginfo(msg_info *, const rpg_msg_info *);

  26. extern msg_info msginfo;
  27. static int rsl_flag;
  28. static char rsl_pgm[FILENM_LEN+1];

  29. void RSLVSP_PGM_HDLR(_INTRPT_Hndlr_Parms_T *errmsg)
  30. {
  31.   if(strncmp(errmsg->Msg_Id, "MCH3401", 7) == 0)
  32.   {
  33.     strcpy(msginfo.msgid, "EPLMNPGNF ");
  34.     sprintf(msginfo.msgtext, "調(diào)用程序%s未找到", rsl_pgm);
  35.     rsl_flag = 1;
  36.   }
  37.   else
  38.   {
  39.     strcpy(msginfo.msgid, "EPLMNPGER ");
  40.     sprintf(msginfo.msgtext, "查找程序%s時(shí)出錯(cuò)%7.7s",
  41.             rsl_pgm, errmsg->Msg_Id);
  42.     rsl_flag = 2;
  43.   }
  44. }

  45. int execute_rslvsp(char* pgm_nm, int type, Tran1** pt1, Tran2** pt2)
  46. {
  47.   rsl_flag = 0;
  48.   strcpy(rsl_pgm, pgm_nm);
  49.   #pragma exception_handler (RSLVSP_PGM_HDLR,rsl_flag,0,_C2_MH_ESCAPE,\
  50.                              _CTLA_HANDLE_NO_MSG)
  51.   if(type == 1)
  52.     *pt1 = rslvsp(_Program, pgm_nm, "*LIBL", _AUTH_OBJ_MGMT);
  53.   else
  54.     *pt2 = rslvsp(_Program, pgm_nm, "*LIBL", _AUTH_OBJ_MGMT);
  55.   #pragma disable_handler
  56.   return rsl_flag;
  57. }

  58. void clear_msg(void)
  59. {
  60.   msginfo.msgid[0]='\0';
  61.   msginfo.msgtext[0]='\0';
  62. }

  63. int check_msgid(void)
  64. {
  65.   if (triml(msginfo.msgid, ' ')!=0)
  66.   {
  67.     if (strncmp(msginfo.msgid, "EPLMNREST", 9)==0)
  68.       return 1;
  69.     else
  70.       return -1;
  71.   }
  72.   return 0;
  73. }

  74. int execute_overpgm(char* overwt, char* dft, int type,
  75.                     char* in, char* out, char* fe)
  76. {
  77.   Tran1 *tran1;
  78.   Tran2 *tran2;
  79.   rpg_msg_info rpginfo;
  80.   int ret;

  81.   memset(&rpginfo, ' ', sizeof(rpginfo));
  82.   if (type==1)
  83.   {
  84.     ret=execute_rslvsp(overwt, 1, &tran1, &tran2);
  85.     if (ret==1)
  86.     {
  87.       clear_msg();
  88.       ret=execute_rslvsp(dft, 1, &tran1, &tran2);
  89.     }
  90.     if (ret!=0)
  91.       return -2;
  92.     tran1(&rpginfo, in, out);
  93.   }
  94.   else
  95.   {
  96.     ret=execute_rslvsp(overwt, 2, &tran1, &tran2);
  97.     if (ret==1)
  98.     {
  99.       clear_msg();
  100.       ret=execute_rslvsp(dft, 2, &tran1, &tran2);
  101.     }
  102.     if (ret!=0)
  103.       return -2;
  104.     tran2(&rpginfo, in, out, fe);
  105.   }
  106.   get_msginfo(&msginfo, &rpginfo);
  107.   return check_msgid();
  108. }

  109. int execute_pgm(char* pgm_nm, int type, char* in, char* out, char* fe)
  110. {
  111.   Tran1 *tran1;
  112.   Tran2 *tran2;
  113.   rpg_msg_info rpginfo;
  114.   int ret;

  115.   memset(&rpginfo, ' ', sizeof(rpginfo));
  116.   if (type == 1)
  117.   {
  118.     ret=execute_rslvsp(pgm_nm, 1, &tran1, &tran2);
  119.     if (ret!=0)
  120.       return -2;
  121.     tran1(&rpginfo, in, out);
  122.   }
  123.   else
  124.   {
  125.     ret=execute_rslvsp(pgm_nm, 2, &tran1, &tran2);
  126.     if (ret!=0)
  127.       return -2;
  128.     tran2(&rpginfo, in, out, fe);
  129.   }
  130.   get_msginfo(&msginfo, &rpginfo);
  131.   return check_msgid();
  132. }

  133. int process_tran(const char* tr_cd, char* tr_pgm,
  134.                  char* in, char* out, char* fe, char flg)
  135. {

  136.   char pgms[9][FILENM_LEN+1];
  137.   char trpgm[FILENM_LEN+1];
  138.   int ret=0, i;

  139.   if (trim_str(trpgm, tr_pgm, FILENM_LEN) > FILENM_LEN-1)
  140.   {
  141.     strcpy(msginfo.msgid, "EPLMNPGTL ");
  142.     sprintf(msginfo.msgtext, "交易程序名%s太長", trpgm);
  143.     return -2;
  144.   }

  145.   /*給該交易的每個(gè)覆蓋方法賦值*/
  146.   for (i=0; i<9; i++)
  147.     sprintf(pgms[i], "%s%1d", trpgm, i+1);
復(fù)制代碼

論壇徽章:
5
2015亞冠之阿爾艾因
日期:2015-08-10 02:23:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-08-13 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:1715-16賽季CBA聯(lián)賽之山西
日期:2016-04-13 02:36:59操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-14 06:20:00
7 [報(bào)告]
發(fā)表于 2016-04-11 01:52 |只看該作者

/*BEGIN***************************************************************/
/*程序名稱:TRANFUNC                                               */
/*功能描述:調(diào)度交易主流程程序                                     */
/*                                                                   */
/*設(shè)計(jì)人員:PACMAN          開發(fā)人員:PACMAN                     */
/*設(shè)計(jì)日期:2011-11-11      開發(fā)日期:2011-11-11                 */
/*-------------------------------------------------------------------*/
/*維護(hù)人員:                                                       */
/*維護(hù)日期:                                                       */
/*維護(hù)內(nèi)容:                                                       */
/*                                                                   */
/*END*****************************************************************/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <except.h>
#include <mih/triml.h>
#include <mih/rslvsp.h>

#include "dscppgm/cpyrgt_h"
#include "config_h"
#include "tranfunc_h"
#include "msginfo_h"

extern void DBCTL(char*);
extern int trim_str(char *buf, const char *str, int len);
extern void get_msginfo(msg_info *, const rpg_msg_info *);

extern msg_info msginfo;
static int rsl_flag;
static char rsl_pgm[FILENM_LEN+1];

void RSLVSP_PGM_HDLR(_INTRPT_Hndlr_Parms_T *errmsg)
{
  if(strncmp(errmsg->Msg_Id, "MCH3401", 7) == 0)
  {
    strcpy(msginfo.msgid, "EPLMNPGNF ";
    sprintf(msginfo.msgtext, "調(diào)用程序%s未找到", rsl_pgm);
    rsl_flag = 1;
  }
  else
  {
    strcpy(msginfo.msgid, "EPLMNPGER ";
    sprintf(msginfo.msgtext, "查找程序%s時(shí)出錯(cuò)%7.7s",
            rsl_pgm, errmsg->Msg_Id);
    rsl_flag = 2;
  }
}

int execute_rslvsp(char* pgm_nm, int type, Tran1** pt1, Tran2** pt2)
{
  rsl_flag = 0;
  strcpy(rsl_pgm, pgm_nm);
  #pragma exception_handler (RSLVSP_PGM_HDLR,rsl_flag,0,_C2_MH_ESCAPE,\
                             _CTLA_HANDLE_NO_MSG)
  if(type == 1)
    *pt1 = rslvsp(_Program, pgm_nm, "*LIBL", _AUTH_OBJ_MGMT);
  else
    *pt2 = rslvsp(_Program, pgm_nm, "*LIBL", _AUTH_OBJ_MGMT);
  #pragma disable_handler
  return rsl_flag;
}

void clear_msg(void)
{
  msginfo.msgid[0]='\0';
  msginfo.msgtext[0]='\0';
}

int check_msgid(void)
{
  if (triml(msginfo.msgid, ' ')!=0)
  {
    if (strncmp(msginfo.msgid, "EPLMNREST", 9)==0)
      return 1;
    else
      return -1;
  }
  return 0;
}

int execute_overpgm(char* overwt, char* dft, int type,
                    char* in, char* out, char* fe)
{
  Tran1 *tran1;
  Tran2 *tran2;
  rpg_msg_info rpginfo;
  int ret;

  memset(&rpginfo, ' ', sizeof(rpginfo));
  if (type==1)
  {
    ret=execute_rslvsp(overwt, 1, &tran1, &tran2);
    if (ret==1)
    {
      clear_msg();
      ret=execute_rslvsp(dft, 1, &tran1, &tran2);
    }
    if (ret!=0)
      return -2;
    tran1(&rpginfo, in, out);
  }
  else
  {
    ret=execute_rslvsp(overwt, 2, &tran1, &tran2);
    if (ret==1)
    {
      clear_msg();
      ret=execute_rslvsp(dft, 2, &tran1, &tran2);
    }
    if (ret!=0)
      return -2;
    tran2(&rpginfo, in, out, fe);
  }
  get_msginfo(&msginfo, &rpginfo);
  return check_msgid();
}

int execute_pgm(char* pgm_nm, int type, char* in, char* out, char* fe)
{
  Tran1 *tran1;
  Tran2 *tran2;
  rpg_msg_info rpginfo;
  int ret;

  memset(&rpginfo, ' ', sizeof(rpginfo));
  if (type == 1)
  {
    ret=execute_rslvsp(pgm_nm, 1, &tran1, &tran2);
    if (ret!=0)
      return -2;
    tran1(&rpginfo, in, out);
  }
  else
  {
    ret=execute_rslvsp(pgm_nm, 2, &tran1, &tran2);
    if (ret!=0)
      return -2;
    tran2(&rpginfo, in, out, fe);
  }
  get_msginfo(&msginfo, &rpginfo);
  return check_msgid();
}

int process_tran(const char* tr_cd, char* tr_pgm,
                 char* in, char* out, char* fe, char flg)
{

  char pgms[9][FILENM_LEN+1];
  char trpgm[FILENM_LEN+1];
  int ret=0, i;

  if (trim_str(trpgm, tr_pgm, FILENM_LEN) > FILENM_LEN-1)
  {
    strcpy(msginfo.msgid, "EPLMNPGTL ";
    sprintf(msginfo.msgtext, "交易程序名%s太長", trpgm);
    return -2;
  }

  /*給該交易的每個(gè)覆蓋方法賦值*/
  for (i=0; i<9; i++)
    sprintf(pgms[i], "%s%1d", trpgm, i+1);

  for (;
  {
    /* 交易初始化*/
    if (ret==0)
      ret = execute_pgm("PLMNN1", 1, in, out, fe);

    /* 覆蓋方法1交易預(yù)處理 */
    if (ret==0)
      ret = execute_overpgm(pgms[0], "SPLMNV1", 1, in, out, fe);

    /* 柜員歸屬檢查 */
    if (ret==0)
      ret = execute_pgm("PLMNN2", 1, in, out, fe);

    /* 覆蓋方法2交易機(jī)構(gòu)柜員檢查*/
    if (ret==0)
      ret = execute_overpgm(pgms[1], "SPLMNV2", 1, in, out, fe);

    /* 生成交易流水號(hào)*/
    if (ret==0)
      ret = execute_pgm("PLMNN3", 1, in, out, fe);

    /* 覆蓋方法3交易收費(fèi)計(jì)算*/
    if (ret==0)
      ret = execute_overpgm(pgms[2], "SPLMNV3", 2, in, out, fe);

    /* 費(fèi)用核對(duì)*/
    if (ret==0)
      ret = execute_pgm("PLMNN4", 2, in, out, fe);

    /* 調(diào)用交易程序*/
    if (ret==0)
      ret = execute_pgm(trpgm, 1, in, out, fe);

    /* 調(diào)用費(fèi)用收費(fèi)并進(jìn)行傳票重整服務(wù)*/
    if (ret==0)
      ret = execute_pgm("PLMNN5", 1, in, out, fe);

    /* 覆蓋方法4寫輸出接口*/
    if (ret==0)
      ret = execute_overpgm(pgms[3], "SPLMNV4", 1, in, out, fe);

    /* 返回處理*/
    if (ret==0)
      ret = execute_pgm("PLMNN6", 1, in, out, fe);

    if (ret==0 && flg==DEBUG_NO)
      DBCTL(DB_COMMIT);
    else
      DBCTL(DB_ROLLBACK);

    if (ret!=1)
      break;
    clear_msg();
  }

  return ret;
}

論壇徽章:
5
2015亞冠之阿爾艾因
日期:2015-08-10 02:23:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-08-13 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:1715-16賽季CBA聯(lián)賽之山西
日期:2016-04-13 02:36:59操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-14 06:20:00
8 [報(bào)告]
發(fā)表于 2016-04-11 01:53 |只看該作者
占位,這段代碼貼不了。

論壇徽章:
5
2015亞冠之阿爾艾因
日期:2015-08-10 02:23:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-08-13 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:1715-16賽季CBA聯(lián)賽之山西
日期:2016-04-13 02:36:59操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-14 06:20:00
9 [報(bào)告]
發(fā)表于 2016-04-11 01:53 |只看該作者
    這段程序中,最重要的是rslvsp()這個(gè)系統(tǒng)函數(shù),這個(gè)函數(shù)用來在指定的庫列表中獲取系統(tǒng)對(duì)象指針。在這里我們用來獲取覆蓋方法的*PGM程序?qū)ο。通過外面用#pragma exception_handler的包圍,指定了RSLVSP_PGM_HDLR()作為rslvsp()的異常捕獲函數(shù),當(dāng)捕獲MCH3401時(shí),即不存在程序?qū)ο蟆xecute_rslvsp()這個(gè)函數(shù)的功能,就實(shí)現(xiàn)了獲取指定名字的*PGM,設(shè)置指針變量,返回是否找到的標(biāo)志。execute_overpgm()實(shí)現(xiàn)了如果有交易自定義覆蓋方法程序存在,則調(diào)用,否則調(diào)用默認(rèn)的程序。execute_pgm()實(shí)現(xiàn)了調(diào)用非覆蓋方法。最后的process_tran()實(shí)現(xiàn)了交易主流程,依次按流程組織調(diào)用非覆蓋方法和覆蓋方法,進(jìn)行事務(wù)回滾或提交。
    注意交易主流程中,識(shí)別是否出現(xiàn)交易重新執(zhí)行的特殊錯(cuò)誤代碼EPLMNREST,如果出現(xiàn)則原事務(wù)回滾并重新開始執(zhí)行整個(gè)交易流程。這能解決一些特定場(chǎng)景,例如第三方來賬如果入賬不成功,需要直接掛待銷賬。通過修改輸入結(jié)構(gòu)的某些字段值,并返回EPLMNREST錯(cuò)誤代碼,這樣在核心系統(tǒng)一次交易即可實(shí)現(xiàn)入賬或掛賬功能。

論壇徽章:
5
2015亞冠之阿爾艾因
日期:2015-08-10 02:23:34操作系統(tǒng)版塊每日發(fā)帖之星
日期:2015-08-13 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:1715-16賽季CBA聯(lián)賽之山西
日期:2016-04-13 02:36:59操作系統(tǒng)版塊每日發(fā)帖之星
日期:2016-04-14 06:20:00
10 [報(bào)告]
發(fā)表于 2016-04-11 01:54 |只看該作者
當(dāng)中一段代碼看我發(fā)在博客里的吧。
http://blog.chinaunix.net/uid-283313-id-5699224.html
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP