Dengan banyak parameter ini, masalahnya bisa apa saja satu item termasuk tipe data yang tidak cocok, panjang data, dll. Di sinilah seni yang dikenal sebagai debugging harus dilakukan.
-
Periksa dengan cermat tipe data tabel (
T_SAP_ZSSTABL_NEW
). Oracle mungkin memiliki tipe data yang tidak dapat segera diterjemahkan oleh Jenis ADO sepertiBLOB
,CLOB
,BFILE
, tipe numerik presisi tinggi, tipe karakter maksimum, atau tipe ekstensi (XML, media, dll.). -
Coba perpanjang panjang data (atau biarkan kosong dalam penetapan parameter):
Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR) Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
Jika perlu, periksa panjang variabel dengan
Len()
VBA's untuk meningkatkan peringatan pengguna sebelum menambahkan parameter. -
Coba jalankan
SELECT
versi kueri dengan parameter yang sama untuk mengembalikan satu baris hasil. Jika kesalahan yang sama terjadi, mulailah dengan param pertama, lalu tambahkan yang kedua atau 10 secara berurutan untuk mengisolasi item yang bermasalah.SELECT ? AS TSZ_CHARG_PARAM, ? AS TSZ_MATNR_PARAM, ? AS TSZ_MAKTX_PARAM, ... FROM T_SAP_ZSSTABL_NEW WHERE TSZ_VBELN = ? AND TSZ_POSNR = ?
-
Refactor kode untuk konsistensi, karena Anda mungkin melewatkan satu atau tidak selaras yang dapat terjadi dengan banyak baris berulang. Selalu bidik kode DRY (Don't Repeat Yourself). Salah satu opsi adalah menggunakan kamus dengan pasangan kunci/nilai alih-alih 160+ variabel atau rentang bernama:
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
Jika Anda memiliki tipe campuran, coba buat kamus yang berbeda untuk setiap tipe dan ulangi secara berurutan untuk menambahkan parameter. Dan sesuaikan
UPDATE
dengan semua jenis yang sama di dekat satu sama lain. IngatUPDATE
tidak perlu mengikuti urutan kolom dalam definisi tabel. -
Jika memungkinkan (atau solusi jangka panjang), pertimbangkan untuk mendesain ulang tabel format lebar TSZ kolom ke dalam bentuk format panjang yang dinormalisasi.
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX ...
Meskipun ini akan menambahkan 167 baris untuk setiap pengenal unik, dalam desain database, baris jauh lebih murah daripada kolom sehingga kueri akan lebih mudah, dan penyimpanan data lebih terukur, dan pemeliharaan lebih efisien. Misalnya, metrik baru tidak memerlukan kolom baru yang ditentukan dengan semua info meta tetapi hanya baris baru. Dan dengan
PIVOT
Oracle Anda dapat dengan mudah merender ulang format lebar.
Secara keseluruhan, tidak ada cara tunggal yang jelas untuk men-debug kesalahan runtime seperti ini yang berasal dari ekstensi API seperti koneksi database. Sintaks SQL atau referensi objek VBA dapat dengan mudah ditangani tetapi masalah khusus data memerlukan penggalian yang kreatif melalui keseluruhan proses.