2013-07-28 1 views
10

ClientDatSet에 몇 개의 fkInternalCalc 필드가 있습니다. CDS는 어떤 제공자와도 연결되어 있지 않습니다. 대신 그것은 날아 섰다. 어떻게하면 CDS가 모든 "계산 가능한"필드를 다시 계산하도록 강제 할 수 있습니까? 데이터를 새로 고치는 공급자가 없기 때문에 Refresh()으로 전화를 걸 수 없습니다. 지금까지 내가 가진 유일한 방법은 모든 레코드를 탐색하는 것이 었으며 이것이 최선의 방법은 아닙니다.클라이언트 데이터 집합에서 계산 및 내부 계산 필드를 다시 계산하도록하는 방법은 무엇입니까?

추신 : 나는 this questionthis post을 읽었지만 좀 더 우아한 방법을 기대합니다.

+0

그럼 데이터를 열어도 작동하지 않습니까? –

+0

@SertacAkyuz 아직 시도하지는 않았습니다. 클라이언트 데이터 세트를 닫지 않아도 클라이언트 데이터 세트의 모든 데이터가 지워지지 않습니까? –

+0

예. ......... –

답변

8

도우미 (여기서는 필요에 따라 제거됨)을 사용하면 해킹없이 보호 된 메소드를 호출 할 수 있습니다. fCInternalCalc 필드의 경우 OnCalcFields에서 DataSet.State = dsInternalCalc을 확인하십시오.

type 
    TClientDataSetHelper = class helper for TClientDataSet 
    public 
    function AssureEditing: Boolean; 
    procedure InternalCalc; 
    end; 

function TClientDataSetHelper.AssureEditing: Boolean; 
begin 
    result := not (State in [dsEdit, dsInsert]); 
    if result then 
    Edit; 
end; 

procedure TClientDataSetHelper.InternalCalc; 
var 
    needsPost: Boolean; 
    saveState: TDataSetState; 
begin 
    needsPost := AssureEditing; 
    saveState := setTempState(dsInternalCalc); 
    try 
    RefreshInternalCalcFields(ActiveBuffer); 
    finally 
    RestoreState(saveState); 
    end; 
    if needsPost then 
    Post; 
end; 

이 값은 CalculateFields을 사용하여 정상적인 계산 필드에서 쉽게 확장 할 수 있습니다. 다른 데이터 필드가 변경 될 때마다 계산 된 필드가 다시 계산되므로 필요하지 않습니다.

+0

이 시도하고 * "[dcc32 오류] dMyDataModule.pas (151) : E2389 보호 된 멤버 'TDataSet.RefreshInternalCalcFields'여기에 액세스 할 수 없습니다"*. – GolezTrol

+0

@GolezTrol, 버그처럼 보입니다. XE3에서 작동하지만 XE7 및 XE8에서는 작동하지 않습니다 (현재 XE4에서 XE6까지 확인할 수 없음). 다른 보호 된 멤버는 완벽하게 액세스 할 수 있습니다 : "setTempState", "RestoreState". RSP-11337로보고되었습니다. –

+0

좁히려면 XE5에있었습니다. 테스트 해 주셔서 감사합니다! 나는 더 고전적인 클래스 헬퍼를 사용하여 그것을 지금 해결했다 : 지역적으로 정의 된'THackClientDataSet = class (TClientDataSet)'에 타입 캐스팅. – GolezTrol

-1

이것은 약간의 해킹이지만 작동합니다!

DBGrid.Height := 30; 
DBGrid.Height := 200; // Refresh all Rows after first 
CalculatedProc(DataSet); // Refresh first calculated fields. (Write name of your calculate procedure) 
+0

이미 수용된 답변을 어떻게 개선 할 수 있습니까? –

+0

1. Delphi 기본 함수 사용 2. 샷 3. 간단한 –

+0

4. 더 빠르게 변경 상태를 사용하십시오! –

관련 문제