Как я могу обновить связанную таблицу в VBA, если она содержит многозначное поле? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть некоторый VBA, который программно обновляет местоположение связанных таблиц, так что внешний интерфейс моей базы данных может быть легко указан на другом внутреннем конце, без необходимости перемещаться по Менеджеру связанных таблиц. Техника описана в этом блоге Microsoft . Это должно быть так же просто, как запустить следующий код для каждой связанной таблицы в CurrentDb.TableDefs:

tableDef.Connect = ";DATABASE=" & newBackEndPath
tableDef.RefreshLink

Однако, когда таблица содержит многозначное поле, Access предоставляет следующее бесполезное и вводящее в заблуждение сообщение об ошибке:

Ошибка времени выполнения '3125':

'[ имя таблицы ]' не является допустимым именем. Убедитесь, что он не содержит недопустимых символов или знаков препинания и не слишком длинный.

Та же ошибка появляется при ручном обновлении ссылок из менеджера связанных таблиц, хотя иногда после нескольких попыток обновление будет работать без сообщения об ошибке. Чтобы обойти проблему, я пытаюсь обновить ссылку, создав новую TableDef, а затем переименовав ее в старую:

Dim tdf As TableDef
Set tdf = CurrentDb.CreateTableDef(originalTableName & "_Copy")
tdf.Connect = ";DATABASE=" & newBackEndPath
tdf.SourceTableName = tableName
With CurrentDb.TableDefs
    .Append tdf
    .Refresh              ' Required?
End With
    RefreshDatabaseWindow ' Required?
    DoEvents              ' Required?
DoCmd.Rename originalTableNameName, acTable, originalTableNameName & "_Copy"

Обычно это работает, но иногда DoCmd.Rename выдает следующую ошибку во время выполнения:

Ошибка времени выполнения '7874':

Microsoft Access не может найти объект '[ имя таблицы ] _ Копировать'.

Если я вхожу в отладчик, это обычно вызывает какое-то обновление, и на панели навигации появляется таблица _Copy. Если я нажму F5 в этот момент, DoCmd.Rename выполняется без проблем. Ясно, что после добавления TableDef существует некоторая задержка, прежде чем он может быть найден и переименован. Я добавил строки TableDefs.Refresh, RefreshDatabaseWindow и DoEvents, пытаясь вызвать появление новой таблицы, но, похоже, они не помогают. Кажется, даже принудительная задержка в несколько секунд не работает, но каким-то образом открытие отладчика делает.

Есть ли надежный способ обновить связанную таблицу, которая содержит многозначное поле?

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

1 Ответ

0 голосов
/ 25 апреля 2018

Вы можете попробовать совсем другой подход, используя DoCmd.TransferDatabase:

DoCmd.TransferDatabase acLink, "Microsoft Access", newBackEndPath, acTable, tableName, tableName

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

Конечно, я поддерживаю совет Сергея не использовать многозначное поле.Я фанат пользовательского опыта многозначных полей и связанных с ними списков, но это имеет далеко идущие последствия использования MVF, например, невозможность перенести вашу базу данных на SQL-сервер в будущем

...