Przy tak wielu parametrach problem może być dowolny jeden element zawierający niezgodny typ danych, długość danych itp. W tym miejscu należy ćwiczyć sztukę znaną jako debugowanie.
-
Dokładnie sprawdź typy danych w tabeli (
T_SAP_ZSSTABL_NEW
). Oracle może mieć typy danych, które nie są natychmiast tłumaczone przez Typy ADO takie jakBLOB
,CLOB
,BFILE
, typy liczbowe o wysokiej precyzji, maksymalne typy znaków lub typy rozszerzeń (XML, media itp.). -
Spróbuj zwiększyć długości danych (lub pozostaw puste w przypisaniu parametrów):
Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR) Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
W razie potrzeby sprawdź zmienne długości za pomocą
Len()
VBA aby podnieść ostrzeżenie użytkownika przed dołączeniem parametrów. -
Spróbuj uruchomić
SELECT
wersję zapytania z tymi samymi parametrami, aby zwrócić pojedynczy wiersz wyników. Jeśli wystąpi ten sam błąd, zacznij od pierwszego parametru, a następnie dodaj drugą lub partię 10 sekwencyjnie, aby wyizolować problematyczny element.SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM, ... FROM T_SAP_ZSSTABL_NEW WHERE TSZ_VBELN = ? AND TSZ_POSNR = ?
-
Kod refaktoryzacji dla spójności, ponieważ mogłeś pominąć jeden lub źle wyrównać, co może wystąpić w przypadku wielu powtarzających się linii. Zawsze celuj w kod DRY (Don't Repeat Yourself). Jedną z opcji jest użycie słownik z parami klucz/wartość zamiast ponad 160 zmiennymi lub nazwanymi zakresami:
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
Jeśli masz mieszane typy, spróbuj utworzyć różne słowniki dla każdego typu i powtarzaj je po kolei, aby dołączyć parametry. I dostosuj
UPDATE
ze wszystkimi tymi samymi typami blisko siebie. PrzywołajUPDATE
nie musi być zgodna z kolejnością kolumn w definicji tabeli. -
Jeśli to możliwe (lub rozwiązanie długoterminowe), rozważ przeprojektowanie tabeli szerokoformatowej TSZ kolumny do znormalizowanej postaci długiego formatu.
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX ...
Chociaż spowoduje to dodanie 167 wierszy dla każdego unikalnego identyfikatora, w projekcie bazy danych wiersze są znacznie tańsze niż kolumny, dzięki czemu zapytania będą łatwiejsze, a przechowywanie danych bardziej skalowalne, a konserwacja bardziej wydajna. Na przykład nowa metryka nie wymaga nowej zdefiniowanej kolumny ze wszystkimi metainformacjami, ale po prostu nowego wiersza. Oraz z
PIVOT
Oracle możesz łatwo ponownie wyrenderować szeroki format.
Podsumowując, nie ma jednego, jasnego sposobu debugowania błędu czasu wykonania, takiego jak ten, który pochodzi z rozszerzenia API, takiego jak połączenie z bazą danych. Można łatwo obsługiwać składnię SQL lub odwołania do obiektów VBA, ale problemy związane z danymi wymagają kreatywnego przeanalizowania całego procesu.