У меня есть некоторый 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
, пытаясь вызвать появление новой таблицы, но, похоже, они не помогают. Кажется, даже принудительная задержка в несколько секунд не работает, но каким-то образом открытие отладчика делает.
Есть ли надежный способ обновить связанную таблицу, которая содержит многозначное поле?
(я проигнорировал совет избегать использования многозначных полей , когда я начинал этот проект, потому что я хотел, чтобы пользователи могли фильтровать многозначные поля с помощью быстрых фильтров в таблице данных с разделенной формой . Эта функция очень полезна, но я начинаю желать, чтобы я только что создал свой собственный пользовательский интерфейс фильтрации после обнаружения этой и многих других ошибок в реализации многозначных полей.)