0

私の質問は、ソリューションのアイデアを具体的に探すことではなく、Excel VBA で ADODB を使用してからしばらく経っているため (少なくとも 2 つの主要なリビジョン)、自分のソリューションの健全性チェックを目的としています。

というわけでこんな状況です。大きすぎてメモリに収まらない大きなデータベース ビューのチャンクにアクセスしたいユーザーのために、Excel レポートを作成しています。ユーザーはすべてのビューにアクセスできる必要があるため、ハードコーディングされたフィルターは問題外です。より洗練された解決策がない限り、彼らが必要としているのは、生成された SQL ステートメントの形式で接続のフィルターを動的に制御できることです。SQL ステートメントはピボットキャッシュにフィードされ、ピボットテーブルに更新を指示します。

ユーザーが一般的に必要とするすべてのフィルターを備えたフォームを表示する「更新」ボタンを作成しました。ユーザーがフィルター値を入力すると、それらを解析して検証し、値から適切な SQL ステートメントを形成します。次に、これを行うと問題が発生します。

'this has to be dynamic becuase I'm distributing to multiple users, using different testing/production databases on different workstations.
mypivottable.PivotCache.Connection = "ODBC;" & driver & myserver & myuser & trusted & app & workstationid & databse

'this also has to be dynamic becuase of the sql filters
mypivottable.PivotCache.CommandText = sql

だから私はボタンを押して、それが動作します! これらのプロパティを設定した後、キャッシュの背後に新しいデータがあることを認識しているため、ピボットテーブルは自動的に更新され、新しい基準でクエリ結果をフェッチします。

問題は、外部データソースのリストを見ると、これらのプロパティを変更するたびに新しい接続が作成され、それ自体がクリーンアップされないことです。100回使用すると、100個の接続が残り、そのうち99個が未使用です。すべての接続を削除すると、ピボットテーブルが元に戻せなくなります。

これを行うより良い方法はありますか?未使用の接続のみをクリーンアップするプログラムによる方法はありますか?

4

1 に答える 1

1

SQL ステートメントを更新するだけでよい場合は、接続をリセットする必要はありません。私は実際にこれと同様の問題を抱えていましたが、これは私がそれを解決した方法です:

Sub test()
' add logic...

    ' then change sql code
    With ThisWorkbook.Connections("your connection name").OLEDBConnection
            .CommandText = Array("select * from mytable where id = 1") ' adjust accordingly
            .Refresh
    End With
End Sub

実際に行う必要があるのは、現在の接続を取得して CommandText プロパティを更新することだけです。ちなみに、なぜ使用する必要があるのか​​ わかりませんが、使用しArray()ないと問題が発生しました。

実際に、SQL を使用してピボット テーブルを作成する方法に関するブログ記事を書きました (ここにリンク)。たぶん、動的コンテンツの作成について別のものを作成する必要があります:)

于 2013-03-22T00:42:24.557 に答える