标题：报表引擎
报表引擎的概述
报表引擎起源于流行的工作流引擎的原理、报表格式的定义、报表内容的各种算法，产生报表引擎的思想。
它主要是引用工作流引擎的流程运转原理，在原始数据的基础上，定义报表的格式、报表的算法，根据定义的算法自动执行计算，并输出计算后的结果，再根据定义的报表格式显示报表的内容。
报表引擎根据定义的报表主题及它的算法，在人工或日程安排的触发下，自动运行。报表引擎根据报表主题，从数据库的原始数据的基础上，提取原始的数据，依据定义的报表算法，进行自动计算；在提取报表主题及算法运算的过程中，报表引擎依据定义各种参数，实现所需的运算。
报表引擎输出的数据信息，经报表解释接口实现它的解释，并生成相应的报表展示给用户。用户也可以根据实际需求，随时调整报表主题及算法的定义语言，再重新运行报表引擎时，报表引擎立即根据定义后的内容进行处理，产生经过改变后的报表数据。这样，报表引擎可以跟随用户的需求变化，而所需求的维护量非常少，也非常简单，灵活。
对于报表的输出格式，在报表引擎的输出接口中，定义要求的报表格式；当用户打印报表时，报表引擎根据定义的格式打印所需的报表；同时，如果用户需要改变报表的样式时，可以非常即时、灵活的重新定义，以满足用户的各种需求。
报表引擎的结构
报表引擎从整体上划分为：报表请求部分、格式定义部分、引擎定义部分、引擎运行部分、策略引擎部分、引擎监控部分、引擎输出部分，下面对各个部分进行简单的介绍。
报表引擎的总体结构分为七个部分进行介绍，每一部分都是独立运行的一个模块。它们之间经过相互协调工作，共同完成整个报表从定义、请求、执行、监控、分派、显示功能。
整个报表引擎的核心的部分是报表引擎运行器、策略引擎器以及报表生成器。其它几是报表引擎的辅助部分，协调报表引擎的运作。
（1）报表请求器：主要是实现对报表请求参数的封装，实现统一的入口。并负责对请求及响应的集中控制、分配。
（2）报表格式定义器：在这一部分中，主要的功能是实现报表的输出格式的定义、报表栏位中输出的格式（包括字体、颜色、框线、显示样式等），输出的内容（主要是从输出的对象、输出对象的比较简单的计算、页头、分组、页尾等）。
（3）引擎定义器：主要是指当报表引擎运行时，它的每个算法、算法执行次序、是否循环或分解、引用的外部应用接口、路由等信息。算法包括从数据库中读取原始的数据信息、对各种参数进行的计算的算法，算法的形式参数、实际参数、数据类型。
（4）引擎运行器：这也是报表引擎中比较重要的部分，这一部分的性能影响到整个报表引擎的性能。它根据在报表引擎定义部分定义的报表主题、各种算法、次序等信息，进行计算，并返回计算后的结果。对于分布式的报表引擎，路由信息比较重要；当定义了路由信息之后，引擎运行到该处后，将定义在路由表中的引擎起动，并从相应的步骤处开始运行，并返回运行的结果。
（5）策略引擎器：主要是针对用户的定义的算法，根据所需的参数进行计算，并生成计算后的结果返回给调用者。这也是报表引擎比较重要的部分。它也可以适用于业务系统，在策略引擎的协同下，满足业务需求的变动要求，灵活配置业务处理中的业务逻辑。这一部分，对整个引擎的性能也是有巨大的影响，包括从数据库中提取数据信息、各种信息的计算。
（6）引擎监控器：这一部分是辅助功能，主要是监控报表引擎的运行过程，如有些地方需求用户处理的，引擎会等待着用户的处理后，再执行后一个算法。也可以监控引擎在运行过程中的出错信息，以便对引擎的错误进行跟踪；这些错误有可能是系统的、引擎本身的、算法定义的错误等。在监视中，可以查看已在运行的报表，也可以对运行的报表进行暂停、中止、恢复、保存、载入等操作。
（7）引擎输出器：主要是根据报表格式定义的内容，以及引擎运行部分运行的结果，生成输出界面，以比较直观的形式展示给用户浏览。在生成的输出界面中，应该支持常用的几种：HTML，EXCEL，WORD等。
报表引擎的工作流程
（1）在报表引擎定义器中，定义报表引擎的主题信息、计算策略，并根据定义的内容，生成报表引擎的定义文件（XML文件）。
（2）在报表引擎运行器运行时，自动根据系统的配置信息，导入定义好的格式文件，并解释成报表引擎能操作的对象。
（3）当用户请求报表引擎执行报表计算时，传入起动参数及报表的ID，报表引擎在配置文件中查找要计算的报表。找到报表定义文件后，实例化报表的定义对象，并根据算法的执行次序，起动整个报表的执行过程。在报表的每一个算法中，根据定义的形式参数从系统环境中读取实际参数值。
如果算法是一个表达式，系统起动策略引擎器进行计算，再返回运算的结果；
如果算法是调用外部的应用程序或过程，系统会自动根据定义的内容及参数，调用相应的应用程序或过程进行运算，并保存运行的结果。
（4）在整个报表引擎运行过程中，报表引擎监控器可以跟踪报表的执行过程，并记录它的执行过程；也可以对运行的报表执行暂停、中止、恢复、保存、载入等操作。用户可以根据报表的运行情况，分析报表的各种性能及调整报表的执行过程，优化报表引擎的性能。
（5）当报表引擎运行结束后，返回运算结果，报表生成器根据用户在报表格式定义器中定义的报表格式，生成相应的报表，再展示给用户浏览。
报表引擎接口
报表引擎的接口部分是描述整个报表引擎运行时，各个部分之间的相互关系及与外部应用的调用关系的体现。
在整个报表引擎的体系结构中，存在着几个主要的接口信息：客户应用接口、应用程序接口、管理监视接口、报表引擎定义接口、报表格式定义接口、报表引擎协同接口、策略引擎接口。
（1）客户应用接口
客户应用接口是客户参与运算的一处接口信息，当运算过程中要求客户输入一些相关资料参与运算时或客户决定下一个过程转向时，引擎起动这一算法后，就处于等状态，等候客户对它进行处理；客户处理之后，运算过程才继续执行。
为了减少系统的复杂度，所有与客户有关的操作，提供统一的接口进行管理。当客户进行系统后，引擎根据客户的帐号及角色情况，返回客户所有的工作列表；客户可以直接选择要处理的工作列表，直接执行要处理的工作。
当客户处理完工作之后，再次触发引擎继续执行下一步运算。
在处理过程中，可能存在调用外部应用程序一起解决要处理的问题。客户也可以运算过程执行中断、暂停、恢复等操作。
（2）应用程序接口
应用程序接口是引擎与应用程序之间进行交互的接口。当定义报表算法时，有部分功能不能在策略引擎实现或已经存在的系统，引擎通过调用外部的应用程序执行算法的实现，从而集成企业的外部应用程序。
引擎调用外部应用程序时，首先建立与外部应用程序的连接，在保持连接的状态下，通过实际的参数传入应用程序API中，由外部应用程序实现算法，并返回计算的结果信息。在运算结束后，引擎再断开与外部应用程序的连接。
它分为本地过程调用、SHELL脚本的调用、远程执行调用、消息传递、事务处理。
本地过程调用：引擎根据定义的接口信息，创建本地连接器并传入调用的过程名称及它的实际参数。在本地连接器中，执行本地过程计算并返回计算结果。
SHELL脚本的调用：引擎根据定义的脚本（可以是本地文件或在定义格式中直接写入的脚本信息，起动脚本运行器；并根据返回的结果再执行下一步骤的运算。
远程执行调用：引擎根据路由信息，创建远程连接器并起动远程连接，再根据远程连接的参数信息，调用远程过程计算；远程过程计算后，返回计算结果信息；再断开远程的连接。
消息传递：主要是指通过消息服务器，起动消息运算，可以是同步方式或异步方式进行运算。如果同步，创建消息连接后，发送参数信息后，等待消息另一消息的触发后，再处理返回的结果，再继续运算；如是异步方式，引擎等待消息返回，就直接执行下一步运算。
事务处理：主要是对整个计算过程中，起动事务管理。在起动事务后，暂存相关参数；当调用结束后，如发生错误，恢复被改变的参数；如没有发生错误，继续执行下一步运算。
（3）管理监视接口
这一部分主要是对用户权限、引擎日志、运行情况进行监视，并可以随时调整引擎的执行步骤、更改用户的实际权限。同时，在系统日志的记录下，分析引擎的执行情况、性能瓶颈等；并根据分析的结果，调整引擎的执行步骤，优化引擎的执行过程。
同时，也包括对引擎的运算过程进行中断、暂停、恢复等操作。
（4）报表引擎定义接口
报表引擎定义接口，是对报表的整个算法及算法过程的定义。定义之后，可以输出报表引擎定义的描述文档。引擎的执行完全是依据这份文档的内容。
（5）报表格式定义接口
报表格式定义接口，是定义报表的输出界面的样式、报表输出界面与运算最终结果的相互关系。它是一种描述性的语言，只要符合规范，就可以在各个报表生成器中被解释。
在格式语言中，也规范了输出参数的描述方式。输入参数只要符合规范，就可以被报表生成器解释，并依据报表格式定义中的内容，生成输入报表页面。
（6）报表引擎协同接口
报表引擎的协同接口，是对多个报表引擎的一起工作，才能完成的报表运算。如跨地区的报表计算、分布式的报表计算等。这时，报表引擎分布在多个地点上，通过Internet连接起来，在定义引擎执行步骤时，设置它的路由信息、进入的报表算法节点信息。
当报表引擎运行时，引擎本身会起动对其他引擎的连接，并保持连接，通过报表引擎的接口，传入调用的参数，起动外部引擎进行运算；当外部引擎运行完毕后，返回运算结果，再断开引擎的连接。报表引擎根据返回的结果再继续运算其他的算法。
在启动外部的报表引擎时，有两种起动方式：异步与同步。
异步：是指启动外部引擎后，不等外部引擎运行完毕，就继续执行下一个报表算法的运算。
同步：是指启动外部引擎后，暂停报表引擎的运行，一直到外部引擎执行完毕并返回后，再执行下一步骤的运算。
（7）策略引擎接口
策略引擎的接口，也是比较重要的一个环节，它分离了运行与计算之间的耦合关系；从而可以彼此独立的进行设计与实现。只要根据规范的定义，就可以透明的相互协作。
当引擎执行运行时，由引擎起动策略引擎并保持它的连接；然后传入计算的算法及相应的参数信息。策略引擎根据输入的算法表达式及参数进行运算，再返回运算后的结果信息。
报表引擎定义语言
报表引擎定义语言是整个系统的基础，它负责定义整个报表算法的报表过程，相关数据、被调用的应用程序等。只有定义了报表算法的报表过程后，报表引擎才能根据它的内容起动运算。
每一个报表定义格式中由包组成，在包中包括了报表的过程、应用程序或过程、语句描述、相关数据。 它包容了整个报表引擎的元素定义、引用参数、实现方法、运算策略等。
它分为包结构、报表过程、应用程序、相关数据、转移信息、算法、算法集、数据操作集等。
下面首先介绍定义格式的通用结构，它包括扩展属性、形式参数、外部参考。5.1 通用结构5.1.1 扩展属性（extended attribute）
元素名
基本类型
描述
Name
String
标识扩展
Value
String
扩展属性值
5.1.2 形式参数（format parameter）
元素名
基本类型
描述
DataType
String
形式参数的数据类型
Description
String
形式参数的文本描述
Id
String
形式参数的标识ID
Index
String
形式参数的索引号
Mode
String
形式参数的输入/输出模式（IN、OUT、INOUT）
5.1.3 外部参考（external reference）
元素名
基本类型
描述
Location
String
指明类型文档的URI
Namespace
String
实体定义的有效范围
Xref
String
对在外部文档中的实体进行标识
5.1.4 例子
针对上述的结构，下面用几个例子来进行更清晰的说明。
扩展属性：
<ExternalAttributes>
<ExtendedAttribute Name="SystemActivity" Value="WebService"/>
<ExtendedAttribute Name="System" Value="Service"/>
</ExternalAttributes>
形式参数
<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>
外部参考
<FormalParameter Id="orderType" Index="1" Mode="IN">
<DataType>
<ExternalReference location="http://orderschema.xsd"
xref="orderType" 
namespace="orderschema/Order"/>
</DataType>
</FormalParameter>5.2 包结构包结构是报表引擎定义格式的容器，它包括了报表过程、引用的包、应用程序、相关数据、语句集等。
在包的结构中，存在着对其他包的引用，当一个算法要起动另一个包中的报表过程时，使用命名空间指定相应的包中的报表过程；包对包的引用是相互的，也就是存在相互的参照。
在包的结构中，包含着应用程序的定义、报表过程的定义、语句集的定义、相关数据的定义，以及报表头结构的定义。这些定义是全局性的定义，在过程定义中的算法定义中可以引用它的ID进行引用。
下面对各个元素的元素进行描述，使读者更清晰地了解报表引擎的过程定义语言的格式及内容。
5.2.1 报表包（report package）
元素名
基本类型
描述
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语句（如数据库支持，直接使用。否则实现解释）
5.2.2 报表包头（package header）
元素名
基本类型
描述
Version
String
报表的规范版本信息
Vendor
String
报定义的由来，包括开发者名称、产品名称以及产品的发布版本号等
Created
String
报表定义的创建日期
Description
String
报表的文本描述
Documentation
String
操作系统的路径，帮助文件以及描述文件的文件名
PriorityUnit
String
用户自定义语义的字符串
Cost Unit
String
模拟数据使用单元
5.2.3 可重定义包头（redefindable header）
元素名
基本类型
描述
Author
String
包定义的作者
Version
String
包定义的版本
Code page
String
正文部分的页码
CountryKey
String
国家代码
5.2.4 包外部思考（external package）
素名
基本类型
描述
href
String
包的ID，对外部包的引用
Extended Attributes
ExtendedAttribute
用户扩展的属性，定义用户自己对外部包的引用原则，以满足用户的特殊要求。
5.2.5 例子
针对上述的结构，下面用几个例子来进行更清晰的说明。
报表包头
<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>
可重定义包头
<RedefinableHeader PublicationStatus="UNDER_TEST">
<Author>kevin</Author>
<Version>1.0</Version>
<Codepage>1</Codepage>
<Countrykey>china</Countrykey>
</RedefinableHeader>
包外部参考
<ExternalPackages>
<ExternalPackage href="ss.xml"/>
</ExternalPackages>
报表控件
报表引擎处于每种 Business Objects 报表解决方案的核心。它处理所有用户请求，并输出报表信息。 
各个解决方案同时处理用户请求的最大吞吐量各不相同。在某些解决方案中，它是由结构设计或授权限制设置的。
报表引擎使用报表定义文件 (.rpt) 作为模板。然后，它从数据源获取数据并使用报表定义呈现当前请求的报表，之后该报表将传递给报表查看器。从查看器接收到的信息或使用接口 SDK 编写的代码会触发报表引擎执行进一步的处理，即对报表执行进一步的操作。 
报表控件就是这样利用报表引擎工作的。