受注伝票を作成するBAPI:BAPI_SALESDOCU_CREATEFROMDATA1、BAPI_SALESORDER_CREATEFROMDAT2の使い方

  BAPI

概要

アドオンプログラムで購買発注伝票を作成する場合使用するのにBAPI_SALESDOCU_CREATEFROMDATA1又はBAPI_SALESORDER_CREATEFROMDAT2を使う事ができる。
バッチインプットでも可能だが、カスタマイズに合わせて制御したり、
タブ移動を制御したりかなり大変なので、シンプルに作成したいのであればこれらのBAPIを使用しよう。
この記事では、最低限これだけは入力しておけば登録できるであろうサンプルコードを記載するが、カスタマイズによっては、必須項目が異なってたりする為、ご自身の環境・要件に合わせて変更してもらいたい。

サンプルコード:
BAPI_SALESDOCU_CREATEFROMDATA1

DATA: v_vbeln LIKE vbak-vbeln. "登録時の受注伝票番号
DATA: header LIKE bapisdhead1. "受注伝票ヘッダ
DATA: headerx LIKE bapisdhead1x. "受注伝票ヘッダインジケータ
DATA: item LIKE bapisditem OCCURS 0 WITH HEADER LINE. "受注伝票明細
DATA: itemx LIKE bapisditemx OCCURS 0 WITH HEADER LINE. "受注伝票明細インジケータ
DATA: partner LIKE bapipartnr OCCURS 0 WITH HEADER LINE. "パートナー
DATA: return LIKE bapiret2 OCCURS 0 WITH HEADER LINE. "エラーテーブル
DATA: lt_schedules_in TYPE STANDARD TABLE OF bapischdl WITH HEADER LINE. "納入日程行
DATA: lt_schedules_inx TYPE STANDARD TABLE OF bapischdlx WITH HEADER LINE."納入日程行インジケータ

*受注伝票ヘッダの編集処理
header-doc_type = 'XXXX'
header-sales_org = 'XXXX.
header-distr_chan = 'XX'.
header-division = 'XX'.

*受注伝票ヘッダインジケータの編集処理
headerx-updateflag = 'I'.
headerx-doc_type = 'X'.
headerx-sales_org = 'X'.
headerx-distr_chan = 'X'.
headerx-division = 'X'.

*パートナーの編集処理
partner-partn_role = 'AG'.
partner-partn_numb = '0000000xxx'.
APPEND partner.
partner-partn_role = 'WE'.
partner-partn_numb = '0000000xxx'.
APPEND partner.

*受注伝票明細の編集処理
item-itm_number = '000010'.
item-material = '000000000xxxxxxxxx'.
item-plant = 'XXXX'.
item-target_qty = 1.
item-target_qu = 'ŞT'.
APPEND item.

*受注伝票明細インジケータの編集処理
itemx-updateflag = 'I'.
itemx-itm_number = 'X'
itemx-material = 'X'.

itemx-plant = 'X'.
itemx-target_qty = 'X'.
itemx-target_qu = 'X'.
APPEND itemx.

*納入日程行の編集処理
lt_schedules_in-itm_number = '000010'.
lt_schedules_in-sched_line = '0001'.
lt_schedules_in-req_qty = 1.
APPEND lt_schedules_in.

*納入日程行インジケータの編集処理
lt_schedules_inx-itm_number = '000010'.
lt_schedules_inx-sched_line = '0001'.
lt_schedules_inx-updateflag = 'I'.
lt_schedules_inx-req_qty = 'X'.
APPEND lt_schedules_inx.

*BAPIの呼び出し
CALL FUNCTION 'BAPI_SALESDOCU_CREATEFROMDATA1'
EXPORTING
sales_header_in = header
sales header_inx = headerxl
IMPORTING
salesdocument_ex = v_vbeln
TABLES
return = return
sales_items_in = item
sales_items_inx = itemx
sales_schedules_in = lt_schedules_in
sales_schedules_inx = lt_schedules_inx
sales_partners = partner.
*Check_the return table.
IF NOT v_vbeln IS INITIAL.
*データベースのコミット
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
**** 正常時の処理記述 ****
ELSE.
LOOP AT return WHERE type = 'E' OR type = 'A'.
**** 異常時の処理記述 ****
ENDLOOP.
ENDIF.

サンプルコード:
BAPI_SALESORDER_CREATEFROMDAT2

DATA: v_vbeln LIKE vbak-vbeln. "登録時の受注伝票番号
DATA: header LIKE bapisdhd1. "受注伝票ヘッダ
DATA: headerx LIKE bapisdhd1x. "受注伝票ヘッダインジケータ
DATA: item LIKE bapisditm OCCURS 0 WITH HEADER LINE. "受注伝票明細
DATA: itemx LIKE bapisditmx OCCURS 0 WITH HEADER LINE. "受注伝票明細インジケータ
DATA: partner LIKE bapiparnr OCCURS 0 WITH HEADER LINE. "パートナー
DATA: return LIKE bapiret2 OCCURS 0 WITH HEADER LINE. "エラーテーブル
DATA: lt_schedules_in TYPE STANDARD TABLE OF bapischdl WITH HEADER LINE. "納入日程行
DATA: lt_schedules_inx TYPE STANDARD TABLE OF bapischdlx WITH HEADER LINE."納入日程行インジケータ

*受注伝票ヘッダの編集処理
header-doc_type = 'XXXX'
header-sales_org = 'XXXX.
header-distr_chan = 'XX'.
header-division = 'XX'.

*受注伝票ヘッダインジケータの編集処理
headerx-updateflag = 'I'.
headerx-doc_type = 'X'.
headerx-sales_org = 'X'.
headerx-distr_chan = 'X'.
headerx-division = 'X'.

*パートナーの編集処理
partner-partn_role = 'AG'.
partner-partn_numb = '0000000xxx'.
APPEND partner.
partner-partn_role = 'WE'.
partner-partn_numb = '0000000xxx'.
APPEND partner.

*受注伝票明細の編集処理
item-itm_number = '000010'.
item-material = '000000000xxxxxxxxx'.
item-plant = 'XXXX'.
item-target_qty = 1.
item-target_qu = 'ŞT'.
APPEND item.

*受注伝票明細インジケータの編集処理
itemx-updateflag = 'I'.
itemx-itm_number = 'X'
itemx-material = 'X'.
itemx-plant = 'X'.
itemx-target_qty = 'X'.
itemx-target_qu = 'X'.
APPEND itemx

*納入日程行の編集処理
lt_schedules_in-itm_number = '000010'.
lt_schedules_in-sched_line = '0001'.
lt_schedules_in-req_qty = 1.
APPEND lt_schedules_in.

*納入日程行インジケータの編集処理
lt_schedules_inx-itm_number = '000010'.
lt_schedules_inx-sched_line = '0001'.
lt_schedules_inx-updateflag = 'I'.
lt_schedules_inx-req_qty = 'X'.
APPEND lt_schedules_inx.

*BAPIの呼び出し
CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
EXPORTING
order_header_in = header
order_header_inx = headerxl
IMPORTING
salesdocument = v_vbeln
TABLES
return = return
order_items_in = item
order_items_inx = itemx
order_schedules_in = lt_schedules_in
order_schedules_inx = lt_schedules_inx
order_partners = partner.
*Check_the return table.
IF NOT v_vbeln IS INITIAL.
データベースのコミット
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
**** 正常時の処理記述 ****
ELSE.
LOOP AT return WHERE type = 'E' OR type = 'A'.
**** 異常時の処理記述 ****
ENDLOOP.
ENDIF.

まとめ

これらのBAPIに大きな違いはなく、使用してる構造が異なるぐらいだ。
BAPI_SALESDOCU_CREATEFROMDATA1のが古く、BAPI_SALESORDER_CREATEFROMDAT2の方が新しい。
今後の事を考えるのであればBAPI_SALESORDER_CREATEFROMDAT2を使用したプログラムを開発する方がいいだろう。
また、BAPIを使う上で気をつけないといけない点が外部書式・内部書式だろう。例えば、上記の例では数量単位を’ST’固定で記述しているが、本来であれば’PC’が外部からくるであろう値だ。必要に応じて外部→内部に変換してから値を設定するよう気をつけよう。その他では、日付や、品目等も同様の事が言えるので意識して開発しよう。