2012-02-24 15 views
1

私は2つの実行中のMS Accessアプリケーション間で効果的に通信するためのソリューションを探しています。2つのMS Accessアプリケーション間の通信?

これまでに試したアプローチは、共通のリンクテーブルを使用し、通信にMSMQサービスを使用することです。どちらのアプローチも機能しますが、あるアプリケーションから別のアプリケーションへデータやコマンドを「プッシュ」する方法はなく、MS AccessはVBAコードのマルチスレッド実行をサポートしていないため、パフォーマンスの問題もなくポーリングを実装することは非常に困難です。

同じ時刻に、VBAはaddressofオペレータ(バージョン2000以降)をサポートしています。つまり、理論的にはVBAとMS Accessでコールバック関数を実装できます。しかし、これはプロセス間通信にどのように使用できるかの例を見たことがなく、共有テーブルを常に監視せずにMS Accessアプリケーションから別のMS Accessアプリケーションに文字列を送信する方法については、

+1

SO、ここでいくつかの興味深いリンク:http://stackoverflow.com/q/393996/78522 –

答えて

1

あなたは他の実行中のDBからAccess.Applicationオブジェクトを返すためにGetObject()を使用することができます。アプリケーションオブジェクトを使用すると、必要なものすべてにアクセスできます。ここでは、フォームを開くの不自然な例だ(しかし、あなたはApplicationオブジェクトと他のものの無数を行うことができます):

Sub TestInterop() 
Const mdbPath As String = "C:\OtherApp.mdb" 
Dim OtherApp As Access.Application 

    Set OtherApp = GetObject(mdbPath) 
    OtherApp.Visible = True 
    OtherApp.DoCmd.OpenForm "Accounts" 
End Sub 

プログラムが既に実行されていない場合、GetObject()呼び出しは(アプリケーションを起動しますあなたが必要になりますランタイムにどのバージョンで実際に.mdbが開かれるかを知ることが難しいため、Accessの複数のバージョンがインストールされている場合は注意が必要です。しかし、GetObject()がアプリを起動する必要がある場合は、可視性がFalseに設定されているので、明示的にTrueに設定します。アプリが既に実行されている場合は、VisibilityをTrueに設定しても効果はありません。

0

は野生のアイデアを検討しますが、SQL Expressおよび/またはSQL CEにすべてのテーブルを入れて、これらのテーブルへのフロントエンドのような表情を作ることができますか?

+0

これは私たちが今やっているまさに、私が「共有テーブル」を意味するものです。しかし、いくつかのデータがこのテーブルに挿入された場合に起動するトリガを実装する方法はありません。変更を探すためにポーリングを続ける必要があり、MS Acessアプリケーションのパフォーマンスが大幅に低下します... –

+1

@Alexander Galkin:パフォーマンスが大幅に低下しますか?私は驚いています。なぜなら、私は小さなインパクトなしでポーリングを(低い間隔で、1分と言って)使用していたからです。ここのトリックは、接続を開いたままにすることです。 –

+0

@iDevlop私たちが望むのは、1つのMS Accessアプリケーションでコンテキストメニューのクリックを別のものに伝え、1分間隔が長すぎることです。 1秒間のポーリングを使用する限り、パフォーマンス上の問題が発生します(マウスカーソルは数秒間でフリーズします)。 –

関連する問題