天天看點

Crystal Report在Delphi中的應用

前言 Crystal Report的功能性自不必說,雖說有時做一些比較有中國特色的報表有些困難,但是功能上應該還是挺強的。Crystal Report在VS/VS.NET中應用的文章已經很多了,RDC在VB中的效果也是相當不錯,在VS.NET中甚至內建了Crystal Report,雖然不是全功能版,但是做一般的報表,應該是沒有問題的,尤其在.net中做的報表,可以以WEB的方式呈現給User,也是相當不錯的。但是有關在Delphi中使用Crystal Report的文章卻很少,也許是Delphi中報表工具都是被QReport,FastReport,Rava,Report machine等這些工具霸占着。其實這些工具也是相當不錯的,隻是如果原本就對Crystal Report就比較熟悉的Delphi程式員來說,在Delphi中嘗試來使用一下水晶報表也還是不錯的,Business Object有釋出VCL Component For CR ,雖然有些Bug,但是應該還是不錯了。 使用步驟 1) 下載下傳CrystalVCL:可以去BO的網站下載下傳,下載下傳網址: http://www.businessobjects.com/products/reporting/crystalreports/vcl/download.asp。目前官方網站有提供三個版本的VCL.CR9/CR10/CR XI,不過沒有比較新版本的CR XI Release 2及2008的。有一點不爽的是在下載下傳的時候要求提供注冊号,正版的使用者應該沒有問題,不過其他的非官方網站應該也有提供下載下傳。CR9的VCL有相當多的Bug,需要自己去修改它的pas檔案源代碼。CR10未測試,以下的資料是CR XI的。比較好的一點是此VCL有提供源碼,如果發現有Bug,可以自己作修改。可能是開發此控件的人delphi功力還不夠,呵呵!還有一種是直接使用Crystal Report的ActiveX,不過不建議使用這種方法。 2) 安裝VCL:安裝VCL的過程非常簡單,一般在下載下傳的檔案裡面都有Readme的說明,按照步驟來做就好了。簡單來說,就是首先在Delphi的library path裡面增加CRVCL的路徑,然後在Delphi裡面打開dcl7cr11這個package(不同版本的VCL檔案名稱會有不同),Compile後install就可以了。安裝完後,會在Data Access中産生兩個控件:Crpe跟CrpeDS。Crpe封裝了CR的大部分功能,CrpeDS是将Delphi的DataSet傳遞給Crpe來進行報表的顯示,主要用于Push模式,如果是pull模式,則Crpe就足夠了下面會詳細說明。 3) Pull模式程式設計:所謂Pull模式,簡單來說就是rpt檔案中會自動從datasource中抓取資料,Crpe就把資料認證資訊跟參數等資訊傳遞過去就可以了。(CR可以連接配接大部分的資料源,這點不用擔心,甚至于非傳統的資料庫,比如Windows server的AD資訊跟Outlook的資訊等)。報表要提前設計好,報表的設計方法,這裡不再贅述,有興趣的可以加我QQ交流經驗。也可以參考相關的書籍或者CR的線上幫助。以下的代碼供參考:  Screen.Cursor:=crHourGlass;     Crpe1.Clear;     Crpe1.ReportName:='Test.rpt';     Crpe1.Connect.ServerName:='localhost';     Crpe1.Connect.UserID:='sa';     Crpe1.Connect.Password:='sa';     Crpe1.Connect.DatabaseName:='Test';     Crpe1.Connect.Propagate:=True;     Crpe1.DiscardSavedData;     Crpe1.ProgressDialog:=True;     Crpe1.Output:=ToWindow;     Crpe1.WindowButtonBar.GroupTree:=True;     Crpe1.WindowButtonBar.ZoomCtl:=True;     Crpe1.WindowButtonBar.PrintSetupBtn:=True;     Crpe1.WindowState:=wsMaximized;     Crpe1.WindowStyle.Title:='測試水晶報表預覽視窗';     Crpe1.WindowEvents:=True;     ………………………………     //Crpe1.wOnExportBtnClick:=CrpewOnExportBtnClick;     Crpe1.ParamFields[0].CurrentValue:='1';     Crpe1.Execute;     Screen.Cursor:=crDefault; 4) Push模式程式設計:所謂Push模式,簡單來說就是DataSet由前端組織,然後将Data Push給CR,而不是由CR直接連接配接資料庫來抓取資料,此方法比較靈活,可以使用Delphi中功能豐富的dataset控件來組織、過濾資料,delphi中的dataset控件,比如Table、Query、DataSet等都是可以的,甚至于記憶體表也沒有問題,比如ClientData,或者是第三方的記憶體表控件都可以,這就大大增加了報表的自由度,可以将Delphi強大的資料存取功能跟CR的功能組合起來使用。這裡面有一個問題就是,沒有了資料源,在設計報表的時候資料庫的連接配接要如何選擇?這裡提供一個方法:你可以使用一個“僅字段定義”檔案即可。檔案大概類似如下的模樣:           f01 String       10           f03 String       40           f40 date           f50 number           fcuser      string      10 儲存為.ttx為擴充名的文本檔案即可,ttx中的每一行就代表了每一個字段名稱、長度、類型,此檔案可以在CR的開發環境中産生,也可以自已使用notepad來制作。然後在CR的建立連接配接中選擇“僅字段定義”即可,指定為剛才産生的檔案,如果以後有修改此ttx檔案,直接在CR的菜單中選在驗證資料庫即可添加或者删除字段。參考代碼如下:  AdoQuery1.Active:=False;  AdoQuery1.SQL.Clear;  AdoQuery1.SQL.Add(Edit1.Text);  Try     AdoQuery1.Active:=True;  Except     ShowMessage('打開資料集失敗,請确認輸入的SQL文法是否正确!');     Exit;  end;  Screen.Cursor:=crHourGlass;  Crpe2.Clear;  Crpe2.ReportName:='Test_TTX.rpt';  Crpe2.DiscardSavedData;  Crpe2.ProgressDialog:=True;  Crpe2.Output:=ToWindow;  Crpe2.WindowButtonBar.GroupTree:=True;  Crpe2.WindowButtonBar.ZoomCtl:=True;  Crpe2.WindowButtonBar.PrintSetupBtn:=True;  Crpe2.WindowState:=wsMaximized;  Crpe2.WindowStyle.Title:='測試水晶報表預覽視窗';  Crpe2.WindowEvents:=True;  //Crpe2.wOnExportBtnClick:=CrpewOnExportBtnClick;  …………………………………………….  Crpe2.Tables[0].DataPointer := CrpeDS2.DataPointer;  Crpe2.ParamFields[0].CurrentValue:='2';  Crpe2.Execute;  Screen.Cursor:=crDefault; 主要的代碼就兩句: Crpe2.Tables[0].DataPointer := CrpeDS2.DataPointer;  Crpe2.Execute; 前提是CrpeDS的Dataset控件的屬性要設定為你所要使用資料來源控件,此示例代碼中是:AdoQuery1 。如果要使用記憶體表,可以參考如下的代碼:  Screen.Cursor:=crHourGlass;  ClientDataSet1.Close;  With ClientDataSet1.FieldDefs do  Begin     Clear;     Add('f01',ftString,5,False);     Add('f02',ftString,40,False);     Add('f03',ftString,40,False);     Add('f04',ftString,20,False);     Add('f05',ftString,40,False);  End;  ClientDataSet1.CreateDataSet;  ClientDataset1.Open;  AdoDataSet1.First;  While not AdoDataSet1.Eof do  Begin     ClientDataSet1.Append;     ClientDataSet1.FieldByName('f01').AsString := AdoDataSet1.FieldByName('f01').AsString;     ClientDataSet1.FieldByName('f02').AsString := AdoDataSet1.FieldByName('f02').AsString;     ClientDataSet1.FieldByName('f03').AsString := AdoDataSet1.FieldByName('f03').AsString;     ClientDataSet1.FieldByName('f04').AsString := AdoDataSet1.FieldByName('f04').AsString;     ClientDataSet1.FieldByName('f05').AsString := AdoDataSet1.FieldByName('f05').AsString;     ClientDataSet1.Post;     AdoDataSet1.Next;  End;  AdoDataSet1.Close;  Crpe4.Clear;  Crpe4.ReportName:='Test_TTX.rpt';  Crpe4.DiscardSavedData;  Crpe4.ProgressDialog:=True;  Crpe4.Output:=ToWindow;  Crpe4.WindowButtonBar.GroupTree:=True;  Crpe4.WindowButtonBar.ZoomCtl:=True;  Crpe4.WindowButtonBar.PrintSetupBtn:=True;  Crpe4.WindowState:=wsMaximized;  Crpe4.WindowStyle.Title:='測試水晶報表預覽視窗';  Crpe4.WindowEvents:=True;  //Crpe4.wOnExportBtnClick:=CrpewOnExportBtnClick;  ………………………………………..  CrpeDS4.DataSet:=ClientDataSet1;  Crpe4.Tables[0].DataPointer := CrpeDS4.DataPointer;  Crpe4.ParamFields[0].CurrentValue:='2';  Crpe4.Execute;  Screen.Cursor:=crDefault; 記憶體表的資料可以來源于xml等,即可以不使用資料庫引擎,在釋出程式的時候比較友善,不用将資料引擎打包釋出。 5) 程式分發:程式釋出可以去官方網站下載下傳合并子產品Merge Modules,此子產品很容易在網上找到。然後使用wise或者installshield等打包工具将此合并子產品加入程式包的project中并做一些簡單的設定即可,installshield等工具中甚至內建了CR的Merge Modules,直接選擇對應的版本即可。 後記         以上代碼是在delphi7+SQL Server+WindowsXP Professional中測試通過,水晶報表還是挺不錯的報表工具,有興趣的不妨一試。不過對于自定義紙張的報表,CR一直沒有很好的解決方案,确實遺憾。