CLP でデータ・ベースを読むには
DCLF FILE(TESTFIL/BANKM)
でデータ・ベースを定義して
RCVF RCDFMT(@BANKM)
によってレコードを読み取ることができる。
ここでは特殊な処理については触れないが、CLP であっても、キー順やRRN順や特定のキーや特定のRRNを指定して読み取ることができるので、このあたりはRPGやCOBOL による読み取りと変ることはない。
PNLGRPにSFLレコードを追加するには QUIADDLE API を使用する。
以下に CLPソースの全容を紹介する。
0001.00 PGM
0002.00 /*---------------------------------------------------------*/
0003.00 /* BNK002CL : パネル表示 */
0004.00 /*---------------------------------------------------------*/
0005.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(80)
0006.00 DCL VAR(&HANDLE) TYPE(*CHAR) LEN(8) /* +
0007.00 摘要業務ハンドル */
0008.00 DCL VAR(&PNLGRPLIB) TYPE(*CHAR) LEN(20) +
0009.00 VALUE('BNK002 TESTOBJ ')
0010.00 DCL VAR(&AREA) TYPE(*CHAR) LEN(4) +
0011.00 VALUE(X'FFFFFFFF') /* 2 進数 */
0012.00 DCL VAR(&DEC08) TYPE(*DEC) LEN(8 0)
0013.00 DCL VAR(&EXITPG) TYPE(*CHAR) LEN(4) +
0014.00 VALUE(X'00000000') /* 2 進数 */
0015.00 DCL VAR(&FNCTON) TYPE(*CHAR) LEN(4) /* 2 進数 */
0016.00 DCL VAR(&PANEL) TYPE(*CHAR) LEN(10) +
0017.00 VALUE('SFLDSP ')
0018.00 DCL VAR(&AGAIN) TYPE(*CHAR) LEN(1) VALUE(Y)
0019.00 DCL VAR(&APIERR) TYPE(*CHAR) LEN(4) +
0020.00 VALUE(X'00000000') /* 2 進数 */
0021.00 DCL VAR(&USRTSK) TYPE(*CHAR) LEN(1) VALUE(N)
0022.00 DCL VAR(&STACK) TYPE(*CHAR) LEN(4) +
0023.00 VALUE(X'00000000') /* 2 進数 */
0024.00 DCL VAR(&UIMMSG) TYPE(*CHAR) LEN(10) VALUE(*CALLER
0025.00 DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4)
0026.00 DCL VAR(&CSROPT) TYPE(*CHAR) LEN(1) VALUE(D)
0027.00 DCL VAR(&LASLST) TYPE(*CHAR) LEN(4) VALUE(NONE)
0028.00 DCL VAR(&ERRLST) TYPE(*CHAR) LEN(4)
0029.00 DCL VAR(&WAITTIME) TYPE(*CHAR) LEN(4) +
0030.00 VALUE(X'FFFFFFFF') /* 2 進数 */
0031.00 DCL VAR(&CF03) TYPE(*CHAR) LEN(4) +
0032.00 VALUE(X'00000003') /* 2 進数 */
0033.00 DCL VAR(&ENTER) TYPE(*CHAR) LEN(4) +
0034.00 VALUE(X'0000001B') /* 2 進数 */
0035.00 DCL VAR(&DSPDTA) TYPE(*CHAR) LEN(1024)
0036.00 DCL VAR(&DTALEN) TYPE(*CHAR) LEN(4) /* 2 進数 */
0037.00 DCLF FILE(TESTFIL/BANKM)
0038.00 DCL VAR(&NO) TYPE(*CHAR) LEN(4)
0039.00 DCL VAR(&N) TYPE(*DEC) LEN(4 0) VALUE(1)
0040.00 DCL VAR(&LHANDL) TYPE(*CHAR) LEN(4)
0041.00 /* MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR)) */
0042.00
0043.00 /*( QUIOPNDA : パネル・グループのオープン )*/
0044.00 CALL PGM(QUIOPNDA) PARM(&HANDLE &PNLGRPLIB &AREA +
0045.00 &EXITPG 'N' &APIERR)
0046.00 /*(BANKM: 銀行マスターの読み取り )*/
0047.00 READ: RCVF RCDFMT(@BANKM)
0048.00 MONMSG MSGID(CPF0800) EXEC(GOTO CMDLBL(REDEND))
0049.00 CHGVAR VAR(&NO) VALUE(&N)
0050.00 CHGVAR VAR(&DSPDTA) VALUE(&BKBKCD *CAT &BKNMKJ *CAT +
0051.00 &BKKBN *CAT &NO)
0052.00 CHGVAR VAR(%BIN(&DTALEN)) VALUE(26)
0053.00 CALL PGM(QUIADDLE) PARM(&HANDLE &DSPDTA &DTALEN +
0054.00 'SFLRCD ' 'SFL ' 'NEXT' &LHANDL +
0055.00 &APIERR)
0056.00 CHGVAR VAR(&N) VALUE(&N + 1)
0057.00 GOTO READ
0058.00 REDEND:
0059.00 /*( QUIDSPP : パネル表示 )*/
0060.00 DSPLY: CALL PGM(QUIDSPP) PARM(&HANDLE &FNCTON &PANEL +
0061.00 &AGAIN &APIERR &USRTSK &STACK &UIMMSG +
0062.00 &MSGKEY &CSROPT &LASLST &ERRLST &WAITTIME)
0063.00 MONMSG MSGID(CPF6A95)
0064.00 /*( CF03 )= 終了 */
0065.00 IF COND(&FNCTON *EQ &CF03) THEN(DO)
0066.00 /*( QUICLOA : パネル・グループのクローズ )*/
0067.00 CALL PGM(QUICLOA) PARM(&HANDLE 'M' &APIERR)
0068.00 RETURN
0069.00 ENDDO
0070.00 /*( 実行キー )*/
0071.00 IF COND(&FNCTON *EQ &ENTER) THEN(DO)
0072.00 GOTO CMDLBL(DSPLY)
0073.00 ENDDO
0074.00
0075.00 ERROR: RCVMSG RMV(*NO) MSG(&MSG)
0076.00 SNDPGMMSG MSG(&MSG) MSGTYPE(*DIAG)
0077.00 ENDPGM
キー・ポイントとなるのは、
CALL PGM(QUIADDLE) PARM(&HANDLE &DSPDTA &DTALEN +
'SFLRCD ' 'SFL ' 'NEXT' &LHANDL +
&APIERR)
だけであるので、あっけに取られるほど簡単である。
わずか 77ステップでSFL照会画面ができたことになる。
このようにPNLGRPの場合は処理が複雑になるほど、そのビジネス・ロジックはシンプルになる。
また、Appを開発したとき操作員が開発者の想定していなかった思わぬ操作を行うため障害が発生するような場合がしばしば発生するが、PNLGRPによって開発しておくとそのような心配はほとんどしなくて済む。
少しくらいの乱暴な操作が行われてもPNLGRPがアベンドすることはほとんど無い。
どのように操作が行われるか想定できないようなAppを提供する場合、PNLGRPによるインターフェースであれば、信頼性の高いシステムを構築することができる。