7.63.2 KEEP_COUNTについてのコメント/警告
以下のコメント/警告は、KEEP_AVG、KEEP_COUNT、KEEP_MAX、KEEP_MIN、およびKEEP_TOTALの各コマンドに適用されます。
これらのコマンドで使用される処理ロジックについて、例を通して説明します。
請求明細行を選択して印刷する、以下のようなSELECTループについて考えます。
DEF_LINE NAME(#DETAIL) FIELDS(#INVNUM #VALUE)
DEF_BREAK NAME(#TOTAL) FIELDS(#INV_TOTAL) TRIGGER_BY(#INVNUM)
DEF_BREAK NAME(#GRAND) FIELDS(#GRD_TOTAL)
SELECT FIELDS(#INVNUM #VALUE) FROM_FILE(INVLIN)
KEEP_TOTAL OF_FIELD(#VALUE) IN_FIELD(#INV_TOTAL)BY_FIELD(#INVNUM)
KEEP_TOTAL OF_FIELD(#VALUE) IN_FIELD(#GRD_TOTAL)
PRINT LINE(#DETAIL)
ENDSELECT
ENDPRINT
簡単に言うと、実際には以下のような処理が行われます。
#INV_TOTALおよび#GRD_TOTALを0に設定する
---> 次のレコードを選択する
| #INVNUMが変更された場合、#INV_TOTALを0に設定する
| #VALUEを#INV_TOTALに加算する
| #VALUEを#GRD_TOTALに加算する
| #INVNUMが変更された場合、「後置型」ブレークを印刷する
| 行#TOTAL
| #DETAIL行を印刷する
---- Endselect
総計行#GRANDを印刷する
このロジックは非常に簡略化されていますが、基本的な処理ロジックを示しており、すべてのKEEP_XXXXXコマンド、およびKEEP_XXXXXコマンドとSELECT/SELECTLISTコマンドの関係に共通しています。結果を平均、カウント、最大、最小、または合計として「累計」する方法のみが異なります。
ブレーク行が「トリガー」される方法とそのタイミング、印刷前に#INV_TOTALがKEEP_TOTALコマンドによってクリアされ、リセットされているように見えても、常に正しい#INV_TOTAL値が印刷される理由の詳細については、DEF_BREAKコマンドのセクションを参照してください。
KEEP_XXXXXコマンドが条件(IFやCASE/WHENなど)内にあり、BY_FIELDが指定されている場合、合計は正しくリセットされません。