我已经创建了一个宏,使用BAPIBBP_RFC_READ_TABLE
从SAP表读取数据。
如果我使用FILTER VIEW,它会成功编译并运行单个参数:
objOptTab(objOptTab.RowCount, "TEXT") = "EBELN EQ '12345'"
然而,代码的目标是能够传递字符串数组作为文本过滤器,因此存在ekknPurchaseOrders
变量。由于SAP使用SQL查询并与常规SQL语言共享许多语法,我假设我可以将下面的内容作为TEXT FILTER传递:
ekknPurchaseOrders = "('12345', '67890', '101112')"
这就是为什么下面一行会出现在第一个位置:
"EBELN IN " & ekknPurchaseOrders'
Running code/execution BAPI withEBELN IN "
..导致SQL_PARSE错误,因为语法无效。
关于我可以使用什么语法来传递多个值的集合到EBELN文本过滤器的任何建议?
请注意,当错误发生时,文本过滤器语法从'EQ'更改为'IN'。使用ekknPurchaseOrders
和而不是传递多个值,将语法更改为'IN'返回ekknPurchaseOrders
中第一个元素的值。
Public Const worksheetName As String = "EKKN"
Public Sub GetEKPOtable()
Dim funcs As SAPFunctions
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(worksheetName)
'LOG IN TO SAP
Set sapConn = CreateSapFunctions()
If sapConn Is Nothing Then
Exit Sub
End If
'DECLEARE FUNCTION EXPORTS
Set objRfcFunc = sapConn.Add("BBP_RFC_READ_TABLE")
Set objQueryTab = objRfcFunc.Exports("QUERY_TABLE")
Set objDelimiter = objRfcFunc.Exports("DELIMITER")
Set objRowCount = objRfcFunc.Exports("ROWCOUNT")
'SET VALUES
objRowCount.Value = "99999999"
Set objOptTab = objRfcFunc.Tables("OPTIONS")
Set objFldTab = objRfcFunc.Tables("FIELDS")
Set objDatTab = objRfcFunc.Tables("DATA")
objQueryTab.Value = "EKPO" 'TABLE
objDelimiter.Value = "|" 'DELIMITER
objOptTab.FreeTable
'OPTION FIELD SAP STATEMENT
objOptTab.AppendRow
objOptTab(objOptTab.RowCount, "TEXT") = "EBELN IN " & ekknPurchaseOrders 'FILTERS FOR VIEW
objFldTab.FreeTable
'OUTPUT FIELDS
objFldTab.AppendRow
objFldTab(objFldTab.RowCount, "FIELDNAME") = "EBELN"
objFldTab.AppendRow
objFldTab(objFldTab.RowCount, "FIELDNAME") = "EBELP"
objFldTab.AppendRow
objFldTab(objFldTab.RowCount, "FIELDNAME") = "EMATN"
objFldTab.AppendRow
objFldTab(objFldTab.RowCount, "FIELDNAME") = "ELIKZ"
'IF CALL FAILES, EXIT
If objRfcFunc.Call = False Then
MsgBox objRfcFunc.Exception
End If
Dim objDatRec As Object
Dim objFldRec As Object
'WRITE RESULT TO WS
Dim lo As ListObject
Set lo = ws.ListObjects(outputTable)
Call ClearTableData(lo)
For Each objDatRec In objDatTab.Rows
For Each objFldRec In objFldTab.Rows
ws.Cells(objDatRec.Index + 8, objFldRec.Index + 7) = Mid(objDatRec("WA"), objFldRec("OFFSET") + 1, objFldRec("LENGTH"))
Next
Next
End Sub
使用EBELN运行代码/执行BAPI…导致SQL_PARSE错误,因为语法无效。
WHERE IN
语法在RFC_READ_TABLE和BBP_RFC_READ_TABLE中完美工作,你的问题在别处。
排除代码故障时需要注意的三个时刻:
-
OPTIONS
参数对您可能遇到的单行有72个字符的限制。检查您的条件长度,并根据需要将其分成几行。 -
OPTIONS
行不"like"缺少空格,所以不要省略字符
代替line
objOptTab(objOptTab.RowCount, "TEXT") = "EBELN IN ('050112','060201')
按这个
objOptTab(objOptTab.RowCount, "TEXT") = " EBELN IN ( '050112', '060201' )
- 不要忘记转义
ekknPurchaseOrders
中的值,每个值都应该用单引号括起来!