使用 VBA 将多个值传递给 ABAP TEXT FILTER
Passing multiple values to ABAP TEXT FILTER with VBA
我创建了一个宏来使用 BAPI BBP_RFC_READ_TABLE
从 SAP Table 读取数据。
如果我使用 FILTER VIEW,它会成功编译并运行单个参数:
objOptTab(objOptTab.RowCount, "TEXT") = "EBELN EQ '12345'"
但是,代码的目标是能够将字符串数组作为文本过滤器传递,因此 ekknPurchaseOrders
变量存在。由于 SAP 使用 SQL 查询并与通用 SQL 语言共享大量语法,我假设我可以在下面作为文本过滤器传递:
ekknPurchaseOrders = "('12345', '67890', '101112')"
这就是为什么首先出现下面一行的原因:
"EBELN IN " & ekknPurchaseOrders'
运行 code/executing BAPI with EBELN IN "
.. 导致 SQL_PARSE 错误,因为语法无效。
关于我可以使用什么语法将多个值的集合传递给 EBELN TEXT FILTER,有什么建议吗?
请注意,发生错误时,TEXT FILTER 语法从 'EQ' 更改为 'IN'。使用 ekknPurchaseOrders
和 传递多个值而不是 将语法更改为 'IN' returns ekknPurchaseOrders
.[=20 中第一个元素的值=]
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
Running the code/executing BAPI with EBELN IN ".. results in an SQL_PARSE error, because the syntax is invalid.
WHERE IN
语法在 RFC_READ_TABLE 和 BBP_RFC_READ_TABLE 中完美运行,你的问题出在其他地方。
对代码进行故障排除时需要注意的三个时刻:
OPTIONS
参数对您可能遇到的单行有 72 个字符的限制。检查您的条件长度,并根据需要将其分成几行。
OPTIONS
行不“喜欢”缺少空格所以不要保留字符
代替行
objOptTab(objOptTab.RowCount, "TEXT") = "EBELN IN ('050112','060201')
推这个
objOptTab(objOptTab.RowCount, "TEXT") = " EBELN IN ( '050112', '060201' )
- 并且不要忘记转义
ekknPurchaseOrders
中的每个值 should be enclosed in single quotes!
我创建了一个宏来使用 BAPI BBP_RFC_READ_TABLE
从 SAP Table 读取数据。
如果我使用 FILTER VIEW,它会成功编译并运行单个参数:
objOptTab(objOptTab.RowCount, "TEXT") = "EBELN EQ '12345'"
但是,代码的目标是能够将字符串数组作为文本过滤器传递,因此 ekknPurchaseOrders
变量存在。由于 SAP 使用 SQL 查询并与通用 SQL 语言共享大量语法,我假设我可以在下面作为文本过滤器传递:
ekknPurchaseOrders = "('12345', '67890', '101112')"
这就是为什么首先出现下面一行的原因:
"EBELN IN " & ekknPurchaseOrders'
运行 code/executing BAPI with EBELN IN "
.. 导致 SQL_PARSE 错误,因为语法无效。
关于我可以使用什么语法将多个值的集合传递给 EBELN TEXT FILTER,有什么建议吗?
请注意,发生错误时,TEXT FILTER 语法从 'EQ' 更改为 'IN'。使用 ekknPurchaseOrders
和 传递多个值而不是 将语法更改为 'IN' returns ekknPurchaseOrders
.[=20 中第一个元素的值=]
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
Running the code/executing BAPI with EBELN IN ".. results in an SQL_PARSE error, because the syntax is invalid.
WHERE IN
语法在 RFC_READ_TABLE 和 BBP_RFC_READ_TABLE 中完美运行,你的问题出在其他地方。
对代码进行故障排除时需要注意的三个时刻:
OPTIONS
参数对您可能遇到的单行有 72 个字符的限制。检查您的条件长度,并根据需要将其分成几行。OPTIONS
行不“喜欢”缺少空格所以不要保留字符
代替行
objOptTab(objOptTab.RowCount, "TEXT") = "EBELN IN ('050112','060201')
推这个
objOptTab(objOptTab.RowCount, "TEXT") = " EBELN IN ( '050112', '060201' )
- 并且不要忘记转义
ekknPurchaseOrders
中的每个值 should be enclosed in single quotes!