发现VA31和VA01使用相同程序SAPMV45A,所以也是使用相同底层bapi:SD_SALESDOCUMENT_CREATE和SD_SALESDOCUMENT_CHANGE
DATA:
ls_header TYPE bapisdhd1, "表头
ls_headerx TYPE bapisdhd1x, "表头标志
ls_item TYPE bapisditm, "行项目
ls_itemx TYPE bapisditmx,
ls_partner TYPE bapiparnr,
lt_partner TYPE STANDARD TABLE OF bapiparnr,
lt_item TYPE STANDARD TABLE OF bapisditm,
lt_itemx TYPE STANDARD TABLE OF bapisditmx,
lt_return TYPE STANDARD TABLE OF bapiret2,
ls_output LIKE bapisdhd,
lv_posnr TYPE posnr_va,
lv_msg TYPE bapi_msg.
READ TABLE gt_excel1 TRANSPORTING NO FIELDS WITH KEY icon = gc_red.
IF sy-subrc EQ 0.
MESSAGE '存在报错,请检查' TYPE 'S' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
" 按照客户合并创建
LOOP AT gt_excel1 INTO DATA(ls_group) WHERE icon NE gc_green AND flag = '' GROUP BY ( kunnr = ls_group-kunnr ).
* Header
CLEAR:ls_header,ls_headerx.
ls_header-doc_type = ls_group-auart.
* ls_header-ct_valid_f = sy-datum.
ls_header-sales_org = p_vkorg.
ls_header-distr_chan = ls_group-vtweg. "分销渠道
ls_header-division = '10'. "产品组
ls_header-purch_no_c = ls_group-auart.
ls_headerx-doc_type = 'X'.
* ls_headerx-ct_valid_f = 'X'.
ls_headerx-sales_org = 'X'.
ls_headerx-purch_no_c = 'X'.
ls_headerx-distr_chan = 'X'. "分销渠道
ls_headerx-division = 'X'. "产品组
ls_headerx-updateflag = 'I'.
CLEAR:lv_posnr,lt_item,lt_itemx,lt_partner.
LOOP AT GROUP ls_group ASSIGNING FIELD-SYMBOL(<fs_excel>).
CLEAR ls_item.
lv_posnr = lv_posnr + 10.
<fs_excel>-posnr = lv_posnr.
ls_item-itm_number = lv_posnr.
ls_item-material = <fs_excel>-matnr. "物料
ls_item-cust_mat35 = <fs_excel>-maktx.
APPEND ls_item TO lt_item.
ls_itemx-itm_number = lv_posnr.
ls_itemx-material = 'X'.
ls_itemx-cust_mat35 = 'X'.
ls_itemx-updateflag = 'I'.
APPEND ls_itemx TO lt_itemx.
CLEAR ls_itemx.
ENDLOOP.
"销售合作伙伴
ls_partner-partn_role = 'AG'."售达方
ls_partner-partn_numb = ls_group-kunnr."售达方编号
APPEND ls_partner TO lt_partner.
CLEAR ls_partner.
ls_partner-partn_role = 'WE'."送达方
ls_partner-partn_numb = ls_group-kunnr."送达方编号
APPEND ls_partner TO lt_partner.
CLEAR ls_partner.
CLEAR:lt_return,ls_output.
CALL FUNCTION 'SD_SALESDOCUMENT_CREATE'
EXPORTING
* SALESDOCUMENT =
sales_header_in = ls_header
sales_header_inx = ls_headerx
* SENDER =
* BINARY_RELATIONSHIPTYPE = ' '
* INT_NUMBER_ASSIGNMENT = ' '
* BEHAVE_WHEN_ERROR = ' '
* LOGIC_SWITCH = ' '
business_object = 'BUS2035'
* TESTRUN =
* CONVERT_PARVW_AUART = ' '
* STATUS_BUFFER_REFRESH = 'X'
IMPORTING
* SALESDOCUMENT_EX =
sales_header_out = ls_output
* SALES_HEADER_STATUS =
TABLES
return = lt_return
sales_items_in = lt_item
sales_items_inx = lt_itemx
sales_partners = lt_partner.
CLEAR lv_msg.
LOOP AT lt_return INTO DATA(ls_return) WHERE type CA 'AEX'.
PERFORM frm_message_set USING ls_return-message
CHANGING lv_msg.
ENDLOOP.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
gs_excel1-vbeln = ls_output-doc_number.
gs_excel1-icon = gc_green.
gs_excel1-msg = '创建成功'.
MODIFY gt_excel1 FROM gs_excel1 TRANSPORTING icon msg vbeln WHERE kunnr = ls_group-kunnr.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
gs_excel1-icon = gc_red.
gs_excel1-msg = lv_msg.
MODIFY gt_excel1 FROM gs_excel1 TRANSPORTING icon msg WHERE kunnr = ls_group-kunnr.
ENDIF.
ENDLOOP.
" 存在的则新增行
LOOP AT gt_excel1 INTO DATA(ls_excel1) WHERE icon NE gc_green AND flag = 'X' ."GROUP BY ( kunnr = ls_group-kunnr ).
DATA(lv_tabix) = sy-tabix.
* Header
CLEAR:ls_header,ls_headerx.
ls_header-doc_type = ls_excel1-auart.
ls_header-ct_valid_f = sy-datum.
ls_header-sales_org = p_vkorg.
ls_header-distr_chan = '20'. "分销渠道
ls_header-division = '10'. "产品组
ls_header-purch_no_c = ls_excel1-auart.
ls_headerx-doc_type = 'X'.
ls_headerx-ct_valid_f = 'X'.
ls_headerx-sales_org = 'X'.
ls_headerx-purch_no_c = 'X'.
ls_headerx-distr_chan = 'X'. "分销渠道
ls_headerx-division = 'X'. "产品组
ls_headerx-updateflag = 'U'.
SELECT MAX( posnr )
FROM vbap
INTO @lv_posnr
WHERE vbeln = @ls_excel1-vbeln.
CLEAR ls_item.
lv_posnr = lv_posnr + 10.
ls_item-itm_number = lv_posnr.
ls_item-material = ls_excel1-matnr. "物料
ls_item-cust_mat35 = ls_excel1-maktx.
APPEND ls_item TO lt_item.
ls_itemx-itm_number = lv_posnr.
ls_itemx-material = 'X'.
ls_itemx-cust_mat35 = 'X'.
ls_itemx-updateflag = 'I'.
APPEND ls_itemx TO lt_itemx.
CLEAR ls_itemx.
CLEAR:lt_return,ls_output.
CALL FUNCTION 'SD_SALESDOCUMENT_CHANGE'
EXPORTING
salesdocument = ls_excel1-vbeln
order_header_in = ls_header
order_header_inx = ls_headerx
* SIMULATION = ' '
* INT_NUMBER_ASSIGNMENT = ' '
* BEHAVE_WHEN_ERROR = ' '
* BUSINESS_OBJECT = ' '
* CONVERT_PARVW_AUART = ' '
* CALL_FROM_BAPI = ' '
* LOGIC_SWITCH =
* I_CRM_LOCK_MODE = ' '
* NO_STATUS_BUF_INIT = ' '
IMPORTING
sales_header_out = ls_output
* SALES_HEADER_STATUS =
TABLES
return = lt_return
item_in = lt_item
item_inx = lt_itemx.
CLEAR lv_msg.
LOOP AT lt_return INTO ls_return WHERE type CA 'AEX'.
PERFORM frm_message_set USING ls_return-message
CHANGING lv_msg.
ENDLOOP.
IF sy-subrc NE 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
gs_excel1-vbeln = ls_output-doc_number.
gs_excel1-posnr = lv_posnr.
gs_excel1-icon = gc_green.
gs_excel1-msg = '创建成功'.
MODIFY gt_excel1 FROM gs_excel1 INDEX lv_tabix TRANSPORTING icon msg vbeln posnr .
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' .
gs_excel1-icon = gc_red.
gs_excel1-msg = lv_msg.
MODIFY gt_excel1 FROM gs_excel1 INDEX lv_tabix TRANSPORTING icon msg ."WHERE vbeln = ls_excel1-vbeln.
ENDIF.
ENDLOOP.