El comando SET FILTER era muy útil. Era, tiempo pasado.
Antes de que Visual FoxPro tuviera los comandos SQL, cuando se quería mostrar o procesar solamente algunos registros de una tabla el SET FILTER resultaba de mucha utilidad.
Pero…luego tuvimos SQL y ahora usar SET FILTER es siempre un error. Siempre. Siempre es un error. No hay excepción a esa regla.
Desde luego que si quieres seguir usándolo lo seguirás usando, nadie puede obligarte a que no lo uses. Pero estarás haciendo algo incorrecto.
¿Por qué?
Porque hay una mejor alternativa y esa mejor alternativa es usar el SELECT – SQL como veremos enseguida.
¿Cuáles son los problemas con SET FILTER?
- Que los registros que no cumplen la condición se vuelven inaccesibles y es imposible saber si una tabla o cursor está «filtrada», o no lo está.
- Que si usaste alguna variable en tu condición del filtro y el alcance de esa variable no es el adecuado, obtendrás un mensaje de error del VFP.
Listado 1. Un SET FILTER problemático
DO PROC1 DO PROC2 RETURN * * PROCEDURE PROC1 LOCAL lnAnoEje USE "C:\VISUAL FOXPRO\CONTA\ARCHIVOS\DEMO\CUENTAS" lnAnoEje = 2003 SET FILTER TO CUE_EJERCI = lnAnoEje BROWSE ENDPROC * * PROCEDURE PROC2 BROWSE ENDPROC * *
En el Listado 1. vemos un ejemplo del problema que podemos tener cuando usamos SET FILTER. Si ejecutamos ese programa, el comando BROWSE que se encuentra en PROC1 se mostrará bien, pero el comando BROWSE que se encuentra en PROC2 causará un error:
Captura 1. Mensaje de error obtenido por usar SET FILTER con alcance local
¿Cuál es el problema? Que la variable lnAnoEje tiene un alcance local y por lo tanto solamente se la puede usar en PROC1. Y si en lugar de LOCAL ponemos PRIVATE entonces el problema continuará, obtendremos el mismo mensaje de error. Una solución sería declarar a esa variable como PUBLIC pero si eres un buen programador entonces sabrás que nunca debes usar PUBLIC. Otra solución sería declarar a la variable lnAnoEje como PRIVATE pero antes de ejecutar a PROC1. Sin embargo, en ese caso estarías escribiendo más código y por lo tanto perdiendo más tiempo e incrementando la probabilidad de cometer otro error.
Listado 2. Otro SET FILTER problemático
PRIVATE pnAnoEje pnAnoEje = 0 DO PROC1 DO PROC2 RETURN * * PROCEDURE PROC1 USE "C:\VISUAL FOXPRO\CONTA\ARCHIVOS\DEMO\CUENTAS" pnAnoEje = 2003 SET FILTER TO CUE_EJERCI = pnAnoEje BROWSE ENDPROC * * PROCEDURE PROC2 SELECT CUENTAS BROWSE ENDPROC * *
En el Listado 2. aplicamos una solución y ya el comando BROWSE del PROC2 no nos muestra un mensaje de error, pero…hay otro pero.
¿Cuál es el problema ahora?
Que en PROC2 seleccionamos a nuestra tabla y no vemos que está filtrada. En este caso, el comando BROWSE solamente nos mostrará los registros correspondientes al año 2003 y ninguno más. ¿Y qué pasaría si también quisiéramos ver o procesar los registros de otros años? Pues que no podríamos hacerlo porque dichos registros están totalmente inaccesibles.
Listado 3. La solución es usar el SELECT – SQL
DO PROC1 DO PROC2 RETURN * * PROCEDURE PROC1 LOCAL lnAnoEje lnAnoEje = 2003 SELECT * FROM "C:\VISUAL FOXPRO\CONTA\ARCHIVOS\DEMO\CUENTAS" WHERE 1 = 1 INTO CURSOR MISCUENTAS BROWSE SELECT * FROM MISCUENTAS WHERE CUE_EJERCI = lnAnoEje INTO CURSOR CUENTAS_2003 ENDPROC * * PROCEDURE PROC2 SELECT CUENTAS_2003 BROWSE SELECT MISCUENTAS BROWSE ENDPROC * *
El programa mostrado en el Listado 3. funciona perfectamente, aunque la variable lnAnoEje fue declarada como LOCAL y además tenemos acceso a ambos cursores. El cursor MISCUENTAS nos muestra todos los registros de la tabla original y el cursor CUENTAS_2003 nos muestra solamente los registros correspondientes al año 2003 de la tabla original.
O sea, que si programamos de la forma mostrada en el Listado 3. jamás tendremos un problema, en cambio si programamos de la forma antigua, como se mostró en el Listado 1. y en el Listado 2. sí podríamos llegar a tener problemas.
Ya es tu decisión elegir.
Conclusión:
Usar el comando SET FILTER solamente se justificaba antes de que el FoxPro incorporara los comandos SQL. Después de eso, usar SET FILTER ya no se justifica porque es proclive a errores. Claro que si quieres continuar usándolo…
Artículos relacionados:
El índice del blog VFPavanzado
El ya casi olvidado SET FILTER, lo usé muy poco hace un tiempo, pues tenía ese problema que mencionas, de no poder ver los otros registros.
Buenos consejos Walter, saludos desde Perú.