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.

Pequeño agregado a BrwColumn por si a alguien le sirve o le paso lo que a nosotros.

Foro público de Xailer en español
Responder
Avatar de Usuario
Carlos Ortiz
Mensajes: 873
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Pequeño agregado a BrwColumn por si a alguien le sirve o le paso lo que a nosotros.

Mensaje por Carlos Ortiz »

METHOD HeaderClick( nPosX, nPosY ) CLASS XBrwColumn
LOCAL xRet
xRet := ::OnHeaderClick( NIL, nPosX, nPosY )
IF ( Valtype( xRet ) != "L" .OR. xRet ) .AND. ::oParent:lAutoOrder
::oParent:Sort( Self )
// Si llama un evento por cada cambio de fila llamamos al change para que se muestre
// correctamente la grillas del detalle
IF ::oParent:EventAssigned( "OnChange" )
::oParent:OnChange(.t.)
ENDIF
ENDIF
RETURN xRet
Nos pasó en alguna pantallas que tienen 2 browse cabecera y detalle y la del detalle quedaba desactualizada al presionar click sobre el header de su tabla principal.
Como comentario, a los browses no los armamos por el ide sino que están en las clases y se arman en ejecución.
Atte. Carlos Ortiz.
--
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5718
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Pequeño agregado a BrwColumn por si a alguien le sirve o le paso lo que a nosotros.

Mensaje por jfgimenez »

Carlos,
tan sólo un pequeño apunte:
IF ::oParent:EventAssigned( "OnChange" )
::oParent:OnChange(.t.)
ENDIF
No es necesario usar el método EventAssigned() para comprobar si un evento está asignado. Al revés, siempre es mucho mejor llamarlo directamente, sin comprobar si está asignado o no. Si no está asignado no se va a producir ningún error, tan sólo que el valor de retorno va a ser NIL. Es más, es incluso más rápido lanzar el evento si no está asignado, que comprobar si está asignado o no.
Por lo tanto, las 3 lí­neas anteriores las puedes dejar en una sóla:
::oParent:OnChange( .T. )
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
--
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
Avatar de Usuario
Carlos Ortiz
Mensajes: 873
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Pequeño agregado a BrwColumn por si a alguien le sirve o le paso lo que a nosotros.

Mensaje por Carlos Ortiz »

Perfecto José entendido.
Será agregado a las clases X o lo manejo en mis clases propias?
Gracias.
"Jose F. Gimenez" <jfgimenez@wanadoo.es> escribió en el mensaje news:4c5aaac3$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Carlos,
tan sólo un pequeño apunte:
IF ::oParent:EventAssigned( "OnChange" )
::oParent:OnChange(.t.)
ENDIF
No es necesario usar el método EventAssigned() para comprobar si un evento está asignado. Al revés, siempre es mucho mejor llamarlo directamente, sin comprobar si está asignado o no. Si no está asignado no se va a producir ningún error, tan sólo que el valor de retorno va a ser NIL. Es más, es incluso más rápido lanzar el evento si no está asignado, que comprobar si está asignado o no.
Por lo tanto, las 3 lí­neas anteriores las puedes dejar en una sóla:
::oParent:OnChange( .T. )
--
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info
--
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9459
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Pequeño agregado a BrwColumn por si a alguien le sirve o le paso lo que a nosotros.

Mensaje por ignacio »

Carlos,
Xailer siempre procura que el evento OnChange sólo se disparé automáticamente por operaciones realizadas por el propio usuario. Entiendo que lo más lógico serí­a incluir el oParent:OnChange en tu propio código de OnHeaderClick. A lo mejor no he conseguido entender el problema correctamente.
Un saludo,
"Carlos Ortiz" <cortizassist@hotmail.com> escribió en el mensaje de noticias:[email=4c5a0153@svctag-j7w3v3j....]4c5a0153@svctag-j7w3v3j....[/email]
METHOD HeaderClick( nPosX, nPosY ) CLASS XBrwColumn
LOCAL xRet
xRet := ::OnHeaderClick( NIL, nPosX, nPosY )
IF ( Valtype( xRet ) != "L" .OR. xRet ) .AND. ::oParent:lAutoOrder
::oParent:Sort( Self )
// Si llama un evento por cada cambio de fila llamamos al change para que se muestre
// correctamente la grillas del detalle
IF ::oParent:EventAssigned( "OnChange" )
::oParent:OnChange(.t.)
ENDIF
ENDIF
RETURN xRet
Nos pasó en alguna pantallas que tienen 2 browse cabecera y detalle y la del detalle quedaba desactualizada al presionar click sobre el header de su tabla principal.
Como comentario, a los browses no los armamos por el ide sino que están en las clases y se arman en ejecución.
Atte. Carlos Ortiz.
--
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9459
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Pequeño agregado a BrwColumn por si a alguien le sirve o le paso lo que a nosotros.

Mensaje por ignacio »

Carlos,
Xailer siempre procura que el evento OnChange sólo se disparé automáticamente por operaciones realizadas por el propio usuario. Entiendo que lo más lógico serí­a incluir el oParent:OnChange en tu propio código de OnHeaderClick. A lo mejor no he conseguido entender el problema correctamente.
Un saludo,
"Carlos Ortiz" <cortizassist@hotmail.com> escribió en el mensaje de noticias:[email=4c5a0153@svctag-j7w3v3j....]4c5a0153@svctag-j7w3v3j....[/email]
METHOD HeaderClick( nPosX, nPosY ) CLASS XBrwColumn
LOCAL xRet
xRet := ::OnHeaderClick( NIL, nPosX, nPosY )
IF ( Valtype( xRet ) != "L" .OR. xRet ) .AND. ::oParent:lAutoOrder
::oParent:Sort( Self )
// Si llama un evento por cada cambio de fila llamamos al change para que se muestre
// correctamente la grillas del detalle
IF ::oParent:EventAssigned( "OnChange" )
::oParent:OnChange(.t.)
ENDIF
ENDIF
RETURN xRet
Nos pasó en alguna pantallas que tienen 2 browse cabecera y detalle y la del detalle quedaba desactualizada al presionar click sobre el header de su tabla principal.
Como comentario, a los browses no los armamos por el ide sino que están en las clases y se arman en ejecución.
Atte. Carlos Ortiz.
--
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
Carlos Ortiz
Mensajes: 873
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Pequeño agregado a BrwColumn por si a alguien le sirve o le paso lo que a nosotros.

Mensaje por Carlos Ortiz »

Gracias Ignacio por entrarle al tema, lo que nos sucede es lo siguiente:
1 browse con la cabecera de ventas, debajo otro browse con el detalle de la
venta. En el evento onchange del browse de la cabecera se dispara la
actualización del browse de detalle.
El problema surgió cuando le habilité al browse de las cabeceras de ventas
la posibilidad de hacer click en todas las columnas y ordenar dichos datos.
Normalmente esta pantalla arranca con los datos ordenados por fecha de
emisión del comprobante pero el usuario puede ordenarlos por nombre del
cliente por ejemplo y es ahi cuando detecto que al presionar click sobre el
header no me llama al onchange para que se refresque el detalle de la venta.
(Si haces click sobre los header es como que despues del sort que llama el
evento onHeaderClick queda posicionado en otro registro) cuando usamos
filtros esto no pasa por que en el evento onFilterChange le digo que vuelva
a llamar al onChange pero en los clic por columnas no existe un
HeaderPosClick como por decir algo. (Espero haberme explicado mejor)
Saludos.
"Ignacio Ortiz de Zúñiga" <NoNameToAvoidSpam@xailer.com> escribió en el
mensaje news:[email=4c5fece8@svctag-j7w3v3j....]4c5fece8@svctag-j7w3v3j....[/email]
Carlos,
Xailer siempre procura que el evento OnChange sólo se disparé
automáticamente por operaciones realizadas por el propio usuario. Entiendo
que lo más lógico sería incluir el oParent:OnChange en tu propio código de
OnHeaderClick. A lo mejor no he conseguido entender el problema
correctamente.
Un saludo,
"Carlos Ortiz" <cortizassist@hotmail.com> escribió en el mensaje de
noticias:[email=4c5a0153@svctag-j7w3v3j....]4c5a0153@svctag-j7w3v3j....[/email]
METHOD HeaderClick( nPosX, nPosY ) CLASS XBrwColumn
LOCAL xRet
xRet := ::OnHeaderClick( NIL, nPosX, nPosY )
IF ( Valtype( xRet ) != "L" .OR. xRet ) .AND. ::oParent:lAutoOrder
::oParent:Sort( Self )
// Si llama un evento por cada cambio de fila llamamos al change para
que se muestre
// correctamente la grillas del detalle
IF ::oParent:EventAssigned( "OnChange" )
::oParent:OnChange(.t.)
ENDIF
ENDIF
RETURN xRet
Nos pasó en alguna pantallas que tienen 2 browse cabecera y detalle y la
del detalle quedaba desactualizada al presionar click sobre el header de su
tabla principal.
Como comentario, a los browses no los armamos por el ide sino que están en
las clases y se arman en ejecución.
Atte. Carlos Ortiz.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9459
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Pequeño agregado a BrwColumn por si a alguien le sirve o le paso lo que a nosotros.

Mensaje por ignacio »

Carlos,
Entiendo que cuando se cambia la ordenación la posición actual del registro
no debe de cambiar. No obstante, si tienes un evento para hacer lo que
deseas, se llama:
TBrwColumn:OnHeaderClick
Saludos
"Carlos Ortiz" <cortizassist@hotmail.com> escribió en el mensaje de
noticias:[email=4c608f84@svctag-j7w3v3j....]4c608f84@svctag-j7w3v3j....[/email]
> Gracias Ignacio por entrarle al tema, lo que nos sucede es lo siguiente:
>
> 1 browse con la cabecera de ventas, debajo otro browse con el detalle de
> la venta. En el evento onchange del browse de la cabecera se dispara la
> actualización del browse de detalle.
>
> El problema surgió cuando le habilité al browse de las cabeceras de ventas
> la posibilidad de hacer click en todas las columnas y ordenar dichos
> datos. Normalmente esta pantalla arranca con los datos ordenados por fecha
> de emisión del comprobante pero el usuario puede ordenarlos por nombre del
> cliente por ejemplo y es ahi cuando detecto que al presionar click sobre
> el header no me llama al onchange para que se refresque el detalle de la
> venta. (Si haces click sobre los header es como que despues del sort que
> llama el evento onHeaderClick queda posicionado en otro registro) cuando
> usamos filtros esto no pasa por que en el evento onFilterChange le digo
> que vuelva a llamar al onChange pero en los clic por columnas no existe un
> HeaderPosClick como por decir algo. (Espero haberme explicado mejor)
>
> Saludos.
>
>
>
> "Ignacio Ortiz de Zúñiga" <NoNameToAvoidSpam@xailer.com> escribió en el
> mensaje news:[email=4c5fece8@svctag-j7w3v3j....]4c5fece8@svctag-j7w3v3j....[/email]
> Carlos,
>
> Xailer siempre procura que el evento OnChange sólo se disparé
> automáticamente por operaciones realizadas por el propio usuario. Entiendo
> que lo más lógico serí­a incluir el oParent:OnChange en tu propio código de
> OnHeaderClick. A lo mejor no he conseguido entender el problema
> correctamente.
>
> Un saludo,
> "Carlos Ortiz" <cortizassist@hotmail.com> escribió en el mensaje de
> noticias:[email=4c5a0153@svctag-j7w3v3j....]4c5a0153@svctag-j7w3v3j....[/email]
> METHOD HeaderClick( nPosX, nPosY ) CLASS XBrwColumn
> LOCAL xRet
> xRet := ::OnHeaderClick( NIL, nPosX, nPosY )
> IF ( Valtype( xRet ) != "L" .OR. xRet ) .AND. ::oParent:lAutoOrder
> ::oParent:Sort( Self )
> // Si llama un evento por cada cambio de fila llamamos al change para
> que se muestre
> // correctamente la grillas del detalle
> IF ::oParent:EventAssigned( "OnChange" )
> ::oParent:OnChange(.t.)
> ENDIF
> ENDIF
>
> RETURN xRet
>
> Nos pasó en alguna pantallas que tienen 2 browse cabecera y detalle y la
> del detalle quedaba desactualizada al presionar click sobre el header de
> su tabla principal.
>
> Como comentario, a los browses no los armamos por el ide sino que están
> en las clases y se arman en ejecución.
> Atte. Carlos Ortiz.
>
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
Carlos Ortiz
Mensajes: 873
Registrado: Mié Jul 01, 2009 5:44 pm
Ubicación: Argentina - Córdoba
Contactar:

Pequeño agregado a BrwColumn por si a alguien le sirve o le paso lo que a nosotros.

Mensaje por Carlos Ortiz »

Lo toma al onchange al hacer click el tema es que despues del click altera
el
cursor por el ordenamiento que le corresponda y no ejecuta despues del sort
de
la clase brwcolumn el onchange, entonces me queda mal parado. Salvo que lo
esté
asigando mal mas abajo.
WITH OBJECT oCol := TDBBrwColumn():New( ::oDBBrowse )
IF cTipo = "N"
:nAlignment:= taRIGHT
ENDIF
:cHeader := cHeader
:oDataField := cField
:nWidth := nAncho
:cSortEval := alltrim(pad(cField,10))
:OnHeaderClick := {||::oDBBrowse:OnChange(.t.)}
Aclaro que a los browses no los creamos por el IDE sino con una clase
nuestra
que usa xBrowse de xailer pero le agrega las columnas y demas aspectos del
browse desde una definicion que está en una tabla, es como un generador de
browses. (Tomamos tu prg como punto de partida del datacontrols6
selfromtabla o
algo asi)
Muchas gracias. sigo investigando que puedo estar haciendo mal.
Responder