本文为【用FASTREPORT实现WEB应用中自定义报表】的汉字拼音对照版显示拼音
用yongFASTREPORT实shi现xianWEB应ying用yong中zhong自zi定ding义yi报bao表biao
用yongFASTREPORT实shi现xianWEB应ying用yong中zhong自zi定ding义yi报bao表biao 开kai发faWEB应ying用yong系xi统tong通tong常chang都dou会hui遇yu到dao报bao表biao打da印yin问wen题ti。简jian单dan应ying用yong可ke利li用yongIE的de页ye面mian打da印yin功gong能neng,利li用yongHTML标biao签qian控kong制zhi格ge式shi来lai实shi现xian。但dan复fu杂duo的de业ye务wu型xing应ying用yong系xi统tong,报bao表biao不bu仅jin是shi组zu成cheng应ying用yong的de重chong要yao部bu分fen,还huan常chang常chang是shi相xiang当dang复fu杂duo的de。现xian在zai很hen多duo应ying用yong系xi统tong都dou要yao求qiu提ti供gong自zi定ding义yi报bao表biao的de功gong能neng——即ji客ke户hu可ke以yi自zi行xing设she计ji、修xiu改gai报bao表biao。
在zaiC/S结jie构gou系xi统tong中zhong,报bao表biao问wen题ti有you很hen多duo成cheng熟shu的de解jie决jue方fang法fa。如ruDELPHI开kai发fa工gong具ju不bu仅jin自zi带dai有you报bao表biao控kong件jian,还huan可ke以yi利li用yong第di三san方fang控kong件jian来lai实shi现xian快kuai速su灵ling活huo的de报bao表biao制zhi作zuo和he打da印yin,其qi中zhong有you名ming的de控kong件jian是shiFR-Software & A.Tzyganenko 的deFastReport。FastReport提ti供gong了le能neng与yuDELPHI无wu缝feng集ji成cheng的de从cong设she计ji到dao打da印yin的de完wan整zheng控kong件jian包bao,提ti供gong的de设she计ji界jie面mian友you好hao灵ling活huo,对dui于yu开kai发fa可ke让rang用yong户hu自zi定ding义yi报bao表biao的deC/S应ying用yong来lai说shuo,是shi一yi种zhong很hen好hao的de解jie决jue方fang式shi。
在zaiB/S结jie构gou应ying用yong中zhong,Crystal Report是shi一yi种zhong大da型xing报bao表biao系xi统tong常chang用yong和he推tui荐jian的de解jie决jue方fang案an。但danCrystal Report目mu前qian价jia格ge昂ang贵gui,而er且qie该gai系xi统tong相xiang当dang庞pang大da。它ta的de可ke定ding制zhi性xing及ji精jing确que控kong制zhi打da印yin效xiao果guo方fang面mian尚shang不bu够gou完wan善shan。当dang然ran,在zai目mu前qian市shi场chang上shang,它ta仍reng是shi一yi种zhong首shou选xuan的deWEB应ying用yong的de报bao表biao解jie决jue方fang案an。
如ru果guo能neng将jiangC/S应ying用yong中zhong成cheng熟shu的de报bao表biao解jie决jue方fang案an搬ban到daoB/S应ying用yong中zhong,相xiang信xin对dui于yu大da部bu分fen开kai发fa人ren员yuan来lai说shuo,都dou是shi非fei常chang欢huan迎ying的de。本ben文wen将jiang讲jiang述shu一yi个ge在zaiJAVA环huan境jing中zhong利li用yongFastReport实shi现xianB/S应ying用yong中zhong用yong户hu可ke自zi定ding义yi的de报bao表biao解jie决jue方fang案an。因yin为wei笔bi者zhe近jin段duan时shi间jian正zheng用yongDELPHI、JAVA做zuo一yi些xie项xiang目mu,所suo以yi样yang例li代dai码ma就jiu以yiDELPHI、JAVA编bian写xie。
本ben解jie决jue方fang案an样yang例li的de基ji本ben环huan境jing是shi:WINDOWS 2000 SERVER+SQL SERVER 2000+TOMCAT 4.0。开kai发fa工gong具ju:IntelliJ IDEA 3.0,DELPHI 5.0。客ke户hu端duan为weiIE 5.0浏liu览lan器qi。
方fang案an共gong要yao求qiu用yongDELPHI编bian写xie两liang个ge程cheng序xu,一yi个ge是shi将jiang被bei包bao含han在zai网wang页ye中zhong并bing在zai浏liu览lan器qi中zhong运yun行xing的deACTIVEX(.ocx),一yi个ge是shi运yun行xing在zai服fu务wu器qi端duan的de报bao表biao处chu理li程cheng序xu,中zhong间jian通tong过guoJAVA程cheng序xu连lian接jie——或huo任ren何he其qi他taWEB语yu言yan都dou可ke以yi,如ruASP、PHP等deng。方fang案an的de基ji本ben原yuan理li图tu如ru下xia:
报bao表biao设she计ji过guo程cheng
报bao表biao打da印yin过guo程cheng
REPORT SERVER:可ke以yi做zuo成cheng一yi个ge普pu通tong的deWINDOWS程cheng序xu,也ye可ke以yi做zuo成cheng一yi个geCOM程cheng序xu(Automation Object)。在zai报bao表biao设she计ji过guo程cheng中zhong,用yong户hu端duan(ACTIVEX)向xiangWEB SERVER发fa送song报bao表biao设she计ji请qing求qiu,请qing求qiu中zhong包bao含han要yao设she计ji报bao表biao的de名ming称cheng;WEB SERVER 收shou到dao该gai请qing求qiu后hou,调tiao用yongREPORT SERVER请qing求qiu设she计ji的de报bao表biao文wen件jian;REPORT SERVER收shou到dao请qing求qiu后hou,先xian装zhuang载zai报bao表biao的de数shu据ju环huan境jing,然ran后hou将jiang报bao表biao设she计ji文wen件jian(.frf)和he该gai报bao表biao的de数shu据ju环huan境jing文wen件jian压ya缩suo成cheng一yi个ge包bao文wen件jian(.zip),将jiang该gai包bao文wen件jian的de完wan整zheng路lu径jing名ming返fan回hui给geiWEB SERVER调tiao用yong程cheng序xu;WEB SERVER将jiang包bao文wen件jian回hui送song给gei用yong户hu端duan(ACTIVEX),用yong户hu端duan将jiang接jie收shou到dao的de包bao文wen件jian保bao存cun到dao本ben地di硬ying盘pan上shang,并bing解jie压ya缩suo,从cong数shu据ju环huan境jing文wen件jian中zhong恢hui复fu数shu据ju环huan境jing,通tong过guoFASTREPORT的de相xiang应ying控kong件jian打da开kai报bao表biao文wen件jian给gei用yong户hu提ti供gong可ke视shi化hua设she计ji。用yong户hu在zaiACTIVEX中zhong设she计ji报bao表biao时shi,虽sui然ran不bu能neng和he数shu据ju库ku连lian接jie,但dan因yin数shu据ju环huan境jing已yi存cun在zai,所suo以yi用yong户hu仿fang如ru在zai通tong常chang的deC/S应ying用yong结jie构gou下xia设she计ji报bao表biao,能neng正zheng常chang地di看kan到dao报bao表biao的de数shu据ju字zi典dian信xin息xi。在zai报bao表biao打da印yin过guo程cheng中zhong,用yong户hu端duan(ACTIVEX)向xiangWEB SERVER发fa送song报bao表biao打da印yin/预yu览lan请qing求qiu,请qing求qiu中zhong包bao含han要yao打da印yin/预yu览lan的de报bao表biao名ming称cheng;WEB SERVER 收shou到dao该gai请qing求qiu后hou,调tiao用yongREPORT SERVER请qing求qiu打da印yin或huo预yu览lan的de报bao表biao文wen件jian;REPORT SERVER收shou到dao请qing求qiu后hou,先xian装zhuang载zai报bao表biao的de数shu据ju环huan境jing,然ran后hou装zhuang载zai报bao表biao文wen件jian(.frf),接jie着zhe在zai无wu界jie面mian状zhuang态tai下xia运yun行xing报bao表biao,最zui后hou将jiang生sheng成cheng的de已yi准zhun备bei的de报bao表biao文wen件jian(.frp)压ya缩suo成cheng一yi个ge包bao文wen件jian(.zip),将jiang该gai包bao文wen件jian的de完wan整zheng路lu径jing名ming返fan回hui给geiWEB SERVER调tiao用yong程cheng序xu;WEB SERVER将jiang包bao文wen件jian回hui送song给gei用yong户hu端duan(ACTIVEX),用yong户hu端duan将jiang接jie收shou到dao的de包bao文wen件jian保bao存cun到dao本ben地di硬ying盘pan上shang,并bing解jie压ya缩suo,通tong过guoFASTREPORT的de相xiang应ying控kong件jian打da开kai报bao表biao文wen件jian(.frp)给gei用yong户hu预yu览lan或huo打da印yin或huo重chong新xin调tiao整zheng格ge式shi或huo输shu出chu为wei其qi他ta格ge式shi文wen件jian。用yong户hu在zaiACTIVEX中zhong预yu览lan报bao表biao,仿fang如ru在zai通tong常chang的deC/S应ying用yong结jie构gou下xia预yu览lan报bao表biao。
WEB SERVER:提ti供gong通tong常chang的deWEB服fu务wu功gong能neng。
ACTIVEX:ActiveX是shiMicrosoft提ti出chu的de一yi组zu使shi用yongCOM(Component Object Model,部bu件jian对dui象xiang模mo型xing)使shi得de软ruan件jian部bu件jian可ke在zai网wang络luo环huan境jing中zhong进jin行xing交jiao互hu的de技ji术shu集ji。它ta与yu具ju体ti的de编bian程cheng语yu言yan无wu关guan。作zuo为wei针zhen对duiInternet应ying用yong开kai发fa的de技ji术shu,ActiveX被bei广guang泛fan应ying用yong于yuWEB服fu务wu器qi以yi及ji客ke户hu端duan的de各ge个ge方fang面mian。本ben方fang案an中zhong的deACTIVEX控kong件jian主zhu要yao做zuo两liang方fang面mian的de事shi情qing,一yi是shi利li用yongFASTREPORT控kong件jian进jin行xing报bao表biao处chu理li,包bao括kuo报bao表biao设she计ji(.frf文wen件jian)和he报bao表biao打da印yin(.frp文wen件jian)。一yi是shi与yuWEB SERVER进jin行xing通tong信xin,请qing求qiu和he接jie收shou包bao文wen件jian。本ben文wen样yang例li的deACTIVEX采cai用yongDELPHI 5.0编bian写xie。
下xia面mian分fen述shu各ge部bu分fen的de一yi例li具ju体ti实shi现xian(因yin为wei仅jin为wei说shuo明ming方fang案an的de实shi现xian,所suo以yi很hen多duo代dai码ma细xi节jie都dou进jin行xing了le简jian省sheng)。
一yi、 REPORT SERVER
REPORT SERVER既ji可ke以yi做zuo成cheng一yi个ge普pu通tong的deWINDOWS程cheng序xu,也ye可ke以yi做zuo成cheng一yi个geCOM程cheng序xu(Automation Object)。本ben例li中zhong为wei简jian化hua见jian,采cai用yong普pu通tong的deWINDOWS程cheng序xu实shi现xian。
在zaiDELPHI中zhongNEW一yi个ge应ying用yong程cheng序xu。在zaiFORM中zhong加jia入ruTfrReport、TfrDBDataSet、ADOConnection、TADOQuery等deng控kong件jian——为wei了le使shi用yongFASTREPORT的de控kong件jian,需xu要yao安an装zhuang该gai控kong件jian包bao,可ke从cong站zhan点dianhttp://www.fast-report.com 下xia载zai,国guo内nei很hen多duo软ruan件jian站zhan点dian都dou提ti供gong该gai控kong件jian包bao的de下xia载zai。其qi中zhongTfrDBDataSet、TADOQuery控kong件jian视shi应ying用yong需xu要yao可ke加jia入ru多duo个ge,另ling外wai为wei了le压ya缩suo文wen件jian,还huan要yao加jia入ru一yi个ge压ya缩suo控kong件jian,本ben例li使shi用yongVCLZip。在zaiForm1中zhong加jia入ru三san个ge函han数shu:preDesignReport(rpFileName:String),prePrintReport(rpFileName:String),zipReportFiles(rpFileName:String),分fen别bie用yong于yu准zhun备bei报bao表biao设she计ji文wen件jian、准zhun备bei报bao表biao打da印yin文wen件jian、压ya缩suo报bao表biao文wen件jian 。Form1.Create方fang法fa为wei:
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 //设she计ji报bao表biao
if preDesignReport(rpFileName) then
zipReportFiles(rpFileName);
if mode='r' then //打da印yin报bao表biao
if prePrintReport(rpFileName) then
zipReportFiles(rpFileName);
end;
Application.Terminate;
end;
程cheng序xu根gen据ju调tiao用yong参shen数shu判pan断duan是shi准zhun备bei报bao表biao设she计ji文wen件jian还huan是shi准zhun备bei报bao表biao打da印yin文wen件jian,接jie着zhe调tiao用yong相xiang应ying的de过guo程cheng来lai实shi现xian。最zui后hou的deApplication.Terminate 是shi让rang程cheng序xu执zhi行xing功gong能neng后hou即ji退tui出chu——因yin为wei这zhe是shi服fu务wu端duan程cheng序xu,是shi不bu能neng与yu用yong户hu交jiao互hu的de。
preDesignReport(rpFileName:String)方fang法fa:
function TForm1.preDesignReport(rpFileName:String):boolean;
var
…… //其qi他ta变bian量liang
dtfFileName:String;
begin
……
dtfFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.dtf',
[rfReplaceAll, rfIgnoreCase]);
try
rpAdoquery.SQL.Add('…');
rpAdoquery.open;//打da开kai报bao表biao的de数shu据ju环huan境jing
rpAdoquery.FieldList.SaveToFile(dtfFileName);
result:=true;
except
on Exception do
result:=false;
end;
end;
函han数shupreDesignReport的de作zuo用yong是shi准zhun备bei报bao表biao设she计ji文wen件jian。报bao表biao中zhong可ke以yi引yin用yong多duo个geDataSet,本ben例li假jia设she报bao表biao只zhi引yin用yong一yi个ge名ming为weirpAdoquery的deDataSet。rpFileName 为wei报bao表biao文wen件jian名ming(.frf),DtfFileName为wei保bao存cun数shu据ju环huan境jing的de文wen件jian名ming(.dtf)。因yin为wei用yong户hu端duan不bu能neng连lian接jie数shu据ju库ku,所suo以yi将jiangDataSet中zhong的deFileds通tong过guorpAdoquery.FieldList.SaveToFile(dtfFileName)保bao存cun到dao文wen件jian,和he报bao表biao文wen件jian一yi起qi传chuan送song给gei用yong户hu端duan的deACTIVEX,ACTIVEX利li用yong.dtf文wen件jian复fu现xian报bao表biao的de数shu据ju环huan境jing。
prePrintReport(rpFileName:String)方fang法fa:
function TForm1.prePrintReport(rpFileName:String):boolean;
var
……
repFileName:String;
begin
……
repFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.frp',
[rfReplaceAll, rfIgnoreCase]);
try
rpAdoquery.SQL.Add('…');
rpAdoquery.open;//打da开kai报bao表biao的de数shu据ju环huan境jing
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;
函han数shuprePrintReport的de作zuo用yong是shi准zhun备bei打da印yin的de报bao表biao文wen件jian,即ji先xian在zai服fu务wu器qi端duan装zhuang载zai报bao表biao并bing运yun行xing,将jiang运yun行xing好hao的de报bao表biao保bao存cun为wei文wen件jian,用yong于yu传chuan送song到dao用yong户hu端duan进jin行xing预yu览lan或huo打da印yin。RepFileName是shi已yi准zhun备bei好hao的de报bao表biao文wen件jian名ming(.frp)。同tong样yang假jia设she报bao表biao只zhi引yin用yong一yi个ge名ming为weirpAdoquery的deDataSet。frReport1.ShowProgress:=False 使shi报bao表biao运yun行xing过guo程cheng中zhong不bu显xian示shi进jin度du窗chuang口kou(服fu务wu器qi端duan不bu能neng显xian示shi与yu用yong户hu交jiao互hu的de界jie面mian);接jie下xia来laifrReport1.Clear;…装zhuang载zai报bao表biao文wen件jian及ji设she置zhi相xiang关guan数shu据ju属shu性xing;frReport1.PrepareReport 是shi在zai不bu显xian示shi预yu览lan窗chuang口kou的de情qing况kuang下xia运yun行xing报bao表biao;frReport1.SavePreparedReport(repFileName) 将jiang运yun行xing好hao的de报bao表biao保bao存cun到dao文wen件jian,该gai文wen件jian传chuan送song给gei用yong户hu端duan的deACTIVEX,ACTIVEX可ke以yi直zhi接jie预yu览lan或huo显xian示shi该gai报bao表biao。
zipReportFiles(rpFileName:String)方fang法fa:
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;
函han数shuzipReportFiles的de作zuo用yong是shi把ba要yao传chuan送song给gei用yong户hu端duan的de报bao表biao文wen件jian压ya缩suo为wei一yi个ge.zip文wen件jian,简jian化hua文wen件jian传chuan送song过guo程cheng,而er且qie压ya缩suo了le数shu据ju量liang。ACTIVEX接jie收shou到dao.zip文wen件jian后hou,先xian解jie压ya出chu包bao中zhong文wen件jian,再zai进jin行xing处chu理li。
二er、 WEB SERVER
方fang案an中zhongWEB SERVER的de作zuo用yong主zhu要yao是shi根gen据juACTIVEX的de请qing求qiu调tiao用yongREPORT SERVER,并bing将jiangREPORT SERVER生sheng成cheng的de.zip文wen件jian发fa送song给geiACTIVEX。样yang例li通tong过guo一yi个gereport.jsp文wen件jian来lai处chu理li:ACTIVEX通tong过guoget请qing求qiureport.jsp文wen件jian,report.jsp文wen件jian调tiao用yongREPORT SERVER处chu理li后hou,将jiang.zip文wen件jian发fa送song给geiACTIVEX。
Report.jsp文wen件jian:
<%@ page import='…'%>
<%@page contentType=' APPLICATION/OCTET-STREAM' %>
<%
try
{
String reqFileName = request.getParameter('rpFileName');
String reqMode = request.getParameter('mode');//d为wei设she计ji报bao表biao,r为wei打da印yin报bao表biao
String rpFileName = xxxx.getRpFileName(reqFileName); //根gen据ju请qing求qiu的de报bao表biao名ming获huo得de实shi际ji的de报bao表biao文wen件jian名ming,如ru请qing求qiu订ding单dan报bao表biao,而er订ding单dan报bao表biao实shi际ji对dui应ying的de报bao表biao文wen件jian为weiorder.frf。
String l_cmd='reportserver.exe '+reqMode+' '+ reqFileName;
Process l_ps=java.lang.Runtime.getRuntime().exec(l_cmd,null);
byte[] l_b=new byte[100];
while(l_ps.getInputStream().read(l_b,0,100)!=-1){
;
}
//发fa送song文wen件jian
String zipFileName = xxxx.getZipFileName(reqFileName); //获huo得de压ya缩suo文wen件jian名ming
response.setHeader('Content-Disposition','attachment; filename=\'' +
zipFileName + '\'');
java.io.FileInputStream fileInputStream =
new java.io.FileInputStream(zipFileName);
int i;
while ((i=fileInputStream.read()) != -1) {
out.write(i);
}
fileInputStream.close();
out.close();
}
catch(Exception e)
{
……
}
%>
String l_cmd='reportserver.exe '+reqMode+' '+ reqFileName; 组zu成cheng调tiao用yongREPORT SERVER的de命ming令ling串chuan。while(l_ps.getInputStream().read(l_b,0,100)!=-1){ ; } 等deng待daiREPORT SERVER执zhi行xing完wan成cheng,否fou则ze,程cheng序xu在zai启qi动dongREPORT SERVER后hou即ji执zhi行xing下xia一yi行xing语yu句ju。发fa送song文wen件jian的de方fang式shi有you多duo种zhong,比bi如ru也ye可ke以yi由youACTIVEX通tong过guoftp方fang式shi取qu得de。
三san、ACTIVEX
方fang案an中zhong的deACTIVEX控kong件jian主zhu要yao做zuo两liang方fang面mian的de事shi情qing,一yi是shi报bao表biao利li用yongFASTREPORT控kong件jian进jin行xing报bao表biao处chu理li,包bao括kuo报bao表biao设she计ji(.frf文wen件jian)和he报bao表biao打da印yin(.frp文wen件jian)。一yi是shi与yuWEB SERVER进jin行xing通tong信xin,请qing求qiu和he接jie收shou包bao文wen件jian。
在zaiDELPHI中zhongNEW一yi个geActiveForm 应ying用yong,取qu名ming为weireportAForm。在zaiform中zhong加jia入ruCombox、button、edit、label等deng与yu用yong户hu交jiao互hu的de控kong件jian;为wei了le处chu理li报bao表biao,加jia入ruFASTREPORT的de多duo个gefrSpeedButton用yong于yu处chu理li报bao表biao事shi件jian,如ru设she计ji、预yu览lan、打da印yin、翻fan页ye、保bao存cun等deng;加jia入rufrReport、frDBDataSet、frDesigner等deng用yong于yu在zai运yun行xing时shi设she计ji报bao表biao;如ru果guo设she计ji报bao表biao时shi要yao使shi用yong图tu形xing、复fu选xuan框kuang等deng内nei容rong,也ye要yao加jia入ru相xiang应ying的de控kong件jian;加jia入rufrPreview、frTextExport、frRTFExport等deng控kong件jian使shi可ke以yi预yu览lan报bao表biao并bing可ke以yi将jiang报bao表biao输shu出chu为weitext、rtf等deng格ge式shi文wen件jian;加jia入ruADOQuery(根gen据ju实shi际ji需xu要yao可ke加jia入ru多duo个ge)为wei报bao表biao设she计ji提ti供gong数shu据ju环huan境jing,ADOQuery不buOPEN,不bu与yu数shu据ju库ku连lian接jie;加jia入ruNMHTTP用yong于yu与yuWEB SERVER联lian系xi。加jia入ru四si个ge函han数shu:DesignReport(rpFileName:String),PrintReport(rpFileName:String),unzipReportFiles(rpFileName:String),getReportFile(rpFileName,mode:String)分fen别bie用yong于yu设she计ji报bao表biao、打da印yin报bao表biao、解jie压ya缩suo报bao表biao和he向xiangWEB SERVER发fa送song请qing求qiu以yi取qu得de报bao表biao文wen件jian 。
getReportFile(rpFileName,mode:String)方fang法fa:
function TreportAForm.getReportFile(rpFileName,mode:String):boolean;
var
……
zipFileName:String;
begin
……
zipFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.zip',
[rfReplaceAll, rfIgnoreCase]);
try
NMHTTP1.inputFileMode := TRUE;
NMHTTP1.body:='.\ '+ zipFileName;
NMHTTP1.Get('http://www…./../report.jsp?rpFileName='+
rpFileName+'&mode='+mode);
Result:=true;
except
on Exception do
Result:=false;
end;
end;
函han数shugetReportFile的de作zuo用yong是shi向xiangWEB SERVER发fa送song报bao表biao请qing求qiu(通tong过guoNMHTTP的deGet方fang法fa),并bing将jiang返fan回hui的de压ya缩suo包bao文wen件jian保bao存cun到dao本ben地di硬ying盘pan(zipFileName)。
unzipReportFiles(rpFileName:String)方fang法fa:
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;
VCLUnZip1.FilesList.Add(fileName);
zipCount:= VCLUnZip1.UnZip;
if zipCount = 0 then
result:=false
else
result:=true;
except
on Exception do
result:=false;
end;
end;
函han数shuunzipReportFiles的de作zuo用yong是shi将jiang压ya缩suo包bao中zhong的de文wen件jian解jie压ya出chu来lai,供gongACTIVEX使shi用yong。它ta与yuREPORT SERVER程cheng序xu中zhong的dezipReportFiles刚gang好hao是shi个ge相xiang反fan的de过guo程cheng。
DesignReport(rpFileName:String)方fang法fa:
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]);//获huo得de数shu据ju环huan境jing文wen件jian名ming
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;
函han数shuDesignReport先xian从cong.dtf(由youREPORT SERVER生sheng成cheng)文wen件jian中zhong恢hui复fu报bao表biao的de数shu据ju环huan境jing,接jie着zhe使shi用yongFASTREPORT的deFrReport控kong件jian设she计ji报bao表biao。在zaiFASTREPORT中zhong,对duiDataSet中zhong的deField只zhi关guan心xin名ming称cheng(全quan部bu通tong过guoVariant类lei型xing处chu理li),而er并bing不bu关guan心xin数shu据ju类lei型xing,所suo以yi恢hui复fu报bao表biao的de数shu据ju环huan境jing时shi,所suo有you字zi段duan都dou当dang作zuoString类lei型xing加jia入ru。样yang例li假jia设she报bao表biao只zhi有you一yi个ge名ming为weirpAdoquery的deDataSet。报bao表biao设she计ji运yun行xing时shi窗chuang口kou在zaiACTIVEX进jin程cheng空kong间jian运yun行xing。
用yong户hu端duan设she计ji好hao报bao表biao并bing保bao存cun后hou,需xu要yao将jiang保bao存cun的de报bao表biao文wen件jian(.frf)回hui送song给gei服fu务wu器qi存cun储chu。文wen件jian上shang传chuan对dui于yu大da部bu分fen开kai发fa人ren员yuan来lai说shuo应ying该gai都dou是shi熟shu悉xi而er简jian单dan的de,该gai部bu分fen程cheng序xu本ben文wen就jiu省sheng略lue了le。
PrintReport(rpFileName:String)方fang法fa:
function TreportAForm. PrintReport (rpFileName:String) :boolean;
var
repFileName:String;
begin
……
repFileName:=StringReplace(rpFileName, ExtractFileExt(rpFileName),'.frp',
[rfReplaceAll, rfIgnoreCase]);//获huo得de已yi准zhun备bei的de报bao表biao文wen件jian名ming
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;
函han数shuPrintReport装zhuang入ru由youREPORT SERVER运yun行xing好hao的de报bao表biao.frp文wen件jian,通tong过guo调tiao用yongFrReport的deShowPreparedReport方fang法fa在zaiACTIVEX端duan预yu览lan和he打da印yin。
方fang案an实shi现xian方fang法fa的de介jie绍shao结jie束shu。本ben方fang案an具ju有you的de优you点dian为wei:保bao持chi应ying用yong的de结jie构gou形xing式shi不bu变bian(B/S),将jiangC/S应ying用yong结jie构gou下xia已yi非fei常chang成cheng熟shu的de报bao表biao方fang案an移yi植zhi过guo来lai,使shi得de在zaiWEB应ying用yong中zhong也ye可ke实shi现xian任ren意yi复fu杂duo的de报bao表biao设she计ji和he打da印yin,以yi及ji对dui打da印yin效xiao果guo进jin行xing精jing确que控kong制zhi。
【原文】