レポート出力前に件数を確認したい!

2024年3月23日テクニカルメモ

概要

データベースからの取得件数が多い場合、データベースからデータを取得後の処理に対しても負荷が多くなることが考えられます。

データベースから取得する予定の『検索条件』を事前に発行して件数のみ取得することで、後続処理への負荷を軽減する方法です。

データベースへの負荷が増える可能性があります。

事前に件数取得処理を発行するため、データベースに対して2回処理を類似した処理を発行することとなりますので、データベース側のキャッシュ状況や負荷状況によっては処理効率が下がることも考えられます。事前に設計や検証について十分配慮して実装してください。

サンプル

-SET &LIMIT=10;

-DEFAULTH COUNT=0

TABLE FILE CAR
SUM CNT.COUNTRY AS COUNT
WHERE SALES GE 1000
ON TABLE SET ASNAMES ON
ON TABLE HOLD AS CNTHLD FORMAT BINARY
END
-RUN
-READFILE CNTHLD
-IF &COUNT GT &LIMIT THEN GOTO LBL_CNTERR;

TABLE FILE CAR
PRINT *
WHERE SALES GE 1000
ON TABLE SET PAGE-NUM NOLEAD
ON TABLE SET ASNAMES ON
ON TABLE NOTOTAL
ON TABLE PCHOLD FORMAT HTML
ON TABLE SET HTMLEMBEDIMG ON
ON TABLE SET HTMLCSS ON
ON TABLE SET STYLE *
     INCLUDE = IBFS:/EDA/EDASERVE/_EDAHOME/ETC/warm.sty,
$
ENDSTYLE
END
-GOTO LBL_EXIT

-LBL_CNTERR
-HTMLFORM BEGIN
<html>
<head>
<title>件数チェック</title>
</head>
<body>
取得件数が!IBI.AMP.LIMIT;件を超えています<br>
検索条件を指定し直して再実行してください<br>

検索結果件数:!IBI.AMP.COUNT;件<br>
</body>
</html>
-HTMLFORM END

-LBL_EXIT

ポイント解説

制限する件数を設定

-SET &LIMIT=10;

件数チェック時に使用する変数を設定

件数を取得

TABLE FILE CAR
SUM CNT.COUNTRY AS COUNT
WHERE SALES GE 1000
ON TABLE SET ASNAMES ON
ON TABLE HOLD AS CNTHLD FORMAT BINARY
END
-RUN
-READFILE CNTHLD
-IF &COUNT GT &LIMIT THEN GOTO LBL_CNTERR;

発行予定のTABLEリクエストと同様のWHEREを使用して、件数のみ取得しています。
取得した件数を一時ファイルへ保存して、後続処理で読み込んで件数を取得します。

取得した件数が、制限として設定した件数を超えている場合は、件数エラー用の処理へ移動します。
件数が下回っていれば、そのまま後続のTABLEリクエスト処理へ進みます。

件数エラーを画面に表示する

-HTMLFORM BEGIN
<html>
<head>
<title>件数チェック</title>
</head>
<body>
取得件数が!IBI.AMP.LIMIT;件を超えています<br>
検索条件を指定し直して再実行してください<br><br>
検索結果件数:!IBI.AMP.COUNT;件<br>
</body>
</html>
-HTMLFORM END

エラー表示用のHTMLを記述します。

!IBI.AMP.XXX;を使用して変数の値をHTML内へ埋め込んでいます。