Web 開發中交叉報表最棘手。本文展示如何用 Delphi 建立 ActiveX 服務器組件,結合 FastReport 2.5 解決跨資料庫服務器查詢與動態交叉報表生成,並透過記憶體流直接輸出 HTML 避免檔案權限問題。
ASP.NET 頁面
↓ Server.CreateObject("CrossReport.kktWebCrossReport")
Delphi ActiveX DLL (kktWebCrossReport.dll)
├─ ShowCrossReport(ConStr, Command, ReportFile)
│ ├─ ADOQuery 跨庫查詢 (OpenQuery/OpenRowset)
│ ├─ TfrReport 載入 .frf 模板
│ ├─ TfrReport.PrepareReport (交叉報表自動展開)
│ └─ TfrHTML2Export + ExportToStream → TMemoryStream
└─ Response.Write(MemoryStream 內容)
CrossReport。TkktWebCrossReport,介面 IkktWebCrossReport。ShowCrossReport:function ShowCrossReport(const ConStr, Command, ReportFile: WideString): Integer; safecall;
function TkktWebCrossReport.ShowCrossReport(const ConStr, Command, ReportFile: WideString): Integer;
var
ADOQ: TADOQuery;
Rpt: TfrReport;
St: TMemoryStream;
Ex: TfrHTML2Export;
Buf: String;
E: TComponent;
begin
E := TComponent.Create(nil); { 統一擁有者,統一釋放 }
try
ADOQ := TADOQuery.Create(E);
try
ADOQ.Name := 'ADOQ';
ADOQ.ConnectionString := ConStr;
ADOQ.SQL.Add(Command);
ADOQ.Open; { 執行跨庫查詢 }
St := TMemoryStream.Create;
Rpt := TfrReport.Create(E);
Rpt.Name := 'frReport1';
Rpt.LoadFromFile(ReportFile); { 載入 .frf 模板 }
Rpt.ShowProgress := False;
Rpt.PrepareReport; { 關鍵:交叉報表展開發生在這裡 }
Ex := TfrHTML2Export.Create(E);
Ex.Navigator.Align := haLeft;
Ex.ShowDialog := False;
Rpt.ExportToStream(Ex, St); { 導出到記憶體流,見下篇源碼修改 }
St.Position := 0;
SetLength(Buf, St.Size);
St.Read(Buf[1], St.Size);
Response.Write(Buf); { 直接寫入 HTTP 回應 }
except
on Ex: Exception do
Response.Write('' + Ex.Message + '
');
end;
finally
E.Free; { 釋放所有子組件 }
end;
end;
{ 使用 OPENQUERY 連結服務器 }
SELECT * FROM OPENQUERY([Server1], 'SELECT * FROM Db1.dbo.TransferOut')
UNION ALL
SELECT * FROM OPENQUERY([Server2], 'SELECT * FROM Db2.dbo.TransferOut')
OPENQUERY 可跨實例查詢。rpt1.frf 部署至服務器。
Private Sub ShowReport()
Dim Cmd As String = ParseSQL() { 動態生成查詢 SQL }
If Cmd <> "" Then
Dim CrossReport = Server.CreateObject("CrossReport.kktWebCrossReport")
CrossReport.ShowCrossReport(clsSQL.DefaultConStr, Cmd, Page.MapPath(".") + "rpt1.frf")
CrossReport = Nothing
End If
End Sub
CrossReport.dll。C:\Inetpub\CrossReport\)。regsvr32 CrossReport.dll 註冊。| 痛點 | 解決方案 |
|---|---|
| 跨庫查詢複雜 | SQL Server 連結服務器 + OPENQUERY,邏輯集中在 SQL |
| 交叉報表動態列 | FastReport Cross Band 自動展開,無需手寫轉換代碼 |
| Web 無報表控件 | Delphi ActiveX 封裝 FastReport,ASP.NET 透過 COM 調用 |
| 檔案權限/安全 | ExportToStream 導出到記憶體流,無臨時檔案 |
| 併發衝突 | 每請求獨立 MemoryStream,無共享資源 |
下篇將詳細說明 FastReport 源碼修改以支援 ExportToStream 與 CSS 內嵌。