コマンド

73. コマンドによる近代化手法

「568.プログラム開発の順序と選択」で https://www.as400-net.com/rpg/18327/
で読者の興味を集めたようなのでもう少し詳しく解説いる。
オフィスクアトロの開発手法について特徴的なことを
フォーカスして説明する。

■ コマンドを活用する

受注開発していた時代よりプログラムの指定操作には
コマンドを積極的に活用していた。
_

例えば得意先マスターの一覧表を出力する範囲指定を
するのには

[コマンド: PGM102] http://218.44.135.18/QSYS.LIB/QTRSRC.LIB/QCMDSRC.FILE/PGM102.MBR

                        得意先マスター一覧表  (PGM102)                 
                                                                       
選択項目を入力して,実行キーを押してください。                         
                                                                       
得意先コード  . . . . . . . . .                  から                  
                                  9999           まで                  
出力  . . . . . . . . . . . . .   *PRINT        *, *LPR, *PDF, *PRINT  
                                                                       

[解説]

コマンド : PGM102 を呼び出してこのようにプロンプト表示させるには

?QTROBJ/PGM102

とメニュー項目に記述すればコマンド全体がF4キーを押したときと
同じようにプロンプト表示される。

多くのIBM i開発者はこのような指示画面を作るのにも
DSPFを作ってCLPまたはRPGによって表示しがちであるが
DSPFを使用するには多くの開発工数を必要とするし
保守も大変になる。

■ コマンドを使う利点

指示画面はコマンドにしておけば
DSPFのように画面全体の設計やデザインを行う必要はない。
i5/OS でいつも最適化してバランスよく表示してくれるのである。
_

・画面デザインの必要がない
・24×80 でも 28×132でもOSがデザインを再配置してくれる。
・社内のどの画面も同じバランスで配置することができる。

つまりすべてコマンド表示に統一しておけば
社内の業務画面はどの画面を見ても同じようなバランスで
統一されて表示されるという大変大きなメリットがある。

■ DSPFを使う理由

指示画面をDSPFで使う理由は

・DSPFしか知らないのでそれが使えるから。
・他の方法を知らない。
・他の方法を勉強するのが面倒だから
・コマンドは簡単なことしか使えない。
・コマンドは細かな制御はできないから。

というあまり適切でない理由が大半を占めるが
コマンドの使い方にまだ精通していないからという
理由であればこの機会にコマンドを使うほうが
DSPFを使うよりスマートであり簡単であることを
学習して欲しい。

■ コマンドでも何でもできる

_

コマンドでは細かな制御はできないと思っているのは
誤解である。

先のコマンド画面をもう一度見て欲しい。

                        得意先マスター一覧表  (PGM102)                 
                                                                       
選択項目を入力して,実行キーを押してください。                         
                                                                       
得意先コード  . . . . . . . . .                  から                  
                                  9999           まで                  
出力  . . . . . . . . . . . . .   *PRINT        *, *LPR, *PDF, *PRINT  
                                                                       

[解説]

得意先コードは ____ から 9999 までと初期値が示されている
だけでなく「から」「まで」と値に続く説明が捕捉されている。
これは

0005.00              PARM       KWD(TKEND) TYPE(*CHAR) LEN(4) DFT(9999) + 
0006.00                           CHOICE(*PGM) CHOICEPGM(QTROBJ/PGM106P)  

とコマンド・ソースで示されるように

CHOICEPGM(QTROBJ/PGM106P)

としてプログラム選択:PGM106Pによるものである。
PGM106Pとは

0001.00              PGM        PARM(&CMDPRM1 &RTNVAR)                          
0002.00              DCL        VAR(&CMDPRM1) TYPE(*CHAR) LEN(21)               
0003.00              DCL        VAR(&CMD) TYPE(*CHAR) LEN(10)                   
0004.00              DCL        VAR(&KWD) TYPE(*CHAR) LEN(10)                   
0005.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                   
0006.00              DCL        VAR(&RTNVAR) TYPE(*CHAR) LEN(2000)              
0007.00                                                                         
0008.00              CHGVAR     VAR(&CMD) VALUE(%SST(&CMDPRM1 1 10))            
0009.00              CHGVAR     VAR(&KWD) VALUE(%SST(&CMDPRM1 11 10))           
0010.00              CHGVAR     VAR(&TYPE) VALUE(%SST(&CMDPRM1 21 1))           
0011.00 /*( テキスト )*/                                                        
0012.00              IF         COND(&TYPE *EQ 'C') THEN(DO)                    
0013.00              IF         COND((&KWD *EQ 'HNSFROM   ') *OR (&KWD *EQ +    
0014.00                           'SHFROM    ') *OR (&KWD *EQ 'TKFROM    ') +   
0015.00                           *OR (&KWD *EQ 'SRFROM    ')) THEN(DO)         
0016.00              CHGVAR     VAR(&RTNVAR) VALUE(' から ')                    
0017.00              ENDDO                                                      
0018.00              ELSE       CMD(DO)                                         
0019.00              CHGVAR     VAR(&RTNVAR) VALUE(' まで ')                    
0020.00              ENDDO                                                      
0021.00              RETURN                                                     
0022.00              ENDDO                                                      
0023.00                                                                         
0024.00              ENDPGM 

で示されるようにこのパラメータの名前が TKFROMであれば
「から」を返し、そうでなければ「まで」を返すという
CLPによって制御されている。
例えば &KWDに FROM という文字列が含まれていれば
%SCANで判断して「まで」を返すというように決めておけば
一般化することができる。

これでIBMコマンドのパラメータの後続のテキストを
自由に設定することができることがわかったと思う。