三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!
博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退し、SAPの後進育成と啓蒙活動に従事中!
登場人物紹介
三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!
博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退し、SAPの後進育成と啓蒙活動に従事中!
この記事を読むメリット
バッチインプットを使ったプログラムを使えばトランザクションデータを作成できるって聞いたんだけど、どういったものなんだろう…??
SAPではバッチインプットという機能を用い、SAP上で手作業で実施すべきことを自動化することが可能です。
例えばアドオンプログラムでバッチインプットを利用することで、マスタデータやトランザクションデータを登録することもできます。
今回はバッチインプットの概要からバッチインプットレコーダーの使用方法、ABAPを用いたバッチインプットプログラムの作成について解説します!
新着のSAPフリーランス案件
【FI】
S/4HANAへのバージョンアップ支援(Jrコンサル可)
【PP】
メーカー向けSAP移行プロジェクト支援
【MM】
【SD】
製造業向けロジ領域の運用保守支援
【BASIS】
【MM】
【SD】
製造業向け運用保守支援支援
【CO】
【FI】
【MM】
【PP】
【SD】
大手メーカー社向けSAP導入支援
【FI】
商社向け基幹システムバージョン支援
【FI】
SAP運用業務支援
【FI】
SAP導入プロジェクト支援
【FI】
光学機器 S/4HANA導入テスト支援
【CO】
一般消費財メーカーS/4 HANAバージョンアップ
バッチインプットとは、SAP上で手作業で入力する動作をプログラムで再現し自動入力させる手法です。
アドオンプログラムの中でバッチインプットの処理をすることが可能で、大量のマスタデータやトランザクションデータを処理する際に便利です。
しかしバッチインプットにもデメリットがあります。
対象のマスタデータやトランザクションデータを更新するためのBAPIが準備されていれば、BAPIを用いる方がよいでしょう。
バッチインプットレコーダーとは、SAPの画面を実際に動かしたとき、システム的にどのような挙動をしているのかを記録するものです。
この結果を元にバッチインプットプログラムを作成していきます。
(慣れたらバッチインプットレコーダーを使わずともバッチインプット用のプログラムを作成できるようになるかも)
さっそくバッチインプットレコーダーを動かしてみましょう!
ここではT-CODE:MM01(品目マスタ登録)をレコーディングしていきます。
バッチインプットレコードを登録してみましょう。
ここでは品目マスタ登録(T-CODE:MM01)のバッチインプットをレコーディングしていく例をみていきます!
まず、T-CODE:SHDBを起動し、「新規記録」を押下します。
以下の項目に入力します。
ここでは例として品目マスタ登録(T-CODE:MM01)を行っています。
以下のように登録する品目の情報を入力していきます。
次に以下の手順を実行します。
以上で品目マスタ登録(T-CODE:MM01)での操作は終わりになります!
次に表示される画面は、品目マスタ登録(T-CODE:MM01)を操作した際のバッチインプットレコードの内容です。
バッチインプットレコーダーで記録したものは、SAPで操作した全ての動作や自動で入力された内容も入っており、実際にバッチインプットを動かす際には不要となるレコードも含まれています
プログラム/Dynproのブロックごとに画面での動作を表しています。
下図のように1つの画面に対して1つのプログラム/Dynproのブロックに対応しており、例えばT-CODE:MM01の最初の画面はプログラム:SAPLMGMM/Dynpro:0060のブロックで確認できます。
また、1つのプログラム/Dynproのブロック毎に1つのOKCODEのレコード(項目名が「BDC_OKCODE」のレコード)が存在しています。
これはENTERや実行ボタンなどを押下した場合の内部的なコードを示しています。
加えて、トランザクションコードから呼び出した画面で入力した項目は、以下のようにバッチインプットレコード上でどの項目名に対してどのような項目値を入力したかが記録されています。
項目名が「BDC_CURSOR」や「BDC_SUBSCR」のレコードはカーソルがどの項目に当てられているかが記録されていますが、これはバッチインプットの処理上では不要である場合がほとんどです。
これまでに記録されたバッチインプットレコードの内容を見てみましょう。
プログラム | Dynpro | 開始ID | 項目名 | 項目値 |
---|---|---|---|---|
SAPLMGMM | 0060 | X | ||
BDC_CURSOR | RMMG1-MATNR | |||
BDC_OKCODE | =ENTR | |||
RMMG1-MATNR | test_mat_sato01 | |||
RMMG1-MBRSH | M | |||
RMMG1-MTART | ROH | |||
SAPLMGMM | 0070 | X | ||
BDC_CURSOR | MSICHTAUSW-DYTXT(02) | |||
BDC_OKCODE | =ENTR | |||
MSICHTAUSW-KZSEL(01) | X | |||
MSICHTAUSW-KZSEL(02) | X | |||
SAPLMGMM | 4004 | X | ||
BDC_OKCODE | /00 | |||
BDC_SUBSCR | SAPLMGMM 2004TABFRA1 | |||
BDC_SUBSCR | SAPLMGD1 1002SUB1 | |||
MAKT-MAKTX | test material | |||
BDC_SUBSCR | SAPLMGD1 2001SUB2 | |||
BDC_CURSOR | MARA-MATKL | |||
MARA-MEINS | PC | |||
MARA-MATKL | ZBRAKES | |||
MARA-MSTAE | 03 | |||
BDC_SUBSCR | SAPLMGD1 2561SUB3 | |||
BDC_SUBSCR | SAPLMGD1 2007SUB4 | |||
BDC_SUBSCR | SAPLMGD1 2005SUB5 | |||
BDC_SUBSCR | SAPLMGD1 2011SUB6 | |||
BDC_SUBSCR | SAPLMGD1 2033SUB7 | |||
BDC_SUBSCR | SAPLMGD1 0001SUB8 | |||
BDC_SUBSCR | SAPLMGD1 0001SUB9 | |||
BDC_SUBSCR | SAPLMGD1 0001SUB10 | |||
SAPLMGMM | 4004 | X | ||
BDC_OKCODE | /00 | |||
BDC_SUBSCR | SAPLMGMM 2004TABFRA1 | |||
BDC_SUBSCR | SAPLMGD1 1002SUB1 | |||
MAKT-MAKTX | test material | |||
BDC_SUBSCR | SAPLMGD1 2002SUB2 | |||
MARA-NORMT | aaaaa | |||
BDC_SUBSCR | SAPLMGD1 2010SUB3 | |||
BDC_CURSOR | MARA-PROFL | |||
MARA-PROFL | 001 | |||
BDC_SUBSCR | SAPLLO_SGT_MM 2016SUB4 | |||
BDC_SUBSCR | SAPLMGD1 2003SUB5 | |||
BDC_SUBSCR | SAPLMGD1 2004SUB6 | |||
BDC_SUBSCR | SAPLMGD1 2499SUB7 | |||
BDC_SUBSCR | SAPLADRT21 2000SUB8 | |||
BDC_SUBSCR | SAPLFGSCMPRD_DYN 3011SUB9 | |||
BDC_SUBSCR | SAPLMGD1 2012SUB10 | |||
SAPLSPO1 | 0300 | X | ||
BDC_OKCODE | =YES |
「BDC_CURSOR」や「BDC_SUBSCR」はカーソルの位置を表すもので、実際にコーディングする際は不要なレコードになります。一部の場合を除いて、大抵の場合は不要とみなして良いでしょう。
それらを削除したレコードは以下になります。
プログラム | Dynpro | 開始ID | 項目名 | 項目値 |
---|---|---|---|---|
SAPLMGMM | 0060 | X | ||
BDC_OKCODE | =ENTR | |||
RMMG1-MATNR | test_mat_sato01 | |||
RMMG1-MBRSH | M | |||
RMMG1-MTART | ROH | |||
SAPLMGMM | 0070 | X | ||
BDC_OKCODE | =ENTR | |||
MSICHTAUSW-KZSEL(01) | X | |||
MSICHTAUSW-KZSEL(02) | X | |||
SAPLMGMM | 4004 | X | ||
BDC_OKCODE | /00 | |||
MAKT-MAKTX | test material | |||
MARA-MEINS | PC | |||
MARA-MATKL | ZBRAKES | |||
MARA-MSTAE | 03 | |||
SAPLMGMM | 4004 | X | ||
BDC_OKCODE | /00 | |||
MAKT-MAKTX | test material | |||
MARA-NORMT | aaaaa | |||
MARA-PROFL | 001 | |||
SAPLSPO1 | 0300 | X | ||
BDC_OKCODE | =YES |
上記のうち、色が付いているレコードは画面上でデフォルトで入力されている項目値であり、バッチインプットの際も自動入力されるのでコーディングする際には不要になるレコードになります。
それらを削除したレコードは以下になります。
プログラム | Dynpro | 開始ID | 項目名 | 項目値 |
---|---|---|---|---|
SAPLMGMM | 0060 | X | ||
BDC_OKCODE | =ENTR | |||
RMMG1-MATNR | test_mat_sato01 | |||
RMMG1-MBRSH | M | |||
RMMG1-MTART | ROH | |||
SAPLMGMM | 0070 | X | ||
BDC_OKCODE | =ENTR | |||
MSICHTAUSW-KZSEL(01) | X | |||
MSICHTAUSW-KZSEL(02) | X | |||
SAPLMGMM | 4004 | X | ||
BDC_OKCODE | /00 | |||
MAKT-MAKTX | test material | |||
MARA-MEINS | PC | |||
MARA-MATKL | ZBRAKES | |||
SAPLMGMM | 4004 | X | ||
BDC_OKCODE | /00 | |||
MARA-NORMT | aaaaa | |||
MARA-PROFL | 001 | |||
SAPLSPO1 | 0300 | X | ||
BDC_OKCODE | =YES |
だいぶスッキリしましたね。
この内容と同じバッチインプットレコードのデータを用いれば、品目マスタを登録できるはずです。
実際にABAPを用いてバッチインプットプログラムを作ってみましょう。
バッチインプットセッションを登録してT-CODE:SM35で実行する方法もありますが、今回はプログラムの中から直接トランザクションコードを呼び出してバッチインプットする方法を解説します。
バッチインプットプログラムの作成手順は以下になります。
バッチインプットプログラムの処理の流れ
実際のプログラムを見た方が早いと思いますので、先ほどの品目マスタ作成の例を用いてサンプルプログラムをお見せします!
以下の前提条件でサンプルプログラムを作成してみました。
ABAPを用いたバッチインプットのサンプルコード
*&---------------------------------------------------------------------*
*& Report ZTEST_SATO20
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_sato20 NO STANDARD PAGE HEADING.
* 選択項目定義
PARAMETERS:
p_matnr TYPE mara-matnr. " 品目コード
* 変数定義
DATA:
it_bdcdata TYPE TABLE OF bdcdata, " BDCテーブル
it_bdcmsgcoll TYPE TABLE OF bdcmsgcoll. " バッチインプット処理メッセージ
* 主処理
START-OF-SELECTION.
* 品目マスタ登録の第一画面
PERFORM bdc_dynpro USING 'SAPLMGMM' '0060'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
PERFORM bdc_field USING 'RMMG1-MATNR'
p_matnr. " 選択画面で入力した品目コード
PERFORM bdc_field USING 'RMMG1-MBRSH'
'M'.
PERFORM bdc_field USING 'RMMG1-MTART'
'ROH'.
* 品目マスタ登録のビュー選択画面
PERFORM bdc_dynpro USING 'SAPLMGMM' '0070'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=ENTR'.
PERFORM bdc_field USING 'MSICHTAUSW-KZSEL(01)'
'X'.
PERFORM bdc_field USING 'MSICHTAUSW-KZSEL(02)'
'X'.
* 品目マスタ登録の基本データ1画面
PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'MAKT-MAKTX'
'test material'.
PERFORM bdc_field USING 'MARA-MEINS'
'PC'.
PERFORM bdc_field USING 'MARA-MATKL'
'ZBRAKES'.
* 品目マスタ登録の基本データ2画面
PERFORM bdc_dynpro USING 'SAPLMGMM' '4004'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'MARA-NORMT'
'aaaaa'.
PERFORM bdc_field USING 'MARA-PROFL'
'001'.
* 品目マスタの登録確認画面
PERFORM bdc_dynpro USING 'SAPLSPO1' '0300'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=YES'.
* バッチインプット処理
CALL TRANSACTION 'MM01' " MM01を実行
USING it_bdcdata " バッチインプットデータ
MODE 'N' " 処理モード
UPDATE 'A' " 更新モード
MESSAGES INTO it_bdcmsgcoll.
* メッセージ出力処理
LOOP AT it_bdcmsgcoll INTO DATA(wa_bdcmsgcoll) .
* メッセージを格納
MESSAGE ID wa_bdcmsgcoll-msgid
TYPE wa_bdcmsgcoll-msgtyp
NUMBER wa_bdcmsgcoll-msgnr
WITH wa_bdcmsgcoll-msgv1
wa_bdcmsgcoll-msgv2
wa_bdcmsgcoll-msgv3
wa_bdcmsgcoll-msgv4
INTO DATA(l_text).
* メッセージを出力
WRITE /001 l_text.
ENDLOOP.
*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program TYPE c
dynpro TYPE c.
* 変数定義
DATA:
wa_bdcdata TYPE bdcdata. " BDC構造
CLEAR wa_bdcdata.
wa_bdcdata-program = program.
wa_bdcdata-dynpro = dynpro.
wa_bdcdata-dynbegin = 'X'.
APPEND wa_bdcdata TO it_bdcdata.
ENDFORM.
*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam TYPE c
fval TYPE c.
* 変数定義
DATA:
wa_bdcdata TYPE bdcdata. " BDC構造
CLEAR wa_bdcdata.
wa_bdcdata-fnam = fnam.
wa_bdcdata-fval = fval.
APPEND wa_bdcdata TO it_bdcdata.
ENDFORM.
内部テーブル「it_bdcdata」がBDCテーブルです。
このBDCテーブルに対して、関数「bdc_dynpro(画面名の設定)」「bdc_field(項目入力値やOKコードの設定)」を用いて、バッチインプット用のレコードを格納させていきます。
その後、CALL TRANSACTIONでT-CODE:MM01を呼び出します。
CALL TRANSACTIONでは複数のパラメータを設定することができます。
以下に解説しますが、いろいろ試してみてどういう動作をするか実際動作確認してみると良いでしょう。
CALL TRANSACTIONのパラメータ名 | パラメータの解説 |
---|---|
USING (使用するBDCテーブル) | BDCテーブルを設定します。 |
MODE (処理モード) | バッチインプット時の画面を表示するかどうか設定をすることができます。 【設定内容】 A:すべての画面を表示 E:エラー画面のみ表示 N:画面の表示はしない ※AやEはテスト時に使う場合が多く、たいていの場合はNを設定します。 |
UPDATE (更新モード) | データの更新モードを設定することができます。 ※指定しない場合はAになります。 【設定内容】 A:非同期更新 更新の終了を待たず次の処理を行います。 処理は早いですがロックエラー等の原因にもなります。 S:同期更新 更新の終了まで待機し、終了したら次の処理を行います。 非同期更新より処理は遅くなります。 L:ローカル更新 呼出元プログラムと同じダイアログプロセスで実行します。※筆者は使ったことありません。 |
MESSAGES INTO (メッセージテーブル) | バッチインプットの処理中に表示されるメッセージを格納する内部テーブルを設定します。 例えば、エラーのメッセージタイプのメッセージのみ取り出してログに出力するような使用をします。 構造は「BDCMSGCOLL」を参照します。 |
ちょっとだけABAP7.4以降の新構文を取り入れているので、以下も参考に見比べてみると良いのじゃ!
最後にサンプルプログラムを実際に動かしてみて、期待値通りに動作するか確認してみましょう!
既に登録されている品目コードを選択画面へ入力して、品目マスタを登録してみましょう。
このパターンは想定されていなかったので品目マスタへの登録は失敗するはずです。
実行した結果は以下になります。
期待値通りに、品目マスタは更新されませんでした。
実際の開発では、既存の品目コードが入力された場合も考慮してBDCテーブルを作成する必要があります!
バッチインプットで入力されるであろうデータについて、あらゆるパターンを考慮してBDCテーブルを作成するようにすべし!
次に登録されていない品目コードを選択画面に入力して実行してみましょう。
この場合は品目マスタの登録に成功するはずです。
実行した結果は以下になります。
メッセージの内容的にも品目マスタが登録された旨が表示され、T-CODE:MM03でも品目マスタが登録されていることが確認できました!
バッチインプットを用いたアドオンプログラムは便利な機能ですが、すべての入力パターンを網羅してBDCテーブルを作成することや、実行結果をログに残し失敗したデータをどうやってリカバリするかまで検討して設計することが重要になります。
バッチインプットに関する解説は以上じゃ!
新着のSAPフリーランス案件
【FI】
S/4HANAへのバージョンアップ支援(Jrコンサル可)
【PP】
メーカー向けSAP移行プロジェクト支援
【MM】
【SD】
製造業向けロジ領域の運用保守支援
【BASIS】
【MM】
【SD】
製造業向け運用保守支援支援
【CO】
【FI】
【MM】
【PP】
【SD】
大手メーカー社向けSAP導入支援
【FI】
商社向け基幹システムバージョン支援
【FI】
SAP運用業務支援
【FI】
SAP導入プロジェクト支援
【FI】
光学機器 S/4HANA導入テスト支援
【CO】
一般消費財メーカーS/4 HANAバージョンアップ
SAPラボでは、SAPの知識を活かして副業をしたい方を募集してるのじゃ!
SAPラボのライターの特徴
・ライティング初心者OK!
・報酬高単価!
・業務委託契約なので副業として最適!
SAP記事執筆者としての活動実績として利用可能なので、転職時や案件探しの際に企業へのアピール材料にもなります。
募集要項
・SAP導入や運用保守プロジェクトへの参画経験1年以上
ご応募/お問合せ先
info@sap-labo.com
少しでもご興味ある方、ぜひお気軽にご連絡下さい!
株式会社Luxy(https://luxy-inc.com/company_info/)と株式会社アガルートITパートナーズ(https://agaroot-itp.com/about/)の代表取締役。
新卒でSAPエンジニアとして働き始める。副業で事業を開始したのち、2015年に独立しシステム開発会社を設立。SAPの案件に従事しつつシステム開発事業を成長させ、2021年に会社をバイアウト。その後も創業会社とグループ会社で代表を兼任。
SAPエンジニア・コンサルタント歴は10年以上。
一緒に「SAPラボ」を盛り上げてくれる副業ライター(SAP経験者)を募集してますので、お問い合わせよりお願いします!