Set Filter To Between 'fecha' and 'Otra fecha'

3,558 views
Skip to first unread message

Ariel

unread,
Dec 10, 2012, 1:44:29 PM12/10/12
to publice...@googlegroups.com
como se puede hacer un set filter to entre dos fechas? lo intente de mil formas y me da error.

Ariel D'Alfeo
Córdoba, Argentina

Douglas Sánchez

unread,
Dec 10, 2012, 1:46:41 PM12/10/12
to publice...@googlegroups.com
Set filter to (fecha >= vfecha1 and fecha <= vfecha2)

o

Select * from tutabla where (fecha >= vfecha1 and fecha <= vfecha2) order by tucampo into cursor tmpresul readwrite.

Saludes


--
 
 



--
Ing. Douglas Sánchez Guillén
      Consultor Informatico
Claro: 505 88495476

Víctor Hugo Espínola Domínguez

unread,
Dec 10, 2012, 1:48:25 PM12/10/12
to publicesvfoxpro
Hola Ariel

SET FILTER TO BETWEEN(TuCampoFecha, ldFechaInicial, ldFechaFinal)

Saludos.
Víctor.




--
 
 

Edgar Acevedo

unread,
Dec 10, 2012, 1:58:10 PM12/10/12
to publice...@googlegroups.com
Bajo la mayoría de las circunstancias (no todas, repito: la mayoría) el SET FILTER puede ser muy lento.  Mejor utiliza un índice y luego un SET KEY TO RANGE.

Crea un índice en base al campo fecha que deseas filtrar:
INDEX TAG FECNAC ON FECNAC

Luego en lugar de usar filter, utiliza un SET KEY
SET ORDER TO FECNAC
SET KEY TO RANGE m.DesdeFec, M.HastaFec

Donde M.DesdeFec y M.HastaFec son las variables de memoria que contienen el lapso de fechas que deseas "filtrar".
Cuando deje de servirte el filtro, no olvides "desactivar" el comando así:
SET FILTER TO


El 10 de diciembre de 2012 12:44, Ariel <ariel...@gmail.com> escribió:

--
 
 

Ariel D'Alfeo

unread,
Dec 10, 2012, 2:01:06 PM12/10/12
to publice...@googlegroups.com
Muchas gracias! voy a probar las opciones
-- 
Ariel D'Alfeo
Córdoba, Argentina
--
 
 



  

Ariel D'Alfeo

unread,
Dec 10, 2012, 2:02:06 PM12/10/12
to publice...@googlegroups.com
Muchas gracias victor! anda fantastico
-- 
Ariel D'Alfeo
Córdoba, Argentina
--
 
 


-- 
Ariel D'Alfeo
Córdoba, Argentina

Ariel D'Alfeo

unread,
Dec 10, 2012, 2:04:10 PM12/10/12
to publice...@googlegroups.com
lo voy a probar, en realidad trabajo sobre un cursor, ¿funciona igual? ya que se que es un poco complicado Indexar un cursor
--
 
 


-- 
Ariel D'Alfeo
Córdoba, Argentina

Irwin Rodriguez

unread,
Dec 10, 2012, 2:10:28 PM12/10/12
to publice...@googlegroups.com

Saludos Ariel, probaste con SET FILTER TO (FECHA1 >= FECHA2 AND FECHA1 <= FECHA2) espero te sirva!

--
 
 

Jairo Miranda

unread,
Dec 10, 2012, 2:39:18 PM12/10/12
to publice...@googlegroups.com

Between funciona con datos tipo carácter, probaste llevando los datos de fecha a carácter con ctod(), o dtoc()

 

JM

--
 
 

Fox Learner

unread,
Dec 10, 2012, 3:16:39 PM12/10/12
to publice...@googlegroups.com
Yo he usado el mismo formato que puso Victor,

SET FILTER TO BETWEEN(TuCampoFecha, ldFechaInicial, ldFechaFinal)

Pero aquí te van a recomendar que no uses SET FILTER porque se te puede olvidar poner:

SET FILTER TO, para desactivar el filtro, despues que realizas tus operaciones necesarias.

O

Tener un performance lento si manejas muchisimos registros.

Saludos!

Carlos Alfaro

unread,
Dec 10, 2012, 3:47:37 PM12/10/12
to publice...@googlegroups.com

Interesante herramienta.

 

Solo que para liberarla se usa SET KEY TO

 

Bendiciones

 

Carlos Alfaro

--
 
 

Fox Learner

unread,
Dec 10, 2012, 4:54:15 PM12/10/12
to publice...@googlegroups.com
Y el set key to range se puede usar con todos los tipos de campo y su performance es tan bueno como selects sobre campos indexados?...

Quién lo ha usado?...

Saludos!

Carlos Miguel FARIAS

unread,
Dec 10, 2012, 5:42:38 PM12/10/12
to publice...@googlegroups.com
El set key se desempeña bien, siempre y cuando la función de indexación sea optimizable por rushmore.
Si usas mas de una tabla, el rushmore no funciona.
Si no funciona el rushmore, el desempeño toma el valor del dr. Kawasawa.
Si estan usados los indices apropiados, el rushmore puede trabajar con mas una tabla si usas SELECT (pero los indices no tienen que estar activos!!!!).
Mi consejo, no usen filtros, NO USEN FILTROS, sean con KEY o Comunes, usen SQL.
Los filtros solo son aplicados a tablas nativas.
Cuando en algún momento tengan que migrar a un SGBD, tienen que tirar todo vuestro trabajo, donde tiran al Dr. Kawasawa.
Saludos: Miguel, La Pampa (RA)

--
 
 

HernanCano

unread,
Dec 11, 2012, 12:48:43 AM12/11/12
to publice...@googlegroups.com


Ariel:

1.
La solución a tu inquietud es la que te da Victor.

SET FILTER TO BETWEEN(TuCampoFecha, ldFechaInicial, ldFechaFinal)

Léase: Tu sintaxis, Ariel, es incorrecta; la correcta es lq que te muestra Víctor.

(La de Douglas también es válida, sólo que preguntabas por BETWEEN)

Set filter to (fecha >= vfecha1 and fecha <= vfecha2)

2.
>>> ... SET KEY TO... ¿funciona igual? ya que se que es un poco complicado indexar un cursor

Lo lamento: no es --de ninguna manera-- complicado indexar un cursor, es exactamente igual que indexar una DBF.

Preguntas si "funciona igual"; me gustaria saber con qué lo comparas (el SET KEY TO).

Es igual de rápido que SEEK (comparando SEEK con LOCATE), pero evidentemente lo estás usando sobre BROWSE. No te será difícil probarlo y contarnos.

3.
Jairo:
Dices que "...Between funciona con datos tipo carácter..."
Disculpa, pero no encontré en la auyda ninguna referencia a restricciones de tipo como la que mencionas; bueno sí hay una: las dos expresiones límite (los dos últimos parámetros) deben ser del mismo tipo, pero no menciona que sean de sólo caracter.
¿Tienes la fuente donde se menciona tal necesidad? Sería bueno leer sobre este tipo de inconsistencias (en el lenguaje) no documentadas.

4.
Sí, como dice foxlearner:
>>> ...tener un performance lento si manejas muchisimos registros....

pero sólo si se manejan muchos registros; para pocos registros no hay pérdida de eficiencia.
De todas formas la recomendación es no usar SET FILTER.

Chao.

HERNAN CANO MARTINEZ
Asesor de Sistemas - Programador

Ariel D'Alfeo

unread,
Dec 11, 2012, 10:15:54 AM12/11/12
to publice...@googlegroups.com
Gracias a todos por las respuestas, pero me generaron mas dudas y eso es bueno porque uno aprende mucho mas.
El tema es que yo uso el SET FILTER TO para filtrar un  cursor en una grilla al tipo "Auto Filtro De excel", cuando el usuario hace Click derecho sobre el Header, le aparece un Menú con un listado (select disticnt(campo) from Cursor), al elegir el valor a filtrar genero una clausura de filtro, si el usuario filtra otro campo, genero otra clausura y se la añado a la anterior.
entonces seria:
        Select(cursor)
        l_filtro=" SET FIlter to "
        el usuario Fitro Por nombre
        l_filtro=l_filtro  +" nombre='Ariel' "
        De los resultados, el usuario Filtro los de apellido "perez"
        l_filtro=l_filtro  + " AND " +  " apellido='perez' "
        De los resultados, el usuario Filtro los  que nacieron entre el 01-01-2000 y el 01-01-2009
        l_filtro=l_filtro  + " AND " +  "  BETWEEN(nacimiento, '01-01-2000', '01-01-2000') "
        y al final queda:
        SET FILTER TO nombre='Ariel' AND  apellido='perez' AND   BETWEEN(nacimiento, '01-01-2000', '01-01-2000')
       y en cada campo el usuario puede borrar el filtro seleccionando "todo" y el filtro se vuelve a generar sacando la condición
       si en el campo Nombre selecciona "TODO" el filtro queda
        SET FILTER TO   apellido='perez' AND   BETWEEN(nacimiento, '01-01-2000', '01-01-2000')

NO puedo usar sentencias sql ya que el cursor se modificaría y no podría volver a el cursor inicial (salvo que lo duplique, pero no me agrada esa idea)
Como puedo hacer lo anterior con SET KEY TO, deberia indexar cada campo?


Crea un índice en base al campo fecha que deseas filtrar:
INDEX TAG FECNAC ON FECNAC

Luego en lugar de usar filter, utiliza un SET KEY
SET ORDER TO FECNAC
SET KEY TO RANGE m.DesdeFec, M.HastaFec



--
 
 


-- 
Ariel D'Alfeo
Córdoba, Argentina

Fox Learner

unread,
Dec 11, 2012, 10:41:38 AM12/11/12
to publice...@googlegroups.com
Ahora que recuerdo, el manual de VFP 6 menciona un tipo de "Indice filtrado", los que llevan la clausula for. Tal vez eso también te pueda servir..


Saludos!

Carlos Miguel FARIAS

unread,
Dec 11, 2012, 12:08:24 PM12/11/12
to publice...@googlegroups.com

Si el cursor ya lo tienes es en memoria, el filtro que estas manejando estaría bien. Ser key solo sirve para un único campo o índice. Reindexar cada vez que elige algo. Muy lento.
Lo que no conviene es crear un cursor muy grande.
Saludos: Miguel, Santa Rosa (LP)

--
 
 

Samuel San Miguel Hernández

unread,
Dec 11, 2012, 12:28:20 PM12/11/12
to publice...@googlegroups.com
Ariel; utiliza TSQL.

lcCriterio = " nombre='Ariel' AND  apellido='perez' AND   BETWEEN(nacimiento, '01-01-2000', '01-01-2000') "
TEXT TO lcCadSql NOSHOW
      select * from Tabla where <<lcCriterio>>
ENDTEXT
EXECSCRIPT(lcCadSql)


Saludos.

Víctor Hugo Espínola Domínguez

unread,
Dec 11, 2012, 12:33:32 PM12/11/12
to publicesvfoxpro
Hola Ariel

Puedes crear tu cursor con el siguiente esquema:

WITH THISFORM
    lcAlgunaPosicion = IIF ( .AlgunaPosicion.VALUE = .T., [%], [] )
    STORE [] TO lcExpr1, lcExpr2, lcExpr3
    IF ! EMPTY ( .Nombre )
        lcExpr1 = [Nombre LIKE ]
        lcExpr1 = lcExpr1 + [?] + lcAlgunaPosicion + ALLTRIM( .Nombre ) + [%]
    ENDIF
    IF ! EMPTY ( .Apellido )
        lcExpr2 = [ AND Apellido LIKE ]
        lcExpr2 = lcExpr2 + [?] + lcAlgunaPosicion + ALLTRIM( .Apellido ) + [%]
    ENDIF
    IF ! ( EMPTY ( .FechaDesde ) OR EMPTY ( .FechaHasta ) )
        ldFechaDesde = .FechaDesde
        ldFechaHasta = .FechaHasta
        lcExpr3 = [ AND Nacimiento BETWEEN ?ldFechaDesde AND ?ldFechaHasta]
    ENDIF
ENDWITH

lcExpr = lcExpr1 + lcExpr2 + lcExpr3
IF NOT EMPTY ( lcExpr )
    lcExpr = [ WHERE ] + lcExpr
ENDIF
* Si es tabla nativa
lcCmdSql = [SELECT * FROM ] + "tuTabla" + lclcExpr + [ INTO CURSOR tuCursor]
&lcCmdSql
* Si usas algún motor de BD
lcCmdSql = [SELECT * FROM ] + "tuTabla" + lclcExpr
SQLEXEC( nConexion, lcCmdSql, [tuCursor] )

Saludos.
Víctor.



--
 
 

Reply all
Reply to author
Forward
0 new messages