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

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12345下一頁
最近訪問板塊 發(fā)新帖
查看: 249253 | 回復: 44
打印 上一主題 下一主題

一個程序員在AS400銀行核心系統(tǒng)開發(fā)中的技術總結(jié) [復制鏈接]

論壇徽章:
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)] [報告]
發(fā)表于 2015-05-29 23:22 |只看該作者 |倒序瀏覽
本帖最后由 pacman2000 于 2015-06-07 17:43 編輯

    隨著國家的自主安全可控號召,AS400系統(tǒng)看來在銀行IT逐漸退出了。因此很遺憾,重新規(guī)劃開發(fā)的AS400新核心系統(tǒng)就告一段落。不過,在開發(fā)過程中,有不少技術值得總結(jié)共享,如果有謬誤,或有更優(yōu)方法,也請大家指正。
    開發(fā)中使用的技術,基本上都是參照IBM信息中心的官方文檔,鏈接在這里:www-01.ibm.com/support/knowledgecenter/ssw_ibm_i/welcome?lang=zh


    *操作系統(tǒng)版本
    系統(tǒng)選擇了V6R1的版本,ILE環(huán)境(從OPM轉(zhuǎn)到ILE不需要解釋了吧)。這是因為V6R1有一個重大提升:RPG程序內(nèi)部結(jié)構(gòu)的大小限制從64K提升到了16M。這讓DS,數(shù)組更具實用性。例如,交易程序的PARM,通常是輸入接口復合DS,輸出接口復合DS,遇到數(shù)組時64K就不夠用。V7R1,V7R2也有不少改變,特別是V7R2,完善了自由格式,可以讓H,F(xiàn),D等全部擁有了自由格式寫法,并且不需要/FREE,/END-FREE標識符即可自由格式固定格式混用,真是不錯的選擇。當時詳細分析了6.1,7.1,7.2的語法改進,下面介紹下不同版本在開發(fā)上的重要改進。

    7.2
    CL語言
    對字符串新增了6個函數(shù),%CHECK,%CHECKR,%SCAN,%TRIM,%TRIML,%TRIMR。
    新增6個轉(zhuǎn)換函數(shù),%CHAR,%DEC,%INT,%UINT,%LOWER,%UPPER。
    新增2個大小函數(shù),%LEN,%SIZE。
    是不是CL中處理方便多了?可惜在7.2才能用,6.1只能看看了。

    C/C++語言
    沒有什么需要關注的改動。

    RPG語言
    放松對IO輸入輸出結(jié)構(gòu)的要求。使用*ALL可以讓LIKEREC結(jié)構(gòu)可以用在讀寫等任何IO操作上。這點非常有用,以后介紹LIKEREC時候再詳細比較。
    增加了CTL-OPT寫法,用于自由格式H表定義。
    增加了DCL-F寫法,用于自由格式F表定義。
    增加了DCL-C, DCL-DS, DCL-PI, DCL-PR, DCL-S寫法,用于自由格式D表定義。
    增加了DCL-PROC寫法,用于子過程定義。
    不再要求/FREE,/END-FREE,自由格式和固定格式可以任意混合編寫。
    %SUBDT增加參數(shù),使得可以指定返回幾位數(shù)字,例如%SUBDT(MyDate:*YEARS:4)。
    timestamp類型可以保存秒以下12位小數(shù)(納秒?),相應的%TIMESTAMP也增加了參數(shù)用于指定小數(shù)位數(shù)。
   

    7.1
    CL語言
    可以使用RTVCLSRC從目標對象來獲取ILE CL的源代碼了。不過要求編譯時ALWRTVSRC參數(shù)指定為*YES。
    INT,UINT類型長度可以擴展到8字節(jié)。
    可以在編譯程序時,用DBGENCKEY,使得只有輸入正確的KEY,才能看到源碼視圖。(這個,嘿嘿)
    CL中的INCLUDE支持嵌套了。

    C/C++語言
    沒有什么需要關注的改動。

    RPG語言
    SORTA和%LOOKUP可以依據(jù)DS結(jié)構(gòu)的某一個字段,來排序或檢索數(shù)組啦。例如:SORTA custDs(*).amount_owing; elem = %LOOKUP("K" : custDs(*).account_status);
    SORTA可以用(A),(D)來正序,逆序排序數(shù)組。
    增加了%SCANRPL函數(shù),用于將一個字符串中的子串,替換為指定的字符串。(報錯信息替換的神器啊,可惜V6R1不能用)
    可以在編譯程序時,用DBGENCKEY,使得只有輸入正確的KEY,才能看到源碼視圖。


    6.1
    CL語言
    增加CLOSE語句,可以關閉RCVF打開的文件,用于多次讀取一個文件的場景。
    增加INCLUDE語句,包含另外CL一個源文件。

    C/C++語言
    沒有什么需要關注的改動。

    RPG語言
    文件定義時候可以指定QUALIFIED,記錄格式名變成MYFILE.MYFMT,避免文件內(nèi)字段名字對程序全局字段的名字污染。但文件操作必須使用DS結(jié)構(gòu)。這點稍后會詳細介紹。
    EXTDESC和EXTFILE(*EXTDESC),使得可以編譯期不再需要綁定文件描述,而使用字符串形式的'LIBNAME/FILENAME',運行期再去打開文件。
    EXTNAME可以使用字符串形式'LIBNAME/FILENAME',同樣不需要編譯器綁定文件。
    擴大DS,可變字符串等的最大限制,大小擴到16M?勺冏址腣ARYING關鍵字允許指定2或4字節(jié)存放長度,%ADDR(varying : *DATA)可以獲取到除去長度后的數(shù)據(jù)位置指針。
    DIM和OCCURS數(shù)組的最大限制,元素個數(shù)擴充到16M個,但總大小不超過16M。
    字符串常量大小擴到16k。
    TEMPLATE關鍵字可用于文件定義和結(jié)構(gòu)定義,不占用存儲空間,通常為了LIKEFILE,LIKE,LIKEDS使用。TEMPLATE DS可以有INZ定義,方便參照它的結(jié)構(gòu)使用INZ(*LIKEDS)來初始化。

論壇徽章:
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 [報告]
發(fā)表于 2015-05-29 23:41 |只看該作者
本帖最后由 pacman2000 于 2015-05-30 11:08 編輯

    *COPYRIGHT設置
    讓我們從一個比較無聊的技術開始吧,哈哈。COPYRIGHT就是編譯成目標后,可以用DSPPGM,DSPMOD等,翻到版權(quán)頁,顯示的字符串。這個要怎么弄呢?考慮到系統(tǒng)有很多程序,因此采用了設置包含源文件的方式實現(xiàn)。


    RPGLE
    應用程序:
  1. H/COPY DSCPPGM,HEAD
復制代碼
.
    HEAD源文件:
  1. HCOPYRIGHT('Firebird V2.1 corebanking system')
  2. HDATFMT(*ISO) TIMFMT(*ISO) DATEDIT(*YMD)
復制代碼
.

    C/C++
    應用程序:
  1. #include "dscppgm/cpyrgt_h"
復制代碼
.
    CPYRGT_H源文件:
  1. #ifndef CPYRGT_H
  2. #define CPYRGT_H
  3. #pragma comment(copyright,"Firebird V2.1 corebanking system")
  4. #endif
復制代碼
.


    CLLE
    應用程序:
  1.     INCLUDE    SRCMBR(CLHD) SRCFILE(DSCPPGM)
復制代碼
.

    CLHD源文件:
  1.     COPYRIGHT  TEXT('Firebird V2.1 corebanking system')
復制代碼
.


    但是,AS400的CL在COPYRIGHT處理上并不完美。RPG,C都可以設置DBCS中文字符串,CL帶中文的話編譯報錯。DEBUG時,CL也會因為INCLUDE引入而導致沒有普通視圖。這一點,不知道高版本是否有改善,有環(huá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 [報告]
發(fā)表于 2015-05-30 10:59 |只看該作者
本帖最后由 pacman2000 于 2015-05-31 15:41 編輯

*數(shù)據(jù)區(qū)域DATA AREA的使用

數(shù)據(jù)區(qū)域DTAARA,是一小片存儲對象,通常使用1-2k大小的CHAR類型。持久化的命名數(shù)據(jù)區(qū)域,可以在不同job間交互數(shù)據(jù)。在系統(tǒng)中使用了這種方式存放配置參數(shù),方便做到不重啟應用的動態(tài)刷新。另外還有幾個特殊數(shù)據(jù)區(qū)域,常見的是*LDA,1k大小的job自有共享區(qū)域,可用于job內(nèi)不同程序間的數(shù)據(jù)交互,起到全局空間的作用。*LDA不能持久化,隨著job結(jié)束而消失,因此可以認為是一片job特有的內(nèi)存,不需加鎖訪問,速度更快。

在程序中使用DTAARA比較簡單,參照下面的例子。

C/C++
  1. #include <xxdtaa.h>  //讀寫數(shù)據(jù)區(qū)域使用的頭文件
  2. ...
  3. _DTAA_NAME_T dtaa = {"MNAR      ", "*LIBL     "};  //定義命名數(shù)據(jù)區(qū)域的名稱,如果是LDA,則為{"*LDA      ", "          "}
  4. QXXCHGDA(dtaa, DBG_START, sizeof(data), data);  //從DBG_START位開始,寫入字符串data內(nèi)容到數(shù)據(jù)區(qū)域
  5. QXXRTVDA(dtaa, 1, sizeof(dtaa_st), (char*)dtaa_s);  //從第一位開始獲取數(shù)據(jù)區(qū)域內(nèi)容,存放到自定義的dtaa_st結(jié)構(gòu)變量dtaa_s中
復制代碼
.

RPGLE
*LDA的例子
  1.      D*定義公共數(shù)據(jù),使用*LDA,內(nèi)容為TRAR,INHD,OTHD結(jié)構(gòu)的組合
  2.      DT_TRAR         E DS                  EXTNAME(TRAR) QUALIFIED TEMPLATE
  3.      DT_INHD         E DS                  EXTNAME(INHD) QUALIFIED TEMPLATE
  4.      DT_OTHD         E DS                  EXTNAME(OTHD) QUALIFIED TEMPLATE
  5.      DS_LDA           UDS                  DTAARA(*LDA)  QUALIFIED
  6.      D TRAR                                LIKEDS(T_TRAR)
  7.      D INHD                                LIKEDS(T_INHD)
  8.      D OTHD                                LIKEDS(T_OTHD)
  9.      ...
  10.      C*讀取LDA,并進行錯誤處理。LDA無需上鎖。
  11.      C                   IN(E)     S_LDA
  12.      C                   IF        (%ERROR)
  13.      C*讀取失敗
  14.      C                   ENDIF
  15.      ...
  16.      C*寫入LDA,并進行錯誤處理。LDA無需上鎖。
  17.      C                   OUT(E)    S_LDA
  18.      C                   IF        %ERROR
  19.      C*寫入失敗
  20.      C                   ENDIF
復制代碼
.

命名DTAARA的例子
  1.      D*總長度256字節(jié)的數(shù)據(jù)區(qū)域BTAR,內(nèi)容為5P0的變量MAXJOBS
  2.      DS_BTAR          UDS           256    DTAARA('BTAR') QUALIFIED
  3.      D MAXJOBS                        5P 0
  4.      ...
  5.      C*從BTAR獲取MAXJOBS值
  6.      C     *LOCK         IN        S_BTAR
  7.      C                   UNLOCK    S_BTAR
復制代碼
.

在IN讀取命名數(shù)據(jù)區(qū)域時,可以用*LOCK選擇是否加鎖。加鎖以后,訪問數(shù)據(jù)區(qū)域的其他程序就只能讀不能寫。如果執(zhí)行到不加*LOCK的OUT,那么寫完即釋放鎖。如果OUT加了*LOCK,那么鎖將會繼續(xù)保持。使用UNLOCK可以直接在不寫入的情況下解除鎖。


CLLE及命令行
系統(tǒng)提供了幾個命令來操作數(shù)據(jù)區(qū)域。
CRTDTAARA,創(chuàng)建命名數(shù)據(jù)區(qū)域(*LDA不需創(chuàng)建),創(chuàng)建時也可指定初始值,如CRTDTAARA DTAARA(CUSTOMER) TYPE(*CHAR) LEN(100) VALUE('INIT') TEXT(’Customer name area’)
DSPDTAARA,顯示或打印數(shù)據(jù)區(qū)域的內(nèi)容,如DSPDTAARA  DTAARA(MYLIB/MYDTA)
RTVDTAARA,獲取數(shù)據(jù)區(qū)域內(nèi)容到CL變量,可以指定從第幾位取多少位,如RTVDTAARA  DTAARA(*LDA (5,2)) RTNVAR(&VAL)
CHGDTAARA,與獲取類似,寫入數(shù)據(jù)區(qū)域,如果字符串長度不足補空格,如CHGDTAARA  DTAARA(*LDA (5,4)) VALUE('OK'),實際5-8位寫入'OK  '
DLTDTAARA,刪除一個命名數(shù)據(jù)區(qū)域,如DLTDTAARA  DTAARA(MYLIB/MYDTA)

論壇徽章:
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 [報告]
發(fā)表于 2015-06-07 22:40 |只看該作者
本帖最后由 pacman2000 于 2015-06-07 22:43 編輯

*用戶空間USER SPACE的使用

用戶空間USER SPACE,是AS400所提供進程間通訊的另一個機制,可以保存一塊較大的持久化數(shù)據(jù)。常用的三大機制,DATA AREA在核心系統(tǒng)中用于控制參數(shù)的設置,例如批處理平臺并發(fā)數(shù)控制,聯(lián)機平臺各種標志,以及全局內(nèi)容在*LDA的跨PGM保存?zhèn)鬟f。DATA QUEUE可用于進程間傳遞消息數(shù)據(jù),因核心系統(tǒng)設計上處理進程的隔離性而沒有用到。USER SPACE則用于實現(xiàn)輸出報文的靈活性,保存核心系統(tǒng)交易處理過程中,可能產(chǎn)生返回的憑證打印報文接口段。
USER SPACE最大長度可達16M,必須命名以持久化。由于在系統(tǒng)中用于暫存一筆聯(lián)機交易需要返回的附加報文數(shù)據(jù),因此對持久化其實沒有要求,但性能要求很高,又不能互相影響。于是將USER SPACE建立在QTEMP中。這樣不同JOB各自有一份使用,而且QTEMP數(shù)據(jù)系統(tǒng)應該是在內(nèi)存中建立的,恰好符合要求。

那么程序中如何訪問呢,可以看實際使用的例子。

創(chuàng)建USER SPACE,名稱為QTEMP/JOBADDUS。

  1.              PGM        PARM(&SPCLEN)
  2.              INCLUDE    SRCMBR(CLHD) SRCFILE(DSCPPGM)
  3.              DCL        VAR(&PASSPCNM) TYPE(*CHAR) LEN(20)
  4.              DCL        VAR(&SPCATTR) TYPE(*CHAR) LEN(10)
  5.              DCL        VAR(&SPCLEN) TYPE(*UINT) LEN(4)
  6.              DCL        VAR(&SPCVALUE) TYPE(*CHAR) LEN(1)
  7.              DCL        VAR(&SPCAUTH) TYPE(*CHAR) LEN(10)
  8.              DCL        VAR(&SPCTEXT) TYPE(*CHAR) LEN(50)
  9.              CHGVAR     VAR(&PASSPCNM) VALUE('JOBADDUS  QTEMP     ')
  10.              CHGVAR     VAR(&SPCAUTH) VALUE('*CHANGE')
  11.              CHGVAR     VAR(&SPCTEXT) VALUE('附加報文用戶空間')
  12.              CHGVAR     VAR(&SPCVALUE) VALUE(X'00')
  13.              CALL       PGM(QUSCRTUS) PARM(&PASSPCNM &SPCATTR +
  14.                           &SPCLEN &SPCVALUE &SPCAUTH &SPCTEXT)
  15.              MONMSG     MSGID(CPF9870)
  16.              ENDPGM
復制代碼
.

因為JOB結(jié)束時QTEMP自動釋放,而JOB不結(jié)束的話USER SPACE可以重復使用,因此不需要人為去刪除這個USER SPACE。

使用這個USER SPACE,會有兩種情況。
一是交易運行過程中,產(chǎn)生需要附加的打印接口數(shù)據(jù),這時候調(diào)用下面的程序記錄進USER SPACE,注意,同時將已附加長度寫進*LDA記錄。另一種情況是組返回報文時,讀取數(shù)據(jù)打包進報文,這個用的是后續(xù)的USER SPACE指針操作。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <arpa/inet.h>

  4. #include "dscppgm/cpyrgt_h"
  5. #include "config_h"
  6. #include "msginfo_h"
  7. #include "opdtaac_h"

  8. extern void JOBUSPTR(char **usptr);
  9. extern void fill_str(char *buf, const char *str, int len);
  10. extern int get_output_arrays_count(oa_otct*);
  11. extern int set_otlen(int len);

  12. /* parm1 MESG
  13.    parm2 ITNAME  10A
  14.    parm3 ITCNT   2B  hostorder
  15.    parm4 ITPLEN  2B  hostorder
  16.    parm5 ITBUF   ITCNT*ITPLEN
  17. */
  18. int main(int argc, char **argv)
  19. {
  20.   oa_otct oa;
  21.   rpg_msg_info *rpginfo;
  22.   int olen, tlen;
  23.   unsigned short pcnt, plen, tmp;
  24.   char *obuf, *itbuf;
  25.   char *itnm;
  26.   char linebuf[LINENO_LEN+1];

  27.   if (argc<2)
  28.     return -1;
  29.   rpginfo=(rpg_msg_info *)argv[1];
  30.   if (argc!=6)
  31.   {
  32.     fill_str(rpginfo->msgflnm, __FILE__, FILENM_LEN);
  33.     sprintf(linebuf, "%6d", __LINE__);
  34.     fill_str(rpginfo->msgline, linebuf, LINENO_LEN);
  35.     fill_str(rpginfo->msgid, "EPLMNOPCK ", MSG_ID_LEN);
  36.     fill_str(rpginfo->msgtext, "組附加報文接口不正確", MSG_TEXT_LEN);
  37.     fill_str(rpginfo->msgotds, "", MSG_TEXT_LEN);
  38.     return -1;
  39.   }
  40.   itnm=argv[2];
  41.   pcnt=*(unsigned short *)argv[3];
  42.   plen=*(unsigned short *)argv[4];
  43.   itbuf=argv[5];

  44.   JOBUSPTR(&obuf);
  45.   get_output_arrays_count(&oa);
  46.   olen=oa.ot_len;
  47.   obuf += olen;

  48.   tlen = olen + ITNAME_SIZE + ITCNT_SIZE + ITPLEN_SIZE
  49.          + (pcnt==0 ? plen : pcnt*plen);
  50.   if (tlen > DAT_MAX_LEN)
  51.   {
  52.     char errbuf[MSG_TEXT_LEN];

  53.     fill_str(rpginfo->msgflnm, __FILE__, FILENM_LEN);
  54.     sprintf(linebuf, "%6d", __LINE__);
  55.     fill_str(rpginfo->msgline, linebuf, LINENO_LEN);
  56.     fill_str(rpginfo->msgid, "EPLMNOLEN ", MSG_ID_LEN);
  57.     sprintf(errbuf, "組附加報文時長度%d + %d超過最大長度%d",
  58.             olen, tlen-olen, DAT_MAX_LEN);
  59.     fill_str(rpginfo->msgtext, errbuf, MSG_TEXT_LEN);
  60.     fill_str(rpginfo->msgotds, "", MSG_TEXT_LEN);
  61.     return -1;
  62.   }

  63.   fill_str(obuf, itnm, ITNAME_SIZE);
  64.   obuf += ITNAME_SIZE;
  65.   tmp = htons(pcnt);
  66.   memcpy(obuf, &tmp, ITCNT_SIZE);
  67.   obuf += ITCNT_SIZE;
  68.   tmp = htons(plen);
  69.   memcpy(obuf, &tmp, ITPLEN_SIZE);
  70.   obuf += ITPLEN_SIZE;
  71.   memcpy(obuf, itbuf, pcnt==0 ? plen : pcnt*plen);

  72.   set_otlen(olen);
  73.   return tlen;
  74. }
復制代碼
.
這個程序?qū)⒁粋報文接口,以ITNAME接口名,ITCNT接口數(shù)組條數(shù),ITLEN接口單條長度,ITBUF接口數(shù)據(jù)的方式,打包記錄進USER SPACE。其中,JOBUSPTR用于獲取USER SPACE的指針,然后就像普通內(nèi)存一樣操作。下面就是JOBUSPTR的程序。

  1.              PGM        PARM(&USPTR)
  2.              INCLUDE    SRCMBR(CLHD) SRCFILE(DSCPPGM)
  3.              DCL        VAR(&PASSPCNM) TYPE(*CHAR) LEN(20)
  4.              DCL        VAR(&USPTR) TYPE(*PTR)
  5.              CHGVAR     VAR(&PASSPCNM) VALUE('JOBADDUS  QTEMP     ')
  6.              CALL       PGM(QUSPTRUS) PARM(&PASSPCNM &USPTR)
  7.              ENDPGM
復制代碼
.

核心系統(tǒng)中的用法到此為止。實際上,USER SPACE相關的命令和調(diào)用有不少,修改內(nèi)容的方式除了獲取指針,還可以用QUSRTVUS獲取USER SPACE內(nèi)容,QUSCHGUS修改USER SPACE內(nèi)容。這兩個調(diào)用以字符串的形式操作。遺憾的是,CL對USER SPACE的支持較少,需要用到的話自己寫程序擴充吧。

論壇徽章:
0
5 [報告]
發(fā)表于 2015-06-09 11:05 |只看該作者
給大師點個贊,辛苦了!很受用

論壇徽章:
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 [報告]
發(fā)表于 2015-06-09 17:23 |只看該作者
cuilei286 發(fā)表于 2015-06-09 11:05
給大師點個贊,辛苦了!很受用



哈哈,因為接下來可能不太會用400了,所以總結(jié)一下,一方面共享知識,另外也免得以后自己忘記了。
還有不少技術上的功能點,以后會慢慢補充。

論壇徽章:
49
15-16賽季CBA聯(lián)賽之福建
日期:2016-06-22 16:22:002015年亞洲杯之中國
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36雙魚座
日期:2015-01-02 22:04:33午馬
日期:2014-11-25 09:58:35辰龍
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龍
日期:2014-08-21 10:47:58
7 [報告]
發(fā)表于 2015-06-12 23:25 |只看該作者
pacman2000 發(fā)表于 2015-06-09 17:23
哈哈,因為接下來可能不太會用400了,所以總結(jié)一下,一方面共享知識,另外也免得以后自己忘記了。
還 ...


感謝樓主分享哈~

論壇徽章:
0
8 [報告]
發(fā)表于 2015-06-13 11:22 |只看該作者
感謝樓主分享~

論壇徽章:
12
數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2015-07-08 22:20:00IT運維版塊每日發(fā)帖之星
日期:2016-05-01 06:20:00IT運維版塊每周發(fā)帖之星
日期:2016-03-07 16:27:44IT運維版塊每月發(fā)帖之星
日期:2016-03-07 16:25:25IT運維版塊每日發(fā)帖之星
日期:2016-02-21 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-02-20 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-02-06 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-01-30 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-01-03 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-11-29 06:20:00IT運維版塊每日發(fā)帖之星
日期:2015-08-10 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-06-16 06:20:00
9 [報告]
發(fā)表于 2015-06-15 14:14 |只看該作者
18摸現(xiàn)在也僅僅是維持as400了吧?

論壇徽章:
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 [報告]
發(fā)表于 2015-06-18 07:18 |只看該作者
本帖最后由 pacman2000 于 2015-06-18 07:19 編輯

*多語言與多環(huán)境

系統(tǒng)對多語言的支持,這在某些情況下,也是非常有用的,例如將核心系統(tǒng)部署為海外分行系統(tǒng)。通常情況下,海外系統(tǒng)獨立搭建,操作人員部分是當?shù)厝藛T,也可能有派駐人員。同一套環(huán)境的多語言隨時切換,其實并不存在實際場景,因為數(shù)據(jù)表內(nèi)容存放,只會按照一個語言標準。舉個例子,核心系統(tǒng)的戶名地址等字段,是根據(jù)系統(tǒng)所在國家設語言,存放成不同文字,比如中文,而這些字段都會在輸入輸出中展示。因此,即使是將用戶環(huán)境和操作界面切換成英文環(huán)境,字段內(nèi)容仍會出現(xiàn)中文。另外,多語言不應額外增加處理的負擔。
于是,系統(tǒng)的多語言,就分為兩個方面。一是這套系統(tǒng)是否可以輕松做到轉(zhuǎn)向其他語言的翻譯,即如何作為一套海外系統(tǒng)部署。二是當系統(tǒng)后臺維護人員運行工具時,如果能根據(jù)用戶做到參數(shù)說明和輸出展示的語言選擇,盡可能符合本地人員和派駐人員的習慣。下面以中文(默認)和英文(輔助)為例,總結(jié)一下做法。

數(shù)據(jù)表部分,對于不同國家的版本,將各數(shù)據(jù)存放對象的CCSID設置為相應國家語言代碼,如中文則為1388。
應用程序部分,區(qū)別在于返回報文的某些字符串字段內(nèi)容語言不同。這些字段的數(shù)據(jù)來源,除了數(shù)據(jù)庫中直接記錄的字段,還可以在應用程序中拼接而成,比如出錯信息。核心系統(tǒng)使用了錯誤信息表,在RPG程序中做錯誤信息的拼接組裝。例如,“EIOER”錯誤代碼內(nèi)容為“接口&1字段&2值&3不正確”。其中&1,&2,&3由應用程序字符串代入。因此,應用程序中,全部將文本定義成命名為C_MGXXXX的常量。制作其他語言版本時,只需翻譯所有C_MG常量,錯誤信息表和文件的中文描述即可(因為某些錯誤信息,會拼接表的中文信息,例如:更新表&1失敗,&1為PF的中文描述活期分戶賬,如何獲取在統(tǒng)一錯誤處理部分詳細介紹)。
工具部分,就需要考慮操作用戶不同時的語言不同了。AS400為CMD提供了多語言提示文件的方法,但CMD只是發(fā)起命令界面,執(zhí)行程序的過程顯示就沒有辦法了。因此換了一種做法,將工具的CMD,PGM等分多套語言版本編譯到不同的目標庫中。如XXXOBJMON放置默認的中文工具程序,XXXOBJMONE放置輔助的英文版本程序。然后通過用戶USRPRF的初始化程序不同,來指定LIBL中的先后順序,達到執(zhí)行的不同語言版本的效果。

下面是中文語言習慣的用戶USRPRF初始化程序。

  1.              PGM
  2.              INCLUDE    SRCMBR(CLHD) SRCFILE(DSCPPGM)
  3.              DCL        VAR(&PFX) TYPE(*CHAR) LEN(3)
  4.              DCL        VAR(&JRN) TYPE(*CHAR) LEN(10)
  5.              DCL        VAR(&JRNLIB) TYPE(*CHAR) LEN(10)
  6.              DCL        VAR(&OTHLIB) TYPE(*CHAR) LEN(10)
  7.              CALL       PGM(GETPREFIX) PARM(&PFX)
  8.              CHGVAR     VAR(&JRN) VALUE(&PFX *CAT 'JRN')
  9.              CHGVAR     VAR(&JRNLIB) VALUE(&PFX *CAT 'SYSJRN')
  10.              CHGVAR     VAR(&OTHLIB) VALUE(&PFX *CAT 'OBJOTH')
  11.              CHGSYSLIBL LIB(QSYS2989)
  12.              CHGCURLIB  CURLIB(&OTHLIB)
  13.              STRCMTCTL  LCKLVL(*CHG) CMTSCOPE(*JOB) +
  14.                           DFTJRN(&JRNLIB/&JRN)
  15.              MONMSG     MSGID(CPF8351)
  16.              ENDPGM
復制代碼
.

下面是英文語言習慣的用戶USRPRF初始化程序。注意在OBJMON前會先搜索OBJMONE。

  1.              PGM
  2.              INCLUDE    SRCMBR(CLHD) SRCFILE(DSCPPGM)
  3.              DCL        VAR(&PFX) TYPE(*CHAR) LEN(3)
  4.              DCL        VAR(&JRN) TYPE(*CHAR) LEN(10)
  5.              DCL        VAR(&JRNLIB) TYPE(*CHAR) LEN(10)
  6.              DCL        VAR(&MONLIB) TYPE(*CHAR) LEN(10)
  7.              DCL        VAR(&ENULIB) TYPE(*CHAR) LEN(10)
  8.              DCL        VAR(&OTHLIB) TYPE(*CHAR) LEN(10)
  9.              CALL       PGM(GETPREFIX) PARM(&PFX)
  10.              CHGVAR     VAR(&JRN) VALUE(&PFX *CAT 'JRN')
  11.              CHGVAR     VAR(&JRNLIB) VALUE(&PFX *CAT 'SYSJRN')
  12.              CHGVAR     VAR(&MONLIB) VALUE(&PFX *CAT 'OBJMON')
  13.              CHGVAR     VAR(&ENULIB) VALUE(&PFX *CAT 'OBJMONE')
  14.              CHGVAR     VAR(&OTHLIB) VALUE(&PFX *CAT 'OBJOTH')
  15.              ADDLIBLE   LIB(&ENULIB) POSITION(*BEFORE &MONLIB)
  16.              CHGCURLIB  CURLIB(&OTHLIB)
  17.              STRCMTCTL  LCKLVL(*CHG) CMTSCOPE(*JOB) +
  18.                           DFTJRN(&JRNLIB/&JRN)
  19.              MONMSG     MSGID(CPF8351)
  20.              ENDPGM
復制代碼
.

其中,GETPREFIX程序,是獲取當前應用環(huán)境。系統(tǒng)在一臺機器上可以部署多套環(huán)境,以前三位環(huán)境代碼區(qū)分。所有的庫名前三位即為環(huán)境代碼,用戶登錄時,就可以根據(jù)LIBL的設置,對應到相應環(huán)境。應用程序編寫時,盡量使用*LIBL查找目標,如果確需指定庫名,則先調(diào)用GETPREFIX,根據(jù)用戶USRPRF的初始化程序所在庫前三位,獲得環(huán)境代碼。

  1.              PGM        PARM(&PREFIX)
  2.              INCLUDE    SRCMBR(CLHD) SRCFILE(DSCPPGM)
  3.              DCL        VAR(&PREFIX) TYPE(*CHAR) LEN(3)
  4.              DCL        VAR(&PGMLIB) TYPE(*CHAR) LEN(10)
  5.              RTVUSRPRF  INLPGMLIB(&PGMLIB)
  6.              CHGVAR     VAR(&PREFIX) VALUE(%SST(&PGMLIB 1 3))
  7.              ENDPGM
復制代碼
.

您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP