RPGではデータ・ベースに対してCHAIN命令で
指定したキーやRRNで特定のレコードを取り出すことができる。
それではCLPでもそのような機能はあるのだろうか?
CLPでもデータ・ベースにキーやRRNでCHAIN命令のように
指定したレコードを取り出すことができる。
そんなことができるのか?と疑問に思うかも知れないが
実は OVRDBFコマンドにSETLLやSEGTのような機能が用意されている。
ここでは特定のレコードに指定したキーで 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の利用を大いに広げてくれる。
自社の適用業務への応用もぜひ検討してはどうだろうか?