In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

lChecked en TDBSwitch

Foro de Xailer profesional en español
Responder
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

lChecked en TDBSwitch

Mensaje por avitalini »

Al utilizar TDbSwitch el estado de oSender:lChecked y lo guardado en la tabla MySQL es inverso al estado visual

Por ejemplo:
Si está hacia la derecha e iluminado y con el texto mostrado en :cTextChecked lo que se guarda es .F.
Y a la inversa, si el control está cargado hacia la izquierda y el texto mostrado es el de cTextUnChecked lo que se guarda en la tabla es .T.

Yo esperaría el mismo comportamiento de un tCheckBox.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: lChecked en TDBSwitch

Mensaje por ignacio »

Buenos días,

Le ruego nos mande un pequeño ejemplo usando una BD local como SQLite. Nadie nos ha reportado ese error. Gracias.

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

Re: lChecked en TDBSwitch

Mensaje por avitalini »

Ignacio:

Ya probé y encontré que el problema es que el OnChange trabaja de manera diferente con el CheckBox

Código: Seleccionar todo

METHOD DBSwitch1Change( oSender ) CLASS TForm1
   ::oSQLTable1:Update()
   ::oSQLTable1:Edit()
RETURN Nil
El Update se ejecuta realmente antes de que el control tenga el verdadero valor.

Y con el CheckBox el OnChange se ejecuta correctamente.
Claudio C
Mensajes: 60
Registrado: Dom Sep 20, 2015 8:13 pm
Ubicación: Buenos Aires

Re: lChecked en TDBSwitch

Mensaje por Claudio C »

Similar comportamiento reporte para el TSwitch en http://www.xailer.com/forum/viewtopic.p ... 192#p53192
Al ejecutarse onchange se encuentra el estado 'previo' al cambio en lchecked.
avitalini escribió:Al utilizar TDbSwitch el estado de oSender:lChecked y lo guardado en la tabla MySQL es inverso al estado visual

Por ejemplo:
Si está hacia la derecha e iluminado y con el texto mostrado en :cTextChecked lo que se guarda es .F.
Y a la inversa, si el control está cargado hacia la izquierda y el texto mostrado es el de cTextUnChecked lo que se guarda en la tabla es .T.

Yo esperaría el mismo comportamiento de un tCheckBox.
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

Re: lChecked en TDBSwitch

Mensaje por avitalini »

La funcionalidad la puedo cambiar con una negación, cómo lo dice Ignacio, pero el problema es con lo que se guarda en la tabla.

Menciona Ignacio que se mandará un segundo parámetro con el verdadero valor, pero creo que el problema seguiría ya que en mi caso la tabla se guardaría con el valor anterior, creo que si tendría que haber un evento OnChanged para que funcione de forma similar a DBCheckBox y podría ser que el OnChange sea para aceptar o no el cambio.

O que el evento OnChange se dispare después de asignar el valor al campo de la tabla, para poder guardar correctamente.

Saludos, a ver qué nos dice Ignacio.
Claudio C escribió:Similar comportamiento reporte para el TSwitch en http://www.xailer.com/forum/viewtopic.p ... 192#p53192
Al ejecutarse onchange se encuentra el estado 'previo' al cambio en lchecked.
avitalini escribió:Al utilizar TDbSwitch el estado de oSender:lChecked y lo guardado en la tabla MySQL es inverso al estado visual

Por ejemplo:
Si está hacia la derecha e iluminado y con el texto mostrado en :cTextChecked lo que se guarda es .F.
Y a la inversa, si el control está cargado hacia la izquierda y el texto mostrado es el de cTextUnChecked lo que se guarda en la tabla es .T.

Yo esperaría el mismo comportamiento de un tCheckBox.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: lChecked en TDBSwitch

Mensaje por ignacio »

avitalini escribió:Al utilizar TDbSwitch el estado de oSender:lChecked y lo guardado en la tabla MySQL es inverso al estado visual

Por ejemplo:
Si está hacia la derecha e iluminado y con el texto mostrado en :cTextChecked lo que se guarda es .F.
Y a la inversa, si el control está cargado hacia la izquierda y el texto mostrado es el de cTextUnChecked lo que se guarda en la tabla es .T.

Yo esperaría el mismo comportamiento de un tCheckBox.
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

Re: lChecked en TDBSwitch

Mensaje por avitalini »

Ignacio:

Sí, el contro TSwitch hasta donde lo he probado funciona muy bien, pero insisto el problema es que el OnChange se dispara antes de guardar el valor en el campo.

En mi caso, es una pequeño motor de Facturación Electrónica, que está esperando una instrucción por SendWMCopyData de la aplicación principal para que arranque con su trabajo, pero hay varios CheckBox y uno de ellos indica si el proceso es automático o manual para lo cual el DBSwitch quedaría excelente en vista y función.

El registro siempre está en edición y al cambiar el estado de algún CheckBox actualizo el registro en la tabla de MariaDB correspondiente, para que en el inicio arranque igual.

Código: Seleccionar todo

METHOD DBSwitch1Change( oSender ) CLASS TForm1
   ::oSQLTable1:Update()
   ::oSQLTable1:Edit()
RETURN Nil
(Después de guardar, vuelvo a poner en edición)

El problema es que el OnChange se ejecuta antes de que el campo tenga el verdadero valor por lo tanto mi :Update() actualiza la tabla con el valor anterior.

Esperaría el mismo funcionamiento de su antecesor el CheckBox que el OnChange se dispara después de guardar el valor en el campo.

Agrego ejemplo con SQLite
Adjuntos
PruebaSwitchSQLite.zip
(2.94 KiB) Descargado 170 veces
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: lChecked en TDBSwitch

Mensaje por ignacio »

Buenos días,

Simplemente hay que cambiar una línea de posición:

Código: Seleccionar todo

METHOD SetChecked( lValue, lSmooth ) CLASS XSwitch

   LOCAL lOk

   IF Valtype( lValue ) == "N"
      lValue := ( lValue != 0 )
   ENDIF

   IF ::FlChecked != lValue
      ::FlChecked := lValue
      ::OnChange( lValue )   // <<<<<<<<<<<<<<<<<<<<<<<<<<< Linea bajada una posición después de la asignación de la propiedad
      IF lSmooth != NIL
         ::lIsSmooth := lSmooth
         ::nDotPos := 0
      ENDIF
      IF ! Empty( ::Handle )
         InvalidateRect( ::Handle )
      ENDIF
   ENDIF

RETURN ::FlChecked
Si lo puede probar usted mismo se lo agradezco. Si no tiene los fuentes de dicha clase o prefiere que le mande el archivo OBJ me lo dice.

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
avitalini
Mensajes: 141
Registrado: Mié Ene 07, 2015 6:31 pm

Re: lChecked en TDBSwitch

Mensaje por avitalini »

Excelente Ignacio:

Ya concuerda lo que se guarda en la tabla con la parte visual del control, no así el valor del campo llamado desde ::oSQLTable1:estado.

Por otro lado me sale la siguiente pantalla de error que dice que ya está en modo edición pero sólo cuando el DBSwitch queda en .T. al guardar la última vez.
ErrorEdit35.png
ErrorEdit35.png (5.4 KiB) Visto 5259 veces
Responder