公眾號:
matinal
本文作者:
matinal
前言部分
大家可以關注我的公眾號,公眾號里的排版更好,閱讀更舒適。
正文部分
生產完成后,需要對產品進行完工確認(也叫 報工確認);
一般情況下,可以通過事務碼(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 aufpl INTO CORRESPONDING FIELDS OF TABLE gt_afko FROM afko WHERE aufnr IN so_aufnr "生產工單號 . * Data Proccess... CLEAR gw_afko. LOOP AT gt_afko INTO gw_afko. IF sy-subrc = 0. CLEAR gw_afvc. SELECT SINGLE aufpl "訂單工序的工藝路線號 aplzl "訂單的通用計數器 vornr "工序 plnfl "順序 arbid aplfl "序列(新) 有值 INTO CORRESPONDING FIELDS OF gw_afvc FROM afvc WHERE 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' EXPORTING propose = propose IMPORTING return = return TABLES timetickets = timetickets goodsmovements = goodsmovements link_conf_goodsmov = link_conf_goodsmov detail_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 afvv INTO CORRESPONDING FIELDS OF gw_afvv WHERE aufpl = gw_afvc-aufpl AND 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 yield conf_activity1 conf_acti_unit1 conf_activity2 conf_acti_unit2 conf_activity3 conf_acti_unit3 conf_activity4 conf_acti_unit4 conf_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' EXPORTING post_wrong_entries = '1' testrun = '' "標識為 X,則為試運行 不提交至系統 IMPORTING return = return TABLES timetickets = timetickets goodsmovements = goodsmovements link_conf_goodsmov = link_conf_goodsmov detail_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' EXPORTING wait = cn_flagx. ENDIF. ENDIF. ENDIF. CLEAR gw_afko. ENDLOOP.