SD 销售订单修改:BAPI_SALESORDER_CHANGE

上代码:

*&---------------------------------------------------------------------*
*& Form frm_so_modify
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> IS_INPUT
*&      <-- ES_OUTPUT
*&      <-- LV_FLG
*&---------------------------------------------------------------------*
FORM frm_so_modify  USING    us_input  TYPE zssd005a
                    CHANGING cs_output TYPE ty_return_so_m
                             cv_flg    TYPE char01.

  DATA: ls_order_header_in      TYPE bapisdh1,
        ls_order_header_inx     TYPE bapisdh1x,
        lt_order_partners       TYPE TABLE OF bapiparnr,
        lt_partnerchanges       TYPE TABLE OF bapiparnrc,
        lt_order_items_in       TYPE TABLE OF bapisditm,
        lt_order_items_inx      TYPE TABLE OF bapisditmx,
        lt_order_schedules_in   TYPE TABLE OF bapischdl,
        lt_order_schedules_inx  TYPE TABLE OF bapischdlx,
        lt_order_conditions_in  TYPE TABLE OF bapicond,
        lt_order_conditions_inx TYPE TABLE OF bapicondx,
        ls_extensionin          TYPE bapiparex,
        lt_extensionin          TYPE TABLE OF bapiparex,
        ls_bape_vbak            TYPE bape_vbak,
        ls_bape_vbap            TYPE bape_vbap,
        ls_bape_vbakx           TYPE bape_vbakx,
        ls_bape_vbapx           TYPE bape_vbapx,
        lt_return               TYPE TABLE OF bapiret2,
        lv_salesdocument        TYPE bapivbeln-vbeln,
        lv_message              TYPE string,
        ls_logic_switch         TYPE bapisdls.

* 数据转换
  us_input-header-vbeln  = |{ us_input-header-vbeln ALPHA = IN }|.

* 订单类型 借贷项/标准
  SELECT SINGLE tvak~vbtyp
    FROM tvak
    INNER JOIN vbak
    ON tvak~auart = vbak~auart
    INTO @DATA(lv_vbtyp1)
    WHERE vbeln = @us_input-header-vbeln.

* 抬头
  CLEAR:ls_order_header_in,
        ls_order_header_inx.
  ls_order_header_in-sales_off   = us_input-header-vkbur. " 产品组
  ls_order_header_in-sales_grp   = us_input-header-vkgrp. " 销售组
  ls_order_header_in-purch_no_c  = us_input-header-bstkd. " 客户采购订单号
  ls_order_header_in-purch_date  = us_input-header-bstdk. " 客户参考日期
  ls_order_header_in-pmnttrms    = us_input-header-zterm. " 收付条件代码
  ls_order_header_in-currency    = us_input-header-waerk. " 销售和分销凭证货币
  ls_order_header_in-ord_reason  = us_input-header-augru. " 订单原因

  ls_order_header_inx-updateflag = 'U'.
  ls_order_header_inx-sales_off  = COND #( WHEN ls_order_header_in-sales_off  IS NOT INITIAL THEN abap_true )." 产品组
  ls_order_header_inx-sales_grp  = COND #( WHEN ls_order_header_in-sales_grp  IS NOT INITIAL THEN abap_true )." 销售组
  ls_order_header_inx-purch_no_c = COND #( WHEN ls_order_header_in-purch_no_c IS NOT INITIAL THEN abap_true )." 客户采购订单号
  ls_order_header_inx-purch_date = COND #( WHEN ls_order_header_in-purch_date IS NOT INITIAL THEN abap_true )." 客户参考日期
  ls_order_header_inx-pmnttrms   = COND #( WHEN ls_order_header_in-pmnttrms   IS NOT INITIAL THEN abap_true )." 收付条件代码
  ls_order_header_inx-currency   = COND #( WHEN ls_order_header_in-currency   IS NOT INITIAL THEN abap_true )." 销售和分销凭证货币
  ls_order_header_inx-ord_reason = COND #( WHEN ls_order_header_in-ord_reason IS NOT INITIAL THEN abap_true )." 订单原因

* 伙伴
  CLEAR:lt_partnerchanges.
  APPEND INITIAL LINE TO lt_partnerchanges ASSIGNING FIELD-SYMBOL(<fs_partners>).
  <fs_partners>-document   = us_input-header-vbeln.
  <fs_partners>-updateflag = 'U'.
  <fs_partners>-partn_role = 'AG'.  "售达方
  us_input-header-kunnr1 = |{ us_input-header-kunnr1 ALPHA = IN }|.
  <fs_partners>-p_numb_new = us_input-header-kunnr1.

  APPEND INITIAL LINE TO lt_partnerchanges ASSIGNING <fs_partners>.
  <fs_partners>-document   = us_input-header-vbeln.
  <fs_partners>-updateflag = 'U'.
  <fs_partners>-partn_role = 'WE'.  "送达方
  us_input-header-kunnr2 = |{ us_input-header-kunnr2 ALPHA = IN }|.
  <fs_partners>-p_numb_new = us_input-header-kunnr2.

* 增强字段
  CLEAR:lt_extensionin,
        ls_extensionin.
  CLEAR:ls_bape_vbak,
        ls_bape_vbakx.

  ls_bape_vbak-vbeln     = us_input-header-vbeln.
  ls_bape_vbak-kostl     = us_input-header-kostl.
  ls_bape_vbak-zwwxt     = us_input-header-zwwxt.
  ls_bape_vbak-znumb     = us_input-header-znumb.
  ls_bape_vbak-zjjcd     = us_input-header-zjjcd.

  ls_bape_vbakx-vbeln    = us_input-header-vbeln.
  ls_bape_vbakx-znumb    = us_input-header-znumb.
  ls_bape_vbakx-kostl    = COND #( WHEN ls_bape_vbak-kostl IS NOT INITIAL THEN abap_true ).
  ls_bape_vbakx-zwwxt    = COND #( WHEN ls_bape_vbak-zwwxt IS NOT INITIAL THEN abap_true ).
  ls_bape_vbakx-zjjcd    = COND #( WHEN ls_bape_vbak-zjjcd IS NOT INITIAL THEN abap_true ).

  ls_extensionin-structure = 'BAPE_VBAK'.
  ls_extensionin+30(960)   = ls_bape_vbak.
  APPEND ls_extensionin TO lt_extensionin.

  CLEAR ls_extensionin.
  ls_extensionin-structure = 'BAPE_VBAKX'.
  ls_extensionin+30(960)   = ls_bape_vbakx.
  APPEND ls_extensionin TO lt_extensionin.

  CLEAR:lt_order_items_in,
        lt_order_items_inx.
  CLEAR:lt_order_schedules_in,
        lt_order_schedules_inx.
  LOOP AT us_input-item ASSIGNING FIELD-SYMBOL(<fs_item>).
*   行项目
    APPEND INITIAL LINE TO lt_order_items_in ASSIGNING FIELD-SYMBOL(<fs_order_items_in>).
    <fs_order_items_in>-itm_number    = <fs_item>-posnr.  " 行项目
    CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
      EXPORTING
        input        = <fs_item>-matnr
      IMPORTING
        output       = <fs_item>-matnr
      EXCEPTIONS
        length_error = 1
        OTHERS       = 2.
    <fs_order_items_in>-material_long = <fs_item>-matnr.  " 物料
    IF lv_vbtyp1 = 'L'
      OR lv_vbtyp1 = 'K'.
      <fs_order_items_in>-target_qty  = <fs_item>-kwmeng. " 数量
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
        EXPORTING
          input          = <fs_item>-vrkme
          language       = sy-langu
        IMPORTING
          output         = <fs_item>-vrkme
        EXCEPTIONS
          unit_not_found = 1
          OTHERS         = 2.
      <fs_order_items_in>-sales_unit  = <fs_item>-vrkme.  " 销售单位
    ENDIF.
    <fs_order_items_in>-reason_rej    = <fs_item>-abgru.  " 拒绝原因
    <fs_order_items_in>-plant         = <fs_item>-werks.  " 工厂
    <fs_order_items_in>-wbs_elem      = <fs_item>-zpspid.

    APPEND INITIAL LINE TO lt_order_items_inx ASSIGNING FIELD-SYMBOL(<fs_order_items_inx>).
    IF <fs_item>-zflag = 'M'.
      <fs_order_items_inx>-updateflag    = 'U'.
    ELSEIF <fs_item>-zflag = 'A'.
      <fs_order_items_inx>-updateflag    = 'I'.
    ENDIF.
    <fs_order_items_inx>-itm_number    = <fs_item>-posnr. " 行项目
    <fs_order_items_inx>-material_long = COND #( WHEN <fs_order_items_in>-material_long IS NOT INITIAL THEN abap_true ).
    IF lv_vbtyp1 = 'L'
      OR lv_vbtyp1 = 'K'.
      <fs_order_items_inx>-target_qty  = COND #( WHEN <fs_order_items_in>-target_qty IS NOT INITIAL THEN abap_true ).
      <fs_order_items_inx>-sales_unit  = COND #( WHEN <fs_order_items_in>-sales_unit IS NOT INITIAL THEN abap_true ).
    ENDIF.
    <fs_order_items_inx>-reason_rej    = COND #( WHEN <fs_order_items_in>-reason_rej IS NOT INITIAL THEN abap_true ).
    <fs_order_items_inx>-plant         = COND #( WHEN <fs_order_items_in>-plant      IS NOT INITIAL THEN abap_true ).
    <fs_order_items_inx>-wbs_elem      = COND #( WHEN <fs_order_items_in>-wbs_elem   IS NOT INITIAL THEN abap_true ).

*   计划行
    IF lv_vbtyp1 NE 'L'
      AND lv_vbtyp1 NE 'K'.
      APPEND INITIAL LINE TO lt_order_schedules_in ASSIGNING FIELD-SYMBOL(<fs_schedules>).
      <fs_schedules>-itm_number = <fs_item>-posnr.
      <fs_schedules>-req_qty    = <fs_item>-kwmeng.
      <fs_schedules>-sched_line = '1'.

      <fs_schedules>-req_date  = <fs_item>-edatu.
      <fs_schedules>-dlv_date  = <fs_item>-edatu.
      <fs_schedules>-date_type = '1'.

      APPEND INITIAL LINE TO lt_order_schedules_inx ASSIGNING FIELD-SYMBOL(<fs_schedulesx>).
      IF <fs_item>-zflag = 'M'.
        <fs_schedulesx>-updateflag    = 'U'.
      ELSEIF <fs_item>-zflag = 'A'.
        <fs_schedulesx>-updateflag    = 'I'.
      ENDIF.
      <fs_schedulesx>-itm_number = <fs_item>-posnr.
      <fs_schedulesx>-req_qty    = COND #( WHEN <fs_schedules>-req_qty   IS NOT INITIAL THEN abap_true ).
      <fs_schedulesx>-sched_line = '1'.
      <fs_schedulesx>-req_date   = COND #( WHEN <fs_schedules>-req_date  IS NOT INITIAL THEN abap_true ).
      <fs_schedulesx>-dlv_date   = COND #( WHEN <fs_schedules>-dlv_date  IS NOT INITIAL THEN abap_true ).
      <fs_schedulesx>-date_type  = COND #( WHEN <fs_schedules>-date_type IS NOT INITIAL THEN abap_true ).
    ENDIF.

*   增强字段
    CLEAR:ls_extensionin.
    CLEAR:ls_bape_vbap,
          ls_bape_vbapx.
    ls_bape_vbap-vbeln   = us_input-header-vbeln.
    ls_bape_vbap-posnr   = <fs_item>-posnr.
    ls_bape_vbap-zmatnr  = <fs_item>-zmatnr.
    ls_bape_vbap-zpspid  = <fs_item>-zpspid.

    ls_bape_vbapx-vbeln  = us_input-header-vbeln.
    ls_bape_vbapx-posnr  = <fs_item>-posnr.
    ls_bape_vbapx-zmatnr = COND #( WHEN ls_bape_vbap-zmatnr IS NOT INITIAL THEN abap_true ).
    ls_bape_vbapx-zpspid = COND #( WHEN ls_bape_vbap-zpspid IS NOT INITIAL THEN abap_true ).

    ls_extensionin-structure = 'BAPE_VBAP'.
    ls_extensionin+30(960)   = ls_bape_vbap.
    CALL METHOD cl_abap_container_utilities=>fill_container_c
      EXPORTING
        im_value     = ls_bape_vbap
      IMPORTING
        ex_container = ls_extensionin+30.
    APPEND ls_extensionin TO lt_extensionin.

    CLEAR ls_extensionin.
    ls_extensionin-structure = 'BAPE_VBAPX'.
    ls_extensionin+30(960)   = ls_bape_vbapx.
    CALL METHOD cl_abap_container_utilities=>fill_container_c
      EXPORTING
        im_value     = ls_bape_vbapx
      IMPORTING
        ex_container = ls_extensionin+30.
    APPEND ls_extensionin TO lt_extensionin.

  ENDLOOP.

* 条件
* 价格条件,需要设置该参数,才能够修改价格条件
  ls_logic_switch-cond_handl = 'X'.
  LOOP AT us_input-conditions INTO DATA(ls_conditions).
*   需要读取已经存在行的Key
    SELECT SINGLE knumv INTO @DATA(lv_knumv) FROM vbak WHERE  vbeln = @us_input-header-vbeln.
    SELECT SINGLE MAX( stunr ) , MAX(  zaehk )
      INTO (@DATA(lv_stunr),@DATA(lv_zaehk) )
      FROM prcd_elements
      WHERE  knumv = @lv_knumv
        AND kposn = @ls_conditions-kposn
        AND kschl = @ls_conditions-kschl .
    APPEND INITIAL LINE TO lt_order_conditions_in ASSIGNING FIELD-SYMBOL(<fs_conditions>).
    <fs_conditions>-itm_number = ls_conditions-kposn.
    <fs_conditions>-cond_type  = ls_conditions-kschl. " 条件类型
    <fs_conditions>-cond_value = ls_conditions-kbetr. " 金额
    <fs_conditions>-currency   = ls_conditions-koein. " 定价货币
    <fs_conditions>-cond_p_unt = ls_conditions-kpein. " 定价单位
****    <fs_conditions>-cond_st_no = lv_stunr.
****    <fs_conditions>-cond_count = lv_zaehk.
    SELECT COUNT(*) FROM t006a WHERE spras EQ sy-langu
                          AND msehi EQ ls_conditions-kmein.
    IF sy-subrc <> 0.
      CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
        EXPORTING
          input    = ls_conditions-kmein
          language = sy-langu
        IMPORTING
          output   = ls_conditions-kmein.
    ENDIF.
    <fs_conditions>-cond_unit = ls_conditions-kmein. "条件单位

    APPEND INITIAL LINE TO lt_order_conditions_inx ASSIGNING FIELD-SYMBOL(<fs_conditionsx>).
    <fs_conditionsx>-itm_number = ls_conditions-kposn.
    <fs_conditionsx>-cond_type  = ls_conditions-kschl.
    IF ls_conditions-zflag = 'M'.
      <fs_schedulesx>-updateflag    = 'U'.
    ELSEIF ls_conditions-zflag = 'A'.
      <fs_schedulesx>-updateflag    = 'I'.
    ENDIF.
    <fs_conditionsx>-cond_value = COND #( WHEN <fs_conditions>-cond_value IS NOT INITIAL THEN abap_true ).
    <fs_conditionsx>-currency   = COND #( WHEN <fs_conditions>-currency   IS NOT INITIAL THEN abap_true ).
    <fs_conditionsx>-cond_p_unt = COND #( WHEN <fs_conditions>-cond_p_unt IS NOT INITIAL THEN abap_true ).
    <fs_conditionsx>-cond_unit  = COND #( WHEN ls_bape_vbap-zpspid IS NOT INITIAL THEN abap_true ).
****    <fs_conditionsx>-cond_st_no = lv_stunr.
****    <fs_conditionsx>-cond_count = lv_zaehk.

  ENDLOOP.

* 调用BAPI
  CLEAR lt_return.
  CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
    EXPORTING
      salesdocument    = us_input-header-vbeln
      order_header_in  = ls_order_header_in
      order_header_inx = ls_order_header_inx
      logic_switch     = ls_logic_switch
    TABLES
      return           = lt_return
      order_item_in    = lt_order_items_in
      order_item_inx   = lt_order_items_inx
      partnerchanges   = lt_partnerchanges
      schedule_lines   = lt_order_schedules_in
      schedule_linesx  = lt_order_schedules_inx
      conditions_in    = lt_order_conditions_in
      conditions_inx   = lt_order_conditions_inx
      extensionin      = lt_extensionin.

  READ TABLE lt_return INTO DATA(ls_return) INDEX lines( lt_return ).
  IF ls_return-type CA 'EA'.
    cs_output-status = 'E'.
    CONCATENATE cs_output-msg  '销售订单修改失败:' INTO cs_output-msg.
    LOOP AT lt_return  INTO ls_return WHERE type EQ 'E'.
      CLEAR lv_message.
      CALL FUNCTION 'MESSAGE_TEXT_BUILD'
        EXPORTING
          msgid               = ls_return-id
          msgnr               = ls_return-number
          msgv1               = ls_return-message_v1
          msgv2               = ls_return-message_v2
          msgv3               = ls_return-message_v3
          msgv4               = ls_return-message_v4
        IMPORTING
          message_text_output = lv_message.
      CONCATENATE cs_output-msg '/' lv_message INTO cs_output-msg.
    ENDLOOP.

    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

  ELSE.
    cs_output-status   = 'S'.
    cs_output-msg = '销售订单:' && us_input-header-vbeln  && '修改成功'.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
  ENDIF.

ENDFORM.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值