Con tantos parámetros, el problema puede ser cualquiera un elemento que incluye el tipo de datos no coincidentes, la longitud de los datos, etc. Aquí es donde se debe ejercitar el arte conocido como depuración.
-
Verifique cuidadosamente los tipos de datos de la tabla (
T_SAP_ZSSTABL_NEW
). Oracle puede tener tipos de datos que no se pueden traducir inmediatamente toby Tipos ADO comoBLOB
,CLOB
,BFILE
, tipos numéricos de alta precisión, tipos de caracteres máximos o tipos de extensión (XML, multimedia, etc.). -
Intente ampliar la longitud de los datos (o déjelo en blanco en la asignación de parámetros):
Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR) Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
Si es necesario, verifique las longitudes variables con
Len()
de VBA para generar una advertencia de usuario antes de agregar parámetros. -
Intenta ejecutar
SELECT
versión de consulta con los mismos parámetros para devolver una sola fila de resultados. Si ocurre el mismo error, comience con el primer parámetro, luego agregue un segundo o un lote de 10 secuencialmente para aislar el elemento problemático.SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM, ... FROM T_SAP_ZSSTABL_NEW WHERE TSZ_VBELN = ? AND TSZ_POSNR = ?
-
Refactorice el código para mantener la coherencia, ya que es posible que haya perdido uno o desalineado, lo que puede ocurrir con muchas líneas repetitivas. Siempre apunte al código DRY (Don't Repeat Yourself). Una opción es usar un diccionario con pares clave/valor en lugar de más de 160 variables o rangos con nombre:
Dim key As Variant Dim paramDict As Object Set paramDict = CreateObject("Scripting.Dictionary") For ... paramDict.Add "KeyX", "ValueX" Next ... ... With cmd .ActiveConnection = myOracleConn .CommandText = strSQL .CommandType = adCmdText For Each key In paramDict.Keys .Parameters.Append .CreateParameter(key, adVarChar, adParamInput, , paramDict(key)) Next key .Execute End With
Si tiene tipos mixtos, intente crear diferentes diccionarios para cada tipo e itérelos en secuencia para agregar parámetros. Y ajuste
UPDATE
con todos los mismos tipos cerca uno del otro. RecuperarUPDATE
no necesita seguir el orden de las columnas en la definición de la tabla. -
Si es posible (o una solución a largo plazo), considere rediseñar la tabla de formato ancho de TSZ columnas en una forma normalizada de formato largo.
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX ...
Aunque esto agregará 167 filas para cada identificador único, en el diseño de la base de datos, las filas son mucho más baratas que las columnas y, por lo tanto, las consultas serán más fáciles, el almacenamiento de datos más escalable y el mantenimiento más eficiente. Por ejemplo, una nueva métrica no necesita una nueva columna definida con toda la metainformación, sino simplemente una nueva fila. Y con el
PIVOT
de Oracle puede volver a renderizar fácilmente el formato ancho.
En general, no existe una forma única y clara de depurar un error de tiempo de ejecución como este derivado de una extensión API como la conexión a la base de datos. La sintaxis SQL o la referencia a objetos VBA se pueden manejar fácilmente, pero los problemas específicos de datos requieren una exploración creativa a través del proceso general.