使用 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 中完美运行,你的问题出在其他地方。

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

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

  2. OPTIONS行不“喜欢”缺少空格所以不要保留字符

代替行

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

推这个

objOptTab(objOptTab.RowCount, "TEXT") = " EBELN IN ( '050112', '060201' )
  1. 并且不要忘记转义 ekknPurchaseOrders 中的每个值 should be enclosed in single quotes!