No Muestra Form de Busqueda en tiempo de Ejecución

Hola,
En un modulo de inicio.prg incluyo el comando FILE para elegir una Base de Datos en Caso que no se encuentre en la ruta esperada. . . Funciona pero solo en modo de Desarrollo, cuando creo el EXE y quiero que me muestre este formulario de búsqueda solo me muestra mensaje de "error Archivo no encontrado " y no el formulario de búsqueda que espero o que muestra en modo de desarrollo y no entiendo que estoy haciendo mal u omitiendo, agradezco tu ayuda,.
El código.
IF  FILE(BaseDatos) AND JUSTFNAME(NOmbreBD) = "BaseDatos.DBC"
   OPEN DATABASE (BaseDatos.DBC)
ELSE
    MESSAGEBOX('No se Encuentra Base de Datos, "BaseDatos"',+64,'Error')
    Do Form Parametros
    RETURN
Endif

1 respuesta

Respuesta
1
Espero poder ayudarte:
Hay un problemita con el comando OPEN DATA por lo que veo.
Es así: vos pones la ruta completa en BaseDatos luego validas el nombre del archivo que sea basedatos. Dbc y en realidad no haría falta porque la primera condición te da verdadero (.t.).
Tendrías que hacerlo así.
if file(BaseDatos)
    open database (baseDatos)
else
...
Endif
No hay posibilidad de error porque el verdadero de la condición asegura que existe el archivo.
Espero haya sido de utilidad
Estoy a tu disposición
Hola, Muchas gracias,
Bien, trataré de explicarte como es el rollo: Dándole seguimiento paso a paso al código, cuando el Valor de la primera condición no se cumpla entonces se ejecuta el DO FORM Parámetros, parámetros muestra un formulario para poder hacer la búsqueda de la Base de Datos el código en el botón de búsqueda es:
STORE '' TO lcBase
STORE GETFILE('DBC') TO lcBase
IF !EMPTY(lcBase) AND (FILE(lcBase)) AND  (JUSTFNAME(lcBase)='BaseDatos.DBC') ;
 AND (MESSAGEBOX('¿Desea Agregar esta Base de Datos?', 4 + 32, 'Confirmación') = 6)
 STORE lcBase TO Thisform.TxtBaseDatos.Value
 Thisform.TxtBaseDatos.SetFocus()
ELSE
 MESSAGEBOX('Base de Datos Incorrecta!!!',0+48, 'Error')
 RETURN
Endif
Si ejecuto el programa en tiempo de diseño y siguiendo paso a paso el código sí funciona bien, si muestra el formulario y hace lo que indica el código anterior, pero cuando creo el exe y trato de reproducir el caso de 'Base de datos no encontrada' entonces no me muestra el formulario de búsqueda y creo que lo que debería de hacer es mostrarme este formulario que me permita buscar mi base de datos en caso que no este en la ruta esperada.
PD. A decir verdad, si tienes razón eso de comprobar el nombre de la base de datos, si suena bastante redundante. :)
Muchas gracias por tu ayuda,
Bueno veamos tu código.
En la primera linea estaría de más store '' to lcBase porque la definición en realidad la haces en la segunda y no hay manera que no se defina.
Como cosmética, en el caso de declarar un valor a una sola variable, como en el caso de la segunda línea yo usaría = en lugar de store, store lo usaría cuando un valor se asigna a más de una variable.
En la linea del if, sacaría ! Empty(lcBase) ya que el file(lcBase) da .f. si es una cadena vacía y lo ultimo es para validar que la base de datos es la del sistema o por lo menos tiene el nombre de las base de datos del sistema, supongo.
Otra cosa sería que es casi imposible que file retorne .f. de un archivo que recién acabas de elegir con getfile() pero si es algo como multiusuario o algo así, podría ser válido aunque empty() es mucho más rapido que file() entonces, en este caso yo usaría solo empty()
¿Cómo quedaría entonces?
lcBase=getFile('dbc')
if !empty(lcBase) and justName(lcBase)='BASEDATOS.DBC' and messangeBox('¿Desea agregar esta base de datos?',4+32,'Confirmación')=6
          thisform.txtBaseDatos.value=lcBase
          thisform.txtBaseDatos.setfocus
else
           MessageBox('base de datos incorrecta! ', 48,'Error'
Endif
Bueno, ¿te diste cuenta tu problema?
Cuando comparas la función justfName(lcBase) siempre debe ser contra una cadena EN MAYÚSCULAS porque justName devuelve siempre mayúsculas. Para evitar problemas podrías preguntar..
...and upper(justFname(lcBase)='BASEDATOS.DBC' ...
Cuando utilices set step o el depurador, tienes la posibilidad de pararte con el mouse sobre la función o escribirla para ver el resultado (depende la función) y ahí seguramente te habrías dado cuenta del error.
Otra consideración: No uses setfocus() si no estas seguro que se llama al método donde está desde un valid, gotFocus y setFocus no se pueden llamar desde valid. Si lo que pretendes es que un refresh no hace falta hacerlo porque la asignación siempre lo refresca.
Bueno, espero haberte ayudado
Estamos en contacto
Buen día,
Muchas gracias por tu ayuda me está siendo de mucha utilidad, estoy implementando todas tus recomendaciones en el código y sobre todo en la comprensión de la funcionalidad de cada comando, . . . Gracias por tus consejos y tu invaluable ayuda, hice lo siguiente:
DO FORM Parametros
read events
Que se ejecuta cuando no encuentra la la Base de Datos en la Ruta esperada.
Luego ejecuta la búsqueda y asigna la ruta a la variable.
Abre la Base de Datos:
OPEN DATABASE (Variable_que_contiene_Ruta)
Después de crear el ejecutable, funciona como espero: en caso de no encontrar la ruta para la base de datos entonces mostrar Formulario Parámetros para hacer la búsqueda, hago la búsqueda, elijo la Base de Datos y todo funciona bien hasta ese momento.
Hago lo mismo nuevamente para comprobar que funciona correctamente con cualquier ruta, pero es entonces cuando me da error, ya comprobé que el nombre y la ruta sean correctos.
Pero qué bien, creo que he avanzado muchísimo, gracias por tu ayuda.
Saludos.
Hola Christian,
Ya conseguí que el programa hiciera lo que estaba buscando, cuando la base de datos no se encuentra en la Ruta esperada entonces muestra el Formulario parámetro y me permite hacer una búsqueda y elegir la Base de Datos, si el usuario elige la Base de Datos correcta entonces sigue la ejecución y todo el resto de la Aplicación.
En el DataEnvironment agrego todas las tablas involucradas en en la Aplicación y cuando lo hago estas guardan una dirección en la propiedad DataBase por ejemplo
Database = 'D:\Fuentes\Sistema\DATA\BaseDatos.DBC' y cuando yo cambio la ruta de la Base de Datos con GETFILE(DBC) entonces me mostraba error porque no encontraba la base de datos que tenia guardado el cursor del DataEnvironment ahi tronaba todo. . .
Entonces en BeforeOpenTable asigno la nueva ruta a todos los cursores y funciona bien pero no estoy seguro que esta sea buena técnica de programación.
with This
 STORE Ruta TO .Cursor1.Database, (todos los cursores)
endwith
Donde ruta tiene la ruta en donde se encuentra la Base de Datos.
Muchas gracias y Saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas