Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Providers
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-11-2005
Avatar de Thales
Thales Thales is offline
Miembro
 
Registrado: ago 2005
Posts: 48
Poder: 0
Thales Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 06-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 06-11-2005
Avatar de Thales
Thales Thales is offline
Miembro
 
Registrado: ago 2005
Posts: 48
Poder: 0
Thales Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 06-11-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 07-11-2005
Avatar de Thales
Thales Thales is offline
Miembro
 
Registrado: ago 2005
Posts: 48
Poder: 0
Thales Va por buen camino
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

Última edición por Thales fecha: 07-11-2005 a las 20:04:13.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:05:12.


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
Copyright 1996-2007 Club Delphi