SAP Jobsuche bei DV-Treff
zero88
  • zero88
  • SAP Forum - Neuling Thema Starter
vor 2 Jahre
Hallo Zusammen

Ich habe ein VBA Code geschrieben mit denen ich gerne über den FUBA: RFC_READ_TABLE daten lesen möchte.

Zitat:

Sub RFCReadTable()

https://www.linkedin.com/pulse/connect-sap-r3-call-custom-fm-from-ms-excel-erkan-kopuz 

https://saplsmw.com/Import_tables_directly_into_Access_from_SAP_using_RFCs 

http://sapass.metro.client.jp/Sap_Active_X/UseFunctionControl.htm 

Set oSap = CreateObject("SAP.Functions")

oSap.Connection.ApplicationServer = "**" ' IP des Appl-Servers (SM51->Details)

oSap.Connection.SystemNumber = "**" ' Systemnummer, meißt im Namen des Appl-Servers enthalten

oSap.Connection.System = "**" ' Entwicklungs-, Test-, Produktivsystem

oSap.Connection.Client = "**" ' Mandant

oSap.Connection.Language = "**" ' Sprache "EN", "DE" ...

oSap.Connection.User = "**" ' SAP-User

oSap.Connection.Password = "**" ' SAP-Passwort

oSap.Connection.UseSAPLogonIni = False

' RFC-Login, wobei

' Logon(0, False): Logon-Fenster anzeigen

' Logon(0, True): Silent logon, Passwort muss gesetzt sein

If oSap.Connection.Logon(0, True) = True Then

Dim oFuBa As Object

' FuBa RFC_READ_TABLE abfragen

Set oFuBa = oSap.Add("RFC_READ_TABLE")

' EXPORTING

Set e_query_table = oFuBa.Exports("QUERY_TABLE")

Set e_delimiter = oFuBa.Exports("DELIMITER")

Set e_rowCount = oFuBa.Exports("ROWCOUNT")

e_query_table.Value = "AFRU" ' Tabelle AFRU

e_delimiter.Value = ";" ' Spalten mit ";" getrennt

e_rowCount.Value = "0" ' max. 100 Datensätze lesen, 0 = alle

' TABLES

Set t_options = oFuBa.Tables("OPTIONS")

Set t_fields = oFuBa.Tables("FIELDS")

' WHERE-Bedingung

t_options.AppendRow

' t_options(1, "TEXT") = "TDOBJECT EQ 'TEXT'"

t_options(1, "TEXT") = "AUFNR EQ '000001228621' AND ISM02 > '0'"

' Welche Spalten sollen gelesen werden

t_fields.AppendRow

t_fields(1, "FIELDNAME") = "AUFNR"

t_fields.AppendRow

t_fields(2, "FIELDNAME") = "RUECK"

t_fields.AppendRow

t_fields(3, "FIELDNAME") = "ISM02"

t_fields.AppendRow

t_fields(4, "FIELDNAME") = "PERNR"

If oFuBa.Call = True Then

' Schnittstellenparameter "TABLES-DATA" holen

' Rückgabe in Excel-Sheet einfügen

Dim iRow As Integer

iRow = 1

Set t_data = oFuBa.Tables("ET_DATA")

' Rückgabemenge beinhaltet Strings, die mit dem festgelegten Separator ";" getrennt sind

For Each Row In t_data.Rows

' Spalten einer Datenzeile anhand des Separators ";" aufsplitten

Dim vFields As Variant

vFields = Split(t_data.Rows(1), ";")

' Inhalt der Spalten in die Zellen schreiben

For iCol = LBound(vFields) To UBound(vFields)

ActiveWorkbook.Sheets(1).Cells(iRow, iCol + 1) = Trim(vFields(iCol))

Next iCol

iRow = iRow + 1

Next

Else

' Exception?

MsgBox oFuBa.Exception

End If

' Logoff

oSap.Connection.logoff

Else

' Kein Login möglich

MsgBox "Login fehlgeschlagen."

End If

End Sub

Das Problem ist das ich die Daten nicht in Data bekomme sondern in ET_Data.

Leider funktioniert der Code nicht wenn ich es in ET_DATA ändere.

Kann mir jemand helfen?

Förderer

Alpmann
vor 2 Jahre
Hallo zero88,

ich habe auch schon mal den RFC_READ_TABLE benutzt. Da hatte ich aber die Zeile

Set t_data = oFuBa.Tables("DATA")

vor dieser:

If oFuBa.Call = True Then

Dies hat bei uns unter SAP GUI 7.40 gut funktioniert. Nachdem wir auf 7.70 Anfang 2022 gewechselt haben, hat dies nicht mehr funktioniert. Warum? Ich konnte es nicht nachvollziehen. Andere RFC fähigen Bausteine haben keine Probleme bereitet. Ich habe das bei uns dann so gelöst, indem ich einen Z-Funktionsbaustein gemacht habe, der mir zu einer gebenen Selektionstabelle (hat nur ein CHAR512 Feld) wo nur WHERE Bedingungen stehen, die Daten der Selektion dann in eine Z_{Tabellenname} packt.

Ich habe dies dann auch noch so "optimiert", dass man als Parameter auch eine Aktion mitgeben kann. Also zum Beispiel:

Selektion: SELECT * FROM [KNA1] into table z_kna1 where ...

Aktion : 1 (entspricht lesen Zusatztabellen)

Nun werden für alle Treffer aus der KNA1 dann bestimmte weitere Tabelle gleichzeitig gelesen. Also bei Kunden zum Beispiel die KNVV, KNVP und KNMT.

Mit freundlichen Grüßen

Matthias Alpmann