代码如下:(仅供参)
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.