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

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