8. BAPIの呼び出し
InputScriptから、Callを使用してSAPシステムの機能モジュール、特にSAPがデータの読み取りおよび保存用に提供する「BAPI」モジュール(ビジネスAPI)を呼び出すことができます。前のチュートリアルで説明した画面トランザクションの場合、場合によっては、対応するSAPトランザクションをスクリプト化する代わりにBAPIを呼び出してデータの保存を実装することもできますが、これには長所と短所があります。
長所
- 特に、SAPトランザクションのスクリプト作成に多数のダイアログステップが必要な場合、BAPIを使用した保存は通常より高速です。
- 保存は、SAPインターフェースの変更とは無関係です。
短所
- すべての必須フィールドをカバーする適切なBAPIが利用可能でなければなりません。
- 実装には、それぞれのBAPIのインターフェースに関する知識が必要です。これは、ABAPレベルでのデバッグでのみ可能な場合があります。
- 通常、不正なエントリの処理は、BAPIよりもSAPインターフェースのほうが適切にカバーされます。
- 必要なすべての許可チェックが常にBAPIで実行されるわけではありません。これは、SAPユーザーインターフェイスを使用する場合に自動的に行われます。
- BAPIインターフェースの場合、常に入力値の内部形式が必要です。したがって、すべての形式変換を自動的に実行するBAPIを呼び出すには、GuiXT Open Call Interfaceを使用することをお勧めします。
例題として、トランザクションIW21のスクリプトの代わりにBAPIを使用して、前のチュートリアルの保全故障レポートの保存を実装します。
設備故障メッセージをすばやく入力するためのGuiXTマスク
BAPIを使用します:
- BAPI_ALM_NOTIF_CREATE
- BAPI_ALM_NOTIF_SAVE
- BAPI_TRANSACTION_COMMIT
- BAPI_TRANSACTION_ROLLBACK
さらに、「チェック」機能では、機器のテキストをデータベースから直接読み取る必要があります。 スクリプトソリューションでは、このテキストはトランザクションIW21から取得されます。
高速エントリインターフェイスを定義するためのGuiXTスクリプトは、前のチュートリアルと同じです。 入力した値の妥当性チェックも同じです。 自身の保存は、BAPI呼び出しによって行われます。
/ —————————————————–
// IW21 Fast data acquisition (check/save)
// File “iw21_simple_save.txt”
// Solution via BAPI calls
// —————————————————–
Parameter MODE // C=Check S=Save
// Plausibility checks
// Equipment specified?
if not V[iw21_equnr]
SetCursor V[iw21_equnr]
Return “E: Please enter the equipment number” -statusline
endif
// Short text specified?
if not V[iw21_qmtxt]
SetCursor V[iw21_qmtxt]
Return “E: Please enter a short text” -statusline
endif
// Date specified?
if not V[iw21_ausvn]
SetCursor V[iw21_ausvn]
Return “E: Please emter the date” -statusline
endif
// Date format correct?
CheckDate “&V[iw21_ausvn]”
if not Q[ok]
SetCursor V[iw21_ausvn]
Return “E: Please check the date -statusline
endif
// Read equipment text
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]”
// Table for returning the database values
CreateTablefont> 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”
//// Transfer equipment text
Setfont> V[iw21_eqktx] “&V[eqkttab.eqkt.1]&]”
// found? otherwise error message
iffont> not V[eqkttab.eqkt.1]
SetCursor V[iw21_equnr]
Return “E: Equipment &V[iw21_equnr] nicht gefunden” -statusline
enendif
// Notification type
Setfont> V[iw21_qmart] &q”M2″
// Notification header
CreateStructurefont> 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]”
//// Copy long text to BAPI format
CreateTablefont> V[bapilongtext] objtype objkey format_col text_line
// Line index for long text lines
Setfont> 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
/// Structures/tables for BAPI call with the required fields
CreateStructure/font> 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”
// Error messages from BAPI?
ReadRow/font> V[bapireturn] table=V[bapireturntab] key=“E”
if Q[ok]
Return “E: &V[bapireturn.message]” -statusline
endif
// Notification number
Set V[qmnum] “&V[iw21_notifheader_export.notif_no]”
// Save notification
Call “BAPI_ALM_NOTIF_SAVE” _
export.NUMBER=“qmnum” _
import.RETURN=“bapireturntab”
// Error messages from BAPI?
ReadRow V[bapireturn] table=V[bapireturntab] key=“E”
if Q[ok]
Return “E: &V[bapireturn.message]” -statusline
endif
// Check only
if U[MODE=C]
Call “BAPI_TRANSACTION_ROLLBACK”
Return “S: Eingabedaten geprüft” -statusline
endif
Call “BAPI_TRANSACTION_COMMIT”
// Reset input data
Clear V[iw21_*]
Clear text[iw21_longtext]
// Stay on fast entry
Set V[iw21_simple] “X”
Return “S: Notification created: &V[qmnum]” -statusline