S tímto množstvím parametrů může být problém jakýkoli jedna položka včetně neshodného datového typu, délky dat atd. Zde je třeba uplatnit umění známé jako ladění.
-
Pečlivě zkontrolujte datové typy tabulky (
T_SAP_ZSSTABL_NEW
). Oracle může mít datové typy, které nelze okamžitě přeložit do typy ADO napříkladBLOB
,CLOB
,BFILE
, vysoce přesné číselné typy, maximální typy znaků nebo typy rozšíření (XML, média atd.). -
Zkuste prodloužit délky dat (nebo ponechte prázdné v přiřazení parametru):
Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR) Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
V případě potřeby zkontrolujte proměnné délky pomocí
Len()
jazyka VBA pro vyvolání uživatelského varování před připojením parametrů. -
Zkuste spustit
SELECT
verze dotazu se stejnými parametry, aby se vrátil jeden řádek výsledků. Pokud dojde ke stejné chybě, začněte s prvním parametrem a poté přidejte druhý nebo dávku 10 postupně, abyste izolovali problematickou položku.SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM, ... FROM T_SAP_ZSSTABL_NEW WHERE TSZ_VBELN = ? AND TSZ_POSNR = ?
-
Refaktorujte kód pro konzistenci, protože jste možná jeden vynechali nebo jste jeden špatně zarovnali, což se může vyskytnout u mnoha opakujících se řádků. Vždy miřte na kód DRY (Don't Repeat Yourself). Jednou z možností je použít slovník s páry klíč/hodnota namísto 160+ proměnných nebo pojmenovaných rozsahů:
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
Pokud máte smíšené typy, zkuste pro každý typ vytvořit různé slovníky a postupně je opakovat, abyste přidali parametry. A upravte
UPDATE
se všemi stejnými typy blízko sebe. VyvolejteUPDATE
nemusí dodržovat pořadí sloupců v definici tabulky. -
Je-li to možné (nebo dlouhodobé řešení), zvažte přepracování široké formátovací tabulky TSZ sloupců do normalizované formy dlouhého formátu.
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX ...
Ačkoli to přidá 167 řádků pro každý jedinečný identifikátor, v návrhu databáze jsou řádky mnohem levnější než sloupce, takže dotazování bude jednodušší a ukládání dat škálovatelnější a údržba efektivnější. Například nová metrika nepotřebuje nový definovaný sloupec se všemi metainformacemi, ale jednoduše nový řádek. A s Oracle
PIVOT
můžete snadno znovu vykreslit široký formát.
Celkově vzato neexistuje jediný a jasný způsob, jak odladit runtime chybu, jako je tato, která se nese z rozšíření API, jako je připojení k databázi. Syntaxi SQL nebo odkazování na objekty VBA lze snadno zvládnout, ale problémy specifické pro data vyžadují kreativní prozkoumání celého procesu.