CL

105. 印刷スプールをデータ・ベースに変換する (3)

最後に紹介する印刷スプールのデータ・ベースへの変換は
少し驚く方法を紹介する。
印刷スプールをデータ・ベースに変換するのは
CPYSPLF を使うものと誰もが思っているはずなのだが
なぜそうしなければならないのだろうか ?

CRTPF FILE(QTEMP/QPRINT) RCDLEN(132)
     IGCDTA(*YES) LVLCHK(*NO) AUT(*ALL)

でデータ・ベース : QTEMP/QPRINT を作成したのであるから
このデータ・ベースに直接、出力できないのだろうか?
答えは YES である。

OVRPRTF で出力ファイルをこの QTEMP/QPRINT にオーバーライドして
印刷出力してみよう。
先の例では、

OVRPRTF FILE(QPRINT) TOFILE(QTEMP/QPRINT)
      LVLCHK(*NO) SECURE(*YES) OVRSCOPE(*JOB)
           OPNSCOPE(*JOB)

に印刷スプール : QPRINT をデータ・ベース : QTEMP/QPRINT に
オーバーライドさせてデータ・ベースに直接、印刷してみよう。

【 サンプル: TESTPRT4 】
0001.00              PGM
0002.00 /*-------------------------------------------------------------------*/
0003.00 /*   TESTPRT4  :   印刷スプールをデータ・ベースへコピーする          */
0004.00 /*                                                                   */
0005.00 /*   2017/08/19  作成                                                */
0006.00 /*-------------------------------------------------------------------*/
0007.00              DCL        VAR(&JOB)  TYPE(*CHAR) LEN(10)
0008.00              DCL        VAR(&USER) TYPE(*CHAR) LEN(10)
0009.00              DCL        VAR(&JOBNBR) TYPE(*CHAR) LEN(6)
0010.00              DCL        VAR(&TYPE) TYPE(*CHAR) LEN(1)
0011.00              DCL        VAR(&RCVDTA) TYPE(*CHAR) LEN(128)
0012.00              DCL        VAR(&RCVLEN) TYPE(*CHAR) LEN(4)
0013.00              DCL        VAR(&APIERR) TYPE(*CHAR) LEN(116) +
0014.00                           VALUE(X'000074') /* 2 進数  */
0015.00
0016.00 /*( 環境の取得 )*/
0017.00              RTVJOBA    JOB(&JOB) USER(&USER) NBR(&JOBNBR) TYPE(&TYPE)
0018.00
0019.00 /*( データ・ベースの作成 )*/
0020.00              CRTPF      FILE(QTEMP/QPRINT) RCDLEN(132) IGCDTA(*YES) +
0021.00                           LVLCHK(*NO) AUT(*ALL)
0022.00              MONMSG     CPF7300
0023.00
0024.00 /*( スプールを *HOLD にオーバーライド )*/
0025.00              OVRPRTF    FILE(QPRINT) TOFILE(QTEMP/QPRINT) +
0026.00                           LVLCHK(*NO) SECURE(*YES) OVRSCOPE(*JOB) +
0027.00                           OPNSCOPE(*JOB)
0028.00
0029.00 /*( 印刷ジョブの実行 )*/
0030.00              PGM102     TKFROM() TKEND(9999) OUTPUT(*PRINT)
0031.00              DLTOVR     FILE(QPRINT) LVL(*JOB)
0032.00              MONMSG     CPF9800
0033.00
0034.00              ENDPGM
【解説】

以前のサンプル・ソースに比べて CPYSPLF がなくなっているのでシンプルになり
もちろんパフォーマンスも良くなっている。
大量のスプールをデータ・ベースに変換したいのであれば
この方法がパフォーマンスにおいて優れている。

この OVRPRTF を使ってデータ・ベースへ変換する方法は例外的な手段ではなく
OVRPRTF のヘルプにも IBM がデータ・ベースへの変換ができることを
認めている記述があるのでぜひ参照してもらいたい。

また印刷スプールの PDF 化のソリューションでパフォーマンスが良くないとか
エンド・ユーザーの不満を耳にすることがある。
もしそのソリューションが印刷罫線をサポートしていなくて
パフォーマンスが良くない、というものであれば
間違いなく印刷スプールを CPYSPLF でデータ・ベースにコピーしている製品であると
予想される。
CPYSPLF はユーザーが社内でバッチ処理として利用するには問題ないが
ソフトウェア製品として販売する技術に採用されるべきではない。
CPYSPLF は大量のスプールの変換にはやはり不向きであるので
対価を取って製品とするのであれば専用のスプール API を使うべきである。

【注】この方法は i5/OS のユーティリティーの印刷出力を
データ・ベース化するには使用することはできない。
i5/OS ユーティリティーの印刷は画面と同様に
パネル・グループ (*PNLGRP) として作成されており
パネル・グループ (*PNLGRP) には OVRPRTF は効かないからである。
( *PNLGRP はファイルではない )