文章目录
前言
参考正向销售订单创建退货销售订单,代码如下:
代码如下(示例):
*&---------------------------------------------------------------------*
*& Form FRM_ZSD13_CUSTOMER_MAIN
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_IN
*& <-- TB_OUT
*&---------------------------------------------------------------------*
FORM frm_zsd13_customer_main
USING ps_in TYPE zsd_13_returnorder_app_in
CHANGING ps_out TYPE zsd_13_returnorder_app_out.
DATA:
lv_vbeln TYPE bapivbeln-vbeln,
ls_head TYPE bapisdhd1,
ls_headx TYPE bapisdhd1x,
lt_partner TYPE TABLE OF bapiparnr,
lt_item TYPE TABLE OF bapisditm,
lt_itemx TYPE TABLE OF bapisditmx,
lt_schdl TYPE TABLE OF bapischdl,
lt_schdlx TYPE TABLE OF bapischdlx,
lt_cond TYPE TABLE OF bapicond,
lt_condx TYPE TABLE OF bapicondx,
lt_return TYPE TABLE OF bapiret2.
DATA:lv_posnr TYPE posnr_va,
lv_etenr TYPE etenr,
lv_message TYPE string.
CLEAR:lv_vbeln,ls_head,ls_headx,lv_message,
lt_return,lv_vbeln,lt_partner,lt_item,lt_itemx,lt_schdl,lt_schdlx,lt_cond,lt_condx.
* 抬头数据
ls_head-doc_type = 'ZRE2'.
ls_head-sales_org = ps_in-vkorg.
ls_head-distr_chan = '30'.
ls_head-division = '20'.
ls_head-purch_no_c = ps_in-bstkd.
IF ps_in-zckjhdh IS NOT INITIAL.
SELECT SINGLE vgbel FROM lips WHERE vbeln = @ps_in-zckjhdh INTO @ls_head-ref_doc.
ENDIF.
ls_head-created_by = sy-uname.
SELECT SINGLE vbtyp INTO @DATA(l_vbtyp) FROM tvak
WHERE auart = @ls_head-doc_type.
ls_head-sd_doc_cat = l_vbtyp."订单类别
ls_head-refdoc_cat = 'C'. "订单类别
ls_headx-sales_org = COND #( WHEN ls_head-sales_org IS NOT INITIAL THEN abap_true ) .
ls_headx-distr_chan = COND #( WHEN ls_head-distr_chan IS NOT INITIAL THEN abap_true ) .
ls_headx-doc_type = COND #( WHEN ls_head-doc_type IS NOT INITIAL THEN abap_true ) .
ls_headx-purch_no_c = COND #( WHEN ls_head-purch_no_c IS NOT INITIAL THEN abap_true ) .
ls_headx-ref_doc = COND #( WHEN ls_head-ref_doc IS NOT INITIAL THEN abap_true ) .
ls_headx-sd_doc_cat = COND #( WHEN ls_head-sd_doc_cat IS NOT INITIAL THEN abap_true ) .
ls_headx-refdoc_cat = COND #( WHEN ls_head-refdoc_cat IS NOT INITIAL THEN abap_true ) .
CLEAR:lv_posnr,lv_etenr.
LOOP AT ps_in-tb_detail ASSIGNING FIELD-SYMBOL(<fs_item>).
lv_posnr = lv_posnr + 10.
lv_etenr = lv_etenr + 1.
* 行项目数据
APPEND INITIAL LINE TO lt_item ASSIGNING FIELD-SYMBOL(<f_item>).
<f_item>-itm_number = lv_posnr.
<f_item>-material = <fs_item>-matnr.
<f_item>-target_qty = <fs_item>-kwmeng.
<f_item>-ship_point = ps_in-vkorg.
<f_item>-plant = ps_in-vkorg.
IF <fs_item>-zckjhdxmh IS NOT INITIAL.
<f_item>-ref_doc = ls_head-ref_doc.
SELECT SINGLE vgpos FROM lips WHERE vbeln = @ps_in-zckjhdh AND posnr = @<fs_item>-zckjhdxmh INTO @<f_item>-ref_doc_it.
ENDIF.
APPEND INITIAL LINE TO lt_itemx ASSIGNING FIELD-SYMBOL(<fs_itemx>).
<fs_itemx>-itm_number = lv_posnr.
<fs_itemx>-material = COND #( WHEN <f_item>-material IS NOT INITIAL THEN abap_true ) .
<fs_itemx>-target_qty = COND #( WHEN <f_item>-target_qty IS NOT INITIAL THEN abap_true ) .
<fs_itemx>-ship_point = COND #( WHEN <f_item>-ship_point IS NOT INITIAL THEN abap_true ) .
<fs_itemx>-plant = COND #( WHEN <f_item>-plant IS NOT INITIAL THEN abap_true ) .
IF <fs_item>-zckjhdxmh IS NOT INITIAL.
<fs_itemx>-ref_doc = COND #( WHEN <f_item>-ref_doc IS NOT INITIAL THEN abap_true ) .
<fs_itemx>-ref_doc_it = COND #( WHEN <f_item>-ref_doc_it IS NOT INITIAL THEN abap_true ) .
ENDIF.
* 计划行
APPEND INITIAL LINE TO lt_schdl ASSIGNING FIELD-SYMBOL(<fs_schdl>).
<fs_schdl>-itm_number = lv_posnr.
<fs_schdl>-sched_line = lv_etenr .
<fs_schdl>-req_qty = <fs_item>-kwmeng.
APPEND INITIAL LINE TO lt_schdlx ASSIGNING FIELD-SYMBOL(<fs_schdlx>).
<fs_schdlx>-itm_number = lv_posnr.
<fs_schdlx>-sched_line = lv_etenr .
<fs_schdlx>-req_qty = 'X'.
* 定价条件
* 单价
APPEND INITIAL LINE TO lt_cond ASSIGNING FIELD-SYMBOL(<fs_cond>).
<fs_cond>-itm_number = lv_posnr.
* <fs_cond>-cond_st_no = '999'.
<fs_cond>-cond_type = 'ZB21'.
<fs_cond>-cond_value = <fs_item>-zbhsdj.
<fs_cond>-currency = 'CNY'.
<fs_cond>-roundoffdi = <fs_item>-zbhsdj.
<fs_cond>-condvalue = <fs_item>-zbhsdj.
APPEND INITIAL LINE TO lt_condx ASSIGNING FIELD-SYMBOL(<fs_condx>).
<fs_condx>-itm_number = lv_posnr.
* <fs_condx>-cond_st_no = '999'.
<fs_condx>-cond_type = 'X'.
<fs_condx>-cond_value = 'X'.
<fs_condx>-currency = 'X'.
*
APPEND INITIAL LINE TO lt_cond ASSIGNING <fs_cond>.
<fs_cond>-itm_number = lv_posnr.
* <fs_cond>-cond_st_no = '990'.
<fs_cond>-cond_type = 'ZK14'.
<fs_cond>-cond_value = <fs_item>-zjfdk.
<fs_cond>-currency = 'CNY'.
<fs_cond>-roundoffdi = <fs_item>-zjfdk.
<fs_cond>-condvalue = <fs_item>-zjfdk.
APPEND INITIAL LINE TO lt_condx ASSIGNING <fs_condx>.
<fs_condx>-itm_number = lv_posnr.
* <fs_condx>-cond_st_no = '990'.
<fs_condx>-cond_type = 'X'.
<fs_condx>-cond_value = 'X'.
<fs_condx>-currency = 'X'.
*
APPEND INITIAL LINE TO lt_cond ASSIGNING <fs_cond>.
<fs_cond>-itm_number = lv_posnr.
* <fs_cond>-cond_st_no = '991'.
<fs_cond>-cond_type = 'ZK15'.
<fs_cond>-cond_value = <fs_item>-zxxzl.
<fs_cond>-currency = 'CNY'.
<fs_cond>-roundoffdi = <fs_item>-zxxzl.
<fs_cond>-condvalue = <fs_item>-zxxzl.
APPEND INITIAL LINE TO lt_condx ASSIGNING <fs_condx>.
<fs_condx>-itm_number = lv_posnr.
* <fs_condx>-cond_st_no = '991'.
<fs_condx>-cond_type = 'X'.
<fs_condx>-cond_value = 'X'.
<fs_condx>-currency = 'X'.
*
APPEND INITIAL LINE TO lt_cond ASSIGNING <fs_cond>.
<fs_cond>-itm_number = lv_posnr.
* <fs_cond>-cond_st_no = '992'.
<fs_cond>-cond_type = 'ZK16'.
<fs_cond>-cond_value = <fs_item>-zwlfy.
<fs_cond>-currency = 'CNY'.
<fs_cond>-roundoffdi = <fs_item>-zwlfy.
<fs_cond>-condvalue = <fs_item>-zwlfy.
APPEND INITIAL LINE TO lt_condx ASSIGNING <fs_condx>.
<fs_condx>-itm_number = lv_posnr.
* <fs_condx>-cond_st_no = '992'.
<fs_condx>-cond_type = 'X'.
<fs_condx>-cond_value = 'X'.
<fs_condx>-currency = 'X'.
ENDLOOP.
* 客户数据
lt_partner = VALUE #( ( partn_role = 'AG' partn_numb = ps_in-kunnr )
( partn_role = 'WE' partn_numb = ps_in-kunnr )
( partn_role = 'RE' partn_numb = ps_in-kunnr )
( partn_role = 'RG' partn_numb = ps_in-kunnr ) ).
* 调用bapi
CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
EXPORTING
sales_header_in = ls_head
sales_header_inx = ls_headx
IMPORTING
salesdocument_ex = lv_vbeln
TABLES
return = lt_return
sales_items_in = lt_item
sales_items_inx = lt_itemx
sales_partners = lt_partner
sales_schedules_in = lt_schdl
sales_schedules_inx = lt_schdlx
sales_conditions_in = lt_cond
sales_conditions_inx = lt_condx.
* 结果
LOOP AT lt_return INTO DATA(lw_return)
WHERE type CA 'AEX'.
PERFORM frmi_fill_msg USING lw_return-message
CHANGING lv_message.
ENDLOOP.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ps_out-row_id = ps_in-row_id.
ps_out-is_result = c_msgty_e.
ps_out-is_message = lv_message.
ps_out-vbeln = lv_vbeln.
ps_out-bstkd = ps_in-bstkd.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ps_out-row_id = ps_in-row_id.
ps_out-is_result = c_msgty_s.
ps_out-is_message = '退货销售订单' && lv_vbeln && '创建成功!'.
ps_out-bstkd = ps_in-bstkd.
ENDIF.
ENDFORM.