Öffnen einer SAP GUI Transaktion aus einer Fiori

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!

Über den Autor

Sebastian Garms

SAP Consultant und Passionate tTansformer bei Acando. Als End-to-End-Entwickler und Berater bin ich täglich mit Herausforderungen im Fiori- und SAPUI5-Kontext konfrontiert.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

+ 23 = 25