喻道遠 何世林 陸 遠 張三強 史登松 李蘇珂
(①華中科技大學數字制造裝備與技術國家重點實驗室,湖北武漢430074①南昌大學機電工程學院,江西南昌 330031)
報表生成是MES(制造執行系統)的核心功能之一,其主要功能是對MES中大量的生產數據進行加工分析,形成結構復雜的、樣式多樣的生產統計分析報表,力求能夠直觀、綜合、概括生產過程中各業務之間的內在聯系,為企業的生產決策層提供準確的生產數據信息[1]。目前很多企業的 MES報表系統采用以EXCEL的形式呈現[2-4],采用此方法的報表系統,用戶容易掌握,結構容易調整,但是代碼重用度低,報表發布和管理困難,且容易摻雜人為因素,報表格式沒有統一的規范,數據的準確性相對較低。
近年來隨著.NET技術的迅速發展,使得其自帶的水晶報表成為報表系統新的研究對象[5-6],水晶報表的優點是外觀顯示效果好,代碼開發量少,但是在其具體應用中會遇到了很多問題,如:后期的維護不方便,只有開發人員才可以修改報表結構和數據源,用戶無法或只能少量的定義和修改,任何的業務變動都有可能需要修改存儲過程甚至.NET代碼。
MES報表格式因企業業務需求的不同而不盡相同。例如汽車總裝線業務所需的報表就有生產月報表、年報表、上線報表、下線報表和入庫報表等五大類。各類報表格式迥異,有縱向排列的也有橫向伸展的,有些報表的框架結構是固定不變的,另外一些則是根據所得數據量的多少動態搭建的;各類不同報表之間有很多結構相同的報表塊,如通用的標題欄等,同類單個報表也有很大一部分結構是由多個相同的小報表塊重復疊加組合而成,如年報表就是由12個結構相同的月統計記錄報告組合而成;隨著MES在裝配線上的應用,用戶對報表的需求也會隨之變化,可能不再拘泥于以上五類報表形式,如上線初期生產線電子看板功能就被提到案上,用戶希望可以在MES報表系統上直觀地、透明地和交互地設計用戶想要的報表。綜上,MES報表的特點可以概括為:類型多樣,結構動態,重復區多,用戶可配置。
MES柔性報表系統的技術方案采用基于.NET和Oracle技術進行開發。這種方案有其自身的優點:統一的操作界面,用戶容易熟悉,操作方便,所有的應用在服務器端生成,對客戶端配置要求低,報表發布和管理簡單。為克服報表系統維護的困難,將整個報表生成過程分為兩個層次:報表結構構造層和數據整合層。報表結構構造層的功能有參數的定義與讀取、報表結構搭建、表格樣式設置以及XML配置;數據整合層為結構層提供豐富、準確的數據,主要實現功能有數據源配置、存儲過程的定義、觸發器的定義、數據視圖的定義、傳遞查詢參數以及從數據庫中查詢整合并提取數據。報表結構構造層與數據整合層通過各自包含的邏輯類庫相互訪問,松散耦合,可移植性和通用性強。

圖1所示的報表平臺中,結構構造層為用戶提供可視化的報表繪制界面,用戶能夠定義和修改行和格的尺寸大小、布局、字體、顯示內容,增加、刪除和修改報表的行數和格數,定義和修改報表查詢參數等,可以認為這種報表編輯界面完全能夠達到用戶自定義的要求。數據整合層主要完成兩項工作,一是和結構構造層一起完成報表的搭建,數據整合層從數據庫中讀取表格的嵌套結構信息,反饋給結構構造層,結合結構構造層的行、格結構信息,搭建出整張報表;二是獲取數據,用戶在結構構造層中輸入報表查詢參數、設置查詢語句,數據整合層提取參數、配置數據源并從數據庫中獲取數據。
首先,通過對企業目前各類不同的報表分析,總結出一張復雜的報表是由許多結構較為簡單的內嵌表和單元格組合而成的。“行”是報表的的第1級元素,可以認為在柔性報表系統中任意一張報表都是由多個行對象組成的,報表的每一行包含若干列,行和列所對應的就是格對象。“格”是報表的第2級元素,格的內容可以是單元格也可以是加入格中的內嵌表,有很大一部分報表都有相同結構的內嵌表。因此,采用表格內嵌表的方式,可以大大提高表格結構的復用性,如圖2所示。

圖2描述了不同類型但有一定相似性的A類報表和B類報表的結構,他們都是由各自的行對象組成,每個行對象中可以放入若干格,格有單元格和內嵌表兩種表現形式。可以看出A類報表由兩個內嵌表A(內嵌表A中同樣也是由內嵌表A1和單元格組成)和單元格組成,B類報表由內嵌表A、內嵌表B以及單元格組成,其中內嵌表A為兩類報表所共有,且在A類報表中重復利用。因此定義這兩種不同類報表只需定義3個內嵌報表A、B、A1即可,這種內嵌表對象的復用大大降低了報表定義的工作量以及代碼的開發量。需要說明的是,圖中單元格可以顯示靜態文字和動態數據,是報表的最小組成元素。內嵌表是指在可以放入到另一個報表中的表格。

在拆分了報表元素之后,得出表對象下各級元素分別為行和格。表對象數目繁多,為了便于管理,故將表分類,用于標示表為普通報表或內嵌表。可以得出以下幾個報表成員:表類型、表對象、行對象、格對象和查詢參數。其數據結構模型如圖3所示。
圖3使用UML模型描述報表的數據結構。表類型對象可以放入多個表對象;表對象可以放入多個行對象;行對象可以放入多個格對象。需要指出的是行對象分為兩類:普通行和數據行,普通行是行數固定的一行,數據行是根據查詢數據量的多少重復顯示格式相同但數據不同的行。格對象的類型有四種:靜態數據格、動態數據格、中間參數格和對象格,靜態數據格用于寫入一些固定不變的信息,這些信息不會因查詢參數的不同而不同,如標題欄的文字、表頭信息等等。動態數據格用于綁定其自身表的數據源字段,中間參數格用于綁定不同表之間的數據源字段,如當內嵌表中的某一格需要填充外部總表的數據源字段時,則需要采用中間參數格,對象格用于放入某個內嵌表,實現表格的嵌套。查詢參數是與表對象相關聯的,是多對一的關系,即與表對象可以有多個關聯也可以沒有關聯的查詢參數,表對象根據其自身的數據源和查詢參數通過數據整合層從數據庫中查詢并寫入數據。數據源一般情況下是一段SQL語句,也可以是在數據庫中已經定義的存儲過程名。
上述柔性報表系統方案已經在國內某汽車總裝線MES上得到應用。此MES的開發環境是VS2008,采用的數據庫是 Oracle9i。以繪制下線報表為例,在頁面表示層中定義報表基本信息、報表查詢參數以及報表結構。報表基本信息中可以定義報表ID、報表名稱、報表類型、邊框樣式和數據源。下線報表查詢參數包括車型類型、起始日期和終止日期、查詢自起始日期到終止日期某車型的下線記錄。報表結構定義則根據報表結構模型定義此報表的行數、列數、行樣式、格樣式、行類型、格類型等。報表結構對象的表、行、格可直接與HTML中的TABLE、TR、TD等元素相對應。為得到真正“所見即所得”的報表設計,行和格的尺寸均采用mm單位。下線報表采用了三層嵌套結構,最外層總表是由2個行對象組成,第1行是表頭信息,包含7個靜態數據格,分別顯示“序號”、“車型”等靜態數據,第2行只有1格,為對象單元格,用于放入一級內嵌表。一級內嵌表結構由2個行對象組成,第1行放入動態數據格用于顯示“2009-06”和“2009-07”這樣的動態月份數據,第2行只有1格,為對象單元格,用于放入二級內嵌表。二級內嵌表只有一個行對象,有兩格,第1格為對象單元格,放入三級內嵌表,第2格為動態數據格,顯示“小計(臺)”字段,統計各天完工下線的車輛總數。三級內嵌表只有1行,此行屬于“數據行”,會根據查詢數量的多少動態顯示行數,并顯示下線車輛的詳細信息,此行有6格,均為動態數據格。最終查詢2009年6月29日~7月2日CV7/CV9的完工下線報表如圖4所示。

采用將報表劃分為多個簡單內嵌表的組織方式,可以有效快速地繪制格式復雜報表,適用范圍廣,理論上可以構建任意格式的報表,充分體現MES報表系統的柔性。采用雙層報表生成機制,為用戶提供可視化的報表搭建界面,用戶無需掌握任何C#和THML代碼就可輕松繪制出想要的報表格式,使得報表的制定更具靈活性。此方法同樣適用其他報表系統。
[1]王元珍,汪皓.達夢智能報表工具的設計與實現[J].計算機工程與應用,2001,37(4):65-67.
[2]彭海波,王嘵東.JAVA環境中基于XML的一種EXCEL報表生成方法[J],電腦應用技術,2006(68):34-38.
[3]王桂霞,魏海平,梁永燁.MES生產報表子系統的優化[J],當代化工,2009,38(2):188-190.
[4]王銳,呂蘇環.企業生產數據報表集成方式研究與實現[J].自動化博覽,2009,11:57-60.
[5]謝星岸,王志新.B/S在水泥企業制造執行系統MES中的應用[J].微計算機信息,2006,22(7-1):148-150.
[6]陳傳波,黃剛,劉清慧.一種基于ASP.NET的自定義報表的設計與實現[J].計算機工程與科學,2006,28(6):112-114.