配賦計算で処理が落ちる典型的な例(配賦ロジック編)
管理会計システムに於いて、配賦計算のバッチ処理が落ちてしまう事があります。もちろんそれを回避するようにロジックを構築するべきですが、どうしても漏れは出てきます。典型的な例を示しますので、こういった状況の回避手段をあらかじめ検討しておきましょう。
配賦係数がALLゼロ
配賦係数がALLゼロの場合。ここで言う「ALL」とは、配賦対象の収支管理単位のことを指しています。例えば右の図のような売上だった場合。この「北海道・東北エリア」の単位に入った費用を売上高配賦しようとした場合、配賦係数がゼロなので配賦しようがありません。素直に配賦の式を当てはめると、
(配賦前金額) * 0(配賦先収支管理単位配賦係数) / 0(配賦先全体の配賦係数合計)
という式になりますので、devide by zeroの例外が出ます。
配賦係数の合計値がゼロ
個々の配賦係数がゼロでなくても、マイナスの配賦係数を許している場合は配賦係数の合計値がゼロになってしまう場合があります。右の図のような場合です。例えば手稲店への配賦計算の際は、
(配賦前金額) * 10(配賦先収支管理単位配賦係数) / 0(配賦先全体の配賦係数合計)
となります。やはり、divede by zeroで計算できませんね。
賦先の収支管理単位が存在しない
配賦先の収支管理単位が存在しなくて配賦できない場合もあります。右の図の「関東エリア」に費用が入った場合。この関東エリアはその下に店舗がまだできていないので、配賦先がありません。そもそも収支管理単位が無いので配賦ができないということになります。
また、「収支管理単位があったけど死んじゃった」という場合もあります。右の図の「平岡店」と「手稲店」は、以前は営業していたけど両方閉店してしまった、となると、やはり先ほどの関東エリアの時と同様、配賦先の収支管理単位が存在しないのでうまく配賦が回りません。
通常、配賦ロジックは
配賦先収支単位をDBからSELECTする
→ 取得した収支管理単位でループ
→ 収支管理単位への配賦額を算出する
というループが存在しますが、収支管理単位が取得できない場合、なにも考えないでロジックを作るとFOR EACHのループに入らずに処理を継続してしまったりします。収支管理単位を取得した後は、その取得できた収支管理単位の数をチェックし、ゼロだったら例外を投げる等をする必要があります。
というように、バッチ処理の構築にはよくある話ですが、配賦計算にはさまざまなチェックロジックが必要です。頭の片隅に置いておいて下さい。