创建销售订单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的表格结构去添加