Con così tanti parametri, il problema può essere qualsiasi un elemento che include tipo di dati, lunghezza dei dati, ecc. non corrispondenti. Qui è dove è necessario esercitare l'arte nota come debug.
-
Controllare attentamente i tipi di dati della tabella (
T_SAP_ZSSTABL_NEW). Oracle potrebbe avere tipi di dati che non sono immediatamente traducibili in Tipi ADO comeBLOB,CLOB,BFILE, tipi numerici ad alta precisione, tipi di caratteri massimi o tipi di estensione (XML, media, ecc.). -
Prova ad estendere la lunghezza dei dati (o lascia vuoto nella parametrizzazione):
Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR) Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)Se necessario, controlla le lunghezze variabili con
Len()di VBA per generare un avviso utente prima di aggiungere parametri. -
Prova a eseguire
SELECTversione della query con gli stessi parametri per restituire una singola riga di risultati. Se si verifica lo stesso errore, inizia con il primo parametro, quindi aggiungi un secondo o un batch di 10 in sequenza per isolare l'elemento problematico.SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM, ... FROM T_SAP_ZSSTABL_NEW WHERE TSZ_VBELN = ? AND TSZ_POSNR = ? -
Codice di refactoring per coerenza, poiché potresti averne perso uno o disallineato uno che può verificarsi con molte righe ripetitive. Puntare sempre al codice DRY (non ripetere te stesso). Un'opzione è utilizzare un dizionario con coppie chiave/valore invece di oltre 160 variabili o intervalli denominati:
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 WithSe disponi di tipi misti, prova a creare dizionari diversi per ogni tipo e ripetili in sequenza per aggiungere parametri. E regola
UPDATEcon tutti gli stessi tipi uno vicino all'altro. RichiamaUPDATEnon è necessario seguire l'ordine delle colonne nella definizione della tabella. -
Se possibile (o soluzione a lungo termine), valuta la possibilità di riprogettare la tabella di grande formato di TSZ colonne in una forma normalizzata di formato lungo.
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX ...Sebbene ciò aggiunga 167 righe per ogni identificatore univoco, nella progettazione del database le righe sono molto più economiche delle colonne e quindi l'esecuzione di query sarà più semplice, l'archiviazione dei dati più scalabile e la manutenzione più efficiente. Ad esempio, una nuova metrica non necessita di una nuova colonna definita con tutte le metainformazioni ma semplicemente di una nuova riga. E con
PIVOTdi Oracle puoi facilmente renderizzare nuovamente il formato grande.
Tutto sommato, non esiste un modo unico e chiaro per eseguire il debug di un errore di runtime come questo causato da un'estensione API come la connessione al database. La sintassi SQL o il riferimento a oggetti VBA possono essere gestiti facilmente, ma i problemi specifici dei dati richiedono un'analisi creativa dell'intero processo.