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.

browses sql y autofiltros

Foro de Xailer profesional en español
Responder
Fredy
Mensajes: 199
Registrado: Mié Mar 29, 2006 1:28 am

browses sql y autofiltros

Mensaje por Fredy »

Hola,
Tengo un dbbrowse asociado a una consulta mysql. El browse tiene activas
las propiedades lfilterbar y lautoorder.
El problema me surge cuando actualizo la información del sqlquery ya que
al montar una nueva consulta con el cselect, aunque el browse esté ordenado
y con un filtro introducido en el lfilterbar estos no se reflejan en los
datos mostrados.
Cuango hago un refresh tampoco se actualizan estos datos.
¿Hay alguna manera de decirle "hazme un refresh de los datos mostrados en
el browse teniendo en cuenta el lautoorder y el lfilterbar?"
Un saludico,
Fredy
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9459
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

browses sql y autofiltros

Mensaje por ignacio »

Fredy,
Has probado simplemente con oDataset:Refresh()
Saludos,
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Fredy" <fredy@aglsl.com> escribió en el mensaje
news:[email=a20b86f38e558c9c42b507b3a1a@news.xailer.com...]a20b86f38e558c9c42b507b3a1a@news.xailer.com...[/email]
> Hola,
>
> Tengo un dbbrowse asociado a una consulta mysql. El browse tiene activas
> las propiedades lfilterbar y lautoorder.
>
> El problema me surge cuando actualizo la información del sqlquery ya que
> al montar una nueva consulta con el cselect, aunque el browse esté
> ordenado y con un filtro introducido en el lfilterbar estos no se reflejan
> en los datos mostrados.
>
> Cuango hago un refresh tampoco se actualizan estos datos.
>
> ¿Hay alguna manera de decirle "hazme un refresh de los datos mostrados en
> el browse teniendo en cuenta el lautoorder y el lfilterbar?"
>
> Un saludico,
> Fredy
>
>
>
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Fredy
Mensajes: 199
Registrado: Mié Mar 29, 2006 1:28 am

browses sql y autofiltros

Mensaje por Fredy »

Hola Ignacio,
La cosa es más o menos así­:
Imagina un combobox con los años (2007,2008,etc..).
Cada vez que hago un onChange en el Combo.
::oSqlQuery1:lOpen:= .f.
::oSqlQuery1:cSelect := "Select * from certificados Where anualidad=" +
Str( anualidad)
::oSqlQuery1:lOpen:= .f.
oDbBrowse1 tiene como oDataset a ::oSqlQuery1
He probado ::oDbBrowse1:oDataset:Refresh(), pero no me funciona.
Como ves, el contenido del Dataset ser puede el mismo que tení­amos o totalmente
diferente al anterior.
Esto nos deja dos opciones, borrar los autofiltros y autosort que habí­a antes
de la nueva consulta, o intentar reconstruirlos de acuerdo con los nuevos
datos. Personalmente veo más 'elegante' la segunda opción
"Casi" lo he logrado haciendo lo siguiente:
::oSqlQuery1:lOpen:= .f.
::oSqlQuery1:cSelect := "Select * from certificados Where anualidad=" +
Str( anualidad)
::oSqlQuery1:lOpen:= .f.
::oDbbrowse1:lFilterBar := .t.
FOR EACH oCol IN ::oDbBrowse1:aCols
If oCol:nSort <> 0
::oDbBrowse1:Sort( oCol )
Endif
NEXT
Algunas puntializaciones:
1.-
Cuando hago el ::oDbbrowse1:lFilterBar := .t. llama al método FilterMode
y me recalcula de nuevo los posibles filtros, pero "la altura" del header
del browse cambia de tamaño, por lo cual tengo que poner:
OldHeight =::oDbBrowse1:nHeaderHeight
::oDbBrowse1:lFilterBar = .t.
::oDbBrowse1:nHeaderHeight = OldHeight
2.-
El FOR EACH oCol IN ::oDbBrowse1:aCols me ha tenido un rato despistado,
ya que no funciona a no ser que oCol esté definida como variable local.
Lo comento más que nada por si hay algún otro despistado como yo que no se
habí­a dado cuenta :)
3.-
Para "reponer" el orden hago lo siguiente:
FOR EACH oCol IN ::oDbBrowse1:aCols
If oCol:nSort <> 0
::oDbbBowse1:Sort( oCol )
Endif
NEXT
Funciona, pero curiosamente, si estaba ordenado en ascendente me lo reordena
en descendente, y vicebersa.
En la clase XDBBrowse en el método Sort veo que pone
IF nSort <= 0
nSort := 1
ELSE
nSort := -1
cExp += " DESC"
ENDIF
Que no termino de enterder y creo que es por lo que ne cambia el order cada
vez que llamo al método
A ver si me puedes iluminar un poquico sobre esto último para poder dejarlo
'niquelao'
Un saludico,
Fredy
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9459
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

browses sql y autofiltros

Mensaje por ignacio »

Fredy,
El problema es que tu expresión de cSelect ha cambiado, y aunque tu sepas
que la estructura no ha cambiado la clase tiene que estar preparada para que
el cSelect pueda ser cualquier cosa. Cuando realizas una operación de Close
(lOpen a .F.) realmente ocurren un montón de cosas, pero posiblemente se nos
haya quedado en el tintero el resetear completamente los posibles filtros
existentes, y no te puedo asegurar que no lo hagamos en el futuro, aunque no
lo creo. Logicamente el método Refresh del Dataset sólo funciona en un
dataset abierto que no se ha cambiado su expresión cSelect.
La mejor opción en tu caso, sería intentar reconstruir los filtros y la
ordenación como así estás haciendo.
> Cuando hago el ::oDbbrowse1:lFilterBar := .t. llama al método FilterMode
> y me recalcula de nuevo los posibles filtros, pero "la altura" del header
> del browse cambia de tamaño, por lo cual tengo que poner:
Cuando estableces lFilterBar a .T. el tamaño del Header aumenta de tamaño
verticalmente y esto es completamente normal. De hecho siempre ha sido así.
> El FOR EACH oCol IN ::oDbBrowse1:aCols me ha tenido un rato despistado,
> ya que no funciona a no ser que oCol esté definida como variable local.
>
> Lo comento más que nada por si hay algún otro despistado como yo que no se
> había dado cuenta :)
>
Bienvenido sea el comentario ;-)
>
> Para "reponer" el orden hago lo siguiente:
>
>
> FOR EACH oCol IN ::oDbBrowse1:aCols
> If oCol:nSort <> 0
> ::oDbbBowse1:Sort( oCol )
> Endif
> NEXT
>
>
> Funciona, pero curiosamente, si estaba ordenado en ascendente me lo
> reordena en descendente, y vicebersa.
El método Sort establece la ordenación en base a COMO ESTABA ANTES ORDENADO,
si no había ordenación la hace ascendente (nSort pasa a valer 1), si ya
estaba ordenado de forma ascendente (nSort valía 1) cambia la ordenación a
descendente (pasa a valer -1), y si estaba con ordenación descendente (
nSort valía -1) entonces pasará a ascendente ( pasa a valer 1). Por lo
tanto, sólo tienes que hacer esto:
> FOR EACH oCol IN ::oDbBrowse1:aCols
> If oCol:nSort <> 0
>>> oCol:nSort := - oCol:nSort <<<<
> ::oDbbBowse1:Sort( oCol )
> Endif
> NEXT
Un saludo,
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder