SAP 인터페이스 프로 그래 밍 의 RFC 시리즈 (07): 유 니 버 설 데이터베이스 시트 읽 기 기능 구현

4873 단어
전편 에 서 는 RFC 호출 을 다 루 었 습 니 다.READ_TABLE 은 SAP table 의 데 이 터 를 봅 니 다.데 이 터 를 편리 하 게 보기 위해 서, 우 리 는 통용 되 는 시계 보기 프로그램 을 쓸 수 있다.SAP SE 11 이나 SE16N 보다 사용 하기에 편리 합 니 다.
이 편 은 RFC 호출 에 관 한 새로운 지식 이 없다.함수 호출 후 VBA 가 이 데 이 터 를 어떻게 처리 하고 Excel 에 표시 하 는 지 설명 합 니 다.VBA 에 익숙 하지 않 은 독 자 는 참고 할 수 있다.VBA 자체 의 데이터 구조의 제한 으로 인해 처리 과정 은 여전히 매우 수다스럽다.다음 에 C \ # 로 호출 하 는 코드 가 훨씬 편리 할 것 입 니 다.
더 이상 말 하지 않 겠 습 니 다. 코드:
Option Explicit

Public Sub test()
    Call Logon
    Call ReadTable("T030", Sheet1)
    Call Logoff
End Sub

'--------------------------------------'
'  tableName   ,  inSheet     
'--------------------------------------'
Private Sub ReadTable(tableName As String, inSheet As Worksheet)
    Dim functions As SAPFunctions
    Set functions = New SAPFunctions
    Dim fm As SAPFunctionsOCX.Function

    ' RFC_READ_TABLE   table   '
    Dim optionsTable As SAPTableFactoryCtrl.Table
    Dim dataTable As SAPTableFactoryCtrl.Table
    Dim fieldsTable As SAPTableFactoryCtrl.Table

    Dim delimeter As String
    delimeter = "~" '     1'

    If sapConnection Is Nothing Then Exit Sub
    Set functions.Connection = sapConnection

    If sapConnection.IsConnected = tloRfcConnected Then
        'FM  functions collection'
        Set fm = functions.Add("RFC_READ_TABLE")

        '------------------------'
        '  Import parameters
        '------------------------'
        'QUERY_TABLE       
        fm.Exports("QUERY_TABLE").Value = tableName 'Table name

        'DELIMITER          '
        fm.Exports("DELIMITER").Value = delimeter

        Set optionsTable = fm.Tables("OPTIONS")  'OPTIONS     '
        Set fieldsTable = fm.Tables("FIELDS")    'FIELDS       '
        Set dataTable = fm.Tables("DATA")        'DATA      '

        fm.Call

        '   Exception,       '
        If fm.Exception <> "" Then
            Debug.Print fm.Exception
            Exit Sub
        End If

        '   fields     '
        Dim fields() As Variant
        fields = ItabToArray(fieldsTable)

        '   data     '
        Dim data() As Variant
        data = ItabToArray(dataTable)

        '  data  '
        Dim splittedData() As Variant
        splittedData = splitData(data, delimeter)

        '   Excel    ,        , Excel      '
        Dim r As Long
        Dim c As Long
        For r = 1 To UBound(splittedData, 1)
            For c = 1 To UBound(splittedData, 2)
                splittedData(r, c) = "'" + splittedData(r, c)
            Next
        Next

        '  field name, field text data         '
        Call WriteData(fields, splittedData, Sheet1)
    End If
End Sub


'  itab     '
Private Function ItabToArray(itab As SAPTableFactoryCtrl.Table) As Variant
    Dim arr() As Variant
    arr = itab.data

    ItabToArray = arr
End Function


Private Function splitData(data() As Variant, delimeter As String) As Variant
    Dim dataSplitted() As Variant '   '

    Dim rowcount As Long
    rowcount = UBound(data, 1)

    '       '
    Dim testcol As Variant
    testcol = Split(data(1, 1), delimeter) '            '

    Dim colcount As Long
    colcount = UBound(testcol) + 1
    ReDim dataSplitted(1 To rowcount, 1 To colcount)

    Dim line As Variant
    Dim r As Long
    Dim c As Long
    For r = 1 To rowcount
        line = Split(data(r, 1), delimeter) ' line  0  '
        For c = 1 To colcount
            dataSplitted(r, c) = line(c - 1)
        Next
    Next

    splitData = dataSplitted
End Function


Private Sub WriteData(fields() As Variant, data() As Variant, inSheet As Worksheet)
    ' Clear first'
    inSheet.Cells.ClearContents

    Dim fieldname() As Variant
    Dim fieldtext() As Variant

    Dim rowcount As Integer
    rowcount = UBound(fields, 1)
    ReDim fieldname(1 To rowcount)
    ReDim fieldtext(1 To rowcount)

    Dim r As Integer
    For r = 1 To UBound(fields, 1)
        fieldname(r) = fields(r, 1) '     fieldname'
        fieldtext(r) = fields(r, 5) '     fieldtext'
    Next

    ' fieldname fieldtext     '
    '    fieldname'
    Dim fieldNameRange As Range
    Set fieldNameRange = inSheet.Range("A1")
    fieldNameRange.Resize(1, UBound(fieldname)).Value = fieldname

    '    fieldtext'
    Dim fieldTextRange As Range
    Set fieldTextRange = inSheet.Range("A2")
    fieldTextRange.Resize(1, UBound(fieldname)).Value = fieldtext

    '       , splitted data     '
    Dim dataRange As Range
    Set dataRange = inSheet.Range("A3")
    dataRange.Resize(UBound(data, 1), UBound(data, 2)).Value = data
End Sub

좋은 웹페이지 즐겨찾기