ABAP VA01 / VA02 销售订单创建修改( 含可配置物料特性 )

前言:

     销售订单创建  SD_SALESDOCUMENT_CREATE

     销售订单修改  SD_SALESDOCUMENT_CHANGE

     其实这两个BAPI的传参基本一样,本文以创建为例进行演示

     包含修改合作伙伴地址信息、销售订单行项目可配置物料特性

目录

        一. 注意事项

1. 合作伙伴地址信息 - PARTNERADDRESSES

2. 可配置物料特性 - SALES_CFGS_VALUE

二. 代码示例


一. 注意事项

1. 合作伙伴地址信息 - PARTNERADDRESSES

        

         合作伙伴地址信息如需修改,需要在合作伙伴 sales_partners参数中写入addr_link 字段

         与地址信息 partneraddresses的 addr_no 保持一致 ,这里是唯一值就行,可以给流水号,

         例如 '0000000001'

2. 可配置物料特性 - SALES_CFGS_VALUE

        

        

         当销售订单行项目需要写入可配置物料特性值时,BAPI里需要给行项目 sales_items_in的参数 po_itm_no写入,这里是CHAR型字段,不会补零,需要注意一下

        参数 sales_cfgs_ref 要传值,这里的外部项目号参数 posex要与上面po_itm_no值相等,一个行项目对应一行

        

        

二. 代码示例


DATA:
  " 抬头
  ls_order_header_in      TYPE bapisdhd1,
  ls_order_header_inx     TYPE bapisdhd1x,
  ls_logic_switch         TYPE bapisdls,
  lv_vbeln                TYPE bapivbeln-vbeln,

  " 行项目
  lt_return               TYPE TABLE OF bapiret2, " 返回

  ls_order_partners       TYPE bapiparnr,
  lt_order_partners       TYPE TABLE OF bapiparnr,

  ls_partneraddresses     TYPE bapiaddr1,
  lt_partneraddresses     TYPE TABLE OF bapiaddr1,

  ls_order_items_in       TYPE bapisditm,
  lt_order_items_in       TYPE TABLE OF bapisditm,
  ls_order_items_inx      TYPE bapisditmx,
  lt_order_items_inx      TYPE TABLE OF bapisditmx,

  ls_order_schedules_in   TYPE bapischdl,
  lt_order_schedules_in   TYPE TABLE OF bapischdl,
  ls_order_schedules_inx  TYPE bapischdlx,
  lt_order_schedules_inx  TYPE TABLE OF bapischdlx,

  ls_order_conditions_in  TYPE bapicond,
  lt_order_conditions_in  TYPE TABLE OF bapicond,
  ls_order_conditions_inx TYPE bapicondx,
  lt_order_conditions_inx TYPE TABLE OF bapicondx,

  lv_config_id            TYPE bapicucfg-config_id,
  lv_root_id              TYPE bapicucfg-root_id,
  ls_order_cfgs_ref       TYPE bapicucfg,
  lt_order_cfgs_ref       TYPE TABLE OF bapicucfg,
  ls_order_cfgs_value     TYPE bapicuval,
  lt_order_cfgs_value     TYPE TABLE OF bapicuval,

  ls_bape_vbak            TYPE bape_vbak,
  ls_bape_vbakx           TYPE bape_vbakx,
  ls_bape_vbap            TYPE bape_vbap,
  ls_bape_vbapx           TYPE bape_vbapx,
  ls_extensionin          TYPE bapiparex,
  lt_extensionin          TYPE TABLE OF bapiparex,
  ls_extensionex          TYPE bapiparex,
  lt_extensionex          TYPE  TABLE OF bapiparex,

  lv_msg                  TYPE string,
  lv_msg_r                TYPE string.

* 抬头赋值
ls_order_header_in-doc_type   = data-auart.  " 销售凭证类型
ls_order_header_in-sales_org  = data-vkorg.  " 销售组织
ls_order_header_in-distr_chan = data-vtweg.  " 分销渠道
ls_order_header_in-division   = data-spart.  " 产品组
ls_order_header_in-sales_grp  = data-vkgrp.  " 销售组
ls_order_header_in-sales_off  = data-vkbur.  " 销售办事处
ls_order_header_in-req_date_h = data-vdatu.  " 要求的交货日期
ls_order_header_in-purch_no_c = data-bstkd.  " 客户参考
ls_order_header_in-ord_reason = data-augru.  " 订单原因
ls_order_header_in-cust_group = data-kdgrp.  " 售前客户类型
ls_order_header_in-cust_grp1  = data-kvgr1.  " 售前经销商等级
ls_order_header_in-cust_grp2  = data-kvgr2.  " 售后经销商等级
ls_order_header_in-cust_grp3  = data-kvgr3.  " 售后客户类型
ls_order_header_in-cust_grp4  = data-kvgr4.  " 售后客户等级
ls_order_header_in-incoterms1 = data-inco1.  " 国际贸易条款
ls_order_header_in-incoterms2 = data-inco2.  " 国际贸易条款位置
ls_order_header_in-pmnttrms   = data-zterm.  " 付款条件
ls_order_header_in-accnt_asgn = data-ktgrd.  " 客户的科目分配组
ls_order_header_in-currency   = data-waerk.  " 凭证货币

ls_order_header_inx-doc_type   = 'X'.
ls_order_header_inx-sales_org  = 'X'.
ls_order_header_inx-distr_chan = 'X'.
ls_order_header_inx-division   = 'X'.
ls_order_header_inx-sales_grp  = 'X'.
ls_order_header_inx-sales_off  = 'X'.
ls_order_header_inx-req_date_h = 'X'.
ls_order_header_inx-purch_no_c = 'X'.
ls_order_header_inx-ord_reason = 'X'.
ls_order_header_inx-cust_group = 'X'.
ls_order_header_inx-cust_grp1  = 'X'.
ls_order_header_inx-cust_grp2  = 'X'.
ls_order_header_inx-cust_grp3  = 'X'.
ls_order_header_inx-cust_grp4  = 'X'.
ls_order_header_inx-incoterms1 = 'X'.
ls_order_header_inx-incoterms2 = 'X'.
ls_order_header_inx-pmnttrms   = 'X'.
ls_order_header_inx-accnt_asgn = 'X'.
ls_order_header_inx-currency   = 'X'.

* 增强字段
ls_bape_vbak-zcust = data-zcust.
ls_extensionin-structure = 'BAPE_VBAK'.
CALL METHOD cl_abap_container_utilities=>fill_container_c
  EXPORTING
    im_value     = ls_bape_vbak
  IMPORTING
    ex_container = ls_extensionin-valuepart1.
APPEND ls_extensionin TO lt_extensionin.
CLEAR ls_extensionin.

ls_bape_vbakx-zcust = 'X'.
ls_extensionin-structure = 'BAPE_VBAKX'.
ls_extensionin-valuepart1 = ls_bape_vbakx.
APPEND ls_extensionin TO lt_extensionin.
CLEAR ls_extensionin.

* 合作伙伴
ls_order_partners-partn_role = 'AG'. " 售达方
ls_order_partners-partn_numb = |{ data-kunnr ALPHA = IN }|.

READ TABLE data-address INTO DATA(ls_ag)
WITH KEY parvw = 'AG'.
IF sy-subrc = 0.
  ls_order_partners-addr_link = |{ ls_ag-addrnumber ALPHA = IN }|.
ENDIF.

APPEND ls_order_partners TO lt_order_partners.
CLEAR ls_order_partners.

ls_order_partners-partn_role = 'WE'. " 送达方-SH内码为WE
ls_order_partners-partn_numb = |{ data-sdf ALPHA = IN }|.

READ TABLE data-address INTO DATA(ls_sh)
WITH KEY parvw = 'SH'.
IF sy-subrc = 0.
  ls_order_partners-addr_link = |{ ls_sh-addrnumber ALPHA = IN }|.
ENDIF.

APPEND ls_order_partners TO lt_order_partners.
CLEAR ls_order_partners.

ls_order_partners-partn_role = 'RG'. " 付款方-PY内码为RG
ls_order_partners-partn_numb = |{ data-fkf ALPHA = IN }|.

READ TABLE data-address INTO DATA(ls_py)
WITH KEY parvw = 'PY'.
IF sy-subrc = 0.
  ls_order_partners-addr_link = |{ ls_py-addrnumber ALPHA = IN }|.
ENDIF.

APPEND ls_order_partners TO lt_order_partners.
CLEAR ls_order_partners.

ls_order_partners-partn_role = 'RE'. " 开票方-BP内码为RE
ls_order_partners-partn_numb = |{ data-kpf ALPHA = IN }|.

READ TABLE data-address INTO DATA(ls_bp)
WITH KEY parvw = 'BP'.
IF sy-subrc = 0.
  ls_order_partners-addr_link = |{ ls_bp-addrnumber ALPHA = IN }|.
ENDIF.

APPEND ls_order_partners TO lt_order_partners.
CLEAR ls_order_partners.

* 合作伙伴地址
LOOP AT data-address INTO DATA(ls_address).

  ls_partneraddresses-addr_no    = ls_address-addrnumber. " 地址编号
  ls_partneraddresses-name       = ls_address-name1.      " 名称 1
  ls_partneraddresses-name_2     = ls_address-name2.      " 名称 2
  ls_partneraddresses-name_3     = ls_address-name3.      " 名称 3
  ls_partneraddresses-name_4     = ls_address-name4.      " 名称 4
  ls_partneraddresses-street     = ls_address-street.     " 街道
  ls_partneraddresses-str_suppl1 = ls_address-str_suppl1. " 街道2
  ls_partneraddresses-str_suppl2 = ls_address-str_suppl2. " 街道 3
  ls_partneraddresses-str_suppl3 = ls_address-str_suppl3. " 街道 4
  ls_partneraddresses-location   = ls_address-location.   " 街道 5
  APPEND ls_partneraddresses TO lt_partneraddresses.
  CLEAR ls_partneraddresses.

ENDLOOP.

* 行信息
LOOP AT data-item INTO DATA(ls_item).

  ls_order_items_in-itm_number    = ls_item-posnr.  " 销售凭证项目

  PERFORM frm_matn1 CHANGING ls_item-matnr.

  ls_order_items_in-material_long = ls_item-matnr.   " 物料编号

  PERFORM frm_cunit CHANGING ls_item-vrkme.

  ls_order_items_in-target_qty    = ls_item-kwmeng. " 以销售单位表示的累计订购数量
  ls_order_items_in-sales_unit    = ls_item-vrkme.  " 销售单位
  ls_order_items_in-plant         = ls_item-werks.  " 工厂(自有或外部)
  ls_order_items_in-store_loc     = ls_item-lgort.  " 存储地点
  ls_order_items_in-reason_rej    = ls_item-abgru.  " 销售凭证的拒绝原因
  ls_order_items_in-short_text    = ls_item-arktx.  " 物料描述写入
  ls_order_items_in-item_categ    = ls_item-pstyv.  " 行项目类别

  READ TABLE data-characteristic INTO DATA(ls_char)
  WITH KEY posnr = ls_item-posnr.
  IF sy-subrc = 0.
    ls_order_items_in-po_itm_no = ls_item-posnr.
    ls_order_items_inx-po_itm_no = 'X'.
  ENDIF.

  APPEND ls_order_items_in TO lt_order_items_in.
  CLEAR ls_order_items_in.

  ls_order_items_inx-itm_number    = ls_item-posnr. " 销售凭证项目
  ls_order_items_inx-updateflag    = 'I'.           " 更新标识
  ls_order_items_inx-material_long = 'X'.           " 物料编号
  ls_order_items_inx-target_qty    = 'X'.           " 以销售单位表示的累计订购数量
  ls_order_items_inx-sales_unit    = 'X'.           " 销售单位
  ls_order_items_inx-plant         = 'X'.           " 工厂(自有或外部)
  ls_order_items_inx-store_loc     = 'X'.           " 存储地点
  ls_order_items_inx-reason_rej    = 'X'.           " 销售凭证的拒绝原因

  IF ls_item-pstyv IS NOT INITIAL.
    ls_order_items_inx-item_categ    = 'X'.           " 行项目类别
  ENDIF.

  APPEND ls_order_items_inx TO lt_order_items_inx.
  CLEAR ls_order_items_inx.

* 计划行信息
  ls_order_schedules_in-itm_number = ls_item-posnr.  " 销售凭证项目
  ls_order_schedules_in-req_qty = ls_item-kwmeng. " 以销售单位表示的累计订购数量
  APPEND ls_order_schedules_in TO lt_order_schedules_in.
  CLEAR ls_order_schedules_in.

  ls_order_schedules_inx-itm_number = ls_item-posnr.
  ls_order_schedules_inx-req_qty = 'X'.
  APPEND ls_order_schedules_inx TO lt_order_schedules_inx.
  CLEAR ls_order_schedules_inx.

* 增强字段
  ls_bape_vbap-posnr     = ls_item-posnr.    " 销售凭证项目
  ls_bape_vbap-zzczgc    = ls_item-zzczgc.
  ls_bape_vbap-zcpxh     = ls_item-zcpxh.

  CALL METHOD cl_eewa_convert=>convert_bapiparex_in
    EXPORTING
      par_structname   = 'BAPE_VBAP'
      par_data         = ls_bape_vbap
    CHANGING
      par_bapiparextab = lt_extensionin.

  ls_bape_vbapx-posnr     = ls_item-posnr.    " 销售凭证项目
  ls_bape_vbapx-zzczgc    = 'X'.
  ls_bape_vbapx-zcpxh     = 'X'.
  CALL METHOD cl_eewa_convert=>convert_bapiparex_in
    EXPORTING
      par_structname   = 'BAPE_VBAPX'
      par_data         = ls_bape_vbapx
    CHANGING
      par_bapiparextab = lt_extensionin.

ENDLOOP.

* 条件价格信息
ls_logic_switch-pricing = 'G'.

LOOP AT data-conditional INTO DATA(ls_conditional).

  ls_order_conditions_in-itm_number = ls_conditional-kposn. " 条件项目号
  ls_order_conditions_in-cond_type  = ls_conditional-kschl. " 条件类型
  ls_order_conditions_in-cond_value = ls_conditional-kbetr. " 条件金额
  ls_order_conditions_in-currency   = data-waerk.          " 货币
  ls_order_conditions_in-cond_p_unt = ls_conditional-kpein. " 条件定价单位
  APPEND ls_order_conditions_in TO lt_order_conditions_in.
  CLEAR ls_order_conditions_in.

  ls_order_conditions_inx-itm_number = ls_conditional-kposn." 条件项目号
  ls_order_conditions_inx-updateflag = 'I'.                 " 更新标识
  ls_order_conditions_inx-cond_type  = 'X'.                 " 条件类型
  ls_order_conditions_inx-cond_value = 'X'.                 " 条件金额
  ls_order_conditions_inx-currency   = 'X'.                 " 货币
  ls_order_conditions_inx-cond_p_unt = 'X'.                 " 条件定价单位
  APPEND ls_order_conditions_inx TO lt_order_conditions_inx.
  CLEAR ls_order_conditions_inx.

ENDLOOP.

* 特性值
LOOP AT data-characteristic INTO DATA(ls_characteristic).

  READ TABLE lt_order_cfgs_ref INTO DATA(ls_check)
  WITH KEY posex = ls_characteristic-posnr.
  IF sy-subrc <> 0.

    lv_config_id = lv_config_id + 1.
    lv_root_id = lv_root_id + 1.

    CONDENSE lv_config_id NO-GAPS.
    CONDENSE lv_root_id NO-GAPS.

    ls_order_cfgs_ref-posex = ls_characteristic-posnr.
    ls_order_cfgs_ref-config_id = lv_config_id.
    ls_order_cfgs_ref-root_id = lv_root_id.
    APPEND ls_order_cfgs_ref TO lt_order_cfgs_ref.
    CLEAR ls_order_cfgs_ref.

    ls_order_cfgs_value-config_id = lv_config_id.
    ls_order_cfgs_value-inst_id = lv_root_id.

  ELSE.

    ls_order_cfgs_value-config_id = ls_check-config_id.
    ls_order_cfgs_value-inst_id = ls_check-root_id.

  ENDIF.

  ls_order_cfgs_value-charc = ls_characteristic-atnam.
  ls_order_cfgs_value-value_long = ls_characteristic-atwrt.
  APPEND ls_order_cfgs_value TO lt_order_cfgs_value.
  CLEAR ls_order_cfgs_value.

ENDLOOP.

CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
  EXPORTING
    sales_header_in      = ls_order_header_in
    sales_header_inx     = ls_order_header_inx
    logic_switch         = ls_logic_switch
  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
    sales_cfgs_ref       = lt_order_cfgs_ref
    sales_cfgs_value     = lt_order_cfgs_value
    extensionin          = lt_extensionin
    partneraddresses     = lt_partneraddresses.


IF lv_vbeln IS INITIAL.

  LOOP AT lt_return INTO DATA(ls_return) WHERE  type = 'E' OR  type = 'A'.

    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_msg.

    lv_msg_r = lv_msg_r && '\' && lv_msg.
    CLEAR lv_msg.

  ENDLOOP.

  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

  data_res-type = 'E'.
  data_res-message = lv_msg_r.

ELSE.

  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.

  data_res-vbeln = lv_vbeln.

ENDIF.

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值