0

Excel でプラグインとしてロードできる .NET (C#) で DLL を作成しています。DLL は、外部アプリケーションのデータベースから特定の値を検索するために、Excel で数式として使用できる多くの関数を提供します。

これらの数式関数ごとに、DLL はデータベースにアクセスする必要があるため、データベース呼び出しが多すぎます。たとえば、式 1 が 10 個のセルで使用され、式 2 が 20 個のセルで使用されている場合、データベースへの呼び出しは 30 回になります。

データベースへの数式ごとに 1 回の呼び出しを行う方法はありますか? 実装のアイデアはありますか?

ありがとう。

編集:

基本的に、Excel と特定のサードパーティの会計ソフトウェアを使用するすべてのユーザーが使用できる汎用 DLL (Excel プラグイン) を作成しようとしています。ユーザーが Excel に挿入する各数式は、サード パーティのアプリ データベースにクエリを実行し、渡されたパラメーターに応じて特定の値を返します。

たとえば、ユーザーは数式を使用して特定の元帳の元帳残高を照会したり、別の数式を使用して SKU の在庫残高を照会したりできます。元帳ベースの数式、SKU ベースの数式など、さまざまなカテゴリの数式があります。ユーザーは、第 1 四半期と第 2 四半期の元帳残高を別々の列に表示するなど、並べて比較レポートを設計できます。

このプラグインは、ユーザーが Excel で独自のレポートをデザインし、必要に応じて書式設定し、会計ソフトウェアから必要なセルに値を取り込むことができるレポート デザイナー (ウィザードなし、数式ベースのみ) のように機能することを目的としています。

ただし、毎回データベースから読み取って各数式を評価するのではなく、最初に「数式実行計画」を設計したかったので、データベースへの複数の呼び出しを単一の数式の単一の呼び出しにまとめることができました。ユーザーが Excel シートのその数式のすべてのインスタンスで指定したパラメーター。

そうしないと、Excel シートが数式を評価するのに非常に長い時間がかかり、実用的ではなくなります。レポートには、平均で約 100 の数式が含まれていると予想しています。

4

2 に答える 2

0

受信しようとしているデータがわからなくても、コード内のデータセットを返し、毎回データベースに戻る代わりに、データセットから式にマップすることができます。したがって、株価などを取得すると言う場合は、データベースにクエリを実行するときに、すべての「WHERE」アイテムを取得してIN句にスローすることができます。関連する更新のデータセットを取得したら、データベースではなくデータセットから送信できます。Recalcsは、1回の呼び出しで、データベースへの実行を再度取得します。

更新フラグ用にセルを拡張し、それらからのみ更新することができます。

数式の計算を一時停止し、必要な場合にのみ更新します。

ただ大声で考えてください..またはタイピングに相当するものは何でも。

編集:私は私の脳の中でそれの仕組みに取り掛かり、私は自分の要素から外れていることに気づきました。ごめん。私はVSで.DLLまたはアドインを作成したことがないので、これ以降のすべては純粋に推測と推測であり、善よりも害をもたらす場合と引き起こさない場合があります。

実行プランが実行されるまで、UDFの実行を再ルーティングする必要があると思います。

いくつかのオブジェクトが必要になります。

  1. ExecutionPlan-このオブジェクトは、クエリのリストを管理します。一括トランザクションまたは単一トランザクション。リクエストをSQLに変換するメソッドが必要になります。次に、1回の呼び出しでSQLをデータベースに渡します。
  2. DataCache-返されるすべてのデータのレコードセットになります。フェッチされたかどうかを示すフラグなどでそれをカプセル化します。

式は次のようになります(擬似コード)

 if(dataCache.executed)
      formula.returnValue = dataCache.value(valueYouWantToReturn)
 else
      executePlan.add(valueYouWantToGet);
      formula.returnValue = "queued";

次に、再計算を強制する必要があります(これにより、dataCacheがデータベースに一度移動した後、100個の数式すべてがデータストア(dataCache)に移動してその値を取得します。

あなたのSQLコンバーターは本質的に巨大な節または文字列の構築を通して変化しINた束を構築するでしょう。ORしたがって、ExecutionPlan.Addメソッドが呼び出されたときに、取得する値を元帳のselectステートメントに追加する元帳値の句があります。

次に、ExecutionPlan.Executeが呼び出されたとき。sqlステートメントを実行し、dataCache.getValue(value)が呼び出されたときにインデックスを作成できるように、レコードセットにドロップします。「値」を検索して、関数に送り返します。

私はそれを死ぬまで説明していますが、うまくいくと思いますか?おもう...

于 2012-11-29T15:21:41.757 に答える
0

Excel で CUBEVALUE およびその他の CUBE 関数を使用することを検討してください。CUBEVALUE 関数は、DLL が意図していることを既に実行しています。つまり、関数ごとに外部データベースから単一の値を取得します。問題は、ソース データが OLAP 形式で、SQL ではなく MDX に対応している必要があることです。

ただし、この回答の範囲を超えていますが、これを設定するのはそれほど難しいことではありません。幸いなことに、経理は OLAP キューブにうまく収まる傾向があります。日付、部門、アカウントなどのディメンションを設定できます。また、在庫の場合は、アイテム、場所、ステータス (注文中、出荷済み、在庫あり) のディメンションを設定できます。等

少なくとも調べる価値はあります。

于 2012-11-29T19:48:45.347 に答える