Как создавать отчеты в Access через ADO, когда данные находятся в SQL Server? - PullRequest
0 голосов
/ 21 августа 2010

У меня есть проект Access 2003, в котором все данные хранятся в SQL Server 2008. Я использую ADO для просмотра / обновления данных через формы, которые абсолютно не связаны. Например, форма имеет несколько текстовых и комбинированных полей. Когда форма загружена, я использую ADO для вызова хранимой процедуры в SQL SQL, она возвращает набор записей, и я заполняю элементы управления через VBA данными из набора записей. Мне нравится этот подход, потому что только VBA хранится в Access. Нет данных (на самом деле строки доступа хранятся в Access, но это так!).

Моя проблема в том, что делать, когда дело доходит до отчетов. Я хочу создавать отчеты, основанные на представлениях, созданных в SQL Server, однако я бы хотел, по возможности, избегать статических ссылок на представления непосредственно из Access. Можно ли динамически задавать источник записей отчета во время выполнения, чтобы он был результатом представления SQL Server? Если да, то как можно разработать идентификатор отчета? Access не содержит никаких данных?

Подробнее ... Причина, по которой я хочу избежать привязки к представлению в Access, - это среда, в которой приложение Access может запускать изменения (Производство, Разработка, Тестирование). В настоящее время всякий раз, когда я обращаюсь к хранимым процедурам базы данных, я просматриваю строку подключения (на основе Active Directory, поэтому пароли не хранятся) в единственной таблице, которая хранится в Access.

Спасибо за любую помощь.

1 Ответ

2 голосов
/ 21 августа 2010

Прежде всего, давайте проясним: у вас нет «проекта» Access 2003. У вас есть база данных Access 2003.

Реальный проект доступа к данным не может иметь локальные таблицы и использует SQL Server в качестве серверной части. При просмотре таблиц вы видите те, которые существуют на сервере, а в разделе «Запросы» вы видите представления, функции и хранимые процедуры, которые существуют на сервере. Вы можете использовать «Мастер масштабирования», чтобы превратить базу данных Access в проект данных Access (или, возможно, лучше, просто создать новый ADP (проект данных Access) и импортировать все формы, отчеты, макросы и модули.

Вот мои идеи:

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

    Application.CurrentProject.CloseConnection
    Application.CurrentProject.OpenConnection NewConnString
    

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

  2. Нет ничего плохого в использовании связанных таблиц. Просто напишите процедуру, которая перебирает все таблицы и обновляет их, чтобы они указывали на нужный сервер, когда вы хотите изменить среду. Разница между "статическим" связыванием и "динамическим" связыванием - это всего лишь одна процедура VB, которая просматривает все таблицы и связывает их - просто peasy.

  3. Установка динамического набора записей отчета во время выполнения проблематична. Это МОЖЕТ быть возможным в реальных проектах доступа к данным, но определенно не в обычных MDB.

  4. Вы МОЖЕТЕ создать сквозные запросы в 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 дней, если какие-либо строки останутся позади.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...