生产订单创建
不需要提交,bapi执行结束默认提交
"这是根据销售订单创建
ls_orderdata-plant = <fs_alv>-werks."生产工厂
ls_orderdata-order_type = 'ZP01'."订单类型
ls_orderdata-basic_start_date = lv_bdat."开始日期
ls_orderdata-basic_end_date = lv_edat."结束日期
ls_orderdata-quantity = 1."数量
ls_orderdata-sales_order = <fs_alv>-vbeln."订单
ls_orderdata-sales_order_item = '000010'."行项目
CALL FUNCTION 'BAPI_PRODORD_CREATE'
EXPORTING
orderdata = ls_orderdata
IMPORTING
return = ls_return
order_number = <fs_alv>-aufnr.
"CO01创建物料对应的工单
ls_orderdata-plant = <fs_itab>-werks."生产工厂
ls_orderdata-order_type = <fs_itab>-auart."订单类型
ls_orderdata-basic_start_date = <fs_itab>-gstrp."开始日期
ls_orderdata-basic_end_date = <fs_itab>-gltrp."结束日期
ls_orderdata-quantity = <fs_itab>-qty."数量
<fs_itab>-matnr = |{ <fs_itab>-matnr ALPHA = IN }|.
ls_orderdata-material_long = <fs_itab>-matnr."
"select single meins into ls_orderdata-quantity_uom from mara where matnr = <fs_itab>-matnr.
CALL FUNCTION 'BAPI_PRODORD_CREATE'
EXPORTING
orderdata = ls_orderdata
IMPORTING
return = ls_return
order_number = <fs_itab>-aufnr.
IF <fs_itab>-aufnr IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
"检查订单是否提交
DO.
SELECT SINGLE * INTO @DATA(ls_aufk) FROM aufk WHERE aufnr = @<fs_itab>-aufnr.
IF sy-subrc = 0.
EXIT.
ENDIF.
ENDDO.
ENDIF.
订单状态–下达
"检查订单是否提交
DO.
SELECT SINGLE aufnr INTO @DATA(lv_aufnr) FROM aufk WHERE aufnr = @<fs_alv>-aufnr.
IF sy-subrc = 0.
EXIT.
ENDIF.
ENDDO.
DATA:gt_bapi_order_key TYPE TABLE OF bapi_order_key,
gs_bapi_order_key TYPE bapi_order_key,
gt_order_return TYPE TABLE OF bapi_order_return WITH HEADER LINE.
CLEAR: gs_bapi_order_key, gt_bapi_order_key[], gt_order_return, gt_order_return[].
gs_bapi_order_key-order_number = <fs_alv>-aufnr.
APPEND gs_bapi_order_key TO gt_bapi_order_key.
CALL FUNCTION 'BAPI_PRODORD_RELEASE'
TABLES
orders = gt_bapi_order_key
detail_return = gt_order_return.
READ TABLE gt_order_return WITH KEY type = 'E'.
IF sy-subrc <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
生产订单添加 / 删除 VIN
通过BAPI创建的时候,vin会因为一些原因导致不能带入到生产订单里;
所以在创建之后,通过ser05 和 objk两个表关联 检查下 vin是否存在;
不存在则需要通过以下代码增加:
主要函数:
SERNR_ADD_TO_PP
SERNR_DEL_FROM_PP
以及
SERIAL_LISTE_POST_PP
生产订单号 记得 补零(问题检查了好久!!)
DATA: lt_sernos TYPE TABLE OF e1rmsno WITH HEADER LINE.
START-OF-SELECTION.
CLEAR: lt_sernos[], lt_sernos.
lt_sernos-sernr = 'DEEPWAY0000000006'.
APPEND lt_sernos.
CALL FUNCTION 'SERNR_ADD_TO_PP'
EXPORTING
material = 'E2501-002' "物料号
profile = 'Z001' "序列号参数文件
j_vorgang = 'PMP1'
ppaufnr = '001000000197' "生产订单号
ppposnr = 1 "行项目 afpo
ppwerk = '2001' "工厂
ppaufart = 'ZP01' "生产订单类型
ppautyp = '10' "生产订单类别
quantity = 1 "数量 afpo
pmrsord = ''
TABLES
sernos = lt_sernos
EXCEPTIONS
serialnumber_errors = 1
serialnumber_warnings = 2
OTHERS = 3.
IF sy-subrc = 0.
CALL FUNCTION 'SERIAL_LISTE_POST_PP'
EXPORTING
memory_id_status = 'SN_STATS'.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF .
组件增删改
修改:
注意反冲标识和散装物料标识:只能存在一个;

DATA:lv_number TYPE bapi_network_list-network,
lt_detail TYPE TABLE OF bapi_network_comp_detail,
lt_remove TYPE TABLE OF bapi_network_comp_id,
ls_remove TYPE bapi_network_comp_id,
lt_message TYPE TABLE OF bapi_meth_message,
ls_message TYPE bapi_meth_message.
DATA:lv_check TYPE char1,
lv_message TYPE char255.
lv_number = '001000000311'."工单号
*--------------获取工单组件明细-------------------------------*
CALL FUNCTION 'BAPI_NETWORK_COMP_GETDETAIL'
EXPORTING
number = lv_number
TABLES
e_components_detail = lt_detail.
*--------------获取工单组件明细-------------------------------*
*--------------工单组件删除-------------------------------*
"此处使用查询BAPI得到的组件列表,赋值给移除内表
DATA: lt_components_change TYPE TABLE OF bapi_network_comp_change,
ls_components_change TYPE bapi_network_comp_change,
lt_components_change_update TYPE TABLE OF bapi_network_comp_cng_upd,
ls_components_change_update TYPE bapi_network_comp_cng_upd,
ls_return TYPE bapiret2.
LOOP AT lt_detail INTO DATA(ls_detail).
CLEAR ls_components_change.
ls_components_change-component = ls_detail-component."BAPI获取到的组件唯一标识
ls_components_change-stge_loc = 'A001'."库存地点
APPEND ls_components_change TO lt_components_change.
CLEAR:ls_components_change_update.
ls_components_change_update-component = ls_detail-component.
ls_components_change_update-stge_loc = 'X'."库存地点
APPEND ls_components_change_update TO lt_components_change_update.
ENDLOOP.
CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
CALL FUNCTION 'BAPI_NETWORK_COMP_CHANGE'
EXPORTING
number = lv_number
IMPORTING
return = ls_return
TABLES
i_components_change = lt_components_change
i_components_change_update = lt_components_change_update
e_message_table = lt_message.
LOOP AT lt_message INTO ls_message WHERE message_type CA 'AEX'.
lv_check = 'E'.
lv_message = lv_message && ls_message-message_text.
ENDLOOP.
IF lv_check = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ENDIF.
组件删除新增
tips: 删除组件的时候,在工单创建状态删除,可以删除掉组件,
如果是下达状态,则会保留这些组件,且不一定会有删除标记(虽然是删除状态)
DATA:lv_number TYPE bapi_network_list-network,
lt_detail TYPE TABLE OF bapi_network_comp_detail,
lt_remove TYPE TABLE OF bapi_network_comp_id,
ls_remove TYPE bapi_network_comp_id,
lt_message TYPE TABLE OF bapi_meth_message,
ls_message TYPE bapi_meth_message.
DATA:lv_check TYPE char1,
lv_message TYPE char255.
lv_number = '001000000311'."工单号
*--------------获取工单组件明细-------------------------------*
CALL FUNCTION 'BAPI_NETWORK_COMP_GETDETAIL'
EXPORTING
number = lv_number
TABLES
e_components_detail = lt_detail.
*--------------获取工单组件明细-------------------------------*
*--------------工单组件删除-------------------------------*
"此处使用查询BAPI得到的组件列表,赋值给移除内表
LOOP AT lt_detail INTO DATA(ls_detail).
CLEAR ls_remove.
ls_remove-component = ls_detail-component.
APPEND ls_remove TO lt_remove.
ENDLOOP.
CALL FUNCTION 'BAPI_NETWORK_COMP_REMOVE'
EXPORTING
number = lv_number
TABLES
i_components_remove = lt_remove
e_message_table = lt_message.
LOOP AT lt_message INTO ls_message WHERE message_type CA 'AEX'.
lv_check = 'E'.
lv_message = lv_message && ls_message-message_text.
ENDLOOP.
IF lv_check = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ENDIF.
*--------------工单组件删除-------------------------------*
*--------------工单组件新增-------------------------------*
DATA:lt_components TYPE TABLE OF bapi_network_comp_add,
ls_components TYPE bapi_network_comp_add.
CLEAR: lv_check, lt_message.
ls_components-item_number = '0010'."项目编号
ls_components-activity = '0010'."必输 作业
ls_components-material = 'X121050000059'."物料
ls_components-plant = '1006'."工厂
SELECT SINGLE meins INTO ls_components-base_uom FROM mara WHERE matnr = ls_components-material.
SELECT SINGLE beskz INTO ls_components-type_of_pur_resv FROM marc WHERE matnr = ls_components-material AND werks = '1006'.
* ls_components-type_of_pur_resv = 'F'."beskz."必输 采购类型
ls_components-entry_quantity = 1."数量
* ls_components-base_uom = 'EA'."单位
*ls_components-batch = ''."批次
ls_components-item_cat = 'L'."项目类别
ls_components-backflush = 'X'."反冲
APPEND ls_components TO lt_components.
CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
CALL FUNCTION 'BAPI_NETWORK_COMP_ADD'
EXPORTING
number = lv_number
TABLES
i_components_add = lt_components
e_message_table = lt_message.
LOOP AT lt_message INTO ls_message WHERE message_type CA 'AEX'.
lv_check = 'E'.
lv_message = lv_message && ls_message-message_text.
ENDLOOP.
IF lv_check = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true.
ENDIF.
*--------------工单组件新增-------------------------------*
注意点:新增组件—移动类型281的问题
通过BAPI: BAPI_NETWORK_COMP_ADD
新增的组件,在预留表RESB中移动类型为281, 但实际上应该是261

原因:
通过断点调试发现,该BAPI会调用下面的函数,获取移动类型
函数:CO_TA_TCOKO_READ
这里给的默认值为CN
解决:
通过隐式增强,替换CN 为 CO ( 通过前台断点发现给的就是CO)


3037

被折叠的 条评论
为什么被折叠?



