Página 1 de 1

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

Publicado: Jue Ago 05, 2010 2:10 am
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.
--

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

Publicado: Jue Ago 05, 2010 2:12 pm
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
--

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

Publicado: Vie Ago 06, 2010 6:31 am
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
--

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

Publicado: Lun Ago 09, 2010 1:53 pm
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.
--

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

Publicado: Lun Ago 09, 2010 1:53 pm
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.
--

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

Publicado: Mar Ago 10, 2010 1:30 am
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.

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

Publicado: Mar Ago 10, 2010 7:25 pm
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.
>

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

Publicado: Mar Ago 10, 2010 8:15 pm
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.