Problema con error que VFP no me lo INDICO

582 views
Skip to first unread message

Arnaldo Toledano

unread,
Feb 20, 2016, 11:40:21 AM2/20/16
to publice...@googlegroups.com
Me preocupa un error que tenia y VFP nunca me lo INDICO.
Concretamente, tenia un TEXBOX, que tomaba un dato de un CURSOR.
La cuestión es que al momento de tomar el valor, me olvide del VALUE ,
INCORRECTO   thisform.Porcentaje = _Tabla.Porcentaje
CORRECTO      thisform.Porcentaje .Value = _Tabla.Porcentaje

VFP nunca me indico el error, y me llevo bastante tiempo encontrarlo.

Porque OCURRE ESTO ???
Alguien tiene idea ?

Arnaldo Toledano

Luis Maria Guayan

unread,
Feb 20, 2016, 1:23:14 PM2/20/16
to Comunidad Visual FoxPro en Español
thisform.Porcentaje = _Tabla.Porcentaje

No es un error, VFP interpreta que existe en ese formulario una propiedad llamada Porcentaje, cuando el programa pase por allí, recien debería saltar el error de tipo de datos inválidos o no existe la propiedad

 
Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español

Fernando D. Bozzo

unread,
Feb 20, 2016, 1:28:00 PM2/20/16
to Comunidad de Visual Foxpro en Español
Hola Arnaldo,

Yo hice la prueba, y sí me marca este error: "Text1 is a method, event or object", por lo que lo que podría estar pasando es que tengas un controlador de errores que esté saltando este error.


El código de prueba que usé es este:

*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (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

Arnaldo Toledano

unread,
Feb 22, 2016, 7:28:05 AM2/22/16
to publice...@googlegroups.com
Correcto.
Pasa por allí, y no muestra ERROR.
Ese es mi problema.
Entiendo perfectamente lo que me comentas Luis María.
Pero me llama la atención que no me daba error al pasar.


Arnaldo Toledano

Arnaldo Toledano

unread,
Feb 22, 2016, 7:32:53 AM2/22/16
to publice...@googlegroups.com
Primero supuse que me había equivocado y había definido una PROPIEDAD igual al TEXTBOX, por lo cual seria normal
que  NO DETECTARA el error.
Pero NO HABÍA ninguna propiedad con ese nombre.
Utilizo VFP 8.

Podrías explicarme que significa "un controlador de errores que esté saltando este error."


Arnaldo Toledano

Fernando D. Bozzo

unread,
Feb 22, 2016, 8:20:45 AM2/22/16
to Comunidad de Visual Foxpro en Español
Hola Arnaldo:

Vamos por partes:

1) Ante todo Luis María tiene razón, si el código antes no marcaba error y ahora sí, es poruqe antes no se ejecutaba esa línea y ahora sí y por eso ahora te da error. Pero esto depende de lo siguiente.

2) Que tengas un controlador de errores significa que tengas código para manejar errores, en cualquiera de sus formas posibles que permite VFP, y que sin querer estés salteando ese error por algún motivo o sin saberlo. Por ejemplo, las siguientes rutinas son controladores de errores que saltean errores:

Ejemplo 1: Saltear errores con ON ERROR
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
EndProc


Ejemplo 2: Saltear error con TRY/CATCH
Try
   thisform
.porcentaje = tabla.porcentaje
Catch
   
* No hace nada (saltea cualquier error)
EndTry


Hay muchas variantes más, pero en ambos casos las rutinas que deberían controlar el error no lo hacen y lo saltean.

Fuera de esto, como dijo Luis María, al no provocar un error de compilación, nunca te vas a enterar hasta que esa línea se ejecute (y solo si no salteas el error)

Arnaldo Toledano

unread,
Feb 22, 2016, 10:27:56 AM2/22/16
to publice...@googlegroups.com
Bien, te contesto por parte.
1.- NUNCA MARCO EL ERROR.
Me di cuenta cuando revise concienzudamente todo el código.

2.- Si bien tengo control de errores, estos errores que menciono  NO SE GRABARON.

Ademas estoy trabajando sobre el FORM directamente, no estoy trabajando con el EXE.
Por lo tanto el error tiene que mostrarse automáticamente.

En este momento tengo otro problema y el error tampoco me lo MARCA el VFP.
Concretamente, tengo un INSERT INTO sobre un cursor.
No me graba NADA, ni tampoco me indica donde esta el error.
Probablemente este en algún tipo de datos mal asignados, (quiero asignar un numérico a un carácter por ejemplo),

Por las dudas, hice un Appen blank y un replace.
EL appen blank funciona, no asi el replace.

No me cabe ninguna duda que he modificado algo y ese algo me esta JODIENDO y mucho.

Gracias Fernando por tu preocupación


Arnaldo Toledano

Fernando D. Bozzo

unread,
Feb 22, 2016, 10:38:36 AM2/22/16
to Comunidad de Visual Foxpro en Español
Hola Arnaldo:

Creo que ahora entiendo lo que te pasa. Supongo que es de esos errores que lógicamente no deberían ocurrir, pero que a veces ocurren y no se les encuentra explicación razonable.

Para poder diagnosticar eso, te convendría probar algunas de las cosas que te fallan fuera del formulario, por ejemplo en un PRG, y ver si funciona o no. Dependiendo de esto podemos ver cómo seguir.

Mis sospechas son varias, con los datos que diste hasta ahora:
- Posible salto de errores => Podrías publicar el código del form, o deshabilitar el control de errores
- Posible corrupción del form, que permite que se ejecute en parte sí pero fallando en otras cosas
- Posible corrupción de tu instalación de FoxPro o antivirus estorbando

Por cierto: ¿qué tipo de control de errores usas? ¿ON ERROR? ¿Evento Error del objeto? ¿Try/Catch?


Saludos.-

Antonio Meza

unread,
Feb 22, 2016, 10:54:25 AM2/22/16
to Comunidad de Visual Foxpro en Español
No creo que sea un problema de VFP que se salte!! es un error de dedo común y corriente que a todos nos pasa jajaja

Es decir según lo que el comenta, parece ser que tenia una propiedad con el mismo nombre del textbox, a lo mejor no lo recuerda y elimino o cambio el nombre de la propiedad o el nombre del textbox, o en su caso no pasaba por esas lineas, modifico algo que ahora hace que pase por ahí y de repente le aparece ese error que dice que nunca vio.

Me ha pasado muchas veces e incluso le ha pasado a varios aquí en el foro y todo es por no usar buenas practicas y pruebas unitarias jajajajaj

saludos
Antonio Meza

mapner

unread,
Feb 22, 2016, 11:42:55 AM2/22/16
to Comunidad de Visual Foxpro en Español
Estoy desarrollando algunas cosas en JAVA con IDE Eclipse y entre varias cosas buenas está el que resalta errores de este tipo en tiempo de edición, con lo cual a la hora de compilar el código es bastante más seguro, VFP (sin escatimar todo lo practico que tiene) y como tantos otros lenguajes que no son fuertemente tipados tienen el riesgo de que un error quede oculto hasta que no se ejecute esa línea de código. Cada ambiente con sus ventajas y desventajas.

Saludos

Martin Paredes

unread,
Feb 22, 2016, 12:35:09 PM2/22/16
to Comunidad de Visual Foxpro en Español
ya que estamos en esto, les comparto algo similar :

(Utilizo Una Laptop Con Windows 10 64 bits.)


STORE .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

Fernando D. Bozzo

unread,
Feb 22, 2016, 12:52:25 PM2/22/16
to publice...@googlegroups.com
Hola Martin:

Y es correcto que el compilador no detecte que ese "STORE .F. TO ..." como un error en un lenguaje dinámico, ya que se dan 2 cosas:
1) Que STORE permite múltiples asignaciones
2) Que el compilador no carga en memoria los objetos, por lo que no puede comprobar si el objeto o su propiedad existe

La única forma de comprobarlo (en un lenguaje dinámico) es cargando el objeto y enumerando las propiedades, que además también pueden ser dinámicas, lo que hace imposible esta comprobación.



Antonio Meza

unread,
Feb 22, 2016, 1:01:49 PM2/22/16
to Comunidad de Visual Foxpro en Español
Nunca compilaría un programa sin antes ejecutarlo y ver que trabaje bien, este error no es de VFP ni de su compilador es de dedo jajajaj

Es decir si ejecutas el código tendrás el error en pantalla, te saltas un paso en probar y pues obtienes el error ya en el ejecutable.

saludos
Antonio Meza

Martin Paredes

unread,
Feb 22, 2016, 1:18:52 PM2/22/16
to Comunidad de Visual Foxpro en Español
por supuesto que primero se prueba en ambiente de desarrollo, antes de liberarlo, me queda claro la explicacion compañeros....

Salds...
Mapasac


El sábado, 20 de febrero de 2016, 10:40:21 (UTC-6), tesys escribió:

Arnaldo Toledano

unread,
Feb 22, 2016, 1:20:49 PM2/22/16
to publice...@googlegroups.com
Te comento el ultimo error.
Desde un Form llamo a otro y le paso 4 parámetros.
Uno de ellos, lo estaba pasando como lógico, cuando en realidad tenia que ser NUMÉRICO.

En el segundo FORM, tengo este código.

Select Retention
Appe blank
REPLACE RetIdComp WITH thisform.Id_de_compras,;
        RetPerRet With "R",;
        RetCodRoP With ALLTRIM(thisform.retencion.codigo.Value),;
        RetNroRet WITH thisform.tipfor.value +thisform.tipCom.value+ thisform.prefij.Value+Thisform.NroCon.value ,;
        RetBasImp WITH thisform.Mto_Imponible.Value ,;
        RetAlicuo WITH thisform.por_Rete.Value,;
        RetMtoRet WITH thisform.Mto_Retecion.Value

Lo que esta en ROJO, era el error.
Es decir,  RetIdComp es numérico y thisform.Id_de_Compra , era logico.
EL error tendría que saltar automáticamente e indicármelo.
NO ME LO INDICA.
EL cursor NO SE CARGABA.

Se entiende ???
Ese es mi problema, que tengo que buscar detalladamente de donde viene el error.
Cuando en realidad en la primer linea del replace me tendría que indicar el error.

Descarto que sea el FORM corrupto, puesto que el FORM 2, es uno que he creado hace unas horas y no es para nada complejo.

Como te indique antes, estoy trabajando sobre el FORM directamente, por lo tanto NO HAY FUNCIÓN DE ERROR en ninguna parte.
Cuando genero el EXE, en el PRINCIPAL.PRG tengo un ON ERROR do ERRORES WITH MESSAGE( ), MESSAGE(1), PROGRAM( ), LINENO( )
Que esta funcionado bien.

Y en algunos casos, donde la situación amerita, tengo un Try/Catch.


Gracias nuevamente, sigo investigando para ver el problema de VFP


Arnaldo Toledano

Fidel Charny

unread,
Feb 22, 2016, 4:23:56 PM2/22/16
to Comunidad de Visual Foxpro en Español
Hacer un test de parámetros lleva poco tiempo y evita esas sorpresas desagradables.

Antonio Meza

unread,
Feb 22, 2016, 5:20:45 PM2/22/16
to Comunidad de Visual Foxpro en Español
Tesys,te comento que si algo uso mucho son parámetros por todos lados, en funciones, en métodos, en formularios, etc porque no uso variables publicas jejeej

Y claramente puedo ver tu error!!! no es error de VFP, porque cuando pasas parámetros de un formulario a otro estos no se reciben directamente en una propiedad del formulario, si no en una variable que hayas tu indicado en Lparameter, por lo tanto tu estas usando una propiedad del formulario y no una variable, si tu propiedad thisform.Id_de_compras tiene un valor inicial a Falso, cuando pases tu el parámetro del otro formulario no tiene nada que ver con la propiedad, por lo tanto la propiedad no cambia de valor cuando tu crees que si debería y ahí esta tu error, Ahora imagina que la propiedad  thisform.Id_de_compras es igual a Cero, pues aun cuando tu pases un parámetro con valor Falso, pues VFP no marcara error y se guardar Cero en tu tabla porque no estas usando el parámetro estas usando una propiedad.

Dudo mucho que sean problemas de VFP, normalmente son problemas de tantas horas viendo lineas de código, a mi me han pasado este tipo de detalles .

saludos
Antonio Meza

Fidel Charny

unread,
Feb 22, 2016, 5:33:28 PM2/22/16
to Comunidad de Visual Foxpro en Español
Antonio
Para mi modo de ver, Arnaldo omitió poner en el post el código de la recepción de parámetros. Eso es todo.
Si tenemos en el Init del form
LPARAMETERS param1,param2,param3,param4
Thisform.Id_Compras = param4
Pero se omite pasar el cuarto parámetro, su valor será .F.

LPARAMETERS param1,param2,param3,param4
IF VARTYPE(param4)#"N" or empty(param4)
           Messagebox("falta el parámetro 4 o está mal pasado.")
           RETURN .F.
ENDIF
Thisform.Id_compras = param4

Mario López

unread,
Feb 22, 2016, 5:43:10 PM2/22/16
to Comunidad de Visual Foxpro en Español
@Arnaldo: ejemplo simple:

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"

Esto tira un "Data type error" como debería, así que no es un "problema con error que VFP no indica".

HTH
Mario
----

Fidel Charny

unread,
Feb 22, 2016, 6:02:56 PM2/22/16
to Comunidad de Visual Foxpro en Español
Mario;
Este código (tomado del tuyo) no muestra ningún error:
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

Mario López

unread,
Feb 22, 2016, 6:16:25 PM2/22/16
to Comunidad de Visual Foxpro en Español
@Fidel: no muestra ningún error porque el CATCH TO se "traga" el error. No es ningún problema de VFP sino que es un error de programación, se supone que si uno espera alguna excepción especifica debería hacer algo como:

CATCH TO loEx WHEN loEx.Error==1584
CATCH TO loEx WHEN loEx.Error==...

Un CATCH sin WHEN es como hacer un ON ERROR *, deshabilita casi todos los errores, uno no puede quejarse de que VFP no de error en ese caso.

Mis 2 centavos,
Mario
---

Antonio Meza

unread,
Feb 22, 2016, 6:43:30 PM2/22/16
to Comunidad de Visual Foxpro en Español
Igual puede estar asignado el parámetro incorrecto a la propiedad, pueden ser muchos detalles y realmente no es problema de VFP.

Ahora bien Fidel estas suponiendo jajajajaj hay que ver lo que dice Tesys, me gustaría poder reproducir ese error que el comenta porque como comente anteriormente uso mucho los parámetros (soy fanboy de los parámetros como de los autoincrementables jajajaj) y NUNCA me ha fallado VFP.

saludos
Antonio Meza

Arnaldo Toledano

unread,
Feb 22, 2016, 6:45:09 PM2/22/16
to publice...@googlegroups.com
POR FIN ALGUIEN QUE INTERPRETO MI PROBLEMA  ! ! ! ! !
Mi problema es idéntico  a lo que vos planteas.
Si TRY
CATCH
Y el error NO ME LO TIRA VFP.

OJO, antes me lo tiraba.
Por lo tanto NO LO ATRIBUYO a VFP, sino a algo que he configurado mal.

Gracias Fidel

Arnaldo Toledano

Arnaldo Toledano

unread,
Feb 22, 2016, 6:52:48 PM2/22/16
to publice...@googlegroups.com
NO ES PROBLEMA DE PARÁMETROS ! ! ! ! !

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".
Que ocurre.
Cuando haces un BROW al cursor,e NO TIENE DATOS.
Y tenes que buscar como loco donde esta el problema.
Hay muchos métodos que utilizo para detectar estos problemas
Supongamos
APPE BLANK
Replace campo1 With text1,;
              campo1 With text2,;
             campon With Textn
El error puede estar en CUALQUIER LINEA ! ! !

Con un simple COPY PASTE podes dejar
Replace campo1 With text1
Replace campo1 With text2
Replace  campon With Textn

Y el error SALTA INMEDIATAMENTE ! ! ! ! !

Pero cuando NO TE SALTA EL ERROR QUE HACES ???????


Arnaldo Toledano

Antonio Meza

unread,
Feb 22, 2016, 8:04:36 PM2/22/16
to Comunidad de Visual Foxpro en Español
Tesys, mejor pon el código mas completo desde donde recibes los parámetros para ver como tomas los valores porque en el replace anterior usaste una propiedad y sin el código no sabemos si igualaste el valor de la propiedad con el parámetro, y ahora en tu ejemplo pues pasa lo mismo, usas text1, text2, etc pero de donde provienen? 

Como te digo uso mucho los parámetros y NUNCA he tenido un problema con ellos, si paso A pues A recibo, si paso 1 pues 1 recibo, me intriga saber que dices que VFP no te marca error por diferencia de valores.

saludos
Antonio Meza

Fernando D. Bozzo

unread,
Feb 23, 2016, 1:15:44 AM2/23/16
to publice...@googlegroups.com

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...

Fidel Charny

unread,
Feb 23, 2016, 6:51:53 AM2/23/16
to Comunidad de Visual Foxpro en Español
Arnaldo:
En el ejemplo TRY/CATCH/ENDTRY que puse, falta la instrucción de mostrar el error en el bloque Catch
Si hubiera puesto un código más completo y la función ShowError() está bien escrita, el error es informado inmediatamente.
En el blog de Fernando tenés un excelente tratamiento del tema.

TRY
    LOCAL
Loex as Exception
   
* Instrucciones con error
CATCH TO loex
   
ShowError(loex)    && prg que muestra los errores (objeto loex)
FINALLY
   
* Limpieza
ENDTRY

En algunos casos, conviene que el bloque CATCH no muestre un error, porque la situación de error será trabajada más abajo. Por ejemplo, para crear un objeto Excel / Word para automatización tengo este código:
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 loInstance

GetObject dará un error si Excel o Word no tienen una instancia creada. Pero el error no necesita mostrarse ni guardarse, sino tomarse encuenta para ejecutar  CreateObject() si hay error.
El segundo TRY si direcciona a la función de mostrar errores, porque el procedimiento será interrumpido y es bueno que el usuario sepa por qué.


Pero por otra parte, siempre es bueno realizar el test de parámetros (programación defensiva) porque podemos tener errores.

Arnaldo Toledano

unread,
Feb 23, 2016, 7:12:53 AM2/23/16
to publice...@googlegroups.com
Gracias Antonio.
Te reitero no es problema de Paramentos.

Gracias


Arnaldo Toledano

Mario López

unread,
Feb 23, 2016, 8:29:37 AM2/23/16
to Comunidad de Visual Foxpro en Español

No 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:

  • Cursor c_Movim no abierto
  • Cursor c_Movim de solo lectura
  • Campos MoSaldo, MoDebe o MoHaber inexistentes, de tipo no numérico o con valor NULL
  • Conflicto de actualización de datos

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

---



El martes, 23 de febrero de 2016, 3:15:44 (UTC-3), Fernando D. Bozzo escribió:

Arnaldo Toledano

unread,
Feb 23, 2016, 9:19:17 AM2/23/16
to publice...@googlegroups.com
Sinceramente me agoto el tema.
O yo soy muy boludo en explicar, o todos interpretan lo que quieren.
Creo que ocurre lo primero.

Gracias, y cierro el HILO

Arnaldo Toledano

HernanCano

unread,
Feb 23, 2016, 9:55:31 AM2/23/16
to Comunidad de Visual Foxpro en Español
Arnaldo:
>>> OJO, antes me lo tiraba.
>>> Por lo tanto NO LO ATRIBUYO a VFP, sino a algo que he configurado mal.

Haz lo que te indicamos: suprime el manejador de errores para que puedas descubrir que VFP sí muestra el error. La mejor forma de lograr ésto (suprimir el manejador de errores) es ejecutar el form independientemente, por fuera de la app... Y asegurarte que no hay ningún ON ERROR. TRY/CATCH ni ningún evento Error() activo en ese form al momento de ejecutar la instrucción donde se indica que hay error.

Otra forma si no quieres "suprimir manejador de errores (o si no sabes hacerlo)" es poner SET DEBUG ON y SET STEP ON unas líneas antes de la línea donde debería haber error y mirar por dónde pasa, por cuál PRG/procedure/function/clase/librería/instrucción/instrucciones.


HernanCano

unread,
Feb 23, 2016, 10:04:43 AM2/23/16
to Comunidad de Visual Foxpro en Español
Arnaldo:
No es posible que mientras el escenario sea el mismo....

Si ejecutas 
replace Campo1 with Text1
replace Campo1 with Text2
replace Campon with Textn


y sí aparece error; mientras que con 

replace Campo1 with Text1,;
        Campo1 with Text2,;
        Campon with Textn

no aparezca error CUANDO EL resto del ESCENARIO SEA EL MISMO.


El lunes, 22 de febrero de 2016, 18:52:48 (UTC-5), tesys escribió:
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".

...... 
...

HernanCano

unread,
Feb 23, 2016, 10:09:58 AM2/23/16
to Comunidad de Visual Foxpro en Español
Perdón la longitud del anterior. Siempre suprimo lo innecesario anterior, pero aquí parece que no se eliminó.

Fernando D. Bozzo

unread,
Feb 23, 2016, 11:24:53 AM2/23/16
to publice...@googlegroups.com

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

Arnaldo Toledano

unread,
Feb 23, 2016, 1:16:15 PM2/23/16
to publice...@googlegroups.com
Hago un ultimo intento.
1.- Parto de un FORM que es bastante complejo, puesto que involucra varias cosas.
a.- Compras con todas sus tablas
    Compras, Cta.Cte., forma de pagos, retenciones, percepciones, etc.
b.- Contabilidad ÍDEM
   Cabecera de asientos, detalle, saldos de cuentas, saldos mensuales de ctas.
c.- Bancos ÍDEM
    Movimientos bancarios, saldos de bancos, saldos mensuales de bancos.

El FORM ppal.

1


Cuando se trata de una RETENCIÓN o PERCEPCION, invoco a otro FORM.

1

Como pueden apreciar, el FORM de RETENCIONES , (Es el mismo de PERCEPCIONES), es un FORM MUY SENCILLO.
Recibe varios parámetros a SABER

PARAMETERS  Nro_Cuit,Monto_Rete,NetoGravado,Nro_Id_Compra,TipFor,TipCom,Caso

Tipo_Ret_Per.Caption=IIF(Caso,"Retenciones","Percepciones")
 
 
thisform.nro_Cuit.Value                   = Nro_Cuit
thisform.mto_Retecion.Value        = Monto_Rete
thisform.mto_Imponible.Value              = NetoGravado
thisform.Id_de_compras                 = Nro_Id_Compra

thisform.tipCom.Value                     =  TipCom'
thisform.tipfor.Value                        = TipFor
thisform.Es_Ret_Per                         = IIF(Caso,"R","P")
thisform.mto_Imponible.Value   = 000.00
thisform.por_Rete.Value                = 00.00
thisform.prefij.Value                        = SPACE(4)
thisform.nroCon.Value                    = SPACE(8)
thisform.retencion.codigo.SetFocus()


Una vez cargado la retenciones / percepcion, y el nro. del comprobante, al dar ACEPTAR,
grabo un CURSOR segun el siguiente codigo.
Este CURSOR, es definido en el FORM de COMPRAS.

BOTÓN ACEPTAR
IF EMPTY(thisform.retencion.codigo.Value)
   MESSAGEBOX("Debe ingresar un tipo de retención",48,"Mensaje de Compras")
   RETURN .F.
ENDIF
 

IF MESSAGEBOX("Esta de acuerdo con los datos consignados ",32+4,"Mensaje de Compras")<>6
   thisform.borrar.Click()
   RETURN .F.
ENDIF

SELECT Retencion
APPEND BLANK

REPLACE RetIdComp WITH thisform.Id_de_compras,;
        RetPerRet With thisform.Es_Ret_Per ,;

        RetCodRoP With ALLTRIM(thisform.retencion.codigo.Value),;
        RetNroRet WITH thisform.tipfor.value +thisform.tipCom.value+ thisform.prefij.Value+Thisform.NroCon.value ,;
        RetBasImp WITH thisform.Mto_Imponible.Value ,;
        RetAlicuo WITH thisform.por_Rete.Value,;
        RetMtoRet WITH thisform.Mto_Retecion.Value

thisform.monto_devuelto = thisform.mto_Retecion.Value
thisform.Release()

Los Valores en LILA, los saco de dos TEXTBOX NO VISIBLES, que son cargados con datos de la tabla PERCEPCION o RETENCIÓN.

DONDE SE DA EL ERROR :
En el thisform.Id_de_Compras
El Cual trae un valor del parámetro Nro_Id_Compra.
Cual es el ERROR ???

Desde compra mando un DATO LÓGICO, en vez de mandar un DATO NUMÉRICO .
YO ME EQUIVOCO, YO COMETO EL ERROR, no se estaba pensando que me iba a pescar, que ya empezaba mis vacaciones, (las cuales no he tomado todavía), no se
cualquier cosa.

Al momento de realizar el REPLACE, el error tiene que SALTAR.
Me tiene que indicar error en la LINEA

REPLACE RetIdComp WITH thisform.Id_de_compras,;
        RetPerRet With thisform.Es_Ret_Per ,;

        RetCodRoP With ALLTRIM(thisform.retencion.codigo.Value),;
        RetNroRet WITH thisform.tipfor.value +thisform.tipCom.value+ thisform.prefij.Value+Thisform.NroCon.value ,;
        RetBasImp WITH thisform.Mto_Imponible.Value ,;
        RetAlicuo WITH thisform.por_Rete.Value,;
        RetMtoRet WITH thisform.Mto_Retecion.Value


NO ME MARCA EL ERROR, NO ME DICE que estoy tratando de cargar en un CAMPO  NUMÉRICO un CAMPO LÓGICO.
VFP tendría que indicarmerlo.
Por lo tanto El CURSOR no tiene datos.
La búsqueda del error en estos casos es
tediosa.

Puesto que no se de donde proviene el ERROR.


Tanto en este FORM, como en el de COMPRAS , no hay NINGÚN ON ERROR, ni TRY /CACTH

NADA DE NADA.
Como explique antes, los errores lo tengo definido en el PRINCIPAL.PRG, donde tengo :

ON ERROR do ERRORES WITH MESSAGE( ), MESSAGE(1), PROGRAM( ), LINENO( )
El cual funciona correctamente.
PERO UNICAMENTE EN EL EXE.
NO CUANDO TRABAJO DIRECTAMENTE CON EL FORM.


Se entiende ahora ????


Arnaldo Toledano

Fernando D. Bozzo

unread,
Feb 23, 2016, 1:37:48 PM2/23/16
to publice...@googlegroups.com

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

Arnaldo Toledano

unread,
Feb 23, 2016, 2:01:51 PM2/23/16
to publice...@googlegroups.com
1.-ON ERROR no había probado.
Lo acabo de hacer, y no me grabo ningún error.

2.-En cuanto al SET STEP ON, lo había probado, y tampoco me marca ERROR.
3.- Con TRY /CATCH, me marca el error CORRECTAMENTE.

Pero.....
No me agrada andar utilizándolo SIEMPRE, en cada rutina

Arnaldo Toledano

Fernando D. Bozzo

unread,
Feb 23, 2016, 2:18:30 PM2/23/16
to Comunidad de Visual Foxpro en Español
Hola Arnaldo, hay algo muy raro en lo que estás comentando.

Si luego de pasar por el ON ERROR con SET STEP ON paso a paso, y sin saltear pasos, el REPLACE no te muestra un mensaje de error de Fox, es imposible que un TRY/CATCH en la misma zona sí te lo muestre, ya que para que TRY/CATCH lo atrape, primero debe saltar el error! (aquí no debe grabarlo, solo mostrar el mensaje nativo de Fox)

Y si esto realmente te pasa así, entonces no entiendo lo que pasa, porque va contra toda lógica :-(

Finalmente, y para evitar malentendidos: Supongo que lo del SET STEP ON lo probaste como sigue, no?

ON ERROR
SET STEP ON
REPLACE (lo que sea)...  && Aquí te debería saltar el mensaje de error de Fox


Saludos.-

Arnaldo Toledano

unread,
Feb 23, 2016, 2:20:59 PM2/23/16
to publice...@googlegroups.com
Correcto.
Tal cual lo indicas.

Pero acabo de encontrar lo siguiente
Si muestro los Lparameter del método ERROR del FORM Compra,
muestra los errores correctamente, incluso los del FORM RETENCIONES.

PERO NO ENCUENTRO por ningún lado donde invoco al MÉTODO  ERROR ! ! !


Arnaldo Toledano

El 23/02/2016 a las 04:18 p.m., Fernando D. Bozzo escribió:

Fernando D. Bozzo

unread,
Feb 23, 2016, 2:26:26 PM2/23/16
to publice...@googlegroups.com
Esto es de locos..... ¿ahora resulta que además de un ON ERROR genérico de aplicación tenías un evento Error de objeto?

¡Pero es que ése es el problema! Los eventos Error no se "llaman" desde ningún lado, por eso son "eventos", se ejecutan cuando ocurre un error en el objeto y tienen prioridad sobre el ON ERROR.

¿Qué código tenés en ese evento Error? ¿Podés ponerlo acá?





Arnaldo Toledano

unread,
Feb 23, 2016, 2:31:12 PM2/23/16
to publice...@googlegroups.com
NADA ! ! ! ! ! ! ! ! ! ! ! ! ! ! !
 Lo único que hay es
LPARAMETERS nError, cMethod, nLine

Que lo trae "de fabrica".

Pero si pongo

messagebox(nError)
Messagebox(cMethod)
messagebox(nLine)

Me muestra en todos los casos lo errores que tiene el FORM
Que de paso, me entere de un error que NO SABIA QUE EXISTÍA.

Entendes porque ESTOY LOCO ! ! ! !



Arnaldo Toledano

Fernando D. Bozzo

unread,
Feb 23, 2016, 2:36:15 PM2/23/16
to publice...@googlegroups.com
Joder Arnaldo, ¡eso lo que hace es SALTEAR CUALQUIER ERROR que haya!

Limpiá ese método, seleccioná todo el código y borralo.

Listo, fin del problema, ahora te tiene que mostrar el error.

Al final estabas cayendo en lo que te dije al principio de todo, tenían un controlador de errores que salteaba todos los errores.


Saludos.-


Arnaldo Toledano

unread,
Feb 23, 2016, 3:00:45 PM2/23/16
to publice...@googlegroups.com
Es que si lo borro, (Cosa que ya hice), me da error porque no están definidos los Lparameter.
EN TODOS LOS FORM, tengo exactamente lo mismo.
LPARAMETERS nError, cMethod, nLine
Cual es la diferencia ???
Que en este FORM, (COMPRAS), esta en NEGRITA el método, en todos los demás NO LO ESTA.

Es de locos.

Lo único que tengo con respecto a los errores, (que no tengo en los otros form), es la
rutina de errores que vos tenes en tu BLOG.
Donde creo una tabla, y voy "validando", cada TEXTBOX, lo cargo en la tabla, y a posteriori lo
muestro en OTRO FORM, indicando el error y la descripción del mismo.
Pero para ello, tengo un MÉTODOS; llamado Ver_errores que tiene algo asi
CREATE CURSOR _Tabla_Error(;
ErrCampos c(50),;
ErrDescri c(250))

SELECT _Tabla_Error

* Proveedor

If EMPTY(thisform.proveedor.codigo.value)
    SELECT _Tabla_Error
     APPEND BLANK
     REPLACE ErrCampos WITH "Proveedor", ErrDescri WITH "Tiene que ingresar el Proveedor"
ENDIF

Etc, etc, etc,
Y despues

Select _Tabla_Error

If Reccount()>0
    Do Form Mos_Errores
   Return .F.
endif

Return .T.




Arnaldo Toledano

Fernando D. Bozzo

unread,
Feb 23, 2016, 3:11:43 PM2/23/16
to publice...@googlegroups.com
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...

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.

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

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ó.


Saludos.-



Arnaldo Toledano

unread,
Feb 23, 2016, 3:23:01 PM2/23/16
to publice...@googlegroups.com
Te agradezco ENORMEMENTE tu preocupación y DOCENCIA.
Te comento.


El 23/02/2016 a las 05:11 p.m., Fernando D. Bozzo escribió:
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

Arnaldo Toledano

Carlos Miguel FARIAS

unread,
Feb 23, 2016, 3:35:59 PM2/23/16
to Grupo Fox
OFF TOPIC: En una de las pantallas dice NETRO GRAVADO supongo que debe ser NETO GRABADO
Donde dice periodo dice DIESCISEIS, entiendo debería ser DIECISÉIS.

Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe, un diccionario tiene todas las palabras, pero sin poesia

Arnaldo Toledano

unread,
Feb 23, 2016, 5:24:28 PM2/23/16
to publice...@googlegroups.com
Gracias Miguel.
Todavía no paso por el control de HORRORES ! ! !

Pero me libra de algunos reproches, antes que lo vea el corrector.


Arnaldo Toledano

Carlos Miguel FARIAS

unread,
Feb 24, 2016, 6:08:51 AM2/24/16
to Grupo Fox
Un día viernes.
Un Pato pisa a una Gallina
Pato: - Errar es humano.🐤
Gallina: - Perdonar es diviiiiiinooo !!!🐔
Disculpen, pero hoy tengo un día de miércoles.

Saludos: Miguel, La Pampa (RA)

Larga Vida y Prosperidad
Que la Fuerza los acompañe, la suerte está echada, quien la habrá pisado?

Reply all
Reply to author
Forward
0 new messages