In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Error en tDataSet

Foro de Xailer profesional en español
Responder
Israel Solis
Mensajes: 155
Registrado: Mié Nov 03, 2004 12:42 pm
Ubicación: Cancún, México
Contactar:

Error en tDataSet

Mensaje por Israel Solis »

Hola:
Al abrir una ventana de mi sistema (catalogo) me marca este error NO ES SIEMPRE
Me funcionaba perfecto, los cambios recientes fue la implementación de Diccionario de datos.
La tabla que marca error tiene 79 campos, de los cauales 4 campos son MEMO y un campo tipo IMAGE
#1: GPF (Code = c0000005):
Access violation
TDATAFIELD:VALUE (94)
TDATAFIELD:LOAD (143)
TDATASET:LOAD (421)
TDBFDATASET:LOAD (1172)
TDBFDATASET:OPEN (323)
(b)XDBFDATASET:XDATASET (36)
TDBFDATASET:_LOPEN (0)
TFRMFACTURAS:NEW (121)
FACTURAS (111)
(b)TFRMMAIN:FORMINITIALIZE (61)
TMENUITEM:ONCLICK (0)
TMENU:DOACTION (253)
TMENU:DOACTION (258)
TFRMMAIN:WMCOMMAND (927)
TDATAFIELD:VALUE (94)
TDATAFIELD:LOAD (143)
TDATASET:LOAD (421)
TDBFDATASET:LOAD (1172)
TDBFDATASET:OPEN (323)
(b)XDBFDATASET:XDATASET (36)
Utilizo:
Xailer 2.3.2
Tablas ADS con Diccionario de datos
GRACIAS!!
ISRAEL
Saludos :D

Israel
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Error en tDataSet

Mensaje por ignacio »

Israel Solis escribió el mar, 17 mayo 2011 21:36Hola:
Al abrir una ventana de mi sistema (catalogo) me marca este error NO ES SIEMPRE
Me funcionaba perfecto, los cambios recientes fue la implementación de Diccionario de datos.
La tabla que marca error tiene 79 campos, de los cauales 4 campos son MEMO y un campo tipo IMAGE
#1: GPF (Code = c0000005):
Access violation
TDATAFIELD:VALUE (94)
TDATAFIELD:LOAD (143)
TDATASET:LOAD (421)
TDBFDATASET:LOAD (1172)
TDBFDATASET:OPEN (323)
(b)XDBFDATASET:XDATASET (36)
TDBFDATASET:_LOPEN (0)
TFRMFACTURAS:NEW (121)
FACTURAS (111)
(b)TFRMMAIN:FORMINITIALIZE (61)
TMENUITEM:ONCLICK (0)
TMENU:DOACTION (253)
TMENU:DOACTION (258)
TFRMMAIN:WMCOMMAND (927)
TDATAFIELD:VALUE (94)
TDATAFIELD:LOAD (143)
TDATASET:LOAD (421)
TDBFDATASET:LOAD (1172)
TDBFDATASET:OPEN (323)
(b)XDBFDATASET:XDATASET (36)
Utilizo:
Xailer 2.3.2
Tablas ADS con Diccionario de datos
GRACIAS!!
ISRAEL
Israel,
Me temo que viendo donde se produce el error no ofrece demasiada información. Serí­a necesario poder tener un pequeño programa que reprodujese el error. No obstante el hecho de usar o no diccionario a Xailer no deberí­a afectarle en absoluto.
Te recomiendo que hagas tres pruebas:
1) Haz un ZAP de la tabla y comprueba si sigue fallando
2) Intenta abrir la tabla directamente sin clases
3) Intenta abrir la tabla con xaDbu o el propio editor de Xailer
Saludos
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Israel Solis
Mensajes: 155
Registrado: Mié Nov 03, 2004 12:42 pm
Ubicación: Cancún, México
Contactar:

Error en tDataSet

Mensaje por Israel Solis »

Ignacio:
GRACIAS por responder, he hecho lo que me comentaste:
"3) Intenta abrir la tabla con xaDbu o el propio editor de Xailer"
No lo logré, no supe encontrar en donde indicar el Diccionario de datos asociado para abrir la tabla.
Pero la he abierto sin problema alguno directamente con el Advantage Data Architect.
"2) Intenta abrir la tabla directamente sin clases"
Abro la tabla desde la aplicación directamente con DbUseArea() sin problema alguno.
"1) Haz un ZAP de la tabla y comprueba si sigue fallando"
Ha funcionado, pero, ¿porque motivo sucedió el error? (para tomar las medidas necesarias)
MIL GRACIAS
Saludos!!
Saludos :D

Israel
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Error en tDataSet

Mensaje por ignacio »

Israel Solis escribió el mié, 18 mayo 2011 17:57Ignacio:
GRACIAS por responder, he hecho lo que me comentaste:
"3) Intenta abrir la tabla con xaDbu o el propio editor de Xailer"
No lo logré, no supe encontrar en donde indicar el Diccionario de datos asociado para abrir la tabla.
Pero la he abierto sin problema alguno directamente con el Advantage Data Architect.
"2) Intenta abrir la tabla directamente sin clases"
Abro la tabla desde la aplicación directamente con DbUseArea() sin problema alguno.
"1) Haz un ZAP de la tabla y comprueba si sigue fallando"
Ha funcionado, pero, ¿porque motivo sucedió el error? (para tomar las medidas necesarias)
MIL GRACIAS
Saludos!!
Es posible que los datos de la tabla estuvieran corruptos o que algún valor del primer registro (según el indice activo) provoque el error en Xailer. Si te vuelve a ocurrir intenta borrar campo a campo el primer registro (según el í­ndice activo) hasta que el problema se solucione para saber exactamente el tipo de campo que provoca el error. No obstante, creo que el error se producirí­a igualmente si se accediese sin diccionario, por lo que creo que eso ha debido ser simple casualidad.
Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Israel Solis
Mensajes: 155
Registrado: Mié Nov 03, 2004 12:42 pm
Ubicación: Cancún, México
Contactar:

Error en tDataSet

Mensaje por Israel Solis »

Ignacio:
Eh rastreado el problema y he detectado que lo ocasionaba el campo tipo IMAGE, por lo que, para solucionar el problema de forma definitiva, he sobre-escrito el método "Load()" de la clase DataSet:
METHOD Load() CLASS tDataSet
LOCAL oField
IF Len( ::aRecord ) != Len( ::aFields )
::aRecord := Array( Len( ::aFields ) )
ENDIF
FOR EACH oField IN ::aFields
IF oField:cType = "IMAGE" // <<< == ISR
::aRecord[ HB_EnumIndex() ] := "" // <<< == ISR
ELSE
::aRecord[ HB_EnumIndex() ] := oField:Load()
ENDIF
NEXT
RETURN Nil
Ha funcionado bien, pero ES VALIDO LO QUE HE HECHO?
Saludos!!
Gracias
Saludos :D

Israel
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Error en tDataSet

Mensaje por ignacio »

Israel Solis escribió el jue, 26 mayo 2011 01:13Ignacio:
Eh rastreado el problema y he detectado que lo ocasionaba el campo tipo IMAGE, por lo que, para solucionar el problema de forma definitiva, he sobre-escrito el método "Load()" de la clase DataSet:
METHOD Load() CLASS tDataSet
LOCAL oField
IF Len( ::aRecord ) != Len( ::aFields )
::aRecord := Array( Len( ::aFields ) )
ENDIF
FOR EACH oField IN ::aFields
IF oField:cType = "IMAGE" // <<< == ISR
::aRecord[ HB_EnumIndex() ] := "" // <<< == ISR
ELSE
::aRecord[ HB_EnumIndex() ] := oField:Load()
ENDIF
NEXT
RETURN Nil
Ha funcionado bien, pero ES VALIDO LO QUE HE HECHO?
Saludos!!
Gracias
Israel,
La matriz aRecord se utiliza para guardar los valores originales del registro por lo tanto tu 'work around' no deberí­a tener mayores problemas. No obstante habrí­a que ver porque se produce ese error.
Si te fijas oField:Load() llama a oDataset:FieldGet(), en este caso TDbfDataset:FieldGet(). Si pudieses poner unas trazas en dicho método para confirmar que el error se produce exactamente en esta lí­nea:
RETURN ( ::cAlias )->( FieldGet( n ) )
Te lo agradezco.
Si el error se produce en esa lí­nea es muy probable que el problema fuese de xHarbour y tendrí­a que fallarte igualmente si al abrir la tabla realizas la siguiente instrucción:
cImage := Dbf->(FieldGet( nCampo ) )
Gracias de antemano por tu colaboración.
Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Israel Solis
Mensajes: 155
Registrado: Mié Nov 03, 2004 12:42 pm
Ubicación: Cancún, México
Contactar:

Error en tDataSet

Mensaje por Israel Solis »

Ignacio:
He trazado con el Debugger y al parecer efectivamente el error se produce en la lí­nea:
RETURN ( ::cAlias )->( FieldGet( n ) )
Del METHOD FieldGet( n, lForceRecno ) CLASS XDbfDataSet
También he probado lo que me comentas con el código:
ROFacturas->( DbGoTop() )
nCampo := ROFacturas->(FieldPos( "CBB") )
OutDebug("nCampo: " + Str(nCampo,,, .T.))
cImage := ROFacturas->(FieldGet( nCampo ) ) <<===
y NO provoca error alguno.
¿Quires que realice alguna otra prueba?
Saludos!!
Saludos :D

Israel
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Error en tDataSet

Mensaje por ignacio »

Israel Solis escribió el jue, 26 mayo 2011 21:52Ignacio:
He trazado con el Debugger y al parecer efectivamente el error se produce en la lí­nea:
RETURN ( ::cAlias )->( FieldGet( n ) )
Del METHOD FieldGet( n, lForceRecno ) CLASS XDbfDataSet
También he probado lo que me comentas con el código:
ROFacturas->( DbGoTop() )
nCampo := ROFacturas->(FieldPos( "CBB") )
OutDebug("nCampo: " + Str(nCampo,,, .T.))
cImage := ROFacturas->(FieldGet( nCampo ) ) <<===
y NO provoca error alguno.
¿Quires que realice alguna otra prueba?
Saludos!!
Israel,
Como puedes observar el error se produce entonces a nivel de ADS ya que no hay diferencia alguna entre las dos llamadas a FieldGet(). Tan sólo se me ocurre comprobar que verdaderamente la variable 'n' tiene un valor correcto.
Si quieres mandame una pequeña DBF para que haga pruebas a ver si a mi me falla, pero te adelanto que las tendré que hacer con ADS local.
Un saludo
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Avatar de Usuario
ignacio
Site Admin
Mensajes: 9246
Registrado: Lun Abr 06, 2015 8:00 pm
Ubicación: Madrid, Spain
Contactar:

Error en tDataSet

Mensaje por ignacio »

Visto el error. Es realmente un error de xHarbour y se produce porque el RDD de Advantage cuando se trata de campos BLOB no retorna una copia del buffer del registro activo, sino directamente el puntero a dicho buffer, por lo tanto cuando cambia de registro o se cierra la tabla, dicho puntero deja de ser válido.
Lo habrán hecho para ahorrar el máximo de memoria pero obviamente se han equivocado. Para solucionarlo hemos hecho un pequeño 'work around' sin tocar los fuentes de xHarbour que consiste en hacer una copia del puntero devuelto por FieldGet().
Incluyo con este Email la clase modificada (sólo utilizable con Xailer 2.3.2) por si quieres probarla.
Un saludo


Attached files DbfDataSet.rar (10.7 KB)Â
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
https://www.xailer.com
Responder