然後在TLB是添加ShowCrossReport方法,參數如下,其中:ConStr為數據庫的連接字符串,Command為SQL查詢語句,ReportFile是FastReport報表模板,通過它生成最終報表。
接著編寫ShowCrossReport的代碼。
function TkktWebCrossReport.ShowCrossReport(const ConStr, Command,
ReportFile: WideString): Integer;
var
ADOQ: TADOQuery;
//frdb: TfrDBDataSet;
rpt: TfrReport;
st: TMemoryStream;
ex: TfrHtml2Export;
buf: String;
e: TComponent;
begin
e := TComponent.Create(nil);
try
ADOQ := TADOQuery.Create(e);
try try
//生成查詢控件並查詢數據
ADOQ.Name := 'ADOQ';
ADOQ.ConnectionString := ConStr;
ADOQ.SQL.Add(Command);
ADOQ.Open;
{frdb := TfrDBDataSet.Create(nil); //Fast Report 2.5的交叉報表控件可以直接讀取ADODataSet數據
frdb.Name := 'frdb';
frdb.DataSet := ADOQ;}
st := TMemoryStream.Create; //報表生成後會導出到內在流中
//載入報表模板
rpt := TfrReport.Create(e);
rpt.Name := 'frReport1';
//rpt.Dataset := frdb;
rpt.LoadFromFile(ReportFile);
rpt.ShowProgress := false;
rpt.PrepareReport;
st.Position := 0;
//創建導出控件,FastReport有TfrHTMExport和TfrHTML2Export兩個導出到HTML格式的控件,TfrHTMExport以表格方式導出,默認沒有表格線,且存在數據錯位的問題,TfrHtml2Export以CSS格式導出,能完好的顯示表格線,我采用後者。
ex := TfrHtml2Export.Create(e);
ex.Navigator.Align := haLeft;
ex.ShowDialog := false;
//這是重點,將結果導出到內存流並送到客戶端
//導出到內存流的好處是不用在服務器生成中間文件,不用考慮權限和安全問題
//FastReport沒有ExportToStream函數,是我加的,見後面說明
rpt.ExportToStream(ex, st);
st.Position := 0;
SetLength(buf, st.Size);
st.Read(buf[1], st.Size);
Response.Write(buf);
st.Clear;
except on E: Exception do
Response.Write('<font color=red><b><h2>'+E.Message+'</h2></b></font>');
end;
finally
if ex <> nil then FreeAndNil(ex);
if st <> nil then FreeAndNil(st);
if rpt <> nil then FreeAndNil(rpt);
//if frdb <> nil then frdb.Free;
FreeAndNil(ADOQ);
end;
finally
e.Free;
end;
end;