V5R4 での CL の拡張

以前 V5R3 での CL の拡張についてちょっとまとめてみましたが、V5R4 でも CL については大きく拡張されています。ちょっとまとめてみました。
毎リリースなんか CL にいろんな機能が増えている、なんていうのは AS/400 が出たばっかりの頃の感じを思い出しますね ...... まぁ喜ぶべきことでしょう。

今回大きなものとしては以下のようなものが挙げられると思います。

サブルーチン

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rbam6/callsubrc.htm

定義済み変数

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rbam6/definedv.htm

ポインター

http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=/rbam6/basedv.htm

V5R4 からではありませんが、Integer データタイプについてもまとめたものを引用してみました。(出典: What's New in CL Programming )

データ・タイプ サイズ 最大値
整数値 (符号付き) *INT 2 32,000
整数値 (符号なし) *UINT 2 64,000
パック 10進数 *DEC 2 999
整数値 (符号付き) *INT 4 20 億
整数値 (符号なし) *UINT 4 40 億
パック 10進数 *DEC 4 99,999

インフォメーション・センターにあったサンプルを元にして、以上のような機能のデモになるようにごく簡単なプログラムを書いてみました。

        *************** データの始め ****************                           
0001.00              PGM                                                         
0002.00                                                                         
0003.00              DCL        VAR(&MESSAGE) TYPE(*CHAR) LEN(25) +             
0004.00                           VALUE('LIBRARY NNN IS XXXXXXXXXX')             
0005.00              DCL        VAR(&SEQUENCE) TYPE(*CHAR) STG(*DEFINED) +       
0006.00                           LEN(3) DEFVAR(&MESSAGE 9)                     
0007.00              DCL        VAR(&MSGLIBN) TYPE(*CHAR) STG(*DEFINED) +       
0008.00                           LEN(10) DEFVAR(&MESSAGE 16)                   
0009.00              DCL        VAR(&COUNTER) TYPE(*INT) LEN(2)                 
0010.00              DCL        VAR(&LIBL) TYPE(*CHAR) LEN(2750)                 
0011.00              DCL        VAR(&PTR) TYPE(*PTR) ADDRESS(&LIBL)             
0012.00              DCL        VAR(&LIBLNAME) TYPE(*CHAR) STG(*BASED) +         
0013.00                           LEN(10) BASPTR(&PTR)                           
0014.00              DCL        VAR(&RETURN) TYPE(*INT) LEN(4)                   
0015.00                                                                         
0016.00              RTVJOBA    USRLIBL(&LIBL)                                   
0017.00              CHGVAR     VAR(&COUNTER) VALUE(0)                           
0018.00                                                                         
0019.00              DOFOR      VAR(&COUNTER) FROM(1) TO(250) BY(1)             
0020.00              IF         COND(&LIBLNAME *EQ '          ') THEN(LEAVE)     
0021.00              CHGVAR     VAR(&SEQUENCE) VALUE(&COUNTER)                   
0022.00              CHGVAR     VAR(&MSGLIBN) VALUE(&LIBLNAME)                   
0023.00              CALLSUBR   SUBR(SNDMSG) RTNVAL(&RETURN)                     
0024.00              CHGVAR     VAR(%OFS(&PTR)) VALUE(%OFS(&PTR) + 11)           
0025.00              ENDDO                                                       
0026.00                                                                         
0027.00              SUBR       SUBR(SNDMSG)                                     
0028.00              SNDPGMMSG  MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +             
0029.00                           MSGDTA(&MESSAGE)                               
0030.00              ENDSUBR    RTNVAL(0)                                       
0031.00                                                                         
0032.00              ENDPGM                                                     
        ***************** データの終わり ************************************** 

サブルーチン

SUBR で始まり、ENDSUBR で終わる部分をサブルーチンとし、それを CALLSUB コマンドで呼び出します。

今回は使用していませんが、戻り値の設定と使用ができます。

0014.00              DCL        VAR(&RETURN) TYPE(*INT) LEN(4)                   

0023.00              CALLSUBR   SUBR(SNDMSG) RTNVAL(&RETURN)                     

0027.00              SUBR       SUBR(SNDMSG)                                     
0028.00              SNDPGMMSG  MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +             
0029.00                           MSGDTA(&MESSAGE)                               
0030.00              ENDSUBR    RTNVAL(0)                                       

定義済み変数

"LIBRARY NNN IS XXXXXXXXXX"というテキストが初期値として入っている &MESSAGE という変数について、9桁目から 3桁分を &SEQUENCE という変数として定義しています。

DCL VAR(&SEQUENCE) TYPE(*CHAR) STG(*DEFINED) LEN(3) DEFVAR(&MESSAGE 9)

Integer として定義された &COUNTER 変数は

DCL VAR(&COUNTER) TYPE(*INT) LEN(2)

FOR ループの中でカウントアップされていくのですが、

DOFOR VAR(&COUNTER) FROM(1) TO(250) BY(1)

この &COUNTER 変数を Character タイプとして定義された &SEQUENCE 変数に代入することで &MESSAGE の 9桁からの 3桁分を変えて表示させるようにしています。

CHGVAR VAR(&SEQUENCE) VALUE(&COUNTER)

ライブラリー名も同様にしてしています。

DCL VAR(&MSGLIBN) TYPE(*CHAR) STG(*DEFINED) LEN(10) DEFVAR(&MESSAGE 16)
0003.00              DCL        VAR(&MESSAGE) TYPE(*CHAR) LEN(25) +             
0004.00                           VALUE('LIBRARY NNN IS XXXXXXXXXX')             
0005.00              DCL        VAR(&SEQUENCE) TYPE(*CHAR) STG(*DEFINED) +       
0006.00                           LEN(3) DEFVAR(&MESSAGE 9)                     
0007.00              DCL        VAR(&MSGLIBN) TYPE(*CHAR) STG(*DEFINED) +       
0008.00                           LEN(10) DEFVAR(&MESSAGE 16)                   
0009.00              DCL        VAR(&COUNTER) TYPE(*INT) LEN(2)                 

0016.00              RTVJOBA    USRLIBL(&LIBL)                                   
0017.00              CHGVAR     VAR(&COUNTER) VALUE(0)                           
0018.00                                                                         
0019.00              DOFOR      VAR(&COUNTER) FROM(1) TO(250) BY(1)   
          
0021.00              CHGVAR     VAR(&SEQUENCE) VALUE(&COUNTER)                   
0022.00              CHGVAR     VAR(&MSGLIBN) VALUE(&LIBLNAME)                   
0023.00              CALLSUBR   SUBR(SNDMSG) RTNVAL(&RETURN)                     

0025.00              ENDDO                                                       
0026.00                                                                         
0027.00              SUBR       SUBR(SNDMSG)                                     
0028.00              SNDPGMMSG  MSGID(CPF9898) MSGF(QSYS/QCPFMSG) +             
0029.00                           MSGDTA(&MESSAGE)                               

ポインター

RTVJOBA でユーザー・ライブラリー・リストを検索し、&LIBL 変数に格納します。その &LIBL 変数についてポインターを定義します。タイプは *PTR となります。

DCL VAR(&PTR) TYPE(*PTR) ADDRESS(&LIBL)

ポインターを基底とした 10桁に取り出します。そこに個々のライブラリー名が入っています。

DCL VAR(&LIBLNAME) TYPE(*CHAR) STG(*BASED) LEN(10) BASPTR(&PTR)

ライブラリー名は 10桁あり、あいだにブランクが 1桁あるので 11桁ずつオフセットを移動させます。

CHGVAR VAR(%OFS(&PTR)) VALUE(%OFS(&PTR) + 11)
0009.00              DCL        VAR(&COUNTER) TYPE(*INT) LEN(2)                 
0010.00              DCL        VAR(&LIBL) TYPE(*CHAR) LEN(2750)                 
0011.00              DCL        VAR(&PTR) TYPE(*PTR) ADDRESS(&LIBL)             
0012.00              DCL        VAR(&LIBLNAME) TYPE(*CHAR) STG(*BASED) +         
0013.00                           LEN(10) BASPTR(&PTR)                           

0016.00              RTVJOBA    USRLIBL(&LIBL)                                   
0017.00              CHGVAR     VAR(&COUNTER) VALUE(0)                           
0018.00                                                                         
0019.00              DOFOR      VAR(&COUNTER) FROM(1) TO(250) BY(1)             
0020.00              IF         COND(&LIBLNAME *EQ '          ') THEN(LEAVE)     
0021.00              CHGVAR     VAR(&SEQUENCE) VALUE(&COUNTER)                   
0022.00              CHGVAR     VAR(&MSGLIBN) VALUE(&LIBLNAME)                   
0023.00              CALLSUBR   SUBR(SNDMSG) RTNVAL(&RETURN)                     
0024.00              CHGVAR     VAR(%OFS(&PTR)) VALUE(%OFS(&PTR) + 11)           
0025.00              ENDDO                                                       

CRTBNDCL コマンドで作成しました。

実行結果はこんなかんじになります。

[Top Pageに戻る]

Ads by TOK2