Tengo un TZTable (ZEOSlib) vinculado a un DBGrid ahora necesito saber qué TField particular fue cambiado por el usuario.

Lo intenté con

if NOT (taPositionenArtNrGH.NewValue = taPositionenArtNrGH.OldValue) then
    ShowMessage('ArticleNumber changed');

Puse el código en

  • BeforePost, OnUpdateRecord, AfterPost

Pero en el depurador, OldValue siempre es NewValue. ¿Cómo verifico qué campo se cambió?

3
Michael 29 ene. 2016 a las 12:27

3 respuestas

La mejor respuesta

Puedes usar UpdateStatus : TUpdateStatus para esto. Por ejemplo:

  1. Establezca ZTable.CchedUpdates en verdadero;
  2. Cree un nuevo campo calculado llamado "Estado".
  3. Para mostrar el valor anterior, por ejemplo, del campo "FNAME", cree un nuevo campo de cálculo llamado "FNameOldValue"
  4. En el uso del evento OnCalcFields:

    procedure TDM1.ZTable1CalcFields(DataSet: TDataSet);
    begin
      if ZTable1.UpdateStatus in [usModified] then
        begin
          ZTable1Status.value := 'Modified';
          ZTable1FNameOldValue.value := ZTable1FNAME.OldValue;
        end
      else
        ZTable1Status.value := 'UnModified'
    end;
    

Resultado:

enter image description here

Editar:

Puede detectar cambios a nivel de campo como:

if ZTable1.UpdateStatus in [usModified] then
  begin
    for I := 0 to ZTable1.Fields.Count - 1 do
      begin
        if ZTable1.Fields[i].OldValue <> ZTable1.Fields[i].NewValue  then
          -- do something with this field
      end;
   end; 
2
Val Marinov 29 ene. 2016 a las 12:16

Según la documentación:

La propiedad NewValue solo se puede utilizar cuando se accede a los datos mediante un componente TClientDataSet o las actualizaciones en caché están habilitadas.

1
mjn 29 ene. 2016 a las 10:47

Si solo desea saber qué campos se han cambiado, ¿por qué no utilizar el evento TField.OnChange? Puede completar una lista de nombres de campo en este evento y borrarlo en OnAfterPost. Pero la propiedad Modified sería realmente muy útil; es extraño que aún no se haya implementado.

1
Fr0sT 29 ene. 2016 a las 13:55