duda sobre el uso del SET FILTER

3,074 views
Skip to first unread message

Euro Nava

unread,
Jul 10, 2012, 11:13:38 AM7/10/12
to publice...@googlegroups.com
Amigos mi duda es la siguiente: un vez aplicado el SET FILTER ¿todas las operaciones que aplique a la tabla sean cuales sean solo afectan a los registros que cumplan con la condición indicada en el filtro ignorando al resto?

Guillermo MDQ

unread,
Jul 10, 2012, 11:19:43 AM7/10/12
to publice...@googlegroups.com
De la ayuda de VFP:

"Una vez ejecutado SET FILTER, solamente están disponibles en la tabla los registros que satisfacen la condición especificada con la expresión lógica lExpression. Todos los comandos de acceso a la tabla respetan la condición de SET FILTER. Se puede definir un filtro distinto para cada tabla abierta.

La condición especificada por SET FILTER no se evalúa hasta que el puntero de registro se mueve en la tabla.

Al ejecutar SET FILTER TO sin lExpression se desactiva el filtro para la tabla actual.

SELECT - SQL no respeta la condición de filtro actual."

No es recomedable usar Set Filter, en su lugar usa consultas SQL .


Saludos
Guillermo
Visual FoxPro 9 SP2

Luis Maria Guayan

unread,
Jul 10, 2012, 11:22:27 AM7/10/12
to publice...@googlegroups.com
Es preferible que a todas las operaciones que apliques a tus tablas le agregues la condición, ya sea con un WHERE o con un FOR.

Personalmente no soy amigo ni utilizo SET FILTER en mis aplicaciones.

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

El 10/07/2012 12:13, Euro Nava escribió:

Fox Learner

unread,
Jul 10, 2012, 11:26:07 AM7/10/12
to publice...@googlegroups.com
Tambien puedes aplicar otro filter una vez que aplicaste el primero.

Filter sobre filter.

Incluso, la ayuda menciona que pueden usarse "indice Filtrado" con la clausula FOR.

Algo como:

INDEX ON Micamponombre FOR Micamponombre = "Marcos" TAG MiEtiquetadelcamponombre

Lo que no sé es si la gente de este foro use esos "Indices Filtrados" o lo considere una técnica obsoleta...??

Walter R. Ojeda Valiente

unread,
Jul 10, 2012, 11:30:44 AM7/10/12
to publice...@googlegroups.com
Así mismo.

Mientras el filtro esté activo los registros que no cumplan con la condición del filtro es como si no existieran, nada puedes hacer en ellos. Sin embargo, los comandos y funciones que afectan a la tabla en su totalidad continúan funcionando normalmente. Por ejemplo, un ZAP eliminaría a todos los registros de la tabla, tanto los filtrados como los no filtrados. Y un RecCount() te dirá la cantidad total de registros de la tabla, no solamente los filtrados.

Para que la condición del filtro se mantenga entre distintos módulos (rutinas, funciones) si usas variables éstas no deben ser locales.

De todos modos, no es recomendable usar SET FILTER en tablas con muchos registros porque el procesamiento se vuelve más lento.

Saludos.

Walter.





Date: Tue, 10 Jul 2012 08:13:38 -0700
From: eur...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] duda sobre el uso del SET FILTER

Euro J. Nava L.

unread,
Jul 10, 2012, 11:32:48 AM7/10/12
to publice...@googlegroups.com

Sr. Guayán que implicaciones negativas tiene el uso del SET FILTER?

 

 

Saludos

 

Mi formato para mail personal

 

El presente correo y sus anexos son exclusivamente para el uso de los destinatarios indicados en el encabezado del mismo, pueden contener información confidencial y/o privilegiada. Si usted por error ha recibido la presente correspondencia agradezco hacer omisión de esta y hacerme del conocimiento por esta misma vía.

 

Bendito el hombre que ha sido llamado por Cristo para ser soldado del ejército en cuya mano empuñe como arma la palabra de Jehová


Se certificó que el correo no contiene virus.
Comprobada por AVG - www.avg.es
Versión: 10.0.1424 / Base de datos de virus: 2437/5123 - Fecha de la versión: 10/07/2012

image003.jpg

Euro J. Nava L.

unread,
Jul 10, 2012, 11:34:13 AM7/10/12
to publice...@googlegroups.com

Gracias Guillermo

 

 

Saludos

 

 

 

El presente correo y sus anexos son exclusivamente para el uso de los destinatarios indicados en el encabezado del mismo, pueden contener información confidencial y/o privilegiada. Si usted por error ha recibido la presente correspondencia agradezco hacer omisión de esta y hacerme del conocimiento por esta misma vía.

 

Bendito el hombre que ha sido llamado por Cristo para ser soldado del ejército en cuya mano empuñe como arma la palabra de Jehová

 

Euro J. Nava L.

unread,
Jul 10, 2012, 11:47:13 AM7/10/12
to publice...@googlegroups.com

Gracias Walter

 

 

Saludos

 

 

 

El presente correo y sus anexos son exclusivamente para el uso de los destinatarios indicados en el encabezado del mismo, pueden contener información confidencial y/o privilegiada. Si usted por error ha recibido la presente correspondencia agradezco hacer omisión de esta y hacerme del conocimiento por esta misma vía.

 

Bendito el hombre que ha sido llamado por Cristo para ser soldado del ejército en cuya mano empuñe como arma la palabra de Jehová

 

Fox Learner

unread,
Jul 10, 2012, 12:01:30 PM7/10/12
to publice...@googlegroups.com
Euro,

No tiene nada de malo usar SET FILTER. Funciona bien..

Solo que hay mejores técnicas.

Entiendo que cuando usas SET FILTER estás filtrando los datos de la tabla real y trabajando sobre la tabla real.

(Aunque no creo que sea así... ya que al parecer VFP sube los datos a su "entorno de datos" el cual parece ser un buffer que trabaja en memoria).

Para no trabajar sobre la tabla real existen mejores técnicas.

Usar "archivos de indice" para buscar sobre ellos en vez de sobre las tablas de forma secuencial.

Usar Vistas, las cuales usan el sistema de buffering ayudando a que actualices los datos en memoria.

El sistema de buffering con "cursores".

Las transacciones.

Y según el manual hasta se pueden poner "reglas" a nivel de registros, campos, etc.

Sino mal recuerdo usando Triggers o disparadores.

En fin, en un proximo mensaje te pondre un ejemplo de como usar indices en lugar de filters.

Saludos!

Fox Learner

unread,
Jul 10, 2012, 1:07:03 PM7/10/12
to publice...@googlegroups.com
EJEMPLO CON SET FILTER.

Si tienes una tabla con los campos idlciente, nombrecliente, fechadealtacliente. ciudadcliente

Puedes activar tu grid desde el Load del Form con:
USE Mitabla IN 0
SELE Mitabla

Luego en algun text donde haces el llamado a tu grid y suponiendo que deseas filtrar los clientes que se dieron de alta entre ciertas fechas y por su ciudad.

Sele Mitabla

* Tienes 2 texts tipo desde: hasta: para el periodo a filtrar.

A=CTOD(ALLTRIM(THISFORM.TEXT1.VALUE))
B=CTOD(ALLTRIM(THISFORM.TEXT2.VALUE))

IF A<=B

STORE SPACE(60) TO pcCiudadCliente
pcCiudadCliente=ALLTRIM(THISFORM.comboeligeciudad.VALUE)

GO TOP
SET FILTER TO BETWEEN(Fechadealtacliente,A,B) AND ALLTRIM(CuidadCliente) = ALLTRIM(pcCiudadCliente)

THISFORM.GRID1.VISIBLE=.T.
THISFORM.GRID1.SETFOCUS()
THISFORM.GRID1.CLICK()
GO TOP
ELSE
WAIT 'EL PERIODO NO ES CORRECTO' WINDOW AT 15,40 TIMEOUT 1
ENDIF

Logico que en el "builder" de tu grid debiste incluir el campo de idcliente, ademas del nombre, la fecha de alta y la ciudad.

Intentare hacer ese mismo ejemplo pero con indices y cursores ahora..

Luis Maria Guayan

unread,
Jul 10, 2012, 1:32:41 PM7/10/12
to publice...@googlegroups.com
Este caso es uno de los problemas que podrías tener con SET FILTER. VFP te lanzará un error cuando las variables A, B y pcCiudadCliente pierdan el alcance y SET FILTER continua activo



Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Walter R. Ojeda Valiente

unread,
Jul 10, 2012, 1:49:12 PM7/10/12
to publice...@googlegroups.com
Por eso las variables del SET FILTER no deben ser locales.

Saludos.

Walter.




Date: Tue, 10 Jul 2012 14:32:41 -0300
From: luism...@gmail.com
To: publice...@googlegroups.com
Subject: Re: [vfp] Re: duda sobre el uso del SET FILTER

Luis Maria Guayan

unread,
Jul 10, 2012, 1:59:45 PM7/10/12
to publice...@googlegroups.com
En mi caso personal, no utilizo SET FILTER mas por una cuestión de gustos y de costumbres. Con el uso de otros motores de bases de datos aparte de VFP, uno se acostumbra a no utilizar comandos nativos solo de VFP, como SET FILTER, SEEK, FOUND y buscar mayor compatibilidad con comandos T-SQL

Tengo mejores resultados con vistas o sentencias SELECTs, que con SET FILTER que no siempre son optimizables.

También tengo mayor control con el conjunto de datos utilizando SELECTs, UPDATEs o DELETEs, ya que con SET FILTER (tal cual tu duda inicial) no tienes en claro si abarca tal o cual registros, si está activo, si las variables que pueden intervenir en la condición están en el alcance del método o procedimiento, etc

Otro aspecto estético que no me gusta del SET FILTER, es las barras deslizadoras de las grillas, cuando tienes un SET FILTER activo, no muestran gráficamente la posición ni la proporción de los datos filtrados.

Esto es solo mi humilde opinión y experiencia sobre SET FILTER. Tú puedes utilizarlo sin problemas, si para tí es válido y no tuviste inconvenientes, entonces no hay problemas.

Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Fox Learner

unread,
Jul 10, 2012, 2:59:28 PM7/10/12
to publice...@googlegroups.com
Por fas, revisar este ejemplo ya que soy nuevo en lo de los cursores..

EJEMPLO CON INDICES Y CURSORES:

Tienes una tabla con los campos idlciente, nombrecliente, fechadealtacliente. ciudadcliente

Puedes activar tu grid desde el Load del Form y generar la consulta ahi mismo o bien generar la consulta al momento preciso en el control que activa y muestra el grid. Quedaría algo como:

A=CTOD(ALLTRIM(THISFORM.TEXT1.VALUE))
B=CTOD(ALLTRIM(THISFORM.TEXT2.VALUE))

IF A<=B

STORE SPACE(60) TO pcCiudadCliente
pcCiudadCliente=ALLTRIM(THISFORM.comboeligeciudad.VALUE)


USE Mitabla IN 0
SELE Mitabla

THISFORM.GRID1.Recordsource=''

Go top

SELECT idcliente, nombrecliente, fechaaltacliente, ciudadcliente;
FROM Mitabla WHERE Fechadealtacliente BETWEEN A AND B;
AND CiudadCliente LIKE 'pcCiudadCliente%';
INTO CURSOR Micursor;

Thisform.grid1.recordsource='Micursor'
Thisform.grid1.Refresh()
THISFORM.GRID1.VISIBLE=.T.
THISFORM.GRID1.SETFOCUS()
THISFORM.GRID1.CLICK()
GO TOP


ELSE
WAIT 'EL PERIODO NO ES CORRECTO' WINDOW AT 15,40 TIMEOUT 1
ENDIF


Antes de todo eso debiste indexar tu tabla algo como:

SET EXCLUSIVE ON
INDEX ON Idcliente TAG Idcliente

** Eso se hace una sola vez en la vida jeje

Luego cuando pones en uso la tabla solo pones en uso la etiqueta del archivo de indice .CDX Así:

SET ORDER TO Idcliente

Qué errores tuve?...




Reply all
Reply to author
Forward
0 new messages