Avec autant de paramètres, le problème peut être n'importe lequel un élément comprenant un type de données incompatible, une longueur de données, etc. C'est là que l'art connu sous le nom de débogage doit être exercé.
-
Vérifiez soigneusement les types de données de la table (
T_SAP_ZSSTABL_NEW
). Oracle peut avoir des types de données qui ne sont pas immédiatement traduisibles par Types ADO commeBLOB
,CLOB
,BFILE
, types numériques de haute précision, types de caractères maximum ou types d'extension (XML, média, etc.). -
Essayez d'étendre les longueurs de données (ou laissez vide dans l'affectation des paramètres) :
Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR) Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
Si nécessaire, vérifiez les longueurs variables avec
Len()
de VBA pour déclencher un avertissement utilisateur avant d'ajouter des paramètres. -
Essayez d'exécuter le
SELECT
version de la requête avec les mêmes paramètres pour renvoyer une seule ligne de résultats. Si la même erreur se produit, commencez par le premier paramètre, puis ajoutez un deuxième ou un lot de 10 de manière séquentielle pour isoler l'élément problématique.SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM, ... FROM T_SAP_ZSSTABL_NEW WHERE TSZ_VBELN = ? AND TSZ_POSNR = ?
-
Refactorisez le code pour plus de cohérence, car vous en avez peut-être manqué un ou mal aligné, ce qui peut se produire avec de nombreuses lignes répétitives. Visez toujours le code DRY (Don't Repeat Yourself). Une option consiste à utiliser un dictionnaire avec des paires clé/valeur au lieu de plus de 160 variables ou plages nommées :
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 vous avez des types mixtes, essayez de créer différents dictionnaires pour chaque type et itérez-les dans l'ordre pour ajouter des paramètres. Et ajustez
UPDATE
avec tous les mêmes types à proximité les uns des autres. RappelerUPDATE
n'a pas besoin de suivre l'ordre des colonnes dans la définition de table. -
Si possible (ou solution à long terme), envisagez de reconcevoir le tableau grand format de TSZ colonnes dans une forme normalisée de format long.
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX ...
Bien que cela ajoutera 167 lignes pour chaque identifiant unique, dans la conception de la base de données, les lignes sont beaucoup moins chères que les colonnes et l'interrogation sera donc plus facile, le stockage des données plus évolutif et la maintenance plus efficace. Par exemple, une nouvelle métrique n'a pas besoin d'une nouvelle colonne définie avec toutes les méta-informations, mais simplement d'une nouvelle ligne. Et avec le
PIVOT
d'Oracle vous pouvez facilement restituer le format large.
Dans l'ensemble, il n'y a pas de moyen unique et clair de déboguer une erreur d'exécution comme celle-ci provenant d'une extension d'API comme la connexion à la base de données. La syntaxe SQL ou le référencement d'objets VBA peuvent être facilement gérés, mais les problèmes spécifiques aux données nécessitent de creuser de manière créative tout au long du processus.