Página 1 de 1

lChecked en TDBSwitch

Publicado: Vie May 18, 2018 1:00 am
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.

Re: lChecked en TDBSwitch

Publicado: Vie May 18, 2018 10:00 am
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

Re: lChecked en TDBSwitch

Publicado: Vie May 18, 2018 5:11 pm
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.

Re: lChecked en TDBSwitch

Publicado: Vie May 18, 2018 5:35 pm
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.

Re: lChecked en TDBSwitch

Publicado: Sab May 19, 2018 7:17 pm
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.

Re: lChecked en TDBSwitch

Publicado: Mar May 22, 2018 4:25 pm
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.

Re: lChecked en TDBSwitch

Publicado: Mar May 22, 2018 5:59 pm
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

Re: lChecked en TDBSwitch

Publicado: Mar May 22, 2018 6:39 pm
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

Re: lChecked en TDBSwitch

Publicado: Mar May 22, 2018 8:13 pm
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 5415 veces