Wie Sie Tabellen mit dem Fuba RFC_READ_TABLE durch externe Anwendungen auslesen
Autor: Alexander Depold | 3. August 2016
Haben Sie sich schon öfter gefragt, wie Sie Funktionsbausteine wie den RFC_READ_TABLE nutzen um auf Ihr SAP System zuzugreifen? Der folgende Blogbeitrag beschreibt Ihnen den Weg von der Erstellung des Programms, über den Verbindungsaufbau bis zur Ausgabe der zurückgelieferten Werte.
Sicherheit
Wenn Sie einem Nutzer das Recht geben mittels RFC auf Ihr System zugreifen zu können sollte Ihnen bewusst sein, dass es sich hierbei um eine sicherheitskritische Berechtigung handelt. Vergeben Sie einem Nutzer die S_RFC Berechtigung, hat dieser die Möglichkeit alle RFC Bausteine im SAP System aufzurufen. Unter diesen Bausteinen befinden sich einige die sich als sicherheitskritisch einordnen lassen, die Änderungen den Einstellungen am System zulassen, oder mit denen es möglich ist neue Nutzer für einen erweiterten Zugriff auf das System anzulegen.
Dennoch kann es unter Umständen sinnvoll sein, zumindest einen kurzfristigen Zugriff über RFC auf das System zuzulassen. Denkbar sind Anwendungen, die Sicherheitsprüfungen auf dem System durchführen. Obwohl das S_RFC Berechtigungsobjekt für solch einen Zugriff vergeben wird, kann der Zugriff dennoch nur über RFC_TYPE auf Funktionsgruppen beschränkt werden. RFC_NAME daher enthält eine Liste von Funktionsgruppen, auf die der Zugriff beschränkt werden soll. Die Destinationen in einer Java Anwendung durch den Zugriff mit dem JCo sollten abgesichert werden. Ebenso ist die Verwendung von SNC für die Verbindung zum SAP System ratsam.
Implementierung mit dem Zugriff über RFC
Damit Sie die grundsätzliche Kommunikation zwischen dem erstellten Projekt und dem SAP System mit einer RFC Verbindung herstellen können, bietet SAP Beispielcode an, mit dem ein Aufruf unterschiedlichster Datenstrukturen aus der Entwicklungsumgebung möglich ist. Auch dieser ist wiederum unter dem Blogbeitrag verlinkt. Für einen ersten Test reicht es aus, wenn die Eigenschaften der Verbindung lokal in der einer Klasse definiert werden. Diese Properties sollten vor der Verwendung auf einem Produktivsystem aus Sicherheitsgründen nicht in einer externen Konfigurationsdatei liegen, sondern wie von der SAP empfohlen, mit einer abstrakten Klasse com.sap.conn.jco.ext.DestinationDataProvider abgebildet werden. Dabei werden die Properties als Hashmap abgelegt und können mit Zugriffmethoden zurückgegeben und verwendet werden.
RFC Schnittstellenbereinigung Scoping Workshop
In diesem Workshop lernen Sie alles notwendige über Ihre RFC Systemlandschaft & die Optimierungsmöglichkeiten. Jetzt teilnehmen!
Im Folgenden wurde mittels JCo und RFC auf ein SAP System zugegriffen um die Systemeigenschaften vom SAP System auszugeben.
Download der Connectoren
Vor der Entwicklung müssen Sie die entsprechenden Connectoren aus dem SAP Marketplace herunterladen. Hierbei wird zwischen dem verwendeten Betriebssystem und der verwendeten Programmiersprache unterschieden. Den entsprechenden Link zu den Archiven finden Sie im unter dem Blogbeitrag.
In diesem Beispiel wird der SAP Java Connector mit der Entwicklungsumgebung Eclipse verwendet. Die SAP Connectoren haben den Vorteil, dass sie in beide Richtungen kommunizieren können. Java kann das SAP System aufrufen und ein Aufruf von Java Komponenten aus dem SAP System ist möglich.
Einrichten der Entwicklungsumgebung
Wie gewohnt legen Sie in Ihrer Entwicklungsumgebung je nach Programmiersprache ein Projekt an und fügen die heruntergeladene Library aus dem SAP Marketplace zur Entwicklungsumgebung hinzu. In der erstellten Klasse müssen zunächst die Zugangsdaten zu dem SAP System konfiguriert werden:
Nachfolgend wird eine erste Verbindung zum SAP System aufgebaut, bei dem die Attribute des SAP Systems ausgelesen und ausgegeben werden. Der Variable „DESTINATION_NAME2“ wird der Wert „ABAP_AS_WITHOUT_POOL“ übergeben.
Hierbei wird neben dem Fuba auch die entsprechende Funktion „RFC_READ_TABLE“ definiert. Als Importparameter erwartet der Fuba „RFC_READ_TABLE“ die Tabelle die Ausgegeben werden soll und einen sogenannten Delimiter, der angibt wie die einzelnen Datensätze voneinander getrennt ausgegeben werden sollen:
Die Werte aus der Funktion werden auszugeben, nachfolgend das abgebildete Codebeispiel implementiert wird. Dieser Code kann beispielsweise angepasst werden, um Sortierungen oder Analysen vor der Ausgabe durchzuführen.
Ergebnis des Fuba RFC_READ_TABLE
Nachdem die Funktion des Fubas „RFC_READ_TABLE“ mit der entsprechenden Destination ausgeführt wurde, kann das zurückgelieferte Ergebnis ausgegeben werden. In diesem Beispiel wurde auf die Tabelle DEVACCESS zugegriffen, die alle im System registrierten Entwickler und die dazu gehörigen Entwicklerschlüssel speichert. Die Ausgabe sieht wie folgt aus:
Welche Erfahrungen haben Sie mit der Nutzung des Fubas RFC_READ_TABLE gemacht?
Kontaktieren Sie mich gerne direkt oder hinterlassen Sie einen Kommentar unter dem Beitrag.
Ich freue mich auf Ihr Feedback.
Download des Blogbeitrags
Einen Link zu den SAP Connectoren und zum Beispielcode der zum Verbindungsaufbau genutzt wird, finden Sie in dem nachfolgenden Download
4 Kommentare zu "Wie Sie Tabellen mit dem Fuba RFC_READ_TABLE durch externe Anwendungen auslesen"
Hallo Alexander Depold,
ich bin Auszubildender Fachinformatiker für Anwendungsentwicklung, und stehe nun kurz vor meinen Prüfungen.
Ein Teil der Prüfung ist, ein Projekt zu erstellen, dass man tatsächlich in der Firma verwenden „könnte“.
Nun bin ich in meiner Firma als SAP-User- und Berechtigungsadministrator tätig, und würde deshalb auch gerne das Projekt in diesem Gebiet machen.
Mir kam die Idee, ein Java-Programm zu erstellen, mit dem die User einen SAP-Benutzer + Berechtigungen anlegen oder ändern können (nicht direkt anlegen; dass Programm soll als Benutzer- und Berechtigungsantrag dienen).
Neben den Normalen Textfeldern wie Nachname, Vorname, Funktion, etc…, hätte ich gerne eine Dropdown-Liste, die alle, aktuell im SAP-System angelegten, Rollen anzeigen soll.
Wäre dies mit dem oben beschriebenen Fuba RFC_READ_TABLE möglich?
Also dass ich mir die Rollen aus der Tabelle AGR_DEFINE ziehe, und diese in einer Dropdown-Liste anzeigen lasse?
Ich hoffe, ich konnte mich verständlich genug ausdrücken, und freue mich schon auf Ihre Antwort.
Gruß
Nick
Hallo Nick.
AGR_DEFINE enthält die angelegten Rollen. Und über den Funktionsbaustein kann man auch diese Tabelle auslesen. Was welche Tabelle macht, da empfehle ich unsere Übersicht:
https://rz10.de/sap-berechtigungen/standardtabellen-der-benutzer-und-berechtigungsverwaltung/
Viel Erfolg bei dem Projekt!
Viele Grüße
Tobias Harmes
Hallo Tobias,
ich bin nun schon eine Woche an dem Projekt dran, komme nun aber nicht mehr weiter…
Die Fehlermeldung die ich aktuell bekomme lautet:
„com.sap.conn.jco.JCoException: (106) JCO_ERROR_RESOURCE: Destination ABAP_AS_WITHOUT_POOL does not exist“
Nun lese ich im Web immer wieder, dass ich eine JCo-Destination im SAP einrichten muss? Ist das wirklich zwingend notwendig? Ich habe nämlich erkannt, dass ich gar nicht auf den Content Administrator zugreifen kann (wahrscheinlich benutzen wir das gar nicht, genauso wie J2EE).
Oder muss ich vielleicht eine RFC-Destination im SAP anlegen? Oder liegt der Fehler womöglich nur in meinem Code?
Dankeschön.
Grüße
Nick
Hi Nick.
Ich vermute, du bist da auf eine Anleitung für eine Verbindung zwischen einem ABAP und eine SAP AS JAVA (J2EE) gestoßen. Das benötigst du dafür nicht, wird aber auch als JCo (=Java Connection) bezeichnet.
Vielleicht fehlen deinem Objekt noch die richtigen Parameter? Probier doch mal das Mini-Beispiel-Programm von hier:
https://help.sap.com/doc/saphelp_nwpi711/7.1.1/en-US/48/634503d4e9501ae10000000a42189b/frameset.htm
Auch wenn das schon etwas älter ist, kannst du das zumindest mit deinem Code vergleichen.
Viele Grüße
Tobias