Detener Proceso desde de un ERROR

1,341 views
Skip to first unread message

Sergio Hotmail

unread,
Oct 8, 2013, 12:56:29 PM10/8/13
to mundovis...@googlegroups.com
Buenos Dias,

Señores, saludos a todos.

Agradezco de su ayuda con lo siguiente…

Necesito después de capturar un error, cancelar la ejecución del programa y no continúe con la siguiente linea del código… 

Normalmente utilizaba el RETURN, pero este después de remitir el mensaje, continua en la siguiente linea que lo que no quiero… Luego utilice el RETURN TO MASTER pero este aparentemente me borra las variables que tenga cargadas hasta la publicas…

¿Que comando debo utilizar o como debo manejarlo?, gracias 

On ERROR DO CtrlErrores WITH ;

ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO()


Procedure CtrlErrores

PARAMETER merror, mess, mess1, mprog, mlineno

Messagebox('Se genero un error grave en el sistema, por favor contacte al administrador y reportar este mensaje.'+CHR(13)+CHR(13)+;

'Error número: ' + Chr(13) + Alltrim(STR(merror)) + Chr(13) + Chr(13) +;

'Mensaje del error: ' + Chr(13) + Mess + Chr(13) + Chr(13) +;

'Linea de codigo con error : ' + Chr(13) + Message(1)+ Chr(13) + Chr(13) +;

'Error en el numero de linea : ' + Chr(13) + LTRIM(STR(mlineno)) + Chr(13) + Chr(13)+;

'Programa que genera el error : ' + Chr(13) + mprog + Chr(13) + Chr(13) +;

'El proceso ejecutado se ha cancelado, por favor vuelva a intentarlo.' ;

,16,"cTitMes")


RETURN TO MASTER 

Endproc


Quedo atento a sus comentarios,

Graicas,

Sergio Santacruz Madrigal.
Bogota, Colombia.



Analyzer

unread,
Oct 8, 2013, 1:00:27 PM10/8/13
to mundovisualfoxpro
Pruebe con:

ON SHUT DOWN

CLEAR EVENTS

CANCEL

QUIT


Saludos!


--
_______________________________________________________________
Has recibido este mensaje porque estás suscrito al Grupo "Mundo Visual
FoxPro" de Grupos de Google.
 
Para anular la suscripción a este grupo, envía un mensaje a:
mundovisualfox...@googlegroups.com
---
Has recibido este mensaje porque estás suscrito al grupo "Mundo Visual FoxPro" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a mundovisualfox...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Analyzer

unread,
Oct 8, 2013, 1:03:40 PM10/8/13
to mundovisualfoxpro
En mi caso, uso esto para crear un archivo log de errores y poner los errores ahi.

*Main.prg

ON ERROR DO errHandler WITH ERROR( ), MESSAGE( ), MESSAGE(1), PROGRAM( ), LINENO( )

* Archivo errHandler.prg

PROCEDURE errHandler

PARAMETER merror, mess, mess1, mprog, mlineno

l_regerror =  'Error No. ' + ALLTRIM(STR(merror)) + CHR(13) + ;
               mess + CHR(13) + ;
              'llamado en: ' + mprog + CHR(13) + ;
              'linea No. ' + ALLTRIM(STR(mlineno)) + CHR(13)


lnAnswer =messagebox('Error numero: ' + LTRIM(STR(merror))+CHR(13)+;
mess+ CHR(13)+;
'Linea de código: '+mess1+CHR(13)+;
'Procedimiento: '+mprog, 2+48+512,'ERROR, MISISTEMA')

SET TEXTMERGE ON            

  SET TEXTMERGE TO 'log_errors.txt' ADDITIVE NOSHOW
  
  \< - - - - - - - - - - - - - - - - >

  \<<DATETIME()>>

  \<<l_regerror>>

  SET TEXTMERGE TO

  SET TEXTMERGE OFF

DO CASE
CASE lnAnswer = 3 &&Abort
*CANCEL
ON SHUTDOWN
CLOSE DATABASES
CLOSE ALL
QUIT
CLEAR EVENTS
ON SHUTDOWN
CASE lnAnswer = 4 &&Retry
RETRY
OTHERWISE
RETURN
ENDCASE

ON ERROR

ENDPROC


Saludos!

Sergio Hotmail

unread,
Oct 8, 2013, 2:56:33 PM10/8/13
to mundovis...@googlegroups.com
Analyzer

Gracias, por tu respuesta pero la idea es que genere el error pero puedan volverlo a intentar pues con los comandos que me describes:

ON SHUT DOWN me sacaría de la aplicación 
CLEAR EVENTS, frena la ejecución.
CANCEL, se revienta el programa.
QUIT, me sacaría de la aplicación.

Y lo que requiero es que simplemente cancele el proceso, me deje la aplicación activa y sus variables igual… 

De todas manera agradezco tu rápida respuesta,

SISM

Sergio Hotmail

unread,
Oct 8, 2013, 3:09:02 PM10/8/13
to mundovis...@googlegroups.com
Analyzer, gracias revisando me doy cuenta que el problema esta sobre el promedicimiento que llama el ON ERROR, estaba como privado y portanto la variable publica que estaba llamando "ctitmes" no pasaba su valor publico… 

On ERROR DO CtrlErrores WITH ;

ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO(), (Definir Variable de ctitmes que es el titulo)


Procedure CtrlErrores

PARAMETER merrormessmess1mprogmlineno

Messagebox('Se genero un error grave en el sistema, por favor contacte al administrador y reportar este mensaje.'+CHR(13)+CHR(13)+;

'Error número: ' Chr(13) + Alltrim(STR(merror)) + Chr(13) + Chr(13) +;

'Mensaje del error: ' Chr(13) + Mess Chr(13) + Chr(13) +;

'Linea de codigo con error : ' Chr(13) + Message(1)+ Chr(13) + Chr(13) +;

'Error en el numero de linea : ' Chr(13) + LTRIM(STR(mlineno)) + Chr(13) + Chr(13)+;

'Programa que genera el error : ' Chr(13) + mprog Chr(13) + Chr(13) +;

'El proceso ejecutado se ha cancelado, por favor vuelva a intentarlo.' ;

,16,cTitMes)


RETURN TO MASTER 

Endproc


Igual gracias.

SISM

HernanCano

unread,
Oct 8, 2013, 6:09:45 PM10/8/13
to mundovis...@googlegroups.com
Hola, Sergio.
======================================================================
Quizá ya solucionaste el impasse revisando tu modo de programación, pues dices que las vbles que tú considerabas públicas no estaban siendo consideradas públicas dentro de la app.
Pero hago este comentario por si alguien nos da un comentario.
======================================================================

Mi manejo de errores lo deduje personalmente según el standard de VFP, así:
Muestra al usuario estas opciones: Reintentar, Cancelar, Ignorar, Suspender.
Busqué comandos que ejecutarancada opción, y concluí:
- Reintentar es Retry.
- Suspender es Suspend.
- Ignorar es Return.
- Cancelar es Return to Master

1. Si estoy en una impresión (DOS-style!!!!) y la impresora está apagada, entonces si le doy Enter a Reintentar, se mostrará siempre Reintentar..... (lo explico con este ejemplo didácticamente para que se entienda mi método)
2. Si sé que no es necesario algo y puedo saltarlo (pasar la instruccion si ejecutarla), entonces le doy que la Ignore.
3. Si me dice que el archivo está ocupado por otro usuario en un proceso y no se puede usar en este momento, entonces le doy Cancelar.
4. Si estoy en modo de desarrollo y quiero salir a la ventana de comandos, le doy Suspender.

Pero también me doy cuenta que: en el cliente (en runtime, en tiempo de ejecución) no está disponible SUSPENDER, y que tampoco está disponible IGNORAR pues no le puedo dejar al cliente la decisión de si ignora un comando o no, ya que no se sabe qué instrucción es la se pretende ejecutar ni cuál es el motivo de la warning (del mensaje de error); es más en tiempo de desarrollo debo capturar errores simples ---que no cambian datos---- para solucionarlos de todas formas, es decir ANTE CUALQ ERROR REINTENTAR SI ES POSIBLE, o sino SE DEBE CANCELAR. Las otras dos no están disponibles.

Esto funciona muy bien para mí.

Pero me he encontrado con algo.

Los expertos en VFP usan READ EVENTS y ----analizando el resto de los dos escenarios: el mío con el que se usa para read events------- estos dos escenarios no son compatibles, por lo tanto nadie me ha podido ayudar al respecto. Así las cosas lo que te dicen es que ---ante un error--- se hace  CLEAR EVENTS y QUIT (incluso como ves aquí, no entiendo por que nuestro analista, y muchos otros, hacen CANCEL antes de QUIT).
Esta combinación de CLEAR EVENTS y QUIT es lo que nosotros (tú y yo) conocemos como ABORTAR, pero me parece que no es necesario "matar" nuestra app cada que hay un error o advertencia; debería haber una forma de enviarlo al menú de la misma app, que es lo que pretendemos con RETURN TO MASTER.

Espero que ahora haya alguien que entienda el "escenario" y nos pueda dar una luz.

============================================================
En tu manejador veo que siempre haces "RETURN TO MASTER", y considero que no es necesario que siempre canceles cualq operación; deberías dar la oprotunidad de REINTENTAR (que el cliente pulse ENTER sobre él---recuerda que los clientes pulsan Enter sin leer----, y de esta forma que se reintente una vez primero - o todas las que le dé Enter) (((---por ejm hasta que la red se restablezca pues ví que el cable estaba suelto y lo ajusté, o hasta que la impresora esté en línea pues estaba apagada y ya la prendí, o hasta que el otro usuario termine lo que estaba haciendo y ya va a terminar....)))
Pero ésto---si cumple en tu escenario, pues lo más importante al menos es que haces RETURN TO MASTER, similar a mí ((en vez de quit)).
============================================================

Analyzer

unread,
Oct 8, 2013, 11:41:57 PM10/8/13
to mundovisualfoxpro
Hernán,

No hago un CANCEL antes de un QUIT, porque si ves la línea del CANCEL viene "comentada con un asterisco".

DO CASE
CASE lnAnswer = 3 &&Abort
*CANCEL
ON SHUTDOWN
CLOSE DATABASES
CLOSE ALL
QUIT
CLEAR EVENTS
ON SHUTDOWN
CASE lnAnswer = 4 &&Retry
RETRY
OTHERWISE
RETURN
ENDCASE


Sobre purgar al usuario de la aplicación aquí es opcional para el usuario. Hasta programas muy complejos como word, excel suelen informar al usuario de un "Error desconocido" y detener la aplicación completamente.

Saludos!


Juan López

unread,
Oct 9, 2013, 12:48:52 AM10/9/13
to mundovis...@googlegroups.com
Utiliza TRY- CATCH - FINALLY

En el CATCH introduce el MessageBox que tienes en ON Error.
Y el Finally para poder controlar si deseas que siga en el procedimiento o no...
--
Saludos,

Juan López
juani...@gmail.com

Sergio Hotmail

unread,
Oct 9, 2013, 9:14:59 AM10/9/13
to mundovis...@googlegroups.com
HernanCano, Buenos dias

El modelo de control de errores, me parece muy interesante voy aplicarlo y por otra parte entendiste complemente el problema que tengo.

Ahora, creí a ver resuelto el problema, sin embargo, aunque defino:

On ERROR DO CtrlErrores WITH ;

ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO(), ctitmes


Pasando la variable "ctitmes" (que son el textos de la barra de títulos) en el modo de ejecución me continua enviando el mismo error:


Cuando corre la aplicación en modo desarrollo, no me ejecuta este problema y no tengo idea por que?

Ahora… Anteriormente me ejecutaba perfecto sin embargo cuando se encuentra al error por cualquier motivo me remitía al ON ERROR al cual después de aplicar el mensaje disponía RETURN… El problema como bien lo dices y apenas después de mucho tiempo me doy cuenta que este retorna del procedimiento al código principal, pero continua la ejecución del código principal… Y el resultado un desorden total en mis datos MySQL al generar almacenamiento de grandes bloques de códigos con TRANSACCIONES, ya que lo recolectaba pero con otro ID de conexión… Por ello aplique el RETURN TO MASTER… Ahora aplique RETURN TO MASTER sobre el código principal donde tenia RETURN para que CANCELE la operación, pero esto al parecer me genera el mensaje de error descrito antes….

Ayer después de creer que lo había arreglado, cuando dispuse la aplicación en un primer cliente, comenzó a generarme el error y tuve cancelar la actualización de versión… Y son bastantes usuarios.

La variable CTITMES es publica, ya que esta creada sobre el MAIN de la aplicación, el procedimiento al cual se refiere ON ERROR esta sobre un achico de procedimientos que enlazo en el MAIN…

Ahora, pues lo logico seria quitar los RETURN TO MASTER del código principal de los formularios a RETURN dejando como estaba… Pero me que la pregunta es, si esto soluciona el problema del error como hago para cancelar el recorrido del código principal??? Para evitar entradas de datos que no deberían suceder….

Gracias por los comentarios,

SISM

De: HernanCano <jherna...@gmail.com>
Responder a: "mundovis...@googlegroups.com" <mundovis...@googlegroups.com>
Fecha: Tue, 8 Oct 2013 15:09:45 -0700 (PDT)
Para: "mundovis...@googlegroups.com" <mundovis...@googlegroups.com>
Asunto: Re: [Mundo Visual FoxPro] Detener Proceso desde de un ERROR

Sergio Hotmail

unread,
Oct 9, 2013, 9:16:34 AM10/9/13
to mundovis...@googlegroups.com
Juanillofox, buen día.
Tienes un ejemplo… Nunca he utilizado el TRY CACH FINALLY

Gracias

SISM


De: Juan López <juani...@gmail.com>
Responder a: "mundovis...@googlegroups.com" <mundovis...@googlegroups.com>
Fecha: Wed, 9 Oct 2013 06:48:52 +0200
Para: "mundovis...@googlegroups.com" <mundovis...@googlegroups.com>
Asunto: Re: [Mundo Visual FoxPro] Detener Proceso desde de un ERROR

Fidel Charny

unread,
Oct 9, 2013, 9:39:11 AM10/9/13
to mundovis...@googlegroups.com
Perdón por meterme en este hilo.
Dices "La variable CTITMES es publica, ya que esta creada sobre el MAIN de la aplicación"

Esa variable será pública si la defines en cualquier parte como:
PUBLIC CTITMES
ctiTMes=el_valor_que_corresponda

De otra forma es PRIVATE.
Por estar definida en el main, como dices, la variable no muere, pero la visibilidad depende de que un procedimiento derive o no del Main.prg. 

Analyzer

unread,
Oct 9, 2013, 10:42:57 AM10/9/13
to mundovisualfoxpro
A veces me pregunto por qué la gente inventa cosas jeje

Veo esto en tu código:

On ERROR DO CtrlErrores WITH ;

ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO(), ===> ctitmes <=== Esto es un invento tuyo.


La ayuda no indica que se pueda poner un parámetro adicional al comando ON ERROR.

ON ERROR   [Command]
Parámetros
Command
Especifica el comando de Microsoft Visual FoxPro que se va a ejecutar. Una vez ejecutado el comando, la ejecución del programa se reanuda en la línea siguiente a la que originó el error. No obstante, si el procedimiento de manipulación de errores incluye RETRY, se vuelve a ejecutar la línea del programa que originó el error.

Si el comando especifica un procedimiento a ejecutar cuando se produce un error, puede utilizar ERROR( ), MESSAGE( ), LINENO( ) y PROGRAM( ) para pasar el número de error, el mensaje de error, el número de línea del programa y el nombre del programa al procedimiento. Esta información puede utilizarse para corregir la causa del error.

Supongo que el error que te da el compilador es bastante obvio.

En este caso, VFP no te permite poner parámetros adicionales en una instrucción nativa.

Saludos!
Captura de pantalla 2013-10-09 a la(s) 7.53.58.png

Sergio Hotmail

unread,
Oct 9, 2013, 11:13:26 AM10/9/13
to mundovis...@googlegroups.com
Analyzer, buen dia.

Gracias por tu aporte… 

Bueno CTITMES, es invento mio así como cualquier otra variable que le quieras disponer a un procedimiento al cual le estés pasando parámetros:

Procedure CtrlErrores

PARAMETER merrormessmess1mprogmlineno, lctitmes

Messagebox('Se genero un error grave en el sistema, por favor contacte al administrador y reportar este mensaje.'+CHR(13)+CHR(13)+;

'Error número: ' Chr(13) + Alltrim(STR(merror)) + Chr(13) + Chr(13) +;

'Mensaje del error: ' Chr(13) + Mess Chr(13) + Chr(13) +;

'Linea de codigo con error : ' Chr(13) + Message(1)+ Chr(13) + Chr(13) +;

'Error en el numero de linea : ' Chr(13) + LTRIM(STR(mlineno)) + Chr(13) + Chr(13)+;

'Programa que genera el error : ' Chr(13) + mprog Chr(13) + Chr(13) +;

'El proceso ejecutado se ha cancelado, por favor vuelva a intentarlo.' ;

,16,lctitmes)


RETURN TO MASTER 

Endproc


Hasta donde tengo entendido, ON ERROR estoy ejecutando un procedimiento CtrlErrores con los parámetros descritos…

Ahora, tienes razón inicialmente creí era eso pero… El problema sigue siendo la variable que aparentemente no esta publica… 

Pero he realizado la prueba y sigue el mismo problema… Ahora remplazo el RETURN TO MASTER por RETURN y ya no muestra el error… Lo peor es que cuando lo correo en modo desarrollo no me genera el error de la variable…. Y me quedo con el problema de no poder cancela el recorrido de la ejecución del código principal.

Gracias.

SISM

Guillermo MDQ

unread,
Oct 9, 2013, 11:42:55 AM10/9/13
to mundovis...@googlegroups.com
El problema lo tienes en que momento le pones el valor a la variable cTitmes.

Prueba poniendole valor antes del on error:

cTitmes="ALGO"

On ERROR DO CtrlErrores WITH ;

ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO(), ctitmes



Saludos
Guillermo

Erwin Vera (gmail)

unread,
Oct 9, 2013, 11:42:51 AM10/9/13
to mundovis...@googlegroups.com

La variable cTitMes es privada dentro de la forma, por eso al pasarla dentro del on error no se ve, eso tiene el problema de que al haber varias formas activas en ese momento, cuál sería el cTitMes activo?, no tendrías como saberlo, creo que debes usar otra forma para reconocer donde te encuentras en ese momento y tomarlo para el on error

image001.png

Sergio Hotmail

unread,
Oct 9, 2013, 12:12:00 PM10/9/13
to mundovis...@googlegroups.com
Valido.

Sergio Hotmail

unread,
Oct 9, 2013, 12:32:54 PM10/9/13
to mundovis...@googlegroups.com
Fjcharny, buen dia.

Tienes razón y me pusiste a revisar el tema con lo cual ya encontré la fuente del problema….

Pero en lo referente si las plublicas en el MAIN, te quedan publicas para el resto del programa… Ahora seguramente no es lo correcto pero funciona… Pero muy buen aporte

El problema creo radica en que la aplicación primero ejecuta un programa que se llama "ACTUALIZADOR" el cual verificar la versión del programa real llamado "INNO" para confrontarla contra otra que se dispone en una carpeta publica de la red local del cliente… Si la versión del cliente es diferente a la que se encuentra en la carpeta publica, lo actualiza.. Bueno remplaza el archivo INNO del equipo cliente y luego lo ejecuta (INNO)

… Ahora como el error se esta generando por disponer en el código RETURN TO MASTER que es el comando requerido para cancelar la ejecución en INNO aparentemente al utilizarlo retorna al código del ACTUALIZADOR y este lógicamente no tiene las variables del segundo…

Me doy cuenta de esto porque al ejecutar el ACTUALIZAR me genera el error y cuando ejecuto el INNO este NO me genera el error… 

MAIN del ACTUALIZADOR

Set Procedure To "progs\FDUS"

FINDVER() && Verifica e inicia el programa

DO 'INNO201301.EXE' && Ejecuta el programa


Entonces la pregunta seria como ejecuto el otro programa (INNO) sin el comando DO con otro comando desde el shell ???

Gracias por la ayuda.

SISM

Sergio Hotmail

unread,
Oct 9, 2013, 12:33:25 PM10/9/13
to mundovis...@googlegroups.com
Si funciona.

Sergio Hotmail

unread,
Oct 9, 2013, 12:43:03 PM10/9/13
to mundovis...@googlegroups.com
Bueno aparentemente, encuentro la solución como lo expreses al ejecutar la aplicación desde el SHELL aplicando el siguiente código, del autor referenciado:

FINDVER() && Verifica e inicia el programa

launchProgram("INNO201301.EXE")


*DO 'INNO201301.EXE' && Ejecuta el programa


* Fuente: Victor Espina

* Base: Grupos Mundo Visual FoxPro Google

* Enlace: https://groups.google.com/forum/#!topic/publicesvfoxpro/bMeX_q7c1Mg

PROCEDURE launchProgram(pcProgramLocation

LOCAL cCurrentFolder,cProgramFolder 

cCurrentFolder = SET("DEFAULT") + CURDIR() 

cProgramFolder = JUSTPATH(pcProgramLocation


LOCAL oWSH 

oWSH = CREATEOBJECT("WScript.Shell"

SET DEFAULT TO (cProgramFolder

oWSH.Run(pcProgramLocation,0,.T.

SET DEFAULT TO (cCurrentFolder

ENDPROC 


Gracias a todos por sus aportes,

SISM

De: Sergio Santacruz Madrigal <sisant...@hotmail.com>
--

Juan López

unread,
Oct 9, 2013, 12:46:47 PM10/9/13
to mundovis...@googlegroups.com
local loExcep as Exception, ....
TRY 
*- Bloque de Sentencias a Ejecutar
-----
-----
IF .....
error "No cumple lo establecido por..." && Error controlado numerado como 1098 de forma automática.
endif
-----
-----
*- Te pongo como ejemplo para controlar que el Objeto Excel está cargado en alguna parte del programa y deseo controlarlo
CATCH TO loExcep 
IF VARTYPE(MD_oExcel) $ "O"
llExcel = .T.
ELSE
llExcel = .F.
ENDIF
DO CASE 
CASE loExcep.ERRORNO = 1098
MESSAGEBOX(loExcep.MESSAGE)
CASE loExcep.ERRORNO = 5
MESSAGEBOX("Finalizado a petición del usuario")
other 
MESSAGEBOX(TRANSFORM(loExcep.ERRORNO) + " " + loExcep.MESSAGE)
*-- Existe más detalles para poder controlar con la excepción realizada y no tienes que crear un nuevo procedimiento para pasar valor por la variable que deseas.
endc
FINALLY && Controla la parte que se debe ejecutar si o si.
IF llExcel
MD_oExcel.QUIT
MD_oExcel = .NULL.
RELEASE MD_oExcel
ENDIF
IF used("zhFich") 
SELECT ("zhFich")
BROWSE TITLE "Cursor de Resultados de la importación Excel" ;
FOR zhFich.Id_Fich >= lnIncremento 
ENDIF
*REPLACE zhTFich.Selecciona WITH .F. ALL IN ("zhTFich")
ENDTRY
ENDWITH

Saludos,

Juan López
juani...@gmail.com

HernanCano

unread,
Oct 9, 2013, 12:58:27 PM10/9/13
to mundovis...@googlegroups.com
Amigo analista:
Cuidado con lo que dices!!!

>>>... VFP no te permite poner parámetros adicionales en una instrucción nativa....

Estás equivocado...



El miércoles, 9 de octubre de 2013 09:42:57 UTC-5, Analyzer escribió:
A veces me pregunto por qué la gente inventa cosas jeje

Veo esto en tu código:

On ERROR DO CtrlErrores WITH ;

ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO(), ===> ctitmes <=== Esto es un invento tuyo.


La ayuda no indica que se pueda poner un parámetro adicional al comando ON ERROR.

ON ERROR   [Command]

Supongo que el error que te da el compilador es bastante obvio.

En este caso, VFP no te permite poner parámetros adicionales en una instrucción nativa.

Saludos!


HernanCano

unread,
Oct 9, 2013, 1:04:42 PM10/9/13
to mundovis...@googlegroups.com

Correcto, Sergio; esa es la solución,,, al principio no habías indicado que usabas el lanzador.

Te comento algo que te puede servir para tu knowledgebase.

También puedes usar algo como
RETURN TO MAIN
donde le indicas al motor que se regrese al programa que le estás diciendo, que es MAIN.PRG en tu caso.

Sergio Hotmail

unread,
Oct 9, 2013, 1:06:10 PM10/9/13
to mundovis...@googlegroups.com
Valido, gracias.

Analyzer

unread,
Oct 9, 2013, 1:07:06 PM10/9/13
to mundovisualfoxpro
Hernán,

Sé que un procedimiento creado por el programador puedes ponerle los parámetros que tu consideres.

Lo que me dices me hace preguntarte. Por ejemplo, en un messagebox, podrías tu ponerle más parámetros al mensaje o solo los que VFP de forma nativa te permita?..


Saludos!


Sergio Hotmail

unread,
Oct 9, 2013, 1:08:09 PM10/9/13
to mundovis...@googlegroups.com
Jajajajaja, excelente!!!! Pero bueno aplique varios cambios de acuerdo con sus recomendaciones …

Muchas gracias

SISM

De: HernanCano <jherna...@gmail.com>
Responder a: "mundovis...@googlegroups.com" <mundovis...@googlegroups.com>
Fecha: Wed, 9 Oct 2013 10:04:42 -0700 (PDT)
Para: "mundovis...@googlegroups.com" <mundovis...@googlegroups.com>
Asunto: Re: [Mundo Visual FoxPro] Detener Proceso desde de un ERROR

Sergio Hotmail

unread,
Oct 9, 2013, 1:56:15 PM10/9/13
to mundovis...@googlegroups.com
Me incluyo, messagebox no , pero en el caso de ON ERROR si porque estas ejecutando un programa o un procedimiento… En caso de ser un procedimiento puedes disponer las variables que tengas para metrizadas en el mismo.

Saludos.

SISM

De: Analyzer <thenewin...@gmail.com>
Responder a: "mundovis...@googlegroups.com" <mundovis...@googlegroups.com>
Fecha: Wed, 9 Oct 2013 12:07:06 -0500
Para: "mundovis...@googlegroups.com" <mundovis...@googlegroups.com>
Asunto: Re: [Mundo Visual FoxPro] Detener Proceso desde de un ERROR

Víctor Hugo Espínola Domínguez

unread,
Oct 10, 2013, 11:00:11 AM10/10/13
to mundovis...@googlegroups.com
Hola Analizer

Veo que a pesar de lo mencionado por Hernán aún no te das cuenta de la confusión de conceptos, trataré explicarlo:

On ERROR DO CtrlErrores WITH ;

ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO(), ===> ctitmes <=== Esto es un invento tuyo.


La ayuda no indica que se pueda poner un parámetro adicional al comando ON ERROR.
ON ERROR   [Command]

Lo que hizo el compañero es sustituir [Command] por  DO CtrlErrores WITH ;

ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO(), ctitmes


En otras palabras: ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO(), ctitmes son parámetros del comando DO CtrlErrores y NO del comando ON ERROR.

Saludos,
Víctor.
Lambaré - Paraguay.

HernanCano

unread,
Oct 10, 2013, 8:19:05 PM10/10/13
to mundovis...@googlegroups.com
((Disculpen contestar tarde))

Sí, Analista. En el MessageBox no se puede usar más parámetros que los que se permita nativamente.
Pero en el ON ERROR si se puede usar cualquier cantidar de parámetros....(entendiendo lo que dijo algún colega ya. es decir no estrictamente en el ON ERROR si no en el DO MANERROR).

Espero que lo sgte aclare el panorama:

1.
Y sí como se incluye la vble cTitMes en los parámetros del ON ERROR DO....., también se debe incluir en la lista de parámetros que recibe el manejador de errores, algo así como:


On ERROR DO CtrlErrores WITH ;

ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO(), cTitMes


Procedure CtrlErrores

PARAMETER merror, mess, mess1, mprog, mlineno, mTitMes

Messagebox('Se genero un error grave en el sistema, por favor contacte al administrador y reportar este mensaje.'+CHR(13)+CHR(13)+;

'Error número: ' + Chr(13) + Alltrim(STR(merror)) + Chr(13) + Chr(13) +;

'Mensaje del error: ' + Chr(13) + Mess + Chr(13) + Chr(13) +;

'Linea de codigo con error : ' + Chr(13) + Message(1)+ Chr(13) + Chr(13) +;

'Error en el numero de linea : ' + Chr(13) + LTRIM(STR(mlineno)) + Chr(13) + Chr(13)+;

'Programa que genera el error : ' + Chr(13) + mprog + Chr(13) + Chr(13) +;

'El proceso ejecutado se ha cancelado, por favor vuelva a intentarlo.' ;

,16, mTitMes ) &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"cTitMes")


RETURN TO MASTER 

Endproc



2.
Otra alternativa es:
Sabiendo que cTitMes es pública, no la uses en el llamada del ON ERROR, más o menos así:

On ERROR DO CtrlErrores WITH ;

ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO()   &&&&&&&&&&&&&&&&&&, cTitMes


Procedure CtrlErrores

PARAMETER merror, mess, mess1, mprog, mlineno

Messagebox('Se genero un error grave en el sistema, por favor contacte al administrador y reportar este mensaje.'+CHR(13)+CHR(13)+;

'Error número: ' + Chr(13) + Alltrim(STR(merror)) + Chr(13) + Chr(13) +;

'Mensaje del error: ' + Chr(13) + Mess + Chr(13) + Chr(13) +;

'Linea de codigo con error : ' + Chr(13) + Message(1)+ Chr(13) + Chr(13) +;

'Error en el numero de linea : ' + Chr(13) + LTRIM(STR(mlineno)) + Chr(13) + Chr(13)+;

'Programa que genera el error : ' + Chr(13) + mprog + Chr(13) + Chr(13) +;

'El proceso ejecutado se ha cancelado, por favor vuelva a intentarlo.' ;

,16, M.cTitMes )

RETURN TO MASTER 

Endproc


Listo....

Carlos Miguel FARIAS

unread,
Oct 11, 2013, 6:04:34 AM10/11/13
to mundovisualfoxpro

me parece que hay que prever que al momento de producirse el error, la variable cTitMes debe existir, si no, va a dar error la sentencia do que se puso en el on error.
El on error es global, entonces esta vigente en todos lados.
Si esa variable al momento de un error en otro lado no se definió. fuiste.
Saludos: Miguel, La Pampa (RA)

Erwin Vera (gmail)

unread,
Oct 11, 2013, 11:14:52 AM10/11/13
to mundovis...@googlegroups.com

Disculpen que me meta, pero les recuerdo que VFP es OOP y al haber la posibilidad de que puedas invocar una forma desde otra hace que al estar en cualquier forma, la variable pública “cTitMes” tenga es el valor de la última forma invocada, pero, imaginemos que llamé 3 formas diferentes una detrás de otra o desde un menú X y se deja un proceso activo en alguna de ellas, pero ya no me encuentro en ella por que cambie el focus?

En ese momento cTitMes, no necesariamente tiene la forma que da el problema, sino la de la última forma que lo actualizó, por lo que el error pudiera mostrar una forma que no es la que genera la falla!. Ahora, alguien me explica para que quieren hacer eso?

 

De: mundovis...@googlegroups.com [mailto:mundovis...@googlegroups.com] En nombre de Carlos Miguel FARIAS
Enviado el: viernes, 11 de octubre de 2013 05:35 a.m.
Para: mundovisualfoxpro
Asunto: Re: [Mundo Visual FoxPro] Detener Proceso desde de un ERROR

 

me parece que hay que prever que al momento de producirse el error, la variable cTitMes debe existir, si no, va a dar error la sentencia do que se puso en el on error.

Carlos Miguel FARIAS

unread,
Oct 11, 2013, 4:58:25 PM10/11/13
to mundovisualfoxpro

A partir de la versión 9 hay una función que te devuelve la pila de llamadas. Al momento del error, la invocas y te es la pista de donde se planto. Program también devuelve los programas pero no con la data tan completa.


Saludos:Miguel, La Pampa (RA)

HernanCano

unread,
Oct 14, 2013, 12:32:07 AM10/14/13
to mundovis...@googlegroups.com
Sí, pero la vble ya tiene el valor cambiado y de ahí el problema.

HernanCano

unread,
Oct 14, 2013, 12:34:22 AM10/14/13
to mundovis...@googlegroups.com
Correcto.
Ojalá Sergio se dé cuenta.
Reply all
Reply to author
Forward
0 new messages