原生計算樞紐分析欄位與快取持有的項目
從內容加總計算
對本機計算快取欄位而言,原生預覽會先在要求的分葉、小計或總計內容中,把每個被參照的資料庫欄位加總,然後才評估公式;相依項目可以不出現在顯示的資料欄位中
例如兩筆 Amount/Units 值為 10/1 與 30/9 的記錄,會產生原生計算欄位結果 40/10 = 4,而總計會評估自己的相依加總,而不是把顯示的比率相加
計算項目會在每個完整的分葉內容中評估成員參照,包括其他列軸與欄軸;小計與總計包含產生的成員貢獻,因此比率項目可以貢獻其分葉比率的總和
被手動隱藏的成員在其他計算項目參照它時仍然可用,只是它自己的貢獻不會進到顯示的總計;以 A=40、B=60 為例,隱藏 A 之後 Combined=A+B 仍是 100,且 Combined 會納入可見的總計
計算欄位與計算項目並存時,項目貢獻先更新其參照的資料庫欄位加總,然後計算欄位才用這些更新後的內容加總評估
計算項目可以屬於多個未分組欄位;保留的快取定義順序決定哪個欄位公式最後寫入某個交叉點,因此搬移定義可能同時改變該交叉點與顯示的總計
未解析的計算成員相依會在被參照時評估,包括定義在順序後段的相依;在較早步驟已算出的成員,被其他公式參照時保留其當下的交叉點值
原生欄位加總忽略布林與文字來源值,保留數值與日期值,並傳遞具型別的來源錯誤;惰性求值的 IF 與 IFERROR 可以處理錯誤而不評估用不到的分支
快取擁有權與繫結
| 公開宣告 | 契約 |
|---|---|
TXLSPivotCacheCalculatedItem | 由快取持有的原生計算成員定義;請透過擁有它的快取取得,使用借用物件的期間讓快取保持存活 |
TXLSPivotCacheCalculatedItem.FieldIndex: Integer | 唯讀、以零為基底的快取欄位識別 |
TXLSPivotCacheCalculatedItem.ItemIndex: Integer | 唯讀、FieldIndex 內以零為基底的共用成員識別 |
TXLSPivotCacheCalculatedItem.Formula: WideString | 可讀寫的原生成員公式;設定它會改變模型,而預覽或明確繫結會在計算前驗證語法與相依循環 |
TXLSPivotCacheCalculatedItem.Supported: Boolean | 唯讀,表示解析出的區域識別是否存在,而不是保證每種公式或檢視組合都能評估 |
TXLSPivotCacheCalculatedItem.RawXml: WideString | 唯讀,不支援的計算項目定義所保留的 XML;已知具型別定義使用空字串 |
TXLSPivotCache.AddCalculatedItem(AFieldIndex, AItemIndex: Integer; const AFormula: WideString): TXLSPivotCacheCalculatedItem | 為既有成員建立受支援的具型別定義,拒絕無效識別、空公式或重複的目標識別;回傳的物件屬於快取 |
TXLSPivotCache.FindCalculatedItem(AFieldIndex, AItemIndex: Integer): TXLSPivotCacheCalculatedItem | 回傳借用的符合定義或 nil |
TXLSPivotCache.CalculatedItemCount: Integer | 唯讀,保留的受支援或不受支援定義數量 |
TXLSPivotCache.CalculatedItems[Index: Integer]: TXLSPivotCacheCalculatedItem | 唯讀、以零為基底的借用存取,走訪定義清單 |
TXLSPivotCache.ClearCalculatedItems | 釋放持有的定義並使借用控制代碼失效;它不會移除共用成員,也不代表快取查詢已完備 |
TXLSPivotCache.MoveCalculatedItem(AIndex, ANewIndex: Integer) | 在原生求解順序中以零為基底的位置之間搬移既有定義,保留其借用物件身分;無效位置會擲出 EArgumentOutOfRangeException,且不搬移定義 |
TXLSPivotCache._AddUnsupportedCalculatedItem(const ARawXml: WideString) | 面向剖析器的保留掛鉤,保留未知 XML 並把快取查詢模型標記為不完備 |
TXLSPivotCache.Assign(Source: TXLSPivotCache) | 深層複製定義、欄位、共用成員、記錄索引與日期系統內容;來源控制代碼保持獨立,把同一快取指派給自己也是安全的 |
TXLSPivotTable.BindCalculatedItemsToCache | 驗證並繫結檢視撰寫的計算項目到分離的快取,然後把新的共用成員與定義附加到現用快取;失敗時成員身分與定義不變,既有的欄位與成員控制代碼仍有效 |
以 TXLSPivotField.AddCalculatedItem 建立的檢視撰寫項目,需要先明確呼叫 BindCalculatedItemsToCache,才能原生具體化或進行具型別的原生重建;匯入受支援的原生快取定義時已具備該擁有權
快取繫結會影響共用該快取的每個檢視,因此請把它當成撰寫操作來呼叫,且借用控制代碼只在對應清單被清空、指派或銷毀之前有效
成員篩選與顯示轉換
計算項目欄位上的標題與值比較,是在成員公式跑完之後才選取顯示的成員;被篩選的來源成員仍可被參照的公式使用,可見的小計與總計會排除這些成員的直接貢獻
值比較可以選取計算的量值;每個候選成員都從其內容相依加總評估該量值,而不是把來源記錄比率相加,也不把公式當成快取記錄欄
計算項目結果也支援模型化的 ShowDataAs 轉換,包括百分比、索引、差異、累加總計、累加總計百分比與排名;隱藏成員不會出現在可見的累加與排名序列中,而公式參照保留其原始值
| 公開宣告 | 契約 |
|---|---|
TXLSPivotFilter.DataFieldIsMeasureIndex: Boolean | 選取 DataField 的識別定義域;False 保留既有的以零為基底快取欄位識別,True 則識別以零為基底的顯示資料量值位置,並在匯入原生 iMeasureFld 時設定 |
TXLSPivotFilter.SourceOrder: Integer | 可讀寫、以零為基底的全域順序,從原生 filters 元素保留,缺少時預設 -1;本機計算與具型別寫入先使用非負的 EvalOrder,再來是 SourceOrder,最後是穩定的欄位或清單順序 |
具型別的原生寫入會把快取欄位識別轉換成其顯示量值位置;被多個資料量值使用的快取欄位需要明確的量值位置,否則其彙總與顯示識別會有歧義
Excel 可以在 evalOrder=-1 下儲存活動篩選,並透過 filters 元素序列保留其評估順序;匯入、複製與具型別重建都保留該序列,而不是把這些篩選當成不活動
在已匯入保留的原生檢視上,變更篩選定義或其保留的來源位置需要具型別重建;普通的原生採用會驗證保留的篩選識別,並在寫出報表儲存格之前拒絕不支援的編輯
預覽、查詢與日期系統
function TXLSPivotTable.MakePreview(AWriter: TlxPivotResultWriter; ALayoutWriter: TlxPivotLayoutWriter; AUseNativeGrandTotals: Boolean = False; ABudget: TlxPivotQueryBudget = nil; ADateSystem: TXLSPivotDateSystem = xlpdsCache): Integer; function TXLSPivotTable.GetDataValue(const ADataField: WideString; const AConstraints: TXLSPivotDataConstraints; ABudget: TlxPivotQueryBudget; out AValue: Variant; ADateSystem: TXLSPivotDateSystem = xlpdsCache): Boolean;
MakePreview 在 AUseNativeGrandTotals=True 時使用分離的資料表與快取,包括精確的原生加總與計算項目身分;普通的 Make 與預設的 MakePreview 保留其既有、以記錄為基礎的計算行為
GetDataValue 在快取具有計算欄位或項目時使用原生內容加總,GETPIVOTDATA 也共用同一條查詢路徑;這兩個操作都不重新整理來源資料、不重算被檢視的工作表公式,也不寫出報表儲存格
| 公開宣告 | 契約 |
|---|---|
TXLSPivotCache.Date1904: Boolean | 可讀寫的來源日期系統內容,供獨立的原生計算使用;預設 False,在傳統與 XLSX 匯入、工作表快取建立以及 XLSX 快取複製時繫結 |
TXLSPivotDateSystem | 供分離的原生預覽與查詢選擇的具型別日期系統 |
xlpdsCache | 使用快取保留的 Date1904 內容,不做改變 |
xlpds1900 | 把 1900 日期系統投影到分離的計算 |
xlpds1904 | 把 1904 日期系統投影到分離的計算 |
TryXLSXMakeNativePivotLayout(...; ADateSystem: TXLSPivotDateSystem = xlpdsCache): Boolean | 較底層的原生版面輔助函式,在其 ResultXml 與 Reason 輸出參數之後接受同樣的分離日期系統選擇 |
TXLSGetDate1904 = function: Boolean of object | 讀取目前擁有活頁簿日期系統的計算器中繼資料回呼 |
TXLSCalculator.OnGetDate1904: TXLSGetDate1904 | GETPIVOTDATA 使用的選用借用回呼;nil 使用快取內容,活頁簿評估器與其唯讀檢視則提供目前的活頁簿設定 |
獨立呼叫端必須提供正確的快取 Date1904 內容或明確的日期系統選擇;活頁簿持有的原生具體化與公式查詢會投影目前的活頁簿設定,而不修改現用快取
日期來源值在快取中仍是絕對的 TDateTime 值,而原生數值公式使用 Excel 日期序號;1904 系統對每個日期值減 1462 天,1900 轉換則處理 1900 年 3 月之前可表達的日期
已儲存原生輸出的擁有權記錄其日期系統內容,並拿已套樣式的日期值與其序列化的數值承載比對;儲存、重新開啟或變更活頁簿日期基底會保留合法的擁有權,而日期、布林、錯誤與文字承載有變時仍拒絕覆寫
預算與不支援的輸入
選用的 TlxPivotQueryBudget 回呼收到工作增量與目前記憶體估計,包括提議的分離快照與公式儲存;回傳 False 會以 EXLSPivotQueryBudget 中止,回呼例外則照常往外傳
記錄寬度與資料庫成員識別在複製前檢查;公式編譯與評估計入工作,計算保留有界的語法深度、公式文字、計算成員定義域與累加器儲存
計算項目的規劃在配置前限制合併的成員定義域、標題儲存與欄位計畫;原生成員評估與後段彙總篩選掃描也會在進入掃描前,拒絕超過固定上限的提議工作,預算取消則讓現用的成員遮罩保持不變
公式剖析器支援數值常數、欄位名稱、加引號名稱、欄位限定的成員名稱、算術與比較、百分比,以及 ABS、SQRT、POWER、ROUND、MIN、MAX、SUM、IF、IFERROR、AND、OR 與 PI;未知函式、儲存格參照、陣列與未繫結名稱會被拒絕,而不是給出猜測的值
原生計算欄位要求 SUM 資料量值,且不能放在列、欄或頁軸;計算項目要求未分組快取欄位中保留的字串標題、自動或 SUM 小計、SUM 量值,以及受支援的單成員區域識別
未知的公式函式、非零的區域 fieldPosition、未知或畸形的區域中繼資料、有歧義的篩選量值識別,以及同時活動的基本與延伸顯示轉換都會被明確拒絕;這些限制不會把不受支援的定義變成普通項目
計算成員的後段彙總篩選支援模型化的值比較;舊式的計數、百分比與加總篩選變體,以及未模型化的 Top n 中繼資料,需要受支援的原生選取模型,會被拒絕而不是改用來源記錄比較
已匯入的原始部分為普通的往返保留而保留不受支援的未來中繼資料;本機計算、具型別重建與語意功能擷取都需要可用的模型,也不會為了湊出缺失的快取記錄而去重新整理來源資料
語意樞紐分析快取定義包含計算項目身分與公式、日期系統內容與有界的分離承載;無法取得的原生擴充仍是明確的語意錯誤