Прежде всего, давайте проясним: у вас нет «проекта» Access 2003. У вас есть база данных Access 2003.
Реальный проект доступа к данным не может иметь локальные таблицы и использует SQL Server в качестве серверной части. При просмотре таблиц вы видите те, которые существуют на сервере, а в разделе «Запросы» вы видите представления, функции и хранимые процедуры, которые существуют на сервере. Вы можете использовать «Мастер масштабирования», чтобы превратить базу данных Access в проект данных Access (или, возможно, лучше, просто создать новый ADP (проект данных Access) и импортировать все формы, отчеты, макросы и модули.
Вот мои идеи:
Преобразуйте базу данных в реальный проект доступа к данным, а затем просто используйте обычные старые запросы, как если бы они были адресованы локальной базе данных. Вы даже можете привязать формы к хранимым процедурам, и они могут быть обновляемыми. Чтобы иметь дело с производством, разработкой и тестированием, вы просто изменяете строку подключения в графическом интерфейсе или изменяете ее с помощью следующего кода:
Application.CurrentProject.CloseConnection
Application.CurrentProject.OpenConnection NewConnString
Если вы хотите прочитать строку подключения из централизованной базы данных или из текстового файла на общем ресурсе, или из общей таблицы, которую вы загружаете в каждой среде (которая содержит информацию о соединении для любой другой среды), это возможно. У меня есть один проект доступа к данным, который имеет панель инструментов с раскрывающимся списком среды. При переключении среды заполняется раскрывающийся список дочерней базы данных, и, наконец, все открытые формы уведомляются событием (хотя связанные формы закрываются, когда это происходит).
Нет ничего плохого в использовании связанных таблиц. Просто напишите процедуру, которая перебирает все таблицы и обновляет их, чтобы они указывали на нужный сервер, когда вы хотите изменить среду. Разница между "статическим" связыванием и "динамическим" связыванием - это всего лишь одна процедура VB, которая просматривает все таблицы и связывает их - просто peasy.
Установка динамического набора записей отчета во время выполнения проблематична. Это МОЖЕТ быть возможным в реальных проектах доступа к данным, но определенно не в обычных MDB.
Вы МОЖЕТЕ создать сквозные запросы в Access MDB, но я не уверен насчет передачи параметров. Вам, вероятно, придется динамически задавать текст запроса с жестко заданными параметрами, а затем запускать отчет. Это может стать проблемой для многопользовательской базы данных, если каждый человек не запускает свой собственный интерфейс.
Я рекомендую перейти к варианту 1 или 2. Вариант 1 кажется самым простым, но - это , который нужно изучить, прежде чем вы станете легким с ADP через MDB. Дайте мне знать, если вы думаете, что пойдете по этому пути, и я поделюсь с вами некоторыми хитростями. Тем не менее, это, вероятно, проще, чем то, что вы делаете сейчас, все вручную. (Ой!) Второй вариант был бы наиболее быстрым для реализации сразу и без добавления ключей в ваш текущий навык с помощью MDB.
UPDATE
Итак, если вы хотите связать таблицы, вот код, с которого можно начать:
Sub TableRelink(MdbPath As String)
Dim Table As DAO.TableDef
Dim Tables As DAO.TableDefs
Set Tables = CurrentDb.TableDefs
For Each Table In Tables
If Table.SourceTableName <> "" Then 'If a linked table
Table.Connect = ";DATABASE=" & MdbPath 'Set the new source
Table.RefreshLink
End If
Next
End Sub
Этот код предназначен для файлов MDB, но некоторые раскопки быстро дадут вам правильные свойства и значения для использования в связанных таблицах SQL Server.
Другая мысль
Я только что подумал о другом возможном способе решения только той проблемы, с которой вы столкнулись: используйте сессионную "временную" таблицу в Access. Создайте локальную таблицу, в которой есть все столбцы, возвращаемые представлением, плюс столбец GUID. Когда отчет запущен, вставьте содержимое представления в локальную таблицу, указав новое значение GUID. Установите для источника данных отчета значение SELECT * FROM MyViewTempTable WHERE GUID = '{GUID}'. Простая проблема решена. На report_close удалите из таблицы. Возможно, также укажите дату и удалите через 10 дней, если какие-либо строки останутся позади.