上一篇文章说到在LotusScript编写类时采用继承有两类情况,接下来的几篇文章介绍的就是其中的一种:为了重用代码。将Notes数据导出到Excel就是展现这类继承的一个很好场合。
微软的Excel有很多方便有用的处理数据的功能,如筛选、排序、计算,还能够生成图表。很多公司用它来做出精美、复杂的报表。Lotus Notes的视图虽然也有很多功能,但是在多条件组合查询、统计等方面上,常常不能满足报表的需求(在客户端上,部分组合查询可以通过自定义按字段全文检索实现,但对用户来说,操作不够友好直观。在Web开发中,可以很大程度上完成这些功能,但是工作量不小,效率也不高)。所以,将Notes数据导出到Excel里,在其中加工和展示,是很普遍的实践。
(Lotus Notes和微软产品的关系,说起来很有意思。微软挑战Lotus的产品的历史悠久,也很成功。它的Office取代的正是Lotus公司的SmartSuite办公套件,Lotus 1-2-3当年的地位就和今天的Excel一样,而IBM和R8一起推出的基于OpenOffice的Symphony办公软件虽然免费,并没有在市场上掀起任何波澜,完全无法挑战假想敌MS Office。曾经在世界500强企业里广泛应用的邮件和个人信息平台Lotus Notes/Domino现在的市场份额小得可怜,而且还在持续缩水。这一变化中最大的挑战者和获益者正是微软的Outlook/Exchange。尽管如此,Lotus Notes客户机的开发重心还是瞄准Windows操作系统。在R6面世很久之后,IBM才推出了Linux和苹果操作系统上的Domino Designer版本,此前Windows是主要个人操作系统中DominoDesigner唯一支持的平台。Notes客户端也做了很多和Windows平台结合的功能,比如用Windows域帐户登录。)
回到本文的主题,在企业应用中,将Notes数据导出到Excel很广泛,而且有几种不同的需求:第一种就是简单将视图里的数据导出成Excel里的表格型(tabular)数据,一条文档对应一行。这种平凡的需求不用编程,只要调用Notes客户端的导出功能,选择文件格式为CSV,并且在命名文件时添加扩展名.csv,导出的文件默认就可以用Excel打开。第二种同样是导出成表格型数据,但是Excel工作表里的一行不简单对应Notes视图里的一行或者一个文档,而要进行各种各样的计算,比如读取父文档、子文档或配置文档里的数据。笔者把这种报表命名为表格型。第三种比较复杂,在Excel里已经设计好报表的样式和格式。样式是指抬头、列标题、字体、表格线条、颜色这些使报表更美观的外观设置。格式是指数据的含义和布局,比如哪一列显示什么信息,什么地方显示汇总等等。笔者把这种报表命名为模版型。
表格型和模版型的报表都需要编程,尽管差别不小,还是有相当部分共同的代码,我们可以一个父类来编写公共的接口和方法。具体开发某个报表时,我们要重载如何计算和写入每一行数据的方法。
在我们的例子中,用户单击一个报表按钮,在弹出的对话框里,选择报表的类型和参数,单击确定等待报表生成和弹出。
上面的对话框里,确定按钮的代码的重要部分如下:
Sub Click(Source As Button) … ‘Declare and initialize the necessary variables. Dim report As Report If reportType="Report1" Then Set report= New Report1(officeCode, strYear) Elseif reportType="Report2" Then Set report=New Report2(Cint(strYear), Cint(strMonth)) Elseif reportType="Report3" Then Set report=New Report3(Cint(strYear), Cint(strMonth)) End If Call report.Export … End Sub
变量report被声明成父类Report,根据用户的选择再创建不同的子类实例传递给它,最后调用父类的公共方法Export()导出报表。这是一个展现面向对象思想中多态性的典型例子。在像LotusScript这样一门面向对象的风格只是可能而没有被提倡和重视的语言中,自发地发现多态性思想的应用,即使现在笔者看来,都会惊异于面向对象思想给编程带来的广泛的便利。
在后续文章里,我们会详细讨论生成报表的代码和两种报表的生成方法。