来自MFC的呼叫访问2007年报告

时间:2011-11-23 06:12:37

标签: c++ ms-access mfc report

任何人都可以了解如何从MFC应用程序调用访问报告(2007)? 我有一个带按钮的表单,点击它时会显示报告。

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

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

我不是托管架构设计的第一方,以及为什么事情以某种方式实施,但这里简要介绍了我们在应用程序中使用Access的两个难点:

只有完整的Access安装才会注册Access.Application OLE自动化界面。如果您可以保证您的用户将完全安装Access,那么这将不适用于您(CLSIDFromProgID后跟CoCreateInstance将获得自动化界面),但如果您必须获得Access Runtime的Access.Application对象,然后有一些额外的管道要做。您需要启动msaccess.exemess 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,但在这种情况下,它给我们留下了一些不良行为。

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

  2. 当一个进程终止时,它会放弃它所拥有的任何“前景焦点”。当msaccess.exe关闭因为用户已关闭报告时,我们的应用程序最终会在窗口z-order的底部(由于我们已经成为访问窗口的父级)。

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

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

    • SAP Crystal Reports也是免费的,但它不像报告查看器那么轻量级。

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

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

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