CL

119. CLPでデータ・ベースをキーで検索するには

RPGではデータ・ベースに対してCHAIN命令で
指定したキーやRRNで特定のレコードを取り出すことができる。
それではCLPでもそのような機能はあるのだろうか?

CLPでもデータ・ベースにキーやRRNCHAIN命令のように
指定したレコードを取り出すことができる。

そんなことができるのか?と疑問に思うかも知れないが
実は OVRDBFコマンドにSETLLSEGTのような機能が用意されている。

ここでは特定のレコードに指定したキーで SETLL して READする
プログラムを紹介する。

[キーでSETLL & READ するCLPのサンプル・ソース]

ソースはこちらから

0001.00              PGM                                                        
0002.00 /*-------------------------------------------------------------------*/ 
0003.00 /*   TESTKEYR  :  KEY レコードの検索                                 */ 
0004.00 /*                                                                   */ 
0005.00 /*   2017/05/02  作成                                                */ 
0006.00 /*-------------------------------------------------------------------*/ 
0007.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                  
0008.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                  
0009.00              DCL        VAR(&MSGF) TYPE(*CHAR) LEN(10)                  
0010.00              DCL        VAR(&MSGFLIB) TYPE(*CHAR) LEN(10)               
0011.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)               
0012.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)                   
0013.00              DCL        VAR(&TOPGMQ) TYPE(*CHAR) LEN(10)                
0014.00              DCL        VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) +             
0015.00                           VALUE('*ESCAPE   ')                           
0016.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +             
0017.00                           VALUE(X'000074') /* 2 進数  */                
0018.00              DCL        VAR(&NULL4) TYPE(*CHAR) LEN(4) +                
0019.00                           VALUE(X'00000000')                            
0020.00              DCLF       FILE(QTRFIL/SHOHIN) RCDFMT(*ALL)                
0021.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))         
0022.00                                                                         
0023.00 /*( 環境の取得 )*/                                                      
0024.00              RTVJOBA    TYPE(&TYPE)                                   
0025.00              IF         COND(&TYPE *EQ '0') THEN(DO) /*  バッチ  */   
0026.00              CHGVAR     VAR(&TOPGMQ) VALUE('*SYSOPR   ')              
0027.00              ENDDO      /*  バッチ  */                                
0028.00              ELSE       CMD(DO) /*  対話式  */                        
0029.00              CHGVAR     VAR(&TOPGMQ) VALUE('*TOPGMQ   ')              
0030.00              ENDDO      /*  対話式  */                                
0031.00                                                                       
0032.00 /*( キーのセット )*/                                                  
0033.00              CHGVAR     VAR(&SHCODE) VALUE('NV-CF1    ')              
0034.00              OVRDBF     FILE(SHOHIN) TOFILE(QTRFIL/SHOHIN) +          
0035.00                           POSITION(*KEYAE 1 SHOHINR &SHCODE) +        
0036.00                           SECURE(*YES) OVRSCOPE(*JOB)                 
0037.00              RCVF       RCDFMT(SHOHINR)                               
0038.00              MONMSG     MSGID(CPF0864) EXEC(GOTO CMDLBL(REDEND))      
0039.00              SNDPGMMSG  MSG(' 見つかったキーは SHCODE=' *CAT +        
0040.00                           &SHCODE *CAT ' です。 ') MSGTYPE(*DIAG)     
0041.00              DLTOVR     FILE(SHOHIN) LVL(*JOB)                        
0042.00              RETURN                                                   
0043.00                                                                       
0044.00  REDEND:                                                              
0045.00              DLTOVR     FILE(SHOHIN) LVL(*JOB)                        
0046.00              RETURN                                                   
0047.00                                                                       
0048.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +             
0049.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) +   
0050.00                           MSGFLIB(&MSGFLIB)                             
0051.00              DLTOVR     FILE(SHOHIN) LVL(*JOB)                          
0052.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)                   
0053.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +     
0054.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)             
0055.00              ENDDO                                                      
0056.00              ELSE       CMD(DO)                                         
0057.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +            
0058.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +             
0059.00                           MSGTYPE(&MSGTYPE)                             
0060.00              ENDDO                                                      
0061.00              ENDPGM  


                                                       

[解説]

0032.00 /*( キーのセット )*/                                                  
0033.00              CHGVAR     VAR(&SHCODE) VALUE('NV-CF1    ')              
0034.00              OVRDBF     FILE(SHOHIN) TOFILE(QTRFIL/SHOHIN) +          
0035.00                           POSITION(*KEYAE 1 SHOHINR &SHCODE) +        
0036.00                           SECURE(*YES) OVRSCOPE(*JOB)

が問題の部分でありOVRDBFコマンドでファイル: QTRFIL/SHOHIN のキー: SHCODE
値: &SHCODE (=’NV-CF1′) をPOSITION指定でセットしている。
次に

0037.00              RCVF       RCDFMT(SHOHINR)

でレコードを読み取って読取ったレコードを

0039.00              SNDPGMMSG  MSG(' 見つかったキーは SHCODE=' *CAT +        
0040.00                           &SHCODE *CAT ' です。 ') MSGTYPE(*DIAG)

 

としてメッセージとして出力している。
これを実行してみると


> CALL TEST.COM/TESTKEYR                   
   見つかったキーは SHCODE=NV-CF1     です 

と表示されて

0033.00              CHGVAR     VAR(&SHCODE) VALUE('NV-CF1    ')

 

でセットしたレコードが読み込まれたことがわかる。
もちろん RRN を指定することもできる。

このようにCLPでもSETLL & READ できることがわかるとコマンドからの入力値の
妥当性検査もできることがわかる。
例えば


                           品種別在庫一覧表  (CMD001)             
                                                                  
 選択項目を入力して,実行キーを押してください。                   
                                                                  
 品種コード  . . . . . . . . . .                  文字値          
 出力  . . . . . . . . . . . . .   *PRINT        *PRINT, *, *BOTH 
                                                                  

のようなコマンド入力を作成したとする。
今まではこの入力された「品種コード」が正しいかどうかは
RPGなどでチェックするしかなかったのだが
今回、紹介したCLPによるSETLL & READの手法を使うとCLPだけで
妥当性検査を行うことができる。
このことはCLPの利用を大いに広げてくれる。
自社の適用業務への応用もぜひ検討してはどうだろうか?