实现通用的数据库表读取功能
上一篇讲的是调用 RFC_READ_TABLE
查看 SAP table 的数据。为了方便查看数据,我们可以写一个通用的表查看程序。使用起来比 SAP SE11 或 SE16N 方便点。
本篇没有关于 RFC 调用新的知识点。主要说明函数调用后,VBA 如何处理这些数据并在 Excel 中显示。不熟悉 VBA 的读者可以参考。由于 VBA 本身数据结构的限制,处理过程还是蛮啰嗦的。后续用C#调用的代码会方便很多。
不多说,上代码:
Option ExplicitPublic Sub test()Call LogonCall ReadTable("T030", Sheet1)Call Logoff
End Sub
Private Sub ReadTable(tableName As String, inSheet As Worksheet)Dim functions As SAPFunctionsSet functions &#61; New SAPFunctionsDim fm As SAPFunctionsOCX.FunctionDim optionsTable As SAPTableFactoryCtrl.TableDim dataTable As SAPTableFactoryCtrl.TableDim fieldsTable As SAPTableFactoryCtrl.TableDim delimeter As Stringdelimeter &#61; "~" If sapConnection Is Nothing Then Exit SubSet functions.Connection &#61; sapConnectionIf sapConnection.IsConnected &#61; tloRfcConnected ThenSet fm &#61; functions.Add("RFC_READ_TABLE")fm.Exports("QUERY_TABLE").Value &#61; tableName fm.Exports("DELIMITER").Value &#61; delimeterSet optionsTable &#61; fm.Tables("OPTIONS") Set fieldsTable &#61; fm.Tables("FIELDS") Set dataTable &#61; fm.Tables("DATA") fm.CallIf fm.Exception <> "" ThenDebug.Print fm.ExceptionExit SubEnd IfDim fields() As Variantfields &#61; ItabToArray(fieldsTable)Dim data() As Variantdata &#61; ItabToArray(dataTable)Dim splittedData() As VariantsplittedData &#61; splitData(data, delimeter)Dim r As LongDim c As LongFor r &#61; 1 To UBound(splittedData, 1)For c &#61; 1 To UBound(splittedData, 2)splittedData(r, c) &#61; "&#39;" &#43; splittedData(r, c)NextNextCall WriteData(fields, splittedData, Sheet1)End If
End Sub
Private Function ItabToArray(itab As SAPTableFactoryCtrl.Table) As VariantDim arr() As Variantarr &#61; itab.dataItabToArray &#61; arr
End FunctionPrivate Function splitData(data() As Variant, delimeter As String) As VariantDim dataSplitted() As Variant Dim rowcount As Longrowcount &#61; UBound(data, 1)Dim testcol As Varianttestcol &#61; Split(data(1, 1), delimeter) Dim colcount As Longcolcount &#61; UBound(testcol) &#43; 1ReDim dataSplitted(1 To rowcount, 1 To colcount)Dim line As VariantDim r As LongDim c As LongFor r &#61; 1 To rowcountline &#61; Split(data(r, 1), delimeter) For c &#61; 1 To colcountdataSplitted(r, c) &#61; line(c - 1)NextNextsplitData &#61; dataSplitted
End FunctionPrivate Sub WriteData(fields() As Variant, data() As Variant, inSheet As Worksheet)inSheet.Cells.ClearContentsDim fieldname() As VariantDim fieldtext() As VariantDim rowcount As Integerrowcount &#61; UBound(fields, 1)ReDim fieldname(1 To rowcount)ReDim fieldtext(1 To rowcount)Dim r As IntegerFor r &#61; 1 To UBound(fields, 1)fieldname(r) &#61; fields(r, 1) fieldtext(r) &#61; fields(r, 5) NextDim fieldNameRange As RangeSet fieldNameRange &#61; inSheet.Range("A1")fieldNameRange.Resize(1, UBound(fieldname)).Value &#61; fieldnameDim fieldTextRange As RangeSet fieldTextRange &#61; inSheet.Range("A2")fieldTextRange.Resize(1, UBound(fieldname)).Value &#61; fieldtextDim dataRange As RangeSet dataRange &#61; inSheet.Range("A3")dataRange.Resize(UBound(data, 1), UBound(data, 2)).Value &#61; data
End Sub