Aus einem InputScript können Sie mit
Call
Funktionsbausteine des SAP-Systems aufrufen, insbesondere die "BAPI"
Bausteine (Business API), die von SAP zum Lesen und Speichen von
Daten vorgesehen sind. Bei den im vorangehenden Tutorial
beschriebenen EInbildtransaktionen kann man das Speichern der Daten
statt durch Scripting der entsprechenden SAP-Transaktion auch in
manchen Fällen über den Aufruf eines BAPI implementieren. Das hat
Vor- und Nachteile:
Vorteile
-
Das Speichern über ein BAPI ist meist schneller, insbesondere wenn
bei dem Scripting der SAP-Transaktion sehr viele Schritte ausgeführt
werden müssen
-
Das Speichern ist unabhängig von etwaigen Änderungen der
SAP-Oberfläche
Nachteile
-
Es muss ein passendes BAPI zur Verfügung stehen, das alle benötigten
Felder abdeckt
-
Die Implementierung erfordert die Einarbeitung in die Schnittstelle
des jeweiligen BAPI, was manchmal nur mit Debugging auf ABAP-Ebene
möglich ist
-
Die Behandlung von fehlerhaften Eingaben ist durch die SAP
Oberfläche meist besser abgedeckt als durch die BAPIs
-
Nicht immer werden in einem BAPI alle nötigen Berechtigungsprüfungen
durchgeführt; bei dem Weg über die SAP-Oberfläche ist das
automatisch der Fall
-
Für die BAPI-Schnittstelle benötigen Sie immer die internen Formate
der Eingabewerte. Wir empfehlen deshalb, das
GuiXT Open Call Interface
zum Aufruf des BAPI zu nutzen, welches alle Formatkonvertierungen
automatisch durchführt
Als
Beispiel implementieren wir das Abspeichern der Instandhaltungs-Störmeldung
aus dem vorangehenden Tutorial über ein BAPI statt über das
Scripting der Transaktion IW21:
|

GuiXT Maske zur
Schnellerfassung einer Störmeldung zum Equipment
|
Wir verwenden
die BAPIs
- BAPI_ALM_NOTIF_CREATE
- BAPI_ALM_NOTIF_SAVE
- BAPI_TRANSACTION_COMMIT
- BAPI_TRANSACTION_ROLLBACK
Zusätzlich ist dann bei der Funktion "Prüfen" das direkte Lesen des
Equipment-textes aus der Datenbank nötig, der bei der Scripting-Lösung aus
der Transaktion IW21 abgegriffen wird.
Das GuiXT Script zum Definieren der Schnellerfassungs-Oberfläche ist
identisch mit dem vorangehenden Tutorial. Ebenfalls identisch sind die
Plausibilitätsprüfungen für die eingegebenen Werte. Das Abspeichern selbst
geschieht dann durch BAPI-Aufrufe:
/ -----------------------------------------------------
// IW21 Schnellerfassung
(Prüfen/Sichern)
// Datei "iw21_simple_save.txt"
// Lösung über
BAPI-AUfrufe
//
-----------------------------------------------------
Parameter
MODE // C=Check
S=Save
// Plausibilitätsprüfungen
// Equipment angegeben?
if
not
V[iw21_equnr]
SetCursor
V[iw21_equnr]
Return
"E: Bitte Equipment eingeben"
-statusline
endif
// Kurztext angegeben?
if
not
V[iw21_qmtxt]
SetCursor
V[iw21_qmtxt]
Return
"E: Bitte Kurztext eingeben"
-statusline
endif
// Datum angegeben?
if
not
V[iw21_ausvn]
SetCursor
V[iw21_ausvn]
Return
"E: Bitte Datum prüfen"
-statusline
endif
// Datumsformat korrekt?
CheckDate
"&V[iw21_ausvn]"
if
not
Q[ok]
SetCursor
V[iw21_ausvn]
Return
"E: Bitte Datum prüfen"
-statusline
endif
// Equipmenttext lesen
Set
V[table]
"EQKT"
Set
V[condition]
"EQUNR = @EQUNR AND
SPRAS = '&V[_language]' "
Set
V[fields]
"EQKTX"
Set
V[domname1]
"EQUNR"
Set
V[domvalue1]
"&V[iw21_equnr]"
//
Tabelle zur Rückgabe der Datenbankwerte
CreateTable
V[eqkttab]
eqkt
Call
"/GUIXT/DBSELECT"
cache="transaction"
_
export.TABLE="table"
_
export.CONDITION="condition"
_
export.FIELDS="fields"
_
export.DOMNAME1="domname1"
_
export.DOMvalue1="domvalue1"
_
import.VALUES="eqkttab"
// Equipmenttext übertragen
Set
V[iw21_eqktx]
"&V[eqkttab.eqkt.1]"
// gefunden? sonst Fehlermeldung
if
not
V[eqkttab.eqkt.1]
SetCursor
V[iw21_equnr]
Return
"E: Equipment &V[iw21_equnr] nicht
gefunden"
-statusline
endif
// Meldungsart
Set
V[iw21_qmart]
"M2"
// Meldungskopf
CreateStructure
V[iw21_notifheader]
equipment short_text strmlfndate strmlfntime priority
Set
V[iw21_notifheader.equipment]
"&V[iw21_equnr]"
Set
V[iw21_notifheader.short_text]
"&V[iw21_qmtxt]"
Set
V[iw21_notifheader.strmlfndate]
"&V[iw21_ausvn]"
Set
V[iw21_notifheader.strmlfntime]
"&V[iw21_auztv]"
Set
V[iw21_notifheader.short_text]
"&V[iw21_qmtxt]"
Set
V[iw21_notifheader.priority]
"&V[iw21_priok]"
// Langtext kopieren in BAPI-Format
CreateTable
V[bapilongtext]
objtype objkey format_col text_line
// Zeilenindex für Langtextzeilen
Set
V[k]
1
label
copy_text_line
CopyText
fromText="iw21_longtext"
toString=line
line=&V[k]
if
q[ok]
Set
V[bapilongtext.objtype.&V[k]]
"QMEL"
Set
V[bapilongtext.format_col.&V[k]]
"/"
Set
V[bapilongtext.text_line.&V[k]]
"&V[line]"
Set
V[k]
&V[k]
+ 1
goto
copy_text_line
endif
// Strukturen/Tabellen für BAPI-AUfruf mit den benötigten Feldern
CreateStructure
V[iw21_notifheader_export]
notif_no
CreateStructure
V[bapireturn]
type message
CreateTable
V[bapireturntab]
include=V[bapireturn]
Call
"BAPI_ALM_NOTIF_CREATE"
_
export.NOTIF_TYPE="iw21_qmart"
_
export.NOTIFHEADER="iw21_notifheader"
_
export.LONGTEXTS="bapilongtext"
_
import.NOTIFHEADER_EXPORT="iw21_notifheader_export"
_
import.RETURN="bapireturntab"
// Fehlermeldungen aus BAPI?
ReadRow
V[bapireturn]
table=V[bapireturntab]
key="E"
if
Q[ok]
Return
"E: &V[bapireturn.message]"
-statusline
endif
// Meldungsnummer
Set
V[qmnum]
"&V[iw21_notifheader_export.notif_no]"
// Speichern der Meldung
Call
"BAPI_ALM_NOTIF_SAVE"
_
export.NUMBER="qmnum"
_
import.RETURN="bapireturntab"
// Fehlermeldungen aus BAPI?
ReadRow
V[bapireturn]
table=V[bapireturntab]
key="E"
if
Q[ok]
Return
"E: &V[bapireturn.message]"
-statusline
endif
// nur Prüfen?
if
U[MODE=C]
Call
"BAPI_TRANSACTION_ROLLBACK"
Return
"S: Eingabedaten geprüft"
-statusline
endif
Call
"BAPI_TRANSACTION_COMMIT"
// Eingabedaten zurücksetzen
Clear
V[iw21_*]
Clear
text[iw21_longtext]
// Auf Schnellerfassung bleiben
Set
V[iw21_simple]
"X"
Return
"S: Meldung erzeugt: &V[qmnum]"
-statusline