Page 1 of 1

Get old value of modified field on TMSQuery.AfterUpdateExecute event

Posted: Mon 29 Jul 2019 08:56
by brace
How i can get the old value of a modified field in the TMSQuery.AfterUpdateExecute event?

i can get the field name with "Params.Items.Name" and the value with "Params.Items.Value", i would like to get the "Old value" too.

Code: Select all

//code sample to get fieldname and value of modified field

procedure TForm1.MyQueryAfterUpdateExecute(
  Sender: TCustomMSDataSet; StatementTypes: TStatementTypes; Params: TMSParams);
var
  I : Integer;
  sFieldName : string;
  vValue : Variant;
begin
  inherited;
  if StatementTypes = [stUpdate]  then
  begin
    for I := 0 to Params.Count-1 do
    begin
    // Get modified field name
      sFieldName := Params.Items[I].Name;          
    // Get value of modified field
      vValue := Params.Items[I].Value;
    end;
  end;
end;

Re: Get old value of modified field on TMSQuery.AfterUpdateExecute event

Posted: Mon 29 Jul 2019 14:07
by Stellar
Unfortunately, there's no way to obtain the old values of the modified fields in the dataset after the changes have been saved on the server.
You can get the necessary data before applying the changes, e.g.

Code: Select all

procedure TForm1.MSQuery1BeforeUpdateExecute(Sender: TCustomMSDataSet;
  StatementTypes: TStatementTypes; Params: TMSParams);
var
  i: Integer;
  Field: TField;
begin
  if StatementTypes <> [stUpdate]  then
    Exit;

  for i := 0 to Sender.FieldCount - 1 do begin
    Field := Sender.Fields[i];
    if Field.OldValue <> Field.Value then
      Memo1.Lines.Add(Field.FieldName + ': Old = ' + VarToStr(Field.OldValue) + ', New = ' + VarToStr(Field.Value));
  end;
end;