Cuando le envías un comando al Firebird a veces la ejecución falla, los motivos pueden ser diversos, entre ellos:

  • Escribiste mal una palabra clave (por ejemplo: escribiste SELECR en lugar de SELECT)
  • Escribiste el nombre de una columna inexistente
  • Escribiste el nombre de una tabla o vista inexistente
  • Enviaste como parámetro un texto y debías enviar como parámetro un número
  • La cantidad de parámetros que enviaste es diferente a la cantidad de parámetros que el stored procedure debe recibir
  • Enviaste más caracteres que los admitidos (enviaste 30 pero solamente puede recibir 20)
  • y un largo etcétera

Si hubo un error, cualquier error, el valor que te devolverá la función SQLEXEC() será -1 pero eso evidentemente no te da suficiente información para saber que fue lo que estuvo mal. Para obtener esa información lo que puedes hacer es lo siguiente:

  1. Capturas el error
  2. Lo grabas en un archivo de texto
  3. Revisas el archivo de texto
FUNCTION RegistrarErrorEnArchivo
Local lnNumElementos, lcNombreArchivLog, lnI, lcElemento, lcVarType, lnPos1, lnPos2, lnPos3, lcExcepcionNombre, lcExcepcionMensaje
   lnNumElementos = AERROR(laErrorArray)
   if lnNumElementos >= 1
      lcNombreArchivoLog = "SQL_ERRORES.TXT"
      =StrToFile(DtoC(Date()) + " " + Left(TIME(), 5) + Chr(13), lcNombreArchivoLog, 1)
      For lnI = 1 to 2
         lcElemento = laErrorArray[lnI]
         lcVarType = VarType(lcElemento)
         lcElemento = icase(lcVarType == "N", Str(lcElemento), lcVarType == "X", "", lcElemento) + " "
         if lnI == 2
            lnPos1 = AT(Chr(10), lcElemento, 1)
            lnPos2 = AT(Chr(10), lcElemento, 2)
            lnPos3 = AT(Chr(10), lcElemento, 3)
            if SubStr(lcElemento, lnPos1 + 1, 2) == "E_"     && Si se trata de una excepción
               lcExcepcionNombre = SubStr(lcElemento, lnPos1 + 1, lnPos2 - lnPos1)
               lcExcepcionMensaje = SubStr(lcElemento, lnPos2 + 1, lnPos3 - lnPos2)
            else
               lcExcepcionNombre = ""
               lcExcepcionMensaje = ""
            endif
         endif
         =StrToFile(lcElemento, lcNombreArchivoLog, 1)
      Next lnI
      =StrToFile(Chr(13) + Replicate("-", 80) + Chr(13), lcNombreArchivoLog, 1)
   endif

 ENDFUNC
 *
 *

Esta función grabará en un archivo de texto llamado SQL_ERRORES.TXT todos los errores que detecte el Firebird. Por cada error se grabarán tres líneas:

  • La primera línea te dirá la fecha y la hora en la cual ocurrió el error
  • La segunda línea te dirá cual fue el error que ocurrió
  • La tercera línea son 80 guiones y sirve para separar un error del siguiente

Fíjate que para que detecte si el error se debió a una excepción del usuario (o sea: una excepción tuya, que tú escribiste) el nombre de tu excepción debe empezar con E_

Desde luego que los nombres de tus excepciones pueden empezar con cualquier letra que quieras, pero lo recomendable es que estandarices esos nombres y empezarlos con E_ es una buena práctica.

Debes invocar a esta función si SQLEXEC() te devuelve -1

lnResultado = SQLEXEC(gnHandle, lcComando)

IF lnResultdo = -1     && Si ocurrió algún error
   =RegistrarErrorEnArchivo()
ENDIF

Cada vez que tengas algún problema revisa el archivo SQL_ERRORES.TXT y así sabrás que fue lo que estuvo mal.

 

.

Anuncios