• 当前位置:首页>>VC语言>>VC基础教程>>向应用程序添加报告
  • 向应用程序添加报告
  •     人们都希望为数据库应用程序至少创建一个报告。即使是像我们在本章创建的这样一个小的应用程序,也可能因报告类型丰富多采而容光无限。例如,概述报告通过摘要相似的数据来从整体上显示数据库的内容(甚至摘要的方式也可以创建多个报告),细节报告则显示所有的记录。除了报告所包含的数据及其出现的顺序以外,还有一些事情要考虑,比如从审美观点来讲的报告的外观。你可能不想花时间用最佳的文字和图形为工作组会议打印报告,但我可以肯定,经理会议通常需要这样的报告。
        我无法在一个章节中告诉你创建报告的每一个要点。本章要讨论的是关于创建一批复杂报告的技巧,其中包括浏览数据的各种方法,并介绍一个如何完成上述部分目标的程序设计示例。
        存在打印困难吗
        创建一个你所需要的报告可能有点困难,在某些情况下也确实是如此。处理一项工程时,可能五个经理都想把他们自己的一组报告添加到应用程序中去,而你知道,在允许的时间范围内,你确实只有工夫创建一两组报告。不要失望,如果花点时间分析一下经理们在期待些什么,并且在打印过程中增加一点灵活性的话,就可能根本没有必要去编写所有的报告了。
        当你试图减低应用程序的复杂性时,应该做的第一件事是,把所需的报告分解成几个简单的需求。以这样的列来创建一个表是个好主意,即按列说明简单的需求,然后在旁边列出报告。如果在报告中找到了某种对比方式,就有可能把几个报告合并成一个,然后按需要添加配置对话框。下面是关于如何把报告分解成一组部件的一些想法。
        排序 每一个报告都要求某种排序。否则,就会形成一系列没有人能够理解的紊乱数据。请记住,数据库的一个主要目标是,把所包含的数据组织起来,使它更容易被理解。你的报告也应该是一样。排序是一种把两个或多个报告合并到单个程序设计任务中的最容易的方式。
        分组 有时候你想要细节报告在单个标题下组织数据。例如,你可能在合同数据库中用ZIP代码创建分组。ZIP代码作为标题显示,该ZIP代码区中的所有合同都在该标题下按顺序排列。谈到组织数据时,分组和排序并没有太大的差别。但是,即使打印输出的主要部分都相同,把两个报告和不同的组结合起来也是非常困难的。原因很简单:把各种报表头组织在一起将使得打印例程十分复杂。然而,你可以把一个包含分组,另一个不包含分组的两个相似报告结合起来。此时,你只需要在程序中提供一个开关,用它打开标题或者关闭标题就可以了。
        分组合计/摘要 许多报告会提供这样的脚注,整个报告或一组有关的数字在那里被记录下来。脚注还有很多其它的统计用法,但数字记录是最普通的类型。在有组标题的情况下,如果有可能,要把两个有不同合计或者摘要的报告结合起来是很困难的。但是,可以把未使用任何类型脚注的报告和使用了脚注的报告结合起来,只要它们的列是相同的即可。
        报告外观 如果你有两个报告使用相似的数据但具备不同的外观风格,那么可以试着把它们结合起来。如果唯一的差别只是文字所用的字体或者是像添加到报告顶端的公司徽标这样的小窗口,那么创建两个不同的打印例程就没有什么实际意义了。
        细节数据的层次 某些报告只是其它报告的简单综述。换言之,有一些报告完全只使用父数据。通过以某种方式摘要子记录来提供综述信息。把综述报告和显示数据库详细内容的报告结合起来相当容易。当然,这也存在着报告中包含什么内容的问题。例如,如果一个报告以售货员顺序显示本月的每一张发票,而另一个报告显示各位售货员的总销售额,那么你就可以把这两个报告合成为一个。使用一个简单的开关来判断用户是要摘要数据或者要按原样打印子表中的每一个记录。
        筛选 在数据库中寻找部分而非全部的记录,对人们来说十分普通。如果两个报告唯一的差别是用来决定该筛选哪些记录,那么你就可以把这些报告结合起来。筛选是你对DBMS所做的查询的函数,而不是你编写的代码的函数。换言之,你要做的只是更改一两行代码。
        此时,你可能会感到奇怪,为什么不创建一个带有众多配置对话框的单个报告,让用户来产生他们所需的报告呢?不这样做有几个充足的理由。第一,大多数用户会对创建报告所需的大量对话框不知所措。你会发现,和自己设计报告相比,你还要花大量的时间让用户学会提高创建报告的速度。第二,你要引进自定义报告,还要为用户创建某种把那些报告存盘的方法,这样他们以后才能在无需很多支持的情况下,创建相同的报告。
        避免通用报告的另一个原因是与安全有关的风险。如果提供给用户太多不同的创建自定义报告的方法,你可能会发现,这也带来了很多的安全漏洞。管理上通常要保证公司的秘密数据不会误入他人之手。这意味着,除了要增强数据库本身的安全性外,还要增强已打印文件的安全性并把它牢牢地控制住。
        可移植性 当使用Windows碰到打印机不兼容的问题时,不要误以为是安全性问题。当然,Windows为打印例程提供了一致的程序设计API,这使编程工作变得更加容易。你还得到了打印驱动程序支持的明显优点棗至少不必像DOS环境下的程序员那样,还要编写自己的驱动程序。但是,优点也就这么多。厂商仍然有可能提供单薄的驱动程序,这使得很难从看上去正确的应用程序中得到正确的输出。你还会发现,由于产生输出的相对复杂性,与其它开发人员相比,这些问题会更多地发生在数据库程序员身上。仅仅把文本和图形添加在一起并保持各种表格元素对齐就可能存在某些问题。可以这么说,把应用程序从测试环境转移到实用环境中时,会遇到大量与打印机有关的问题。即使是世界上最好的测试也不能帮助你避免设计粗糙的打印驱动程序所带来的问题以及其它各种各样的兼容性问题。
        给应用程序添加打印功能
        看过了为数据库应用程序编写打印例程的复杂性,现在我们来看一看解决这些问题的办法。幸运的是,在我们使用的ADO1应用程序中,现在已经有了所需的三个函数框架。我们只看一看CADO1View类。有三个函数:OnPreparePrinting(),OnBeginPrinting()和OnEndPrinting()。第一个例程让你设置打印机并完成其它的预备任务,如在查询中保存当前的记录数,这样才能在打印作业完成后返回到那里。第二个例程OnBeginPrinting()让你准备设备的上下文信息。可以把设备上下文看作是画家的调色板棗用它来绘制想要发送给打印机的信息。在本示例中,我们会经常碰到Windows GDI(图形设备接口)这么一个特别的东西,所以你迟早会很好地理解设备上下文究竟意味着什么。最后,OnEndPrinting()例程让你把应用程序的总体设置恢复成打印前的条件。例如,你应该在这里把查询指针返回到其打印前的记录处。
        哎,还遗漏了一个函数。我们还没有用来向打印机发送数据的打印例程。我们要做的第一件事是使用MFC ClassWizard向程序中添加一个OnPrint()函数。OnPrint()函数包含实际把打印信息输出到打印机所需的代码。其它与打印有关的任务也调用这个例程,如大多数应用程序提供的Print|Preview(打印|预览)命令。使用View|ClassWizard(视图|类向导)命令打开MFC ClassWizard对话框。在Class Name(类名)域中选择CADO1View,加亮Object IDs(对象ID)列表中的CADO1View和Messages(消息)列表中的OnPrint。单击AddFunction(添加函数)。Member Functions(成员函数)列表中应该添加了一个新函数,如下图所示。

    [1] [2] [3] 下一页  

  • 上一篇:ActiveX适用的场合
    下一篇:使用OLE-DB或ADO建立数据库应用程序