概要
アドオンプログラムで購買発注伝票を作成する場合使用するのに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’が外部からくるであろう値だ。必要に応じて外部→内部に変換してから値を設定するよう気をつけよう。その他では、日付や、品目等も同様の事が言えるので意識して開発しよう。
最近のコメント