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.

TDbfDataSet:ClearFilter() con filtro vac

Foro público de Xailer en español
Responder
Jaime Irurzun
Mensajes: 67
Registrado: Mar Nov 02, 2004 6:23 pm

TDbfDataSet:ClearFilter() con filtro vac

Mensaje por Jaime Irurzun »

Hola,
Voy a intentar ser claro porque pasar este posible fallo de Xailer a un ejemplo
fuera de mi programa no sería facil:
Tengo un TDBBrowse normal. Fuera de éste tengo un TEdit que permite realizar
un filtro de la DBF que maneja el browse. El SetFilter() se ejecuta en el
OnExit del TEdit que permite introducir el valor, de forma que al pulsar
[TAB] estando en el TEdit, el TDBBrowse se actualiza mostrando únicamente
los registros que cumplen la condición. Aquí pueden darse 2 casos:
a) El filtrado da como resultado uno o más registros. Aquí todo funciona
perfecto.
b) El filtrado da como resultado 0 registros. Aquí está el problema.
El filtro se hace perfectamente en ambos casos. El problema está a la hora
de DESHACER el filtro en el caso b). Resulta que si el resultado de un filtrado
ha sido 0 registros, cuando hago el TDbfDataSet:ClearFilter() y su posterior
TDbfDataSet:GoTop(), el TDBBrowse sigue mostrándose vacío, en lugar de llenarse
con TODOS los registros de la DBF, que es lo que hace siempre que deshago
un filtro en el caso a).
Pienso que el problema puede ser de Xailer. O bien no deshace bien el filtro
en el TDbfDataSet o bien no lo refleja bien en el TDBBrowse (repito: sólo
cuando paso de un filtro con 0 registros a deshacerlo).
Espero haberlo explicado bien. Si os queda cualquier duda no dudéis en preguntarme.
Muchas gracias.
Un saludo,
Jaime Irurzun.
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9250
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

TDbfDataSet:ClearFilter() con filtro vac

Mensaje por ignacio »

Jaime,
Como te puedes imaginar la funcionalidad ofrecida por la propiedad
lFilterBar esta hecha con la instrucción SetFilter() básicamente, y
compruebo que no tiene el problema que indicas, es decir, hago un filtro
para forzar que no haya ningún registro, a continuación hago un filtro que
sólo me muestre algunos registros, y funciona perfectamente.
En cualquier caso lo que si es súper importante es llamar a Refresh() con un
parametro .T. ya que de esta forma se recalculan ciertos valores como son el
número total de registros existentes (OrdKeyCount), y la posición ordinal en
base a la actual ordendación del registro actual (OrdKeyNo). Xailer intenta
realizar el mínimo de llamadas a dichas funciones ya que pueden penalizar
bastante la velocidad del Browse.
Si no se resuelve tu problema con un oBrowse:Refresh( .t. ) mandanos un
pequeño ejemplo. Gracias de antemano.
Un saludo,
"Jaime Irurzun" <jaime.irurzun@gmail.com> escribió en el mensaje
news:43a58dfb$[email=1@ozsrvnegro.ozlan.local...]1@ozsrvnegro.ozlan.local...[/email]
>
> Hola,
>
> Voy a intentar ser claro porque pasar este posible fallo de Xailer a un
> ejemplo
> fuera de mi programa no sería facil:
>
> Tengo un TDBBrowse normal. Fuera de éste tengo un TEdit que permite
> realizar
> un filtro de la DBF que maneja el browse. El SetFilter() se ejecuta en el
> OnExit del TEdit que permite introducir el valor, de forma que al pulsar
> [TAB] estando en el TEdit, el TDBBrowse se actualiza mostrando únicamente
> los registros que cumplen la condición. Aquí pueden darse 2 casos:
>
> a) El filtrado da como resultado uno o más registros. Aquí todo funciona
> perfecto.
>
> b) El filtrado da como resultado 0 registros. Aquí está el problema.
>
> El filtro se hace perfectamente en ambos casos. El problema está a la hora
> de DESHACER el filtro en el caso b). Resulta que si el resultado de un
> filtrado
> ha sido 0 registros, cuando hago el TDbfDataSet:ClearFilter() y su
> posterior
> TDbfDataSet:GoTop(), el TDBBrowse sigue mostrándose vacío, en lugar de
> llenarse
> con TODOS los registros de la DBF, que es lo que hace siempre que deshago
> un filtro en el caso a).
>
> Pienso que el problema puede ser de Xailer. O bien no deshace bien el
> filtro
> en el TDbfDataSet o bien no lo refleja bien en el TDBBrowse (repito: sólo
> cuando paso de un filtro con 0 registros a deshacerlo).
>
> Espero haberlo explicado bien. Si os queda cualquier duda no dudéis en
> preguntarme.
> Muchas gracias.
>
> Un saludo,
> Jaime Irurzun.
>
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Jaime Irurzun
Mensajes: 67
Registrado: Mar Nov 02, 2004 6:23 pm

TDbfDataSet:ClearFilter() con filtro vac

Mensaje por Jaime Irurzun »

Ignacio,
Efectivamente, se ha solucionado añadiendo un oDBBrowse:Refresh(.t.) después
del oDbf:ClearFilter().
Ahora funciona bien. Sin embargo, (y aunque Xailer trate de realizar las
llamadas que explicas lo mínimo posible), ¿no sería bueno que tras el TDbfDataSet:ClearFilter()
se hiciera automáticamente este TDBBrowse:Refresh(.t.)? Lo digo porque como
usuario me veo obligado a hacerlo pero la única razón que tengo para hacerlo
es que Xailer no se encarga de ello automáticamente (quiero decir que la
lógica del programa desde el punto de vista del usuario-programador no me
dice que ahí tenga que ir un Refresh() hecho por mí). Sé que pedir esto a
FW es imposible, puesto que los programas que utilizan FW están repletos
de Refresh() y SysRefresh() puestos "para que funcione". Pero si algo me
gusta de Xailer es que no te obliga a poner este tipo de "parches", sino
que él se encarga de pintar y actualizar las cosas cuando deben pintarse
y actualizarse. Sería estupendo que Xailer pusiera este TDBBrowse:Refresh(.t.)...
¿ves posible implementarlo? Gracias por la ayuda.
Un saludo,
Jaime Irurzun.
"Ignacio Ortiz de Zúñiga" <InvalidAccount@ozs.com> wrote:
>Jaime,
>
>Como te puedes imaginar la funcionalidad ofrecida por la propiedad
>lFilterBar esta hecha con la instrucción SetFilter() básicamente, y
>compruebo que no tiene el problema que indicas, es decir, hago un filtro
>para forzar que no haya ningún registro, a continuación hago un filtro que
>sólo me muestre algunos registros, y funciona perfectamente.
>
>En cualquier caso lo que si es súper importante es llamar a Refresh() con
un
>parametro .T. ya que de esta forma se recalculan ciertos valores como son
el
>número total de registros existentes (OrdKeyCount), y la posición ordinal
en
>base a la actual ordendación del registro actual (OrdKeyNo). Xailer intenta
>realizar el mínimo de llamadas a dichas funciones ya que pueden penalizar
>bastante la velocidad del Browse.
>
>Si no se resuelve tu problema con un oBrowse:Refresh( .t. ) mandanos un
>pequeño ejemplo. Gracias de antemano.
>
>Un saludo,
>
>"Jaime Irurzun" <jaime.irurzun@gmail.com> escribió en el mensaje
>news:43a58dfb$[email=1@ozsrvnegro.ozlan.local...]1@ozsrvnegro.ozlan.local...[/email]
>>
>> Hola,
>>
>> Voy a intentar ser claro porque pasar este posible fallo de Xailer a un
>> ejemplo
>> fuera de mi programa no sería facil:
>>
>> Tengo un TDBBrowse normal. Fuera de éste tengo un TEdit que permite
>> realizar
>> un filtro de la DBF que maneja el browse. El SetFilter() se ejecuta en
el
>> OnExit del TEdit que permite introducir el valor, de forma que al pulsar
>> [TAB] estando en el TEdit, el TDBBrowse se actualiza mostrando únicamente
>> los registros que cumplen la condición. Aquí pueden darse 2 casos:
>>
>> a) El filtrado da como resultado uno o más registros. Aquí todo funciona
>> perfecto.
>>
>> b) El filtrado da como resultado 0 registros. Aquí está el problema.
>>
>> El filtro se hace perfectamente en ambos casos. El problema está a la
hora
>> de DESHACER el filtro en el caso b). Resulta que si el resultado de un
>> filtrado
>> ha sido 0 registros, cuando hago el TDbfDataSet:ClearFilter() y su
>> posterior
>> TDbfDataSet:GoTop(), el TDBBrowse sigue mostrándose vacío, en lugar de
>> llenarse
>> con TODOS los registros de la DBF, que es lo que hace siempre que deshago
>> un filtro en el caso a).
>>
>> Pienso que el problema puede ser de Xailer. O bien no deshace bien el
>> filtro
>> en el TDbfDataSet o bien no lo refleja bien en el TDBBrowse (repito: sólo
>> cuando paso de un filtro con 0 registros a deshacerlo).
>>
>> Espero haberlo explicado bien. Si os queda cualquier duda no dudéis en
>> preguntarme.
>> Muchas gracias.
>>
>> Un saludo,
>> Jaime Irurzun.
>>
>
>
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9250
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

TDbfDataSet:ClearFilter() con filtro vac

Mensaje por ignacio »

Jaime,
El único problema que veo, que tampoco es tal, es que se realice más de una
operación que afecte a la visualización del Browse, por ejemplo, imagina que
un programador escribiera lo siguiente:
oDbf:ClearFilter() // realiza un refresh
oDbf:SetFilter( ... ) // realiza otro refresh
oBrw:Refresh() // realiza un refresh manual porque no es consciente que no
hay que hacerlo
Tampoco sería un gran problema pues lógicamente las tres operaciones de
refresco provocarían un sólo repintado al estar tan seguidas.
O sea, que tienes razón, ahora mismo lo incorporo a los siguientes métodos
de TDbfDataSet:
- SetFilter
- ClearFilter
- OrdSetFocus
- SetScope
- ClearScope
- Pack
- Zap
- Reindex
Todos estos métodos tendrán un parametro 'lUpd' adicional para indicar si se
hace el Refresh() que por defecto valdrá lo mismo que su propiedad
lUpdLinked.
Un saludo,
"Jaime Irurzun" <jaime.irurzun@gmail.com> escribió en el mensaje
news:43a72ad2$[email=1@ozsrvnegro.ozlan.local...]1@ozsrvnegro.ozlan.local...[/email]
>
> Ignacio,
>
> Efectivamente, se ha solucionado añadiendo un oDBBrowse:Refresh(.t.)
> después
> del oDbf:ClearFilter().
>
> Ahora funciona bien. Sin embargo, (y aunque Xailer trate de realizar las
> llamadas que explicas lo mínimo posible), ¿no sería bueno que tras el
> TDbfDataSet:ClearFilter()
> se hiciera automáticamente este TDBBrowse:Refresh(.t.)? Lo digo porque
> como
> usuario me veo obligado a hacerlo pero la única razón que tengo para
> hacerlo
> es que Xailer no se encarga de ello automáticamente (quiero decir que la
> lógica del programa desde el punto de vista del usuario-programador no me
> dice que ahí tenga que ir un Refresh() hecho por mí). Sé que pedir esto a
> FW es imposible, puesto que los programas que utilizan FW están repletos
> de Refresh() y SysRefresh() puestos "para que funcione". Pero si algo me
> gusta de Xailer es que no te obliga a poner este tipo de "parches", sino
> que él se encarga de pintar y actualizar las cosas cuando deben pintarse
> y actualizarse. Sería estupendo que Xailer pusiera este
> TDBBrowse:Refresh(.t.)...
> ¿ves posible implementarlo? Gracias por la ayuda.
>
> Un saludo,
> Jaime Irurzun.
>
>
>
>
> "Ignacio Ortiz de Zúñiga" <InvalidAccount@ozs.com> wrote:
>>Jaime,
>>
>>Como te puedes imaginar la funcionalidad ofrecida por la propiedad
>>lFilterBar esta hecha con la instrucción SetFilter() básicamente, y
>>compruebo que no tiene el problema que indicas, es decir, hago un filtro
>
>>para forzar que no haya ningún registro, a continuación hago un filtro que
>
>>sólo me muestre algunos registros, y funciona perfectamente.
>>
>>En cualquier caso lo que si es súper importante es llamar a Refresh() con
> un
>>parametro .T. ya que de esta forma se recalculan ciertos valores como son
> el
>>número total de registros existentes (OrdKeyCount), y la posición ordinal
> en
>>base a la actual ordendación del registro actual (OrdKeyNo). Xailer
>>intenta
>
>>realizar el mínimo de llamadas a dichas funciones ya que pueden penalizar
>
>>bastante la velocidad del Browse.
>>
>>Si no se resuelve tu problema con un oBrowse:Refresh( .t. ) mandanos un
>
>>pequeño ejemplo. Gracias de antemano.
>>
>>Un saludo,
>>
>>"Jaime Irurzun" <jaime.irurzun@gmail.com> escribió en el mensaje
>>news:43a58dfb$[email=1@ozsrvnegro.ozlan.local...]1@ozsrvnegro.ozlan.local...[/email]
>>>
>>> Hola,
>>>
>>> Voy a intentar ser claro porque pasar este posible fallo de Xailer a un
>
>>> ejemplo
>>> fuera de mi programa no sería facil:
>>>
>>> Tengo un TDBBrowse normal. Fuera de éste tengo un TEdit que permite
>>> realizar
>>> un filtro de la DBF que maneja el browse. El SetFilter() se ejecuta en
> el
>>> OnExit del TEdit que permite introducir el valor, de forma que al pulsar
>>> [TAB] estando en el TEdit, el TDBBrowse se actualiza mostrando
>>> únicamente
>>> los registros que cumplen la condición. Aquí pueden darse 2 casos:
>>>
>>> a) El filtrado da como resultado uno o más registros. Aquí todo funciona
>>> perfecto.
>>>
>>> b) El filtrado da como resultado 0 registros. Aquí está el problema.
>>>
>>> El filtro se hace perfectamente en ambos casos. El problema está a la
> hora
>>> de DESHACER el filtro en el caso b). Resulta que si el resultado de un
>
>>> filtrado
>>> ha sido 0 registros, cuando hago el TDbfDataSet:ClearFilter() y su
>>> posterior
>>> TDbfDataSet:GoTop(), el TDBBrowse sigue mostrándose vacío, en lugar de
>
>>> llenarse
>>> con TODOS los registros de la DBF, que es lo que hace siempre que
>>> deshago
>>> un filtro en el caso a).
>>>
>>> Pienso que el problema puede ser de Xailer. O bien no deshace bien el
>
>>> filtro
>>> en el TDbfDataSet o bien no lo refleja bien en el TDBBrowse (repito:
>>> sólo
>>> cuando paso de un filtro con 0 registros a deshacerlo).
>>>
>>> Espero haberlo explicado bien. Si os queda cualquier duda no dudéis en
>
>>> preguntarme.
>>> Muchas gracias.
>>>
>>> Un saludo,
>>> Jaime Irurzun.
>>>
>>
>>
>
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Jaime Irurzun
Mensajes: 67
Registrado: Mar Nov 02, 2004 6:23 pm

TDbfDataSet:ClearFilter() con filtro vac

Mensaje por Jaime Irurzun »

Estupendo, Ignacio, muchas gracias.
Un saludo,
Jaime Irurzun.
"Ignacio Ortiz de Zúñiga" <InvalidAccount@ozs.com> wrote:
>Jaime,
>
>El único problema que veo, que tampoco es tal, es que se realice más de
una
>operación que afecte a la visualización del Browse, por ejemplo, imagina
que
>un programador escribiera lo siguiente:
>
>oDbf:ClearFilter() // realiza un refresh
>oDbf:SetFilter( ... ) // realiza otro refresh
>oBrw:Refresh() // realiza un refresh manual porque no es consciente que
no
>hay que hacerlo
>
>Tampoco sería un gran problema pues lógicamente las tres operaciones de
>refresco provocarían un sólo repintado al estar tan seguidas.
>
>O sea, que tienes razón, ahora mismo lo incorporo a los siguientes métodos
>de TDbfDataSet:
>
>- SetFilter
>- ClearFilter
>- OrdSetFocus
>- SetScope
>- ClearScope
>- Pack
>- Zap
>- Reindex
>
>Todos estos métodos tendrán un parametro 'lUpd' adicional para indicar si
se
>hace el Refresh() que por defecto valdrá lo mismo que su propiedad
>lUpdLinked.
>
>Un saludo,
>
>"Jaime Irurzun" <jaime.irurzun@gmail.com> escribió en el mensaje
>news:43a72ad2$[email=1@ozsrvnegro.ozlan.local...]1@ozsrvnegro.ozlan.local...[/email]
>>
>> Ignacio,
>>
>> Efectivamente, se ha solucionado añadiendo un oDBBrowse:Refresh(.t.)
>> después
>> del oDbf:ClearFilter().
>>
>> Ahora funciona bien. Sin embargo, (y aunque Xailer trate de realizar las
>> llamadas que explicas lo mínimo posible), ¿no sería bueno que tras el
>> TDbfDataSet:ClearFilter()
>> se hiciera automáticamente este TDBBrowse:Refresh(.t.)? Lo digo porque
>> como
>> usuario me veo obligado a hacerlo pero la única razón que tengo para
>> hacerlo
>> es que Xailer no se encarga de ello automáticamente (quiero decir que
la
>> lógica del programa desde el punto de vista del usuario-programador no
me
>> dice que ahí tenga que ir un Refresh() hecho por mí). Sé que pedir esto
a
>> FW es imposible, puesto que los programas que utilizan FW están repletos
>> de Refresh() y SysRefresh() puestos "para que funcione". Pero si algo
me
>> gusta de Xailer es que no te obliga a poner este tipo de "parches", sino
>> que él se encarga de pintar y actualizar las cosas cuando deben pintarse
>> y actualizarse. Sería estupendo que Xailer pusiera este
>> TDBBrowse:Refresh(.t.)...
>> ¿ves posible implementarlo? Gracias por la ayuda.
>>
>> Un saludo,
>> Jaime Irurzun.
>>
>>
>>
>>
>> "Ignacio Ortiz de Zúñiga" <InvalidAccount@ozs.com> wrote:
>>>Jaime,
>>>
>>>Como te puedes imaginar la funcionalidad ofrecida por la propiedad
>>>lFilterBar esta hecha con la instrucción SetFilter() básicamente, y
>>>compruebo que no tiene el problema que indicas, es decir, hago un filtro
>>
>>>para forzar que no haya ningún registro, a continuación hago un filtro
que
>>
>>>sólo me muestre algunos registros, y funciona perfectamente.
>>>
>>>En cualquier caso lo que si es súper importante es llamar a Refresh()
con
>> un
>>>parametro .T. ya que de esta forma se recalculan ciertos valores como
son
>> el
>>>número total de registros existentes (OrdKeyCount), y la posición ordinal
>> en
>>>base a la actual ordendación del registro actual (OrdKeyNo). Xailer
>>>intenta
>>
>>>realizar el mínimo de llamadas a dichas funciones ya que pueden penalizar
>>
>>>bastante la velocidad del Browse.
>>>
>>>Si no se resuelve tu problema con un oBrowse:Refresh( .t. ) mandanos un
>>
>>>pequeño ejemplo. Gracias de antemano.
>>>
>>>Un saludo,
>>>
>>>"Jaime Irurzun" <jaime.irurzun@gmail.com> escribió en el mensaje
>>>news:43a58dfb$[email=1@ozsrvnegro.ozlan.local...]1@ozsrvnegro.ozlan.local...[/email]
>>>>
>>>> Hola,
>>>>
>>>> Voy a intentar ser claro porque pasar este posible fallo de Xailer a
un
>>
>>>> ejemplo
>>>> fuera de mi programa no sería facil:
>>>>
>>>> Tengo un TDBBrowse normal. Fuera de éste tengo un TEdit que permite
>>>> realizar
>>>> un filtro de la DBF que maneja el browse. El SetFilter() se ejecuta
en
>> el
>>>> OnExit del TEdit que permite introducir el valor, de forma que al pulsar
>>>> [TAB] estando en el TEdit, el TDBBrowse se actualiza mostrando
>>>> únicamente
>>>> los registros que cumplen la condición. Aquí pueden darse 2 casos:
>>>>
>>>> a) El filtrado da como resultado uno o más registros. Aquí todo funciona
>>>> perfecto.
>>>>
>>>> b) El filtrado da como resultado 0 registros. Aquí está el problema.
>>>>
>>>> El filtro se hace perfectamente en ambos casos. El problema está a la
>> hora
>>>> de DESHACER el filtro en el caso b). Resulta que si el resultado de
un
>>
>>>> filtrado
>>>> ha sido 0 registros, cuando hago el TDbfDataSet:ClearFilter() y su
>>>> posterior
>>>> TDbfDataSet:GoTop(), el TDBBrowse sigue mostrándose vacío, en lugar
de
>>
>>>> llenarse
>>>> con TODOS los registros de la DBF, que es lo que hace siempre que
>>>> deshago
>>>> un filtro en el caso a).
>>>>
>>>> Pienso que el problema puede ser de Xailer. O bien no deshace bien el
>>
>>>> filtro
>>>> en el TDbfDataSet o bien no lo refleja bien en el TDBBrowse (repito:
>>>> sólo
>>>> cuando paso de un filtro con 0 registros a deshacerlo).
>>>>
>>>> Espero haberlo explicado bien. Si os queda cualquier duda no dudéis
en
>>
>>>> preguntarme.
>>>> Muchas gracias.
>>>>
>>>> Un saludo,
>>>> Jaime Irurzun.
>>>>
>>>
>>>
>>
>
>
Responder