7.80.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が指定されている場合、合計は正しくリセットされません。