Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Providers (https://www.clubdelphi.com/foros/forumdisplay.php?f=10)
-   -   Detectar modificaciones en el provider (https://www.clubdelphi.com/foros/showthread.php?t=26872)

Thales 06-11-2005 09:45:01

Detectar modificaciones en el provider
 
Muy buenas.
Veréis, utilizo el evento BeforeUpdateRecord del proveedor, y en particular, el parámetro DeltaDS para obtener los campos que han sido modificados en el ClientDataSet y así poder generar yo mismo las instrucciones a mandar a la base de datos.
Esto es posible porque si en el ClientDataSet se modifica un campo, DeltaDS.FieldByName('Campo') será no nulo y contendrá en la propiedad Value el nuevo valor introducido.
Mi problema es que esto no es cierto a la inversa, es decir, si dicho valor es nulo no significa que el campo no se haya modificado, pues de hecho el cliente ha podido modificarlo para suprimir su valor, y por tanto no tengo manera de distinguir a nivel de proveedor entre los campos no modificados y los campos suprimidos por el cliente.

Utilizo Delphi 7 y TClientDataSet+TDataSetProvider+IBX

Un saludo
Thales

Lepe 06-11-2005 10:42:18

Un Tfield tiene las propiedades OldValue y NewValue, si son distintos, ha sido modificado. O bien usa la propiedad Tag para marcarlo como modificado.

saludos

Thales 06-11-2005 16:31:07

Acabo de comprobar que, en efecto, NewValue es la respuesta y que Unassigned es el valor que devuelve cuando el campo correspondiente no ha sido modificado, por lo que no hay confusión con un null originado por el borrado del contenido desde el cliente.

Grancias y un saludo
Thales

Lepe 06-11-2005 19:59:37

Cierto.

Unassigned te lo devuelve cuando usas Field.Value, es decir, estas obteniendo el valor del campo como Variant y el valor del campo en sí, como tipo variant, no ha sido asignado.

Null significa que el campo tiene el valor especial null y corresponde con la constante VarNull.

Cita:

Empezado por Ayuda de delphi
The Unassigned constant is used to indicate that a variant has not yet been assigned a value. The initial value of any variant is Unassigned. The Unassigned value disappears as soon as a variant is assigned any other value, including the value 0, a zero-length string, and the Null value.

Si quieres profundizar, mira estas funciones en la ayuda.
Código Delphi [-]
var Field:TField;
begin
 Field := TField.Create;
Field.Value := unassigned;// no tiene valor
varisnull(Field.Value); // dará falso
varisempty(field.value); // dará true

Fieeld.Value := varnull;
varisnull(Field.Value); // dará true
varisempty(field.value); // dará falso

freeandnil(field);

saludos

Thales 07-11-2005 19:42:52

Ya resolví ayer mi duda. Mi objetivo era hacer un recorrido por los campos modificados dentro del evento BeforeUpdateRecord y así es como lo hago:

Código Delphi [-]
with DeltaDS do
  for I := 0 to Pred(FieldCount) do
    with Fields[i] do
      if (NewValue <> Unassigned) then
      begin
         // Aquí uso NewValue para recoger el dato modificado
        // y oldValue para obtener el valor inicial del campo
      end;

Gracias por todo
Thales


La franja horaria es GMT +2. Ahora son las 12:28:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi