Với nhiều tham số này, vấn đề có thể là bất kỳ một mục bao gồm kiểu dữ liệu không khớp, độ dài dữ liệu, v.v. Đây là nơi mà nghệ thuật được gọi là gỡ lỗi phải được thực hiện.
-
Kiểm tra kỹ các kiểu dữ liệu của bảng (
T_SAP_ZSSTABL_NEW
). Oracle có thể có các kiểu dữ liệu không thể dịch được ngay lập tức Loại ADO chẳng hạn nhưBLOB
,CLOB
,BFILE
, kiểu số có độ chính xác cao, kiểu ký tự tối đa hoặc kiểu mở rộng (XML, phương tiện, v.v.). -
Thử kéo dài độ dài dữ liệu (hoặc để trống trong phần gán tham số):
Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, 100, POSNR) Set MyParameter = cmd.CreateParameter("MATNR", adVarChar, adParamInput, , POSNR)
Nếu cần, hãy kiểm tra độ dài biến bằng
Len()
của VBA để đưa ra cảnh báo người dùng trước khi thêm các thông số. -
Thử chạy
SELECT
phiên bản truy vấn có cùng tham số để trả về một hàng kết quả. Nếu cùng một lỗi xảy ra, hãy bắt đầu với tham số đầu tiên, sau đó thêm tham số thứ hai hoặc lô 10 liên tiếp để cô lập mục có vấn đề.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 mã để có tính nhất quán, vì bạn có thể đã bỏ sót một hoặc căn chỉnh sai một trong những điều này có thể xảy ra với nhiều dòng lặp lại. Luôn hướng đến mã KHÔ (Không lặp lại bản thân). Một tùy chọn là sử dụng từ điển với các cặp khóa / giá trị thay vì hơn 160 biến hoặc phạm vi được đặt tên:
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
Nếu bạn có các loại hỗn hợp, hãy thử tạo các từ điển khác nhau cho từng loại và lặp lại chúng theo trình tự để thêm các tham số. Và điều chỉnh
UPDATE
với tất cả các loại giống nhau ở gần nhau. Nhớ lạiUPDATE
không cần tuân theo thứ tự các cột trong định nghĩa bảng. -
Nếu có thể (hoặc giải pháp lâu dài), hãy xem xét thiết kế lại bảng định dạng rộng của TSZ thành một dạng định dạng dài được chuẩn hóa.
ID POSNR VBELN Indicator Value # XXX XXX CHARG XXX # XXX XXX MATNR XXX # XXX XXX MAKTX XXX ...
Mặc dù điều này sẽ thêm 167 hàng cho mỗi mã định danh duy nhất, trong thiết kế cơ sở dữ liệu các hàng rẻ hơn nhiều so với cột và do đó việc truy vấn sẽ dễ dàng hơn và lưu trữ dữ liệu có thể mở rộng hơn và bảo trì hiệu quả hơn. Ví dụ:một số liệu mới không cần một cột được xác định mới với tất cả thông tin meta mà chỉ cần một hàng mới. Và với
PIVOT
của Oracle bạn có thể dễ dàng hiển thị lại định dạng rộng.
Nói chung, không có cách nào rõ ràng, duy nhất để gỡ lỗi thời gian chạy như thế này do một phần mở rộng API như kết nối cơ sở dữ liệu. Có thể dễ dàng xử lý cú pháp SQL hoặc tham chiếu đối tượng VBA nhưng các vấn đề về dữ liệu cụ thể đòi hỏi phải đào sâu một cách sáng tạo trong quá trình tổng thể.