Portabilidad, manejo de rutas relativas

295 views
Skip to first unread message

Daniel Moreno

unread,
May 26, 2025, 10:18:28 AM5/26/25
to Comunidad de Visual Foxpro en Español
Hola buen día a todos, quiero aclarar que soy novato no tengo mucho tiempo manejando este lenguaje. En la empresa en donde trabajo tenemos un programa hecho con VFP7 y mi jefe me ha encargado compilarlo en VFP9 ya que al momento de compilarlo suele arrojar algunos errores y creo que el problema es mas que nada con las rutas a las que el programa accede, en ocasiones no las encuentra y como tengo el proyecto en un disco de mi computadora pues puedo establecer todas las rutas para que funcione, pero el problema es que ya en produccion el programa lo movemos a una carpeta en un servidor que tenemos compartida en red y que es a la que acceden todos los equipos y me gustaría que en lugar de darle las rutas completas al programa poder hacerlo de manera relativa que pueda encontrar los archivos independientemente de si estoy trabajando con el proyecto en mi pc o de si se encuentra en la unidad del servidor.

Ariel Moreno

unread,
May 26, 2025, 10:48:48 AM5/26/25
to Comunidad de Visual Foxpro en Español
Hola. Puedes usar el archivo de configuración para indicarle rutas de acceso. En config.fpw puedes agregar tus rutas, y no las tendras que harcodear. Agrega set path to "mi ruta1","mi ruta2".... etc.

jorge.ma...@gmail.com

unread,
May 26, 2025, 11:04:44 AM5/26/25
to publice...@googlegroups.com

Estimado buenos días

 

Comparto la configuración que utilizó

 

SET DEFA TO \xxxx

SET PATH TO \ xxxx \reports;\ xxxx \Class;\ xxxx \Data;\ xxxx \Forms;\ xxxx \Graphics;\ xxxx \Menus;\ xxxx \Progs

SET PROCEDURE TO \ xxxx \progs\libvfp,\ xxxx \progs\libvfp02 additive

SET CLASSLIB TO kratos,alertas

 

Utilizó SQL Server como repositorio de información.

 

Martín

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/df787b81-f9ca-4a49-82a2-f6c44497d098n%40googlegroups.com.

HernanCano

unread,
May 26, 2025, 11:43:18 AM5/26/25
to Comunidad de Visual Foxpro en Español
Amigo Jorge:
Precisamente el colega preguntante dice que tiene problemas con las "rutas absolutas"; por lo tanto debemos dale respuestas de acuerdo a las buenas prácticas. Y de acuerdo a ello, la respu es que "sí puede usar rutas relativas".
Por lo tanto no se debe-no se debe-no se debe-no se debe-no se debe-no se debe- usar rutas absolutas, así:
\xxxx

Debes utilizar la metodología que recomienda Fernando D. Bozzo en

Ahí encuentras lo sgte: miremos los comandos clave:
** así lo propone Fernando:
SET TABLEPROMPT OFF      && No mostrar ventana de selección de tabla si no encuentra el alias
SET PATH TO "clases;forms;menus;datos;prgs;bmps" && Rutas relativas a la raíz
_SCREEN.Caption = NOMBRE_SISTEMA
CD (JUSTPATH(SYS(16)))   && Cambiarse al directorio raíz (donde está MAIN.PRG)
DO MENUPRINCIPAL.MPR

Yo sólo cambiaría el orden entre SET PATH y CD, así (aunq parece funcionar de todas formas como lo propone Fernando):
** así lo propone HCano:
SET TABLEPROMPT OFF      && No mostrar ventana de selección de tabla si no encuentra el alias
CD (JUSTPATH(SYS(16)))   && Cambiarse al directorio raíz (donde está MAIN.PRG)
SET PATH TO "clases;forms;menus;datos;prgs;bmps" && Rutas relativas a la raíz
_SCREEN.Caption = NOMBRE_SISTEMA
DO MENUPRINCIPAL.MPR

De esta forma puedes darle un nombre diferente al directorio principal donde pondrás tu aplicación, y las rutas relativas no te fallarán.
Incluso puede estar ubicado en un drive cuya letra sea diferente.

De todas formas hay que conocer buenas prácticas, y aquí te agrego otra:

- No usar CD ni SET DEFAULT TO indiscriminadamente en el resto de la aplicación, en otros .PRGs o .SCXs o .VCXs. El único CD o SET DEFAULT TO que se use sea el del MAIN.PRG o primer programa que se ejecute.

Zarlu

unread,
May 26, 2025, 12:04:12 PM5/26/25
to Comunidad de Visual Foxpro en Español
Buenos días danicruz!

En adición a lo que te han sugerido te comento....

Puedes crear una tabla local que guarde las rutas de los diferentes directorios de trabajo y un formulario de configuración de esa tabla.
Entonces crearías variables de sistema que al iniciar valide y cargue esas rutas.
De esa manera en caso de cambio de servidor puedes reconfigurar esas rutas.

Suerte
zarlu
Chetumal, Quintana Roo, México

Daniel Moreno

unread,
May 26, 2025, 8:30:30 PM5/26/25
to Comunidad de Visual Foxpro en Español
me da un error al hacerlo asi "Invalid path or file name". Es por que tengo que configurarlo en el archivo config.fpw o en este método no hace falta?

integral

unread,
May 27, 2025, 12:49:12 AM5/27/25
to Comunidad de Visual Foxpro en Español
Que tal Colega

Revisa el siguiente link...

Saludos

Integral

Zarlu

unread,
May 27, 2025, 10:48:31 AM5/27/25
to Comunidad de Visual Foxpro en Español
Buenos días danicruz!

" me da un error al hacerlo asi "Invalid path or file name". Es por que tengo que configurarlo en el archivo config.fpw o en este método no hace falta?"

Así como? Está conectada la pc terminal al servidor previo a trabajar con los archivos?
config.fpw en general es para configurar "previo" a lanzar ejecutable. Lo que tu requieres se puede hacer en el prg principal o en un prg dedicado a los SET

Suerte
zarlu
Chetumal, Quintana Roo, México

Daniel Moreno

unread,
May 27, 2025, 1:07:09 PM5/27/25
to Comunidad de Visual Foxpro en Español
Como podría indicar que se posicione una carpeta antes de donde esta el programa de inicio, supuse que seria algo asi, pero no funciono

CD "../" + (JUSTPATH(SYS(16)))

Esto por el problema de que el programa de inicio no se encuentra directamente en la carpeta raíz "newsys\"
e:\\newsys\progs\inicio.prg

saben si hay manera de hacerlo? o creen que es mejor que mueva el programa de inicio directamente a la raiz?

Zarlu

unread,
May 27, 2025, 2:08:01 PM5/27/25
to Comunidad de Visual Foxpro en Español

Qué tal danicruz!

No necesitas posicionarte en la carpeta de inicio (yo le llamaría directorio de arranque del ejecutable, o del ejecutable), si al caso necesitas saber donde arrancó el sistema.
Lo que requieres es saber donde están los directorios/tablas de trabajo para incluirlos en el Set Path o para incluirlos en alguna variable y adicionarlo al path para cuando abras alguna tabla.

lcPathexe=LEFT(sys(16,1),RAT("\",sys(16,1))-1)&&directorio del ejecutable

De dónde eres?

Suerte
zarlu
Chetumal, Quintana Roo, México


fox...@gmail.com

unread,
May 27, 2025, 3:00:31 PM5/27/25
to Comunidad de Visual Foxpro en Español
Hi
Me parece que depende mucho de cómo está manejando el programa el acceso a las tablas y demás, es decir, si las tablas se abren con solamente el nombre (USE TablaX) entonces todo bien, porque en el programa principal (el que inicia el sistema) estableces la carpeta principal y luego usas el SET PATH para establecer las carpetas del sistema (como ya te dijeron antes).
Para establecer la carpeta principal podrías usar lo siguiente:

CLEAR
IF _VFP.StartMode=0 && Modo desarrollo (Normalmente se usa un prg que esta en una carpeta dentro de la carpeta principal)
SetDirectory(1) && Retrocederá una carpeta
ELSE
SetDirectory() && Normalmente el ejecutable está en la carpeta principal
ENDIF
**Todo el IF también lo podrías escribir como:
**SetDirectory(IIF(_VFP.StartMode=0,1,0))

SET PATH TO ... && Aquí completa con las rutas que necesitas
*Continuas con las demás líneas del programa.

RETURN

FUNCTION SetDirectory(tnBackLevel AS Integer)
**Función para cambiar la carpeta activa. Si no se envia parámetros o el parámetro no es
**un número entre 0 y el número de carpetas que tiene la ubicación del archivo entonces
** no retrocederá ninguná carpeta.
**tnBackLevel: Indica cuántas carpetas retrocederá para establecer la carpeta activa.
**Ejemplo: Si el prg esta en: C:\NewSys\Prgs\Main.Prg
** SetDirectory() && Vacio o cero (0) se establece en C:\NewSys\Prgs\
** SetDirectory(1) && Se Establece en C:\NewSys\
** SetDirectory(5) && Se Establece en C:\NewSys\Prgs\
** SetDirectory(-2) && Se Establece en C:\NewSys\Prgs\
LOCAL lcProgram AS String ;
,lcSetDir AS String ;
,lnLevel AS Integer
m.lcProgram = SUBSTR(SYS(16), AT(":", SYS(16)) - 1)
m.lnLevel = IIF(VARTYPE(tnBackLevel)="N" ;
AND BETWEEN(tnBackLevel,0,OCCURS("\",m.lcProgram)-1);
,tnBackLevel ;
,0)
m.lcSetDir = ADDBS(LEFT(m.lcProgram,RAT("\",m.lcProgram,m.lnLevel+1)-1))
CD (m.lcSetDir)
RELEASE m.lnLevel,m.lcProgram,m.lcSetDir
ENDFUNC
**
Como siempre, se puede mejorar el código, eso ya depende mucho de tu escenario específico.

Espero te sirva de algo.

Saludos

Bytes ^_^

Daniel Moreno

unread,
May 27, 2025, 3:44:44 PM5/27/25
to Comunidad de Visual Foxpro en Español
Hola que tal! ya quedo funcionando y asi esta el programa ahora, al final me decidí por moverlo a la carpeta raíz por las buenas practicas que menciona Fernando D. Bozzo, aun creo que hay muchas cosas que mejorar en este proyecto, la verdad este proyecto tiene ya muchos años y mi jefe es quien se ha encargado de modificarlo y mantenerlo y yo pues jamás había usado visual fox pro, hay muchas cosas que aun no entiendo y no había querido moverle por que casi no conozco el lenguaje, pero la verdad ahora que lo voy entendiendo un poquito mas creo que es un lenguaje muy interesante y con muchas posibilidades.
Gracias a todos por la ayuda y si tienen alguna recomendación para mejorar se los agradecería mucho.

PD:Esos comentarios que aparecen ahi de una tabla constantes y la variable workindir eran precisamente por que el programa a veces perdía las rutas y mi jefe opto por hacerlo asi para indicarle al programa donde tenia que posicionarse

CLEAR ALL
CLOSE ALL
SET NEAR ON
RELEASE ALL
SET SYSMENU TO
WITH _Screen
    .BackColor=16777215
.BorderStyle=2
.Caption=" Sistema de Administracion General"
.ControlBox=.T.
.Closable=.t.
.MaxButton=.t.
.MinButton=.T.
.Movable=.t.
.Windowstate=2  
.visible=.T.
ENDWITH

SET TABLEPROMPT OFF
CD (JUSTPATH(SYS(16)))

*
*!* Define Variables Globales
PUBLIC cPassword, cNombres, lAuto_Asigna, lRojosi, lAmarillosi, lVerdesi, laut
PUBLIC loks, cLogin, cDesRuta, cNomUser, nUsuario, cDivisi, cEmpresa, xMensaje, cNombEmp, lEresGte, lEresAgte, cPermisos,ctiponota,pednuevo,nnopesur
PUBLIC NFAC, CSER, quienauto, lautoriza, workingdir, pqauto, nplazo, flipflop,cve
PUBLIC hermanos, nca, xversion
hermanos=1
nca=0
xversion=SYS(16)

*
*!* Inicializa Variables Globales
STORE 0 TO nUsuario,nnopesur,NFAC, nplazo
STORE 1 TO flipflop
STORE .F. TO loks, lEresGte, lEresAgte, lAuto_Asigna, lRojosi, lVerdesi, lAmarillosi, lautoriza, laut
STORE "" TO cLogin, cDesRuta, cNomUser, cDivisi, cEmpresa, xMensaje, cNombEmp, cPermisos, cPassword, cNombres, ctiponota,CSER, quienauto,workingdir,pqauto,cve
STORE .t. to pednuevo
*
*!* Define Variables Locales
LOCAL lcMainClassLib, lcLastSetPath, lcLastSetTalk, lcLastSetClassLib, lcOnShutdown

*!* Abre la sesion de datos
lcLastSetTalk = SET("TALK")
lcLastSetPath = SET("PATH")

*!* Define las rutas
SET PATH TO ".; DATA; FORMS; LIBS; MENUS; PROGS; REPORTS; BITMAPS; ICONOS"

*!* Abre la conexion a la base de datos
OPEN DATABASE 'DATA\sarps.dbc' SHARED

*!* Se posiciona sobre la tabla constant
*!* use 'NEWSYS\DATA\constant' SHARED

*!* workingdir=ALLTRIM(rutabd)

SET PROCEDURE TO progs\generals.prg
SET PROCEDURE TO progs\codebar.prg additive
SET PROCEDURE TO progs\generals.prg
DO INICIA
SET MESSAGE TO ' '
loks=.F.
*DO FORM FORMS\LOGINES.SCX
DO FORM FORMS\LOGINES.SCX

IF loks=.T. THEN
    _SCREEN.BackColor=16777215 && Dark Grey
@ 01, 05 SAY "logoaltima.jpg" BITMAP SIZE 450.0, 450.000 ISOMETRIC
lcMainClassLib= "libs\alpasesorias"
SET CLASSLIB TO (lcMainClassLib) ADDITIVE
* DO progs\creamenu.prg
    DO progs\creamenu.prg
ELSE
RELEASE ALL
RELEASE loks, cLogin, cDesRuta, cNomUser, nUsuario, cDivisi, cEmpresa, xMensaje
SET SYSMENU TO DEFA
KEYBOARD '{ALT+S}'
ENDIF  
CLEAR

HernanCano

unread,
May 30, 2025, 3:36:15 PM5/30/25
to Comunidad de Visual Foxpro en Español
Antes del 
CD "../" + (JUSTPATH(SYS(16)))

que estás usando, escribe lo sgte:
MessageBox ( "../" + (JUSTPATH(SYS(16))) ,'' )

y nos pones imagen de lo q muestra. ¿Te parece que es una ruta válida?

Daniel Moreno

unread,
Jun 6, 2025, 3:38:16 PM6/6/25
to Comunidad de Visual Foxpro en Español
hola, que tal Hernan ya he logrado establecer bien las rutas la siguiente información me resulto muy útil:
https://fdbozzo.blogspot.com/2014/01/crear-un-proyecto-foxpro-por-donde.html

Solamente utilice "CD (JUSTPATH(SYS(16))) : Esto me devolvió la ruta del archivo de programa
ya después el siguiente problema fue que el programa de inicio no estaba en la raíz de el proyecto
se encontraba en la carpeta Progs por lo que decidí mover el programa de inicio a la raíz y funciono sin complicaciones

Gracias a todos por el apoyo!

Saludos desde monterrey NL Mexico
Reply all
Reply to author
Forward
0 new messages