La importancia de la rutas en Visual FoxPro Imagino que muchos de nosotros hemos tenido alguna vez un problema con la forma de cómo trabaja el Visual Foxpro (En adelante VFP) con los archivos.
Alguien me pregunto hace poco:
Uso el administrador de programas para abrir mi formulario y me abre sus tablas, pero si lo hago con un *.prg me abre un cuadro de diálogo, el de Buscar. ¿Qué hice mal? Es obvio que VFP no ha recibo la ruta de búsqueda.
Sobre este punto el Administrador de proyectos facilita y dificulta, ambas cosas. Facilita porque, una vez que trabajamos desde el Administrador de proyecto, este controla por nosotros los aspectos relacionados con encontrar y abrir archivos, y dificulta, porque somos de la tendencia a olvidar que VFP requiere internamente de rutas, parece ser que VFP tiene un método muy estricto cuando se le pide encontrar algo.
Por ejemplo al llamar a una función VFP verifica primero el programa que se está ejecutando actualmente, luego otros programas en memoria, luego el directorio actual, luego los directorios que están en su propia ruta de búsqueda y finalmente la ruta de búsqueda de Windows. Si buscamos el nombre de una tabla con referencia incompleta (por ejemplo:
USE clientes, a diferencia de
USE C:Carteraclientes.dbf), busca primero en la carpeta seleccionada actualmente, luego entre su propia ruta y finalmente en la ruta de búsqueda de Windows.
Cuando le asigna a VFP su propia ruta de búsqueda, buscará los archivos sin tener que ir a través del sistema operativo - claramente será mucho más eficiente ya que la ruta necesita incluir solamente aquellos lugares que son estrictamente relevantes para VFP.
Veamos ahora el directorio predeterminado
Por defecto Visual FoxPro utiliza la unidad y el directorio actualmente seleccionados como su "ruta" y podrá restablecer esta configuración utilizando simplemente:
SET PATH TO Pero para el desarrollo de aplicaciones más complejas, tendrá una estructura de directorios y se debe establecer siempre la ruta de búsqueda en donde estén todos los directorios que se vayan a usar. Lo primero que debe hacer es establecer el directorio predeterminado y existen varias formas de hacerlo:
- Especificar Default en al Archivo de configuración (CONFIG) utilizando DEFAULT =
- Establecer la ruta predeterminada directamente en el código utilizando SET DEFAULT TO
- Cambiar de directorio de forma dinámica utilizando SET DEFAULT TO (GetDir()). (Los comandos 'CD' (o 'CHDIR') se pueden utilizar para cambiar tanto la unidad como el directorio a una localización especificada).
Cabe destacar que funciones como “PUT” o “GET”, observe que utilizando las funciones "Get" o "Put" (ejemplo GetDir()) generalmente no cambia ni el directorio predeterminado ni la ruta.
La excepción a esta regla es una característica (aparentemente no documentada en VFP) de la función LOCFILE() la que agrega la carpeta seleccionada a la ruta de búsqueda de VFP, a como muestra el siguiente código:
*** Limpia la ruta
SET PATH TO
? SET( 'path' ) && Devuelve nada
USE LOCFILE( 'clientes' ) && Localiza un archivo
? SET( 'path' ) && Devuelve C:carteraclientes
► LOCFILE() cambia la ruta.
Esto es así al menos desde la versión 2.6, en la ayuda (versión 2.6) aparece de esta forma.
El diálogo Open (Abrir) puede ser utilizado para localizar un archivo. Al escoger un archivo del diálogo, se devuelve el nombre del archivo con la ruta, la cual es agregada a la ruta de FoxPro.
Parece ser que en la creación del fichero de ayuda de VFP la última frase se perdió y continúa perdida, en el fichero de ayuda de VFP8:
El diálogo Open (Abrir) puede ser utilizado para localizar un archivo. Al escoger un archivo del diálogo, se devuelve el nombre del archivo con la ruta.
Comando SET PATH
Establecer la ruta es simple basta solamente utilizar el comando SET PATH seguido por la lista de directorios que desea incluir. No necesita indicar las rutas enteras para los subdirectorios, es suficiente con separarlos por comas o puntos y comas.
Por ejemplo:
SET PATH TO Z:Cartera;C:VFP80PROJECTS;DATA;FORMS;LIBS;PROGS;UTILS
Si desea recuperar la configuración actual, puede utilizar la función SET, puede asignar el valor devuelto a una variable o, en el portapapeles para que pueda pegar la ruta actual en un programa o archivo de documentación:
Por ejemplo:
_ClipText = SET('PATH')
Puede usar el nombre de un servidor también, para nombrar rutas como:
SERVIDORDIRECTORIO
y permite el uso de espacios embebidos (cuando se encierran entre comillas) en nombres de directorio como:
"..COMMON DIRECTORY"
Aunque esto último es permitido, los espacios pueden causar problemas al tratar de controlar los nombres de archivos y los directorios por programa, y pienso aun que el mejor consejo es evitarlo como sea posible en las aplicaciones. Por ejemplo, el siguiente código trabaja perfectamente para nombres convencionales de directorios; pero falla si el directorio tiene espacios embebidos:
LOCAL lcDir
lcDir = GETDIR()
IF ! EMPTY(lcDir)
SET DEFAULT TO &lcDir
ENDIF
VFP 9.0 introdujo la cláusula ADDITIVE al comando SET PATH para permitir que fragmentos de ruta sean agregados dinámicamente (interesantemente, es lo que el LOCFILE() ya venía haciendo desde siempre)
Determinar la configuración actual
En VFP hay varias funciones que nos ayudan a localizar dónde nos encontramos en cada momento:
Por ejemplo: - SYS(2004) devuelve el directorio desde el que se ha iniciado Visual FoxPro; pero en tiempo de ejecución en una aplicación distribuida., será siempre la localización de la DLL runtime (que es normalmente la versión adecuada del directorio 'System' de Windows.)
- HOME() devuelve el directorio por defecto desde el que se ha iniciado Visual FoxPro; pero tiene varias opciones útiles adicionales.
- _VFP.FULLNAME accede a la propiedad del objeto aplicación de Visual FoxPro que contiene la ruta entera y el nombre de fichero que fue utilizado para iniciar VFP.
- FULLPATH('') o FULLPATH(CURDIR()) devuelve toda la unidad y la ruta del directorio actual (incluyendo la barra final "")
- SYS(5) devuelve la unidad predeterminada (incluyendo los dos puntos ":")
- CD (trabaja solamente de forma interactiva en la ventana de comandos) muestra la unidad y carpeta actual en la ventana de salida actual - pero también cambia la unidad y el directorio, todo en un único comando.
- CHDIR cambia la unidad o directorio especificado (igual que CD); pero no informa del estado actual (y no provoca desorden en sus formularios).
- CURDIR() devuelve el directorio actual (con la barra final ""); pero no la unidad.
- SYS(2450) introducido en VFP 8.0 controla si una aplicación busca internamente antes de acceder a la ruta de búsqueda externa.
Establecer la ruta
Puedes usar este código:
public lcPath
lcPath = HOME() + ";" + ADDBS( FULLPATH( CURDIR() )) + "DATA"
Yo me despido, esperando que les sea de utilidad. Por favor documenten más sobre esto y publíquenlo.
Ing. Yader Antón