TDecisionCube 是 VCL 決策支援架構的多維數據立方體引擎,將平坦數據集轉化為維度-度量超立方體,支援切片、鑽取、旋轉、聚合等 OLAP 操作,配合 TDecisionSource、TDecisionGrid、TDecisionChart 構建完整 BI 面板。本文深度解析其架構、關鍵屬性、SQL 生成機制、設計時/運行時模式與性能調優。
TDataSet (TDecisionQuery/Table/ClientDataSet)
↓ 數據源
TDecisionCube ←→ TDecisionSource ←→ TDecisionGrid / TDecisionChart / TDecisionPivot
↑ 多維元數據緩存 ↑ 視圖層(僅讀數據流)
TDecisionCube:核心計算引擎,負責維度構建、聚合計算、緩存管理。TDecisionSource:視圖描述器,定義行/列/頁維度、聚合函數、篩選,不持有數據。| 屬性 | 類型 | 說明 |
|---|---|---|
Active | Boolean | 啟用後從 DataSet 讀取構建立方體;false 釋放緩存 |
DataSet | TDataSet* | 源數據集,需已 Active=true |
DesignState | TCubeDataState | 設計時數據量控制:dsNoData 不激活dsMetaData 僅維度結構dsDimensionData 含維度值無聚合dsAllData 完整數據(預設) |
| 方法 | 簽名 | 用途 |
|---|---|---|
ShowCubeDialog | void __fastcall ShowCubeDialog() | 彈出設計時/運行時維度配置對話框 |
GetSQL | AnsiString __fastcall GetSQL() | 生成當前立方體對應的完整 SELECT SQL |
GetDetailSQL | AnsiString __fastcall GetDetailSQL(TSmallIntArray* ValueArray, AnsiString SelectList, bool bActive) | 生成鑽取明細 SQL,ValueArray 指定維度切片索引 |
// ValueArray 長度 = 維度總數
// ValueArray[i] < 0 → 該維度全選
// ValueArray[i] ≥ 0 → 該維度固定為第 ValueArray[i] 個值(已鑽取)
// bActive=true → 僅包含 Active 維度;false → 含非激活維度
// 返回 SQL 含 WHERE 子句鎖定切片,無 GROUP BY(由 Cube 端聚合)
void BuildCube(TDecisionCube* cube, TDataSet* src) {
cube->DataSet = src;
cube->Active = false; // 確保重建
cube->DesignState = dsAllData; // 運行時通常全量
cube->Active = true; // 觸發構建
// 構建完成後,維度資訊可從 cube->DimensionCount / Dimension[i] 獲取
}
SUM),Cube 僅二次加總。SUM/COUNT,優勢在於樞轉表部分總計正確(總計行的平均值 = 總和/總數,而非各分組平均值的平均)。TDecisionSource 的 SummaryType 屬性指定 stSum/stAvg/stCount 等。Active=false 或移除。dsMetaData 或 dsDimensionData,避免 IDE 凍結。Active=false → true 為全量重建。大數據集需自行實作增量合併(新數據 INSERT 進源表 → Cube 重建)。GetDetailSQL 產生的鑽取查詢。| 現象 | 原因 | 對策 |
|---|---|---|
| Active=true 失敗 | DataSet 未 Active 或欄位類型不支援 | 檢查 DataSet.Active;僅支援標量類型(數值/字串/日期) |
| 樞轉表總計錯誤 | 平均值聚合邏輯誤解 | 啟用 Cube 內部平均值計算(SummaryType=stAvg) |
| GetDetailSQL 返回空 | ValueArray 索引越界或維度未激活 | 確認 ValueArray 長度 = DimensionCount;bActive 參數匹配 |
| 設計時記憶體溢出 | DesignState=dsAllData 且數據量大 | 設計時強制 dsMetaData |
VCL 決策元件自 BCB6 以來架構未大幅更新。新專案建議:
① 後端採用 ClickHouse / DuckDB / Apache Druid 等 OLAP 引擎。
② 前端用 Web 圖表庫(ECharts、AG Grid Pivot)通過 REST API 交互。
③ 僅維護既有 VCL 專案時續用 TDecisionCube,並嚴格控制維度基數與數據量。
TDecisionCube 將 OLAP 核心能力封裝為可視化元件,極大降低了桌面端多維分析門檻。理解其「立方體-視圖源-視圖」三層架構與聚合語義,是驅動它發揮最大價值的關鍵。