MFC的2007年呼叫接入报告

Call access 2007 report from MFC

本文关键字:接入 报告 呼叫 2007年 MFC      更新时间:2023-10-16

有没有人能从MFC应用程序中调用访问报告(2007)?我有一个带有按钮的表单,当点击它时,它应该显示报告。

我试过了代码项目建议它像闪屏一样显示报告,然后消失。

有什么建议吗?

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

我不是主机架构设计的第一方,也不知道为什么要以某种方式实现,但这里简要概述了我们在应用程序中使用Access遇到的两个困难:

只有完整的Access安装注册Access.Application OLE Automation接口。如果你能保证你的用户将有一个完整的Access安装,那么这将不适用于你(CLSIDFromProgID之后的CoCreateInstance会给你一个自动化接口),但如果你必须得到一个Access.Application对象的访问运行时,那么有一些额外的管道要做。您需要启动msaccess.exe,并在GetActiveObjectSleep中进行操作,直到找到接口的实例。KB145707显示了两种连接方式,尽管是在VBA中。

Access不能嵌入到另一个应用程序中。Access报告没有相应的Excel.Sheet。您可以在CodeProject示例中看到这一点——它将报告呈现给中间的.html文件,然后使用嵌入式web浏览器控件来显示报告。

我们的应用程序在这里做了错误的事情(TM),并摆弄了Access应用程序的窗口样式,父节点和位置,使它看起来像在我们的应用程序中有一个报告,但这只是一个视觉上的技巧。虽然拥有来自不同进程的父/子窗口没有什么问题,但在这种情况下,它会给我们留下一些不希望的行为。

  1. 我们使用自定义的Office Ribbon,因为Access 2007的Ribbon是窗口框架的一部分,所以用户可以将Access拖出我们的应用程序。

  2. 当进程终止时,它放弃了它所拥有的任何"前景焦点"。当msaccess.exe关闭时,因为用户关闭了一个报告,我们的应用程序最终在窗口z顺序的底部(由于我们已经父化Access窗口的方式)。

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

  • Microsoft Report Viewer是一个轻量级但功能强大的报表库。它使用. net,但您可以使用代理应用程序来托管该控件。从上面来看,拥有不同进程的父/子窗口是有效的。如果您可以将应用程序移植到c++/CLI,那么使用CWinFormsControl就更容易了。

  • SAP Crystal Reports也是免费的,但是它不像Report Viewer那么轻量级。

如果你绝对必须使用Access,我个人会避开使用自动化接口,并使用AutoExec宏和/cmd开关来描述我想渲染哪个报告以及渲染到哪里。AutoExec将启动,呈现报告并关闭Access(这里有一个技术示例)。一旦创建了输出文件,就可以将其嵌入到应用程序中。几个建议:

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

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