コマンド

57. 超絶技巧を支えるコマンドAPI: QCDRCMDD

AutoWebの最新技術「拡張HTML」ではIBMユーティリティと
同じコマンドの機能を自前で作り出している。
例えばWRKACTJOBであれば次のように同じ名前で
WRKACTJOBというコマンドをHTMLインターフェースとして
作り上げている。

ところでこの画面には

2= 変更   3= 保留     4= 終了   5= 処理   6= 解放   7=メッセージ の表示
8=スプール・ファイル の処理   13= 切断 ...  

のように様々なオプションも用意されている。
本来はこれらのひとひとつをまたHTML + CGI として開発していく必要がある。
それらをすべて開発していたのでは莫大な開発工数がかかるのと同時に
バグもまた発生する可能性が増えてくるし第一に長い開発期間を必要としてしまう。
 
そこで合理的にこれらのオプション機能を開発する方法を調査したところ

2= 変更 = CHGJOB
3= 保留 = HLDJOB
4= 終了 = ENDJOB
:

のようにすべてのオプションはコマンドとして用意されていることが
わかった。
であれば

・任意のコマンドを表示できるAPI
・任意のコマンドを実行できるAPI

のふたつが揃えば各オプションをひとつずつ手動が開発する必要が
ないと言える。

またこのうち後者の「任意のコマンドの実行」というのは
読者もよく知る QCMDEXC や以前にも紹介したsystem関数を使えば
実現可能であることがわかる。
となれば前者の「任意のコマンドの表示」を実行できる機能が
求められる。
そこで調査したところ i5/OS Ver5.1で次のようなAPIが公開されていることが
わかった。

API: QCDRCMDD : 任意のコマンドの機能をXMLとして表現するAPI

である。
このAPIはどのようなコマンドもXMLの形として表記して
面白いのはXMLをバッファーとして戻すかまたは結果のXMLを
指定したIFSのストリームにも書き込んでくれる機能がある。
従ってXMLをJavaScriptでHTMLに変換すれば
求める「任意のコマンドをHTML上で表記する」つまり
前述のすべてのオプションを手動で開発するのではなく
動的に生成させることが可能となる。

この方法で何ヶ月もかかるような莫大な開発工数を節減して
わずか数日でしかも高品質での製品の開発が可能になったのである。

それではAPI: QCDRCMDD の使用方法を紹介してみよう。

[ API: QCDRCMDD の使用サンプル・ソース ]

ソースはこちらから

0001.00              PGM                                                       
0002.00              DCL        VAR(&CMD) TYPE(*CHAR) LEN(20) +                
0003.00                           VALUE('DSPFL     QUATTRO   ')                
0004.00              DCL        VAR(&DESTINFO) TYPE(*CHAR) LEN(64)             
0005.00              DCL        VAR(&DESTFMT) TYPE(*CHAR) LEN(8) +             
0006.00                           VALUE('DEST0200')                            
0007.00              DCL        VAR(&RCVVAR) TYPE(*CHAR) LEN(1)                
0008.00              DCL        VAR(&RCVFMT) TYPE(*CHAR) LEN(8) +              
0009.00                           VALUE('CMDD0100')                            
0010.00              DCL        VAR(&ERROR) TYPE(*CHAR) LEN(16) +              
0011.00                           VALUE(X'00000000')                           
0012.00              DCL        VAR(&NULL2) TYPE(*CHAR) LEN(2) VALUE(X'0000')  
0013.00              DCL        VAR(&NULL3) TYPE(*CHAR) LEN(3) VALUE(X'000000')
0014.00              DCL        VAR(&NULL10) TYPE(*CHAR) LEN(10) +             
0015.00                           VALUE(X'00000000000000000000')               
0016.00                                                                        
0017.00              CHGVAR     VAR(%BIN(&DESTINFO 1 4)) VALUE(0) /* CCSID */  
0018.00              CHGVAR     VAR(%SST(&DESTINFO 5 2)) VALUE(&NULL2) /* +    
0019.00                           COUNTRY */                                   
0020.00              CHGVAR     VAR(%SST(&DESTINFO 7 3)) VALUE(&NULL3) /* +    
0021.00                           LANGUAGE */                                  
0022.00              CHGVAR     VAR(%SST(&DESTINFO 10 3)) VALUE(&NULL3) /* +   
0023.00                           RESERVED */                                  
0024.00              CHGVAR     VAR(%BIN(&DESTINFO 13 4)) VALUE(0) /* PATH +   
0025.00                           TYPE */                                      
0026.00              CHGVAR     VAR(%BIN(&DESTINFO 17 4)) VALUE(16) /* PATH +  
0027.00                           NAME LEN */                                  
0028.00              CHGVAR     VAR(%SST(&DESTINFO 21 2)) VALUE('/') /* +      
0029.00                           DELIMINATOER */                              
0030.00              CHGVAR     VAR(%SST(&DESTINFO 23 10)) VALUE(&NULL10) /* + 
0031.00                           RESERVED */                                  
0032.00              CHGVAR     VAR(%SST(&DESTINFO 33 32)) +                   
0033.00                           VALUE('/A001/GENDDL.XML')                    
0034.00                                                                        
0035.00              CALL       PGM(QCDRCMDD) PARM(&CMD &DESTINFO &DESTFMT +   
0036.00                           &RCVVAR &RCVFMT &ERROR)                      
0037.00              ENDPGM     


                                                

[解説]

この例では

0002.00              DCL        VAR(&CMD) TYPE(*CHAR) LEN(20) +                
0003.00                           VALUE('DSPFL     QUATTRO   ')

のようにコマンド: QUATTRO/DSPFL の記述をXMLで取得するようにしている。
出力様式が

0005.00              DCL        VAR(&DESTFMT) TYPE(*CHAR) LEN(8) +             
0006.00                           VALUE('DEST0200')

のように DEST0200 として定義されているので出力は指定したIFSに出力される。
DEST0100 を指定した場合は出力は &RCVVAR に戻る。

出力するIFSファイルは

0032.00              CHGVAR     VAR(%SST(&DESTINFO 33 32)) +                   
0033.00                           VALUE('/A001/GENDDL.XML')

として16文字で定義されているので
結果のXMLは

のような出力となる。
このXMLをASCIIまたはUTF-8に変換したクライアント側に送信すれば
ブラウザ上に

                     データ・ベースの表示/更新  (DSPFL)       
                                                               
選択項目を入力して,実行キーを押してください。                 
                                                               
ファイル  . . . . . . . . . . .                  名前          
  ライブラリー  . . . . . . . .     *LIBL        名前 , *LIBL  
メンバー  . . . . . . . . . . .   *FIRST         名前 , *FIRST 
                                                               

のようなコマンド入力が目麺を表示することができるようになる。