报表引擎

 

报表引擎规范说明

 

 

 

 

 

 

报表引擎标准

 

 

 

 

 

 

 

 

作者: 胡春国

 

创建日期:2004-09-17

 

网站:www.blueworld.com.cn

邮件地址:kevin1915@hotmail.com

                                Report Engine Specification Version: 1.0                              

 

 

目录

 

1.          目的... 8

2.          概述... 8

3.          假设... 9

4.          远景... 9

5.          引擎内部结构... 9

5.1       总体结构... 10

5.2       报表引擎接口... 13

5.2.1   客户应用接口... 14

5.2.2   应用程序接口... 14

5.2.3   管理监视接口... 15

5.2.4   报表引擎定义接口... 15

5.2.5   报表格式定义接口... 16

5.2.6   报表引擎协同接口... 16

5.2.7   策略引擎接口... 16

5.3       技术框架... 17

5.3.1   什么是总线... 17

5.3.2   总线的优点与缺点... 17

5.3.3   系统总线结构... 18

6.          报表格式定义语言(RFDL) 20

6.1.1   通用结构... 20

6.1.1.1   颜色... 20

6.1.1.2   字体... 20

6.1.1.3   显示格式... 20

6.1.1.4   函数... 20

6.1.1.5   线条... 20

6.1.1.6   图片... 20

6.1.1.7   链接... 20

6.1.1.8   引用数据... 20

6.1.1.9   扩展属性... 20

6.1.2   页头... 20

6.1.3   页尾... 20

6.1.4   标题栏... 20

6.1.5   组头... 20

6.1.6   组尾... 20

6.1.7   明细栏... 20

6.1.8   内嵌报表... 20

6.1.9   报表格式定义例子... 20

6.1.9.1   销售报表... 20

6.1.9.2   订单报表... 20

7.          报表引擎定义语言(REDL) 20

7.1       通用结构... 22

7.1.1   扩展属性(ExtendedAttribute... 22

7.1.2   形式参数(FormalParameter... 22

7.1.3   外部参考(ExternalReference) 22

7.1.4   例子... 22

7.2       包结构... 23

7.2.1   报表包(ReportPackage... 24

7.2.2   报表包头(PackageHeader) 25

7.2.3   可重定义包头(RedefinableHeader) 25

7.2.4   包外部参考(ExternalPackage... 26

7.2.5   例子... 26

7.3       参与者... 29

7.4       应用程序... 29

7.4.1   应用程序(Application... 30

7.4.2   例子... 30

7.5       报表过程... 31

7.5.1   报表过程(ReportProcess... 31

7.5.2   报表过程头(ProcessHeader... 32

7.5.3   可重定义报表过程头(RedefinableHeader... 33

7.6       算法集... 33

7.6.1   算法集(ActivitySet... 33

7.7       算法... 33

7.7.1   算法(Activity) 33

7.7.2   路径算法(Route Activity... 34

7.7.3   块算法(Block Activity) 34

7.7.4   运行控制属性... 34

7.7.5   运算的替代执行方式(Implementation) 35

7.7.5.1   No Implementation. 35

7.7.5.2   Tool 35

7.7.5.3   SubFlow.. 35

7.7.5.4   Statement 36

7.7.6   转移约束(Transition Restriction) 36

7.7.6.1   Join. 36

7.7.6.2   Split 36

7.8       转移信息... 37

7.8.1   转移信息(Transition... 37

7.8.2   转移条件(Condition) 37

7.9       相关数据... 38

7.9.1   相关数据(DataField... 38

7.9.2   数据类型(DataType... 38

7.9.3   基本数据类型(Basic Type) 39

7.9.4   数据类型(Schema Type) 39

7.9.5   数据类型(Record Type) 39

7.9.6   数据类型(Union Type) 39

7.9.7   枚举类型(Enumeration Type... 40

7.9.8   数组类型(Array Type... 40

7.9.9   列表类型(List Type... 40

7.9.10        开发者声名的数据类型(Type Declaractions... 40

7.9.11        声明类型(Declared Type) 40

7.10     数据操作集... 41

7.10.1        数据操作(Statement... 41

7.11     报表引擎定义例子... 42

7.11.1        销售报表... 42

7.11.2        订单报表... 47

8.          格式定义器... 47

9.          引擎定义器... 47

10.        引擎运行器... 47

11.        策略引擎... 49

12.        引擎监控器... 49

13.        报表生成器... 49

14.        总结... 49

15.        参考文档... 49

 


 

1.    目的

这篇文章主要是规范报表引擎整体结构、报表引擎的定义语言、报表引擎的报表格式语言。只要报表引擎按照规范化的接口进行设计,报表引擎的各个部分就可以相互独立地实现与进化,减弱彼此之间的耦合关系;并且,各公司设计的报表引擎都可以协同工作,相互之间进行数据、格式的交换;更利于将来形成一个报表引擎网络,从而,各报表引擎的在安全管理下组成一个虚拟的网络,企业可以从这个虚拟的网络中,搜索到对企业本身有益的数据,更益于企业的宏观决策。

在文章中,主要是定义报表引擎的总体结构及它的定义语言;报表引擎包括它的元素及属性、报表引擎要实现的算法、与其它系统进行交互、与其它报表引擎的交互方式。

2.    概述

报表引擎起源于流行的工作流引擎的原理、报表格式的定义、报表内容的各种算法,产生报表引擎的思想。它主要是引用工作流引擎的流程运转原理,在原始数据的基础上,定义报表的格式、报表的算法,根据定义的算法自动执行计算,并输出计算后的结果,再根据定义的报表格式显示报表的内容。

报表引擎根据定义的报表主题及它的算法,在人工或日程安排的触发下,自动运行。报表引擎根据报表主题,从数据库的原始数据的基础上,提取原始的数据,依据定义的报表算法,进行自动计算;在提取报表主题及算法运算的过程中,,报表引擎依据定义各种参数,实现所需的运算。

报表引擎输出的数据信息,经报表解释接口实现它的解释,并生成相应的报表展示给用户。

用户也可以根据实际需求,随时调整报表主题及算法的定义语言,再重新运行报表引擎时,报表引擎立即根据定义后的内容进行处理,产生经过改变后的报表数据。这样,报表引擎可以跟随用户的需求变化,而所需求的维护量非常少,也非常简单,灵活。

对于报表的输出格式,在报表引擎的输出接口中,定义要求的报表格式;当用户打印报表时,报表引擎根据定义的格式打印所需的报表;同时,如果用户需要改变报表的样式时,可以非常即时、灵活的重新定义,以满足用户的各种需求。

3.    假设

报表引擎是在业务系统已经运行之后,有原始数据的基础上,进行运算的;因此,在这里,我们假设用户的业务系统已经建成,报表引擎在已有的系统上,扩充已有的系统功能,用非常少的成本,非常少的时间,及时地满足用户对各种报表的需求。

4.    远景

当前报表引擎的解决方案,主要是针对每一个项目在报表这一方面花费大量的人力、物力,而且效果并非理想。在这里,在工作流引擎流行的基础上,提出解决当前报表设计与实现的困难的方案,帮助IT企业或应用企业非常讯速地、低廉的成本建立各个企业的决策分析系统。

在将来,报表引擎有一定规模之后,各个企业、政府、机关等对整个业务管理成为一整体化之后,可以组成一个报表虚拟网络。在报表虚拟网络的管理下,企业、政府、机关等可以在网络中发布自己的报表数据;同时,在报表引擎原有的数据基础上,企业可以从虚拟网络中,搜索自己感兴趣的内容,以协作企业、政府、机关等进行宏观决策。

由于报表引擎网络是虑构的网络,所有的运算也是通过对算法的定义进行计算,从而可以扩张这种网络,让它包容整个企业系统(特别是跨地区、跨国际的企业),对各种企业系统进行集成,集成方法是对某个网络中的节点连接企业应用系统,以扩展报表引擎的功能。

5.    引擎内部结构

报表引擎从整体上划分为:报表请求部分、格式定义部分、引擎定义部分、引擎运行部分、策略引擎部分、引擎监控部分、引擎输出部分,下面对各个部分进行简单的介绍。各部分相互协调工作,从而满足用户的各种需求;把各部分组合成一个整体系统。

5.1         总体结构

报表引擎的总体结构分为七个部分进行介绍,每一部分都是独立运行的一个模块。它们之间经过相互协调工作,共同完成整个报表从定义、请求、执行、监控、分派、显示功能。同时,它也是分布式计算的服务器。如全省的业务信息系统,分成三级:省级---地市级---区县级。各级有自己的报表引擎,当省级要对报表进行统计时,在省级报表引擎根据路由信息向下级发出请求,下属各级根据请求起动报表引擎并返回计算的结果(可以设置为异步或同步方式),省级报表引擎根据返回的结果进行计算并生成输出界面。

如果报表引擎定义了日程安排,那么报表引擎在日程事务的触发下,自动进行计算并保存计算后的结果信息;当其他业务请求报表计算时,系统可以立即响应请求,返回计算的结果,从而提高系统的负载、性能、响应能力。

下面是它的网络拓扑图:

在每一个省级、地市级报表引擎中,都包含着报表请求器、报表引擎运行器、策略引擎器、报表引擎监控器、报表引擎定义器、报表格式定义器、报表生成器。

下面是这几个模块的组成图:

整个报表引擎的核心的部分是报表引擎运行器、策略引擎器以及报表生成器。其它几是报表引擎的辅助部分,协调报表引擎的运作。

报表请求器:主要是实现对报表请求参数的封装,实现统一的入口。并负责对请求及响应的集中控制、分配。

报表格式定义器:在这一部分中,主要的功能是实现报表的输出格式的定义、报表栏位中输出的格式(包括字体、颜色、框线、显示样式等),输出的内容(主要是从输出的对象、输出对象的比较简单的计算、页头、分组、页尾等)。

引擎定义器:主要是指当报表引擎运行时,它的每个算法、算法执行次序、是否循环或分解、引用的外部应用接口、路由等信息。算法包括从数据库中读取原始的数据信息、对各种参数进行的计算的算法。算法的形式参数、实际参数、数据类型。

引擎运行器:这也是报表引擎中比较重要的部分,这一部分的性能影响到整个报表引擎的性能。它根据在报表引擎定义部分定义的报表主题、各种算法、次序等信息,进行计算,并返回计算后的结果。对于分布式的报表引擎,路由信息比较重要;当定义了路由信息之后,引擎运行到该处后,将定义在路由表中的引擎起动,并从相应的步骤处开始运行,并返回运行的结果。

策略引擎器:主要是针对用户的定义的算法,根据所需的参数进行计算,并生成计算后的结果返回给调用者。这也是报表引擎比较重要的部分。它也可以适用于业务系统,在策略引擎的协同下,满足业务需求的变动要求,灵活配置业务处理中的业务逻辑。这一部分,对整个引擎的性能也是有巨大的影响,包括从数据库中提取数据信息、各种信息的计算。

引擎监控器:这一部分是辅助功能,主要是监控报表引擎的运行过程,如有些地方需求用户处理的,引擎会等待着用户的处理后,再执行后一个算法。也可以监控引擎在运行过程中的出错信息,以便对引擎的错误进行跟踪;这些错误有可能是系统的、引擎本身的、算法定义的错误等。在监视中,可以查看已在运行的报表,也可以对运行的报表进行暂停、中止、恢复、保存、载入等操作。

引擎输出器:主要是根据报表格式定义的内容,以及引擎运行部分运行的结果,生成输出界面,以比较直观的形式展示给用户浏览。在生成的输出界面中,应该支持常用的几种:HTMLEXCELWORD等。

首先,在报表引擎定义器中,定义报表引擎的主题信息、计算策略,并根据定义的内容,生成报表引擎的定义文件(XML文件)。在报表引擎运行器运行时,自动根据系统的配置信息,导入定义好的格式文件;并解释成报表引擎能操作的对象。

当用户请求报表引擎执行报表计算时,传入起动参数及报表的ID,报表引擎在配置文件中查找要计算的报表。找到报表定义文件后,实例化报表的定义对象,并根据算法的执行次序,起动整个报表的执行过程。在报表的每一个算法中,根据定义的形式参数从系统环境中读取实际参数值。如果算法是一个表达式,系统起动策略引擎器进行计算,再返回运算的结果;如果算法是调用外部的应用程序或过程,系统会自动根据定义的内容及参数,调用相应的应用程序或过程进行运算,并保存运行的结果。

在整个报表引擎运行过程中,报表引擎监控器可以跟踪报表的执行过程,并记录它的执行过程;也可以对运行的报表执行暂停、中止、恢复、保存、载入等操作。用户可以根据报表的运行情况,分析报表的各种性能及调整报表的执行过程,优化报表引擎的性能。

当报表引擎运行结束后,返回运算结果,报表生成器根据用户在报表格式定义器中定义的报表格式,生成相应的报表,再展示给用户浏览。

在对引擎有一定了解后,下面再介绍每一部分的组成及相互接口。

5.2         报表引擎接口

报表引擎的接口部分是描述整个报表引擎运行时,各个部分之间的相互关系及与外部应用的调用关系的体现。

下面是它的关系图:

用户从工作站进行系统后,向“报表请求器”申请打印报表,“报表请求器”根据用户传入的数据封装成一个报表参数对象,传入到“引擎运行器”中。“引擎运行器解释报表参数对象,并从引擎定义器中读取报表运算的过程信息,起动引擎运行。

在运行的过程中,与应用程序及策略引擎进行数据的交互,数据的主要运算在策略引擎中完成;如果在策略引擎中不能完成或需要利用现有的应用程序,读取实际参数调用应用程序,返回处理的结果。

在引擎运行过程中,可能存在用户参与的运算、出错信息、运算的进度等信息,引擎监控器随时对“引擎运行器”进行监控,用户可以通过监视器查看引擎的运行情况,也可以调整引擎的运行过程。如在运行的过程中,需求其它的报表引擎协同工作,那么起动另一个报表引擎,并传入相关的参数;再根据另一个报表引擎返回的结果信息进行下一步的运算。

“引擎运行器”进行一系列的运算后,返回运算的结果信息,传入到“报表生成器”中,“报表生成器”根据运算的结果信息、以及用户在报表格式定义器中定义的报表格式,生成相应的报表内容。“报表生成器”执行完毕后,返回报表的URL信息,从而在“报表请求器”中,定位URL位置,显示最后的真实报表内容。

在整个报表引擎的体系结构中,存在着几个主要的接口信息:客户应用接口、应用程序接口、管理维护接口、报表引擎定义接口、报表格式定义接口、外部数据管理接口、报表引擎协同接口、用户管理接口。

5.2.1        客户应用接口

客户应用接口是客户参与运算的一处接口信息,当运算过程中要求客户输入一些相关资料参与运算时或客户决定下一个过程转向时,引擎起动这一算法后,就处于等状态,等候客户对它进行处理;客户处理之后,运算过程才继续执行。

由于引擎计算过程中,由客户参与运算过程,从而使用系统变得复杂。为了减少系统的复杂度,所有与客户有关的操作,提供统一的接口进行管理。当客户进行系统后,引擎根据客户的帐号及角色情况,返回客户所有的工作列表;客户可以直接选择要处理的工作列表,直接执行要处理的工作。

当客户处理完工作之后,再次触发引擎继续执行下一步运算。

在处理过程中,可能存在调用外部应用程序一起解决要处理的问题。客户也可以运算过程执行中断、暂停、恢复等操作。

5.2.2        应用程序接口

应用程序接口是引擎与应用程序之间进行交互的接口。当定义报表算法时,有部分功能不能在策略引擎实现或已经存在的系统,引擎通过调用外部的应用程序执行算法的实现,从而集成企业的外部应用程序。

引擎调用外部应用程序时,首先建立与外部应用程序的连接,在保持连接的状态下,通过实际的参数传入应用程序API中,由外部应用程序实现算法,并返回计算的结果信息。在运算结束后,引擎再断开与外部应用程序的连接。

它分为本地过程调用、SHELL脚本的调用、远程执行调用、消息传递、事务处理。

本地过程调用:引擎根据定义的接口信息,创建本地连接器并传入调用的过程名称及它的实际参数。在本地连接器中,执行本地过程计算并返回计算结果。

SHELL脚本的调用:引擎根据定义的脚本(可以是本地文件或在定义格式中直接写入的脚本信息,起动脚本运行器;并根据返回的结果再执行下一步骤的运算。

远程执行调用:引擎根据路由信息,创建远程连接器并起动远程连接,再根据远程连接的参数信息,调用远程过程计算;远程过程计算后,返回计算结果信息;再断开远程的连接。

消息传递:主要是指通过消息服务器,起动消息运算,可以是同步方式或异步方式进行运算。如果同步,创建消息连接后,发送参数信息后,等待消息另一消息的触发后,再处理返回的结果,再继续运算;如是异步方式,引擎等待消息返回,就直接执行下一步运算。

事务处理:主要是对整个计算过程中,起动事务管理。在起动事务后,暂存相关参数;当调用结束后,如发生错误,恢复被改变的参数;如没有发生错误,继续执行下一步运算。

5.2.3        管理监视接口

这一部分主要是对用户权限、引擎日志、运行情况进行监视,并可以随时调整引擎的执行步骤、更改用户的实际权限。同时,在系统日志的记录下,分析引擎的执行情况、性能瓶颈等;并根据分析的结果,调整引擎的执行步骤,优化引擎的执行过程。

同时,也包括对引擎的运算过程进行中断、暂停、恢复等操作。

5.2.4        报表引擎定义接口

报表引擎定义接口,是对报表的整个算法及算法过程的定义。定义之后,可以输出报表引擎定义的描述文档。引擎的执行完全是依据这份文档的内容,有关定义的内容见报表引擎定义语言。

5.2.5        报表格式定义接口

报表格式定义接口,是定义报表的输出界面的样式、报表输出界面与运算最终结果的相互关系。它是一种描述性的语言,只要符合规范,就可以在各个报表生成器中被解释。

在格式语言中,也规范了输出参数的描述方式。输入参数只要符合规范,就可以被报表生成器解释,并依据报表格式定义中的内容,生成输入报表页面。

报表格式语言的详细情况见REDL描述。

5.2.6        报表引擎协同接口

报表引擎的协同接口,是对多个报表引擎的一起工作,才能完成的报表运算。如跨地区的报表计算、分布式的报表计算等。这时,报表引擎分布在多个地点上,通过Internet连接起来,在定义引擎执行步骤时,设置它的路由信息、进入的报表算法节点信息。

当报表引擎运行时,引擎本身会起动对其他引擎的连接,并保持连接,通过报表引擎的接口,传入调用的参数,起动外部引擎进行运算;当外部引擎运行完毕后,返回运算结果,再断开引擎的连接。报表引擎根据返回的结果再继续运算其他的算法。

在启动外部的报表引擎时,有两种起动方式:异步与同步。

异步:是指启动外部引擎后,不等外部引擎运行完毕,就继续执行下一个报表算法的运算。

同步:是指启动外部引擎后,暂停报表引擎的运行,一直到外部引擎执行完毕并返回后,再执行下一步骤的运算。

5.2.7        策略引擎接口

策略引擎的接口,也是比较重要的一个环节,它分离了运行与计算之间的耦合关系;从而可以彼此独立的进行设计与实现。只要根据规范的定义,就可以透明的相互协作。

当引擎执行运行时,由引擎起动策略引擎并保持它的连接;然后传入计算的算法及相应的参数信息。策略引擎根据输入的算法表达式及参数进行运算,再返回运算后的结果信息。

5.3         技术框架

由于报表引擎的外部环境难预测并且多种多样,很难定义每一种接口交互协议,因此,在这里采用了类似于硬件的数据总线的方式来实现各种系统的集成。

5.3.1        什么是总线

总线,在计算机硬件中,是两个模块以上的进行数据通讯、数据交换的公共通路。这是一种十分熟悉的内容,而在报表引擎的系统中,对于总线的定义也是类似的,不同之处在于:一个是硬件中的数据通讯与数据交换;而在这里,是指系统通过一种发布——订阅的方式,对系统中的数据交换过程进行控制,以一种比较灵活的方式,实现系统中复杂的数据结构的数据交换。

5.3.2        总线的优点与缺点

无论对于什么事物,总是有优点也存在着缺点。在上面的描述中,已经涉及到了一点总线的优点。对于硬件的优点,众所周知:减少系统的复杂度、提高系统的兼容性、扩展性。对于软件的总线,也是一种相似的形式:隔离了系统之间的耦合度、提高了兼容性、扩展性、易维护性。只要满足总线接口的标准,就可以接入到系统中,随时对系统进行扩展。对于易维护性,应该更加明显,由于系统的耦合度非常低,每一个业务都可以独立的加以变化,而不会影响到系统的整个结构;同时,有完善的日志功能,可以随时加入监听功能,从而记录出错情况、运行情况。

由于采用了总线结构及接口标准,因而对于安全方面来说,可以在监听器中加入安全机制,可以完全不修改任何程序,即可对系统的安全进行管理。它的原理是:在监听器中,吸收没有权限的消息,从而接口不能接收到消息请求,也不能发布自己的消息请求。从另一种方面来说,类似于AOP方式(面向切面编程)。

由于采用了总线结构及接口标准,从而可以使用类似于硬件的即插即用的方式组织系统。当有一个接口接入系统中后,系统的控制部件可以感觉到有异物进入了。系统马上对这种接入的新的“异物”进行检验,如不符合接口标准,系统提示异常信息;否则系统将插入的插件加入到系统中,扩展整个系统的功能。同时,监控器也开始对它的运行进行监视。

总线的缺点也是明显的:加入总线后,再整个系统的复杂程度加大了,消息的管理也提高了系统的开销,处理的复杂度增加。如果监控器性能不好,会严重影响到系统的整个性能;所以整个系统的瓶颈是在监控器的处理上面。如果多个用户同时访问报表引擎,对系统的性能也是一种隐藏的隐患;对于这种问题可以采用线程池的模式解决。

下面详细介绍系统的总线结构。

5.3.3        系统总线结构

图中蓝色部分线,就是报表引擎整个系统的交互通道;所有的数据信息、控制信息、状态信息都通过数据总线进行交互。在圆中的引擎监控器,对整个数据的交互过程都进行监控;每一个模块发出信息时,必须带有接受者的地址信息,每一种模块都监听总线上的信息,一旦发现是自己要处理的信息,就直接接收并处理。

在这里,对信息的处理有两种方式:点对点、广播。

点对点:是某一个模块发出请求信息,其中带有接受者的标识符;接收者发现自己的信息后,直接取走,并删除取走的信息,从而避免被其他模块处理。

广播:是某一个模块对所有的监听者发送请求信息,每一个模块都接受后,再根据自己的方式处理请求。

在圆环中的所有消息,统一由系统监控器进行维护;如是广播方式的消息,当所有模块都接收后,监听器删除这一种信息;如是点对点的方式,监听器不处理它的删除方法,由接收者负责删除。

由于整个系统中,所有的消息都由监听器处理,因而对于日志管理比较简单,可以直接把监听到的信息记录下来即可。

在每一个模块接入数据总线之前,有一种接口处理部件,它负责监听自己的消息,并接收、删除由自己负责的消息。并对收到的消息进行一定的处理后,再传入到相应的模块中进行处理;也负责对数据进行处理后,再发送到数据总线中。

在所有的接口中,包括各自的安全信息,当接口读取数据总线中的数据时,监控器会监视它的整个过程,并检测它的权限。如果接口没有权限触及到的消息,接口处理部分不能读取这些信息。

在系统的每一个模块中,有它自己的数据总线,监控器也对这些信息进行监控、分配、管理。同时,每一个模块中的数据总线与系统总体的数据总线通过接口

5.3.4        总线控制器

在上面的总线结构图中,没有画出总线控制器。对于总线控制器可以想象成协调中心,所有的消息由它进行传递、控制。还有一个是接口适配器,也没有画;每一个接口可以共用或独立使用一个接口适配器;外部的接口必须通过接口适配器才能加入到总线中,总线控制器也只处理接口适配器发出的请求信息。

当一个接口要使用总线时,首先发送数据信息到接口适配器中;接口适配器再对于它的信息打包,带上它的接口标识符以及目的地址。打包之后,接口适配器再发送数据信息到总线上。然后监听总线上的数据信息,解释包的头信息;如果是自己的消息,则从总线上取下信息,再解开包信息后,送到接口中进行下一步的处理。

下面是它的控制图:

      

5.3.5        通用结构

5.3.5.1           查询结构

统一请求,分派,转发.表示层于数据层完全隔离,做成通用的数据封装.

通用的显示组件(TAG):DBGRID, GRID, TOOLBAR, STATUSBAR, MENU.

对维护进行抽象,封装一个统计的接口,由二次开发时扩展其细节.

5.3.5.2           维护结构

6.    报表格式定义语言(RFDL)

6.1.1        通用结构

 

6.1.1.1           颜色
6.1.1.2           字体
6.1.1.3           显示格式
6.1.1.4           函数
6.1.1.5           线条
6.1.1.6           图片
6.1.1.7           链接
6.1.1.8           引用数据
6.1.1.9           扩展属性

6.1.2        页头

6.1.3        页尾

6.1.4        标题栏

6.1.5        组头

6.1.6        组尾

6.1.7        明细栏

6.1.8        内嵌报表

6.1.9        报表格式定义例子

6.1.9.1           销售报表
6.1.9.2           订单报表

7.    报表引擎定义语言(REDL)

报表引擎定义语言是整个系统的基础,它负责定义整个报表算法的报表过程,相关数据、被调用的应用程序等。只有定义了报表算法的报表过程后,报表引擎才能根据它的内容起动运算。

下面是它的实体类图:

每一个报表定义格式中由包组成,在包中包括了报表的过程、应用程序或过程、语句描述、相关数据。它包容了整个报表引擎的元素定义、引用参数、实现方法、运算策略等。

它分为包结构、报表过程、应用程序、相关数据、转移信息、算法、算法集、数据操作集等。

下面首先介绍定义格式的通用结构,它包括扩展属性、形式参数、外部参考。

7.1         通用结构

7.1.1        扩展属性(ExtendedAttribute

元素名

基本类型

描述

Name

String

标识扩展

Value

String

扩展属性值

7.1.2        形式参数(FormalParameter

元素名

基本类型

描述

DataType

String

形式参数的数据类型

Description

String

形式参数的文本描述

Id

String

形式参数的标识ID

Index

String

形式参数的索引号

Mode

String

形式参数的输入/输出模式(INOUTINOUT

7.1.3        外部参考(ExternalReference)

元素名

基本类型

描述

Location

String

指明类型文档的URI

Namespace

String

实体定义的有效范围

Xref

String

对在外部文档中的实体进行标识

7.1.4        例子

针对上述的结构,下面用几个例子来进行更清晰的说明。

1.扩展属性:

<ExternalAttributes>

<ExtendedAttribute Name="SystemActivity" Value="WebService"/>

<ExtendedAttribute Name="System" Value="Service"/>

</ExternalAttributes>

2.形式参数

<FormalParameters>

    <FormalParameter Id="creditStatus" Index="1" Mode="IN">

        <DataType>

            <BasicType Type="STRING"/>

</DataType>

    </FormalParameter>

  <FormalParameter Id="orderStatus" Index="2" Mode="OUT">

<DataType>

<DeclaredType Id="OrderStatus"/>

</DataType>

</FormalParameter>

</FormalParameters>

3.外部参考

<FormalParameter Id="orderType" Index="1" Mode="IN">

    <DataType>

        <ExternalReference location="http://orderschema.xsd"

xref="orderType"  

namespace="orderschema/Order"/>

    </DataType>

</FormalParameter>

7.2         包结构

包结构是报表引擎定义格式的容器,它包括了报表过程、引用的包、应用程序、相关数据、语句集等。

下面是它的类图:

在包的结构中,存在着对其他包的引用,当一个算法要起动另一个包中的报表过程时,使用命名空间指定相应的包中的报表过程;包对包的引用是相互的,也就是存在相互的参照。

在包的结构中,包含着应用程序的定义、报表过程的定义、语句集的定义、相关数据的定义,以及报表头结构的定义。这些定义是全局性的定义,在过程定义中的算法定义中可以引用它的ID进行引用。

下面对各个元素的元素进行描述,使读者更清晰地了解报表引擎的过程定义语言的格式及内容。这些对于正确实现报表引擎有着十分重要的作用。

7.2.1        报表包(ReportPackage

元素名

基本类型

描述

Applications

Application

应用程序声明列表

DataFields

DataField

报表引擎相关数据定义

ExtendedAttributes

ExtendedAttribute

报表包自定义的属性,由开发者定义并解释。

ExternalReferences

ExternalReference

包的外部参考定义

Id

String

包的标识ID

Name

String

包的名字

PackageHeader

PackageHeader

包头的详细信息

RedefineHeader

RedefineHeader

包和算法过程的相关信息

Type Declarations

TypeDeclaration

数据类型定义说明

ReportProcesses

ReportProcess

算法过程的定义列表

Participants

Participant

工作流参与者的资源列表

Statements

Statement

定义报表的运算策略,可以定义SQL语句(使用JDBC)HSQL语句(使用Hibernate)或面向对象的SQL语句(如数据库支持,直接使用。否则实现解释)

7.2.2        报表包头(PackageHeader)

元素名

基本类型

描述

Version

String

报表的规范版本信息

Vendor

String

报定义的由来,包括开发者名称、产品名称以及产品的发布版本号等

Created

String

报表定义的创建日期

Description

String

报表的文本描述

Documentation

String

操作系统的路径,帮助文件以及描述文件的文件名

PriorityUnit

String

用户自定义语义的字符串

Cost Unit

String

模拟数据使用单元

7.2.3        可重定义包头(RedefinableHeader)

元素名

基本类型

描述

Author

String

包定义的作者

Version

String

包定义的版本

Code page

String

正文部分的页码

CountryKey

String

国家代码

 

7.2.4        包外部参考(ExternalPackage

元素名

基本类型

描述

href

String

包的ID,对外部包的引用

Extended Attributes

ExtendedAttribute

用户扩展的属性,定义用户自己对外部包的引用原则,以满足用户的特殊要求。

7.2.5        例子

针对上述的结构,下面用几个例子来进行更清晰的说明。

1.报表包头

<PackageHeader>

      <Version>0.09</Version>

      <Vendor>XYZ, Inc</Vendor>

<Created>6/18/2002 5:27:17 PM</Created>

<Description>This is a reportpackage header example.</Description>

</PackageHeader>

2.可重定义包头

    <RedefinableHeader PublicationStatus="UNDER_TEST">

        <Author>kevin</Author>

        <Version>1.0</Version>

        <Codepage>1</Codepage>

        <Countrykey>china</Countrykey>

    </RedefinableHeader>

3.包外部参考

    <ExternalPackages>

        <ExternalPackage href="ss.xml"/>

    </ExternalPackages>

4.报表包

<ReportPackage Id="pkg-1" Name="report package" >

    <PackageHeader>

        <Version>1.0</Version>

        <Vendor>Together</Vendor>

        <Created>2004-09-15 23:32:49</Created>

        <Description>ddd</Description>

        <Documentation>www.ttt.com</Documentation>

        <PriorityUnit>1</PriorityUnit>

        <CostUnit>1</CostUnit>

    </PackageHeader>

    <RedefinableHeader PublicationStatus="UNDER_TEST">

        <Author>kevin</Author>

        <Version>1.0</Version>

        <Codepage>c</Codepage>

        <Countrykey>china</Countrykey>

    </RedefinableHeader>

    <ExternalPackages>

        <ExternalPackage href="ess.xml"/>

    </ExternalPackages>

    <TypeDeclarations>

        <TypeDeclaration Id="pkg-1_Typ1" Name="data">

            <BasicType Type="STRING"/>

            <Description>ddd</Description>

        </TypeDeclaration>

    </TypeDeclarations>

     <Applications>

        <Application Id="pkg-1_App1" Name="ddd">

            <Description>asdfasd</Description>

            <FormalParameters>

                <FormalParameter Id="p2" Index="1" Mode="INOUT">

                    <DataType>

                        <BasicType Type="STRING"/>

                    </DataType>

                    <Description>asdf</Description>

                </FormalParameter>

                <FormalParameter Id="pkg-2" Index="rrr" Mode="IN">

                    <DataType>

                        <BasicType Type="STRING"/>

                    </DataType>

                    <Description>asdf</Description>

                </FormalParameter>

            </FormalParameters>

        </Application>

    </Applications>

    <DataFields>

        <DataField Id="ee" IsArray="TRUE" Name="asdfasdf">

            <DataType>

                <BasicType Type="STRING"/>

            </DataType>

            <InitialValue>ee</InitialValue>

            <Length>33</Length>

            <Description>dsadasd</Description>

        </DataField>

        <DataField>

           <DataType>

              <ExternalReference Xref=”PO”  location=”com.util.ArrayList”/>

           </DataType>

         </DataField>

    </DataFields>

    <ExtendedAttributes>

        <ExtendedAttribute Name="rr" Value="dd"/>

        <ExtendedAttribute Name="Version" Value="1.2"/>

    </ExtendedAttributes>

</ReportPackage>

7.3         参与者

报表引擎的参与者包括资源集、资源、组织机构、角色、人、或者系统。资源与角色是抽象参与者。这些抽象的参与者会实际分配到具体的人和程序。

元素名

基本类型

描述

Description

String

参与者的文本描述

ExternalReference

String

外部参与者的规范参考

Extends Attributes

ExtendedAttribute

开发者自定义的属性,用来实现外部的要求。

ParticipantType

ParticipantType

参与者的类型

RESOURCE_SET:资源集

RESOURCE:资源

ROLE:角色,会映射到实际的人或程序

ORGANIZATIONAL_UNIT:组织机构中的部门或其他单位

HUMAN:担供应用程序与系统交互的人

SYSTEM:自动运行

Id

String

应用程序的ID

Name

String

应用程序的名字

 

7.4         应用程序

应用程序是报表引擎在运行的时候,需求引用外部的应用程序或工具。从而使用报表引擎与业务处理进行分离,并可共享业务处理中的接口。当算法执行计算时,调用相应的应用程序,对参数的传入可通过IdReport  Context中读取出相应的实际参数(如在Activity中实际参数是静态的,就直接传入)。

7.4.1        应用程序(Application

元素名

基本类型

描述

Description

String

应用程序的文本描述

ExternalReference

String

外部应用程序的签名规范的参考

Extends Attributes

ExtendedAttribute

开发者自定义的属性,用来实现特殊的要求。

Formal Parameters

FormalParameter

通过调用应用接口,应用程序的形式参数

Id

String

应用程序的ID

Name

String

应用程序的名字

7.4.2        例子

    <Applications>

        <Application Id="pkg-1_App1" Name="ddd">

            <Description>asdfasd</Description>

            <FormalParameters>

                <FormalParameter Id="pkg-1" Index="1" Mode="INOUT">

                    <DataType>

                        <BasicType Type="STRING"/>

                    </DataType>

                    <Description>asdf</Description>

                </FormalParameter>

                <FormalParameter Id="pkg-2" Index="rrr" Mode="IN">

                    <DataType>

                        <BasicType Type="STRING"/>

                    </DataType>

                    <Description>asdf</Description>

                </FormalParameter>

            </FormalParameters>

        </Application>

    </Applications>

7.5         报表过程

报表过程是报表运算过程的描述,报表引擎根据运行过程的描述,按顺序执行每一个算法并根据输入/输出参数的类型,保存运算的中间结果。也是整个报表定义语言的核心内容,下面对它进行详细地解释。

在描述报表过程语言之前,先看看它的整体内容、类图:       

     

报表过程包括过程头、重定义过程头、数据域、形式参数、转移、算法、算法集、数据集、应用程序。

7.5.1        报表过程(ReportProcess

报表过程包含整个报表算法的集合,下面是它包含的元素:

                       

元素名

基本类型

描述

AccessLevel

String

访问级别:PUBLICPRIVATE。如是PUBLIC,那么可以被外部分程序调用;如是PRIVATE,那么只能被本引擎所用。

Activities

Activity

报表过程的算法的集合

ActivitySets

ActivitySet

报表的算法及转移的集合

Applications

Application

报表的应用程序的列表

Participants

Participant

报表过程的参与者列表

DataFields

DataField

报表过程使用的数据元素

Extended Attributes

ExtendedAttribute

用户自定义语义的扩展属性

FormalParameters

FormalParameter

传递给报表过程的参数列表

Id

String

报表过程的标识

Name

String

报表过程的名称

ProcessHeader

ProcessHeader

报表过程头的内容

RedefinableHeader

RedefinableHeader

可重定义报表过程头的内容

Transitions

Transition

报表过程的转移列表

7.5.2        报表过程头(ProcessHeader

报表过程头是报表过程的描述信息,包括过程版本、优先级等。

元素名

基本类型

描述

Description

String

报表过程的文本描述

Created

String

报表过程的创建日期

Priority

String

定义报表过程的优先级别

Limit

String

期望的报表过程持续时间

Time Estimation

String

模拟过程的运行所花费的时间

Valid From

String

报表过程被激活的时间

Valid To

String

报表过程定义的开始有效日期

Waiting Time

String

报表过程的等待时间

Working Time

String

报表过程的工作时间

7.5.3        可重定义报表过程头(RedefinableHeader

元素名

基本类型

描述

Author

String

报表过程定义的作者

Codepage

String

正文部分的页码

ContryKey

String

国家代码

Version

String

报表过程的版本信息

7.6         算法集

算法集是算法、转移的集合,一个集合中的转移只能与这个集合中的算法相关连。转移不能从一个集合到另一个集合,或转移到另一个集合。转移只能是从一个算法到另一个算法。

7.6.1        算法集(ActivitySet

元素名

基本类型

描述

Activities

Activity

报表过程算法的集合

Transitions

Transition

报表过程算法的转移的集合

Id

String

报表过程的标识

7.7         算法

算法是整个报表引擎的计算方法,它定义了报表过程的最小的计算策略。

7.7.1        算法(Activity)

元素名

基本类型

描述

Block Activity

ActivitySet

执行算法集

Description

String

算法的描述

Documentation

String

算法的帮助文件或描述文档

Extended Attributes

ExtentedAttribute

算法的扩展属性,由开发者自定义

Finish Mode

String

定义在算法运算结束后,是自动或手动处理。

Start Mode

String

定义算法在运算之前,是自动或手动处理。

Icon

String

代表活动显示的图标

Id

String

对算法的标识

Name

String

算法的名称

Performer

Participant

与参与者相关连,设置谁有权限执行当前的算法。

Implementation

String

算法的实现方式(NoneSubFlowStatementTool

Limit

String

算法的预定执行时间

Priority

String

算法的优先级别

Route

String

虚算法,主要是引用

Transition Restrictions

Restriction

约束或转移的限制条件

 

7.7.2        路径算法(Route Activity

是一种虚算法,主要是描述层叠转移条件。如:If condition then activity1 otherwize activity2。算法的转出转移的离开动作XORAND;算法的进入转移的进入动作XORAND。以及包含条件的转移或线程。

7.7.3        块算法(Block Activity)

负责执行一个ActivitySet,从Activity Set中的第一个Activity到最后一个Activity。然后系统根据转出的条件的指向继续执行计算。

7.7.4        运行控制属性

控制属性主要是对进入或退出算法的活动进行计算,它分为自动控制与手工控制。

1.自动控制方式(Automatic mode):这是一种由报表引擎自动控制运算的方式,当条件满足后,引擎自动执行下一个运算。

2.手工控制方式(Manual mode):这是一种由报表引擎起动,但由外部条件执行它的运算过程,由用户参与报表引擎的运算过程。

7.7.5        运算的替代执行方式(Implementation)

当运算要进行其他处理或保存有关的数据时,定义Implementation后,当引擎运行时,会起动替代执行方式,这时,用户可以根据自己的要求进行一些处理或保存相关的数据;从而在系统重起时,可以从保存的数据中读取出计算的结果,恢复运算的中断点,再继续运行。

元素名

基本类型

描述

No Implementation

Implementation

由人工来执行的算法

Tool

Implementation

由外部应用程序来协助执行的算法

SubFlow

Implementation

起动其他报表过程的算法

7.7.5.1           No Implementation

<Implementation>No</Implementation>

7.7.5.2           Tool

元素名

基本类型

描述

ActualParameters

ActualParameter

应用程序的实际参数

Description

String

Tool的文本描述

Extended Attributes

ExtendedAttribute

Tool的扩展属性,由开发者自己定义

Id

String

Tool的标识

Type

String

Tool的类型说明:APPLICATIONPROCDEURE

7.7.5.3           SubFlow

元素名

基本类型

描述

ActualParameters

ActualParameter

传给子报表过程的实际参数

Execution

String

子过程类型:ASYNCHRSYNCHR

Extended Attributes

ExtendedAttribute

Tool的扩展属性,由开发者自己定义

Id

String

被调用的子过程的Id

7.7.5.4           Statement

元素名

基本类型

描述

ActualParameters

ActualParameter

传给子报表过程的实际参数

Execution

String

子过程类型:ASYNCHRSYNCHR

Extended Attributes

ExtendedAttribute

Statement的扩展属性,由开发者自己定义

Id

String

Statement Id,从数据库中读取数据资料

7.7.6        转移约束(Transition Restriction)

元素名

基本类型

描述

Join

Join

说明活动的多个进入转移

Split

Split

说明活动的转出转移(是多路的)

7.7.6.1           Join

元素名

基本类型

描述

Type

String

AND:直到所有的算法都完成后,才能进入转移,进入下一个算法。

XOR:只要任一算法完成后,都会进入转移,进入下一个算法。

7.7.6.2           Split

元素名

基本类型

描述

Type

String

AND:当一个算法完成后,对每一个转出计算它的条件是否成立;如成立,全部执行(同时,多线程方式)。

XOR:当一个算法完成后,计算转出的条件是否成立;如有一个成立,就执行相应的算法,其他的算法被忽略。

Transition Refs

TransitionReference

算法的所有转出算法。

7.8         转移信息

转移信息是由多个算法进行组合,组成一个完整的算法集合。它可能包含循环的转移信息以及退出转移的条件。

7.8.1        转移信息(Transition

元素名

基本类型

描述

Condition

String

转移条件表达式(Report Script Language)

Description

String

转移的文本描述

ExtendedAttributes

ExtendedAttribute

转移的扩展属性,开发者自定义

From

Activity

转移的开始算法

To

Activity

转移的目的算法

Id

String

转移的标识

Name

String

转移的名称

7.8.2        转移条件(Condition)

定义算法转移时的条件信息,其中包含一种算法描述语言。从参数对象的属性中读取相应信息,并进行逻辑判断,根据结果转移到下一个算法。

元素名

基本类型

描述

Type

String

CONDITION:条件满足时,转移才会发生;OTHERWIZE:条件不满足时,转移才会发生;EXCEPTION:如果产生异常,并且条件满足才会发生转移;DEFAULTEXCEPTION:如果产生异常,条件不满足时才会发生转移。

Xpression

String

XML语法表示的条件比较算法

 

7.9         相关数据

报表引擎在运行中,将传入参数;并且,在运行过程中,也会产生各种数据;条件判断时也会使用到各种数据;也有使用各种参数调用应用程序。所以,报表引擎相关数据的定义及管理也是比较重要的内容。

7.9.1        相关数据(DataField

元素名

基本类型

描述

DataType

DataType

数据的类型

Description

String

数据的文本描述

ExtendedAttributes

ExtendedAttribute

数据的扩展属性,由开发者定义

Id

String

数据的标识

Intial Value

String

数据的初始值,在运行时自动设置

Is Array

String

数据是否是数组

Length

String

数据的长度

Name

String

数据的名称

7.9.2        数据类型(DataType

元素名

基本类型

描述

Array Type

String

数组类型

Basic Type

BasicType

基本的数据类型(STRINGINTEGERFLOATDATETIMEREFERENCEBOOLEAN

Declared Type

Type Declaration

Type Declaration中说明的数据类型

Enumeration Type

String

枚举类型

ExternalReference

String

在外部文档中定义的数据类型

List Type

String

没有边界的数据集(同数据类型)

Record Type

String

由多个成员构成的集合

Schema Type

String

XML Schema定义的数据类型

Union Type

String

由多个成员组成,只有一个成员有效的数据类型

7.9.3        基本数据类型(Basic Type)

元素名

基本类型

描述

Type

String

STRING:有限长度字符串

INTEGER:整型数据类型

FLOAT:浮点数据类型

DATETIME:日期类型

REFERENCE:引用一个外部数据类型

BOOLEAN:取值(false, true

7.9.4        数据类型(Schema Type)

元素名

基本类型

描述

Type

String

参考XML Schema

7.9.5        数据类型(Record Type)

元素名

基本类型

描述

Member

String

记录中的一个字段

DataTypes

DataType

数据类型

7.9.6        数据类型(Union Type)

元素名

基本类型

描述

Member

String

联合中的一个字段

DataTypes

DataType

数据类型

7.9.7        枚举类型(Enumeration Type

元素名

基本类型

描述

Enumberation Value

String

元素,定义其中的一个值

Name

String

值的名称

7.9.8        数组类型(Array Type

元素名

基本类型

描述

DataTypes

DataType

数据的数据类型

Lower Index

String

数组的下界值

Upper Index

String

数组的上界值

7.9.9        列表类型(List Type

元素名

基本类型

描述

DataTypes

DataType

列表中的数据类型

7.9.10    开发者声名的数据类型(Type Declaractions

元素名

基本类型

描述

Description

String

数据的文本描述

DataTypes

DataType

数据类型

Extended Attributes

ExtendedAttribute

数据类型的扩展属性

Id

String

数据类型的标识

Name

String

数据类型的名称

7.9.11    声明类型(Declared Type)

元素名

基本类型

描述

Id

String

Type Declaraction中声明的数据类型

DataTypes

DataType

数据类型

7.10     数据操作集

语句集主要是针对当前使用的ORM原理,定义数据集的操作方法,当引擎运行时,可以根据定义的内容,从数据库中读取原始的数据内容,加入到算法过程中。它分为四种类型:HibernateJDBCEntity BeanBlueworld

Hibernate的语句可以参考相关文档,这里不再说明。

JDBCJAVA本身提供的一种方式,直接使用SQL语句进行操作。

Entity Bean:使用QL语句,定义数据的提取方法,这里也不再讨论。

Blueworld:是一种新型的ORM,基于对象数据库的ORSQL语句,只要符全ORSQL语句的,基本上是能够执行。

7.10.1    数据操作(Statement

元素名

基本类型

描述

Id

String

数据操作的标识

Name

String

数据操作的名称

Description

String

数据操作的文本描述

DataType

DataType

数据操作的数据类型,当数据读取出来后,返回相应的数据类型。

ExtendedAttributes

ExtendedAttribute

开发者自定义的扩展属性

Sentence

String

数据操作语法(对应上述的四种语法)

Type

String

数据操作的类型(HIBERNATEJDBCENTITYBLUEWORLD

FormalParameters

FormalParameter

形式参数,执行数据操作时的传入参数

Where

String

对于特殊的条件不能满足的,可以定义对应的Where语句,以满足动态条件的处理。Where应依据Type定义它的数据内容

7.11     报表引擎定义例子

在上一节中,对报表引擎定义语言的格式,已做了十分详细的说明。并对每一种元素都举例说明。但都是比较离散的内容,在这一节中,再综合在一起,形成一个比较完整的例子。

根据实际项目中存在的报表实际问题,用报表引擎实现的格式定义内容,进行详细说明,并再一次对它进行详细的解释。

7.11.1    销售报表

<?xml version="1.0"?>

<ReportPackage Id="pkg-1" Name="OR Split Test">

      <PackageHeader>

             <Version>0.2</Version>

             <Vendor>www.blueworld.com.cn</Vendor>

             <Created>2002-06-18 10:00:00</Created>

             <Description>Example Report definition which tests OR splits.</Description>

             <Documentation>http://www.blueworld.org/docs/wf/example.html</Documentation>

             <PriorityUnit>normal</PriorityUnit>

             <CostUnit>0</CostUnit>

      </PackageHeader>    

      <RedefinableHeader>

             <Author>Anthony Eden</Author>

             <Version>1.0</Version>

             <Codepage></Codepage>

             <Countrykey>CHINA</Countrykey>

             <Responsibles>

                    <Responsible>P1</Responsible>

             </Responsibles>

      </RedefinableHeader>

      <Applications>    

             <Application Id="A1" Name="App 1">

                    <Description>Test</Description>

                    <FormalParameters>

                              <FormalParameter Id="4343_App1_For1" Index="d" Mode="IN">

                                <DataType>

                                  <BasicType Type="STRING"/>

                                </DataType>

                              </FormalParameter>

                             <FormalParameter Id="4343_App1_For2" Index="aa" Mode="IN">

                               <DataType>

                                 <BasicType Type="STRING"/>

                               </DataType>

                             </FormalParameter>

                          </FormalParameters>

             </Application>           

             <Application Id="A5" Name="App 5">

                    <Description>Test</Description>

             </Application>

      </Applications>   

      <!-- Begin definition of Reports -->

      <ReportProcesses>           

             <ReportProcess Id="wfp-1" Name="Example Process 1">

                    <ProcessHeader DurationUnit="m">

                           <Limit>0</Limit>

                           <ValidFrom>1h</ValidFrom>

                           <ValidTo>1Y</ValidTo>

                    </ProcessHeader>                   

                    <Applications>

                           <Application Id="A3" Name="Text Executable">

                                  <Description>Example of executing a an application.</Description>

                           </Application>

                           <Application Id="A4" Name="App 4">

                                  <Description>Test</Description>

                           </Application>

                    </Applications>                 

                    <SQLStatements>

                            <SQLStatement Id="A1" Name="ddd">

                                  <SQL>Select * from Authors</SQL>

                                  <Description> ddd</Description>

                                  <Parameters>                                  

                                  </Parameters>

                            </SQLStatement>                  

                    </SQLStatements>                   

                    <Transitions>

                           <Transition Id="Trans-1" Name="" From="activity-1" To="activity-2" Loop="NOLOOP">

                                  <Description>Transition from activity 1 to 2</Description>

                           </Transition>

                           <Transition Id="Trans-2a" name="" From="activity-2" To="activity-3">    

                           </Transition>

                           <Transition Id="Trans-2b" name="" From="activity-2" To="activity-4">    

                           </Transition>

                           <Transition Id="Trans-3a" name="" From="activity-3" To="activity-5">

                           </Transition>

                           <Transition Id="Trans-3b" name="" From="activity-4" To="activity-5">

                                  <Description>Transition into activity 5</Description>

                           </Transition>

                    </Transitions>                    

                    <Activities>                       

                           <Activity Id="activity-1" Name="Activity 1">

                                  <Description>First activity</Description>

                                  <Limit>30s</Limit>

                                  <Implementation>

                                         <Tool Id="A1" Type="APPLICATION">

                                                <Description>Test tool</Description>

                                         </Tool>

                                  </Implementation>

                           </Activity>                        

                           <Activity Id="activity-2" Name="Activity 2">

                                  <Limit>2m</Limit>

                                  <Implementation>

                                         <No/>

                                  </Implementation>                                  

                                  <!-- XOR split into activities 3 and 4 -->

                                  <TransitionRestrictions>

                                         <TransitionRestriction>

                                                <Split Type="XOR">

                                                       <TransitionRefs>

                                                              <TransitionRef Id="Trans-2a"/>

                                                              <TransitionRef Id="Trans-2b"/>

                                                       </TransitionRefs>

                                                </Split>

                                         </TransitionRestriction>

                                  </TransitionRestrictions>

                           </Activity>                        

                           <Activity Id="activity-3" Name="Activity 3">

                                  <Limit>2m</Limit>

                                  <Implementation>

                                         <Tool Id="A4" Type="APPLICATION">

                                                <Description>Test tool</Description>

                                         </Tool>

                                  </Implementation>

                           </Activity>                        

                           <Activity Id="activity-4" Name="Activity 4">

                                  <Limit>10m</Limit>

                                  <Implementation>

                                         <Tool Id="A4" Type="APPLICATION">

                                                <Description>Test tool</Description>

                                         </Tool>

                                  </Implementation>

                           </Activity>                        

                           <Activity Id="activity-5" Name="Activity 5">

                                  <Limit>10m</Limit>

                                  <Implementation>

                                         <Tool Id="A5" Type="APPLICATION">

                                                <Description>Test tool</Description>

                                         </Tool>

                                  </Implementation>                                  

                                  <!-- AND join from activities 3 and 4 -->

                                  <TransitionRestrictions>

                                         <TransitionRestriction>

                                                <Join Type="AND"/>

                                         </TransitionRestriction>

                                  </TransitionRestrictions>

                           </Activity>                 

                    </Activities>               

             </ReportProcess>             

      </ReportProcesses>

</ReportPackage>

7.11.2    订单报表

8.    格式定义器

9.    引擎定义器

10. 引擎运行器

报表运行器是整个报表引擎的协调、运转中心——总控制室,是整个系统的核心部分。它的性能、负载、响应直接影响到用户的使用情况。所以,在设计这一部分时,应重点考虑以缓冲池的方式,及时响应用户的请求。同时,对于错误信息的处理,也是比较重要的一部分;因为系统大部分的出错可能,都在这一部分会体现出来;日志也是最常用的功能;对于引擎来说,还有一部分功能,是辅助性的,如提供安全、群集、保存、恢复等。

下面是它的类图:

它包括报表引擎定义部分的上载、实例化引擎、起动引擎、暂停引擎等操作;对于分布式的报表引擎或多分支引擎,还有路由的处理;如果用到外部的应用程序,还有外部程序的接口部分。

由于引擎运行部分只负责报表的运行,不负责运算,真实地运算处理是在策略引擎中完成,因而提供了策略引擎的接口;还有对报表引擎的运行情况进行监视的监视器接口部分。

报表引擎的起动是由客户接口的调用起动的。在报表请求器中,对用户的请求及传入的参数进行封装,直接传入封装后的对象传入到Report Engine中,Report Engine根据传入的参数,查找相应的报表定义;如果找到,开始初始化报表数据并从第一个算法开始运算;如果没有找到,Report Engine返回NotFoundReportProcess错误返回给请求端。

当实例化的ReportProcessInstance起动时,它本身只负责从ReportProcess的资源中读取信息,不会运行;真实的运行处理是ProcessInstanceRunner,它才是直接运行者,它根据Transitions的内容开始起动,并从第一个ActivityInstance处起动。ActivityInstance本身也只是维护当前实例的状态及Activity的信息,不负责运算;它会实例化一个ActivityInstanceRunner,并执行真实的运算。

ActivityInstanceRunnerGlobalContextReportContext中读取系统的环境变量,调用Arithmetic对象,执行算法。当Arithmetic被调用时,它直接向策略引擎传入算法信息、参数信息、以及环境变量信息等,请求策略引擎处理真实的算法。ActivityInstanceRunner根据策略引擎返回的结果,进行一些必要的处理,再返回到ReportProcessInstance中,在这里,ReportProcessInstance会根据Transitions的内容,执行下一步的运算,一直到运算结束。

当运算结束后,ReportProcessInstance返回运行后的结果信息给请求者。

11. 策略引擎

12. 引擎监控器

13. 报表生成器

14. 总结

15. 参考文档

这是一个通用报表引擎,构想完成的功能有: 1、提供给软件开发商一个报表开发中间件。针对c/s平台,用户可以以SDK的方式或Com的方式将其加入到自己的产品中。 针对b/s平台,该中间件通过在应用服务器端嵌入服务以处理WEB报表请求同时返回HTML页面。C/S架构中能够非常方便 的展示、打印、自动分页等功能,可以通过配置文件配置一张报表。支持复杂的财务报表。 2、可以作为一个通用的外挂式报表系统终端,可以在设计器中设计报表的取数规则,这些规则包括数据来源的数据库、数据 表以及相应的取数条件,这些规则会被报表底层解析成特定SQL语句并执行。最后将返回的数据直接按照配置的数据展示 逻辑展示在报表设计器中。 3、可以作为一般通用的表格应用系统被集成到应用软件中,以提供类似于Excel的部分基本表格功能。 以下为软件架构及开发现状的一点说明: 目前,报表底层大部分功能已经完成。Demo展示的报表设计器由于时间比较仓促部分底层已实现的基本功能还没能集成进去, 所以此Demo程序仅能展示部分功能。同时由于方便打包及展示,我特意将报表底层部件静态编译到了设计器中。这样演示的 时候作为一个“绿色软件”可以不基于其他支持库而运行。真正的报表底层包括以下几个Dll: 1、LTableLib.dll (提供表格的基本逻辑) 2、LGridLib.dll (提供数据表的一些增强功能) 3、LSheetLib.dll (提供类似于Excel中工作表的功能) 4、LGUILib.dll (提供表格绘制功能:为了兼容于非Windows系统(如Linux) ,特将系统相关的展现接口独立出来。可以非常方便的将本系统移植到非Windows系统中) 5、LGridBook.dll(封装类似于Excel中工作簿(Book)功能,本Dll为提供用户SDK开发的最终接口) 6、(可选)CLGridBook.dll(为了兼容其他支持Com标准的非c/c++开发工具(如:VB、VF、Delphi等),特意将底层封装 为一个标准Com组件,可以更加方便的提供支持) 最后,为了支持后续的功能扩展,系统设计成了一个开放性系统。新增的功能可以通过实现系统提供的各种插件接口进行任意扩展(如 Demo中插入图片的功能就是其中一个例子,另外艺术字及图表功能可以通过类似方式提供支持)。在可移植性方面,由于所有的底层代码 均采用标准C++编写,同时有效的将操作系统相关的技术进行了抽象(如展现GUI、事件、定时器、同步对象等)。在移植的时候只需要 重新实现几个简单的接口就可以了。 Demo中LRptDemo.etl文件是用设计器设计的一个报表样式,可以通过设计器将此文件打开展示。由于开发设计器的时间比较仓促,所以很多 菜单功能以及部分工具按钮功能还没有加进去(尽管这些功能以及被底层所支持)。 另:报表类似于Excel的公式及常用函数支持正在编写中,已实现的功能也不可避免的存在或多或少的BUG,见笑了 :) 如需要SDK/或COM开发包可以发邮件给我。呵呵:) E-Mail:zhiyong.luo@longshine.com
--新增功能:支持图片显示 --新增功能:增加分组头设置,支持按字段分组,分组次级排序 --新增功能:增加Avg求平均函数,GroupRowNumber分组行号函数 --新增功能:支持四则运算优先运算 --新增功能:单元格支持拖放调整顺序 --新增功能:新增百分率格式化 --新增功能:新增RowNumber行号函数 --修正数个Bug 详情参考:http://blog.csdn.net/hunkcai/archive/2010/10/10/5932204.aspx Web报表引擎: Web上的良好的打印解决方案,WinForm的打印预览体现,报表自动化,支持直接打印,页小计,统计,转成金额大写,一维码显示, 图片显示等功能,满足中国式报表的常见功能需求。 Web报表编辑器: * Web上良好的报表设计用户体现,可视化编辑,支持设计/预览视图撤换。 * 通过下拉框选择,快速设置报表数据的绑定。 * 支持单元格内容格式化(数字,金额,日期等)输出。 * 通过表达式编辑,轻松设计页小计行或页统计行。 * 支持标题高度,行高,列宽拖动编辑,拖放调整顺序等良好操作。 注: * 用Adobe Flash Builder 4/Flex Builder 3开发环境打开,用Flex SDK 3.5进行编译 * 内有报表样式定义说明 * 内有Demo工程参考,使用MyReport * 不提供MyReport源码,提供swc组件(类似dll) * 只需少量工作就能把MyReport整合,获得良好的打印体现和报表设计体现。 * 报表引擎效果图参考:http://blog.csdn.net/hunkcai/archive/2010/01/14/5190898.aspx * 报表编辑器效果图参考:http://blog.csdn.net/hunkcai/archive/2010/04/21/5512031.aspx
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值