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))
がそれを示している。
