原創(chuàng)|其它|編輯:郝浩|2012-09-06 10:14:58.000|閱讀 445 次
概述:
前面我們講到FASTREPORT實現(xiàn)WEB應(yīng)用中自定義報表,會用到REPORT SERVER、WEB SERVER、ACTIVEX三部分內(nèi)容,現(xiàn)在就來說一下里面的REPORT SERVER部分
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
如何用FASTREPORT實現(xiàn)WEB應(yīng)用中自定義報表(一)
如何用FASTREPORT實現(xiàn)WEB應(yīng)用中自定義報表(三)
前面我們講到FASTREPORT實現(xiàn)WEB應(yīng)用中自定義報表,會用到REPORT SERVER、WEB SERVER、ACTIVEX三部分內(nèi)容,現(xiàn)在就來說一下里面的REPORT SERVER部分:
REPORTSERVER既可以做成一個普通的WINDOWS程序,也可以做成一個COM程序(Automation Object)。本例中為簡化見,采用普通的WINDOWS程序?qū)崿F(xiàn)。
在DELPHI中NEW一個應(yīng)用程序。在FORM中加入TfrReport、TfrDBDataSet、ADOConnection、TADOQuery等控件——為了使用FASTREPORT的控件。其中TfrDBDataSet、TADOQuery控件視應(yīng)用需要可加入多個,另外為了壓縮文件,還要加入一個壓縮控件,本例使用VCLZip。在Form1中加入三個函數(shù):preDesignReport(rpFileName:String),prePrintReport(rpFileName:String),zipReportFiles(rpFileName:String),分別用于準(zhǔn)備報表設(shè)計文件、準(zhǔn)備報表打印文件、壓縮報表文件 。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 //設(shè)計報表
if preDesignReport(rpFileName) then
zipReportFiles(rpFileName);
if mode='r' then //打印報表
if prePrintReport(rpFileName) then
zipReportFiles(rpFileName);
end;
Application.Terminate;
end;
程序根據(jù)調(diào)用參數(shù)判斷是準(zhǔn)備報表設(shè)計文件還是準(zhǔn)備報表打印文件,接著調(diào)用相應(yīng)的過程來實現(xiàn)。最后的Application.Terminate 是讓程序執(zhí)行功能后即退出——因為這是服務(wù)端程序,是不能與用戶交互的。
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;
end;
end;
函數(shù)preDesignReport的作用是準(zhǔn)備報表設(shè)計文件。報表中可以引用多個DataSet,本例假設(shè)報表只引用一個名為rpAdoquery的DataSet。rpFileName 為報表文件名(.frf),DtfFileName為保存數(shù)據(jù)環(huán)境的文件名(.dtf)。因為用戶端不能連接數(shù)據(jù)庫,所以將DataSet中的Fileds通過rpAdoquery.FieldList.SaveToFile(dtfFileName)保存到文件,和報表文件一起傳送給用戶端的ACTIVEX,ACTIVEX利用.dtf文件復(fù)現(xiàn)報表的數(shù)據(jù)環(huán)境。
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;//打開報表的數(shù)據(jù)環(huán)境
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;
函數(shù)prePrintReport的作用是準(zhǔn)備打印的報表文件,即先在服務(wù)器端裝載報表并運行,將運行好的報表保存為文件,用于傳送到用戶端進(jìn)行預(yù)覽或打印。RepFileName是已準(zhǔn)備好的報表文件名(.frp)。同樣假設(shè)報表只引用一個名為rpAdoquery的DataSet。frReport1.ShowProgress:=False 使報表運行過程中不顯示進(jìn)度窗口(服務(wù)器端不能顯示與用戶交互的界面);接下來frReport1.Clear;…裝載報表文件及設(shè)置相關(guān)數(shù)據(jù)屬性;frReport1.PrepareReport 是在不顯示預(yù)覽窗口的情況下運行報表;frReport1.SavePreparedReport(repFileName) 將運行好的報表保存到文件,該文件傳送給用戶端的ACTIVEX,ACTIVEX可以直接預(yù)覽或顯示該報表。
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;
函數(shù)zipReportFiles的作用是把要傳送給用戶端的報表文件壓縮為一個.zip文件,簡化文件傳送過程,而且壓縮了數(shù)據(jù)量。ACTIVEX接收到.zip文件后,先解壓出包中文件,再進(jìn)行處理。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載