Call

Funktion Mit der Call-Anweisung können Sie aus einem GuiXT Skript oder einem InputScript heraus eine Funktion aufrufen.

Die Funktion kann entweder lokal (am Frontend) als dll-Funktion vorliegen (z.B. in VC++ implementiert), oder Sie rufen eine in ABAP geschriebene Funktion auf dem Applikationsserver auf. In diesem Fall wird die Remote Function Call Technologie (RFC) zum Aufruf des Funktionsbausteins eingesetzt.

Zu beachten: Die Call-Anweisung über RFC setzt die Komponente “InputAssistant” voraus.

Beispiele Call "ImgName" dll="guiexits" In="&F[Material]" Out="Datei"

Call "ImgName" In="&F[Material]" Out="MatFileName"

Im ersten Fall wird lokal die dll-Funktion ImgName aufgerufen. Im zweiten Fall wird über RFC der Funktionsbaustein ImgName im R/3 aufgerufen.

Format RFC Aufruf 

Altes Format:
Call "Funktionsname" In="Par1" In="Par2" ... Out="Par1" Out="Par2" ...   

Neues Format:
Call "Funktionsname" In.Name1="Par1" In.Name2="Par2" ... Out.Name1="Par1" Out.Name2="Par2"... Table.Name1="tab1" Table.Name2="tab2" ...   

Call "Funktionsname" Destination="dest" In.Name1="Par1" In.Name2="Par2" ... Out.Name1="Par1" Out.Name2="Par2"... Table.Name1="tab1" Table.Name2="tab2" ...    ...  

dll Aufruf
Call "Funktionsname" dll="dllname" In="Par1" In="Par2" ... Out="Par1" Out="Par2" ...

Zu beachten: Zur Zeit ist die Gesamtzahl der Parameter (In + Out + Table) auf maximal 20 begrenzt

Zusatzoptionen 
-try Bei RFC, Option 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[_exception] der Name der ausgelösten Exception zur Verfügung gestellt. Durch if Q[ok] kann nach Call abgefragt werden, ob der Funktionsbaustein normal beendet wurde. Beispiel:

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

Format RFC Aufruf 

Altes Format:
Call "Funktionsname" In="Par1" In="Par2" ... Out="Par1" Out="Par2" ...   

Neues Format:
Call "Funktionsname" In.Name1="Par1" In.Name2="Par2" ... Out.Name1="Par1" Out.Name2="Par2"... Table.Name1="tab1" Table.Name2="tab2" ...   

Call "Funktionsname" Destination="dest" In.Name1="Par1" In.Name2="Par2" ... Out.Name1="Par1" Out.Name2="Par2"... Table.Name1="tab1" Table.Name2="tab2" ...    ...  

dll Aufruf
Call "Funktionsname" dll="dllname" In="Par1" In="Par2" ... Out="Par1" Out="Par2" ...

Zu beachten: Zur Zeit ist die Gesamtzahl der Parameter (In + Out + Table) auf maximal 20 begrenzt

 Ausgabeparameter Die Ausgabeparameter des 
Call
können in der Form &[name] in allen nachfolgenden Skriptzeilen angesprochen werden. Beispiel:

Call "ImgName" In="&[Material]" Out="MatFileName"
Image
(16,81) (24,100) "&[MatFileName]" Start="&[MatFileName]" -NoStretch

dll-Aufruf Die Funktion wird bei z.B. 2 IN und 3 OUT-Parametern vom Typ

__declspec(dllexport) int funcname(char* p1, char*p2, char* p3, char* p4, char* p5)

definiert. Alle Parameter (In= und Out=) werden in der angegebenen Reihenfolge übergeben. Die maximale Länge jedes einzelnen Strings beträgt 255 Zeichen. Bitte achten Sie darauf, in dem Skript genügend viele Parameter anzugeben, sonst greift die dll-Funktion auf eine ungültige Adresse zu.

Einige nützliche dll-Funktionen können Sie sich auf unserer  dll-download-Seite besorgen

RFC Aufruf Parameterübergabe
Es gibt hierfür 2 Varianten. Entweder arbeiten Sie mit Positionsparametern (ohne Nennung eines Namens):

Call "funktionsname" In="Par1" In="Par2" ... Out="Par1" Out="Par2" ...

In diesem Fall müssen die Importing-Parameter des Funktionsbausteins mit In1, In2, … benannt sein, die Exporting-Parameter mit Out1, Out2,… (R/3 Funktionsbibliothek, Transaktion SE37). Tables-Parameter sind dann nicht möglich.

Oder Sie arbeiten mit benannten Parametern:

Call "funktionsname" In.Name1="Par1" In.Name2="Par2" ... Out.Name1="Par1" Out.Name2="Par2" ...   Table.Name1="tab1" Table.Name2="tab2"

In diesem Fall können die Namen der Parameter Name1, Name2, … beliebig sein.

Restriktionen

  • Die Schnittstelle darf lediglich aus Parametern vom Typ C=Character bestehen, Maximallänge ist 255. Sie können zum Beispiel als Referenzfeld jeweils das Feld SY-LISEL angeben
  • EXCEPTIONS können nicht im Skript abgefangen werden. Es erfolgt in diesem Fall eine entsprechende Nachricht, und der Call wird übergangen
  • Dialoge innerhalb des Funktionsbausteins sind nur möglich, wenn Sie den Funktionsaufruf “Call Function SYSTEM_ATTACH_GUI.” in Ihrem Funktionsbaustein verwenden 
  • Die übergebenen Tabellen dürfen nur zeichenartige Felder enthalten, keine gepackten Werte oder Integer
  • Die Breite der Tabelle ist auf 255 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:4000)="tab1"

Aus Ihrem eigenen Funktionsbaustein können selbstverständlich beliebige andere Funktionsbausteine aufgerufen werden.

Handhabung von Tabellen

  • Tabellen werden in InputScripts wie Langtexte behandelt. Sie können z.B.  die Anweisungen TextBox und CopyText benutzen.  
  • Sie werden in beiden Richtungen übertragen
  • Es gibt keine Unterstützung von Data Dictionary Strukturen in InputScripts. Um einzelne Felder aus einer strukturierten Tabellenzeile anzusprechen, müssen Sie die Substring-Notation ver
    wenden.

Beispiel: Aufruf eines BAPI als RFC
Sie benutzen die Methode “Get_Detail” des R/3 Businessobjekts “User”, um die Benutzergruppe (Informationen aus Benutzerstammsatz) zu lesen: 

Call  “BAPI_USER_GET_DETAIL”   In.Username="&[_user]“   Out.LogonData="UserLogonData”
Set V[UserGroup] “&[UserLogonData](18-29)”

Danach steht in der Variablen &[UserGroup] die Benutzergruppe zur Verfügung.

Erläuterung (vergleichen Sie die Schnittstellendefinition in Transaktion SE37):

  • Den Importing-Parameter  Username besetzen Sie mit der Systemvariable  &[_user]
  • Zurückgeliefert wird der Exporting-Parameter LogonData  im Parameter  &[UserLogonData]
  • Laut Definition der Struktur BapiLogonD steht in den Stellen 18-29 die Benutzergruppe

Beispiel: Anzeige zusätzlicher Daten über RFC

Beispiel: RFC-Aufruf aus einem InputScript

Aufruf in anderen Systemen Es ist möglich, Funktionen in anderen Systemen (R/3 oder auch R/2) aufzurufen. Verwenden Sie hierzu den Parameter Destination=…  Die dort angegebene Destination muss in der Datei saprfc.ini beschrieben sein, vergleichen Sie bitte die SAP-Dokumentation zum RFC.  Die Datei saprfc.ini liegt entweder in dem SAP- Workdirectory oder eine Umgebungsvariable RFC_INI benennt die Datei.

Hierdurch können Sie sehr leicht Informationen aus weiteren Systemen in die R/3 Bilder integrieren.

Tips 
& Tricks
  • Falls Sie zur Implementierung der dll statt VC++ andere Programmiersprachen (z.B. Visual Basic) verwenden wollen, sind eventuell zusätzliche Tools zur Erstellung der dll nötig. Bitte fragen Sie gegebenenfalls bei dem Hersteller der entsprechenden Programmiersprache nach.
  • Zum Austesten des ABAP Funktionsbausteins empfiehlt sich die Testumgebung der ABAP Workbench. Für ein Debugging bei Aufruf aus dem Skript heraus müssen Sie den Aufruf “Call Function SYSTEM_ATTACH_GUI.” vor dem ersten Break-Point verwenden.
  • Der für den RFC verwendete RFC Benutzername und das Passwort sind im GuiXT-Profile hinterlegt (Passwort ist verschlüsselt). Standardmäßig wird der Benutzer SAPCPIC mit seinem Standardpasswort benutzt.

Call