創建銷售訂單BAPI的區別:
創建銷售訂單有三個BAPI:
BAPI_SALESORDER_CREATEFROMDAT2
BAPI_CUSTOMERRETURN_CREATE
SD_SALESDOCUMENT_CREATE
BAPI_SALESORDER_CREATEFROMDAT2和BAPI_CUSTOMERRETURN_CREATE 都調用了SD_SALESDOCUMENT_CREATE這個FM,區別在於調用的時候業務類型是寫死的,
BAPI_SALESORDER_CREATEFROMDAT2限制了業務對象為BUS2032,不能用來創建退貨憑證;退貨類型的業務對象是BUS2012,BAPI_CUSTOMERRETURN_CREATE用來創建退貨憑證。
是否退貨類型憑證可以在TVAK表中VBTYP字段判斷,每種憑證類型對應的都有憑證類別,類別為H的就為退貨憑證
以 SD_SALESDOCUMENT_CREATE 為示例 :
DATA: lv_sales_header_in LIKE bapisdhd1, lv_sales_header_inx LIKE bapisdhd1x, lv_logic_switch TYPE bapisdls, lv_salesdocument_ex LIKE bapivbeln-vbeln, lt_sales_items_in LIKE TABLE OF bapisditm WITH HEADER LINE, lt_sales_items_inx LIKE TABLE OF bapisditmx WITH HEADER LINE, lt_sales_schedules_in LIKE TABLE OF bapischdl WITH HEADER LINE, lt_sales_schedules_inx LIKE TABLE OF bapischdlx WITH HEADER LINE, lt_sales_conditions_in LIKE TABLE OF bapicond WITH HEADER LINE, lt_sales_conditions_inx LIKE TABLE OF bapicondx WITH HEADER LINE, lt_sales_text LIKE TABLE OF bapisdtext WITH HEADER LINE, lt_sales_partners_in LIKE TABLE OF bapiparnr WITH HEADER LINE, lt_partner_add LIKE TABLE OF bapiaddr1 WITH HEADER LINE, lt_return LIKE TABLE OF bapiret2 WITH HEADER LINE. DATA: l_answer TYPE c, lv_kwmeng TYPE kwmeng, lv_cond_value TYPE bapikbetr1, lv_cond_value1 TYPE bapikbetr1, lv_sched_line TYPE etenr VALUE '0001', lv_itm_num TYPE posnr_va VALUE '000010'. CLEAR: lt_sales_items_in, lt_sales_items_inx, lt_sales_schedules_in, lt_sales_schedules_inx, lt_sales_conditions_in,lt_sales_conditions_inx, lt_sales_partners_in, lt_return ,lt_alv1,lt_alv1. DATA:xt_ztsd03 TYPE TABLE OF ztsd0003 . READ TABLE gt_alv1 ASSIGNING FIELD-SYMBOL(<xs_alv1>) WITH KEY box = 'X'. IF sy-subrc <> 0 . "Begin of document1 MESSAGE e002(zsd01) . ELSE. LOOP AT gt_alv1 ASSIGNING FIELD-SYMBOL(<gs_alv1>) WHERE box = 'X'. CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR' EXPORTING * percentage = lv_percentage "執行程序的百分比 text = '訂單正在確認中......'. "提示文本 IF <gs_alv1>-vbeln IS INITIAL . ******** sales order header lv_sales_header_in-doc_type = 'ZOR1'. " 銷售憑證類型 ”固定 lv_sales_header_in-sales_org = <gs_alv1>-vkorg. " 銷售機構 lv_sales_header_in-distr_chan = <gs_alv1>-vtweg. " 分銷渠道 lv_sales_header_in-division = <gs_alv1>-spart. " 產品組 lv_sales_header_inx-doc_type = abap_true. lv_sales_header_inx-sales_org = abap_true. lv_sales_header_inx-distr_chan = abap_true. lv_sales_header_inx-division = abap_true. ******** Header texts CLEAR: lt_sales_text[]. APPEND INITIAL LINE TO lt_sales_text ASSIGNING FIELD-SYMBOL(<ls_sales_text>). <ls_sales_text>-itm_number = space. <ls_sales_text>-text_id = '0002'. <ls_sales_text>-langu = sy-langu. <ls_sales_text>-format_col = '*'. <ls_sales_text>-text_line = <gs_alv1>-remark. lv_itm_num = '0010'. LOOP AT gt_itab ASSIGNING FIELD-SYMBOL(<ls_itab2>) WHERE order_no = <gs_alv1>-order_no. <ls_itab2>-kunnr = |{ <ls_itab2>-kunnr ALPHA = IN }| . ******** PARTNER SELECT SINGLE name1,pstlz,adrnr,ort01 FROM kna1 WHERE kunnr = @<ls_itab2>-kunnr INTO ( @DATA(lv_name) ,@DATA(lv_code),@DATA(lv_adrnr),@DATA(lv_city) ). lt_sales_partners_in-partn_role = 'WE'. lt_sales_partners_in-partn_numb = <ls_itab2>-kunnr."送達方 lt_sales_partners_in-title = '公司'."稱謂 lt_sales_partners_in-name = lv_name."名稱1 lt_sales_partners_in-country = 'CN' ."國家代碼 lt_sales_partners_in-postl_code = lv_code ."郵政編碼 lt_sales_partners_in-city = lv_city ."城市 lt_sales_partners_in-street = <ls_itab2>-con_address ."地址 lt_sales_partners_in-district = <ls_itab2>-consignee && ';' && <ls_itab2>-con_phone ."手機號 APPEND lt_sales_partners_in. CLEAR lt_sales_partners_in. lt_sales_partners_in-partn_role = 'AG'. lt_sales_partners_in-partn_numb = <ls_itab2>-kunnr." 售達方 APPEND lt_sales_partners_in. CLEAR lt_sales_partners_in. ******** PARTNERADDRESSES * lt_partner_add-addr_no = lv_adrnr . * lt_partner_add-street = <ls_itab2>-con_phone . * APPEND lt_partner_add. * CLEAR lt_partner_add. ******** sales order item lt_sales_items_in-purch_no_s = <ls_itab2>-order_no. "加前導零 CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' EXPORTING input = <ls_itab2>-matnr IMPORTING output = <ls_itab2>-matnr. lt_sales_items_in-material = <ls_itab2>-matnr. " 物料 lt_sales_items_in-plant = <ls_itab2>-vkorg. " 工廠 lt_sales_items_in-batch = <ls_itab2>-charg. " 庫存地點 lt_sales_items_inx-purch_no_s = abap_true. lt_sales_items_inx-material = abap_true. lt_sales_items_inx-plant = abap_true. lt_sales_items_inx-batch = abap_true. " 批次號 ******** sales order item lt_sales_items_in-itm_number = lv_itm_num. lt_sales_items_inx-itm_number = lv_itm_num. * APPEND: lt_sales_items_in, lt_sales_items_inx. CLEAR: lt_sales_items_in, lt_sales_items_inx. ******** sales Schedule Line lt_sales_schedules_in-itm_number = lv_itm_num. lt_sales_schedules_in-sched_line = lv_sched_line. " L_TABIX. lt_sales_schedules_in-req_date = <gs_alv1>-edatu. " 計划行日期 lt_sales_schedules_in-req_qty = <ls_itab2>-menge. " 以銷售單位計的 訂單數量 lt_sales_schedules_inx-itm_number = lv_itm_num. lt_sales_schedules_inx-sched_line = lv_sched_line. lt_sales_schedules_inx-req_date = abap_true. lt_sales_schedules_inx-req_qty = abap_true. APPEND: lt_sales_schedules_in, lt_sales_schedules_inx. CLEAR: lt_sales_schedules_in, lt_sales_schedules_inx. ******** 復制不變定價因素且重定稅款 lv_logic_switch-pricing = 'G'. * lt_sales_conditions_in-itm_number = lv_itm_num. lt_sales_conditions_in-cond_type = 'Z002'. " 條件類型 定價條件 lt_sales_conditions_in-cond_value = <ls_itab2>-reb_amount. " 價格 定價比率 lt_sales_conditions_in-currency = 'CNY'. " 貨幣碼 * lt_sales_conditions_inx-itm_number = lv_itm_num. lt_sales_conditions_inx-cond_type = 'Z002'. lt_sales_conditions_inx-currency = abap_true. lt_sales_conditions_inx-cond_value = abap_true. APPEND: lt_sales_conditions_in,lt_sales_conditions_inx. CLEAR: lt_sales_conditions_in,lt_sales_conditions_inx,lv_cond_value. lt_sales_conditions_in-itm_number = lv_itm_num. lt_sales_conditions_in-cond_type = 'Z003'. " 條件類型 定價條件 lt_sales_conditions_in-cond_value = <ls_itab2>-exe_amount . " 價格 定價比率 lt_sales_conditions_in-currency = 'CNY'. " 貨幣碼 * lt_sales_conditions_inx-itm_number = lv_itm_num. lt_sales_conditions_inx-cond_type = 'Z003'. lt_sales_conditions_inx-currency = abap_true. lt_sales_conditions_inx-cond_value = abap_true. * APPEND: lt_sales_conditions_in,lt_sales_conditions_inx. CLEAR: lt_sales_conditions_in,lt_sales_conditions_inx,lv_cond_value. lv_itm_num = lv_itm_num + 10 . ENDLOOP. ******** CALL BAPI 'SD_SALESDOCUMENT_CREATE' CLEAR:lv_salesdocument_ex,lt_return,lt_return[]. CALL FUNCTION 'SD_SALESDOCUMENT_CREATE' EXPORTING * salesdocument = <ls_itab2>-vbeln sales_header_in = lv_sales_header_in sales_header_inx = lv_sales_header_inx convert_parvw_auart = abap_on logic_switch = lv_logic_switch IMPORTING salesdocument_ex = lv_salesdocument_ex TABLES return = lt_return sales_items_in = lt_sales_items_in sales_items_inx = lt_sales_items_inx sales_schedules_in = lt_sales_schedules_in sales_schedules_inx = lt_sales_schedules_inx sales_conditions_in = lt_sales_conditions_in sales_conditions_inx = lt_sales_conditions_inx sales_partners = lt_sales_partners_in partneraddresses = lt_partner_add sales_text = lt_sales_text[]. IF sy-subrc EQ 0 AND lv_salesdocument_ex IS NOT INITIAL. <gs_alv1>-zicon = icon_green_light. <gs_alv1>-mseg = lv_salesdocument_ex . <gs_alv1>-vbeln = lv_salesdocument_ex . PERFORM frm_return_dms TABLES lt_alv1 lt_out USING 'Confirmed' . READ TABLE lt_out ASSIGNING FIELD-SYMBOL(<ls_out1>) INDEX 1. IF sy-subrc = 0. IF <ls_out1>-rtnval = '1'. COMMIT WORK. MOVE-CORRESPONDING gt_itab[] TO xt_ztsd03 . DELETE xt_ztsd03 WHERE order_no NE <gs_alv1>-order_no . MODIFY ztsd0003 FROM TABLE xt_ztsd03 . UPDATE ztsd0003 SET vbeln = lv_salesdocument_ex WHERE order_no = <gs_alv1>-order_no . ELSE. ROLLBACK WORK. <gs_alv1>-zicon = icon_red_light. <gs_alv1>-mseg = <ls_out1>-rtnmsg . ENDIF. ENDIF. ELSE. LOOP AT lt_return WHERE type = 'E'. * MESSAGE e000(zsd01) WITH lt_return-message. <gs_alv1>-zicon = icon_red_light. <gs_alv1>-mseg = lt_return-message . EXIT. ENDLOOP. ROLLBACK WORK. ENDIF. CLEAR:lv_sales_header_in,lv_sales_header_inx,lv_logic_switch,lt_sales_items_in[], lt_sales_items_inx[],lt_sales_schedules_in[],lt_sales_schedules_inx[],lt_sales_conditions_in[], lt_sales_conditions_inx,lt_sales_partners_in[],lt_sales_text[]. ELSE. <gs_alv1>-zicon = icon_yellow_light. <gs_alv1>-mseg = '無法重復確認!'. ENDIF. ENDLOOP. ENDIF.
具體需要輸入什么參數可以根據BAPI的表格結構去添加