「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キーを押すとレコードを
追加することもできる。
RPGやCOBOLを書くのがまだ苦手な人でもCLPを学習すれば
簡単にデータ・ベースの保守の適用業務をこのように作成することができる。
RPGやCOBOLの開発に長年携わってきた人も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はメンバー登録が必要なのでメンバー登録はお早めにどうぞ。