3xplor3r
Goto Top

SAP Daten per RFC Baustein RFC READTABLE in Excel

Hallo,

ich bin gerade wieder auf mein altes Projekt gestoßen Daten aus SAP in Excel mit dem Funktionsbaustein RFC_READ_TABLE zu schreiben. Der Aufruf und Logon soll dabei aus Excel stattfinden. Dazu hatte ich auf einer bekannten Seite vor langer Zeit Code gefunden, den ich jetzt versuche zu verstehen. Leider wirft er einen Syntaxfehler.

Deklaration
Deklarationen sind klar und verstanden.
'SAP Objekte  
Public objConSMD As Object
Public objLogSMD As Object
Public objRrtSMD As Object
Public objFunSMD As Object
 
'RFC_READ_TABLE Objekte  
Public SMDFunc As Object
Public SMDTabObj As Object
Public rtcLogSMD As Integer
Public SMDData() As String

Sub Start
Die zweifache Schleife ist mir unverständlich. Was passiert dort? UBound bestimmt lt. Hilfe für die 1. Dimension den maximalen Wert. Offenbar läuft die äußere Schleife dann über alle Daten in SMDData. Die innere Schleife macht genau das gleiche. Wird hier die volle Breite durchgegangen wegen der 2 als 2. Dimension? Heißt also es wird über alle Daten gegangen?

Zeile 17 bin ich leider ratlos. Vielleicht kann jemand helfen.
Sub Start()
 
Dim i As Long
Dim k As Long
 
Sheets(1).Select
 
'Sub SAPLogon  
SAPLogon
 
If rtcLogSMD = 1 Then
    'SAPLogon = True  
    SMDRead_Table ("T001")  
 
    For i = 0 To UBound(SMDData, 1)
        For k = 0 To UBound(SMDData, 2)
            Cells(i + 1, UBound(SMDData, 2) - k + 1).Value = SMDData(i, k)
    Next k, i
 
    'Sub SAPLogoff  
    SAPLogoff
End If
 
End Sub

Sub Logon
Zeile 3 kann ich als Variable nirgends auffinden. Ist dies für die ganzen Zuweisungen für die Logondaten notwendig? Ansonsten funktioniert der Logon mit Eingabemaske fehlerfrei.
Private Sub SAPLogon()
 
    Dim lv_cell As Range
 
    'Create Logon Control  
    Set objLogSMD = CreateObject("SAP.Logoncontrol.1")  
    'Get Connection Object  
    Set objConSMD = objLogSMD.NewConnection
    'Set Logon Parameters  
    'Set Systen Parameters  
    objConSMD.System = Range("Zugangsdaten!B1").Value2  
    objConSMD.ApplicationServer = Range("Zugangsdaten!B2").Value2  
    objConSMD.SystemNumber = Range("Zugangsdaten!B3").Value2  
    'Set User Data  
    objConSMD.Client = Range("Zugangsdaten!B4").Value2  
    objConSMD.User = Range("Zugangsdaten!B5").Value2  
    'objConSMD.Password = ""  
    objConSMD.Language = Range("Zugangsdaten!B6").Value2  
    'Set SNC Data  
    objConSMD.SNC = True
    objConSMD.SNCName = Range("Zugangsdaten!B7").Value2  
    objConSMD.SNCQuality = 3
 
    'Open SAP Connection  
    If objConSMD.Logon(0, False) = False Then
        MsgBox Range("Zugangsdaten!B1").Value2 + " Verbindungsfehler"  
        rtcLogSMD = 0
    Exit Sub
    End If
 
    rtcLogSMD = 1
    Set objFunSMD = CreateObject("SAP.Functions")  
    'Log on to the R/3 System.  
    Set objFunSMD.Connection = objConSMD
    Set SMDFunc = objFunSMD.Add("RFC_READ_TABLE")  
 
End Sub

Sub Auslesen beliebige Tabelle
Zeile 7 - 31 sind die Parameter für den Funktionsbaustein. Hier verstehe ich das freetable für die Bereiche Fields, Options und Data nicht richitg.

Aus der Hilfe zur Split Anweisung wurde ich nicht richtig schlau. Wie funktioniert diese Anweisung und wie kann ich den Output verstehen? Ab Zeile 33 - 44 + 51 bin ich dann auch ratlos. Was macht diese doppelt verzweigte Schleife? Die mehrfachen Split Anweisungen lassen sich ja mit einmal erklären und duplizieren bzgl. dem Verständnis. In Zeile 41 kommt es dann auch zum besagten Syntaxfehler.
Sub SMDRead_Table(Table As String)
 
Dim T() As String
Dim i As Long
Dim k As Long
 
SMDFunc.Exports("DELIMITER") = vbTab  
'SMDFunc.Exports("NO_DATA") = "X"  
SMDFunc.Exports("QUERY_TABLE") = Table  
SMDFunc.Exports("ROWCOUNT") = "500"  
 
'******** Create Table Object ************  
Set SMDTabObj = SMDFunc.Tables("FIELDS")  
SMDTabObj.freetable
 
'SMDTabObj.appendrow  
'SMDTabObj.appendrow  
'SMDTabObj.cell(1, 1) = "CHECKTABLE"  
'SMDTabObj.cell(2, 1) = "KEYFLAG"  
 
'******** Create Table Object ************  
Set SMDTabObj = SMDFunc.Tables("OPTIONS")  
SMDTabObj.freetable
'SMDTabObj.appendrow  
'SMDTabObj.cell(1, 1) = "TABNAME EQ '" & Tab_Nam & "' AND LENG NE 0"  
 
'******** Create Table Object ************  
Set SMDTabObj = SMDFunc.Tables("DATA")  
SMDTabObj.freetable
 
If SMDFunc.Call = True Then
'******** Read Result ************  
T = Split(SMDTabObj.Cell(1, 1), vbTab)
 
ReDim SMDData(SMDTabObj.Rows.Count, UBound(T))
 
k = 0
For Each Element In SMDTabObj.Rows
    T = Split(Element("WA"), vbTab)  
    For i = 0 To UBound(T)
        SMDData(k, UBound(T) - i) = T(i)
    Next i
    k = k + 1
Next Element
 
Else
    MsgBox SMDFunc.Exception
End If
 
'*** ohne Mandant  
ReDim Preserve SMDData(SMDTabObj.Rows.Count, UBound(T) - 1)
 
End Sub

Wäre über jede Hilfe dankbar.

Content-Key: 259811

Url: https://administrator.de/contentid/259811

Printed on: April 19, 2024 at 17:04 o'clock

Mitglied: 116301
Solution 116301 Jan 14, 2015, updated at Jan 15, 2015 at 11:27:01 (UTC)
Goto Top
Hallo 3xplor3r!

Zeile 15 bis 18 wohl eher so:
    For i = 0 To UBound(SMDData, 1)
        For k = 0 To UBound(SMDData, 2)
            Cells(i + 1, k + 1).Value = SMDData(i, k) 
        Next 
    Next

Grüße Dieter
Member: 3xplor3r
3xplor3r Jan 15, 2015 at 11:29:07 (UTC)
Goto Top
Hallo Dieter,

kannst du mir auch sagen, was ich da jetzt geändert habe? Deine Lösung behebt den aktuellen Syntaxfehler, aber ich versuche natürlich auch zu verstehen, was da passiert ist.

Desweiteren erscheint jetzt der gleiche Fehler in der zweiten Schleife, also oben im letzten Code Block Zeile 41.
Mitglied: 116301
116301 Jan 15, 2015 at 23:27:46 (UTC)
Goto Top
Hallo 3xplor3r!

Die zweite Schleife sollte so gehen:
For Each Element In SMDTabObj.Rows
    T = Split(Element("WA"), vbTab)  
    For i = 0 To UBound(T)
        SMDData(k, i) = T(i)
    Next
    k = k + 1
Next

Zur Erklärung:
In beiden Fällen sind 2 Schleifen erforderlich, wobei die äußere Schleife die Rows (Zeilen) und die innere jeweils die Columns (Spalten) durchläuft.

Im vorherigen Kommentar hast Du ein 2-Dimensionales Datenfeld, dabei steht UBound(SMDData, 1) für die Anzahl der Rows (Dimension 1) und UBound(SMDData, 2) für die Anzahl der Columns (Dimension 2). Wobei im Datenfeld SMDData die Rows/Columns jeweils bei 0 beginnen und beim Übertragen in die Zellen immer 1 dazu addiert werden muss, da es in Excel keine Zeile(0) und Spalte(0) gibt.

In diesem Beispiel gehen die Rows von 0-5 (Dimension 1) und die Columns von 0-8 (Dimension 2):
711061b54c0bc86946e1b080164b2c4c

Grüße Dieter