Solo para expertos foxpro 2.5 DOS !!!!
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.
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.
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
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
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
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
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
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
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 ?
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 ?
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
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
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
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
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.
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.
