Cómo modificar valores de campo en TDataSetProvider.OnUpdateData

Después de leer el archivo de ayuda de Delphi sobre la explicación del evento TDataSetProvider.OnUpdateData:

Examine los datos (por ejemplo, para valores o cambios de datos que no deberían permitirse) y genere excepciones que cancelen la aplicación de actualizaciones antes de que ocurran.Cambie los datos (por ejemplo, cifrar o descifrar valores) antes de enviarlos al conjunto de datos de origen o al servidor de la base de datos.

Estoy buscando un código de muestra de cómocambiar datos para OnUpdateData. He hecho todo lo posible para buscar una solución. Esto es lo que puedo lograr:

Ejemplo :

procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
  DataSet.First;
  while not DataSet.EOF do begin
    if DataSet.UpdateStatus = usUnmodified then begin
      TPacketDataSet(Dataset).InitAltRecBuffers(True);
      if DataSet.UpdateStatus in [usInserted, usModified] then begin
        Dataset.Edit;
        DataSet.FindField('MyField').AsString := 'zzz';
        Dataset.Post;
      end;
    end;
  end;
  DataSet.Next;
end;

Problema para el ejemplo 1: Desafortunadamente, sigo recibiendo el error de que falta algún valor de campo. Después de realizar alguna depuración, descubrí que hay campos obligatorios que tienen un valor vacío.

Ejemplo 2:

procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
  DataSet.First;
  while not DataSet.EOF do begin
    if DataSet.UpdateStatus = usUnmodified then begin
      TPacketDataSet(Dataset).InitAltRecBuffers(True);
      if DataSet.UpdateStatus in [usInserted, usModified] then 
        DataSet.FindField('MyField').NewValue:= 'zzz';     
    end;
    DataSet.Next;
  end;  
end;

Problema para el ejemplo 2: Al escribir de esta manera no necesitamos llamar a DataSet.Edit & DataSet.Post. Pero el valor 'zzz' que se estableció en TField.NewValue no se guarda en la base de datos.

Tengo alguna razón especial por la que esta actualización debe realizarse en OnUpdateData en lugar de BeforeUpdateRecord / AfterUpdateRecord.

Por favor aconséjame. Muchas gracias

Respuestas a la pregunta(2)

Su respuesta a la pregunta