QUALキー・ワードに続いて ELEM キー・ワードについて説明する。
PARMパラメータを構成するのは
QUALキー・ワード
ELEM キー・ワード
の二つがある。
QUALキー・ワードは PARMパラメータを単純に分割しただけのものなので
PARM の長さも QUAL キー・ワードで定義されている長さを単純に合計しただけのもの
である。
さて ELEMキー・ワードとは文字通り Element つまり要素を示すキー・ワードである。
QUAL とのちがいを理解するためにもう一度 QUAL の画面を見てみよう。
QUAL のテスト (TESTQAL) 選択項目を入力して,実行キーを押してください。 ソース・ファイル . . . . . . . QRPGLESRC 名前 , *PRV ライブラリー . . . . . . . . QTRSRC 名前 , *LIBL, *CURLIB, *PRV ソース・メンバー . . . . . . . PGM201 名前 , *PRV
次にこれから紹介する ELEM による記述を見てみよう。
ELEM のテスト (TESTELEM) 選択項目を入力して,実行キーを押してください。 ログイン情報 : ユーザー . . . . . . . . . . > quattro パスワード . . . . . . . . . > qtr1183 ワークグループ . . . . . . . WORKGROUP
QUALの表示では「ソース・ファイル」と「ライブラリー」の親子関係だけを
示していたのに対して ELEM では
「ユーザー」, 「パスワード」と「ワークグループ」をまとめて
「ログイン情報」としていわば家族全体の名前を宣言している。
このようにライブラリー付属の親子関係ではなく複数の項目をまとめて「ログイン情報」として
代表して表示したい場合は ELEMによって記述するとわかりやすいものとなる。
また QUALでは変数は *NAME だけに限られていたのだが ELEM では *CHARも定義することができる。
ただし ELEM を使った場合は受け取りプログラムの処理は QUALのときのように
単純にはいかない。
[ ELEM で記述したコマンド: TESTELEM ]
0001.00 CMD PROMPT('ELEM のテスト ') 0002.00 PARM KWD(LOGIN) TYPE(LOGIN) + 0003.00 PROMPT(' ログイン情報 ') 0004.00 LOGIN: ELEM TYPE(*CHAR) LEN(32) MIN(1) CASE(*MIXED) + 0005.00 PROMPT(' ユーザー ') 0006.00 ELEM TYPE(*CHAR) LEN(32) MIN(1) CASE(*MIXED) + 0007.00 PROMPT(' パスワード ') 0008.00 ELEM TYPE(*CHAR) LEN(32) DFT(WORKGROUP) + 0009.00 CASE(*MIXED) PROMPT(' ワークグループ ')
[解説]
パラメータ LOGIN を3つの ELEM で構成している。
0002.00 PARM KWD(LOGIN) TYPE(LOGIN) + 0003.00 PROMPT(' ログイン情報 ')
の内容は LOGIN で次のように定義されている。
0004.00 LOGIN: ELEM TYPE(*CHAR) LEN(32) MIN(1) CASE(*MIXED) + 0005.00 PROMPT(' ユーザー ') 0006.00 ELEM TYPE(*CHAR) LEN(32) MIN(1) CASE(*MIXED) + 0007.00 PROMPT(' パスワード ') 0008.00 ELEM TYPE(*CHAR) LEN(32) DFT(WORKGROUP) + 0009.00 CASE(*MIXED) PROMPT(' ワークグループ ')
ELEM のときは違って3つのパスワードは *CHAR として定義されている。
[ ELEMを受取るCLP: TESTELEMCL ]
0001.00 PGM PARM(&LOGININFO) 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* TESTELEMCL: ELEM のテスト */ 0004.00 /* */ 0005.00 /* 2018/02/01 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&LOGININFO) TYPE(*CHAR) LEN(98) 0008.00 DCL VAR(&BIN2) TYPE(*CHAR) LEN(2) 0009.00 DCL VAR(&USER) TYPE(*CHAR) LEN(32) 0010.00 DCL VAR(&PASSWRD) TYPE(*CHAR) LEN(32) 0011.00 DCL VAR(&WRKGRP) TYPE(*CHAR) LEN(32) 0012.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0013.00 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) 0014.00 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) 0015.00 DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) 0016.00 DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) 0017.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0018.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0019.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0020.00 VALUE('*ESCAPE ') 0021.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(116) + 0022.00 VALUE(X'000074') /* 2 進数 */ 0023.00 DCL VAR(&NULL4) TYPE(*CHAR) LEN(4) + 0024.00 VALUE(X'00000000') 0025.00 MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) 0026.00 0027.00 /*( 環境の取得 )*/ 0028.00 RTVJOBA TYPE(&TYPE) 0029.00 IF COND(&TYPE *EQ '0') THEN(DO) /* バッチ */ 0030.00 CHGVAR VAR(&TOPGMQ) VALUE('*SYSOPR ') 0031.00 ENDDO /* バッチ */ 0032.00 ELSE CMD(DO) /* 対話式 */ 0033.00 CHGVAR VAR(&TOPGMQ) VALUE('*TOPGMQ ') 0034.00 ENDDO /* 対話式 */ 0035.00 0036.00 /*( パラメータの取得 )*/ 0037.00 CHGVAR VAR(&BIN2) VALUE(%SST(&LOGININFO 1 2)) 0038.00 CHGVAR VAR(&USER) VALUE(%SST(&LOGININFO 3 32)) 0039.00 CHGVAR VAR(&PASSWRD) VALUE(%SST(&LOGININFO 35 32)) 0040.00 CHGVAR VAR(&WRKGRP) VALUE(%SST(&LOGININFO 67 32)) 0041.00 SNDPGMMSG MSG('USER=' *CAT &USER) MSGTYPE(*DIAG) 0042.00 SNDPGMMSG MSG('PASSWRD=' *CAT &PASSWRD) MSGTYPE(*DIAG) 0043.00 SNDPGMMSG MSG('WRKGRP=' *CAT &WRKGRP) MSGTYPE(*DIAG) 0044.00 RETURN 0045.00 0046.00 APIERR: 0047.00 CHGVAR VAR(&MSGID) VALUE(%SST(&APIERR 9 7)) 0048.00 CHGVAR VAR(&MSGDTA) VALUE(%SST(&APIERR 17 100)) 0049.00 CHGVAR VAR(&MSGF) VALUE('QCPFMSG ') 0050.00 CHGVAR VAR(&MSGFLIB) VALUE('QSYS ') 0051.00 GOTO SNDMSG 0052.00 0053.00 ERROR: RCVMSG MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) + 0054.00 MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 0055.00 MSGFLIB(&MSGFLIB) 0056.00 SNDMSG: IF COND(&MSGID *EQ ' ') THEN(DO) 0057.00 SNDPGMMSG MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) + 0058.00 TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE) 0059.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0060.00 ENDDO 0061.00 ELSE CMD(DO) 0062.00 SNDPGMMSG MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) + 0063.00 MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) + 0064.00 MSGTYPE(&MSGTYPE) 0065.00 MONMSG MSGID(CPF2400) EXEC(RETURN) 0066.00 ENDDO 0067.00 ENDPGM
[解説]
QUALの場合とちがって ELEMの受取りの場合は先頭に 2バイトの長さや項目数の部分が
付加されることである。
変数 &LOGININFO は 32バイト x 3 + 2= 98バイトとして定義されている。
追加した 2バイトは先頭に 2バイトも個数を示す長さが入ってくるからである。
0037.00 CHGVAR VAR(&BIN2) VALUE(%SST(&LOGININFO 1 2))
で &BIN2 には 3という値が入っている。
従って各変数の開始位置は 2バイトずつ後ろから取り出さねばならない。
0038.00 CHGVAR VAR(&USER) VALUE(%SST(&LOGININFO 3 32)) 0039.00 CHGVAR VAR(&PASSWRD) VALUE(%SST(&LOGININFO 35 32)) 0040.00 CHGVAR VAR(&WRKGRP) VALUE(%SST(&LOGININFO 67 32))
がそれを示している。