キャッシュフローレポートのストアドプロシージャを置き換えるアイデア[非公開]
-
02-07-2019 - |
質問
キャッシュフローレポートがあり、基本的にこの構造になっています:
Date |Credit|Debit|balance|
09/29| 20 | 10 | 10 |
09/30| 0 | 10 | 0 |
主な問題は残高です。データにDataSetを使用しているため、前日の残高が常に必要なため、DataSetの残高を計算するのは少し困難です。
また、このデータは複数のテーブルから取得され、データベースメタデータが頻繁に変更されるため、この手順を維持するのは困難でした。
誰でも私にいくつかの異なる解決策を与えることができますか?問題のために?
このレポートはDataGridに表示されています。
解決
これは変更が大きすぎるか、基準を外れている可能性がありますが、キャッシュフローレポートは、何らかの形で総勘定元帳を正式にまたは非公式に維持していることを示しています。あなたがそうなら、私はこれについておそらく素朴ですが、ID、日付、アカウント、ソース、金額などの最小限の列を持つ単一のテーブルとして総勘定元帳の詳細を維持する必要があると思います。
さまざまな表から得られるすべてのデータは、現金に影響を与えているいくつかの異なる種類のイベントがあることを示唆しています。私にとって、これらのさまざまな種類のイベントを独自のテーブル(売掛金、買掛金、在庫など)で表すのは理にかなっていますが、トリックは他のテーブルに金銭的な列を持たないことです。代わりに、データが記録される総勘定元帳詳細の行を参照するようにします。これを強制すると、他のテーブルへの変更に関係なく、キャッシュフローは常に同じように機能します。
バランスフォワードの問題に対処する必要があり、関連するトランザクションの数とシステムに必要な応答性を考慮する必要がありますが、少なくとも一度処理する方法について決定することができ、必要はありませんシステムの他の部分が進化するにつれて変更を加えます。
他のヒント
コードの側面では、2つの比較的簡単なオプションがありますが、どちらもデータセットを反復処理する必要があります。
オプション1:データバインディングの前のforループ。 データテーブルの各行について、前の行の残高にクレジット/デビットを加算/減算し、データテーブルの適切なセルに割り当てます。
オプション2:データバインディング中に計算します。 まず、値を保持できるグローバル変数があります。データバインドの直前にゼロに設定します。各アイテムまたは代替アイテムについて、クレジット/デビットをグローバル変数に加算/減算し、データグリッドの適切なセルに割り当てます。
これは通常、ネットワークトラフィックの大幅な増加を意味することに注意してください。これにより、アプリケーション全体のパフォーマンスが低下する可能性があります(クライアントで処理するにはこのデータをすべて取得する必要があるため)。
別のアプローチは、リクエストを送信してこの処理をデータベースサーバーまたは別のネットワークセグメントで実行できる(実装の好み)中間層アプリケーションを作成することです。
この計算を行うSPがある場合、通常は多くのデータに触れるためであり、目的はネットワークでのこの循環を回避することです。