네이티브 피벗 출력, 크로스 필터 쿼리, 누락 멤버
네이티브 캐시 워크시트 출력
function TXLSXWorkbook.MaterializeNativePivotTable( ATable: TXLSPivotTable): Integer; function TXLSXWorkbook.MaterializeNativePivotTable( ATable: TXLSPivotTable; AAdoptExisting: Boolean): Integer;
이 작업은 완전한 네이티브 컴팩트·표 형식·개요 보고서 격자와 그 위치, rowItems, colItems, 데이터 축 메타데이터를 워크시트 값과 출력 소유권에 함께 커밋하기 전에 스테이징합니다. 성공 시 1, 지원되지 않는 상태나 충돌 시 진단과 함께 -1을 반환합니다
지원되는 비어 있지 않은 로컬 뷰는 현재 필터, 정확한 캐시 멤버 식별, 평범한 계층, 지원되는 그룹화 도메인, 기본·커스텀 subtotal, 어느 쪽이든 지원되는 데이터 축을 유지합니다. 네이티브 격자는 표시된 평균 같은 비가법적 결과를 다시 조합하지 않고 원래 집계 값을 사용합니다
기존 셀 개체와 서식은 계속 쓸 수 있고, 보고서를 줄이거나 옮길 때는 바뀌지 않은 이전 소유 값만 정리됩니다. 편집된 출력, 소스 겹침, 병합, 수식, 배열, 다른 보고서는 변경 전에 거부됩니다
가져온 스칼라 출력에는 AAdoptExisting=True로 명시적 수용이 필요합니다. 이후 갱신은 저장과 다시 열기를 포함해 영속화된 개별 셀 소유권을 사용합니다
이 작업은 현재 캐시 레코드를 읽을 뿐 소스 데이터를 새로 고치거나 수식을 재계산하지 않습니다. 워크시트에 실제 스테이징된 네이티브 결과가 있으므로 Cache.RefreshOnLoad=False도 유효합니다
호출자 레코드 필터 콜백은 분리된 미리 보기에 참여하지만 OOXML 표현이 없습니다. Excel의 명시적 네이티브 새로 고침은 임의의 콜백 제한을 재현할 수 없으며, 지원되는 영속화 수동·Slicer 필터는 와이어 표현을 유지합니다
지원되는 SUM 계산 캐시 필드와 캐시 소유 계산 항목은 네이티브 피벗 계산 필드와 캐시 소유 항목에서 설명한 컨텍스트 합계 계약을 사용합니다. 커스텀 멤버 캡션과 지원되지 않는 레이아웃 조합은 명시적으로 거부되고, 지원되는 생성 원본 레이아웃은 무관한 XML과 현재 멤버 마스크를 유지합니다
TryXLSXMakeNativePivotLayout(const Xml: WideString; Table: TXLSPivotTable; AWriter: TlxPivotResultWriter; out ResultXml, Reason: WideString): Boolean은 lxPivotXml의 하위 레벨 스테이징 레이아웃 헬퍼입니다
이 writer는 테이블 앵커 기준 0 기반 오프셋으로 빈 셀을 포함한 전체 보고서 사각형을 행 우선 순서로 받습니다. XML·격자 프리플라이트는 첫 콜백 전에 끝나지만, 콜백이 예외를 던지면 호출자 소유 쓰기는 롤백할 수 없습니다
통합 문서 퍼사드는 트랜잭션 셀 갱신용 분리 캡처 writer를 공급합니다. 결합된 스테이징 미리 보기와 네이티브 Variant 격자는 4194304 셀로 제한됩니다
네이티브 미리 보기 경로는 TXLSPivotTable.MakePreview의 선택적 AUseNativeGrandTotals 매개변수로 네이티브 총합 방향을 요구할 수 있습니다. 기존 단일 writer·레이아웃 writer 호출은 이전 동작을 유지합니다
레이아웃과 반복 레이블
구체화 전에 보고서와 각 행 필드에 Compact와 Outline을 설정하세요. 표 형식 필드는 두 플래그 모두 False, 개요 필드는 Compact=False, Outline=True, 컴팩트 필드는 두 플래그 모두 True입니다
property TXLSPivotField.RepeatLabels: Boolean;
RepeatLabels는 기본값 False이고 필드와 함께 독립적으로 복사되며, 네이티브 x14:pivotField fillDownLabels 확장을 읽고 씁니다. 표 형식·개요 출력에서 상위 레이블을 반복하고, compact와 outline 플래그가 모두 켜진 필드에는 영향이 없습니다
각 독립 행 필드는 자기 물리 열을 받지만, 인접한 컴팩트 개요 필드는 레이블 열을 공유합니다. 행의 여러 측정값은 CompactData를 따르고, 열의 여러 측정값은 독립적인 데이터 캡션과 총합을 유지합니다
기본 표 형식 subtotal은 그룹 아래에 나타납니다. 개요 SubtotalTop은 위·아래 위치를 고르고, 행의 측정값은 그룹 아래의 별도 집계 행을 쓰면서 각 측정값의 캡션을 유지합니다
네이티브 캐시 출력은 없는 행·열 교차점을 비워 두고 실제 숫자 0을 보존합니다. 네이티브 옵션이 없는 평범한 Make와 미리 보기는 이전 빈 결과 동작을 유지합니다
비활성 필드와 측정값 필드는 스테이징된 네이티브 메타데이터에서 보고서 레이아웃을 물려받아 Excel의 명시적 새로 고침이 적절한 필드·데이터 캡션을 유지하게 합니다. 이 작업은 살아 있는 필드 설정과 기존 소유권 검사를 보존합니다
가져온 반복 레이블 확장은 확장 요소 자신의 선언을 포함해 네임스페이스 별칭을 받습니다. 알 수 없는 무관한 XML은 네이티브 구체화 경로에 의해 계속 보존됩니다
그룹화 멤버, 축 순서, 커스텀 subtotal
네이티브 출력은 캐시의 기존 타입 지정 그룹화 메타데이터로 표현되는 완전한 숫자 범위 그룹, 날짜 그룹, 수동 멤버 그룹을 지원합니다. 생성된 레이블은 Unicode와 지역화된 날짜 캡션을 포함해 가져온 GroupItemLabels를 정확히 유지합니다
그룹화는 분리된 캐시에서 평가되므로 살아 있는 캐시의 레코드, 공유 항목 핸들, 그룹 식별은 보존됩니다. 잘못된 경계, 0 간격, 불완전한 도메인, 지원되지 않는 그룹 항목 값 타입은 워크시트 출력이 바뀌기 전에 거부됩니다
기존 0 기반 TXLSPivotField.Position이 안정적인 네이티브 행·열 축 순서를 결정합니다. 같은 위치는 작성된 필드 순서를 유지하므로 기본 위치의 새로 만든 필드는 이전 정렬을 유지합니다
가져온 네이티브 Year/Month와 부모·수동 멤버 계층은 명시적인 축 순서를 유지하고, 캐시 필드 인덱스, 뷰 필드 인덱스, 표시 계산 기준 식별은 바뀌지 않습니다. 수동 그룹은 그룹 레이블이나 캐시 인덱스를 정렬하는 대신 명시적인 피벗 항목 순서를 따릅니다
커스텀 행 subtotal은 xlpsSum, xlpsCount, xlpsAverage, xlpsMax, xlpsMin, xlpsProduct, xlpsCountNumbers, xlpsStdDev, xlpsStdDevP, xlpsVar, xlpsVarP를 지원하며, 여러 선택 함수, 표 형식·개요 필드, 행의 측정값도 포함됩니다
각 함수는 자기 subtotal 범위에서 원래 소스 레코드를 집계합니다. 스테이징된 행 메타데이터는 선택된 함수를 독립적으로 식별해 비가법적 계산과 빈·오류 결과에 대한 Excel의 명시적 새로 고침 동작을 보존합니다
가져온 커스텀 subtotal 선택은 네이티브 XML에 defaultSubtotal이 없어도 암묵적 자동 subtotal을 제외합니다. 애플리케이션은 xlpsDefault를 커스텀 함수와 결합하면 안 되며, 그런 모호한 타입 지정 요청은 변경 전에 거부됩니다
subtotal이 있는 여러 열 필드 레벨, 지원되지 않는 컴팩트 데이터 축 조합, 축소된 멤버, 커스텀 캡션은 이 네이티브 출력 계약 밖으로 남습니다. 계산 필드와 항목에는 더 좁은 SUM·멤버 식별 요구가 있고, 원본 보존이 기능의 재계산·구체화 지원을 뜻하지는 않습니다
저장, 다시 열기, 재구체화는 지원되는 그룹화, 축 순서, subtotal 식별을 유지합니다. 가져온 네이티브 뷰와 독립적으로 복사된 타입 지정 캐시는 초기 열기와 명시적 새로 고침 모두에서 Excel과 대조 검증되었습니다
네이티브 표시 계산
MaterializeNativePivotTable을 호출하기 전에 각 평범한 데이터 필드에 ShowDataAs나 ExtendedShowDataAs를 설정하세요. 기본 모드와 확장 모드는 동시에 쓸 수 없습니다
기본 모드에는 차이, 기본 항목 대비 백분율, 백분율 차이, 누계, 행·열·총합 대비 백분율, 인덱스가 있습니다. 확장 모드에는 부모 행·부모 열·선택된 부모 백분율, 누적 백분율, 오름차순·내림차순 밀도 순위가 있습니다
BaseField는 비교, 누계, 선택된 부모 백분율, 순위에 쓰는 0 기반 피벗 필드 인덱스입니다. 비교는 0 기반 BaseItem 위치를 쓰거나 유효 표시 순서의 인접 보이는 멤버에 대해 xlPivotBaseItemPrevious와 xlPivotBaseItemNext를 씁니다
부모 행·부모 열 백분율은 BaseField를 쓰지 않고 대응하는 가장 안쪽 축 필드를 고릅니다. 대응 축이 없으면 그 결과는 비어 있습니다
단순 백분율은 비가법적 평균을 포함해 해당 범위의 원래 집계로 나눕니다. 누적 백분율은 표시된 멤버 집계를 더하며 가장 안쪽 기본 필드에는 원래 축 총합을 쓰고, 바깥 기본 필드는 남은 일치 멤버의 합을 쓰므로 평균이 100퍼센트를 넘을 수 있습니다
네이티브 순위는 서로 다른 앞선 집계 값의 개수를 세고, 비교는 없는 교차점, 없는 기본, 0 나눗수, previous·next 경계에 대해 Excel의 빈 값·오류 동작을 보존합니다. 단순 백분율은 없는 분자를 0으로 취급합니다
총합은 비교·누계 축의 빈 총합을 포함해 선택된 모드의 네이티브 시맨틱을 사용합니다. 표시 모드를 바꿔도 보고서의 트랜잭션 소유권·충돌·예산 검사는 유지됩니다
저장과 다시 열기는 선택된 기본·확장 모드와 기본 식별을 유지하고, 스테이징된 네이티브 메타데이터는 Excel의 명시적 새로 고침을 지원합니다. 네이티브 옵션이 없는 평범한 Make와 미리 보기는 기존 계산 계약을 유지합니다
Slicer 크로스 필터 가용성
property TXLSXSlicerCache.ItemHasData[Index: Integer]: Boolean;
이 읽기 전용 쿼리는 이 Slicer 자체의 선택은 무시하면서 다른 Slicer 선택, 수동 필터, 호출자 술어, 적용 가능한 집계 필터를 유지한 채 현재 지원되는 non-OLAP 캐시 레코드를 평가합니다
가용성은 연결된 뷰 전체의 합집합입니다. 일치하는 레코드가 없는 과거 멤버는 데이터가 없고, 빈 측정값도 데이터가 없으며, 비어 있지 않은 텍스트, Boolean, 0, 오류, 날짜 측정값은 검증된 네이티브 계약 아래 데이터로 셉니다
쿼리는 읽기 리스와 분리 레코드 미리 보기를 쓰고 살아 있는 핸들과 선택을 보존하며 FormulaArrayMemoryLimit를 지킵니다. 콜백 실패, 재진입, 잘못된 바인딩, 지원되지 않는 집계 계산 멤버는 살아 있는 변경을 커밋하지 않고 예외를 던집니다
가용성 쿼리는 캐시를 새로 고치거나 수식을 재계산하거나 파일 I/O를 수행하거나 직렬화된 네이티브 데이터 없음 플래그를 갱신하지 않습니다. 애플리케이션은 이 읽기 전용 작업에서 네이티브 UI 상태를 추론해서는 안 됩니다
TlxPivotRecordWriter = procedure(ATable: TXLSPivotTable; ARecordIndex: Integer) of object; function TXLSPivotTable.MakeRecordPreview(AWriter: TlxPivotRecordWriter; AFilterOwner: TObject = nil; AFilter: TlxPivotRecordFilter = nil): Integer;
고급 레코드 콜백은 지원되는 단순·집계 필터링 뒤에 분리된 미리 보기와 0 기반 레코드 인덱스를 받습니다. EvaluationSourceTable은 원래 뷰 식별을 유지하고 반환 값은 내보낸 레코드 수입니다
교체 필터는 제공된 소유자의 등록 콜백만 대체합니다. 다른 소유자와 외부 술어는 활성 상태로 남고, nil이 아닌 교체 콜백에는 nil이 아닌 소유자가 필요합니다
명시적 과거 멤버 제거
Removed := Workbook.PurgePivotCacheMissingItems(
Pivot.CacheId, 0);
if Removed < 0 then
raise Exception.Create('The cache member purge was rejected');
TXLSXWorkbook.PurgePivotCacheMissingItems(ACacheId: Integer; ARetainMissingItemsPerField: Integer = 0): Integer는 지원되는 연결 뷰와 Slicer의 완전한 검증·재매핑 뒤에 쓰이지 않는 멤버를 제거합니다
모든 필드에 걸친 제거된 공유 항목 총개수를 반환하고, 성공한 no-op은 0, 진단 1402와 함께 -1을 반환합니다. 현재 레코드는 참조된 모든 멤버를 유지하며 필드당 요청 수만큼 원래 공유 항목 인덱스가 가장 큰 쪽부터 쓰이지 않는 멤버를 추가로 유지합니다
유지된 멤버는 원래 상대 순서와 개체 핸들을 유지하면서 논리 인덱스만 압축됩니다. 연결된 필드·항목 핸들, 수동 숨김·상세 플래그, 활성 페이지·비교 멤버, Slicer 선택은 식별을 유지합니다
도메인 플래그와 경계는 유지된 도메인에서 다시 계산됩니다. 지원되는 가져온 압축 행·열·페이지 위치는 명시적으로 재매핑되고, 총합 더미 참조와 데이터 의사 필드 서수는 바뀌지 않습니다
평범한 완전 로컬 워크시트 캐시가 지원됩니다. 그룹화·계산·멤버 속성·OLAP·외부·불완전·모호한 캐시와 지원되지 않는 불투명 식별 메타데이터는 변경 전에 거부됩니다
활성 페이지·비교 멤버의 제거, 선택된 Slicer 부분집합 전체의 제거, 이전에 비어 있지 않았던 유효 교차점의 제거는 원자적으로 거부됩니다. 타입 지정 재구성 중 사라질 원시 멤버 속성도 거부됩니다
알려진 구체화 소유권 확장은 좌표와 타입 지정 값 토큰에 캐시 멤버 인덱스가 없으므로 바뀌지 않습니다. 무관한 불투명 확장은 안전하다고 가정하지 않습니다
제거는 소스 데이터를 새로 고치거나 워크시트 보고서 셀을 다시 쓰거나 레코드 콜백을 호출하거나 MissingItemsLimit 메타데이터를 자동 적용하지 않습니다. 이 작업을 명시적으로 요청하지 않는 한 새로 고침은 덧붙이기 전용으로 남습니다
고급 제거 조율
TXLSPivotCache._PrepareMissingItemPurge는 불투명한 TXLSPivotCachePurgePlan을 반환합니다. 모든 연결 뷰와 Slicer가 포함되도록 애플리케이션은 보통 통합 문서 퍼사드를 사용해야 합니다
MapItem과 RemainingItemCount는 캐시 재매핑을 검사하고, StagePivotField는 연결된 필드를 등록해 스테이지 인덱스를 반환하며, MapViewItemPosition은 그 필드의 와이어 위치 매핑을 검사합니다. 제거된 멤버는 -1로 매핑되고 RemovedCount는 총 제거 수를 보고합니다
Validate는 원래 스키마, 레코드, 필드·항목 소유권 식별, 스테이징된 뷰 선택을 검사합니다. Commit은 다시 검증하고 첫 살아 있는 교환 뒤에는 할당이나 콜백 없이 준비된 소유권을 이전합니다
플랜은 분리된 스냅샷을 소유하고 자기 mutable 스테이징 캐시를 비공개로 유지하며, 원래 캐시·뷰 개체를 절대 소유하지 않습니다. 플랜의 Destroy가 스테이징을 해제할 때까지 원본을 살려 두고, 각 플랜은 한 번만 커밋하세요
거부된 필드 스테이징은 그 단계만 롤백하므로 플랜을 재사용할 수 있습니다. 준비 뒤의 지원되지 않는 변경은 커밋 전에 거부됩니다