Запуск кода перед открытием любых форм в Access - PullRequest
8 голосов
/ 22 октября 2008

Итак, у меня есть база данных Access с передней и задней частью. Вскоре я буду распространять его среди пользователей, но не могу контролировать, где именно они будут размещать файлы на своих компьютерах. Тем не менее, я думаю, что могу рассчитывать на то, что они поместят переднюю и заднюю части в одну папку.

Таким образом, когда открывается внешний интерфейс, я хочу, чтобы он проверял, что связанные таблицы правильно подключены к внутренней базе данных. У меня есть рабочий код для этого; однако я не знаю, где это поставить. Когда открывается внешний интерфейс, автоматически открывается форма меню (настраивается через диалоговое окно запуска). Я поместил код в событие OnOpen, которое, как я думал, произошло до загрузки каких-либо данных, но когда я проверяю это, я получаю сообщение о том, что сервер не может быть найден (он ищет в своем старом местоположении ).

В принципе, есть ли событие, которое я могу использовать, которое запускается до открытия каких-либо форм?

Ответы [ 6 ]

6 голосов
/ 22 октября 2008

Создайте макрос и назовите его «autoexec». Для действия макроса выберите «RunCode», а затем задайте в качестве имени функции имя функции, которую вы используете для проверки связанных таблиц.

2 голосов
/ 22 октября 2008

Я обычно предпочитаю создавать небольшую форму, которая выполняет ряд проверок, таких как поиск серверной части и т. Д., И устанавливает различные параметры. Код для события open этой формы может быть:

Me.Visible = False
'Determines if the database window is displayed
SetProp "StartupShowDBWindow", False, dbBoolean
'Hide hidden and system objects
SetOption "Show Hidden Objects", False
SetOption "Show System Objects", False

'Find back end
CheckLinkPath

Я храню таблицу таблиц для связи во внешнем интерфейсе, и если они отсутствуют, эту форму можно использовать для сообщения об ошибке или о любой другой ошибке по этому вопросу.

Set RS = CurrentDb.OpenRecordset("Select TableName From sysTables " _
& "WHERE TableType = 'LINK'")

RS.MoveFirst
strConnect = db.TableDefs(RS!TableName).Connect
If Not FileExists(Mid(strConnect, InStr(strConnect, "DATABASE=") + 9)) Then
    'All is not well
    blnConnectError = True
Else
    Do Until RS.EOF()
        If db.TableDefs(RS!TableName).Connect <> strConnect Then
            blnConnectError = True
            Exit Do
        End If

        RS.MoveNext
    Loop
End If

Если все в порядке, маленькая форма вызывает главное меню или форму, и пользователь никогда не видит форму проверки. Я бы также использовал эту форму, чтобы открыть запрос пароля, если требуется.

2 голосов
/ 22 октября 2008

Как сказал Мэтт, создайте макрос, назовите его «autoexec» и выберите «RunCode» в качестве действия макроса. Аргумент «Имя функции» должен быть именем функции, которую вы хотите запустить (а не подпрограммой), и если функция не имеет аргументов, вы все равно должны ставить () в конце, иначе она не будет работать.

1 голос
/ 22 октября 2008

Перед тем, как поместить свой интерфейс и сервер в одну и ту же папку, подумайте об этом. Разве не стоит иметь 2 папки? А как насчет нескольких пользователей на одном компьютере, имеющих доступ к одной и той же внутренней базе данных? А как насчет нескольких пользователей, имеющих доступ к одной и той же базе данных через сеть? Зачем нужна типология внешнего интерфейса, если ваше приложение в основном однопользовательское?

Почему бы вам не добавить диалоговое окно в ваше приложение на случай потери соединения? Вы можете создать объект fileDialog в своем коде, позволяя пользователю искать файл * mdb в любом месте своего компьютера / сети. Тогда можно контролировать, что выбранный файл MDB содержит все запрошенные таблицы и открывать соответствующие ссылки (я полагаю, вы используете команду TransferDatabase).

А как насчет дополнительных инструментов / ссылок, которые понадобятся вашему приложению для запуска, когда вы будете распространять его среди своих конечных пользователей? По умолчанию MS Access записывает 3 основных:

  • Visual Basic для приложений
  • Библиотека Microsoft Access
  • Библиотека Microsoft DAO

Если вашему приложению требуется что-то еще, например объекты ADO или Office (например, ADODB.recordset или панели команд Office), вам придется добавлять ссылки вручную для каждой установки, так как конечный пользователь не сможет открыть окно VBA и доступ к меню инструментов / ссылок.

Итак, если вам нужно развернуть приложение на нескольких компьютерах, я настоятельно рекомендую вам использовать такой инструмент развертывания, как этот бесплатный . Вам понадобится несколько часов, чтобы правильно его использовать, но результат того стоит. Вы сможете дать своим клиентам настоящий установочный модуль. Он будет создавать папки, добавлять запрошенные ярлыки и управлять ссылками в реестре компьютера. Это сделает ваше развертывание определенно безболезненным!

EDIT: макрос autoexec определенно является правильным решением для вызова кода перед любым событием.

РЕДАКТИРОВАТЬ: не забывайте, что ваши конечные пользователи могут получить выгоду от бесплатной версии Access!

0 голосов
/ 03 апреля 2015

Вы можете отправить им файл * .BAT, который копирует базы данных в папку c: \ temp (или любую другую папку, которую вы выберете. Перед созданием файла BAT установите ссылку на эту папку. Заархивируйте ее и отправьте по электронной почте им. вам не придется беспокоиться о дополнительном необходимом коде.

0 голосов
/ 01 мая 2009

Как и предполагали другие, в этом случае я бы использовал макрос AutoExec. Если ваш код, который проверяет связанные таблицы, в настоящее время является подпрограммой, измените его на функцию, которая возвращает TRUE в случае успеха. Затем можно использовать столбец «условия» в макросе AutoExec для выхода из приложения с удобным диалоговым окном ошибок, если код таблицы ссылок завершается ошибкой. Ваш макрос AutoExec может выглядеть примерно так:

  1. Вызовите функцию LinkTables (), установите условие для прекращения запуска в случае сбоя.
  2. Позвоните в форму «Главное» меню запуска.
...