Mit der
Call
-Anweisung
können Sie aus einem GuiXT Script oder einem InputScript heraus eine Funktion
aufrufen. Es kann sich entweder um einen in ABAP implementierten
Funktionsbaustein handeln, der über die SAP-RFC-Schnittstelle aufgerufen
wird, oder eine lokal (am Frontend) als DLL-Funktion z.B. in VC++
implementierte Funktion.
Zu beachten: Die
Call
-Anweisung
über RFC setzt die Komponente "InputAssistant" voraus.
Weitere Funktionen (wie
automatische Formatkonvertierung, Bündelung von Aufrufen) bietet die
"Open Call" Schnittstelle von GuiXT, siehe unten.
Der Funktionsbaustein /GUIXT/Call wird hierzu benötigt; Sie können
ihn mit dem Transportauftrag
sap.trans.guixtutilities.zip
in Ihrem SAP-System
einspielen
Die Gesamtzahl der Parameter (
export
+
import
)
ist auf maximal 20 begrenzt.
Die Reihenfolge
der Parameter: zuerst die "export" Parameter, dann die "import"
Parameter.
Eine SAP DDIC Strukture
ddicname
kann durch
export.name
(
ddicname
)="vname"
zusätzlich spezifiziert werden. Das ist nur erforderlich bei
Import- order Table-Parametern ohne vorgegebene Stuktur des
aufgerufenen Funktionsbausteins. Die OpenCall-Schnittstelle
überträgt dann die einzelnen Komponenten der GuiXT Variablen in die
entsprechenden namensgleichen Komponenten der DDIC-Struktur.
Bei der Umstellung
bestehender Call-Anweisungen auf die Open Call Schnittstelle bitte
beachten:
Die Notation lehnt
sich an die SAP-Syntax an und bezeichnet mit
export
diejenigen Parameter, die an den
Funktionsbaustein exportiert werden und mit
import
diejenigen, die aus dem Funktionsbaustein
importiert werden.
Sowohl bei
export
als auch
bei
import
bei werden immer Variablennamen
angegeben, nie direkte Werte
Strukturen und Tabellen werden ebenfalls mit
export
und
import
angesprochen; dabei GuiXT
Strukturvariablen bzw. Tabellenvariablen verwenden
Format der OpenCall
Schnittstelle für ABAP OO Remote Method Call
Ruft die Methode "methodname" des angegeben Objekts. Das Objekt muss
der Klasse "classname" angehören. Falls object= nicht angegeben ist,
wird eine statische Methode der KLasse aufgerufen. Die Objekt-Id ist
der Inhalt der GuiXT Variable V[objname]. Das Objekt selbst wird in der
ABAP OO Umgebung anlegt. Die Zuordnung zwischen der Objekt-Id (GuiXT
Kontext) und dem ABAP OO Objekt erfolgt automatisch in der OpenCall
Schnittstelle.
Beispiel:
GuiXT
// start a request bundle
Call bundledRequests="Start"
// Create ALV object
Call cl_salv_table.factory export.t_table(sflights)="mytable" _
export.r_salv_table="alv"
// allow all standard functions
Call cl_salv_table.get_functions object="alv" _
export.value="functions"
Call cl_salv_functions_list.set_all object="functions" _
export.value="TRUE"
// Set Title
Call cl_salv_table.get_display_settings object="alv" _
export.value="display"
Call cl_salv_display_settings.set_list_header object="display"_
export.value="title"
// Set popup position
Call cl_salv_table.set_screen_popup object="alv" _
export.start_column="col1" export.start_line="row1" _
export.end_column="col2" export.end_line="row2"
// display popup
Call cl_salv_table.display object="alv"
// run all calls
Call bundledRequests -dialog
Zusatzoptionen
destination=
Bei RFC.
Die
Optionen bitte unmittelbar hinter dem Namen des Funktionsbausteins
angeben.
Aufruf eines
Funktionsbausteins in einem anderen SAP-System. Die Destination
muss in der Datei
"saprfc.ini"
enthalten sein.
Die Datei saprfc.ini liegt entweder in dem SAP-Workdirectory oder eine
Umgebungsvariable
RFC_INI benennt die Datei.
Weitere inzelheiten bitte der SAP-Dokumentaion entnehmen.
connection=
Bei RFC.
Die
Optionen bitte unmittelbar hinter dem Namen des Funktionsbausteins
angeben.
Aufruf eines
Funktionsbausteins in einem anderen SAP-System. Die
Verbindungssdaten werden direkt angegeben, z.B.
connection="ASHOST=myhost.com SYSNR=00" Benutzer, Passwort,
Sprache und Mandant werden, falls nicht bei connect=
angegeben, automatisch ergänzt.
-try
Bei RFC.
Die
Optionen bitte unmittelbar hinter dem Namen des Funktionsbausteins
angeben.
Falls
der Funktionsbaustein mit einer Exception abbricht, wird keine Fehlermeldung
an den Benutzer ausgegeben. Stattdessen wird in der Systemvariablen
V[_exceptionid] der Name der ausgelösten Exception zur Verfügung gestellt und in
V[_exception) ein Text.
Durch
if Q[ok]
kann nach
Call
abgefragt
werden, ob der Funktionsbaustein normal beendet wurde. Beispiel:
GuiXT
Call "RPY_TABLE_READ" -try _
in.TABLE_NAME="&V[structid]" ..
if not Q[OK]
Return "E: Struktur &V[structid]
nicht im Data Dictionary gefunden" _
-statusline
endif
Falls der Funktionsbaustein
zusätzlich zur Exception eine Fehlermeldung ausgibt, stehen die Informationen zur
Fehlermelfung in folgenden Feldern zur Verfügung:
V[_rfcmsgtype] Meldungstyp, meist 'E'
V[_rfcmsgid] Arbeitsgebiet
V[_rfcmsgno] Nummer der nachricht
V[_rfcmsgv1] Variable 1
V[_rfcmsgv2] Variable 2
V[_rfcmsgv3] Variable 3
V[_rfcmsgv4] Variable 4
Bei RFC.
Die
Optionen bitte unmittelbar hinter dem Namen des Funktionsbausteins
angeben.
Der
Aufruf wird mit dem gerade angemeldeten Benutzer durchgeführt, nicht
mit dem im GuiXT Profile angegebenen RFC-Benutzer.
Bitte beachten:
Bei Single Sign On erfordert diese Option spezielle SNC-Angaben
im GuiXT Profile (RFC OPtions), zum Beispiel: ifCurrentuser=Yes SCN_MODE=1
SNC_PARTNERNAME="p:CN=&database, O=myCompany, C=DE" Details finden Sie in den Tips, Tricks and
Samples unter "Remote Function Call (RFC)"
Bei RFC.
Die
Optionen bitte unmittelbar hinter dem Namen des Funktionsbausteins
angeben.
Der
Aufruf wird so ausgeführt, dass Benutzerdialoge innerhalb der
aufgerufenen Funktion möglich sind.
cache=
Bei RFC.
Die
Optionen bitte unmittelbar hinter dem Namen des Funktionsbausteins
angeben.
Möglich
sind die Angaben
cache="transaction",
cache="session"
und
cache="file"
.
Wirkung: Es wird vor Ausführen des RFC geprüft, ob bereits ein Aufruf
des Funktionsbausteins mit den gleichen Eingaben stattgefunden hat.
Falls ja, werden statt des RFC Aufrufs die Rückgabewerte aus einem
internen Cache gelesen und zurückgeliefert. Falls nein, wird der
RFC ausgeführt; anschliessend werden die zurückgelieferten Daten
im Cache vermerkt.
Als Eingabewerte zählen
die mit in.xxx= angegebenen Werte plus alle Tabelleninhalte table.xxx=.
Wichtig: Falls eine Tabelle
"abc" von dem Funktionsbaustein nicht verarbeitet,
sondern nur zurückgeliefert wird, ist es sinnvoll, sie vor dem Aufruf
durch
Set text[
abc
]
""
zu löschen, damit ihr
Inhalt nicht zu den Cache-Eingabewerten dazugenommen wird. Das würde
zwar nicht zu fehlerhaften Daten führen, die Qualität des Cache
aber erheblich verschlechtern.
Als Ausgabewerte zählen
die mit out.xxx= angegebenen Parameter plus alle Tabelleninhalte
table.xxx=.
Die Gesamtlänge aller
Eingabewerte inklusiv der Parameternamen ist im Cache auf 8000 Zeichen
beschränkt. Bei längeren Werten (insgesamt) wird die
cache=
Angabe
ignoriert.
Bei Angabe von
cache="transaction"
wird ein Cache verwendet,
der pro Neuaufruf einer Transaktion zurückgesetzt wird. Das heisst,
wenn der Benutzer eine Transaktion neu mit /N... oder aus dem Menü
aufruft, werden alle Daten frisch gelesen.
Bei Angabe von
cache="session"
wird dagegen ein
separater Cache verwendet, der für alle Transaktionsaufrufe innerhalb
eines Modus gültig ist.
Die Angabe von
cache="file"
wirkt nur in
Verbindung
VersionNumber
.
Das lokale Dateisystem
wird als Cache verwendet, sodass auch nach Neuanmeldung die
einmal gelesenen Werte zur Verfügung stehen.
Der Session-Cache ist
sinnvoll für Werte wie Benutzereinstellungen oder Customizing-Daten,
während der Transaktionscache für Anwendungsdaten wie Kundenadressen
verwendet werden kann, die sich im Prinzip jederzeit ändern können,
die aber während eines Transaktionsaufrufs nicht ständig nachgelesen
werden müssen.
Für ein eigenes Rücksetzen
des Cache können Sie
ClearCallCache
cache="transaction"
und
ClearCallCache
cache="session"
verwenden. In der Einstiegsmaske
einer Transaktion kann es sinnvoll sein, durch
ClearCallCache cache="transaction"
den Transaktionscache
zurückzusetzen, falls der Benutzer auch z.B. durch F3 oder F12 aus
einem anderen Maske der Transaktion auf das Einstiegsbild gelangen
kann, ohne die Transaktion neu aufzurufen. In diesem Fall beginnt
nämlich die SAP-Anwendung technisch keine neue Transaktion, sodass
der bisherige Transaktionscache noch gültig ist.
Um die über cache=
"file"
gemerkten Werte zu
löschen, bitte
ClearCallCache
cache="file"
verwenden oder die
VersionNumber
erhöhen.
Weitere Zusatzoptionen
für den Fall der Open Call Schnittstelle
-bundle
Bündelt
diesen Call mit weiteren zu einem einzigen RFC-Aufruf, sodass
nur ein einziger Netzwerk-Kommunikationsschritt stattfindet.
bundledRequests="start"
Setzt die
-bundle
Option für alle nachfolgenden Calls
bundledRequests="stop"
Beendet das Setzen der
-bundle
Option für alle nachfolgenden Calls
bundledRequests
Durch
Call bundledRequests
werden alle bisherigen mit der Option
-bundle
versehenen Calls nun gebündelt verarbeitet
-parallelProcessing
Zusatz
bei
Call
bundledRequests
: Die Verarbeitung auf dem SAP
Applikationsserver erfolgt parallelisiert. Je nach Anzahl x der
im SAP definierten Maximalzahl von Alternativmodi wird die
Verarbeitung in x-1 Prozessen durchgeführt. Der Standard im
SAP-System ist x=6, die Maximalzahl x=16. Die Reihenfolge der
Abarbeitung ist dabei nicht festgelegt.
serverGroup=
Zusatz
bei
Call
bundledRequests
: Die Verarbeitung erfolgt auf
der angegebenen, im SAP System definierten Gruppe von
Applikationsservern (SAP-Transaktion: RZ12)
importFromBundle=
Die
Resultate des Calls mit der angegebenen Nummber 1,2,3... werden
aus der gesamten Resultatmenge gelesen und in die beiimport=
angegebenen Variablen gestelltlt.
Durch
Q[ok]
kann abgefragt werden, ob ein Call mit der angegebenen Nummer im
Call-Bündel existiert.
Durch
importFromBundle="*" werden alle
Call-Resultate importiert.
Falls noch kein
Call
bundledRequests
durchgeführt wurde, wird dieser
implizit durch die erste
Call
importFromBunmdle=
Anweisung ausgelöst.
deleteBundledRequests
Die
gesamte Resultatmenge des vorhergehenden gebündelten Aufrufs
wird gelöscht. Implizit löscht auch jeder folgende gebündelte
Zugriff die Resultatmenge des vorhergehenden Bündels.
Die übergebenen Tabellen
dürfen zeichenartige und dezimal gepackte Werte enthalten (ABAP-Typen
C, P, N, D, T)
Die Breite der Tabelle
ist auf 4000 Zeichen beschränkt (beliebig viele Zeilen sind möglich).
Sie können in einem Call pro Tabelle die benötigte Breite aber selbst
auf einen Wert zwischen 1 und 32000 setzen durch den Zusatz (width:xxxx)
hinter dem Tabellennamen:
table.Name1
(width:8000)="tab1"
Handhabung von Tabellen
Tabellen werden
wie Langtexte behandelt. Sie können z.B. die Anweisung
CopyText
benutzen.
Tabelleninhalte werden in beiden Richtungen
übertragen
Sie können Data Dictionary Strukturen
verwenden oder direkt mit Offsets auf Teilfelder zugreifen
Bei Teilfeldern im
ABAP-Format P (dezimal gepackt) bitte die Optionen
-pack beim Setzen von Werten und
-unpack beim Lesen von Werten
verwenden. Bei symbolischen Angaben (Data Dictionary Struktur) wird
die Option -pack bei Setzen eines
Wertes automatisch ergänzt.
Beispiel 1:
Wir benutzen den SAP-Standardfunktionsbaustein "BAPI_USER_GET_DETAIL", um
die Benutzergruppe (Informationen aus Benutzerstammsatz) zu lesen:
GuiXT
Call "BAPI_USER_GET_DETAIL" _
in.USERNAME="&V[_user]" out.LOGONDATA="UserLogonData"
Set V[UserGroup] "&V[UserLogonData](BAPILOGOND-CLASS)"
Danach steht in der Variablen
V[UserGroup]
die Benutzergruppe
zur Verfügung.
Erläuterung (vergleichen Sie
die Schnittstellendefinition in Transaktion SE37):
Den Importing-Parameter
USERNAME
besetzen Sie mit
der Systemvariable
&V[_user]
Zurückgeliefert wird der
Exporting-Parameter
LOGONDATA
im
Parameter
&V[UserLogonData]
Laut Definition der Struktur
BAPILOGOND
enthält das
Teilfeld
CLASS
die Benutzergruppe
Beispiel 2: Ändern eines Benutzerparameters durch Lesen aller Parameter und
Rückschreiben aller Parameter
GuiXT
/ / User parameter id to be changed, and new value:
Set V[Paramid] "ND9"
Set V[Paramva] "Printer2400"
// Read user parameters
Call "BAPI_USER_GET_DETAIL" in.USERNAME="&V[_user]" _
table.PARAMETER1="ipt"
// Clear output parameter table
Set text[opt] ""
// "found" indicator
Set V[found] ""
// Loop through all user parameters
Set V[i] 1
Label next_parameter
CopyText fromText="ipt" toString="p" line="&V[i]"
if Q[ok]
Set V[parid] "&V[p] (BAPIPARAM1-PARID) "
if V[parid=&V[Paramid]]
Set V[p] (BAPIPARAM1-PARVA) "&V[Paramva]"
Set V[found] "X"
endif
// add parameter to new parameter table
CopyText fromString="p" toText="opt" -appendLine
// next line
Set V[i] &V[i] + 1
goto next_parameter
endif
// parameter not found: add parameter line
if not V[found=X]
Set V[p] (BAPIPARAM1-PARID) "&V[Paramid]"
Set V[p] (BAPIPARAM1-PARVA) "&V[Paramva]"
CopyText fromString="p" toText="opt" -appendLine
endif
// Write back parameters
Call "BAPI_USER_CHANGE" in.USERNAME="&V[_user]"_
in.PARAMETERX="X" table.PARAMETER1="opt"
DLL-Aufruf
Die Funktion wird bei z.B. 2 IN und 3 OUT-Parametern vom Typ
definiert. Alle Parameter (in= und out=)
werden in der angegebenen Reihenfolge übergeben. Die maximale Länge jedes
einzelnen Strings beträgt 64000 Bytes. Bitte achten Sie darauf, in dem
Script genügend viele Parameter anzugeben, sonst greift die dll-Funktion
auf eine ungültige Adresse zu.
Der Aufruf einer DLL-Funktion innerhalb eines GuiXT-Scripts mittels der Call-Anweisung ist nur zulässig, wenn sowohl der Name der DLL-Datei als auch die aufgerufene Funktion explizit in der Datei guixt.ini unter "AllowDLLAccess" hinterlegt sind. Diese Sicherheitsrichtlinie gilt ab GuiXT-Version 2025 Q2 4. Beispiele:
Typischerweise werden beim Generieren von ASCII Textdateien doppelte Anführungszeichen um die Zeichen
gelegt. In SAP sind diese Anführungszeichen unerwünscht.
Es wird die Standard-C-Aufrufkonvention CDECL verwendet. Für dll-Funktionen, die STDCALL verlangen, können Sie das durch die Zusatzoption -stdcall angeben:
Sie können die DLL sowie den Quellcode herunterladen und frei verwenden
oder auch erweitern. Bitte beachten Sie, dass Sie richtige Zielplattform
im Projekt auswählen je nach dem, ob Sie für die 32bit oder 64bit
Version von GuiXT bzw. dem SAP GUI erstellen möchten.
Zum Testen des Aufrufs eines ABAP Funktionsbausteins empfiehlt sich die Testumgebung der ABAP Workbench. Sie können im ABAP-Editor in dem aufgerufenen Baustein einen externen Breakpoint setzen und halten dann an der gewünshten Stelle imABAP-Debugger an. Bitte dabei beachten, dass Sie dazu den Namen des RFC-Benutzers in den Debugger-Optionen setzen müssen.
Der für den RFC verwendete
RFC Benutzername und das Passwort sind im GuiXT-Profile hinterlegt (Passwort
ist verschlüsselt).
Die Komponente "GuiXT
Controls" unterstützt den Aufruf von Funktionen, die in VBScript,
JavaScript, VB.NET oder C# implementiert sind.
Komponente
GuiXT +
InputAssistant
Aufruf einer DLL-Funktion: nur GuiXT nötig