任何人都可以了解如何从MFC应用程序调用访问报告(2007)? 我有一个带按钮的表单,点击它时会显示报告。
我试过这个 Code Project suggestion 它会像闪屏一样显示报告然后消失。
有什么建议吗?
答案 0 :(得分:1)
我帮助维护一个使用Access 2003/2007进行报告的MFC应用程序。这是一个我们试图改变的系统 - Access不是很灵活,我们在MFC中“托管”Access有点随意。
我不是托管架构设计的第一方,以及为什么事情以某种方式实施,但这里简要介绍了我们在应用程序中使用Access的两个难点:
只有完整的Access安装才会注册Access.Application
OLE自动化界面。如果您可以保证您的用户将完全安装Access,那么这将不适用于您(CLSIDFromProgID
后跟CoCreateInstance
将获得自动化界面),但如果您必须获得Access Runtime的Access.Application
对象,然后有一些额外的管道要做。您需要启动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浏览器控件显示报表。
我们的应用程序在这里完成了Wrong Thing(TM)并且使用Access应用程序的窗口样式,父级和位置,并使它看起来像我们的应用程序中的报告,但它只是一个视觉上的手段。虽然there's nothing wrong with having parent/child windows from different processes,但在这种情况下,它给我们留下了一些不良行为。
我们使用自定义Office功能区,并且由于Access 2007的功能区是窗口框架的一部分,因此用户可以将Access“拖出”我们的应用程序。
当一个进程终止时,它会放弃它所拥有的任何“前景焦点”。当msaccess.exe
关闭因为用户已关闭报告时,我们的应用程序最终会在窗口z-order的底部(由于我们已经成为访问窗口的父级)。
我认为您应该查看实际的报告库,并将它们与将Access集成到您的应用程序中所需的工作进行比较。
Microsoft Report Viewer是一个轻量级但功能强大的报告库。它使用.NET,但您可以使用代理应用程序来托管控件。从上面看,来自不同进程的父/子窗口是有效的。如果您可以将您的应用程序升级到C ++ / CLI,那么使用CWinFormsControl
会更容易。
SAP Crystal Reports也是免费的,但它不像报告查看器那么轻量级。
如果您绝对必须使用Access,我个人会避免使用自动化界面并使用AutoExec
宏和/cmd
开关来描述我想要呈现的报告以及在何处呈现它来。 AutoExec
将启动,呈现报告并关闭Access(有一个技术示例here)。创建输出文件后,您可以将其嵌入应用程序中。几点建议:
如果您的报告很简单,请坚持使用CodeProject文章中的.html
和网络浏览器示例。
如果您的报告具有复杂的格式,您可以将报告输出为.snp
(快照)文件,然后将其显示在您的应用中(Access Snapshot Viewer可嵌入 - PROGID为{{ 1}})。