Solo para expertos foxpro 2.5 DOS !!!!

javierkaim
27 de Julio del 2004
Durante la ejecucion del prg, (foxpro dos 2.5) si por algun motivo el archivo no esta disponible (por ejemplo porque se arruino o se borro), en lugar de generar directamente el error de "no database in use" me aparece en el medio de la pantalla un cuadro de dialogo lila con la frase "select database" y no se como hacer para que no aparezca. Si pudiera capturar el error ANTES DEL CUADRO DE DIALOGO LILA, podria abrir algun otro archivo como para que no se genere este cuadro de dialogo.

Mis clientes, cuando aparece esta ventanita lila, empiezan a tocar y ameterse en archivos equivocados con el riesgo de hacer desastres.

Ejemplo:
Supongamos que quiro limpiar un archivo auxiliar llamado aux.dbf y que por algun motivo el archivo se borro. EL prg diria lo siguiente

use aux (aca, como no lo encuentra, abre la ventanita
maldita y pide SELECT DATABASE
Quien esta ejecutando el programa se le
ocurre elegir el archivo principal de ventas
y la siguiente orden del programa es:
zap

ENTIENDEN MI PROBLEMA?

POR FAVOR, POR FAVOR, POR FAVOR !!!!!!!

A Y U D A !!!!!

Eternamente agradecido!!!!!!!!!!! : )








Desde ya les agradezco
muchisimo y quedo disponible para ayudar en lo que
pueda. Mil Gracias.



Javierkaim
27 de Julio del 2004
Gracias por las respuestas, estoy probando los
metodos pero sigue apareciendo porque la ventana
lila aparece ANTES de que fox se de cuenta que hay
un error.


SERIA BUENISIMO SI PRUEBAN EN SU PC:

EJECUTEN EL SIGUIENTE PROGRAMA SIMPLIFICADO:


**MENU.PRG
ON ERROR DO VERROR

BROW



PROCEDURE VERROR
WAIT "ERROR, NO HAY ARCHIVO EN US脰 (ENTER)" WIND
CANC

*FIN DEL PROGRAMA


A QUIEN PUEDA AYUDARME:
NECESITO QUE SALTE A "VERROR" DIRECTAMENTE
SIN ABRIR ESA VENTANITA LILA QUE DICE "SELECT
DATABASE"

mil mil mil gracias !!!!

Cuenten con migo para lo que pueda ayudar.
Gracias colegas, es bueno sentir que no estoy solo!
Gracias



Alex
27 de Julio del 2004
Que tal Javierkaim.

Amigo no tenes de otra mas que revisar si el archivo existe antes de abrirlo.

No podras capturar el error ya que el fox al no encontrar el archivo da opci贸n a buscarlo manualmente y no detecta esto como error sino despues que el valor devuelto como tabla es Vacio ''.

Antes de usarlo utiliza por ejemplo:

IF FILE('MiTabla.dbf')
Use MiTabla
ELSE
WAIT WINDOW 'ATENCION no se encuentra el archivo MiTabla.dbf'
ENDIF

Alex Vargas

Andres
27 de Julio del 2004
tenes que usar la funcion On Error para capturar los errores
Si pones en el programa ON ERROR DO VERERROR
En la funcion VERERROR ves que haces y el programa continua, fijate los codigos de error que hay para manejar los errores como quieras.
Andres

Luisen98
27 de Julio del 2004
Hola javierkaim:
Not茅 que la tabla la llamas AUX, pero en MsDos, es una palabra reservada del Sistema Operativo, talvez haya por ahi una confusion. Solo te sucede con esa tabla ?

Raul
27 de Julio del 2004
Tambien puedes utilizar el comando USED()

if USED("aux")
zap
else
create table c:algoaux.dbf (campo1 c(3),campo2 n(10,0),...)
sele aux
use
use c:algoaux.dbf in 0 exclu
endif

Esto hara que si la tabla esta disponible y cargada le de un zap, si no te la crea y luego la tomas en modo exclusivo.

Espero te sirva

CZ
27 de Julio del 2004
Hola
Me parece buenas las opiniones anteriores, segun propia experiencia lo que hago es crear un funcion que abra las tablas.

=netuse('Tabla','Indices','Alias',.f.)

*--------------------------------------
* Abrir bases de datos ...
*--------------------------------------
function netuse
para cdatabase, cindex, calias, lopenmode, nseconds
priv mcdatabase, lforever, _err, messerr
mcdatabase = upper(m.cdatabase)
if 'AGAIN'$mcdatabase
mcdatabase = allt(strt(mcdatabase,'AGAIN',''))
endif
if empty(justext(mcdatabase))
mcdatabase = mcdatabase + '.DBF'
endif
if .not.file(mcdatabase)
wait 'Error DBF : ['+mcdatabase+'] No Ubicado...' wind nowa
retu(.f.)
endif

if .not.empty(m.cindex)
m.cindes = upper(m.cindex) + ','
do while .t.
m.pos_indic = at(',', m.cindes)
m.nom_indic = allt(substr(m.cindes,1,m.pos_indic-1))
if empty(justext(m.nom_indic))
m.nom_indic = m.nom_indic+'.IDX'
endif
if .not.file(m.nom_indic)
m.messerr = 'Indice '+m.nom_indic+' No Ubicado...'
*do ctrl_err WITH 0, m.messerr, mcdatabase, PROGRAM(), LINENO()
*do alert with 'Error al abrir '+mcdatabase+';Indice '+m.nom_indic+' No Ubicado...;Informe a Inform聽tica 颅 URGENTE !',7,'<Enter'
retu(.f.)
endif
m.cindes = stuff(m.cindes,1,m.pos_indic,'')
if empty(m.cindes) .or. lastkey()=27
exit
endif
enddo
endif

if param() <= 4
m.nseconds = 0
endif
m._err = 0

if empty(m.calias)
m.calias = cdatabase
endif

m.lforever = (round(m.nseconds,0) = 0)
do while (m.lforever .or. m.nseconds > 0)
m._err = 0
sele 0
if m.lopenmode
use &cdatabase. alia &calias. exclusive
else
use &cdatabase. alia &calias.
endif

if empty(m._err)
if .not.empty(m.cindex)
set index to &cindex.
endif
return (.t.)
endif

m.nseconds = m.nseconds - 1
if m.lforever .and. m.nseconds < -2
*do alert with 'Archivo ['+m.cdatabase+'] Ocupado;Consulte a Sistemas ...',7,'<Reintentar'
m.nseconds = 0
endif
enddo

return (.f.) && USE fails

Suerte

HernanCano
27 de Julio del 2004
Le铆 las respuestas de ls colegas, pero s贸lo me inclino por la de ON ERROR DO VERERROR. Necesitas un manejador de errores!!.
Tambi茅n puedes hacer lo siguiente:
**
if !file("ruta-completaAUX.DBF")
do mensaje with "El archivo AUX.DBF no existe. Pulse enter para cancelar"
do while inkey(0)<>13
enddo
return
endif
use AUX.DBF exclusive
zap
** y contin煤a
Tip: si est谩s trabajando con archivos en us s贸lo directorio, no necesitas la ruta-completa, s贸lo el nombre del archivo.
**
Hasta luego.