Control de cambios en edicion

Hola de nuevo. ¡ Novato abordo, con licencia recién estrenada !

Os cuento, en una app de escritorio tengo una ventana para editar o crear nuevos registros.
Cuando se pulsa el botón aceptar se guarda en la base de datos todos los campos.

Lo que quiero es que si pulsas aceptar y no se ha producido ningún cambio que no se genere la actualización de la BD.
¿ como puedo controlar que no se ha realizado cambio alguno ?

Se que se puede controlar campo a campo con evento change, y que se puede comparar cada campo con el del recorSet guardado.

Pero lo que me interesa es saber si hay algún evento en el formulario que avise si se ha cambiado algo. Sin ir uno por uno mirando.

Hola Cecilio,

Yo creo que una buena opcin es la que t propones, utilizar el evento change para notificar el cambio. Puedes tener una variable boolean a la que todos los campos tenga acceso y que cambien su valor si ha habido modificaciones. As slo tienes que verificar el valor de la variable boolean cuando se pulse aceptar.

Respondiendo a tu ltima pregunta, no hay eventos en el window/containercontrol que te avise de los cambios.

Julen

Hola Cecilio,

Todas las ventanas contienen la propiedad ContentsChanged, de modo que has de utilizar el evento TextChange (o cualquier otro equivalente en el resto de los controles) para ajustarla a True. Luego slo es cuestin de comprobarla para determinar si han de volcarse o no de nuevo los datos. Evidentemente, con la carga de un nuevo registro ha de actualizarse dicha propiedad a False.

Adicionalmente, el cambio de estado de la mencionada propiedad tambin dispara el evento con el mismo nombrede modo que tambin podras implementar dicho evento en la ventana e incluir ah el cdigo encargado de realizar las operaciones de actualizacin cada vez que uno de los campos cambiepor ejemplo.

Saludos,

Javier

No saba que ya exista una propiedad en las ventanas con ese fin, con la ventaja de que en MacOS se visualiza la ventana como “dirty”. Gracias Javier y perdona Cecilio por mi respuesta incompleta.

Entiendo que el evento no sirve en este caso, por lo menos no para lo que se plantea aqu.

Julen

Gracias a los dos por la respuesta.

Javier no es prctico. Lo he implementado, en el evento de contentsChanged pongo en enabled=true el botn encargado de guardar.

Y en cada campo cambio la propiedad a true de contersChanged, pero hay 2 problemas. 1 hay que ponerlo en cada campo, cosa que pretenda evitar. 2 si modificas un campo y luego te arrepientes y lo dejas como estaba, habra que hacer otras comprobaciones para ver que es distinto el contenido.

Quiz sea ms practico en el botn de guardar recorrer todos los campos textfiel y por su nombre compararlos con los field de un recordset para ver si hay diferencias. Pero esto no se hacerlo an.
Con ese mtodo, no importa que tengas uno o mil campos si se hace un bucle. Retornara verdadero o falso en funcin de los cambios

que os parece ? se puede hacer ?

Hola,

Si tienes muchos campos crea una subclase en la que:

  • guardes el contenido actual en una propiedad adicional y cuando se modifica el contenido lo comparas con el anterior
  • slo cuando el contenido cambie pones contentschanged a true (self.contentschanged)

Te escribo desde mi telfono sin poder probar lo que digo, pero debera funcionar.

Julen

Hola Cecilio,
en cuanto a tu pregunta, si es que te entend bien puedes hacer lo siguiente:

Puedes personalizar (si es que no los has personalizado) los textfield, los checkbox, radioboton etc. cada uno mediante una clase y a cada clase del control le creas una propiedad que le puedes llamar valorguardado cuyo tipo depende del tipo de control si es un textfield es string, si un chechbox es boolean etc.

Creas una clase que le puedes dar nombre que mas te la identifique y dos mtodos

Un mtodo lo puedes llamar guardarvalores u otro nombre y otro mtodo para cambiospendientes u otro nombre, este ultimo mtodo debe retornarte un resultado de tipo boolean, si es true para comprueba que han habido modificaciones con respecto a los valore iniciales y si es false es porque no hay cambios

En el metodo guardarvalores almacenas todos los datos que tiene almacenados inicialmente los controles, al momento de pulsar clic en tu boton editar (u otro boton con que lo asignas) ejecutas tu mtodo guardarvalores y te carga todos los datos en la propiedad valorguardado, si pulsas clic en tu botn nuevo lgicamente sern valores vacos.

Y en tu boton guardar, salir, cancelar etc. ejecutas el mtodo cambiospendientes si es true puedes poner un mensaje si descarta los cambios o no

Metodo guardarvalores(ventana As window)


  dim i,j as integer
  dim c as Control
  
  j=ventana.ControlCount - 1
  
  For i=0 TO j
    
    c=ventana.control(i)
    Select Case c 
          
    Case IsA clastextfield   ' Aqui va el nombre que les has puesto a tus clase del control
      clastextfield(c).valorguardado=clastextfield(c).text
        
    Case IsA clascheckbox
      clascheckbox(c).valorguardado=clascheckbox(c).Value
      
    Case IsA clasradioboton
      clasradioboton(c).valorguardado=clasradioboton(c).value
      
   ' y tus dems clases de controles

    End Select
    
  Next

Metodo cambiospendientes(ventana As window) As Boolean

  Dim i,j as integer
  Dim c as Control
  Dim rpta as Boolean
  
  j=ventana.ControlCount - 1
  rpta = False
  
  For i=0 TO j
    
    c=ventana.control(i)
    Select Case c 
    Case IsA clastextnum 
    
    Case IsA clastextfield
      If clastextfield(c).valorguardado<>clastextfield(c).text then
        rpta = true
      End If
      
    Case IsA clascheckbox
      If clascheckbox(c).valorguardado<>clascheckbox(c).value then
        rpta = true
      End If
      
    Case IsA clasradioboton
      If clasradioboton(c).valorguardado<>clascheckbox(c).value then
        rpta = true
      End If
    ' tus demas clase de control
    End Select
    
  Next
  
  Return rpta
  

Espero haberte ayudado en algo puedes tomar como referencia lo indicado

Saludos

Raul Juarez Pulache