2014-09-09 1 views
0

안녕 델파이의 TClientDataset에 문제가 있습니다. 변경된 데이터로 데이터 세트를 가져오고 싶습니다.Delphi의 TClientDataset에서 새 필드 값을 얻는 방법은 무엇입니까?

예를 들어
procedure TForm2.btnUpdateClick(Sender: TObject); 
var 
    I: Integer; 
    counter : Integer; //for testing 
    value : String; 
begin 
    if not Self.DatasetArtikel.Active then 
    begin 
     ShowMessage('Nicht aktiv'); 
     Exit; 
    end; 

    if Self.DatasetArtikel.ChangeCount = 0 then 
    begin 
    ShowMessage('Delta is empty'); 
    Exit; 
    end; 

    counter := DatasetArtikel.ChangeCount; 

     //DatasetArtikelUpdate.ClearFields; 
     //DatasetArtikelUpdate.CreateDataSet; 

     DatasetArtikel.Data := Self.DatasetArtikel.Delta; //here i want to transfer the changed data 
     Release; 

    //for I := 0 to DatasetArtikelUpdate.Fields.Count -1 do 
     // if not DatasetArtikelUpdate.Fields[I].IsNull then 
     // value := DatasetArtikelUpdate.Fields[I].NewValue; 

     value := DatasetArtikel.Fields[2].OldValue; 
     value := DatasetArtikel.Fields[2].Value; 
     value := DatasetArtikel.Fields[2].NewValue; //here i want the new data 

     end; 

: 3 열에서 텍스트 blueblue 내가 그것을 redred로 변경

여기 내 코드입니다. 카운터가 1이 바뀌 었다고 말하면 값은 정확하지만 그 문자열은 blueblue입니다 ...하지만 데이터를 다시 적어주세요. ((

+0

방금 ​​새 값을 얻기 위해 원본 데이터 셋 (안 델타)를 사용할 수 없습니다? 보이지 않는 경우 TPacketDataSet.InitAltRecBuffers – vavan

답변

2

필드에 저장된 NewValue/OldValue 정보가 없음 델타는 2 행, usModified, usInserted 또는 usDeleted을 usUnmodified 할 수 있습니다 당신이 delta.UpdateStatus를 요청할 수있는 모든 행에 대해 행이 수정

에 대한 삭제 된 행에 대한 새로운 삽입 된 행에 대한 1 행을 1 행이 포함됩니다.

모든를 수정되지 않은 레코드 다음에 수정 된 레코드가옵니다.

Old-와 NewValue를 얻으려면 두 레코드를 모두 살펴보십시오.

enter image description here

enter image description here

procedure TTestForm.RunInfoClick(Sender: TObject); 
type 
    TMyFieldInfo = Record 
    FieldName: String; 
    Size: Integer; 
    DataType: TFieldType; 
    FieldKind: TFieldKind; 
    end; 

var 
    I: Integer; 
    sl: TStringList; 
    old: String; 
    FA: Array of TMyFieldInfo; 
    F: TField; 

    // get fielddefs after openening and a a definition for a calculated field 
    // called Status to refect UpdateStatus 
    Procedure GetFields; 
    var 
    I: Integer; 
    begin 
    SetLength(FA, delta.FieldCount + 1); 
    for I := 0 to delta.FieldCount - 1 do 
    begin 
     FA[I].FieldName := delta.Fields[I].FieldName; 
     FA[I].DataType := delta.Fields[I].DataType; 
     FA[I].Size := delta.Fields[I].Size; 
     FA[I].FieldKind := fkdata; 
    end; 
    FA[High(FA)].FieldName := 'Status'; 
    FA[High(FA)].DataType := ftString; 
    FA[High(FA)].Size := 10; 
    FA[High(FA)].FieldKind := fkcalculated; 
    delta.Close; 
    end; 

// apply our fields to be able to display a calculated field 
    Procedure SetFields; 
    var 
    I: Integer; 
    begin 
    delta.Fields.Clear; 
    for I := Low(FA) to High(FA) do 
    begin 
     F := DefaultFieldClasses[FA[I].DataType].Create(delta); 
     With F do 
     begin 
     FieldName := FA[I].FieldName; 
     FieldKind := FA[I].FieldKind; 
     Size := FA[I].Size; 
     DataSet := delta; 
     end; 
    end; 
    delta.Open; 
    end; 

    Procedure LogSL; 
    begin 
    if sl.Count > 1 then 
     Memo1.Lines.Add(sl.Text); 
    sl.Clear; 
    end; 

begin 
    Memo1.Lines.Clear; 
    sl := TStringList.Create; 
    try 
    delta.Close; 
    delta.Fields.Clear; 
    delta.Data := ClientDataSet1.delta; 
    GetFields; 
    SetFields; 

    while not delta.Eof do 
    begin 
     if delta.UpdateStatus <> usModified then 
     begin 
     LogSL; 
     end; 
     if delta.UpdateStatus = usUnmodified then 
     sl.Add('Unmodified:') 
     else if delta.UpdateStatus = usInserted then 
     begin 
     sl.Add('Insert:'); 
     end 
     else if delta.UpdateStatus = usDeleted then 
     begin 
     sl.Add('Deleted:'); 
     end 
     else if delta.UpdateStatus = usModified then 
     begin 
     sl[0] := ('Modified:'); 
     end; 
     for I := 0 to delta.FieldCount - 2 do // ignore our calculated field 
     begin 
     if delta.UpdateStatus = usModified then 
     begin 
      if (sl.Values[delta.Fields[I].FieldName] <> delta.Fields[I].AsString) and not delta.Fields[I].IsNull then 
      begin // we had changes 
      sl[I + 1] := sl[I + 1] + ' OldValue: ' + delta.Fields[I].AsString; 
      end 
      else 
      begin // we did not have changes take stored OldValue 
      sl[I + 1] := sl[I + 1] + ' OldValue: ' + sl.Values[delta.Fields[I].FieldName]; 
      end 
     end 
     else // delta.UpdateStatus = usModified 
      sl.Add(delta.Fields[I].FieldName + '=' + delta.Fields[I].AsString + old); 
     end; 
     delta.Next; 
    end; 
    LogSL; 
    finally 
    sl.Free; 
    end; 
end; 

procedure TTestForm.deltaCalcFields(DataSet: TDataSet); 
begin 
    with TClientDataSet(DataSet) do 
    begin 
    case UpdateStatus of 
     usUnmodified: 
     FieldByName('Status').AsString := 'Unmod'; 
     usModified: 
     FieldByName('Status').AsString := 'Modi'; 
     usInserted: 
     FieldByName('Status').AsString := 'Ins'; 
     usDeleted: 
     FieldByName('Status').AsString := 'Del'; 
    end; 
    end; 
end; 
관련 문제