业务背景:前台CN22网络作业下面创建预留没问题,MB21创建预留报“MESSAGE E M7126 有关订单种类20的手工预定不允许”错误。
错误:网络、作业下面创建预留使用BAPI_RESERVATION_CREATE1报错“MESSAGE E M7126 有关订单种类20的手工预定不允许”
正确:BAPI_NETWORK_COMP_ADD 网络作业创建预留 代码如下
DATA:wa_i_components_add TYPE bapi_network_comp_add,
it_i_components_add TYPE TABLE OF bapi_network_comp_add,
it_bapiret2 TYPE STANDARD TABLE OF bapiret2,
i_number TYPE bapi_network_list-network,
wa_bapiret2 TYPE bapiret2.
DATA: it_e_message_table TYPE TABLE OF bapi_meth_message.
READ TABLE gt_alv INTO DATA(ls_alv) WITH KEY sel = 'X'.
IF sy-subrc NE 0.
p_msg = '创建失败'.
EXIT.
ENDIF.
CLEAR: wa_bapiret2,it_bapiret2,i_number,it_i_components_add[],it_e_message_table[].
i_number = p_aufnr.
"物料组件
LOOP AT gt_alv INTO DATA(wa_alv) WHERE sel EQ 'X'.
wa_i_components_add-activity = p_vornr. "活动编号
"必填,需传输或者找
wa_i_components_add-mrp_relevant = '3'. "事件立即执行
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
input = wa_alv-matnr
IMPORTING
output = wa_i_components_add-material.
wa_i_components_add-entry_quantity = wa_alv-bdmng. "数量
wa_i_components_add-base_uom = wa_alv-meins. "'KG'. "基本计量单位
* wa_i_components_add-pur_group = ls_alv-ekgrp."采购组
* wa_i_components_add-WBS_ELEMENT = 'XA-23511H400F03-2-3'.
wa_i_components_add-type_of_pur_resv = '8'. "采购类型
wa_i_components_add-stge_loc = wa_alv-lgort.
wa_i_components_add-gr_rcpt = p_zzbzbp. "收货方/运达方
wa_i_components_add-unload_pt = p_zzwork. "卸货点
wa_i_components_add-plant = wa_alv-werks. "工厂
wa_i_components_add-req_date = p_BDTER."需求日
* wa_i_components_add-item_text = '测试QJ'. "项目文本行
wa_i_components_add-item_cat = 'L'. "综合项目
APPEND wa_i_components_add TO it_i_components_add.
CLEAR: wa_i_components_add.
ENDLOOP.
"第三步:调用函数
CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
CALL FUNCTION 'BAPI_NETWORK_COMP_ADD'
EXPORTING
number = i_number
IMPORTING
return = wa_bapiret2
TABLES
i_components_add = it_i_components_add
e_message_table = it_e_message_table.
APPEND wa_bapiret2 TO it_bapiret2.
"第四步:判断是否有错误消息
LOOP AT it_bapiret2 INTO wa_bapiret2 WHERE type CA 'AE'.
CONCATENATE p_msg wa_bapiret2-message wa_bapiret2-message_v1 wa_bapiret2-message_v2 wa_bapiret2-message_v3 wa_bapiret2-message_v4 INTO p_msg.
ENDLOOP.
"第四步:如果有错误消息则退出
IF sy-subrc EQ 0.
CALL FUNCTION 'PS_FLAG_INIT_GLOBAL_FLAGS '.
CALL FUNCTION 'PS_FLAG_SET_GLOBAL_FLAGS '
EXPORTING
i_precommit_ok = 'Y'.
ENDIF.
CHECK sy-subrc NE 0.
"第四步:没有错误消息则执行预提交
CALL FUNCTION 'BAPI_PS_PRECOMMIT'
TABLES
et_return = it_bapiret2.
LOOP AT it_bapiret2 INTO wa_bapiret2 WHERE type CA 'AE'.
CONCATENATE p_msg wa_bapiret2-message wa_bapiret2-message_v1 wa_bapiret2-message_v2 wa_bapiret2-message_v3 wa_bapiret2-message_v4 INTO p_msg.
ENDLOOP.
"第五步:预提交有错误消息则执行回滚
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CALL FUNCTION 'PS_FLAG_INIT_GLOBAL_FLAGS'.
CALL FUNCTION 'PS_FLAG_SET_GLOBAL_FLAGS'
EXPORTING
i_precommit_ok = 'Y'.
COMMIT WORK.
ELSE.
"第五步:预提交无错误消息则执行正式提交
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.