如何通过VBA借助BBP_RFC_READ_TABLE BAPI向ABAP TEXT FILTER传递多个值
解决BBP_RFC_READ_TABLE中使用IN条件过滤多值的语法问题
你遇到的问题是因为BBP_RFC_READ_TABLE的OPTIONS字段对IN条件的语法支持有特殊限制,直接拼接IN ('val1','val2')的格式会触发解析错误。这里有两种可靠的解决方法:
方法1:拆分多个条件行用OR逻辑(推荐)
SAP的RFC_READ_TABLE系列函数会自动将OPTIONS表中的多行条件用OR逻辑组合(未指定AND时默认规则)。把每个采购订单号作为单独的条件行添加到OPTIONS表中,既不会触发语法错误,也能实现多值过滤的需求。
修改你的代码如下:
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 'DECLARE 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 'CLEAR OPTIONS TABLE ' 拆分多值为单独的EQ条件行 Dim poNumbers As Variant Dim po As Variant ' 假设ekknPurchaseOrders是字符串数组,比如Array("12345", "67890", "101112") poNumbers = ekknPurchaseOrders For Each po In poNumbers objOptTab.AppendRow objOptTab(objOptTab.RowCount, "TEXT") = "EBELN EQ '" & po & "'" Next 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 FAILS, 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
方法2:正确使用IN条件的语法(注意长度限制)
如果你坚持要使用IN语法,需要确保拼接后的字符串符合ABAP语法,并且不超过OPTIONS表TEXT字段的默认72字符长度限制。正确的格式示例:
objOptTab.AppendRow objOptTab(objOptTab.RowCount, "TEXT") = "EBELN IN ('12345','67890','101112')"
这种方法的局限性很明显:如果采购订单号数量多、长度长,很容易超过字符上限,导致语法截断错误,因此仅适合少量短值的场景。
为什么之前的写法报错?
BBP_RFC_READ_TABLE的OPTIONS字段本质是映射到ABAP SELECT语句的WHERE子句片段,虽然语法类似普通SQL,但SAP对该字段的长度和格式有严格限制。直接拼接的IN语句如果长度超标,就会触发SQL_PARSE解析错误;而拆分多个EQ条件行的方式则完全避开了这个限制,同时实现了相同的过滤逻辑。
内容的提问来源于stack exchange,提问作者Havard Kleven
相关产品推荐
相关产品推荐

