正文部分
生产完成后,需要对产品进行完工确认(也叫 报工确认);
一般情况下,可以通过事务码(T-Code)CO11 或 CO11N 进行确认。
对于一些零配件的生产时,往往需要确认大量的数量,因而有些用户就会有批量报工的需求。
批量报工可以通过两种方式实现:录制BDC 或者 Call 系统标准 BAPI。
1) 录制BDC这里就不讲述了,直接在CO11N上录屏即可;
2) Call 系统标准 BAPI:BAPI_PRODORDCONF_CREATE_TT.
在报工时,当涉及到 倒冲料扣料 的操作时,则需要 Call 两个BAPI来操作:
1. BAPI_PRODORDCONF_GET_TT_PROP 获取生产订单相关属性
2. BAPI_PRODORDCONF_CREATE_TT 报工确认
相关操作示例(包括倒冲料操作):
? * 定义数据内表 DATA: gt_afko TYPE STANDARD TABLE OF afko.* Work Area 定义 DATA: gw_afko TYPE afko,gw_afpo TYPE afpo,gw_afvc TYPE afvc,gw_afvv TYPE afvv.DATA: gv_index TYPE sy-tabix,gv_result TYPE c.DATA: *BAPI相关定义propose LIKE bapi_pp_conf_prop,timetickets LIKE bapi_pp_timeticket OCCURS 0 WITH HEADER LINE,goodsmovements LIKE bapi2017_gm_item_create OCCURS 0 WITH HEADER LINE,link_conf_goodsmov LIKE bapi_link_conf_goodsmov OCCURS 0 WITH HEADER LINE,return_detail LIKE bapi_coru_return OCCURS 0 WITH HEADER LINE,return LIKE bapiret1 OCCURS 0 WITH HEADER LINE.CONSTANTS:cn_flagx TYPE c VALUE 'X'.* Get Data... * Header CLEAR gt_afko[]. SELECT aufnr rsnum aufplINTO CORRESPONDING FIELDS OF TABLE gt_afkoFROM afkoWHERE aufnr IN so_aufnr "生产工单号.* Data Proccess... CLEAR gw_afko. LOOP AT gt_afko INTO gw_afko.IF sy-subrc = 0.CLEAR gw_afvc.SELECT SINGLEaufpl "订单工序的工艺路线号aplzl "订单的通用计数器vornr "工序plnfl "顺序arbidaplfl "序列(新) 有值INTO CORRESPONDING FIELDS OF gw_afvcFROM afvcWHERE aufpl = gw_afko-aufpl.IF sy-subrc = 0.* 1.需要更新的数据设置CLEAR propose.propose-quantity = cn_flagx. "更新数量propose-date_and_time = cn_flagx. "更新作业时间propose-goodsmovement = cn_flagx. "更新货物移动* 2.作业时间CLEAR: timetickets,timetickets[].timetickets-orderid = gw_print-aufnr. "工单号timetickets-operation = gw_afvc-vornr. "工序号timetickets-yield = gw_print-lmnga. "工单生产数量timetickets-sequence = gw_afvc-aplfl. "APPEND timetickets.CLEAR timetickets.* 3.货物移动属性 * 第一次赋值,用于获取相关默认属性值CLEAR: goodsmovements,goodsmovements[].goodsmovements-orderid = gw_print-aufnr. "生产订单号goodsmovements-order_itno = gw_afvc-vornr. "工序号APPEND goodsmovements.CLEAR goodsmovements.* 4.调用BAPI,获取默认属性值CALL FUNCTION 'BAPI_PRODORDCONF_GET_TT_PROP'EXPORTINGpropose = proposeIMPORTINGreturn = returnTABLEStimetickets = timeticketsgoodsmovements = goodsmovementslink_conf_goodsmov = link_conf_goodsmovdetail_return = return_detail.* 5.输出异常信息IF return-type = 'E' OR return-type = 'A'.CONCATENATE '错误:' return-message INTO return-message.gv_result = cn_flagx.ENDIF.LOOP AT return_detail WHERE type IS NOT INITIAL.IF return_detail-type = 'E' OR return_detail-type = 'A'.CONCATENATE '错误:' return_detail-message INTO return-message.gv_result = cn_flagx.ENDIF.ENDLOOP.* 6. 如若需要更新相关信息,可在此修改 * -- 这里修改作业时间 --IF gv_result NE cn_flagx.CLEAR gv_index.LOOP AT timetickets.gv_index = sy-tabix. "索引CLEAR gw_afvv.SELECT SINGLE * FROM afvvINTO CORRESPONDING FIELDS OF gw_afvvWHERE aufpl = gw_afvc-aufplAND aplzl = gw_afvc-aplzl.IF sy-subrc = 0.IF NOT gw_afvv-bmsch = 0.IF timetickets-conf_acti_unit1 NE 'S'.timetickets-conf_activity1 = timetickets-yield * gw_afvv-vgw01 / gw_afvv-bmsch.ELSE.timetickets-conf_activity1 = timetickets-yield * gw_afvv-vgw01 DIV gw_afvv-bmsch.ENDIF.IF timetickets-conf_acti_unit2 NE 'S'.timetickets-conf_activity2 = timetickets-yield * gw_afvv-vgw02 / gw_afvv-bmsch.ELSE.timetickets-conf_activity2 = timetickets-yield * gw_afvv-vgw02 DIV gw_afvv-bmsch.ENDIF.IF timetickets-conf_acti_unit3 NE 'S'.timetickets-conf_activity3 = timetickets-yield * gw_afvv-vgw03 / gw_afvv-bmsch.ELSE.timetickets-conf_activity3 = timetickets-yield * gw_afvv-vgw03 DIV gw_afvv-bmsch.ENDIF.IF timetickets-conf_acti_unit4 NE 'S'.timetickets-conf_activity4 = timetickets-yield * gw_afvv-vgw04 / gw_afvv-bmsch.ELSE.timetickets-conf_activity4 = timetickets-yield * gw_afvv-vgw04 DIV gw_afvv-bmsch.ENDIF.IF timetickets-conf_acti_unit5 NE 'S'.timetickets-conf_activity5 = timetickets-yield * gw_afvv-vgw05 / gw_afvv-bmsch.ELSE.timetickets-conf_activity5 = timetickets-yield * gw_afvv-vgw05 DIV gw_afvv-bmsch.ENDIF.IF timetickets-conf_acti_unit6 NE 'S'.timetickets-conf_activity6 = timetickets-yield * gw_afvv-vgw06 / gw_afvv-bmsch.ELSE.timetickets-conf_activity6 = timetickets-yield * gw_afvv-vgw06 DIV gw_afvv-bmsch.ENDIF.ENDIF.ENDIF.timetickets-yield = 200. "待确认的产量(用户输入确认值)IF gw_afvv IS NOT INITIAL.MODIFY timetickets INDEX gv_index TRANSPORTING yieldconf_activity1 conf_acti_unit1 conf_activity2 conf_acti_unit2conf_activity3 conf_acti_unit3 conf_activity4 conf_acti_unit4conf_activity5 conf_acti_unit5 conf_activity6 conf_acti_unit6.ELSE.MODIFY timetickets INDEX gv_index TRANSPORTING yield.ENDIF.CLEAR timetickets.ENDLOOP.CLEAR gw_afvv.ENDIF.* 7. 调用BAPI,报工确认CLEAR: return, return[].CLEAR: return_detail, return_detail[].CALL FUNCTION 'BAPI_PRODORDCONF_CREATE_TT'EXPORTINGpost_wrong_entries = '1'testrun = '' "标识为 X,则为试运行 不提交至系统IMPORTINGreturn = returnTABLEStimetickets = timeticketsgoodsmovements = goodsmovementslink_conf_goodsmov = link_conf_goodsmovdetail_return = return_detail.CLEAR gv_result.READ TABLE return WITH KEY type = 'E'.IF sy-subrc = 0.CONCATENATE '错误:' return-message INTO return-message.gv_result = cn_flagx.ENDIF.LOOP AT return_detail WHERE type IS NOT INITIAL.IF return_detail-type = 'E' OR return_detail-type = 'A'.CONCATENATE '错误:' return_detail-message INTO return-message.gv_result = cn_flagx.ENDIF.ENDLOOP.IF gv_result NE cn_flagx.CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'EXPORTINGwait = cn_flagx.ENDIF.ENDIF.ENDIF.CLEAR gw_afko. ENDLOOP.?
点击进入:ABAP 生产订单完工确认(CO11N) BAPI : BAPI_PRODORDCONF_CREATE_TT