代码如下,主要调用BAPI:BAPI_PRODORDCONF_CREATE_TT执行报工
遇到的问题1:报工时反冲料未执行发料,报工正常执行,未出现报错情况,CO1P和COGI都没有找到任何报错信息。
原因:参数goodsmovements 和 link_conf_goodsmov 条目一致,原代码中有判断执行时清了link_conf_goodsmov 参数表的导致发料失败。
FORM FRM_baogong USING wk_tick_in TYPE bapi_pp_timeticket
wk_101move TYPE bapi2017_gm_item_create
it_261move TYPE STANDARD TABLE bapi2017_gm_item_create
CHANGING o_code TYPE char1
o_desc TYPE char100
o_output LIKE gt_output.
DATA: v_len TYPE i,
v_line TYPE i,
l_tabix TYPE i,
v_mblnr TYPE bapi2017_gm_head_ret-mat_doc,
v_myear TYPE bapi2017_gm_head_ret-doc_year,
wk_code TYPE bapi2017_gm_code,
wk_head TYPE bapi2017_gm_head_01,
wk_numb TYPE bapi2017_gm_serialnumber,
it_numb TYPE STANDARD TABLE OF bapi2017_gm_serialnumber,
wk_261move TYPE bapi2017_gm_item_create,
wk_retue TYPE bapiret1,
wk_retun TYPE bapiret2,
it_retun TYPE STANDARD TABLE OF bapiret2.
DATA: wk_afko TYPE afko,
it_afko TYPE STANDARD TABLE OF afko,
wk_afvv TYPE afvv,
it_afvv TYPE STANDARD TABLE OF afvv,
wk_crhd TYPE crhd,
it_crhd TYPE STANDARD TABLE OF crhd,
wk_tick TYPE bapi_pp_timeticket,
it_tick TYPE STANDARD TABLE OF bapi_pp_timeticket,
wk_move TYPE bapi2017_gm_item_create,
it_move TYPE STANDARD TABLE OF bapi2017_gm_item_create,
wk_propose TYPE bapi_pp_conf_prop,
wk_linkconf TYPE bapi_link_conf_goodsmov,
it_linkconf TYPE STANDARD TABLE OF bapi_link_conf_goodsmov,
wk_detail TYPE bapi_coru_return,
it_detail TYPE STANDARD TABLE OF bapi_coru_return,
wk_retrn TYPE bapi_coru_return,
it_retrn TYPE STANDARD TABLE OF bapi_coru_return.
DATA:ls_output TYPE tp_output.
* 获取工单工序信息
CLEAR it_afko[].
SELECT aufnr rsnum aufpl
INTO CORRESPONDING FIELDS OF TABLE it_afko
FROM afko
WHERE aufnr = wk_tick_in-orderid. "生产工单号
CLEAR wk_afko.
READ TABLE it_afko INTO wk_afko INDEX 1.
* 获取工序信息
SELECT
afvc~aplzl, "订单的通用计数器
afvc~aufpl, "订单工序的工艺路线号
afvc~vornr, "工序
afvc~plnfl, "顺序
afvc~arbid,
afvc~aplfl, "序列(新) 有值
afvc~steus,
crhd~arbpl
FROM afvc
INNER JOIN crhd ON afvc~arbid = crhd~objid " 工作中心
WHERE aufpl = @wk_afko-aufpl
ORDER BY afvc~vornr
INTO TABLE @DATA(lt_afvc)
.
IF lt_afvc[] IS NOT INITIAL.
SORT lt_afvc BY vornr ASCENDING.
CLEAR v_len.
DESCRIBE TABLE lt_afvc LINES v_len.
* 获取工时信息
REFRESH it_afvv.
SELECT * FROM afvv
INTO CORRESPONDING FIELDS OF TABLE it_afvv
FOR ALL ENTRIES IN lt_afvc
WHERE aufpl = lt_afvc-aufpl
AND aplzl = lt_afvc-aplzl.
ENDIF.
* 按工序报工
CLEAR v_line.
LOOP AT lt_afvc INTO DATA(ls_afvc).
v_line = v_line + 1.
IF lv_flg IS INITIAL.
CLEAR wk_afvv.
READ TABLE it_afvv INTO wk_afvv
WITH KEY aufpl = ls_afvc-aufpl
aplzl = ls_afvc-aplzl.
REFRESH it_tick.
* 工序设置
CLEAR wk_tick.
wk_tick-orderid = wk_tick_in-orderid. "订单号
wk_tick-sequence = ls_afvc-aplfl. "序列号
wk_tick-operation = ls_afvc-vornr. "工序代码
APPEND wk_tick TO it_tick.
* 更新数量,日期,货物移动标记
CLEAR wk_propose.
wk_propose-quantity = 'X'.
wk_propose-date_and_time = 'X'.
wk_propose-goodsmovement = 'X'.
* 获取默认报工属性数据
REFRESH it_move.
CLEAR wk_move.
wk_move-orderid = wk_tick_in-orderid.
wk_move-order_itno = ls_afvc-vornr.
APPEND wk_move TO it_move.
CLEAR: wk_retue,it_detail[].
CALL FUNCTION 'BAPI_PRODORDCONF_GET_TT_PROP'
EXPORTING
propose = wk_propose
IMPORTING
return = wk_retue
TABLES
timetickets = it_tick
goodsmovements = it_move
link_conf_goodsmov = it_linkconf
detail_return = it_detail.
* 输出报错信息
IF wk_retue-type = 'E'.
o_code = 'E'.
o_desc = 'SAP WORKREPORT FAIL !'.
CONCATENATE o_desc 'REASON: ' wk_retue-message INTO o_desc SEPARATED BY space.
EXIT.
ENDIF.
LOOP AT it_detail INTO wk_detail WHERE type IS NOT INITIAL.
IF wk_detail-type = 'E' OR wk_detail-type = 'A'.
IF o_desc IS NOT INITIAL.
CONCATENATE o_desc wk_detail-message INTO o_desc SEPARATED BY space.
ELSE.
o_code = 'E'.
o_desc = 'SAP WORKREPORT FAIL !'.
CONCATENATE o_desc 'REASON: ' wk_detail-message INTO o_desc SEPARATED BY space.
EXIT.
ENDIF.
ENDIF.
ENDLOOP.
* 工时数据补充
LOOP AT it_tick INTO wk_tick.
wk_tick-plant = wk_tick_in-plant. "工厂
IF wk_tick_in-work_cntr+(2) = 'SX' OR wk_tick_in-work_cntr+(2) = 'BZ'.
wk_tick-work_cntr = wk_tick_in-work_cntr. "工作中心
ELSE.
wk_tick-work_cntr = ls_afvc-arbpl. "工作中心
ENDIF.
wk_tick-wip_batch = wk_tick_in-wip_batch. "批号
wk_tick-dev_reason = wk_tick_in-dev_reason. "差异原因
wk_tick-postg_date = wk_tick_in-postg_date. "过帐日期
wk_tick-conf_text = wk_tick_in-conf_text. "确认文本
wk_tick-conf_quan_unit = wk_afvv-meinh.
wk_tick-conf_quan_unit_iso = wk_afvv-meinh.
wk_tick-conf_acti_unit1 = wk_afvv-vge01. "单位
wk_tick-conf_acti_unit1_iso = wk_afvv-vge01. "单位
wk_tick-conf_acti_unit2 = wk_afvv-vge02. "单位
wk_tick-conf_acti_unit2_iso = wk_afvv-vge02. "单位
wk_tick-conf_acti_unit3 = wk_afvv-vge03. "单位
wk_tick-conf_acti_unit3_iso = wk_afvv-vge03. "单位
wk_tick-conf_acti_unit4 = wk_afvv-vge04. "单位
wk_tick-conf_acti_unit4_iso = wk_afvv-vge04. "单位
wk_tick-conf_acti_unit5 = wk_afvv-vge05. "单位
wk_tick-conf_acti_unit5_iso = wk_afvv-vge05. "单位
wk_tick-conf_acti_unit6 = wk_afvv-vge06. "单位
wk_tick-conf_acti_unit6_iso = wk_afvv-vge06. "单位
IF wk_afvv-bmsch NE 0.
IF wk_tick-conf_acti_unit1 NE 'S'.
wk_tick-conf_activity1 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw01 / wk_afvv-bmsch.
ELSE.
wk_tick-conf_activity1 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw01 DIV wk_afvv-bmsch.
ENDIF.
IF wk_tick-conf_acti_unit2 NE 'S'.
wk_tick-conf_activity2 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw02 / wk_afvv-bmsch.
ELSE.
wk_tick-conf_activity2 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw02 DIV wk_afvv-bmsch.
ENDIF.
IF wk_tick-conf_acti_unit3 NE 'S'.
wk_tick-conf_activity3 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw03 / wk_afvv-bmsch.
ELSE.
wk_tick-conf_activity3 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw03 DIV wk_afvv-bmsch.
ENDIF.
IF wk_tick-conf_acti_unit4 NE 'S'.
wk_tick-conf_activity4 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw04 / wk_afvv-bmsch.
ELSE.
wk_tick-conf_activity4 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw04 DIV wk_afvv-bmsch.
ENDIF.
IF wk_tick-conf_acti_unit5 NE 'S'.
wk_tick-conf_activity5 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw05 / wk_afvv-bmsch.
ELSE.
wk_tick-conf_activity5 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw05 DIV wk_afvv-bmsch.
ENDIF.
IF wk_tick-conf_acti_unit6 NE 'S'.
wk_tick-conf_activity6 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw06 / wk_afvv-bmsch.
ELSE.
wk_tick-conf_activity6 = ( wk_tick-yield + wk_tick-scrap ) * wk_afvv-vgw06 DIV wk_afvv-bmsch.
ENDIF.
ENDIF.
MODIFY it_tick FROM wk_tick TRANSPORTING plant work_cntr wip_batch dev_reason postg_date scrap conf_text
yield conf_quan_unit conf_quan_unit_iso
conf_activity1 conf_activity2 conf_activity3 conf_activity4 conf_activity5 conf_activity6
conf_acti_unit1 conf_acti_unit2 conf_acti_unit3 conf_acti_unit4 conf_acti_unit5 conf_acti_unit6.
ENDLOOP.
IF o_code <> 'E'.
REFRESH it_move.
REFRESH it_linkconf.
IF v_line = 1.
* 反冲物料做发料操作
LOOP AT it_261move INTO wk_261move.
* 261收货数据设置
wk_move-material = wk_261move-material. "物料
wk_move-plant = wk_261move-plant. "工厂
wk_move-stge_loc = wk_261move-stge_loc."存储位置
wk_move-batch = wk_261move-batch."批次
wk_move-move_type = wk_261move-move_type. "移动类型
wk_move-orderid = wk_261move-orderid.
wk_move-order_itno = ''.
* WK_MOVE-ORDER_ITNO = WK_261MOVE-ORDER_ITNO.
wk_move-sales_ord = wk_261move-val_sales_ord.
wk_move-s_ord_item = wk_261move-val_s_ord_item.
wk_move-val_sales_ord = wk_261move-val_sales_ord. "销售订单
wk_move-val_s_ord_item = wk_261move-val_s_ord_item. "销售订单行
* IF WK_MOVE-SALES_ORD IS NOT INITIAL.
* WK_MOVE-SPEC_STOCK = WK_261MOVE-SPEC_STOCK. "特殊库存标识
* ENDIF.
wk_move-spec_stock = wk_261move-spec_stock. "特殊库存标识
wk_move-entry_qnt = wk_261move-entry_qnt. "数量
wk_move-entry_uom = wk_261move-entry_uom. "数量单位
* WK_MOVE-ENTRY_UOM_ISO = WK_101MOVE-ENTRY_UOM_ISO. "数量单位
* WK_MOVE-MVT_IND = 'F'."生产收货标识
APPEND wk_move TO it_move.
wk_linkconf-index_goodsmov = sy-tabix.
wk_linkconf-index_confirm = 1.
APPEND wk_linkconf TO it_linkconf.
ENDLOOP.
ENDIF.
* 判断是否最后一道工序并且存在101收货明细行
IF v_line = v_len AND wk_101move IS NOT INITIAL.
* 控制码是PP03自动收货,否,手工收货
IF ls_afvc-steus <> 'PP03'.
IF v_len ne 1.
* 设置不自动收货
REFRESH it_linkconf.
wk_linkconf-index_goodsmov = 0.
APPEND wk_linkconf TO it_linkconf.
ENDIF.
ELSE.
CLEAR l_tabix.
DESCRIBE TABLE it_linkconf LINES l_tabix.
wk_linkconf-index_goodsmov = l_tabix + 1.
wk_linkconf-index_confirm = 1.
APPEND wk_linkconf TO it_linkconf.
* 收货数据设置
wk_move-material = wk_101move-material. "物料
wk_move-plant = wk_101move-plant. "工厂
wk_move-stge_loc = wk_101move-stge_loc."存储位置
wk_move-batch = wk_101move-batch."批次
wk_move-move_type = wk_101move-move_type. "移动类型
wk_move-orderid = wk_101move-orderid.
wk_move-order_itno = ''.
wk_move-entry_qnt = wk_101move-entry_qnt. "数量
wk_move-entry_uom = wk_101move-entry_uom. "数量单位
* WK_MOVE-ENTRY_UOM_ISO = WK_101MOVE-ENTRY_UOM_ISO. "数量单位
wk_move-mvt_ind = 'F'."生产收货标识
APPEND wk_move TO it_move.
ENDIF.
ENDIF.
* 报工
CLEAR wk_retue.
CALL FUNCTION 'BAPI_PRODORDCONF_CREATE_TT'
EXPORTING
testrun = ''
post_wrong_entries = '2'
IMPORTING
return = wk_retue
TABLES
timetickets = it_tick
goodsmovements = it_move
link_conf_goodsmov = it_linkconf
detail_return = it_retrn.
READ TABLE it_tick INTO wk_tick INDEX 1.
CLEAR wk_retrn.
READ TABLE it_retrn INTO wk_retrn WITH KEY type = 'E'.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
o_code = 'E'.
o_desc = 'SAP WorkReport Fail !'.
CONCATENATE o_desc 'Reason: ' wk_retrn-message INTO o_desc SEPARATED BY space.
EXIT.
ELSE.
"DATA:lv_task TYPE char14.
"CONCATENATE sy-datum sy-uzeit INTO lv_task.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' "STARTING NEW TASK lv_task
EXPORTING
wait = 'X'.
o_code = 'S'.
o_desc = 'SAP WorkReport Success!'.
LOOP AT it_retrn INTO wk_retrn.
"输出数据结构设置
CLEAR ls_output.
ls_output-werks = wk_tick-plant.
ls_output-mesaufnr = ''.
ls_output-aufnr = wk_tick-orderid.
ls_output-rmzhl = ''.
ls_output-operation = wk_tick-operation.
ls_output-conf_no = wk_retrn-conf_no.
ls_output-conf_cnt = wk_retrn-conf_cnt.
APPEND ls_output TO o_output.
ENDLOOP.
WAIT UP TO 2 SECONDS.
ENDIF.
CLEAR wk_tick.
ENDIF.
ENDIF.
* 101手工收货
IF lv_flg1 IS INITIAL.
IF v_line = v_len AND wk_101move IS NOT INITIAL AND ls_afvc-steus <> 'PP03'.
* IF V_LINE = V_LEN AND WK_101MOVE IS NOT INITIAL AND O_CODE <> 'E'.
* 收货数据设置
REFRESH it_move.
wk_move-material = wk_101move-material. "物料
wk_move-plant = wk_101move-plant. "工厂
wk_move-stge_loc = wk_101move-stge_loc."存储位置
wk_move-move_type = '101'. "移动类型
wk_move-orderid = wk_101move-orderid.
wk_move-order_itno = ''.
wk_move-entry_qnt = wk_101move-entry_qnt. "数量
wk_move-entry_uom = wk_101move-entry_uom. "数量单位
wk_move-entry_uom_iso = wk_101move-entry_uom_iso. "数量单位
wk_move-batch = wk_101move-batch. "批次
wk_move-mvt_ind = 'F'."生产收货标识
APPEND wk_move TO it_move.
CLEAR: wk_head,wk_code.
wk_head-doc_date = sy-datum. "凭证日期
wk_head-pstng_date = wk_tick_in-postg_date."过账日期
wk_head-pr_uname = sy-uname."创建用户
wk_code-gm_code = '02'.
CLEAR: v_mblnr,v_myear.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = wk_head
goodsmvt_code = wk_code
IMPORTING
materialdocument = v_mblnr
matdocumentyear = v_myear
TABLES
goodsmvt_item = it_move
goodsmvt_serialnumber = it_numb
return = it_retun.
CLEAR wk_retun.
READ TABLE it_retun INTO wk_retun WITH KEY type = 'E'.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
o_code = 'E'.
o_desc = 'SAP 101 Goods Issue Fail !'.
CONCATENATE o_desc 'Reason: ' wk_retun-message INTO o_desc SEPARATED BY space.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
o_code = 'S'.
o_desc = '101 Goods Issue Success !'.
CLEAR ls_output.
ls_output-aufnr = wk_101move-orderid.
ls_output-mblnr = v_mblnr.
ls_output-bwart = '101'.
APPEND ls_output TO o_output.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
CLEAR lt_afvc.
ENDFORM.