莫洪艷
(天津天鐵冶金集團熱軋板有限公司,河北涉縣056404)
采用MES數據存儲與水晶報表開發中國式報表
莫洪艷
(天津天鐵冶金集團熱軋板有限公司,河北涉縣056404)
針對MES中的報表格式復雜,信息量大,且企業報表存在“善變”的特點,采用數據庫存儲過程與水晶報表結合的方式,對中國式報表進行開發,加強了報表的統計和對比功能,提高了整個系統的可靠性。
MES;存儲;水晶報表;中國式報表
天鐵熱軋板卷工程產線覆蓋煉鋼、連鑄、熱軋和各系統配套的公輔設施。天鐵熱軋MES系統作為天鐵熱軋公司生產制造的核心,接收集團ERP系統的銷售訂單,設計、協調、組織、監控各工序的生產。MES系統查詢統計模塊提供各種方便、靈活、實時、有效的查詢、統計和分析功能,對從各個工序收集上來的生產實際數據進行統計和分析,形成各類報表,為公司的生產、經營、財務、購銷管理提供數據基礎,幫助管理人員對生產進行管理和決策。
一般情況下國外的報表樣式非常規整,沒有格線,表頭非常簡單,沒有斜線表頭、沒有分層分組。單張報表提供的信息有限,如果要查看所有信息,只能將幾張表進行對照。
而中國式的報表格式復雜、信息量大。中國報表很少有不帶格線的,因為中國的表頭比較亂,三五層的大格套小格很常見,還有著名的斜線,沒有格線容易看走眼。中國式報表的信息量大,各種各樣的數據,明細、匯總往往都集中在一張紙上。中國式報表的復雜有多種原因,有人認為是應用水平低、業務不規范造成的;也有人認為可能報表習慣與文化有關。中國式報表要求格式復雜意味著報表開發工具需要具有強大的版面設計能力;信息量大意味著報表開發過程中需要大量的復雜的統計運算。一個適合中國式報表的工具應該能夠同時解決以上兩個問題,這才能算是一個好的工具。
天鐵熱軋MES系統中的多數報表也是典型的具有中國特色的中國式報表。如圖1(部分數據進行遮擋處理)所示,一個煉鋼連鑄區域的生產日報表,涵蓋煉鋼連鑄產線中多個工序、不同工位和班次的生產情況。針對生產出的板坯又要根據鋼種分別統計產量、檢驗合格量、外銷量、庫存量,這里面多個數值不僅要求當日數值,還有要求累計數值,月累計或年累計;此外,又要對重點設備的運行情況進行監控,比如轉爐的爐齡。這樣一個復雜的報表將中國式報表“一表展乾坤”的特色演繹得淋漓盡致。針對報表復雜性的特點,又考慮到企業報表存在“善變”的特點,我們從統計運算和報表格式兩個方面下手,采用數據庫存儲過程與水晶報表結合的方式開發報表,效果還是非常不錯的。

圖1 天鐵熱軋MES系統中部分報表
在MES報表開發中,不同于二級報表更注重生產過程和曲線,MES報表更注重統計和對比,這樣就涉及到大量的計算和統計,這些報表數據大多來自于一個或多個生產實際數據表,尤其針對日報表或以日報為基礎的各類數據統計,每個終端客戶查詢一次報表就在本地對各工序數據進行一次統計是不現實的,通訊流量、本地資源占用等都會受到很大影響。最好的辦法就是在數據庫中做好任務,每天由數據庫利用閑時來進行統計,然后供客戶端查詢。
利用存儲過程來處理報表的計算具有很高的優越性,原因源于存儲過程的執行效率高,并具有非常強的可重用性、可移植性、可維護性和安全性。
存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度;存儲過程是由流控制和SQL語句書寫的過程,這個過程經編譯和優化后,存儲在數據庫服務器中,應用程序使用時只要調用即可。只需要寫一次,即可以由數據庫任務來調用,也可以在客戶端由應用程序調用;本項目的Oracle在AIX系統下運行,即使將來操作系統變化或版本升級,Oracle良好的移植性也可以完全應對;針對生產過程中存在的不確定因素,各種報表也要根據需要進行調整,針對數據統計計算方面的更改,只需要進行存儲過程的修改和編譯就可以了,而客戶端代碼的零修改極大地方便了開發和使用人員;存儲過程可設定只有指定用戶才具有對其具有使用權。
水晶報表在布局方面支持交叉報表、子報表。報表格式方面支持添加文本對象、線條對象和框對象,支持插入圖片;提供了非常靈活的機制來自定義報表中對象的外觀,比如數據庫字段、文本對象、公式。通過使用為這些對象準備的各種格式選項,開發人員可以根據需要從各個方面改變報表的外觀,比如字體、大小、顏色、對齊方式等。在計算與統計方面,水晶報表可以添加各種公式字段、匯總字段,提供分組,支持條形圖、餅圖等各種圖表的插入;另外水晶報表還提供如打印日期等特殊字段以及參數字段、未綁定字段等,方便報表的開發與完善。以上特點是可以滿足中國式報表對報表格式和統計的要求。
圖1中報表為例開發存儲過程,考慮篇幅問題,下面例子進行了簡化處理,并部分采用偽SQL語句方便理解。首先,分析該報表涉及到的所有的源數據表,以及需要統計的內容和方法,然后編寫存儲過程,并將結果保存到數據庫中供報表程序使用。如:1#轉爐甲班某日生產爐數,需要訪問的數據庫表為t_bof,統計方法為查詢t_bof表中生產日期為參數日期、班次為甲班并且工位對應1#轉爐的所有數據的條數。
CREATE OR REPLACE PROCEDURE RI_BAO_SHU_JU——存儲過程的名字
(StartTime in varchar2)——參數為統計時間,yyyy-mm-dd
As
……
bof1_jb_zlls number(8,0);——1#轉爐甲班的生產爐數
……
BEGIN
Delete from rp_acto where production_date= StartTime;——如果統計結果已經存在,刪除原有重新計算,針對生產實績中數據有誤,修正后重新進行統計的情況
…
Select count(*)into bof1_jb_zlls number——數據的計算統計過程
from t_bof
where生產日期=StartTime and班次=甲班and工位=1#轉爐;
…
Insert into rp_acto (production_date… , bof1_jb_zlls number,…)
values(StartTime,…,bof1_jb_zlls number,…);——將數據存儲到數據表中
END RI_BAO_SHU_JU
在存儲過程開發并編譯成功后,可以在sql*plus中調用并測試,在通過測試后,利用Oracle任務進行自動調度。數據庫任務開發時調用該存儲過程并將參數設置為“昨天”ri_bao_shu_ju(to_char (trunc(sysdate-1),’yyyy-mm-dd’)),然后設置執行時間和間隔時間等參數。
水晶報表在與數據關聯時存在Pull,Push兩種開發模式,Pull模式基本上不需要編寫什么代碼,訪問數據源有限,做好模板直接調用即可,只是在部署或數據庫等發生變動時比較麻煩;相比較之下,Push模式雖然要多寫些代碼來實現Push的過程,但該方式不僅可以更靈活的組織數據庫里的數據,甚至可以自行任意組織數據,更加靈活可控,通過ADO.Net等可以訪問各種數據源,后面的例子也采用了Push模式。當然,不管選用何種模式,首先要完成的都是報表模板的制作。
開發報表格式可以與存儲過程開發同步進行,只要在開發之初定義好共同使用的數據庫表就可以了。通常我們做普通報表模板開發時重點注意數據源設置、數據字段綁定、特殊字段應用、文本對象設置這些就可以了。以上述報表為例,在.NET項目中添加新建項Crystal報表,選擇相應的模板,可以看到生成.rpt文件。通過打印機設置、紙張設置來完成打印機、紙張大小A4、方向橫向、頁邊距設置。通過數據庫專家添加數據源RP_ACTO,繪制報表模板,這里可以從工具箱中拖拽文本對象、線條對象、框對象到報表模板,通過編輯對象來調整其外觀,并將需要的字段項從字段資源管理器中,通過拖拽將需要展示的字段放到報表模板指定位置上。在字段資源管理器中公式字段中增加公式字段,如:1#連鑄機當日4個班次的合計產量=1#連鑄機當日甲班產量+乙班+丙班+丁班,然后將產生的公式字段拖拽到報表模板上。在字段資源管理器運行總計字段中增加匯總字段,如:1#連鑄機所有鋼種當日產量合計=所有1#連鑄機當日產量求和。從字段資源管理器特殊字段中拖拽打印日期、打印時間到報表頁腳。通過以上操作報表模板基本就完成了。這里面的例子并未包含水晶報表的所有功能,它還支持交叉報表、子報表,可以插入參數字段、未綁定字段、圖片、圖表等,在數據統計方面還可以增加分組并統計。水晶報表強大的功能使得中國式報表模板開發這個難題變得迎刃而解,見圖2。
在完成前面兩項開發之后,開發人員需要將報表整合到MES系統的報表模塊中,此處完成的工作相對簡單好多,這也體現了此種開發方法的優越性。下面的例子采用C#.Net開發,需要引用CrystalDecisions.CrystalReports.Engine。首先定義 Re-portDocument對象,裝載上一步開發好的.rpt報表文件,此處重點是指定好報表文件的存儲位置,路徑可以是絕對路徑也可以是相對路徑,一般情況我們采用的是相對項目的相對路徑。

圖2 水晶報表
ReportDocument myReport=new ReportDocument();
stringreportPath=Application.StartupPath.ToString ()+@"Reports"+strReportFileName;
myReport.Load(reportPath);
在定義報表對象并指定裝載的報表文件后,需要對報表的數據源進行指定。這個步驟我們要結合界面輸入的查詢條件來完成,在此不贅述。
OracleConnection oraconn=new OracleConnection(connectString);
OracleDataAdapter oda=new OracleDataAdapter (SelectSqlString,oraconn);
DataSet ds=new DataSet();
……
oda.Fill(ds,"students");
myReport.SetDataSource (ds.Tables ["students"]);//為報表填充數據源
最后把報表綁定到CrystalReportViewer控件,供用戶查詢導出,CrystalReportViewer控件具有打印、縮放、導出等多種功能,對于一般報表來說,它的功能足夠強大了。
crystal Report Viewer1.ReportSource=myReport。
報表作為MES系統中非常重要的一部分,一個好的開發方法給整個系統帶來的好處不僅是開發時間的縮短,還極大提高了整個系統的可靠性和可維護性。本文中只是從總體結構上介紹了開發過程中,在實際開發過程中還有很多細節需要優化,如存儲過程在開發過程中要注重PL/SQL的優化,在保障功能的前提下如何進行效率和性能的提升;在水晶報表中如何動態控制字段的寬度和高度等。
[1] 顧云鋒,楊素霞,王智鋼,等.Oracle數據庫中存儲過程開發研究[J].計算機與現代化,2011(10):138-142.
[2]歐陽艷階.Net平臺下水晶報表的應用研究[J].軟件工程師,2012(7):38-40.
[3] 叢鳳俠,楊玉強.通用水晶報表平臺關鍵技術研究[J].計算機技術與發展,2013(6):219-222.
Chinese Style Report Development with MES Data Storage and Crystal Report
MO Hong-yan
(Plate Hot Rolling Company Limited,Tianjin Tiantie Metallurgy Group,She County, Hebei Province 056404,China)
Aiming at complicated reports with massive information in MES and the"changing"characteristic of enterprise reports,from aspects of statistical operation and report format,Chinese style report was developed by way of the combination of database storage process and crystal report.The statistics and comparison functions of report were enhanced and the reliability of the whole system was improved.
MES;storage;crystal report;Chinese style report
10.3969/j.issn.1006-110X.2016.06.006
2016-08-11
2016-08-25
莫洪艷(1982—),女,工程師,主要從事鋼鐵行業MES的開發與維護工作。