CL

121. データ・ベースをCLPで保守する

「119. CLPでデータ・ベースをキーで検索する」と
「118. CLPでデータ・ベースを更新する」を組み合わせて
応用するとCLPだけでデータ・ベースを保守(メンテナンス)する
プログラムを作成することができる。


保守するファイルは次のような簡単な品種マスター(HINSHU)である。

0001.00      A**********************************************              
0002.00      A*   HINSHU  :  品種マスターファイル          *              
0003.00      A**********************************************              
0004.00      A                                      UNIQUE                
0005.00      A          R @HINSHU                                         
0006.00      A*                                                           
0007.00      A            HNSCOD         4A         COLHDG(' 品種コード ')
0008.00      A            HNSNAM        14O         COLHDG(' 品種名 ')    
0009.00      A                                      TEXT(' 漢字 ')        
0010.00      A          K HNSCOD                                          

品種マスターの保守のためにDSPFを次のように作成した。
初期画面が DSPHEADという名前で明細画面が DSPDTAという名前のレコードである。

0001.00      A                                      DSPSIZ(24 80 *DS3)                
0002.00      A                                      MSGLOC(24)                        
0003.00      A                                      PRINT                             
0004.00      A          R DSPHEAD                                                     
0005.00      A                                      TEXT(' 初期画面 ')                
0006.00      A*            11:59:33    QSECOFR     REL-R06M00  5714-UT1               
0007.00      A                                      CF03(03 ' 終了 ')                 
0008.00      A                                      BLINK                             
0009.00      A                                      INZRCD                            
0010.00      A                                  1 27G' 品種マスターの登録 '           
0011.00      A                                      DSPATR(HI)                        
0012.00      A                                  2  2' 品種コード '                    
0013.00      A            HNSCOD         4A  B    +1TEXT(' 品種コード ')              
0014.00      A                                 11 13' 登録または変更するコードを +    
0015.00      A                                       入れて実行キーを押してください ' 
0016.00      A                                      DSPATR(HI)                        
0017.00      A                                 23  2'F3= 終了 '                       
0018.00      A                                      COLOR(BLU)                        
0019.00      A          R DSPDTA                                                      
0020.00      A*%%TS  SD  19940302  221529  QTR         REL-V2R2M0  5738-PW1           
0021.00      A                                      TEXT(' 明細画面 01')              
0022.00      A                                      CF03(03 ' 終了 ')                 
0023.00      A                                      CF10(10 ' 更新 ')                 
0024.00      A  13                                  CF23(23 ' 削除 ')      
0025.00      A                                      CF12(12 ' 前画面 ')    
0026.00      A                                      ROLLUP(07)             
0027.00      A                                      ROLLDOWN(08)           
0028.00      A                                      SETOF(99)              
0029.00      A                                      BLINK                  
0030.00      A                                  1 27G' 品種マスターの登録 '
0031.00      A                                      DSPATR(HI)             
0032.00      A            DSPMSG         6A  O  1 72TEXT(' 維持モード ')   
0033.00      A                                      DSPATR(HI)             
0034.00      A                                  2  2' 品種コード '         
0035.00      A            HNSCOD         4A  O  2 15TEXT(' 品種コード ')   
0036.00      A                                  5 10' 品種名 '             
0037.00      A            HNSNAM        14O  B  5 24TEXT(' 品種名 ')       
0038.00      A                                 23  2'F3= 終了 '            
0039.00      A                                      COLOR(BLU)             
0040.00      A                                 23 35'F10= 更新 '           
0041.00      A                                      COLOR(BLU)             
0042.00      A  13                             23 53'F23= 削除 '           
0043.00      A                                      COLOR(BLU)             
0044.00      A                                 23 69'F12= 前画面 '         
0045.00      A                                      COLOR(BLU)             

実行時の様子は次のとおりである。

                         品種マスターの登録                          
 品種コード  0003                                                   
                                                                     
                                                              
                                                                     
            登録または変更するコードを入れて実行キーを押してください  



F3= 終了

品種コード 0003と入力して実行キーを押すと

                         品種マスターの登録                            変更  
 品種コード  0003                                                            
                                                                             
                                                                             
         品種名        コンボ                                                
                                                                             
                                                                             

F3= 終了                         F10= 更新         F23= 削除       F12= 前画面

と表示される。
品種名を変更してF10キーを押すと更新されるし
F23キーを押すとレコードを削除することができる。
もちろん新しいコードを入力してF10キーを押すとレコードを
追加することもできる。

RPGCOBOLを書くのがまだ苦手な人でもCLPを学習すれば
簡単にデータ・ベースの保守の適用業務をこのように作成することができる。

RPGCOBOLの開発に長年携わってきた人もCLPでデータ・ベースを更新できるのは
初めてであると思う。
それではデータ・ベース QTRFIL/HINSHUを更新するCLPを紹介しよう。

[データ・ベースを更新するCLPサンプル: SQL001CL ]

ソースはこちらから

0001.00              PGM                                                         
0002.00 /*-------------------------------------------------------------------*/  
0003.00 /*   SQL001CL  :  品種マスターの登録                                 */  
0004.00 /*                                                                   */  
0005.00 /*   2020/02/29  作成                                                */  
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(QTROBJ/SQL001FM) OPNID(SQL001FM)            
0021.00              DCL        VAR(&HNSKEY) TYPE(*CHAR) LEN(4)                  
0022.00              DCLF       FILE(QTRFIL/HINSHU) OPNID(HINSHU)                
0023.00              DCL        VAR(&STR) TYPE(*CHAR) LEN(1024)                  
0024.00              DCL        VAR(") TYPE(*CHAR) LEN(1) VALUE(X'7D')    
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  START:      SNDRCVF    RCDFMT(DSPHEAD) OPNID(SQL001FM)               
0038.00   /*( CF03 )- 終わり */                                               
0039.00              IF         COND(&SQL001FM_IN03 *EQ '1') THEN(DO)         
0040.00              RETURN                                                   
0041.00              ENDDO                                                    
0042.00   /*( 実行キー )*/                                                    
0043.00              CHGVAR     VAR(&HNSKEY) VALUE(&SQL001FM_HNSCOD)          
0044.00              OVRDBF     FILE(HINSHU) TOFILE(QTRFIL/HINSHU) +          
0045.00                           MBR(*FIRST) POSITION(*KEYAE 1 @HINSHU +     
0046.00                           &HNSKEY)                                    
0047.00              MONMSG     MSGID(CPF4137) EXEC(DO)                       
0048.00              CHGVAR     VAR(&SQL001FM_HNSNAM) VALUE(' ')            
0049.00              GOTO       REDEND                                      
0050.00              ENDDO                                                  
0051.00              RCVF       OPNID(HINSHU)                               
0052.00              MONMSG     MSGID(CPF0864) EXEC(DO)                     
0053.00              CHGVAR     VAR(&SQL001FM_DSPMSG) VALUE(' 入力 ')       
0054.00              CHGVAR     VAR(&SQL001FM_HNSNAM) VALUE(' ')            
0055.00              CHGVAR     VAR(&SQL001FM_IN13) VALUE('0')              
0056.00              GOTO       REDEND                                      
0057.00              ENDDO                                                  
0058.00              IF         COND(&HINSHU_HNSCOD *EQ &HNSKEY) THEN(DO)   
0059.00              CHGVAR     VAR(&SQL001FM_DSPMSG) VALUE(' 変更 ')       
0060.00              CHGVAR     VAR(&SQL001FM_HNSNAM) VALUE(&HINSHU_HNSNAM) 
0061.00              CHGVAR     VAR(&SQL001FM_IN13) VALUE('1')              
0062.00              ENDDO                                                  
0063.00              ELSE       CMD(DO)                                     
0064.00              CHGVAR     VAR(&SQL001FM_DSPMSG) VALUE(' 入力 ')       
0065.00              CHGVAR     VAR(&SQL001FM_HNSNAM) VALUE(' ')            
0066.00              CHGVAR     VAR(&SQL001FM_IN13) VALUE('0')              
0067.00              ENDDO                                                  
0068.00 REDEND:                                                             
0069.00 /*( 明細画面の表示 )*/                                              
0070.00  DSPLY:      SNDRCVF    RCDFMT(DSPDTA) OPNID(SQL001FM)              
0071.00   /*( CF03 )- 終わり */                                             
0072.00              IF         COND(&SQL001FM_IN03 *EQ '1') THEN(DO)         
0073.00              RETURN                                                   
0074.00              ENDDO                                                    
0075.00   /*( CF12 )- 取消し */                                               
0076.00              IF         COND(&SQL001FM_IN12 *EQ '1') THEN(DO)         
0077.00              TFRCTL     PGM(QTROBJ/SQL001CL)                          
0078.00              ENDDO                                                    
0079.00   /*( CF10 )- 更新 */                                                 
0080.00              IF         COND(&SQL001FM_IN10 *EQ '1') THEN(DO)         
0081.00              IF         COND(&SQL001FM_IN13 *EQ '1') THEN(DO) /* +    
0082.00                            変更  */                                   
0083.00              CHGVAR     VAR(&STR) VALUE('UPDATE QTRFIL/HINSHU SET +   
0084.00                           HNSNAM = ' *CAT " *CAT +                
0085.00                           &SQL001FM_HNSNAM *TCAT " *CAT ' +       
0086.00                           WHERE HNSCOD = ' *CAT " *CAT +          
0087.00                           &SQL001FM_HNSCOD *CAT ")                
0088.00              RUNSQL     SQL(&STR) COMMIT(*NONE)                       
0089.00              CHGVAR     VAR(&MSG) VALUE('1 レコードを更新しました。 ')
0090.00              SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                      
0091.00              ENDDO      /*  変更  */                                  
0092.00              ELSE       CMD(DO) /*  入力  */                          
0093.00              CHGVAR     VAR(&STR) VALUE('INSERT INTO QTRFIL/HINSHU +  
0094.00                           (HNSCOD, HNSNAM) VALUES(' *CAT " +      
0095.00                           *CAT &SQL001FM_HNSCOD *CAT " *CAT +     
0096.00                           ', ' *CAT " *CAT &SQL001FM_HNSNAM +     
0097.00                           *CAT " *CAT ')')                        
0098.00              RUNSQL     SQL(&STR) COMMIT(*NONE)                       
0099.00              CHGVAR     VAR(&MSG) VALUE('1 レコードを追加しました。 ')
0100.00              SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                      
0101.00              ENDDO      /*  入力  */                                  
0102.00              GOTO       START                                         
0103.00              ENDDO                                                    
0104.00   /*( CF23 )- 削除 */                                                 
0105.00              IF         COND(&SQL001FM_IN23 *EQ '1') THEN(DO)         
0106.00              CHGVAR     VAR(&STR) VALUE('DELETE FROM QTRFIL/HINSHU +  
0107.00                           WHERE HNSCOD = ' *CAT " *CAT +          
0108.00                           &SQL001FM_HNSCOD *CAT ")                
0109.00              RUNSQL     SQL(&STR) COMMIT(*NONE)                       
0110.00              CHGVAR     VAR(&MSG) VALUE('1 レコードを削除しました。 ')
0111.00              SNDPGMMSG  MSG(&MSG) MSGTYPE(*DIAG)                      
0112.00              ENDDO                                                    
0113.00   /*( 実行キー )*/                                                    
0114.00              GOTO       DSPLY                                         
0115.00              RETURN                                                   
0116.00                                                                       
0117.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) +           
0118.00                           MSGDTA(&MSGDTA) MSGID(&MSGID) MSGF(&MSGF) + 
0119.00                           MSGFLIB(&MSGFLIB)                           
0120.00  SNDMSG:     IF         COND(&MSGID *EQ ' ') THEN(DO)              
0121.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +
0122.00                           TOMSGQ(&TOPGMQ) MSGTYPE(&MSGTYPE)        
0123.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                
0124.00              ENDDO                                                 
0125.00              ELSE       CMD(DO)                                    
0126.00              IF         COND(&MSGID *EQ 'CPF4137') THEN(DO)        
0127.00              CHGVAR     VAR(&SQL001FM_DSPMSG) VALUE(' 入力 ')      
0128.00              CHGVAR     VAR(&SQL001FM_HNSNAM) VALUE(' ')           
0129.00              CHGVAR     VAR(&SQL001FM_IN13) VALUE('0')             
0130.00              GOTO       REDEND                                     
0131.00              ENDDO                                                 
0132.00              SNDPGMMSG  MSGID(&MSGID) MSGF(&MSGFLIB/&MSGF) +       
0133.00                           MSGDTA(&MSGDTA) TOMSGQ(&TOPGMQ) +        
0134.00                           MSGTYPE(&MSGTYPE)                        
0135.00              MONMSG     MSGID(CPF2400) EXEC(RETURN)                
0136.00              ENDDO                                                 
0137.00              ENDPGM  


                                                

[解説]

最初にこのCLP: SQL001CLは2つのファイルを参照している。

0020.00              DCLF       FILE(QTROBJ/SQL001FM) OPNID(SQL001FM)
  :
0022.00              DCLF       FILE(QTRFIL/HINSHU) OPNID(HINSHU)

の2つである。
CLPでもひとつのCLPの中で2つ以上の DCLF を宣言できるようになったが
複数のDCLFを宣言するときは識別コード OPNID を指定しなければならない。

そしてそのとき各ファイルのフィールド名はファイル名_フィールド名の形式で
命名される。
例えば画面ファイル : SQL001FM のフィールド: HNSCOD の名前は

SQL001FM_HNSCOD

として扱われる。

さて OVRDBFを使って SETLL

0043.00              CHGVAR     VAR(&HNSKEY) VALUE(&SQL001FM_HNSCOD)          
0044.00              OVRDBF     FILE(HINSHU) TOFILE(QTRFIL/HINSHU) +          
0045.00                           MBR(*FIRST) POSITION(*KEYAE 1 @HINSHU +     
0046.00                           &HNSKEY)

として行って指定した初期画面のキー: 品種コードのレコードがあるかどうかを
調べている。

現存するファイルより大きな位置のキーが指定されたときは CPF4137のエラーになるので
それも予想して対応している。
キーが存在していれば表示モードを「変更」にセットし、存在していなければ
表示モードを「入力」にセットしている。

F10キーやF23キーが押されたときにはSQL文を次のように作成している。

[入力]

INSERT INTO QTRFIL/HISHU (HNSCOD, HNSNAM) VALUES(&HNSCOD, &HNSNAM)

[変更]

UPDATE QTRFIL/HINSHU SET HNSNAM = ‘&HNSNAM’ WHERE HNSCOD = ‘&HNSCOD’

[削除]

DELETE FROM QTRFIL/HINSHU WHERE HNSCOD = ‘&HNSCOD’

これらのSQL文を

  RUNSQL     SQL(&STR) COMMIT(*NONE)

として RUNSQLを使ってデータ・ベースを更新している。

このようにCLPだけでデータ・ベースを保守できることがわかった。

最後にまだ OS Ver6.1 以下を使っているユーザーでは RUNSQLが導入されていないので
使えないが心配はご無用。
既に Ver6.1以下でも動作する RUNSQLコマンドを開発しているので
それを後日、このサイトのToolsで紹介する。

Toolsはメンバー登録が必要なのでメンバー登録はお早めにどうぞ。