2012-02-24 14 views
1

Я ищу решение для эффективной связи между двумя работающими приложениями MS Access.Связь между двумя приложениями MS Access?

Подходы, которые я пробовал до сих пор, это использовать общую связанную таблицу и использовать службу MSMQ для связи. Оба подхода работают, но нет возможности «нажимать» данные или команду из одного приложения на другое, и поскольку MS Access не поддерживает многопоточное выполнение кода VBA, очень сложно реализовать опрос без недостатков производительности.

В то же время VBA поддерживает оператора addressof (от версии 2000), что означает, что мы также можем теоретически реализовать функции обратного вызова в VBA и MS Access. Но я никогда не видел ни одного примера, как это можно использовать для межпроцессного общения, и был бы признателен за любой минимальный пример того, как я могу отправить строку из одного приложения MS Access в другой, не контролируя общую таблицу все время.

+1

Некоторые интересные ссылки в SO здесь: http://stackoverflow.com/q/393996/78522 –

ответ

1

Вы можете использовать GetObject(), чтобы вернуть объект Access.Application из другого работающего db. С объектом приложения у вас есть доступ ко всему, что вам может понадобиться. Вот надуманный пример открытия формы (но вы можете сделать множество других вещей с 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() вызов будет запустить приложение (вам потребуется быть осторожным, если у вас есть несколько версий Access, установленных, поскольку их трудно узнать во время выполнения, какая версия действительно откроет .mdb). Однако, если GetObject() необходимо запустить приложение, он будет делать это с установленным значением видимости False, поэтому мы явно установим его в True. Если приложение уже запущено, установка его видимости на True не будет иметь никакого эффекта.

0

Считайте, что это дикая идея, но могут быть помещены все ваши таблицы в sql express и/или sql ce и выглядеть как интерфейс для этих таблиц?

+0

Это именно то, что мы делаем сейчас, и что я имею в виду под «общей таблицей». Но нет способа реализовать триггер, который будет срабатывать, если некоторые данные будут вставлены в эту таблицу - вам нужно продолжать опрос, чтобы искать изменения, и это резко ухудшает производительность приложения MS Acess ... –

+1

@ Александр Галкин: резко ухудшить производительность? Я удивлен, так как я использовал опрос (с небольшими интервалами, скажем, 1 минута) без значительного воздействия. Трюк здесь заключается в том, чтобы оставить соединение открытым. –

+0

@iDevlop. Мы хотим передать контекстное меню, щелкнув в одном приложении MS Access, в другой, а один интервал - слишком длинный. Пока мы используем 1 сек опроса, мы видим проблемы с производительностью (мышь курсора замерзает на долю секунды). –