コマンド

44. ELEM キー・ワード

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)) 

がそれを示している。