原創|其它|編輯:郝浩|2012-09-10 12:00:04.000|閱讀 1169 次
概述:前面我們講到FASTREPORT實現WEB應用中自定義報表,會用到REPORT SERVER、WEB SERVER、ACTIVEX三部分內容,現在就來說一下里面的ACTIVEX部分
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
如何用FASTREPORT實現WEB應用中自定義報表(二)
前面我們講到FASTREPORT實現WEB應用中自定義報表,會用到REPORT SERVER、WEB SERVER、ACTIVEX三部分內容,現在就來說一下里面的ACTIVEX部分:
ACTIVEX
方案中的ACTIVEX控件主要做兩方面的事情,一是報表利用FASTREPORT控件進行報表處理,包括報表設計(.frf文件)和報表打印(.frp文件)。一是與WEB SERVER進行通信,請求和接收包文件。
在DELPHI中NEW一個ActiveForm 應用,取名為reportAForm。在form中加入Combox、button、edit、label等與用戶交互的控件;為了處理報表,加入FASTREPORT的多個frSpeedButton用于處理報表事件,如設計、預覽、打印、翻頁、保存等;加入frReport、frDBDataSet、frDesigner等用于在運行時設計報表;如果設計報表時要使用圖形、復選框等內容,也要加入相應的控件;加入frPreview、frTextExport、frRTFExport等控件使可以預覽報表并可以將報表輸出為text、rtf等格式文件;加入ADOQuery(根據實際需要可加入多個)為報表設計提供數據環境,ADOQuery不OPEN,不與數據庫連接;加入NMHTTP用于與WEB SERVER聯系。加入四個函數:DesignReport(rpFileName:String),PrintReport(rpFileName:String),unzipReportFiles(rpFileName:String),getReportFile(rpFileName,mode:String)分別用于設計報表、打印報表、解壓縮報表和向WEB SERVER發送請求以取得報表文件 。
getReportFile(rpFileName,mode:String)方法:
function TreportAForm.getReportFile(rpFileName,mode:String):bool
var
……
zipFileName:String;
begin
……
zipFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.zip',
[rfReplaceAll, rfIgnoreCase]);
try
NMHTTP1.inputFileMode := TRUE;
NMHTTP1.body:='.\ '+ zipFileName;
NMHTTP1.Get('//www…./../report.jsp?rpFileName='+
rpFileName+'&mode='+mode);
Result:=true;
except
on Exception do
Result:=false;
end;
end;
函數getReportFile的作用是向WEB SERVER發送報表請求(通過NMHTTP的Get方法),并將返回的壓縮包文件保存到本地硬盤(zipFileName)。
unzipReportFiles(rpFileName:String)方法:
function TreportAForm.unzipReportFiles(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
VCLUnZip1.ZipName:= '.\'+ zipFileName;
VCLUnZip1.DestDir:= '.\';
VCLUnZip1.OverwriteMode:= Always;
VCLUnZip1.ReadZip;
VCLUnZi
p1.FilesList.Add(fileName);
zipCount:= VCLUnZip1.UnZip;
if zipCount = 0 then
result:=false
else
result:=true;
exce
on Exception do
result:=false;
end;
end;
函數unzipReportFiles的作用是將壓縮包中的文件解壓出來,供ACTIVEX使用。它與REPORT SERVER程序中的zipReportFiles剛好是個相反的過程。
DesignReport(rpFileName:String)方法:
function TreportAForm. DesignReport (rpFileName:String) :boolean;
var
dtfFileName,rpFileName:String;
fldlist:TStringList;
T: TStringField;
i:Integer;
begin
……
dtfFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.dtf',
[rfReplaceAll, rfIgnoreCase]);//獲得數據環境文件名
fldlist:=TStringList.Create;
fldlist.LoadFromFile(dtfFileName);
rpAdoquery.Fields.Clear;
for i := 0 to fldlist.Count - 1 do
begin
T := TStringField.Create(nil);
T.FieldName := fldlist[i];
T.Name := rpAdoquery.Name + T.FieldName;
rpAdoquery.Fields.add(T);
end;
FrReport1.LoadFromFile(rpFileName);
FrReport1.DesignReport;
end;
函數DesignReport先從.dtf(由REPORT SERVER生成)文件中恢復報表的數據環境,接著使用FASTREPORT的FrReport控件設計報表。在FASTREPORT中,對DataSet中的Field只關心名稱(全部通過Variant類型處理),而并不關心數據類型,所以恢復報表的數據環境時,所有字段都當作String類型加入。樣例假設報表只有一個名為rpAdoquery的DataSet。報表設計運行時窗口在ACTIVEX進程空間運行。
用戶端設計好報表并保存后,需要將保存的報表文件(.frf)回送給服務器存儲。文件上傳對于大部分開發人員來說應該都是熟悉而簡單的,該部分程序本文就省略了。
PrintReport(rpFileName:String)方法:
function TreportAForm. PrintReport (rpFileName:String) :boolean;
var
repFileName:String;
begin
……
repFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.frp',
[rfReplaceAll, rfIgnoreCase]);//獲得已準備的報表文件名
try
frPreview1.clear;
FrReport1.Preview:=nil;
FrReport1.clear;
FrReport1.LoadPreparedReport(repFileName);
FrReport1.Preview :=frPreview1;
FrReport1.ShowPreparedReport;
result:=true;
except
on Exception do
result:=false;
end;
end;
函數PrintReport裝入由REPORT SERVER運行好的報表.frp文件,通過調用FrReport的ShowPreparedReport方法在ACTIVEX端預覽和打印。
方案實現方法的介紹結束。本方案具有的優點為:保持應用的結構形式不變(B/S),將C/S應用結構下已非常成熟的報表方案移植過來,使得在WEB應用中也可實現任意復雜的報表設計和打印,以及對打印效果進行精確控制。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:網絡