FoxPro/Visual FoxPro - Error en Visual Fox

   
Vista:

Error en Visual Fox

Publicado por sergio (697 intervenciones) el 05/10/2009 16:59:50
Hola gente
El error que me esta dando el visual fox es el siguiente

Fatal Error :Exception C0000005
Called From - getmensaje line 0 {c:\windows\system32\vfp6r.dll }
Haber si alguien me puede dcir por donde buscar este error o que significa
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Error en Visual Fox

Publicado por juan286 (179 intervenciones) el 06/10/2009 12:17:59
K onda

Este comportamiento se produce cuando se intenta acceder a una propiedad no válida de un objeto.

En tu caso es el getmensaje line 0

Conozco ese tipo de error, de hecho en VisualFox cuando se genera en alguna aplicación o ejecutable un error cualquiera, automáticamente se guarda en un archivo (Ej.: vfp7err.log) los errores con información importante para poder determinar donde se produce el error. En mi caso lo eh encontrado en la carpeta "C:\Archivos de programa\Archivos comunes\Microsoft Shared\VFP\". A continuación te pasteo un ejemplo que a mí me ocurrió:

Mostrar/Ocultar Número de línea | Expandir/Contraer | Seleccionar todo

Fatal error: Exception code=C0000005 @ 09/20/04 09:35:10 AM. Error log file: C:\Archivos de programa\Archivos comunes\Microsoft Shared\VFP\vfp7rerr.log
Called from - frmfind.op.p2.txtdato.interactivechange line 38 {c:\seime\forms\frmfind.sct c:\seime\forms\frmfind.sct}
Called from - frminout.cmdfind.click line 13 {c:\seime\forms\frminout.sct c:\seime\forms\frminout.sct}
Called from - frmmain.toolbar01.cmdprof.click line 3 {c:\seime\forms\frmmain.sct c:\seime\forms\frmmain.sct}
Called from - digiarm line 39 {C:\SEIME\progs\digiarm.prg c:\seime\digisoft.exe}

Primero te indica el error (en este caso C0000005), la fecha y la hora en que ocurrió. Pero lo más importante es que escribe los eventos y las líneas que provocaron el error. Como se puede observar hay varios eventos tabulados, el primero (frmfind.op.p2.txtdato.interactivechange line 38) es el que indica en que línea exactamente se produjo el error, los siguientes son los eventos precedentes para llegar a esa parte del código, por lo que su interpretación es de abajo hacia arriba.

En este caso en particular, parto de un ejecutable llamado digisoft.exe, en el programa digiarm.prg indica la línea en que se inicia el procesamiento de eventos con READ EVENTS.
La siguiente indica que en el formulario frmmain.sct por medio del evento frmmain.toolbar01.cmdprof.click en la línea 3 se abre el formulario llamado frminout.sct, del cual por medio del evento frminout.cmdfind.click en la línea 13 llama al formulario frmfind.sct, y en este ultimo por medio del evento frmfind.op.p2.txtdato.interactivechange específicamente llegamos a la línea 38 en donde se produjo el error C0000005 y me saca del problema.

Siguiendo esta información, el error se producía en un proceso de búsqueda, ya que el formulario en el que estaba me servía para buscar información de artículos de inventario. El problema radicaba en el manejo de las áreas y punteros de este formulario y del formulario precedente frminout.sct. En este hacia uso de la información recolectada en el anterior y realizaba una búsqueda, accesando una tabla de la misma base de datos de la consulta del formulario frmfind.sct.

Cuando uno trabaja con archivos, es importante llevar un control en el manejo de apertura de áreas y punteros. Ya que las áreas son espacios de memoria (buffer). Mi error consistía en abrir una base de datos (OPEN DATABASE), luego una tabla con el SELECT, cerraba la tabla con él USE, pero no liberaba correctamente el buffer de la base de datos. Al realizar varias consultas, acumulaba X cantidad de buffers (las veces que se realizaba esta operación) y llegaba un momento en que el espacio de memoria de buffers era demasiado grande y es en ese momento en que se producía el error.

Solución: cambie la forma de consultar las tablas, procuro utilizar mas consultas en vez de abrir las bases de datos, y al realizar consultas liberó los punteros de las tablas involucradas por medio del USE. Por ejemplo:

Mostrar/Ocultar Número de línea | Expandir/Contraer | Seleccionar todo

1.
2. SELECT *;
3. FROM sPath + 'data\digisoft!usuario';
4. WHERE (alltrim(str(usuario.codigo)) LIKE this.tag);
5. AND ((usuario.estatus >= nEMn);
6. AND (usuario.estatus =< nEMx));
7. ORDER BY usuario.codigo;
8. INTO CURSOR myresp
9.
10. * Como utilicé la tabla usuario, llamo al puntero que el SELECT de la consulta
11. * llamó y procedo a liberarlo de la memoria con USE.
12. * El comando use localiza la posición de memoria del puntero y libera el espacio
13. * de memoria correspondiente.
14.
15. SELECT usuario
16. USE
17.
18.


Es aconsejable hacer uso moderado del manejo de áreas (espacios de memoria), pues este error es causa en la mayoría de los casos por desbordamiento de pila (Stack overflow). Realmente este tipo de error se da en cualquier programa en el cual se haga uso de apertura y cierre de archivos. En la imagen adjunta está un ejemplo de este error.

Espero que toda esta historia te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar