来自 MFC 的呼叫访问 2007 报告

Posted

技术标签:

【中文标题】来自 MFC 的呼叫访问 2007 报告【英文标题】:Call access 2007 report from MFC 【发布时间】:2011-11-23 06:12:37 【问题描述】:

谁能阐明如何从 MFC 应用程序调用访问报告(2007)? 我有一个带有按钮的表单,点击它应该会显示报告。

我试过这个 Code Project suggestion 它像闪屏一样显示报告,然后消失。

有什么建议吗?

【问题讨论】:

【参考方案1】:

我帮助维护一个使用 Access 2003/2007 进行报告的 MFC 应用程序。这是我们正在尝试更改的系统 - Access 不是很灵活,我们在 MFC 中“托管”Access 有点随意。

我不是托管架构设计的第一方,也不是以特定方式实现事物的原因,但这里简要概述了我们在应用程序中使用 Access 时遇到的两个困难:

只有完整的 Access 安装会注册 Access.Application OLE 自动化接口。如果您可以保证您的用户将完全安装 Access,那么这将不适用于您(CLSIDFromProgID 后跟 CoCreateInstance 将为您提供自动化界面),但如果您必须获得 Access.Application Access Runtime 的对象,那么还有一些额外的工作要做。您需要启动msaccess.exe 和mess around with GetActiveObject and Sleep until you get find an instance of the interface。 KB145707 显示了两种连接方式,尽管是在 VBA 中。

Access 并非旨在嵌入到其他应用程序中。 Access 报告没有 Excel.Sheet 等效项。您可以在 CodeProject 示例中看到这一点 - 它将报告呈现到中间 .html 文件,然后使用嵌入式 Web 浏览器控件来显示报告。

我们的应用程序在这里做了错误的事情 (TM),并调整了 Access 应用程序的窗口样式、父级和位置,使它看起来像是在我们的应用程序中有一个报告,但这只是一种视觉上的花招。虽然there's nothing wrong with having parent/child windows from different processes,但在这种情况下,它会给我们留下一些不受欢迎的行为。

    我们使用自定义 Office 功能区,并且由于 Access 2007 的功能区是窗口框架的一部分,因此用户可以将 Access“拖出”我们的应用程序。

    当进程终止时,它会放弃它拥有的任何“前景焦点”。当msaccess.exe 因为用户关闭报告而关闭时,我们的应用程序最终位于窗口 z 顺序的底部(由于我们将 Access 窗口作为父级的方式)。

我认为您应该查看实际的报告库,并将它们与您将 Access 集成到您的应用程序所需的工作进行比较。

Microsoft Report Viewer 是一个轻量级但功能强大的报告库。它使用 .NET,但您可以使用代理应用程序来承载控件。从上面看,拥有来自不同进程的父/子窗口是有效的。如果您可以让您的应用程序使用 C++/CLI,那么使用 CWinFormsControl 会更容易。

SAP Crystal Reports 也是免费的,但不如 Report Viewer 轻量级。

如果您绝对必须使用 Access,我个人会避免使用自动化界面,而是使用带有 /cmd 开关的 AutoExec 宏来描述我想要呈现的报告以及将其呈现到的位置。 AutoExec 将启动,呈现报告并关闭访问(有一个技术示例here)。创建输出文件后,您可以将其嵌入到您的应用程序中。几个建议:

    如果您的报告很简单,请坚持使用 CodeProject 文章中的 .html 和 Web 浏览器示例。

    如果您的报告格式复杂,您可以将报告输出为.snp(快照)文件,然后将其显示在您的应用程序中(Access Snapshot Viewer 是可嵌入的 - PROGID 是snpvw.Snapshot Viewer Control.1)。

【讨论】:

以上是关于来自 MFC 的呼叫访问 2007 报告的主要内容,如果未能解决你的问题,请参考以下文章

访问每个公司的 2007 VBA 报告电子邮件

帮助访问 2007 sql 表? [关闭]

Powershell 与 Access 2007 的交互,如何将报告另存为 PDF?

访问 XP 报表总和计算

来自访问数据库的 Vb.Net 预览报告

访问报告大小无法控制!