Página 1 de 1

Filtro en ArrayBrowse

Publicado: Sab Oct 06, 2007 11:30 am
por Xevi
¿Cómo puedo aplicar un filtro a un ArrayBrowse sin utilizar lFilterBar???
Necesito, por ejemplo, visionar SOLO los registros que en la primera columna
empiezen por "A".
Algo como ... ::oArrayBrowse1:SetFilter( ::oArrayBrowse1:aCols[1] >= "A" )
Gracias.
Un Saludo,
Xevi.

Filtro en ArrayBrowse

Publicado: Sab Oct 06, 2007 4:20 pm
por Xavi[1]
Hola Xevi,
"xEvi" para que lo vea Inazio.
Es broma, espero que lo tomes a bien, Ignacio. :)
Xevi escribió:
> ¿Cómo puedo aplicar un filtro a un ArrayBrowse sin utilizar lFilterBar???
> Necesito, por ejemplo, visionar SOLO los registros que en la primera
> columna empiezen por "A".
> Algo como ... ::oArrayBrowse1:SetFilter( ::oArrayBrowse1:aCols[1] >= "A" )
>
Bueno, a ver, de paso servirá para probar la 99.71 del CVS o 99.80 Xailer.
Lo he comprobado con la nueva versión xharbour y lo que pasa si te olvidas de los dejes de C, nada cosas mí­as, tú procura
entender el código y si no preguntas.
Suponiendo que no dispongas ya de una copia de la Array de datos.-
CLASS TMyClass FROM TForm // Supongo
...
DATA aMyArrayData INIT {}
DATA aCopiaArrayData INIT {} // No los metas en la misma sentencia.
...
METHOD SetFilterON()
METHOD SetFilterOFF()
...
ENDCLASS
METHOD SetFilterON() CLASS TMyClass
::aCopiaArrayData := AClone(::oArrayBrowse1:aArrayData)
AEval(::oArrayBrowse1:aArrayData, {|m| iif(m[1] >= "A", AAdd(::aMyArrayData,m),nil)})
ASize(::oArrayBrowse1:aArrayData,0) // Dejes de C/C++ :)
::oArrayBrowse1:aArrayData := ::aMyArrayData
::oArrayBrowse1:Refill()
RETURN Nil
METHOD SetFilterOFF() CLASS TMyClass
::oArrayBrowse1:aArrayData := AClone(::aCopiaArrayData)
::oArrayBrowse1:Refill()
ASize(::aMyArrayData,0); ASize(::aCopiaArrayData,0) // Dejes de C/C++ :)
RETURN Nil
Un saludo
Xavi

Filtro en ArrayBrowse

Publicado: Dom Oct 07, 2007 12:52 am
por jose.luis
Xevi,
Casi saliéndome por los cerros de íšbeda te podrí­a decir que el array lo
metas en un memdataset y de ahí­ en un tdbBrowse. Ahí­ tienes métodos
especí­ficos para filtrar y esas cosas.
--
Saludos,
José Luis Capel
www.capelblog.com vuelve a estar online!!
"Xevi" <xevicomas@gmail.com> escribió en el mensaje de noticias
news:470755ac$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> ¿Cómo puedo aplicar un filtro a un ArrayBrowse sin utilizar lFilterBar???
> Necesito, por ejemplo, visionar SOLO los registros que en la primera
> columna empiezen por "A".
> Algo como ... ::oArrayBrowse1:SetFilter( ::oArrayBrowse1:aCols[1] >= "A" )
>
>
> Gracias.
>
> Un Saludo,
> Xevi.

Filtro en ArrayBrowse

Publicado: Lun Oct 08, 2007 11:58 am
por ignacio
Xevi,
No está documentado ningún SetFilter() en TArrayBrowse, ya que se trata de
un método Reservado. No obstante están todos los fuentes disponibles por si
quieres echarles un vistazo.
Te recomiendo que utilices TMemDataset y TDBBrowse o bien utilices te
construyas tu la matriz en cada caso utilizando aScan() sobre la matriz
original.
Saludos,
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"Xevi" <xevicomas@gmail.com> escribió en el mensaje
news:470755ac$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> ¿Cómo puedo aplicar un filtro a un ArrayBrowse sin utilizar lFilterBar???
> Necesito, por ejemplo, visionar SOLO los registros que en la primera
> columna empiezen por "A".
> Algo como ... ::oArrayBrowse1:SetFilter( ::oArrayBrowse1:aCols[1] >= "A" )
>
>
> Gracias.
>
> Un Saludo,
> Xevi.

Filtro en ArrayBrowse

Publicado: Lun Oct 08, 2007 12:01 pm
por Xevi
Gracias a todos por vuestras respuestas.
Tomaré nota de vuestros consejos.
La verdad es que no he utilizado los MemDataSets todaví­a, y creo que será
hora ya de meterme en alguno para aprender su uso.
Un Saludo,
Xevi.
"Xevi" <xevicomas@gmail.com> escribió en el mensaje de noticias
news:470755ac$[email=1@ozsrv2.ozlan.local...]1@ozsrv2.ozlan.local...[/email]
> ¿Cómo puedo aplicar un filtro a un ArrayBrowse sin utilizar lFilterBar???
> Necesito, por ejemplo, visionar SOLO los registros que en la primera
> columna empiezen por "A".
> Algo como ... ::oArrayBrowse1:SetFilter( ::oArrayBrowse1:aCols[1] >= "A" )
>
>
> Gracias.
>
> Un Saludo,
> Xevi.

Filtro en ArrayBrowse

Publicado: Lun Oct 08, 2007 5:15 pm
por Xavi[1]
Xevi escribió:
> Gracias a todos por vuestras respuestas.
> Tomaré nota de vuestros consejos.
> La verdad es que no he utilizado los MemDataSets todaví­a, y creo que
> será hora ya de meterme en alguno para aprender su uso.
>
> Un Saludo,
> Xevi.
>
Bueno, sniff, también podrí­a haberte programado esto.-
CLASS TArrayBrowse FROM XArrayBrowse
METHOD Filtra( bFiltro )
ENDCLASS
// bFiltro : Code Block de Filtrado
// Dependiente de SubArray de ArrayData
// Ejemplo : { |m| m[1] >= "A" }
// bFiltro == nil : Elimina Filtrado
METHOD Filtra( bFiltro ) CLASS TArrayBrowse
Local aM, aData := {}
static saArrayOrg
if( bFiltro == nil ) // Elimina Filtrado
::aArrayData := saArrayOrg
else // Aplica Filtro
for each aM in ::aArrayData
if( Eval( bFiltro, aM ) )
AAdd( aData, aM )
endif
next
saArrayOrg := ::aArrayData
::aArrayData := aData // xharbour ;)
endif
::Refresh( TRUE )
RETURN Nil
Te irá mucho mejor, pero debo advertirte que explota particularidades de XHarbour que pueden variar en el futuro.
Pruebalo, copia este código a tu aplicación y lo utilizas con.-
::oArrayBrowse1:Filtra( { |m| m[1] >= "A" } )
para activar el filtro y .-
::oArrayBrowse1:Filtra()
para desactivarlo y volver a los datos originales.
Un saludo
Xavi
PD: Dios bendiga Open Source, porque otra cosa...

Filtro en ArrayBrowse

Publicado: Lun Oct 08, 2007 7:03 pm
por ignacio
Xavi,
Ojo con esa estática que estás usando, ya que la compartiran todas las
instancias de TArrayBrowse.
Un saludo
--
Ignacio Ortiz de Zúñiga
http://www.xailer.com
"xAvi" <[email=x_@_com]x_@_com[/email]> escribió en el mensaje
news:470a499f$[email=2@ozsrv2.ozlan.local...]2@ozsrv2.ozlan.local...[/email]
> Xevi escribió:
>> Gracias a todos por vuestras respuestas.
>> Tomaré nota de vuestros consejos.
>> La verdad es que no he utilizado los MemDataSets todavía, y creo que será
>> hora ya de meterme en alguno para aprender su uso.
>>
>> Un Saludo,
>> Xevi.
>>
>
> Bueno, sniff, también podría haberte programado esto.-
>
> CLASS TArrayBrowse FROM XArrayBrowse
> METHOD Filtra( bFiltro )
> ENDCLASS
>
> // bFiltro : Code Block de Filtrado
> // Dependiente de SubArray de ArrayData
> // Ejemplo : { |m| m[1] >= "A" }
> // bFiltro == nil : Elimina Filtrado
> METHOD Filtra( bFiltro ) CLASS TArrayBrowse
> Local aM, aData := {}
> static saArrayOrg
>
> if( bFiltro == nil ) // Elimina Filtrado
> ::aArrayData := saArrayOrg
> else // Aplica Filtro
> for each aM in ::aArrayData
> if( Eval( bFiltro, aM ) )
> AAdd( aData, aM )
> endif
> next
> saArrayOrg := ::aArrayData
> ::aArrayData := aData // xharbour ;)
> endif
> ::Refresh( TRUE )
> RETURN Nil
>
>
> Te irá mucho mejor, pero debo advertirte que explota particularidades de
> XHarbour que pueden variar en el futuro.
> Pruebalo, copia este código a tu aplicación y lo utilizas con.-
>
> ::oArrayBrowse1:Filtra( { |m| m[1] >= "A" } )
>
> para activar el filtro y .-
>
> ::oArrayBrowse1:Filtra()
>
> para desactivarlo y volver a los datos originales.
>
> Un saludo
> Xavi
> PD: Dios bendiga Open Source, porque otra cosa...

Filtro en ArrayBrowse

Publicado: Lun Oct 08, 2007 9:18 pm
por Xavi[1]
Ignacio Ortiz de Zúñiga escribió:
> Xavi,
>
> Ojo con esa estática que estás usando, ya que la compartiran todas las
> instancias de TArrayBrowse.
>
> Un saludo
>
Pues también es verdad, gracias Ignacio.
Era para evitar declararsela como data: aArrayOrg. :)
Pues la cosa te queda así­ Xevi.-
CLASS TArrayBrowse FROM XArrayBrowse
DATA aOrgArray INIT {}
METHOD Filtra( bFiltro )
ENDCLASS
// bFiltro : Code Block de Filtrado
// Dependiente de SubArray de ArrayData
// Ejemplo : { |m| m[1] >= "A" }
// bFiltro == nil : Elimina Filtrado
METHOD Filtra( bFiltro ) CLASS TArrayBrowse
Local aM, aData := {}
if( bFiltro == nil ) // Elimina Filtrado
::aArrayData := ::aOrgArray
else // Aplica Filtro
for each aM in ::aArrayData
if( Eval( bFiltro, aM ) )
AAdd( aData, aM )
endif
next
::aOrgArray := ::aArrayData
::aArrayData := aData // xharbour ;)
endif
::Refresh( TRUE )
RETURN Nil
Un saludo
Xavi