2014-09-09 10 views
0

привет, у меня проблема с TClientDataset в Delphi. Я хочу получить набор данных с измененными данными.Как получить новое значение поля из TClientDataset в Delphi?

вот мой код:

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 изменен, это правильно, но значение сказало мне, что строка - синяя полоса ... но я хочу, чтобы данные были красными: ((

+0

вы не можете просто использовать исходный набор данных (не дельта), чтобы получить новые значения? если не видите TPacketDataSet.InitAltRecBuffers – vavan

ответ

2

Нет информации NewValue/OldValue, сохраненной в поле. Delta будет содержать 1 строку для удаленных строк 1 ряд новых вставленных строк 2 рядов для измененных строк

для каждой строки вы можете задать для delta.UpdateStatus, которые могут быть usUnmodified, usModified, usInserted или usDeleted.

каждого после немодифицированной записи следует запись с изменениями.

Вы будете смотреть в обоих записях, чтобы получить 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;