Moin Moin, hier kommt mal wieder ein innovativer Lösungsansatz direkt aus dem SAPUI5-Maschinenraum!
Usecase
Viele SAP Fioris werden in bestehende Arbeitsprozesse integriert. Das hat zur Konsequenz, dass SAPUI5-Entwickler häufig mit der Anforderung konfrontiert werden, aus ihrer Fiori in eine spezifische Transaktion der klassischen SAP GUI abzuspringen.
Das Problem dabei liegt auf der Hand: Wie verlasse ich die HTML-Welt meines Browsers und gelange in die SAP-Welt? Auf konventionellem Wege bietet sich hier offensichtlich das öffnen der SAP GUI for HTML an, was via URL mehr oder weniger trivial ist.
Doch was wenn SAP GUI for HTML nicht ausreicht, da ihre Transaktionen beispielsweise nicht den Anforderungen der User entsprechen? In diesem Blog liefere ich euch eine einfallsreiche Lösung, die den allermeisten Ansprüchen genügen wird.
Lösung via .sap Datei
Der Schlüssel zum Öffnen einer Transaktion der klassischen SAP GUI liegt im Download einer .sap Datei.
Angenommen der User möchte via Click eines Buttons in die SAP GUI abspringen. Dazu muss das Frontend einen Function-Import ausführen, der über das Backend ein .sap-File erzeugt und uns dessen Inhalt Base64 codiert zurückliefert. Der Function-Import muss natürlich so parametrisiert sein, dass das Backend alle nötigen Informationen hat um die den Inhalt der Datei korrekt zu berechnen.
Function Import mit SAPUI5 rufen
In meinem Beispiel heißt der Function-Import “getSAPGUIShortcut” und hat als einzigen Parameter den Transaktionscode (“Tcode” hier einfach mal die gute alte SE80).
...
onSapGuiButtonPress: function(oEvent){
var that = this;
var oModel = this.getView().getModel();
var mInputData = {
Tcode: "SE80"
};
var sFunction = "/getSAPGUIShortcut";
var mParameters = {
method: "GET",
urlParameters: mInputData,
success: function(oData, oResponse) {
var sBase64Data;
if(oData && oData.getSAPGUIShortcut){
sBase64Data = oData.getSAPGUIShortcut.content;
that._openFileFromBase64(sBase64Data);
},
error: function(oError) {
//ERROR HANDLING NOT PART OF THIS BLOG
}
};
oModel.callFunction(sFunction, mParameters);
}
Was passiert im Backend
Was muss im Backend nun geschehen? Schauen wir uns eine mal eine .sap Datei, oder auch SAP Shortcut genannt, etwas näher an. Dabei handelt es sich nämlich um nicht mehr als eine Text-Datei, die der SAP GUI gewisse Parameter zum Öffnen einer neuen Session übergibt.
Dazu klickt man einfach mal auf einen Shortcut mit der rechten Maustaste und öffnet die Datei im Notepad.
Du weißt nicht wie man einen SAP-Shortcut erstellt? Dann schau mal hier.

Und so sieht so eine .sap Datei dann letztendlich aus:
[System]
Name=XD1
Description=400 XD1 ERP Development
Client=100
[User]
Name=USERABC
Language=EN
[Function]
Title=Object Navigator
Command=SE80
[Configuration]
WorkDir=C:\Users\USERABC\Documents\SAP\SAP GUI
[Options]
Reuse=1
Das interessante dabei ist, dass so eine .sap Datei auch ohne das aufgeführte Directory (WorkDir) auskommt und funktioniert.
Das Backend muss und also einen solchen String erstellen und ihn uns Base64-codiert zurückliefern. In etwa so:

Verarbeiten der Base64 Response
Nun müssen wir den Content-String noch irgendwie speichern bzw. öffnen.
Dabei gibt es starke Unterschiede zwischen IE und den anderen Browsern wie Chrome, Firefox und Co. Irgendwie keine wirkliche Überraschung, oder? 🙂
_openFileFromBase64: function(sBase64Data){
var sFileName = "SE80Shortcut.sap";
// IE workaround
if(window.navigator && window.navigator.msSaveOrOpenBlob){
var byteCharacters = atob(sBase64Data);
var byteNumbers = new Array(byteCharacters.length);
for (var i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
var byteArray = new Uint8Array(byteNumbers);
var blob = new Blob([byteArray], {
type: "application/x-sapshortcut"
});
window.navigator.msSaveOrOpenBlob(blob, sFileName);
}
// much easier if not IE
else{
var sIFrame =
"<iframe style='diyplay:none;'
src='data:application/x-sapshortcut;base64, " +
encodeURI(sBase64Data) +
"'></iframe>";
var div = document.createElement('div');
div.innerHTML = sIFrame.trim();
window.document.body.appendChild(div.firstChild);
}
}
Für User die IE nutzen, kreieren wir einen Blob. Das ist ziemlich umständlich wie ihr seht, da wir unseren Base64-String mehrfach umformen müssen.
In allen anderen Browsern hängen wir einen unsichtbares iFrame an den Body unseres HTML-Dokuments an. Der Browser interpretiert den Mime-Type “x-sapshortcut” automatisch und lädt das Dokument in den Default-Ordner runter.
IE lädt das in die sogenannten “Temporary Internet Files” herunter. Es ist notwendig, dass dieser Ordner in den SAP Security Einstellungen freigegeben wird. Dazu gibt es aber eine SAP Note (1559107) die all unsere Probleme löst 🙂 .
Ich hoffe ich konnte euch das harte Entwicklerleben etwas erleichtern. Ich und meine Kollegen freuen uns, wenn ihr Kontakt zu uns aufnehmt und beantworten gerne eure Fragen via Kommentar oder auch per Mail.
In Hamburch sagt man Tschüüs – und kiek mol wedder in!
Eyyüp Yildirim sagt:
Hi Sebastian,
sehr interessanter Beitrag. Hast Du Dir mal den Funktionsbaustein TH_CREATE_FOREIGN_MODE angeschaut? Mit diesem sollte es auch funktionieren.
Viele Grüße
Eyyüp
sega1de sagt:
Hallo Eyyüp,
stimmt, danke für den Tipp!
Werde ich beim nächsten Mal benutzen!
Gruß,
Sebastian
Mike sagt:
Can you please share the source file for this application. The functions written above have some missing lines.
Michael Donabauer sagt:
Hallo,
ich habe mit folgendem Code das Thema, dass nur ein Download des Shortcutfiles gestartet wird. Wenn ich das runtergeladene File mit Doppelklick öffne, funktioniert auch das Öffnen der Transaktion mit Übergabeparameter korrekt. Vermutlich liegt es daher nicht am Inhalt der Shortcutdatei selber.
JS Code:
var data = modeloSimpleFormUrl.oData;
var sBase64Data = data.URL_CIC0;
var sIFrame = “”;
var div = document.createElement(‘div’);
div.innerHTML = sIFrame.trim();
window.document.body.appendChild(div.firstChild);
Der Inhalt meiner Shorcutdatei sieht so aus:
[System]
Name=ABC
Client=110
GuiParm=
Description=ABC [Entwicklung]
[User]
Name=Benutzer123
Language=DE
[Function]
Title=Titel
Command=cic0 EFINDD_CIC-C_BUPART=1100012345;
[Configuration]
WorkDir=C:\Users\Benutzer123\Documents\SAP\SAP GUI
[Options]
Reuse=1
lg
Michael