「SAP Basis概要の教科書」NO.16 ABAPプログラムからのSAP BAPIの使い方
INDEX LINK
はじめに
前回はSAPのBAPI(汎用モジュール)をSAP Connectorを通して外部プログラムから実行する方法を説明しました。今回は、SAPシステムの中でのBAPIの活用に主眼を置き、ABAPプログラムからBAPIを利用する方法(書き方)について説明いたします。
1.前提条件
外部からBAPIをコールする場合と異なり、事前にツール等を準備する必要はありません。
APBAPプログラムから呼び出して使用するだけです。
2.サンプルプログラムソース
以下に、事前に設定したユーザグループに所属するユーザを一括でロックするプログラムを記します。個々の記述の意味については後続の項でステップを踏んで説明いたします、
このサンプルで使用しているBAPIは「BAPI_USER_LOCK」になります。
REPORT ZBCB0XXX.
*_/_/_/ 変数宣言 _/_/_/*
DATA: E_CLIENT LIKE USGRP_USER-MANDT,
E_USERG LIKE USGRP_USER-USERGROUP,
E_USER LIKE USGRP_USER-BNAME,
ITAB_USGRP_USER LIKE USGRP_USER OCCURS 0 WITH HEADER LINE,
RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
TABLES: USGRP_USER.
*_/_/_/ 選択画面 _/_/_/*
SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-B01.
SELECT-OPTIONS: W_GROUP FOR USGRP_USER-USERGROUP.
SELECTION-SCREEN END OF BLOCK BL1.
*_/_/_/ ロック対象グループ選定 _/_/_/*
SELECT BNAME FROM USGRP_USER INTO CORRESPONDING FIELDS OF TABLE ITAB_USGRP_USER
WHERE USERGROUP IN W_GROUP
AND BNAME IN ( SELECT BNAME FROM USR02 WHERE UFLAG EQ 0 AND USTYP EQ ‘A’).
*_/_/_/ ユーザロック処理 _/_/_/*
LOOP AT ITAB_USGRP_USER.
CLEAR E_USER.
REFRESH RETURN.
E_USER = ITAB_USGRP_USER-BNAME.
CALL FUNCTION ‘BAPI_USER_LOCK’
EXPORTING
USERNAME = E_USER
TABLES
RETURN = RETURN.
IF RETURN-TYPE = ‘S’.
WRITE: / E_USER, ‘ LOCK SUCCESSFULL’.
ELSE.
WRITE: / E_USER, ‘ LOCK FAILED’.
ENDIF.
ENDLOOP.
3.ソースコード各ステップの説明
*_/_/_/ 変数宣言 _/_/_/*
DATA: E_CLIENT LIKE USGRP_USER-MANDT,
E_USERG LIKE USGRP_USER-USERGROUP,
E_USER LIKE USGRP_USER-BNAME,
ITAB_USGRP_USER LIKE USGRP_USER OCCURS 0 WITH HEADER LINE,
RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
TABLES: USGRP_USER.
まずは、プログラムで使う変数を宣言します。上3行は「USGRP_USER」テーブルの列定義を元に「E_CLIENT(クライアント)」「E_USERG(ユーザグループ)」「E_USER(ユーザID)」を、4行目は「USGRP_USER」テーブル自体の定義を元に、一時テーブル「TAB_USGRP_USER」自体を生成しています。(下図参照)
最後の行はBAPI実行時のリターンコードを入れるための変数を構造体BAPIRET2から生成しています。
Tcd:SE11「USGRP_USER」テーブル構造照会画面
*_/_/_/ 選択画面 _/_/_/*
SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME TITLE TEXT-B01.
SELECT-OPTIONS: W_GROUP FOR USGRP_USER-USERGROUP.
SELECTION-SCREEN END OF BLOCK BL1.
次に、ロックするユーザグループを指定する選択画面を用意します。「SELECTION-SCREEN」のBEGINとENDでくくり、その中に選択画面を構成します。「SELECT-OPTIONS」の項で、
テーブル:USGRP_USERからUSERGROUP(グループ名)をFOR文で全部取り出してW_GROUPに取り込みます。その取り込んだW_GROUPからロックしたいグループを選択させることを「SELECT-OPTIONS」で実現しています。
Tcd:SE11「USGRP_USER」テーブル構造照会画面
*_/_/_/ ロック対象グループ選定 _/_/_/*
SELECT BNAME FROM USGRP_USER INTO CORRESPONDING FIELDS OF TABLE ITAB_USGRP_USER
WHERE USERGROUP IN W_GROUP.
次に、選択画面で指定したユーザグループに所属するユーザを抽出します。対象のテーブルは「USGRP_USER」になります。この実テーブルのデータをWHERE句で条件を絞って、事前に定義した内部テーブル「ITAB_USGRP_USER」に格納しています。(ABAPプログラムの中でテーブルデータを処理するために、内部テーブルに格納しています。)
*_/_/_/ ユーザロック処理 _/_/_/*
LOOP AT ITAB_USGRP_USER.
CLEAR E_USER.
REFRESH RETURN.
E_USER = ITAB_USGRP_USER-BNAME.
CALL FUNCTION ‘BAPI_USER_LOCK’
EXPORTING
USERNAME = E_USER
TABLES
RETURN = RETURN.
IF RETURN-TYPE = ‘S’.
WRITE: / E_USER, ‘ LOCK SUCCESSFULL’.
ELSE.
WRITE: / E_USER, ‘ LOCK FAILED’.
ENDIF.
ENDLOOP.
最後に、実際のロック処理を行います。まず、対象のユーザの数分(上のSELECT文で抽出したユーザ分)LOOP処理を作ります。ループ処理の中でユーザロック用のBAPI「BAPI_USER_LOCK」をコールします。入力パラメータはE_USER(ロック対象グループ所属ユーザID)、出力パラメータはRETURN(ロック処理実行後の戻り値)になり、そのRETRUNのタイプによって正常にロックされたかアンロックされたかをWRITE文で画面出力しています。
上記はロックの例ですが、アンロックも「BAPI_USER_LOCK」を用いて同様に作ることができます。
4.補足説明:BAPIの入出力パラメータについて
最初は混乱しやすいのですが、ABAPプログラムから見た「EXPORTING」はBAPI側の「インポート」タブ、「IMPORTING」はBAPI側の「エクスポート」タブ、「TABLES」はBAPI側の「テーブル」タブのパラメータを確認して設定する必要があります。BAPI側の出力が「テーブル」の場合は、そのテーブル定義をさらに確認し、出力されるパラメータをさらに確認する必要があります。
※ABAP側から出るものがBAPI側で入るもの、ABAP側に入るものがBAPI側から出るものと理解して下さい。
下記は「BAPI_USRE_LOCK」の入出力パラメータの確認例です。BAPIによってエクスポートパラメータが「エクスポート」であったり「テーブル(構造)」であったりと異なりますが、
この「BAPI_USRE_LOCK」では「テーブル(構造)」で戻り値をエクスポートしています。
Tcd:SE37 「BAPI_USER_LOCK」参照画面
【インポート(入力)】
【エクスポート(出力)】
【テーブル(出力)】
Tcd:SE11
おわりに
いかがでしたでしょうか。ベーシスというとプログラムとは縁遠く感じるかもしれませんが、ABAPプログラムを理解することで、様々なBAPIを活用して運用作業の効率化を進めることが可能です。是非、どんなBAPIがあるか調べて有用な運用ツールを作成してみて下さい。
次回はクラウドサービス(M365 PowerAutomate)からBAPIをコールしてレポートを生成する方法についてお話しする予定です。