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
avitalini
Posts: 138
Joined: Wed Jan 07, 2015 6:31 pm

lChecked en TDBSwitch

Postby avitalini » Fri May 18, 2018 1:00 am

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.
User avatar
ignacio
Site Admin
Posts: 8419
Joined: Mon Apr 06, 2015 8:00 pm
Location: Madrid, Spain
Contact:

Re: lChecked en TDBSwitch

Postby ignacio » Fri May 18, 2018 10:00 am

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]
http://www.xailer.com
http://www.xailer.info
avitalini
Posts: 138
Joined: Wed Jan 07, 2015 6:31 pm

Re: lChecked en TDBSwitch

Postby avitalini » Fri May 18, 2018 5:11 pm

Ignacio:

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

Code: Select all

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
Posts: 38
Joined: Sun Sep 20, 2015 8:13 pm
Location: Buenos Aires

Re: lChecked en TDBSwitch

Postby Claudio C » Fri May 18, 2018 5:35 pm

Similar comportamiento reporte para el TSwitch en http://www.xailer.com/forum/viewtopic.php?t=13462&p=53192#p53192
Al ejecutarse onchange se encuentra el estado 'previo' al cambio en lchecked.

avitalini wrote: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
Posts: 138
Joined: Wed Jan 07, 2015 6:31 pm

Re: lChecked en TDBSwitch

Postby avitalini » Sat May 19, 2018 7:17 pm

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 wrote:Similar comportamiento reporte para el TSwitch en http://www.xailer.com/forum/viewtopic.php?t=13462&p=53192#p53192
Al ejecutarse onchange se encuentra el estado 'previo' al cambio en lchecked.

avitalini wrote: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.
User avatar
ignacio
Site Admin
Posts: 8419
Joined: Mon Apr 06, 2015 8:00 pm
Location: Madrid, Spain
Contact:

Re: lChecked en TDBSwitch

Postby ignacio » Tue May 22, 2018 4:25 pm

avitalini wrote: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]
http://www.xailer.com
http://www.xailer.info
avitalini
Posts: 138
Joined: Wed Jan 07, 2015 6:31 pm

Re: lChecked en TDBSwitch

Postby avitalini » Tue May 22, 2018 5:59 pm

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.

Code: Select all

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
Attachments
PruebaSwitchSQLite.zip
(2.94 KiB) Downloaded 6 times
User avatar
ignacio
Site Admin
Posts: 8419
Joined: Mon Apr 06, 2015 8:00 pm
Location: Madrid, Spain
Contact:

Re: lChecked en TDBSwitch

Postby ignacio » Tue May 22, 2018 6:39 pm

Buenos días,

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

Code: Select all

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]
http://www.xailer.com
http://www.xailer.info
avitalini
Posts: 138
Joined: Wed Jan 07, 2015 6:31 pm

Re: lChecked en TDBSwitch

Postby avitalini » Tue May 22, 2018 8:13 pm

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) Viewed 445 times

Return to “Spanish”

cron