*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (ES) AUTOGENERADO - ¡¡ATENCIÓN!! - ¡¡NO PENSADO PARA EJECUTAR!! USAR SOLAMENTE PARA INTEGRAR CAMBIOS Y ALMACENAR CON HERRAMIENTAS SCM!!
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.19" SourceFile="testform.scx" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS dataenvironment AS dataenvironment
*< CLASSDATA: Baseclass="dataenvironment" Timestamp="" Scale="" Uniqueid="" ClassIcon="2" />
DataSource = .NULL.
Height = 0
Left = 0
Name = "Dataenvironment"
Top = 0
Width = 0
ENDDEFINE
DEFINE CLASS form1 AS form
*< CLASSDATA: Baseclass="form" Timestamp="" Scale="" Uniqueid="" />
*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder
*< OBJECTDATA: ObjPath="Text1" UniqueID="" Timestamp="" />
Caption = "Form1"
DataSession = 2
DoCreate = .T.
Name = "Form1"
ADD OBJECT 'Text1' AS textbox WITH ;
Height = 23, ;
Left = 124, ;
Name = "Text1", ;
Top = 32, ;
Width = 100
*< END OBJECT: BaseClass="textbox" />
PROCEDURE Init
CREATE CURSOR cc (valor N(10,3))
INSERT INTO cc VALUES (10)
thisform.text1 = cc.valor
ENDPROC
ENDDEFINE
ON ERROR DO ManejoError WITH ERROR(), PROCEDURE(), MESSAGE()
thisform.porcentaje = tabla.porcentaje && Nunca saltará el error
Procedure ManejoError (tnERROR, tcPROCEDURE, tcMESSAGE)
* No hace nada (saltea cualquier error)
RETURN
EndProcTry
thisform.porcentaje = tabla.porcentaje
Catch
* No hace nada (saltea cualquier error)
EndTrySTORE .F. TO ThisForm.Pageframe1.Page1.lblprnmini,ENABLED, ThisForm.Pageframe1.Page1.chkprnmini.ENABLED
el compilador nunca detecto el error...
al ejecutar la aplicacion detecto el error de ThisForm.Pageframe1.Page1.lblprnmini,ENABLED
(MENSAJE DE ERROR: LBLPRNMINI ES UN METODO, EVENTO U OBJETO)
Salds...
Mapasac
General Escobedo, N.L. Mexico
TRY
LOCAL loEx
nId_de_compras = .T.
CREATE CURSOR c_Cursor ( ;
RetIdComp N(10, 2) ,;
RetPerRet C(1) ;
)
APPEND BLANK
REPLACE ;
RetIdComp WITH nId_de_compras,;
RetPerRet WITH "R"
CATCH TO loex
FINALLY
IF USED("c_Cursor")
SELECT c_Cursor
BROWSE
USE
ENDIF
ENDTRY Arnaldo, no sé si estoy entendiendo mal lo que acabás de comentar sobre try/catch, pero ese codigo justamente atrapa el error y lo salta, o sea que nunca te enteras de que hubo un error, y por eso Fidel dice que ese código no muestra el error...
TRY
LOCAL Loex as Exception
* Instrucciones con error
CATCH TO loex
ShowError(loex) && prg que muestra los errores (objeto loex)
FINALLY
* Limpieza
ENDTRY LPARAMETERS tcProgram , tlAvoidGetObject
*!* Name Get_Instance_Object
*!* tcProgram Excel,Word
*!* Propósito Crear una instancia de Excel o Word
*!* Devuelve Referencia Objeto Excel/Word o el valor null
*!* tlAvoidGetObject .T.: intenta generar una nueva instancia de Excel / Word
tcProgram=Proper(ALLTRIM(tcProgram))
LOCAL lcApp,;
lcName,;
lCreate,;
loInstance as Object
DO CASE
CASE tcProgram == "Excel"
lcApp="Excel.Application"
lcName = "Microsoft Excel ® "
CASE tcProgram == "Word"
lcApp = "Word.Application"
lcName = "Microsoft Word ® "
ENDCASE
*Determinar si hay una instancia de Excel creada.
IF !m.tlAvoidGetObject
TRY
LOCAL LoExisOb as Exception
loInstance = GETOBJECT( , m.lcApp )
CATCH TO loexisOb
ENDTRY
ENDIF
TRY
LOCAL LOEX AS EXCEPTION
lError = .f.
IF VARTYPE(loInstance) # "O"
loInstance = CREATEOBJECT( m.lcApp )
lCreate=.t.
ENDIF
CATCH TO loex
lError=.t.
loex.UserValue=IIF(m.lCreate,;
"No se pudo crear una instancia de "+m.lcName ,;
m.lcName + "no está instalado en este equipo")
ShowError(loEx)
loInstance = null
FINALLY
ENDTRY
RETURN loInstanceNo tiene sentido seguir tratando de adivinar cual es el problema: si a Arnaldo le parece que “VFP NO LE INDICA UN ERROR” debería postear el mínimo bloque de código que reproduzca dicho inconveniente. Por mi parte sigo estando seguro que hay un ON ERROR o un TRY / CATCH que oculta el error, entonces es un problema de programación en el mismo y no en VFP.
Hay que tener cuidado con la forma de usar el bloque TRY / CATCH, si no está bien usado termina no resultando muy distinto de un ON ERROR GOTOque hay en otros lenguajes, produciendo un salto de un punto del código a otro arbitrario sin la obligación de controlar el estado del programa a la salida del bloque.
Una buena práctica es usar bloques relativamente cortos en el TRY con excepciones controladas con CATCH ... WHEN para garantizar que se están procesando correctamente las excepciones que se producen o si no generan un error. Un ejemplo rápido:
TRY
UPDATE c_Movim SET MoSaldo = MoDebe - MoHaber
CATCH
MESSAGEBOX("Error de actualización", "Error", 16)
ENDTRY
Acá hay múltiples errores que pueden ocurrir en esa sola instrucciónUPDATE:
y el CATCH anterior asume que el error es de actualización, ocultando todas las otras posibles causas del error. En este mínimo ejemplo sería mucho mejor algo como:
#define UPDATE_ERRORS 1585
TRY
UPDATE c_Movim SET MoSaldo = MoDebe - MoHaber
CATCH TO oEx WHEN INLIST(oEx.Error, UPDATE_ERRORS)
MESSAGEBOX("Error de actualización", "Error", 16)
ENDTRY
Así, cualquier excepción no esperada dispararía un error como debería ser.
Ni hablar cuando dentro del TRY ... CATCH hay una llamada a un bloque de código, la cantidad de errores que puede producirse en el mismo aumenta exponencialmente.
Mis 2 centavos,
Mario
---
replace Campo1 with Text1replace Campo1 with Text2replace Campon with Textn
replace Campo1 with Text1,;Campo1 with Text2,;Campon with Textn
YO COMETO EL ERROR de enviar mal un parámetro, YO ME EQUIVOCO en enviar un dato vía DO FORM WITH aaa, bb,cc,ddd,eet,ccd etc, etc,etc.En vez de enviar un parámetro NUMÉRICO, envió un parámetro LÓGICO.Al momento de realizar un REPLACE.VFP NO ME INDICA EL ERROR, el cual tendría que ser "Data type error".
...
Arnaldo, date cuenta de que no pusiste ni siquiera el método completo que te falla, y solo pusiste lo que vos creíste importante o relevante. En esa situación es muy difícil que te puedas explicar bien o que se te pueda entender bien, y no queda otra que imaginar, proponer y preguntar más.
Los programadores entienden mejor el código que las explicaciones, además de ser más preciso :-D
Saludos


Hola Arnaldo, ahora se entiende.
Como no sé si probaste esto, y no perdés nada, te comento :
1) ¿Intentaste poner un ON ERROR así, sólo, justo antes del REPLACE? Esto es para asegurarse de que no hay ninguna interferencia del mismo en esa parte. Luego de la prueba lo podés quitar
2) Si ponés un SET STEP ON antes del REPLACE y seguís paso a paso, ¿el error sigue sin saltar?
Con esas 2 cosas deberías encontrarlo enseguida.
Saludos y ánimos, ya falta poco :-D
Hola Arnaldo:Te vendría bien leer sobre el evento Error, ya que existe desde que a FoxPro la agregaron el "Visual" delante, o sea, algo más de 20 años...
Lo lei, para poder hacer mi rutina de errores, la cual es bastante vieja y funciona muy bien.
Cuando usás clases, estas pueden heredar de otras clases, y eso implica heredar sus propiedades, eventos y métodos, todo.
Lo que me parece que te está pasando, es que en la clase de BASE de tu form hay un evento Error con ese LPARAMETERS y sin codigo (probablemente), aunque desde el mismo evento de error que limpiaste podés ver de donde hereda simplemente desplegando el Combobox que muestra las herencias.
La clase BASE no tiene nada en el evento ERROR.
En la herencia del mismo, no contien nada.
Revise todo, en ningun elemento, (combox, etc), que componen la clase BASE, tienen algo en el evento ERROR.
Para sacarme la duda, cree un FORM, a partir del creador de FORM automaticos del VFP, y el metodo ERROR, tiene exactamente lo mismo.
Incluso, cuando saco LPARAMETER del Metodo Error, me acusa de manera inmediata que tengo un ERROR.
Si nunca pensaste en usar el evento Error, entonces deberías limpiarlo de la clase de base, ya que un Evento Error con un LPARAMETERS y sin código es como un ON ERROR cuyo programa de captura de errores solo recibe los parámetros y no hace nada con ellos, o como el TRY/CATCH del ejemplo de Fidel, que atrapa el error y no hace nada con el.
Luego de que limpies el evento Error de tus clases de base, podés hacer lo mismo para las demás sub-clases, ya que en cada sitio que se ejecute un evento Error con un LPARAMETERS solo sin más código, estás SALTANDO todos los errores y el ON ERROR jamás te lo va a encontrar.
Para hacer la búsqueda de todos los "PROCEDURE ERROR" podés, por ejemplo, pasar tu proyecto a texto con FoxBin2Prg y hacer la búsqueda en los archivos *.??2
Ya lo hice con la herramiento REFERENCIA DE CODIGO del VFP, no encontre nada.
Otra cosa: Deberías usar Control de Código Fuente. Si esta modificación de abrir el evento Error y guardarla con el LPARAMETERS la hiciste hace poco, esto ya lo hubieras encontrado desde el día mismo en que hiciste eso, y no hubieras perdido todo este tiempo sin saber ni cuándo ni doned te pasó.
Es una buena practica, te comento que he tomado muchas de tu BLOG.
Saludos.-
Gracias Fernando, abrazo ENORME y nuevamente Gracias