原創|其它|編輯:郝浩|2012-09-06 10:14:58.000|閱讀 445 次
概述:
前面我們講到FASTREPORT實現WEB應用中自定義報表,會用到REPORT SERVER、WEB SERVER、ACTIVEX三部分內容,現在就來說一下里面的REPORT SERVER部分
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
如何用FASTREPORT實現WEB應用中自定義報表(一)
如何用FASTREPORT實現WEB應用中自定義報表(三)
前面我們講到FASTREPORT實現WEB應用中自定義報表,會用到REPORT SERVER、WEB SERVER、ACTIVEX三部分內容,現在就來說一下里面的REPORT SERVER部分:
REPORTSERVER既可以做成一個普通的WINDOWS程序,也可以做成一個COM程序(Automation Object)。本例中為簡化見,采用普通的WINDOWS程序實現。
在DELPHI中NEW一個應用程序。在FORM中加入TfrReport、TfrDBDataSet、ADOConnection、TADOQuery等控件——為了使用FASTREPORT的控件。其中TfrDBDataSet、TADOQuery控件視應用需要可加入多個,另外為了壓縮文件,還要加入一個壓縮控件,本例使用VCLZip。在Form1中加入三個函數: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;
程序根據調用參數判斷是準備報表設計文件還是準備報表打印文件,接著調用相應的過程來實現。最后的Application.Terminate 是讓程序執行功能后即退出——因為這是服務端程序,是不能與用戶交互的。
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;//打開報表的數據環境
rpAdoquery.FieldList.SaveToFile(dtfFileName);
result:=true;
except
on Exception do
result:=false;
end;
end;
函數preDesignReport的作用是準備報表設計文件。報表中可以引用多個DataSet,本例假設報表只引用一個名為rpAdoquery的DataSet。rpFileName 為報表文件名(.frf),DtfFileName為保存數據環境的文件名(.dtf)。因為用戶端不能連接數據庫,所以將DataSet中的Fileds通過rpAdoquery.FieldList.SaveToFile(dtfFileName)保存到文件,和報表文件一起傳送給用戶端的ACTIVEX,ACTIVEX利用.dtf文件復現報表的數據環境。
prePrintReport(rpFileName:String)方法:
function TForm1.prePrintReport(rpFileName:String):boolean;
var
repFileName:String;
begin
……
repFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.frp',
[rfReplaceAll, rfIgnoreCase]);
try
rpAdoquery.SQL.Add('…');
rpAdoquery.open;//打開報表的數據環境
frReport1.ShowProgress:=False;
frReport1.Clear;
frReport1.LoadFromFile(rpFileName);
frDBDataSet1.DataSet :=rpAdoquery;
frReport1.Dataset :=frDBDataSet1;
frReport1.PrepareReport;
frReport1.SavePreparedReport(repFileName);
result:=true;
except on Exception do
result:=false;
end;
end;
函數prePrintReport的作用是準備打印的報表文件,即先在服務器端裝載報表并運行,將運行好的報表保存為文件,用于傳送到用戶端進行預覽或打印。RepFileName是已準備好的報表文件名(.frp)。同樣假設報表只引用一個名為rpAdoquery的DataSet。frReport1.ShowProgress:=False 使報表運行過程中不顯示進度窗口(服務器端不能顯示與用戶交互的界面);接下來frReport1.Clear;…裝載報表文件及設置相關數據屬性;frReport1.PrepareReport 是在不顯示預覽窗口的情況下運行報表;frReport1.SavePreparedReport(repFileName) 將運行好的報表保存到文件,該文件傳送給用戶端的ACTIVEX,ACTIVEX可以直接預覽或顯示該報表。
zipReportFiles(rpFileName:String)方法:
function TForm1.zipReportFiles(rpFileName:String):boolean;
var
……
zipFileName,fileName:String;
zipCount:Integer;
begin
……
zipFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.zip',
[rfReplaceAll, rfIgnoreCase]);
fileName:= ExtractFileName(rpFileName);
fileName:= ChangeFileExt(fileName,'.*');
try
VCLZip1.ZipName:= zipFileName;
VCLZip1.RootDir:= '.\';
VCLZip1.FilesList.Add(fileName);
zipCount:= VCLZip1.Zip;
if zipCount = 0 then
result:=false
else
result:=true;
except on Exception do
result:=false;
end;
end;
函數zipReportFiles的作用是把要傳送給用戶端的報表文件壓縮為一個.zip文件,簡化文件傳送過程,而且壓縮了數據量。ACTIVEX接收到.zip文件后,先解壓出包中文件,再進行處理。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡轉載