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.

oBrowse:Edit() lanza OnGetData()

Foro de Xailer profesional en español
Responder
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

oBrowse:Edit() lanza OnGetData()

Mensaje por XeviCOMAS »

Desde que me he actualizado a Xailer503, me he dado cuenta de una cosa.
Resulta que tengo un Browse con 4 columnas, en dos de ellas (la 3 y la 4) tengo el OnGetData que realice una muestra en la celda/columna, segun el valor que hay en un campo de la DBF...
Bien, hasta ahí todo bien.
PERO... siempre encuentro PEROs, que le voy a hacer, serà que pruebo demasiadas cosas!!!

Cuando edito un registro, con Edit() (solo tengo editable la columna 2), entra en edición, PERO... la primera vez SOLO LA PRIMERA VEZ que cambio el contenido del edit, o pulso la tecla Shift, también ocurre... automáticamente cambia el contenido que se muestra en las columnas 3 y 4 de TODOS los registros visibles en el Browse, que son las que tengo codigo en el OnGetData.

Salgo de la edición, se refresca el Browse, y luego ya muestra los valores correctos otra vez, y por mas que vuelva a editar, no se vuelve a repetir ese "mal comportamiento" al entrar en edición.

Si cierro el Form, lo vuelvo a abrir y vuelvo a editar, la primera vez SIEMPRE ocurre.

Ah... por cierto, un TDBBrowse()
El mismo código, compilado con Xailer 3.3.1 funciona correctamente, no lanza el OnGetData() al entrar la primera vez en edición.
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por XeviCOMAS »

Bien, nada mejor que con un ejemplo!!!

Al tratar de editar un registro (columna 2) cuando se pulsa una tecla al entrar en edición, cambia el contenido de todas las celdas de las columnas 3 y 4 por el mismo valor de las celdas 3 y 4 del registro a editar.

SOLO OCURRE LA PRIMERA VEZ QUE SE INTENTA EDITAR.

Si entramos en edición y no modificamos, sinó que salimos del modo edición y volvemos a entrar en edición ya siempre funciona.
Cerramos y volvemos a abrir la aplicación... SIEMPRE, la primera vez que editemos, el mismo problema!!!
Adjuntos
Prueba.zip
(47.43 KiB) Descargado 142 veces
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9252
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por ignacio »

XeviCOMAS escribió:Bien, nada mejor que con un ejemplo!!!

Al tratar de editar un registro (columna 2) cuando se pulsa una tecla al entrar en edición, cambia el contenido de todas las celdas de las columnas 3 y 4 por el mismo valor de las celdas 3 y 4 del registro a editar.

SOLO OCURRE LA PRIMERA VEZ QUE SE INTENTA EDITAR.

Si entramos en edición y no modificamos, sinó que salimos del modo edición y volvemos a entrar en edición ya siempre funciona.
Cerramos y volvemos a abrir la aplicación... SIEMPRE, la primera vez que editemos, el mismo problema!!!
OnGetData sólo debe utilizarse para devolver el valor a visualizar. Nada más:
2018-01-16 20_22_23-Ayuda de HTML.png
2018-01-16 20_22_23-Ayuda de HTML.png (4.01 KiB) Visto 6062 veces
Ya que se llama constantemente cada vez que se necesita el pintado.

El evento a utilizar para edición es OnGetValue.
2018-01-16 20_24_24-Ayuda de HTML.png
2018-01-16 20_24_24-Ayuda de HTML.png (4.27 KiB) Visto 6062 veces
Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por XeviCOMAS »

Ignacio,

pues más razón me das!!!
Para el ejemplo que he adjuntado, esas columnas 3 y 4 SON SOLO PARA VISUALIZACIÓN, NO PARA EDICIÓN.
De ahí que esté utilizando el evento OnGetData... para mostrar un valor, nada más.!!!

El caso es que SOLO FALLA la primera vez que se edita la columna 2... ni la 3 ni la 4, que no son editables.

Gracias por tu tiempo.
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por XeviCOMAS »

Bien, no es una forma "elegante" de arreglar el error de la clase TDBBrowse, pero de momento "salvo" el percance...

Código: Seleccionar todo

#include "Xailer.ch"

CLASS TForm1 FROM TForm

   COMPONENT oBrowse1
   COMPONENT oCdxDataSource1
   COMPONENT oDbfDataSet1

   METHOD CreateForm()
   METHOD Browse1Column4GetData( oSender, @Value, @nImage )
   METHOD Browse1Column3GetData( oSender, @Value, @nImage )
   METHOD FormInitialize( oSender )

ENDCLASS

#include "Form1.xfm"

//------------------------------------------------------------------------------

METHOD Browse1Column4GetData( oSender, Value, nImage ) CLASS TForm1

   Value := ::oDbfDataSet1:SALDO1 * ::oDbfDataSet1:XYCC

RETURN Nil

//------------------------------------------------------------------------------

METHOD Browse1Column3GetData( oSender, Value, nImage ) CLASS TForm1

   Value := IF( Value = 1, "Rep", IF( Value = 2, "Sup", "" ) )

RETURN Nil

//------------------------------------------------------------------------------

METHOD FormInitialize( oSender ) CLASS TForm1

//Apaño por el fallo al entrar la primera vez en edición... se repite en las columnas 3 y 4 valores del registro a editar
   ::oBrowse1:Edit()
   ::oBrowse1:aCols[2]:oGridEdit:PostMsg( WM_KEYDOWN, VK_ESCAPE )

RETURN Nil

//------------------------------------------------------------------------------
Lo que hago es entrar y salir de edicion con ESCAPE, al inicializar el Form... de esta manera, la primera entrada en edición la he hecho sin que se de cuenta "nadie" y ya las próximas ediciones funciona normalmente y se visualizan los datos correctos en el Browse.
Adjuntos
Prueba (2).zip
(47.71 KiB) Descargado 136 veces
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9252
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por ignacio »

XeviCOMAS escribió:Ignacio,

pues más razón me das!!!
Para el ejemplo que he adjuntado, esas columnas 3 y 4 SON SOLO PARA VISUALIZACIÓN, NO PARA EDICIÓN.
De ahí que esté utilizando el evento OnGetData... para mostrar un valor, nada más.!!!

El caso es que SOLO FALLA la primera vez que se edita la columna 2... ni la 3 ni la 4, que no son editables.

Gracias por tu tiempo.
2018-01-17 10_11_57-Ayuda de HTML.png
2018-01-17 10_11_57-Ayuda de HTML.png (48.76 KiB) Visto 6013 veces
Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por XeviCOMAS »

Bien, entiendo, pero continuo diciendo que el comportamiento es anómalo, es en el pintado de las celdas de las columnas, no en la edición.

Y por contra, compilado con Xailer331, este comportamiento es de lo mas correctísimo, no como en Xailer5.

Pero si por vuestra parte es correcto, alguien más se quejará en uno u otro dia.
En fin... Ahí lo dejo.
Un Saludo,
Xevi.
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por XeviCOMAS »

Pido Disculpas.

Hay que hacerlo distinto...

Código: Seleccionar todo

METHOD Browse1Column4GetData( oSender, Value, nImage ) CLASS TForm1

*   Value := ::oDbfDataSet1:SALDO1 * ::oDbfDataSet1:XYCC //al primer edición repinta valores columna del registro a editar.
   Value := ::oDbfDataSet1:SALDO1( dsFIELD ) * ::oDbfDataSet1:XYCC( dsFIELD ) //de esta forma SI funciona

RETURN Nil
Tampoco cuesta nada explicarlo con ejemplo!!!
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9252
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por ignacio »

XeviCOMAS escribió:Bien, entiendo, pero continuo diciendo que el comportamiento es anómalo, es en el pintado de las celdas de las columnas, no en la edición.

Y por contra, compilado con Xailer331, este comportamiento es de lo mas correctísimo, no como en Xailer5.

Pero si por vuestra parte es correcto, alguien más se quejará en uno u otro dia.
En fin... Ahí lo dejo.
Quizás, sólo quizás, deberías de releer la documentación unas cuentas vece más. Si hace falta que te haga un croquis me lo dices. Siento ser tan rudo.

Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por XeviCOMAS »

Pues si... un poquito de cada parte, SI.
Un Saludo,
Xevi.
Jose Lopez
Mensajes: 123
Registrado: Mié Jun 16, 2010 2:33 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por Jose Lopez »

Ignacio,
Yo estoy teniendo el mismo comportamiento con evento TBrwColumn:OnGetData desde la versión 5 de Xailer y he tenido que volver a compilar con la versión anterior para poderlo solucionar provisionalmente ya que los clientes me estan llamando.
Hay alguna posibilidad de mantener la compatibilidad con la versión 4.
Muchas gracias Igacion.
Saludos.
Pepe.
Nota: Como utilizo TArrayBrowse en las pruebas que estoy haciendo. Si cambio en el OnGetData esto: nServir := oSender:oParent:GetValue("SERVIR")
Por esto: nServir := oSender:oParent:aArrayData[nPosBrowse,5]
If nServir > 0
oSender:nClrPane := clLime
Else
oSender:nClrPane := clRed
EndIf
Va ok
El problema que detecto con el debugger, es que la primera vez que edito un registro me cambia toda la columna teniendo en cuenta el valor que introduzo en oCol:Edit(nKey)
y no el valor de cada registro.
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por XeviCOMAS »

Pepe,

como he escrito en un post anterior... puedes "arreglarlo" en el FormInitialize.
Haces un Edit() y sales de él sin modificar nada.

Código: Seleccionar todo

METHOD FormInitialize( oSender ) CLASS TForm1

//Apaño por el fallo al entrar la primera vez en edición... se repite en las columnas 3 y 4 valores del registro a editar
   ::oBrowse1:Edit()
   ::oBrowse1:aCols[2]:oGridEdit:PostMsg( WM_KEYDOWN, VK_ESCAPE )

RETURN Nil
No es "elegante" pero funciona!!!

Otra cosa es con TDBBrowses, que se hace referencia al campo, añadiendo (dsFIELD), me quedó arreglado, como me comentó Ignacio.
Un Saludo,
Xevi.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9252
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por ignacio »

Buenas tardes,

Esto no es una novedad de Xailer 5 y está así desde Xailer 2. Voy a intentar explicarlo otra vez:

Cualquier miembro del dataset que apunta a un campo de una tabla o recordset siempre muestra el valor de dicho campo en la tabla o recordset, SALVO QUE SE ENCUENTRE EN MODO EDICION por haber utilizado los métodos AddNew() o Update() del dataset, ya que en dicho caso EL VALOR QUE DEVUELVEN ES EL VALOR DEL BUFFER INTERNO QUE TIENE EL DATASET PARA EDICION.

Para permitir que incluso en modo edición el recordset devuelva el valor del campo y no el valor del buffer existe el parámetro NombreDeCampo(dsField)

Por lo tanto, el comportamiento actual no es ningún error, sino todo lo contrario. Y además lleva funcionando así desde hace muchos, muchos, años.

Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9252
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por ignacio »

Jose Lopez escribió:Ignacio,
Nota: Como utilizo TArrayBrowse en las pruebas que estoy haciendo. Si cambio en el OnGetData esto: nServir := oSender:oParent:GetValue("SERVIR")
En OnGetData no deberías actualizar nada. Es un evento que se puede disparar cientos de veces ya que se dispara cada vez que el browse necesita pintarse. Limítate a devolver el valor que quieras pintar. Nada más. Hay otros eventos que puedes usar, como OnChange.

En el caso del TArrayBrowse, su comportamiento es exactamente igual que el TDBBrowse y es así desde hace un PORRÓN de años. Puedes verlo en los fuentes:

Código: Seleccionar todo

METHOD GetValue( Col, nAt ) CLASS XArrayBrowse
  ....
  ....
  
   IF ! Empty( nIndex )
       WITH OBJECT ::aCols[ nIndex ]
         IF :oGridEdit:lVisible .AND. ( nAt == ::nArrayAt .OR. ::nEditMode == beAPPEND ) 
            RETURN :oGridEdit:Value
         ENDIF
      END WITH
     IF nAt > 0 .AND. nAt <= Len( ::FaArrayData )
	      RETURN ::FaArrayData[ nAt ][ nIndex ]
     ENDIF
   ENDIF

RETURN Nil
Si quieres evitar que de te el buffer de edición deberás usar directamente la matriz.

Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Jose Lopez
Mensajes: 123
Registrado: Mié Jun 16, 2010 2:33 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por Jose Lopez »

Ignacio,
En qué evento debería poner el pintado de la fila.
El color del panel de la fila depende del contenido de un campo.
Gracias por tu ayuda.
Pepe
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por XeviCOMAS »

Jose,

Para el pintado de la celda... OnDrawCell() de la columna

Código: Seleccionar todo

METHOD Browse1Column4DrawCell( oSender, cText, nClrText, nClrPane, lHighLite, hDC, aRect ) CLASS TFrmComptes
   If !lHighLite
      nClrText := If( ::oDSTable:INICIA1(dsFIELD) - ::oDSTable:INICIA2(dsFIELD) > 0, clBlue, clRed )
   EndIf
RETURN Nil
Tambien estoy cambiando el color en función del valor del campo de la DB
Por ejemplo, si es menor de 0, el txto en rojo, sinó, el texto en azul
Un Saludo,
Xevi.
Jose Lopez
Mensajes: 123
Registrado: Mié Jun 16, 2010 2:33 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por Jose Lopez »

Xevi,
En mi caso se produce el mismo comportamiento en OnDrawCell() que en OnGetData().
La primera vez que edito todo se pone en rojo. Ya que siempre devuelve :GetValue("SERVIR") el mismo valor y no el de la celda que esta pintando

#56: aArrayData[oSender:oParent:nArrayAt,5]= 1, GetValue("SERVIR")= 0
#57: aArrayData[oSender:oParent:nArrayAt,5]= 2, GetValue("SERVIR")= 0
#58: aArrayData[oSender:oParent:nArrayAt,5]= 3, GetValue("SERVIR")= 0
#59: aArrayData[oSender:oParent:nArrayAt,5]= 4, GetValue("SERVIR")= 0
Gracias.
Saludos.
Pepe.
Avatar de Usuario
XeviCOMAS
Mensajes: 585
Registrado: Sab Mar 12, 2011 8:16 pm

Re: oBrowse:Edit() lanza OnGetData()

Mensaje por XeviCOMAS »

Has probado de entrar en edición al iniciar el Form???
Y salir sin hacer nada...


En FormInitialize...

::oBrowse1:Edit()
::oBrowse1:aCols[n]:oGridEdit:PostMsg( WM_KEYDOWN, VK_ESCAPE )

Es una forma "bruta" pero a mi también me funciona.
Un Saludo,
Xevi.
Responder