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