小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

用FASTREPORT實現(xiàn)WEB應用中自定義報表

 WindySky 2009-02-10

開發(fā)WEB應用系統(tǒng)通常都會遇到報表打印問題。簡單應用可利用IE的頁面打印功能,利用HTML標簽控制格式來實現(xiàn)。但復雜的業(yè)務型應用系統(tǒng),報表不僅是組成應用的重要部分,還常常是相當復雜的。現(xiàn)在很多應用系統(tǒng)都要求提供自定義報表的功能——即客戶可以自行設計、修改報表。

C/S結構系統(tǒng)中,報表問題有很多成熟的解決方法。如DELPHI開發(fā)工具不僅自帶有報表控件,還可以利用第三方控件來實現(xiàn)快速靈活的報表制作和打印,其中有名的控件是FR-Software & A.Tzyganenko FastReportFastReport提供了能與DELPHI無縫集成的從設計到打印的完整控件包,提供的設計界面友好靈活,對于開發(fā)可讓用戶自定義報表的C/S應用來說,是一種很好的解決方式。

B/S結構應用中,Crystal Report是一種大型報表系統(tǒng)常用和推薦的解決方案。但Crystal Report目前價格昂貴,而且該系統(tǒng)相當龐大。它的可定制性及精確控制打印效果方面尚不夠完善。當然,在目前市場上,它仍是一種首選的WEB應用的報表解決方案。
如果能將C/S應用中成熟的報表解決方案搬到B/S應用中,相信對于大部分開發(fā)人員來說,都是非常歡迎的。本文將講述一個在JAVA環(huán)境中利用FastReport實現(xiàn)B/S應用中用戶可自定義的報表解決方案。因為筆者近段時間正用DELPHI、JAVA做一些項目,所以樣例代碼就以DELPHIJAVA編寫。

 

本解決方案樣例的基本環(huán)境是:WINDOWS 2000 SERVER+SQL SERVER 2000+TOMCAT 4.0。開發(fā)工具:IntelliJ IDEA 3.0,DELPHI 5.0??蛻舳藶?/span>IE 5.0瀏覽器。

方案共要求用DELPHI編寫兩個程序,一個是將被包含在網(wǎng)頁中并在瀏覽器中運行的ACTIVEX.ocx),一個是運行在服務器端的報表處理程序,中間通過JAVA程序連接——或任何其他WEB語言都可以,如ASP、PHP等。方案的基本原理圖如下:

報表設計過程
   

報表打印過程
 
REPORT SERVER:可以做成一個普通的WINDOWS程序,也可以做成一個COM程序(Automation Object)。在報表設計過程中,用戶端(ACTIVEX)向WEB SERVER發(fā)送報表設計請求,請求中包含要設計報表的名稱;WEB SERVER 收到該請求后,調用REPORT SERVER請求設計的報表文件;REPORT SERVER收到請求后,先裝載報表的數(shù)據(jù)環(huán)境,然后將報表設計文件(.frf)和該報表的數(shù)據(jù)環(huán)境文件壓縮成一個包文件(.zip),將該包文件的完整路徑名返回給WEB SERVER調用程序;WEB SERVER將包文件回送給用戶端(ACTIVEX),用戶端將接收到的包文件保存到本地硬盤上,并解壓縮,從數(shù)據(jù)環(huán)境文件中恢復數(shù)據(jù)環(huán)境,通過FASTREPORT的相應控件打開報表文件給用戶提供可視化設計。用戶在ACTIVEX中設計報表時,雖然不能和數(shù)據(jù)庫連接,但因數(shù)據(jù)環(huán)境已存在,所以用戶仿如在通常的C/S應用結構下設計報表,能正常地看到報表的數(shù)據(jù)字典信息。在報表打印過程中,用戶端(ACTIVEX)向WEB SERVER發(fā)送報表打印/預覽請求,請求中包含要打印/預覽的報表名稱;
WEB SERVER 收到該請求后,調用REPORT SERVER請求打印或預覽的報表文件;REPORT SERVER收到請求后,先裝載報表的數(shù)據(jù)環(huán)境,然后裝載報表文件(.frf),接著在無界面狀態(tài)下運行報表,最后將生成的已準備的報表文件(.frp)壓縮成一個包文件(.zip),將該包文件的完整路徑名返回給WEB SERVER調用程序;WEB SERVER將包文件回送給用戶端(ACTIVEX),用戶端將接收到的包文件保存到本地硬盤上,并解壓縮,通過FASTREPORT的相應控件打開報表文件(.frp)給用戶預覽或打印或重新調整格式或輸出為其他格式文件。用戶在ACTIVEX中預覽報表,仿如在通常的C/S應用結構下預覽報表。

 

WEB SERVER:提供通常的WEB服務功能。

ACTIVEXActiveXMicrosoft提出的一組使用COMComponent Object Model,部件對象模型)使得軟件部件可在網(wǎng)絡環(huán)境中進行交互的技術集。它與具體的編程語言無關。作為針對Internet應用開發(fā)的技術,ActiveX被廣泛應用于WEB服務器以及客戶端的各個方面。本方案中的ACTIVEX控件主要做兩方面的事情,一是利用FASTREPORT控件進行報表處理,包括報表設計(.frf文件)和報表打?。?span lang=EN-US>.frp文件)。一是與WEB SERVER進行通信,請求和接收包文件。本文樣例的ACTIVEX采用DELPHI 5.0編寫。

 

下面分述各部分的一例具體實現(xiàn)(因為僅為說明方案的實現(xiàn),所以很多代碼細節(jié)都進行了簡?。?/span>

一、             REPORT SERVER

REPORT SERVER既可以做成一個普通的WINDOWS程序,也可以做成一個COM程序(Automation Object)。本例中為簡化見,采用普通的WINDOWS程序實現(xiàn)。

DELPHINEW一個應用程序。在FORM中加入TfrReport、TfrDBDataSet、ADOConnectionTADOQuery等控件——為了使用FASTREPORT的控件,需要安裝該控件包,可從站點http://www. 下載,國內很多軟件站點都提供該控件包的下載。其中TfrDBDataSet、TADOQuery控件視應用需要可加入多個,另外為了壓縮文件,還要加入一個壓縮控件,本例使用VCLZip。在Form1中加入三個函數(shù):preDesignReport(rpFileName:String),prePrintReport(rpFileName:String)zipReportFiles(rpFileName:String),分別用于準備報表設計文件、準備報表打印文件、壓縮報表文件 。Form1.Create方法為:

 

procedure TForm1.FormCreate(Sender: TObject);

var

        rpFileName,mode:String;

begin

        if paramCount>1 then

        begin

                mode:=paramStr(1);

                rpFileName:=paramStr(2);

                if mode='d' then   //設計報表

                        if preDesignReport(rpFileName) then
   zipReportFiles(rpFileName);

                if mode='r' then   //打印報表

                        if prePrintReport(rpFileName) then

                                zipReportFiles(rpFileName);

        end;

        Application.Terminate;

end;

程序根據(jù)調用參數(shù)判斷是準備報表設計文件還是準備報表打印文件,接著調用相應的過程來實現(xiàn)。最后的Application.Terminate 是讓程序執(zhí)行功能后即退出——因為這是服務端程序,是不能與用戶交互的。

preDesignReport(rpFileName:String)方法:

function TForm1.preDesignReport(rpFileName:String):boolean;

var   //其他變量

 

        dtfFileName:String;

begin

        ……

dtfFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.dtf',

[rfReplaceAll, rfIgnoreCase]);

        try

rpAdoquery.SQL.Add('…');

                rpAdoquery.open;//打開報表的數(shù)據(jù)環(huán)境

                rpAdoquery.FieldList.SaveToFile(dtfFileName);

                result:=true;

        except

            on Exception do

                result:=false;

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多