SD 销售订单创建:SD_SALESDOCUMENT_CREATE

代码如下:(仅供参)

DATA:lv_vbeln TYPE vbelv.

* 局部定义
DATA: ls_order_header_in      TYPE bapisdhd1,
      ls_order_header_inx     TYPE bapisdhd1x,
      lt_order_partners       TYPE TABLE OF bapiparnr,
      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.

* 抬头
CLEAR:ls_order_header_in,
      ls_order_header_inx.
ls_order_header_in-doc_type    = us_input-header-auart.  " 订单类型
ls_order_header_in-sales_org   = us_input-header-vkorg.  " 销售组织
ls_order_header_in-distr_chan  = us_input-header-vtweg.  " 分销渠道
ls_order_header_in-division    = us_input-header-spart.  " 产品组
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-ord_reason  = us_input-header-augru.  " 订单原因
ls_order_header_in-currency    = us_input-header-waerk.  " 销售和分销凭证货币
* 参考创建
ls_order_header_in-ref_doc     = us_input-zvbeln.        " 参考单据的单据编号
ls_order_header_in-created_by  = sy-uname.
SELECT SINGLE vbtyp INTO @DATA(l_vbtyp) FROM tvak
   WHERE auart = @ls_order_header_in-doc_type.
ls_order_header_in-sd_doc_cat  = l_vbtyp.                " 订单类别
ls_order_header_in-refdoc_cat  = 'C'.                    " 订单类别

ls_order_header_inx-doc_type   = COND #( WHEN ls_order_header_in-doc_type   IS NOT INITIAL THEN abap_true ).
ls_order_header_inx-sales_org  = COND #( WHEN ls_order_header_in-sales_org  IS NOT INITIAL THEN abap_true ).
ls_order_header_inx-distr_chan = COND #( WHEN ls_order_header_in-distr_chan IS NOT INITIAL THEN abap_true ).
ls_order_header_inx-division   = COND #( WHEN ls_order_header_in-division   IS NOT INITIAL THEN abap_true ).
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-ord_reason = COND #( WHEN ls_order_header_in-ord_reason 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-ref_doc    = COND #( WHEN ls_order_header_in-ref_doc    IS NOT INITIAL THEN abap_true ).
ls_order_header_inx-sd_doc_cat = COND #( WHEN ls_order_header_in-sd_doc_cat IS NOT INITIAL THEN abap_true ).
ls_order_header_inx-refdoc_cat = COND #( WHEN ls_order_header_in-refdoc_cat IS NOT INITIAL THEN abap_true ).
ls_order_header_inx-ordcomb_in = COND #( WHEN ls_order_header_in-ordcomb_in IS NOT INITIAL THEN abap_true ).

* 伙伴
CLEAR:lt_order_partners.
APPEND INITIAL LINE TO lt_order_partners ASSIGNING FIELD-SYMBOL(<fs_partners>).

<fs_partners>-partn_role = 'AG'.  "售达方
us_input-header-kunnr1 = |{ us_input-header-kunnr1 ALPHA = IN }|.
<fs_partners>-partn_numb = us_input-header-kunnr1.

APPEND INITIAL LINE TO lt_order_partners ASSIGNING <fs_partners>.
<fs_partners>-partn_role = 'WE'.  "送达方
us_input-header-kunnr2 = |{ us_input-header-kunnr2 ALPHA = IN }|.
<fs_partners>-partn_numb = us_input-header-kunnr2.

*  增强字段
CLEAR:ls_extensionin,
      lt_extensionin.
CLEAR:ls_bape_vbak,
      ls_bape_vbakx.
ls_bape_vbak-kostl  = us_input-header-kostl.  " 成本中心
ls_bape_vbakx-kostl = COND #( WHEN ls_bape_vbak-kostl 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 INTO DATA(ls_item).
  APPEND INITIAL LINE TO lt_order_items_in ASSIGNING FIELD-SYMBOL(<fs_items>).
  <fs_items>-itm_number    = ls_item-posnr.  " 行项目
  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      input  = ls_item-matnr
    IMPORTING
      output = ls_item-matnr.
  <fs_items>-material_long = ls_item-matnr.  " 物料
  <fs_items>-target_qty  = ls_item-kwmeng.   " 数量 借贷项销售订单数量
  <fs_items>-bill_date   = ls_item-edatu.    " 开票日期

  CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
    EXPORTING
      input          = ls_item-vrkme
      language       = sy-langu
    IMPORTING
      output         = ls_item-vrkme
    EXCEPTIONS
      unit_not_found = 1
      OTHERS         = 2.
  <fs_items>-sales_unit    = ls_item-vrkme.  " 销售单位
  <fs_items>-plant         = ls_item-werks.  " 工厂
  <fs_items>-store_loc     = ls_item-lgort.  " 存储地点
  <fs_items>-wbs_elem      = ls_item-pspid.  " WBS
  <fs_items>-reqmts_typ    = ls_item-bedae.  " 需求类型
*  参考创建
  <fs_items>-ref_doc       = us_input-header-zvbeln.

  ls_item-vbelv = |{ ls_item-vbelv ALPHA = IN }|.
  SELECT SINGLE vbtyp INTO @DATA(lv_vbtyp) FROM vbak WHERE vbeln = @ls_item-vbelv.
  <fs_items>-ref_doc       = ls_item-vbelv.  " 参考订单号
  <fs_items>-ref_doc_it    = ls_item-posnv.  " 参考订单行项目
  <fs_items>-ref_doc_ca    = lv_vbtyp.       " 参考订单类别

  APPEND INITIAL LINE TO lt_order_items_inx ASSIGNING FIELD-SYMBOL(<fs_itemsx>).
  <fs_itemsx>-itm_number = ls_item-posnr.    " 行项目
  <fs_itemsx>-material_long = COND #( WHEN <fs_items>-material_long IS NOT INITIAL THEN abap_true ).          " 物料
  <fs_itemsx>-target_qty    = COND #( WHEN <fs_items>-target_qty    IS NOT INITIAL THEN abap_true ).          " 数量
  <fs_itemsx>-bill_date     = COND #( WHEN <fs_items>-bill_date     IS NOT INITIAL THEN abap_true ).          " 开票日期
  <fs_itemsx>-sales_unit    = COND #( WHEN <fs_items>-sales_unit    IS NOT INITIAL THEN abap_true ).          " 销售单位
  <fs_itemsx>-plant         = COND #( WHEN <fs_items>-plant         IS NOT INITIAL THEN abap_true ).          " 工厂
  <fs_itemsx>-store_loc     = COND #( WHEN <fs_items>-store_loc     IS NOT INITIAL THEN abap_true ).          " 存储地点
  <fs_itemsx>-ref_doc       = COND #( WHEN <fs_items>-ref_doc       IS NOT INITIAL THEN abap_true ).          " 参考订单号
  <fs_itemsx>-ref_doc_it    = COND #( WHEN <fs_items>-ref_doc_it    IS NOT INITIAL THEN abap_true ).          " 参考订单行项目
  <fs_itemsx>-ref_doc_ca    = COND #( WHEN <fs_items>-ref_doc_ca    IS NOT INITIAL THEN abap_true ).          " 参考订单类别
  <fs_itemsx>-wbs_elem      = COND #( WHEN <fs_items>-wbs_elem      IS NOT INITIAL THEN abap_true ).
  <fs_itemsx>-reqmts_typ    = COND #( WHEN <fs_items>-reqmts_typ    IS NOT INITIAL THEN abap_true ).
*  参考创建
  <fs_itemsx>-ref_doc       = COND #( WHEN <fs_items>-ref_doc       IS NOT INITIAL THEN abap_true ).

*   计划行
  APPEND INITIAL LINE TO lt_order_schedules_in ASSIGNING FIELD-SYMBOL(<fs_schedules>).
  <fs_schedules>-itm_number = ls_item-posnr.
  <fs_schedules>-req_qty    = ls_item-kwmeng." 标准销售订单数量
  <fs_schedules>-req_date   = ls_item-edatu.

  APPEND INITIAL LINE TO lt_order_schedules_inx ASSIGNING FIELD-SYMBOL(<fs_schedulesx>).
  <fs_schedulesx>-itm_number = ls_item-posnr.
  <fs_schedulesx>-req_date   = COND #( WHEN <fs_schedules>-req_date IS NOT INITIAL THEN abap_true ).
  <fs_schedulesx>-req_qty    = COND #( WHEN <fs_schedules>-req_qty  IS NOT INITIAL THEN abap_true ).

*   增强字段
  CLEAR:ls_bape_vbap,
        ls_bape_vbapx.
  ls_bape_vbap-posnr  = ls_item-posnr.
  ls_bape_vbap-zmatnr = ls_item-zmatnr.
  ls_bape_vbap-zpspid = ls_item-zpspid.

  ls_bape_vbapx-posnr  = ls_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'.
  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'.
  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.
  CLEAR  ls_extensionin.

ENDLOOP.

* 条件
CLEAR:lt_order_conditions_in,
      lt_order_conditions_inx.
LOOP AT us_input-conditions INTO DATA(ls_conditions).
  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. " 定价单位
  CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
    EXPORTING
      input          = ls_conditions-kmein
      language       = sy-langu
    IMPORTING
      output         = ls_conditions-kmein
    EXCEPTIONS
      unit_not_found = 1
      OTHERS         = 2.
  <fs_conditions>-cond_unit  = ls_conditions-kmein. " 条件单位
ENDLOOP.

* 调用BAPI
CLEAR lv_vbeln.
CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
  EXPORTING
    sales_header_in      = ls_order_header_in
    sales_header_inx     = ls_order_header_inx
    convert_parvw_auart  = 'X'
  IMPORTING
    salesdocument_ex     = lv_vbeln
  TABLES
    return               = lt_return
    sales_items_in       = lt_order_items_in
    sales_items_inx      = lt_order_items_inx
    sales_partners       = lt_order_partners
    sales_schedules_in   = lt_order_schedules_in
    sales_schedules_inx  = lt_order_schedules_inx
    sales_conditions_in  = lt_order_conditions_in
    sales_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'.
  cv_flg = 'X'.
  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-data-zvbeln  = lv_vbeln.
  cs_output-status   = 'S'.
  cs_output-msg = '销售订单' && lv_vbeln && '创建成功'.
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.
ENDIF.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值