程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi中用服務器組件解決WEB交叉報表問題(1)(2)

Delphi中用服務器組件解決WEB交叉報表問題(1)(2)

編輯:Delphi

然後在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;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved