PDA

Ver la Versión Completa : Detectar modificaciones en el provider


Thales
06-11-2005, 10:45:01
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, 11: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, 17: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, 20: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.


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.

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, 20: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:

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