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の利用を大いに広げてくれる。
自社の適用業務への応用もぜひ検討してはどうだろうか?
