Отчет о доступе к вызову 2007 от МФЦ - PullRequest
1 голос
/ 23 ноября 2011

Может кто-нибудь пролить свет на то, как вызвать отчет о доступе (2007) из приложения MFC? У меня есть форма с кнопкой, и при нажатии на нее должен отображаться отчет.

Я пробовал это Код Проектное предложение он показывает отчет как экран флэш-памяти, а затем исчезает.

есть предложения?

1 Ответ

1 голос
/ 23 ноября 2011

Я помогаю поддерживать приложение MFC, которое использует Access 2003/2007 для своих отчетов.Это система, которую мы пытаемся изменить - Access не очень гибок, и наш «хостинг» Access внутри MFC немного случайен.

Я не был первым участником разработки архитектуры хостинга ипочему все было реализовано определенным образом, но вот краткое описание двух трудностей, с которыми мы сталкиваемся с Access в нашем приложении:

Только установка полного доступа регистрирует Access.Application интерфейс автоматизации OLE .Если вы можете гарантировать, что у ваших пользователей будет полная установка Access, то это не относится к вам (CLSIDFromProgID, за которым следует CoCreateInstance, вы получите интерфейс автоматизации), но если вам нужно получить Access.ApplicationОбъект для Access Runtime, тогда нужно сделать дополнительные сантехнические работы.Вам нужно начинать msaccess.exe и бездельничать с GetActiveObject и Sleep, пока не найдете экземпляр интерфейса .Существует KB145707 , который показывает два способа подключения, хотя и в VBA.

Доступ не предназначен для встраивания в другое приложение .Для отчетов Access нет Excel.Sheet эквивалента.Вы можете увидеть это в своем примере CodeProject - он выводит отчет в промежуточный файл .html, а затем использует встроенный веб-браузер для отображения отчета.

Наше приложение выполняет здесь неправильную вещь иИграет со стилем окна, родителем и положением приложения Access и заставляет его выглядеть так, будто в нашем приложении есть отчет, но это всего лишь визуальная ловкость рук.Хотя нет ничего плохого в том, чтобы иметь родительские / дочерние окна из разных процессов , в этом случае это оставляет нам некоторое нежелательное поведение.

  1. Мы используем пользовательскую ленту Officeи поскольку лента Access 2007 является частью оконной рамы, пользователь может перетаскивать Access из нашего приложения.

  2. Когда процесс завершается, он теряет любой «передний план», который у него был.Когда msaccess.exe закрывается из-за того, что пользователь закрыл отчет, наше приложение оказывается в нижней части z-порядка окна (из-за способа, которым мы создали окно Access).

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

  • Microsoft Report Viewer это легкая, но мощная библиотека отчетов.Он использует .NET, но вы можете использовать прокси-приложение для размещения элемента управления.Сверху допустимо иметь родительские / дочерние окна от разных процессов.Если вы можете получить свое приложение на C ++ / CLI, это будет еще проще с CWinFormsControl.

  • SAP Crystal Reports также бесплатно,но он не такой легкий, как Report Viewer.

Если вам абсолютно необходимо использовать Access, я бы лично отказался от использования интерфейсов автоматизации и использовал AutoExec*Макрос 1064 * с переключателем /cmd, чтобы описать, какой отчет я хочу отрисовать и куда его отрендерить.AutoExec включится, отобразит отчет и закроет Access (здесь есть пример техники ).После создания выходного файла вы можете взять его и встроить в свое приложение.Пара предложений:

  1. Если ваши отчеты просты, используйте пример .html и веб-браузер из статьи CodeProject.

  2. Если ваши отчеты имеют сложное форматирование, вы можете вывести отчет в виде файла .snp (моментальный снимок) и затем отобразить его в своем приложении ( Access Snapshot Viewer является встраиваемым - PROGID равен snpvw.Snapshot Viewer Control.1).

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