Problema con filtros

Problema con filtros

Postby José Luis Sánchez » Thu May 23, 2019 3:16 pm

Hola a todos:
Tengo un problema con los filtros de un DBF en un programa, creo un filtro de esta manera:

CO->( dbSetFilter( {|| Upper( CO->CoFila ) == Upper( cFila ) } ) )

y a continuación ? CO->(DbFilter()) me devuelve la cadena vacía.

Necesito controlar por programa cuando tengo un filtro sobre una tabla, porque hay situaciones que necesito quitar/restaurar el filtro, pero dbfilter() siempre me retorna la cadena vacía.
Lo curioso es que el filtro funciona bien, me hace el fitrado correctamente.

¿ Alguna idea de porqué me pasa esto ?

Saludos,
José Luis
User avatar
José Luis Sánchez
 
Posts: 556
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España

Re: Problema con filtros

Postby karinha » Thu May 23, 2019 3:30 pm

¿Por qué no usas indice temporal?

comando:

MEMORY / TEMPORARY

INDEX ON CLAVE TAG CLAVE MEMORY

Ó

INDEX ON CLAVE TAG CLAVE TEMPORARY

Saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7836
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Problema con filtros

Postby groiss » Fri May 24, 2019 5:38 am

José Luis, prueba añadiendo el literal del filtro, para que pueda devolverte la misma cadena al preguntar por el filtro activo
CO->( dbSetFilter( {|| Upper( CO->CoFila ) == Upper( cFila ) } , "Upper( CO->CoFila ) == Upper( cFila )" ) )


Un saludo
groiss
 
Posts: 225
Joined: Tue Sep 01, 2009 7:55 am
Location: Plasencia - ESPAÑA

Re: Problema con filtros

Postby José Luis Sánchez » Fri May 24, 2019 6:14 am

Muchas gracias, eso es lo que buscaba. El caso es que leí la documentación de dbsetfilter y no me di cuenta del segundo parámetro.

Saludos,
User avatar
José Luis Sánchez
 
Posts: 556
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España

Re: Problema con filtros

Postby José Luis Sánchez » Fri May 24, 2019 2:33 pm

Ahora estoy con el tema de guardar/restaurar un filtro sobre una tabla. La manera en que lo estoy haciendo es llamar a una función que me devuelva el codeblock del filtro y guardar en el 2º campo del dbsetfilter una cadena que me permita luego volver a generar el filtro. Algo así:

Code: Select all  Expand view  RUN
cFilter :="bCoFilter2;"+cFila
CO->( dbSetFilter( bCoFilter2(cFila), cFilter ))
...
FUNCTION bCoFilter2(cFila)
   Return {|| Upper( CO->CoFila ) == Upper( cFila ) }


¿ Hay alguna manera más fácil de hacerlo ? El caso es que tengo una opción en que se puede establecer 12 filtros distintos sobre un mantenimiento, y luego tengo que analizar la cadena que guarda el filtro para poder llamar a cada función que devuelve su codeblock, y me parece algo enrevesado.

Saludos,
José Luis
User avatar
José Luis Sánchez
 
Posts: 556
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España

Re: Problema con filtros

Postby Joaquim Ferrer » Fri May 24, 2019 5:08 pm

José Luís

Puedes definir una macro de este estilo :
Code: Select all  Expand view  RUN

#define CTOBLOCK(e)  &("{||"+e+"}")
 


Mantienes en una tabla la expresión del filtro en un string y ya cuando lo creas lo tienes facil

Code: Select all  Expand view  RUN

cFilter := 'Upper( CO->CoFila ) == Upper( cFila )'
dbSetFilter( CTOBLOCK(cFilter), cFilter )
 


Creo recordar que dbsetfilter funciona sobre el area activa (tienes que hacer antes un select() , por lo que el alias delante creo no funcionará

Saludos
Fivewinner desde 1.9, programador PHP y Javascript, PWA & HTML5 evangelista
User avatar
Joaquim Ferrer
 
Posts: 105
Joined: Sat Jan 14, 2012 3:46 pm
Location: Barcelona

Re: Problema con filtros

Postby José Luis Sánchez » Fri May 24, 2019 5:57 pm

Muchas gracias Quim !!!
User avatar
José Luis Sánchez
 
Posts: 556
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España

Re: Problema con filtros

Postby nageswaragunupudi » Sat May 25, 2019 4:11 pm

Macro compilation fails when the expression uses local variables.

Test:
Code: Select all  Expand view  RUN
#include "fivewin.ch"

REQUEST DBFCDX

#define CTOBLOCK( e )  &( "{||" + e + "}" )

function Main()

   local cValue   := "NY"
   local cFilter  := "UPPER( FIELD->CODE ) == UPPER( cValue )"

   USE STATES NEW VIA "DBFCDX"

   STATES->( DBSETFILTER( CTOBLOCK( cFilter ), cFilter ) )
   STATES->( DBGOTOP() )

return nil
 


Runtime Error
Code: Select all  Expand view  RUN
  Error description: Error BASE/1003  Variable does not exist: CVALUE

Stack Calls
===========
   Called from: F.prg => (b)MAIN( 14 )
   Called from:  => DBGOTOP( 0 )
   Called from: F.prg => MAIN( 15 )
 


So, the variables has to declared as Private.
Even then saving as
Code: Select all  Expand view  RUN

cFilter := (cAlias)->( DBFILTER() )
 

and later re-applying the filter in a different context with
Code: Select all  Expand view  RUN

(cAlias)->( DBSETFILTER( CTOBLOCK( cFilter ), cFilter ) )
 

fails if the variable used is out of scope.
Regards

G. N. Rao.
Hyderabad, India
User avatar
nageswaragunupudi
 
Posts: 10656
Joined: Sun Nov 19, 2006 5:22 am
Location: India

Re: Problema con filtros

Postby xmanuel » Sat May 25, 2019 7:15 pm

José Luis.
Si tienes un indice por el campo CO->CoFila es más efectivo los scopes.
Todas las RDD lo tienen, incluso los NTX!!!
______________________________________________________________________________
Sevilla - Andalucía
xmanuel
 
Posts: 762
Joined: Sun Jun 15, 2008 7:47 pm
Location: Sevilla


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: Google [Bot], karinha and 60 guests