call-sap-rfc(alias a,rfc b,[inMap c,timeout d,filter e,outList f,debug g,h,i,j,k])
Gruppe |
Hinweis: Siehe auch Abschnitt SAP RFC.
Ruft einen RFC b eines SAP-Systems auf, das über den Alias in a definiert ist. Für den Aufruf notwendige Parameter sind in einer Named Map mit Namen c hinterlegt. Antwortwerte und -tabellen werden zeilenweise als Rückgabewert der Funktion geliefert, sowie (optional) in die Named List oder ein XML-Objekt f geschrieben. Wenn ein Ausgabefilter e definiert ist, werden nur die angegebenen Werte bzw. Tabellen ausgegeben. Wenn eine ABAP-Exception auftritt, deren Name einen der Token aus der Liste h enthält, wird diese Exception ignoriert und stattdessen der Rückgabewert i als Ergebnis geliefert. Alle anderen ABAP-Exceptions führen zum Job-Abbruch. Parameter j für RFC-Queue und Parameter k für JCoContext (siehe Parameter-Tabelle für Details).
Parameterbeschreibung
Parameter |
Beschreibung |
a |
SAP-Alias. |
b |
RFC-Name. |
c |
(optional) Name der Map, die die Eingangsparameter enthält. Default: default. Siehe Unterabschnitt Füllen der Parametermap c vor dem Aufruf. |
d |
(optional) Zeit in Sekunden, auf die auf eine Antwort gewartet wird. Zeiten kleiner drei Sekunden werden ignoriert. Default: 60 |
e |
(optional) Kommaseparierte Liste der Feld- und Tabellennamen und optionalen Indizes, auf die die Rückgabe der Funktion beschränkt sein soll. Default: Keine Ausgabefilterung. Siehe Unterabschnitte Ausgabefilterung durch Parameter e (es können auch ABAP-Exceptions bzw. die gesamte Response im Format SAPXML ausgegeben werden). |
f |
(optional) Mit diesem Parameter können die Antwortwerte zusätzlich (zum Rückgabewert der Funktion) in eine Named List oder ein XML-Objekt geschrieben werden. Bleibt der Parameter leer, wird beides nicht getan. Um zusätzlich in eine Liste zu schreiben, geben Sie hier einfach deren Namen an. Die Liste wird dann automatisch erzeugt (bzw. geleert, falls schon vorhanden). Die Ergebniszeilen werden in das Listen-Objekt eingefügt. Dabei wird auch der Filter e angewendet. Der Rückgabe-Zeilen der Funktion und der Inhalt der Liste sind also gleich. Um zusätzlich in ein XML-Objekt zu schreiben, verwenden Sie vor dem Namen bitte das Präfix :xml: (exakt so geschrieben und ohne Leerzeichen zwischen Präfix und Namen). Das XML-Objekt wird automatisch erzeugt und enthält die gesamte Response des RFCs. Filter e wird dabei nicht angewendet! Die Auswertung der RFC-Response im XML-Objekt können Sie mit den Funktionen select nodes from XML/DOM to List( a, b, c, d, e ) und get value from XML( a, b, c, d, e ) durchführen. Hinweis: Die XML-Struktur im XML-Objekt ist mit der XML-Struktur der Debug-Datei *_debug_RfcOut.xml identisch, die unter Verwendung des Parameters g als lokale Debug-Datei geschrieben werden kann. |
g |
(optional) true, wenn ein Trace des Aufrufs erstellt werden soll. Default: false. Die Namen der erzeugten Tracedateien werden im Log von Lobster_data hinterlegt. Dateinamen-Format: <Jobnummer>_<Timestamp>_debug_<RFC-Name>_<In|Out>.xml, wobei bei einem Mappingtest statt der Jobnummer der Wert T verwendet wird. Die Dateien landen im Ordner ./debug/sap. Wichtiger Hinweis: Selbst wenn der Parameter auf true gesetzt wird, erfolgt das Tracing nur in einem Mapping-Test oder wenn das Tracing für Phase 3 des Profils (oder systemweit) aktiviert wurde. Will man die Debug-Dateien immer schreiben (z. B. in der Probephase als Nachweis für das SAP-Team), also auch in einem normalen Job-Lauf und ohne das Tracing in Phase 3 (mit entsprechendem Overhead), kann man auch den Wert always angeben. Warnung: Diese Dateien werden nicht automatisch gelöscht, es liegt also in der Verantwortung des Benutzers diesen Ordner zu überwachen und Dateien manuell zu löschen, um einen Festplattenüberlauf zu verhindern. Beachten Sie bitte auch, das eine hohe Anzahl von Dateien in diesem Ordner die Performance beeinträchtigen kann. |
h |
(optional) Token-Liste (Trennzeichen Semikolon) der ABAP-Exceptions, die ignoriert werden sollen. |
i |
(optional) Rückgabewert bei einer ignorierten Exception (siehe h). |
j |
(optional) Die zu verwendende RFC-Queue. Wird der Parameter leer gelassen, wird die Default-Queue verwendet. Warnung: Wird ein JCoContext verwendet (siehe Parameter k), wird eine definierte Queue ignoriert! |
k |
(optional) JCoContext erzeugen (true/false). Default: <empty>. Einschränkung: Der JCoContext steht nur für Verbindungen mit JCo-Version 3 zur Verfügung. Für Aliase mit JCo-Version 2.x erfolgt ein Fehlerabbruch, wenn k=true gilt. Wenn ein Aufruf mit k=true erfolgt, wird für den Alias a ein JCoContext erzeugt, der bis zum Ende der Phase 3 dieses Profil-Jobs (oder bis zu einem Fehlerabbruch) besteht. Lediglich mit explizitem k=false kann man einen weiteren Aufruf aus einem bestehenden JCoContext herausnehmen (ein leerer Parameter k beendet den Kontext nicht!). Solch ein Kontext wird für (stateful) BAPI-Aufrufe (Business Objects in SAP) benötigt. Alle BAPI-Aufrufe müssen im selben JCoContext erfolgen, weil sie zusammenhängend sind. Alle Aufrufe zusammen werden dann am Ende committed (BAPI_TRANSACTION_COMMIT). Wenn kein Commit ausgeführt wird bis zum Ende des JCoContexts, werden die innerhalb des JCoContexts an SAP geschriebenen BAPI-Daten verworfen. Normale RFC-Aufrufe müssen nicht committed werden, daher hat dort der JCoContext keine Bedeutung und sollte auch nur für sequenzielle BAPI-Aufrufe erzeugt werden, da er sehr ressourcen-aufwendig ist. Allerdings können Sie in einem bestehenden JCoContext auch normale RFCs aufrufen werden. Beachten Sie dann aber, dass diese nicht zurückgerollt werden bei einem nicht erfolgten Commit, weil sie auch ohne diesen funktionieren! Warnung: Wenn der JCoContext erzeugt wird, wird eine eventuell in Parameter j definierte Queue ignoriert! Hinweis: Im ersten Funktionsaufruf kann der Wert true auch in Großbuchstaben geschrieben werden (TRUE). Dann wird die JCoDestination für diesen Job geclont und zum Beginn ein RFC_PING zum Test der Verbindung ausgeführt. |
Füllen der Parametermap c vor dem Aufruf
Die Funktion erwartet Schlüssel-Werte-Paare in einer bestimmten Notation, damit sie dem jeweiligen Parametertyp im RFC zugewiesen werden können.
Art der Eingangsparameters |
Resultierender Schlüssel pro Wert |
Ein einzelnes Feld. |
Name des Feldes. |
Eine Struktur, die aus einer Liste von Feldern (Komponenten) besteht. |
Strukturname-Feldname |
Eine Tabelle mit den Feldern (Komponenten) als darin enthaltene Spalten. |
Tabellenname[Zeilennummer]-Spaltenname |
Enthält ein Wert in der Map eine Zeichenkette der Art @Variablenname@ wird nach einer Variable mit dem angegebenen Namen gesucht und - sofern vorhanden - der Platzhalter durch den Wert ersetzt. Existiert keine solche Variable, wird der Platzhalter unverändert als Parameter im Aufruf verwendet.
Zur Vereinfachung des Füllens der Parametermap c kann die Funktion fill-map-from-fields( map a, prefix b, index c, hidden d ) genutzt werden.
Bei Strukturen und Tabellen muss beachtet werden, dass die Komponenten (Feldnamen/Spaltennamen) nicht optional sind. Wenn bei einem Strukturtyp eine Komponente angegeben wird, müssen alle anderen Komponenten dieser Struktur ebenfalls definiert werden, gegebenenfalls mit leerem Wert oder dem Default 0 bei numerischen Typen. Bei Tabellen stellt jede Zeile einen Strukturwert dar. Demzufolge müssen auch dort alle Komponenten einer Zeile definiert sein. Bei Tabellen ist weiterhin zu beachten, dass die Zeilennummern lückenlos sein müssen, um einen vorfristigen Abbruch der Parameterliste zu vermeiden.
Falls die Parametermap c mit der Funktion fill-map-from-fields( map a, prefix b, index c, hidden d ) gefüllt wird, müssen in der Zielstruktur des Profils bei Strukturen und bei Tabellen alle Komponenten als Zielfeld definiert sein. Um auch das Einfügen leerer Felder zu erzwingen, muss dort zusätzlich mit der Processing Anweisung val:addempty gearbeitet werden, wie es in der Dokumentation dieser Funktion beschrieben ist.
Nach dem RFC-Aufruf werden im Ergebnis Felder, Strukturen und Tabellen in der gleichen Weise zurückgegeben, wie dies beim Aufruf des RFCs über den zeitgesteuerten Eingangsagenten des Typs SAP geschieht, wenn dort als Format FixRecord ausgewählt wurde. Ein Beispiel ist am Ende dieses Dokuments.
Ausgabefilterung durch Parameter e
Um nur einzelne Felder oder komplette Zeilen einer Tabelle in das Ergebnis aufzunehmen, reicht die Angabe des Feld- bzw. Tabellennamens, z. B. QUERY_TABLE,DATA als Parameter e. Will man nur einen Teil des jeweiligen Wertes, ist es möglich, Teiltextbereiche anzugeben, die für die Zusammensetzung der Ergebniszeile verwendet werden sollen. Diese sind im Format Name[Indexdefinition] oder Name[Indexdefinition} anzugeben, wobei der Zeilenanfang mit Index 1 repräsentiert wird. Geschweifte Klammer am Ende bewirkt ein Entfernen von nachfolgenden Leerzeichen nach dem Durchführen der Teiltextermittlung. Eine Indexdefinition folgt dem Format [vonIndex] oder [vonIndex+länge] oder [vonIndex-bisIndex]. Der bisIndex gilt exklusive, wird er weggelassen, wird das Ende der Zeile genommen. Mehrere Indexdefinitionen können mittels Slash / zusammengesetzt werden.
Im Folgenden seien Varianten von Angaben aufgezeigt. Alle beziehen sich auf eine beispielhafte Zeile (Leerzeichen wurden durch Unterstriche ersetzt).
DATA__________________________Val1______Val2___Val3________Val4____ |
Ausgabefilterangabe |
Bedeutung |
Ergebnis |
DATA |
Jede Zeile komplett. |
Wie oben. |
DATA[1] |
Jede Zeile komplett. |
Wie oben. |
DATA[1} |
Jede Zeile komplett ohne nachfolgende Leerzeichen. |
DATA__[...]__Val4 |
DATA[31] |
Jede Zeile ab Index 31. |
Val1__[...]__Val4____ |
DATA[1-2/31-41/48-60} |
Das erste Zeichen, Feld1, Feld3 ohne nachfolgende Leerzeichen. |
DVal1______Val3 |
DATA[1+2/31-41/48-60} |
Die ersten beiden Zeichen, Feld1, Feld3 ohne nachfolgende Leerzeichen. |
DAVal1______Val3 |
Falls eine Liste in f angegeben wurde, wird das Ergebnis des erfolgreichen Funktionsaufrufs in gleicher Weise und Reihenfolge in dieser Named List gespeichert, sowie als Rückgabewert der Funktion geliefert. Im Rückgabewert sind die einzelnen Datensätze durch eine Zeilenschaltung getrennt, während in der Named List jeder Ergebnis-Datensatz ein einzelner List-Eintrag ist.
ABAP-Exceptions
Wenn der RFC mit einer ABAP-Exception endet, wird normalerweise der Profiljob mit Fehler beendet. Dieses Verhalten kann geändert werden, indem man im Parameter e explizit das Segment EXCEPTION angibt. Dann wird die ABAP-Exception als Segment ausgegeben und kann im Mapping ausgewertet werden. Exceptions aus dem JCo, die nicht vom Typ AbapException sind, können nicht abgefangen werden, sondern beenden den Job.
Format SAPXML
Wenn eine der Filter-Regeln in Parameter e entweder :SAPXML: oder :sapxml: lautet, wird die gesamte Response des RFCs im Format SAPXML zurück gegeben. Alle weiteren Filterregeln außer EXCEPTION werden dann ignoriert.
Dieses XML kann wahlweise in einer einzigen Zeile geliefert werden, wenn :sapxml: (in Kleinbuchstaben) verwendet wird, oder mehrzeilig (formatiert), wenn :SAPXML: (in Großbuchstaben) verwendet wird.
Beide Optionen können zusammen mit Parameter f genutzt werden. Bei einzeiliger XML-Rückgabe enthält die Liste das gesamte XML in einem Element. Bei mehrzeiliger XML-Rückgabe wird die Liste pro Zeile ein Element enthalten.
Beispiel
Der Aufruf der Funktion soll am Beispiel RFC_READ_TABLE gezeigt werden. Siehe Abschnitt Beispiel für "call-sap-rfc".