基于AC Report 组件的报表打印的设计与实现

时间:2022-04-16 04:50:52

基于AC Report 组件的报表打印的设计与实现

摘要:介绍了一种基于AC Report组件的报表打印的解决方案,提出了解决组件数据读取问题的通用方法,并通过一个例子详细说明了报表打印的设计与实现,具有较强的通用性和灵活性。

关键词:AC Report;组件;报表打印

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)10-2236-03

Abstract: This paper introduced a solution of report printing which is based on AC Report component. A method is proposed to solve the problem of reading data of the component. The design and implementation of the solution are illustrated through an instance, which have a strong versatility and flexibility.

Key words: AC report; component; report printing

报表打印作为信息管理系统的重要组成部分,是系统开发工作的一项重要内容。目前,由于传统程序语言报表打印功能的处理能力较弱和用户要求越来越丰富的实际情况,组件技术凭借其较强的通用性、灵活性等优势,逐步成为软件开发人员进行报表打印功能开发的首要选择[1-3]。

当前应用较多的报表组件主要有Crystal Report、Grid++ Report和AC Report等,其中AC Report是一款国内最早的基于表格,支持图文混排、公式和脚本的中国式报表组件。由于AC Report组件具有表格的灵活性、功能的全面性、样式的多样性等特性,并且更适合中国本土化报表习惯,从而成为了国内报表开发领域使用的主流组件。该文以某被装管理信息系统中基于AC Report组件的报表打印的设计实现为例进行讨论。

1 报表打印的功能设计

1.1 打印流程

基于AC Report组件的报表数据是直接从数据库读取的,打印流程比较简单:

1)打印开始;

2)系统读取并加载数据库中的报表数据到报表模板的数据集中;

3)系统调用报表模板,模板根据插入的数据字段读取数据集中的数据,并将其加载到报表中,完成打印或打印预览动作。

1.2 数据库设计

如上节所述,AC Report组件在报表生成中会直接调用报表模板,模板再根据报表的数据字段读取数据库数据并将其输出。在此过程中,往往有两个问题需要注意。

一是数据转换问题。由于组件技术的通用特征,数据库中数据的格式和内容不一定正是程序开发人员想要的输出,这就需要对那些不符合要求的数据进行转换,主要是增加需要的数据,简单地如在日期数据中添加“年、月、日”等。为了不修改原始数据,通用的解决方法是在数据库中创建新的数据表,打印时将转换之后的报表数据写入到相应的表中,以备模板直接读取进行打印。

二是数据冲突问题。以上方案虽然解决了报表数据转换问题,但由于每次打印都需要读写数据库,这在分布式系统中,特别是在报表打印比较集中的时期,极有可能造成数据读写冲突。为此,提出了另一种解决方案,即在本地创建一个轻便的Access数据库,用它来储存打印所需的全部数据,打印时先清空相应的数据表,再把所需数据转换后写入其中,当系统调用报表模板后,模板读取库中数据并将其加载到报表中。由于数据库的读写都在本地,从而很好的解决了冲突问题。

1.3 报表模板设计

报表模板的设计都是在AC Report组件的报表设计器中完成的,它的风格近Word表格风格,但它比Word或Excel表格更加灵活,而且功能全面,支持多种报表样式和多种单元格样式。系统开发人员可以根据用户需求,很方便的完成清单式、分组式、交叉式以及子报表等样式设计,也可以在单元格中完成图像、图表、RICH文本、条形码等的编辑,还可以在报表中嵌入Word或Excel文档。设计完报表和单元格样式后,再插入需要的数据字段、变量、公式等。

2 报表打印的功能实现

为了更好的讨论报表打印的实现过程,现以Visual Studio 2005环境下MFC编写的基于AC Report2.89组件的被装服务系统为例,进行具体的阐述说明。

2.1 数据库的设计实现

在被装服务系统中,需要对进出库各项业务的相关清单报表进行打印,现在以正常入库为例来介绍数据库的设计实现。使用Access软件创建一个print.mdb数据库,建一张bzfw_order数据表来储存订单基本信息。由于正常入库的一个订单中可能包含多个被装条目,因此还需要再建一张bzfw_orderdetail表来储存订单中被装条目的信息,它们的设计如下图所示。

2.2 报表模板的设计实现

报表模板的设计实现是报表打印的核心工作,主要包括两方面的内容:报表设计器中数据集的加载和报表模板设计。

2.2.1 报表设计器中数据集的加载

模板中数据字段的插入是通过模板设计器的数据集来完成的,因此需要用记录集对象指针来获取报表数据,得到记录集后加载到设计器的数据集里。仍然以正常入库为例,首先创建一个CPrintDlg类,然后在头文件中定义bzfw_order和bzfw_orderdetail两个记录集对象指针,在Createobjects()函数中创建记录集对象实例,代码如下:

HRESULT hr;

hr = bzfw_order.CreateInstance(__uuidof(Recordset));

if(!SUCCEEDED(hr))

return -1;

hr = bzfw_orderdetail.CreateInstance(__uuidof(Recordset));

if(!SUCCEEDED(hr))

return -1;

然后在RefreshData()函数中调用AddDataToAc(CString sql, CString sTableName, _RecordsetPtr rs)函数来得到记录集,并将其加载到设计器的数据集中。其代码如下:

AddDataToAc("select * from bzfw_order ","bzfw_order",bzfw_order);

AddDataToAc("select * from bzfw_orderdetail","bzfw_orderdetail",

bzfw_orderdetail);

2.2.2 报表模板设计实现

在AC Report组件提供的报表设计器中,可以很方便的编辑报表格式和内容。根据正常入库清单特性,设计上下两个表格分别用来显示订单基本信息和被装条目信息。在报表样式设置对话框中将其样式设置为主细报表,并设置主项、细项、页尾、表尾的位置以及主项数据和明细数据的数据连接等。设计好报表版式,再向模板中插入文本、数据字段、日期页码等数据。一个设计完成的报表模板如下图2所示,最后将其保存到项目指定的文件夹中,等待打印程序的调用。

2.3 打印和打印预览的实现

当用户触发某一报表的打印后,系统首先将相应的报表数据写入到数据表中。然后创建一个CPrintDlg对象,利用对象的ReportName成员来存储打印所用的模板名称,最后弹出打印对话框,代码如下:

CPrintDlg printdlg;

printdlg.ReportName = "bzfw_NI.apt";

printdlg.DoModal();

在打印对话框中有“打印”和“打印预览”两各选项,选择后执行以下代码:

macSetReportFile((_bstr_t)(ReportPath + ReportName));

if (((CButton *)thisGetDlgItem(IDC_RADIO1))GetCheck())

macPreview();

else

if (((CButton *)thisGetDlgItem(IDC_RADIO2))GetCheck())

macPrint();

通过SetReportFile函数设置模板调用的完整路径。而后面5行代码则是根据用户选择执行打印或者打印预览动作。而在打印预览中可以根据用户需要将报表导出成多种格式的文件。正常入库清单的打印预览如图3所示。

3 结论

综上所述,基于AC Report的报表打印方案具有较强的通用性和灵活性,而且功能丰富,可以根据不同的打印需求,高效地完成报表输出的程序设计,大大缩短系统开发周期。

参考文献:

[1] 张曦泽,王华文,王中秋.基于组件的报表自动生成系统的研究与实现[J].计算机工程与设计,2005,26(5):1358-1360.

[2] 戚玮玮,宋朝辉,宋大雷,栾新.B/S模式下条形码票证自定义打印的设计和实现[J].计算机应用与软件,2010,27(12):170-173.

[3] 陶剑青,黄志球,沈国华.一个通用报表工具的设计与实现[J].计算机工程与设计,2003,24(10):34-36.

上一篇:个性化推荐系统的采集模块研究 下一篇:基于World Wind 三维模型加载的视锥裁剪改进算...