Página 1 de 1

TWebDataSource

Publicado: Dom Sep 10, 2023 3:00 pm
por ramonzea
Me presenta un error al usar el TWebDataSource, y no logro identificar por qué, el mismo proceso lo usaba en la versión que antes tenía y funcionaba.

Versión Xailer: Xailer 8.2.2
Compilador: Harbour 3.2.0dev (r1912031042)
Compilador C/C++: MinGW GNU C 7.3 (32-bit)
Plataforma: Windows 10 10.0

----------------------- Información detallada del error -----------------------

Subsistema: BASE
Código de error: 1132
Estado: .F.
Descripción: Bound error
Operación: array access
Argumentos: [ 1] = Tipo: A Valor: [ 2] = Tipo: N Valor: 1
Fichero:
Código error SO: 0

Pila de llamadas:
TWEBRECORDS:REFRESHCURRENT (513)
TWEBRECORDS:UPDATE (417)
TSQLQUERY:UPDATE (564)
TSQLQUERY:FASTUPDATE (688)
IMPORTALMACENES (65)

Re: TWebDataSource

Publicado: Dom Sep 10, 2023 9:09 pm
por ignacio
Hola,

En anteriores versiones ese método no estaba desarrollado y era simplemente lo que en <<Harbour>> se llama un método virtual, que básicamente no hace nada, pero impide que se produzca un error de ejecución. Eso es todo. Sin embargo en la última versión se desarrollo para que hiciera el trabajo correctamente.

En su archivo de error se indica que el error se produce en esta línea:

nPos := ATail( ::aWork[ nRecno ] )

Y nRecno en unas líneas más arribas está asignado como ::Recno(). Si se fija el error indica que está accediendo al elemento de la matriz (el elemento <1>) pero no existe. Es muy extraño. Si nos pudiese mandar un pequeño ejemplo se lo agradezco.

Un saludo

Nota: Adjunto nuevo código con control para evitar el error

Código: Seleccionar todo

METHOD RefreshCurrent() CLASS XWebRecords

   LOCAL oField
   LOCAL aRecord
   LOCAL cSql, cFields
   LOCAL nField, nRecno, nPos

   cFields := ""
   nField  := 1
   nRecno  := ::Recno()

   IF Empty( nRecno ) .OR. nRecno > Len( ::aWork )
      RETURN .F.
   ENDIF

   nPos := ATail( ::aWork[ nRecno ] )

   FOR EACH oField IN ::oDataSet:aFields
      WITH OBJECT oField
         IF !Empty( cFields )
            cFields += ", "
         ENDIF
         cFields += :cName
      END WITH
   NEXT

   cSql := "SELECT " + cFields + " FROM " + ::cTable + ::GetPkWhere()

   WITH OBJECT ::oDataSource
      aRecord := :QueryRow( cSql )
      IF Len( aRecord ) == 0
         RETURN .f.
      ENDIF
      AAdd( aRecord, nPos )
   END WITH

   IF nRecno <= Len( ::aWork )
      ::aWork[ nRecno ] := aRecord
   ENDIF

RETURN .t.

Re: TWebDataSource

Publicado: Lun Sep 11, 2023 12:40 am
por ramonzea
Si, eso logré ver que a pesar de hacer el FastAddNew(), RecNo() devuelve 0, y es dónde da el error.
Muchas gracias, aplico el parche.

Re: TWebDataSource

Publicado: Lun Sep 11, 2023 10:12 am
por ignacio
Argumentos: [ 1] = Tipo: A Valor: [ 2] = Tipo: N Valor: 1
Devuelve 1

Saludos