用VBA传递多个值给ABAP TEXT FILTER

  • 本文关键字:ABAP TEXT FILTER VBA vba saprfc
  • 更新时间 :
  • 英文 :


我已经创建了一个宏,使用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中完美工作,你的问题在别处。

排除代码故障时需要注意的三个时刻:

  1. OPTIONS参数对您可能遇到的单行有72个字符的限制。检查您的条件长度,并根据需要将其分成几行。

  2. OPTIONS行不"like"缺少空格,所以不要省略字符

代替line

objOptTab(objOptTab.RowCount, "TEXT") = "EBELN IN ('050112','060201')

按这个

objOptTab(objOptTab.RowCount, "TEXT") = " EBELN IN ( '050112', '060201' )

  1. 不要忘记转义ekknPurchaseOrders中的值,每个值都应该用单引号括起来!

相关内容

  • 没有找到相关文章

最新更新