月次とオーバーラップだYO!
ラップとラップでかかってます(やらなきゃよかった)。
月次サマリーを作るタイミング
売上仕入その他もろもろの月次サマリーは既存案件でも当然作っているんですが、仕訳大統一理論ゆえ、勘定を軸とした残高テーブルみたいな形になってます。
その集計のタイミングは月次会計締めで、バッチで一気に作ってるんですが、よって、前月残などを表示する画面・帳票などは、例えば9月分の債権管理表を出す場合、8月分の会計締めが済んでないと表示・出力内容が不正確になります。
運用上締め以前にそう云った帳票を出す事はないので別に良かったのですが、渡辺式では売上や仕入やもろもろ明細データ追加時に逐次サマリーを更新(なければ新規作成)していますね。
そうするとリアルタイムで残が出るので、締めてないけど試しに帳票出してみる、なんて時もちゃんと数字が出る訳です。オーバーラップ期間中なんかにやりそうです。
月次処理ってのはあくまでも決算処理に特化し、営業活動に関わるサマリー情報などとは切り離すと云う考えが受け取れます。これは大賛成で御座居ます。
気になったのは各トランザクションでガシガシと月次サマリーを更新しちゃって大丈夫かなって事ですが、よく考えれてみれば、入出荷時に在庫データをガシガシ更新する、なんてのと事情は全く同じですね。
ところで。例えば得意先別月次売上SUMの場合。8月だけ全く取引がなかったってな時、8月分のサマリーは作られないんじゃないかと。その後9月に売上がたったどーとか回収があったぞーと云う場合を考えてみると、月次サマリーが歯抜けになるんじゃないかなあと。
すると、9月分サマリーを新規に作る際、前月残を持ってくる時に、単純に前の月の残をSELECTしてつっこむ、って訳にはいきません。前の月が歯抜けになってる可能性があります。現在の所の最終年月分ってのをつかまえて来ないといけない訳です。
いきなり実装の話で恐縮ですが、SQL書くの面倒なので、きっちり時系列でふられる事が保証されてるIDを代理キーとして構えて考えてみましょう。ついでに年月もめんどいので年月で構えます。面倒なので。8月分の前月売掛金残を求めるにはこうなるんじゃないかなーと。
SELECT 月末売掛金残 FROM 得意先別月末売上SUM WHERE ID = ( SELECT MAX(ID) FROM 得意先別月末売上SUM WHERE 年月 < 2005/08 )
ああややこしい。それに件数が増えた際のパフォーマンスも心配かも知れません。なんかもっとナイスな実装の仕方とSQLの書き方があるかも知れないなあ。
オーバーラップ
そこでもう一点、気をつけなきゃと思ったのがやっぱりオーバーラップ期間です。
回収を見ると、入力する際の計上日は、決算データ管理の「日付指定での更新認可検査」で可否を判定しているようです。システム日付が9月だった場合、事業所テーブルの「前月度取引入力禁止フラグ」を見て、取引可だったら決算側(8月分)の日付はOK、禁止だったら当月側(9月分)しかダメよ、って事になる訳ですね。
これは売上・仕入など営業データに関しても同じでしょう。
では、この「前月度取引入力禁止フラグ」はどこで更新するのかなと云うと、月次決算処理のタイミングのみのようです。
これには、月度初日のバッチと画面からの手動起動の2通りありますね。バッチはフラグはオフ固定、画面はオン・オフ選べます。
つまり、月がめくれた時点でバッチにてオーバーラップ期間に自動的に突入、ついでに仮締めをやっておくって塩梅ですね。なるほどこれは楽かも知れない。いちいちオーバーラップ期間、設定させてたなあ。
で、何が気になるかって云うと、やっぱり月次サマリーの前月残なのです。オーバーラップ期間中は前月分取引がまだまだ入力される訳で、前月残は確定しないんですね。7月の取引と8月の取引が同時期に入力されますから。
7月/8月のオーバーラップ期間中に、8月側で売上が立ちました、と。月次サマリーも更新しますよ、と。すると、単に当月売上高へ加算・減算するだけでなく、その都度前月残を取得しなおさなきゃいけなくなります。
勿論、オーバーラップ期間が終われば前月残は確定しますんで、その必要はないですが、いちいち「取引入力禁止フラグ」を見るのもなんだか色々と分岐が多くなって大変そうです。
それに、前月残と云っても前述の通り、歯抜けの可能性がありますから、前述のパフォーマンスの心配もあります。
こんなん出ましたけどー(古い)
これはなかなかに難儀です。アイデアとしては、この場合、7月次決算時に、7月分サマリーの月末残が0円でないものに関しては無条件に8月分サマリーを作ってしまうってのはどうでしょう。8月分の前月残と月末残(共に値は7月月末残と同じ)で、当月分の売上やらなにやらを0円にセットしておく。
すんごい単純化して恐縮ですがこんな感じ。
8月1日午前0時になりましたと 年月 前月売残 前月前残 売上高 回収額 月末売残 月末前残 ------- -------- -------- ------- ------ -------- -------- 2005/07 100 10 50 100 50 10 2005/08 50 10 0 0 50 10 ↑ まだ8月になったばかりだけど、もう作っちゃう
7月の残が0円のものはスキップして良いでしょう。売上が立った時点で、新規に作れば良い。新規に取引が始まった得意先と同じ処理で問題ないはずです。残が0円なんですから。
8月1日午前0時になりましたと 年月 前月売残 前月前残 売上高 回収額 月末売残 月末前残 ------- -------- -------- ------- ------ -------- -------- 2005/07 100 0 0 100 0 0 ↑ 月末残が売掛・前受共に0円なので、8月分は作りません。 取引があった段階で、 年月 前月売残 前月前残 売上高 回収額 月末売残 月末前残 ------- -------- -------- ------- ------ -------- -------- 2005/08 0 0 100 0 100 0 なんてのを作ります。
これで前月残を取得する際には、単純に前の月の月末残を決め打ちで見る事が出来ます。前月サマリーが存在しなきゃ0円をセットする。パフォーマンス的にも望ましいんではないかなあと。よって、月次サマリー更新時は必ず前月残も取得しなおす、とかしてもよさげです。
うーん、でもなんかすっきりしないなあ。
いいわけ
えー、ざっと見て思った事なんで、どこか見落としてたりして、もしかしたら既に歯抜けとか起こらないようになってるかも知れません。