バッチ制御の考え方
「バッチ制御」はLANSAリポジトリの特殊機能です。あるテーブルの数値列の合計値を、別のテーブルの列に合計する場合に使います。レコードの挿入/更新/削除の都度、自動的に合計値も更新されます。バッチ制御に使う列がキー列を含んでいてもかまいません。
データ入力にあたって、合計値を検証する手段としてよく使われます。例えば注文の「頭書き」テーブルで、注文金額の合計を求める、という使い方ができます。該当する注文明細レコードの「金額」列を合算して「合計」を求めるのです。同様に、注文明細レコードの個数を数えるためにも使えます。
テーブル内でバッチ制御を使用すると、データベースI/Oの量を減らすことにより、パフォーマンスを改善できます。また、計算を集中管理し、必要な時点で自動的に計算することで、アプリケーションのロジックが簡潔になるという効果もあります。バッチ制御はテーブル単位で定義します。また、その実装にはOAM (オブジェクト・アクセス・モジュール) が使われています。
バッチ制御と同等の処理を行うファンクションを用意し、テーブル単位のトリガーにより起動する、という実装方法も考えられます。この方法は、トリガー・ファンクションを手入力で記述する必要があります。しかしどのような処理でも記述でき、適応性の面でも優れているので、可能であればこの方針で実装するようお勧めします。
重要:バッチ制御ロジックや、これをサポートするために使用するリポジトリの列は、論理データ・モデリングの使い方と整合しない場合があるので注意してください。
バッチ制御の例を示します。
- ある「バッチ・トランザクション」データ入力アプリケーションで、次のような構成の、3つの制御テーブルを使っているとします。
日次集計テーブル
|
バッチ集計テーブル
|
入力データ・テーブル
|
DATE
|
DATE
|
DATE
|
DDEBIT
|
BATCH
|
BATCH
|
DCREDIT
|
BDEBIT
|
TRANSACTION
|
|
BCREDIT
|
ACCOUNT
|
|
|
DESCRIPTION
|
|
|
DEBIT
|
|
|
CREDIT
|
|
- ここでBDEBIT(バッチ借方合計)およびBCREDIT(バッチ貸方合計)は、あるDATE(日付)、BATCH(バッチ処理単位番号)のDEBIT(借方)およびCREDIT(貸方)の合計値を表します。
- 同様に、DDEBIT(日次借方)およびDCREDIT(日次貸方)は、あるDATE(日付)のDEBIT(借方)およびCREDIT(貸方)の合計値です。
「入力データ」テーブルを定義に、バッチ制御ロジック・コンポーネントを使って次のように指定します。
- 「入力データ」テーブルのDEBIT、CREDIT列の値を、DATEおよびBATCHごとに集計し、「バッチ集計」テーブルのBDEBIT、BCREDITに格納します。
- 「入力データ」テーブルのDEBIT、CREDIT列の値を、DATEごとに集計し、「日次集計」テーブルのDDEBIT、DCREDITに格納します。
- 「入力データ」テーブルの入出力モジュールをコンパイル(この章の先頭で述べた入出力モジュールに関する説明を参照)すると、「バッチ集計」テーブル、「日次集計」テーブルの値を必要に応じて自動更新する処理が組み込まれます。
- したがって、「入力データ」テーブルのレコードを挿入/更新/削除するごとに、合計値に反映されることになります。ほかに設定は必要ありません。
- 入出力モジュールに組み込まれる処理は、バッチ制御の「キー」が変わったことも正しく認識するようになっています。したがって、あるレコードのバッチ処理単位番号が1234から4567、日付が010187から150187に変わったような場合でも、合計値は正しく求められています。
- 「入力データ」テーブルにレコードを追加するファンクションを独自に作成する場合、このファンクションは、入出力モジュールを使って処理するようにしてください。こうしておけば、他の2つのテーブルについて意識しなくても、自動的に集計処理が行われるようになります。
次の簡単な例を考えてみましょう。注文の「頭書き」テーブルと「明細行」テーブルには次のような列があるとします。
「頭書き」テーブル
|
「明細行」テーブル
|
ORDNUM
|
ORDNUM
|
CUSTNO
|
ORDLIN
|
DATE
|
PRODNO
|
TOTDUE
|
QUANTY
|
|
VALUE
|
|
- 「頭書き」テーブルのTOTDUE(合計)は、「明細行」テーブルの、該当するレコードのすべてのVALUE(金額)を集計して求めます。TOTDUEは関連するすべての請求書明細行の合計です。
次のトピックも参照してください。
バッチ制御の例