SD 参考销售订单创建退货订单:SD_SALESDOCUMENT_CREATE

文章目录

前言


前言

参考正向销售订单创建退货销售订单,代码如下:

代码如下(示例):


*&---------------------------------------------------------------------*
*& 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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值