Página 1 de 1

Error en tDataSet

Publicado: Mar May 17, 2011 9:36 pm
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

Error en tDataSet

Publicado: Mié May 18, 2011 10:17 am
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

Error en tDataSet

Publicado: Mié May 18, 2011 5:57 pm
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!!

Error en tDataSet

Publicado: Mié May 18, 2011 6:32 pm
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

Error en tDataSet

Publicado: Jue May 26, 2011 1:13 am
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

Error en tDataSet

Publicado: Jue May 26, 2011 11:00 am
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

Error en tDataSet

Publicado: Jue May 26, 2011 9:52 pm
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!!

Error en tDataSet

Publicado: Vie May 27, 2011 12:48 pm
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

Error en tDataSet

Publicado: Mar May 31, 2011 10:11 am
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)Â