前言:
销售订单创建 SD_SALESDOCUMENT_CREATE
销售订单修改 SD_SALESDOCUMENT_CHANGE
其实这两个BAPI的传参基本一样,本文以创建为例进行演示
包含修改合作伙伴地址信息、销售订单行项目可配置物料特性
目录
1. 合作伙伴地址信息 - PARTNERADDRESSES
一. 注意事项
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.