트랜잭션 피벗 캐시 새로 고침
버전 2.384.92는 기존 필드 개체, 공유 항목 개체, 논리 멤버 인덱스를 바꾸지 않으면서 로컬 사각형, 정의된 이름, 테이블 피벗 소스를 새로 고칩니다. 캐시를 공유하는 모든 피벗 테이블 뷰는 계속 같은 멤버를 가리킵니다
통합 문서 새로 고침
Workbook.Recalculate;
if Workbook.RefreshPivotCache(Pivot.CacheId) <> 1 then
raise Exception.Create('Pivot cache refresh failed');
TXLSXWorkbook.RefreshPivotCache는 성공적인 새로 고침 뒤 1을 반환하고, 캐시·소스·스키마·소스 값을 새로 고칠 수 없으면 -1을 반환합니다. 현재 셀 값을 읽으므로 소스 수식을 평가해야 한다면 먼저 통합 문서를 재계산하세요
사각형 소스는 기존 로컬 워크시트와 헤더 행을 사용합니다. SourceFirstRow, SourceFirstCol, SourceLastRow, SourceLastCol은 포함 범위의 1 기반 좌표이며 첫 행이 필드 이름을 공급합니다
정의된 이름 소스와 테이블 소스
SourceIsNamedRange=True이면 SourceName이 정의된 이름이나 고유한 테이블 이름·표시 이름을 식별합니다. 새로 고침과 구체화는 캐시에 저장된 소스 식별을 보존하면서 호출 때마다 현재 지오메트리를 해석합니다
SourceRangeSheet는 로컬 정의된 이름의 워크시트 컨텍스트를 공급합니다. 이 스코프가 같은 철자의 통합 문서 이름보다 우선하며, 그렇지 않으면 무관한 로컬 이름을 고르지 않고 통합 문서 스코프로 해석합니다
정의된 이름은 명시적으로 워크시트가 한정된 절대 사각형 하나를 담아야 합니다. 따옴표로 묶인 이름과 Unicode 워크시트 이름은 지원되지만, 상대 참조, 유니온, 별칭, 수식, 외부 참조, 모호한 이름·테이블 충돌은 변경 전에 거부됩니다
테이블은 헤더 행을 유지해야 합니다. 레코드는 현재 범위를 따르고 실제 합계 행은 제외하지만, 충돌 검사는 합계를 포함한 테이블 전체를 보호합니다. 헤더만 있는 테이블은 레코드 0개를 공급합니다
물리적 합계 멤버십은 저장된 totalsRowCount를 따르며 값이 없으면 0을 뜻합니다. 합계 UI 힌트만으로 데이터 행이 제거되지 않고, 저장이 실제 멤버십을 명시적으로 기록합니다
작성된 합계 행에는 ColumnTotalsRowLabels, ColumnTotalsRowFunctions, ColumnTotalsRowFormulas로 유효한 열 합계 메타데이터와 워크시트 내용을 공급하세요. TotalsRowShown=True로 둔다고 합계 수식이 만들어지거나 셀 값이 강제 변환되지 않습니다
워크시트 이동은 로컬 이름 스코프를 유지하고, 워크시트 이름 바꾸기는 지원되는 로컬 참조와 피벗 소스 컨텍스트를 갱신하면서 무관한 외부 참조와 불투명한 가져온 캐시 XML을 보존합니다. 정의된 이름 저장은 메모리 속 수식을 바꾸지 않으면서 선택적인 선행 수식 등호를 제거합니다
헤더는 대소문자 구분 없이 이름으로 기존 데이터베이스 필드와 맞춰집니다. 소스 열 순서 변경은 논리 필드 인덱스를 보존하고, 중복·이름 변경·누락·추가 소스 필드는 거부됩니다. 빈 헤더는 기존 FieldN 폴백을 사용합니다
빈 소스 셀은 워크시트 셀 컬렉션에 추가되지 않고 빈 상태로 남습니다. 헤더만 있는 소스는 레코드 0개를 만들면서 과거 멤버는 유지합니다
안정적인 멤버와 공유 뷰
기존 공유 항목은 인덱스와 개체 식별을 유지하고, 새 타입 지정 값은 도메인에 덧붙습니다. 소스 멤버를 재정렬·제거·재도입해도 그 멤버들을 식별하던 숨김 항목, 페이지 선택, 기본 항목 참조, 명시적 그룹 매핑은 보존됩니다
하나의 캐시를 공유하는 모든 뷰는 새로 고친 레코드를 봅니다. 사라진 과거 멤버는 캐시 도메인에 남지만 그 자체로 집계 행을 만들지 않습니다. TXLSPivotTable.Make가 현재 레코드로 결과를 만들기 때문입니다
과거 멤버는 MissingItemsLimit와 무관하게 유지됩니다. 이 새로 고침 경로는 누락 멤버를 제거하거나 유지 멤버 한도를 집행하거나 선택 인덱스를 다시 매기지 않습니다
숫자, 날짜, Boolean, 텍스트, 빈 값, 표현 가능한 오류 값은 새로 고침과 XLSX 저장에서 타입을 유지합니다. 공유 항목 콘텐츠 플래그와 표현 가능 경계는 유지된 도메인과 새로 덧붙인 도메인에서 다시 계산됩니다
저장은 기존 순서, 숨김 플래그, 가져온 레이아웃 확장을 보존하면서 뒤따르는 subtotal 항목 앞에 새로 고친 뷰 멤버 목록을 완성합니다. 페이지 선택은 논리 캐시 멤버와 각 뷰에 저장된 위치 사이를 매핑하므로, 멤버 목록이 재정렬되어도 다시 열었을 때 같은 멤버를 선택합니다
계산 필드와 그룹화 필드
계산 필드는 소스 열을 소비하지 않습니다. 이름, 수식, 공유 항목 도메인은 계속 쓸 수 있고, 각 새로 고친 레코드는 그 필드의 빈 플레이스홀더로 시작합니다. Make는 현재 소스 값으로 지원되는 계산 수식을 평가합니다
XLSX 캐시 레코드는 데이터베이스 필드만 저장합니다. 저장과 다시 열기는 계산 필드가 데이터베이스 필드 사이에 있어도 소스 열 정렬을 보존합니다
소스 필드의 숫자·날짜 그룹화는 새 멤버를 받을 수 있습니다. 명시적인 이산 그룹화는 재정렬된 기존 멤버는 받지만 명시적 매핑이 없는 새 멤버는 거부하며, 이전 캐시 전체를 보존합니다
버전 2.384.94는 검증된 기본/부모 링크에서 지원되는 고정 파생 그룹화 필드를 재구성합니다. 자동 도메인 확장, 매핑 없는 이산 멤버, 멤버 속성 필드는 트랜잭션 방식으로 거부되고, 외부·OLAP 소스는 로컬 소스 계약 밖으로 남습니다. 그룹화 캐시 경계를 참조하세요
원자적 갱신과 콜백 새로 고침
소스 검증, 읽기, 타입 변환, 레코드 할당, 멤버 조회는 분리된 스테이징 데이터에서 끝납니다. 실패해도 살아 있는 필드·항목 핸들, 레코드, 메타데이터, 원본 리플레이 상태, 모든 공유 뷰는 그대로입니다
성공하면 레코드·조회 버퍼를 교체하고 원본 캐시 리플레이를 비활성화하며, RefreshedDate를 갱신하고 RefreshOnLoad=False로 둡니다. 저장은 이전 원본 표현을 리플레이하지 않고 새로 고친 타입 지정 캐시를 사용합니다
독립형 또는 Classic 백엔드 코드는 TXLSPivotCache.RefreshFromSource로 같은 스테이징 구현을 쓸 수 있습니다. reader는 1 기반 소스 좌표를 받고 Variant를 반환하며, 검증이나 reader 실패는 예외를 던집니다
TlxPivotSourceCellValue = function(ARow, ACol: Integer): Variant of object;
procedure TXLSPivotCache.RefreshFromSource(AValueReader: TlxPivotSourceCellValue); procedure TXLSPivotCache.RefreshFromSource(AValueReader: TlxPivotSourceCellValue; AFirstRow, AFirstCol, ALastRow, ALastCol: Integer);
단일 인수 오버로드는 캐시 안의 구체적인 로컬 사각형을 요구합니다. 명시적 경계 오버로드는 캐시의 이름·테이블 소스 식별을 바꾸지 않고 호출자가 해석한 로컬 사각형을 읽으며, 그 식별을 올바르게 해석하는 일은 호출자의 책임으로 남습니다
캐시 새로 고침은 캐시 데이터를 갱신합니다. 애플리케이션은 자체 결과 writer로 Make를 호출하거나 보호된 워크시트 출력용 MaterializePivotTable을 쓸 수 있습니다. 지원되는 가져온 바인딩에는 타입이 지정된 non-OLAP 피벗 Slicer 선택을 쓸 수 있고, 완전한 네이티브 레이아웃은 별도의 작업으로 남습니다