結構
報表引擎從整體上劃分為:報表請求部分、格式定義部分、引擎定義部分、引擎運行部分、策略引擎部分、引擎監控部分、引擎輸出部分,下面對各個部分進行簡單的介紹。
報表引擎的總體結構分為七個部分進行介紹,每一部分都是獨立運行的一個模組。它們之間經過相互協調工作,共同完成整個報表從定義、請求、執行、監控、分派、顯示功能。
整個報表引擎的核心的部分是報表引擎運行器、策略引擎器以及報表生成器。其它幾是報表引擎的輔助部分,協調報表引擎的運作。
(1)報表請求器:主要是實現對報表請求參數的封裝,實現統一的入口。並負責對請求及回響的集中控制、分配。
(2)報表格式定義器:在這一部分中,主要的功能是實現報表的輸出格式的定義、報表欄位中輸出的格式(包括字型、顏色、框線、顯示樣式等),輸出的內容(主要是從輸出的對象、輸出對象的比較簡單的計算、頁頭、分組、
頁尾等)。
(3)引擎定義器:主要是指當報表引擎運行時,它的每個算法、算法執行次序、是否循環或分解、引用的外部套用接口、路由等信息。算法包括從資料庫中讀取原始的數據信息、對各種參數進行的計算的算法,算法的
形式參數、
實際參數、
數據類型。
(4)引擎運行器:這也是報表引擎中比較重要的部分,這一部分的性能影響到整個報表引擎的性能。它根據在報表引擎定義部分定義的報表主題、各種算法、次序等信息,進行計算,並返回計算後的結果。對於分散式的報表引擎,路由信息比較重要;當定義了路由信息之後,引擎運行到該處後,將定義在
路由表中的引擎起動,並從相應的步驟處開始運行,並返回運行的結果。
(5)策略引擎器:主要是針對用戶的定義的算法,根據所需的參數進行計算,並生成計算後的結果返回給調用者。這也是報表引擎比較重要的部分。它也可以適用於業務系統,在策略引擎的協同下,滿足業務需求的變動要求,靈活配置業務處理中的業務邏輯。這一部分,對整個引擎的性能也是有巨大的影響,包括從資料庫中提取數據信息、各種信息的計算。
(6)引擎
監控器:這一部分是輔助功能,主要是監控報表引擎的運行過程,如有些地方需求用戶處理的,引擎會等待著用戶的處理後,再執行後一個算法。也可以
監控引擎在運行過程中的出錯信息,以便對引擎的錯誤進行跟蹤;這些錯誤有可能是系統的、引擎本身的、算法定義的錯誤等。在監視中,可以查看已在運行的報表,也可以對運行的報表進行暫停、中止、恢復、保存、載入等操作。
(7)引擎輸出器:主要是根據報表格式定義的內容,以及引擎運行部分運行的結果,生成輸出界面,以比較直觀的形式展示給用戶瀏覽。在生成的輸出界面中,應該支持常用的幾種:HTML,EXCEL,WORD等。
工作流程
(1)在報表引擎定義器中,定義報表引擎的主題信息、計算策略,並根據定義的內容,生成報表引擎的
定義檔案(XML檔案)。
(2)在報表引擎運行器運行時,自動根據系統的配置信息,導入定義好的格式檔案,並解釋成報表引擎能操作的對象。
(3)當用戶請求報表引擎執行報表計算時,傳入起動參數及報表的ID,報表引擎在配置檔案中查找要計算的報表。找到報表
定義檔案後,實例化報表的定義對象,並根據算法的執行次序,起動整個報表的執行過程。在報表的每一個算法中,根據定義的
形式參數從系統環境中讀取
實際參數值。
如果算法是一個
表達式,系統起動策略引擎器進行計算,再返回運算的結果;
如果算法是調用外部的應用程式或過程,系統會自動根據定義的內容及參數,調用相應的應用程式或過程進行運算,並保存運行的結果。
(4)在整個報表引擎運行過程中,報表引擎
監控器可以跟蹤報表的執行過程,並記錄它的執行過程;也可以對運行的報表執行暫停、中止、恢復、保存、載入等操作。用戶可以根據報表的運行情況,分析報表的各種性能及調整報表的執行過程,最佳化報表引擎的性能。
(5)當報表引擎運行結束後,返回運算結果,報表生成器根據用戶在報表格式定義器中定義的報表格式,生成相應的報表,再展示給用戶瀏覽。
接口
報表引擎的接口部分是描述整個報表引擎運行時,各個部分之間的相互關係及與外部套用的調用關係的體現。
在整個報表引擎的
體系結構中,存在著幾個主要的接口信息:客戶套用接口、
應用程式接口、管理監視接口、報表引擎定義接口、報表格式定義接口、報表引擎協同接口、策略引擎接口。
(1)客戶套用接口
客戶套用接口是客戶參與運算的一處接口信息,當運算過程中要求客戶輸入一些相關資料參與運算時或客戶決定下一個過程轉向時,引擎起動這一算法後,就處於等狀態,等候客戶對它進行處理;客戶處理之後,運算過程才繼續執行。
為了減少系統的複雜度,所有與客戶有關的操作,提供統一的接口進行管理。當客戶進行系統後,引擎根據客戶的帳號及角色情況,返回客戶所有的工作列表;客戶可以直接選擇要處理的工作列表,直接執行要處理的工作。
當客戶處理完工作之後,再次觸發引擎繼續執行下一步運算。
在處理過程中,可能存在調用外部應用程式一起解決要處理的問題。客戶也可以運算過程執行中斷、暫停、恢復等操作。
應用程式接口是引擎與應用程式之間進行互動的接口。當定義報表算法時,有部分功能不能在策略引擎實現或已經存在的系統,引擎通過調用外部的應用程式執行算法的實現,從而集成企業的外部應用程式。
引擎調用外部應用程式時,首先建立與外部應用程式的連線,在保持連線的狀態下,通過實際的參數傳入應用程式API中,由外部應用程式實現算法,並返回計算的結果信息。在運算結束後,引擎再斷開與外部應用程式的連線。
它分為
本地過程調用、SHELL腳本的調用、遠程執行調用、訊息傳遞、事務處理。
本地過程調用:引擎根據定義的接口信息,創建本地連線器並傳入調用的過程名稱及它的
實際參數。在本地連線器中,執行本地過程計算並返回計算結果。
SHELL
腳本的調用:引擎根據定義的腳本(可以是本地檔案或在定義格式中直接寫入的腳本信息,起動腳本運行器;並根據返回的結果再執行下一步驟的運算。
遠程執行調用:引擎根據路由信息,創建
遠程連線器並起動遠程連線,再根據遠程連線的參數信息,調用遠程過程計算;遠程過程計算後,返回計算結果信息;再斷開遠程的連線。
訊息傳遞:主要是指通過
訊息伺服器,起動訊息運算,可以是同步方式或異步方式進行運算。如果同步,創建訊息連線後,傳送參數信息後,等待訊息另一訊息的觸發後,再處理返回的結果,再繼續運算;如是異步方式,引擎等待訊息返回,就直接執行下一步運算。
事務處理:主要是對整個計算過程中,起動事務管理。在起動
事務後,暫存相關參數;當調用結束後,如發生錯誤,恢復被改變的參數;如沒有發生錯誤,繼續執行下一步運算。
(3)管理監視接口
這一部分主要是對用戶許可權、引擎日誌、運行情況進行監視,並可以隨時調整引擎的執行步驟、更改用戶的實際許可權。同時,在
系統日誌的記錄下,分析引擎的執行情況、性能瓶頸等;並根據分析的結果,調整引擎的執行步驟,最佳化引擎的執行過程。
同時,也包括對引擎的運算過程進行中斷、暫停、恢復等操作。
(4)報表引擎定義接口
報表引擎定義接口,是對報表的整個算法及算法過程的定義。定義之後,可以輸出報表引擎定義的描述文檔。引擎的執行完全是依據這份文檔的內容。
(5)報表格式定義接口
報表格式定義接口,是定義報表的輸出界面的樣式、報表輸出界面與運算最終結果的相互關係。它是一種描述性的語言,只要符合規範,就可以在各個報表生成器中被解釋。
在格式語言中,也規範了輸出參數的描述方式。輸入參數只要符合規範,就可以被報表生成器解釋,並依據報表格式定義中的內容,生成輸入報表頁面。
(6)報表引擎協同接口
報表引擎的協同接口,是對多個報表引擎的一起工作,才能完成的報表運算。如跨地區的報表計算、分散式的報表計算等。這時,報表引擎分布在多個地點上,通過Internet連線起來,在定義引擎執行步驟時,設定它的路由信息、進入的報表算法節點信息。
當報表引擎運行時,引擎本身會起動對其他引擎的連線,並保持連線,通過報表引擎的接口,傳入調用的參數,起動外部引擎進行運算;當外部引擎運行完畢後,返回運算結果,再斷開引擎的連線。報表引擎根據返回的結果再繼續運算其他的算法。
在啟動外部的報表引擎時,有兩種起動方式:異步與同步。
異步:是指啟動外部引擎後,不等外部引擎運行完畢,就繼續執行下一個報表算法的運算。
同步:是指啟動外部引擎後,暫停報表引擎的運行,一直到外部引擎執行完畢並返回後,再執行下一步驟的運算。
(7)策略引擎接口
策略引擎的接口,也是比較重要的一個環節,它分離了運行與計算之間的耦合關係;從而可以彼此獨立的進行設計與實現。只要根據規範的定義,就可以透明的相互協作。
當引擎執行運行時,由引擎起動策略引擎並保持它的連線;然後傳入計算的算法及相應的參數信息。策略引擎根據輸入的算法
表達式及參數進行運算,再返回運算後的結果信息。
定義語言
報表引擎定義語言是整個系統的基礎,它負責定義整個報表算法的報表過程,相關數據、被調用的應用程式等。只有定義了報表算法的報表過程後,報表引擎才能根據它的內容起動運算。
每一個報表定義格式中由包組成,在包中包括了報表的過程、應用程式或過程、語句描述、相關數據。 它包容了整個報表引擎的元素定義、
引用參數、實現方法、運算策略等。
它分為包結構、報表過程、應用程式、相關數據、轉移信息、算法、算法集、數據操作集等。
下面首先介紹定義格式的通用結構,它包括擴展屬性、
形式參數、外部參考。
通用結構
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>
包結構
包結構是報表引擎定義格式的容器,它包括了報表過程、引用的包、應用程式、相關數據、語句集等。
在包的結構中,存在著對其他包的引用,當一個算法要起動另一個包中的報表過程時,使用命名空間指定相應的包中的報表過程;包對包的引用是相互的,也就是存在相互的參照。
在包的結構中,包含著應用程式的定義、報表過程的定義、語句集的定義、相關數據的定義,以及報表頭結構的定義。這些定義是全局性的定義,在過程定義中的算法定義中可以引用它的ID進行引用。
下面對各個元素的元素進行描述,使讀者更清晰地了解報表引擎的過程定義語言的格式及內容。
報表包(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語句(如資料庫支持,直接使用。否則實現解釋)
|
報表包頭(package header)
元素名
| 基本類型
| 描述
|
Version
| String
| 報表的規範版本信息
|
Vendor
| String
| 報定義的由來,包括開發者名稱、產品名稱以及產品的發布版本號等
|
Created
| String
| 報表定義的創建日期
|
Description
| String
| 報表的文本描述
|
Documentation
| String
| 作業系統的路徑,幫助檔案以及描述檔案的檔案名稱
|
PriorityUnit
| String
| 用戶自定義語義的字元串
|
Cost Unit
| String
| 模擬數據使用單元
|
可重定義包頭(redefindable header)
元素名
| 基本類型
| 描述
|
Author
| String
| 包定義的作者
|
Version
| String
| 包定義的版本
|
Code page
| String
| 正文部分的頁碼
|
CountryKey
| String
| 國家代碼
|
包外部思考(external package)
素名
| 基本類型
| 描述
|
href
| String
| 包的ID,對外部包的引用
|
Extended Attributes
| ExtendedAttribute
| 用戶擴展的屬性,定義用戶自己對外部包的引用原則,以滿足用戶的特殊要求。
|
例子
針對上述的結構,下面用幾個例子來進行更清晰的說明。
報表包頭
<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 編寫的代碼會觸發報表引擎執行進一步的處理,即對報表執行進一步的操作。
報表控制項就是這樣利用報表引擎工作的。