CO11N进行生产报工,同时根据配置进行101或者261货物移动。
如果货物移动出错,可以用COGI进行处理。(后处理错误货物移动)
函数调用的增强点:
MBCFC010 库存管理项目屏幕上的建议批次编号,可用于创建批次
MB_DOCUMENT_BADI:后台进程执行,前台CO11N debug不进入。
FORM FRM_CALL_BAPI .
DATA:
LT_TIMETICKETS TYPE TABLE OF BAPI_PP_TIMETICKET,
LS_TIMETICKETS TYPE BAPI_PP_TIMETICKET.
DATA:LT_LINK_CONF TYPE TABLE OF BAPI_LINK_CONF_GOODSMOV,
LS_LINK_CONF TYPE BAPI_LINK_CONF_GOODSMOV.
DATA:LT_GOODMVT TYPE TABLE OF BAPI2017_GM_ITEM_CREATE,
LS_GOODMVT TYPE BAPI2017_GM_ITEM_CREATE.
DATA:LT_GOODMVT_POST TYPE TABLE OF BAPI2017_GM_ITEM_CREATE,
LS_GOODMVT_POST TYPE BAPI2017_GM_ITEM_CREATE.
DATA:LT_DETIAL_RETURN TYPE TABLE OF BAPI_CORU_RETURN,
LS_DETAIL_RETURN TYPE BAPI_CORU_RETURN.
DATA:LS_PROPOSE TYPE BAPI_PP_CONF_PROP .
DATA:LS_RETURN TYPE BAPIRET1 .
DATA:LW_AFVC TYPE AFVC .
DATA: LS_AFVV TYPE AFVV .
DATA: LV_FLAG TYPE CHAR01 .
DATA:LV_MESSAGE TYPE STRING .
DATA:LV_POST TYPE CHAR01 .
* LS_PROPOSE-QUANTITY = 'X' . “更新报工数量
LS_PROPOSE-DATE_AND_TIME = 'X' .
LS_PROPOSE-GOODSMOVEMENT = 'X'. "获取261和101的物料数量信息
* 2.作业时间
CLEAR: LS_TIMETICKETS,LT_TIMETICKETS[].
LS_TIMETICKETS-ORDERID = GS_RESULT_TAB-AUFNR. "工单号
LS_TIMETICKETS-OPERATION = GS_RESULT_TAB-VORNR. "工序号
LS_TIMETICKETS-YIELD = GS_RESULT_TAB-REPOM. "工单生产数量
LS_TIMETICKETS-SEQUENCE = GS_RESULT_TAB-APLFL.
APPEND LS_TIMETICKETS TO LT_TIMETICKETS.
*根据数量获取261或者101的物料移动数量
CALL FUNCTION 'BAPI_PRODORDCONF_GET_TT_PROP'
EXPORTING
PROPOSE = LS_PROPOSE
IMPORTING
RETURN = LS_RETURN
TABLES
TIMETICKETS = LT_TIMETICKETS
GOODSMOVEMENTS = LT_GOODMVT
LINK_CONF_GOODSMOV = LT_LINK_CONF
DETAIL_RETURN = LT_DETIAL_RETURN.
CLEAR LW_AFVC.
CLEAR LS_AFVV .
SELECT SINGLE AFVC~APLZL AFVC~AUFPL AFVC~ARBID
INTO CORRESPONDING FIELDS OF LW_AFVC
FROM AFVC INNER JOIN AFKO
ON AFVC~AUFPL = AFKO~AUFPL
WHERE AFKO~AUFNR = GS_RESULT_TAB-AUFNR
AND AFVC~VORNR = GS_RESULT_TAB-VORNR.
*获取时间信息
SELECT SINGLE * FROM AFVV INTO LS_AFVV
WHERE AUFPL = LW_AFVC-AUFPL
AND APLZL = LW_AFVC-APLZL.
LOOP AT LT_TIMETICKETS INTO LS_TIMETICKETS .
*计算报工时间信息
LS_TIMETICKETS-CONF_ACTI_UNIT1 = LS_AFVV-VGE01.
LS_TIMETICKETS-CONF_ACTI_UNIT2 = LS_AFVV-VGE02.
LS_TIMETICKETS-CONF_ACTI_UNIT3 = LS_AFVV-VGE03.
LS_TIMETICKETS-CONF_ACTI_UNIT4 = LS_AFVV-VGE04.
LS_TIMETICKETS-CONF_ACTI_UNIT5 = LS_AFVV-VGE05.
LS_TIMETICKETS-CONF_ACTI_UNIT6 = LS_AFVV-VGE06.
LS_TIMETICKETS-CONF_ACTIVITY1 = LS_TIMETICKETS-YIELD * LS_AFVV-VGW01 / LS_AFVV-BMSCH.
LS_TIMETICKETS-CONF_ACTIVITY2 = LS_TIMETICKETS-YIELD * LS_AFVV-VGW02 / LS_AFVV-BMSCH.
LS_TIMETICKETS-CONF_ACTIVITY3 = LS_TIMETICKETS-YIELD * LS_AFVV-VGW03 / LS_AFVV-BMSCH.
LS_TIMETICKETS-CONF_ACTIVITY4 = LS_TIMETICKETS-YIELD * LS_AFVV-VGW04 / LS_AFVV-BMSCH.
LS_TIMETICKETS-CONF_ACTIVITY5 = LS_TIMETICKETS-YIELD * LS_AFVV-VGW05 / LS_AFVV-BMSCH.
LS_TIMETICKETS-CONF_ACTIVITY6 = LS_TIMETICKETS-YIELD * LS_AFVV-VGW06 / LS_AFVV-BMSCH.
*转换为小时。
* IF LS_TIMETICKETS-CONF_ACTI_UNIT1 EQ 'S' .
* LS_TIMETICKETS-CONF_ACTI_UNIT1 = 'H'.
* LS_TIMETICKETS-CONF_ACTIVITY1 = LS_TIMETICKETS-CONF_ACTIVITY1 / 3600 .
* ENDIF .
* IF LS_TIMETICKETS-CONF_ACTI_UNIT2 EQ 'S' .
* LS_TIMETICKETS-CONF_ACTI_UNIT2 = 'H'.
* LS_TIMETICKETS-CONF_ACTIVITY2 = LS_TIMETICKETS-CONF_ACTIVITY2 / 3600 .
* ENDIF .
* IF LS_TIMETICKETS-CONF_ACTI_UNIT3 EQ 'S' .
* LS_TIMETICKETS-CONF_ACTI_UNIT3 = 'H'.
* LS_TIMETICKETS-CONF_ACTIVITY3 = LS_TIMETICKETS-CONF_ACTIVITY3 / 3600 .
* ENDIF .
* IF LS_TIMETICKETS-CONF_ACTI_UNIT4 EQ 'S' .
* LS_TIMETICKETS-CONF_ACTI_UNIT4 = 'H'.
* LS_TIMETICKETS-CONF_ACTIVITY4 = LS_TIMETICKETS-CONF_ACTIVITY4 / 3600 .
* ENDIF .
* IF LS_TIMETICKETS-CONF_ACTI_UNIT5 EQ 'S' .
* LS_TIMETICKETS-CONF_ACTI_UNIT5 = 'H'.
* LS_TIMETICKETS-CONF_ACTIVITY5 = LS_TIMETICKETS-CONF_ACTIVITY5 / 3600 .
* ENDIF .
* IF LS_TIMETICKETS-CONF_ACTI_UNIT6 EQ 'S' .
* LS_TIMETICKETS-CONF_ACTI_UNIT6 = 'H'.
* LS_TIMETICKETS-CONF_ACTIVITY6 = LS_TIMETICKETS-CONF_ACTIVITY6 / 3600 .
* ENDIF .
MODIFY LT_TIMETICKETS FROM LS_TIMETICKETS .
ENDLOOP .
IF LT_GOODMVT IS NOT INITIAL .
LOOP AT LT_GOODMVT INTO LS_GOODMVT WHERE MOVE_TYPE = '101'.
LS_GOODMVT-STCK_TYPE = 'X' .
APPEND LS_GOODMVT TO LT_GOODMVT_POST .
ENDLOOP .
LOOP AT LT_GOODMVT INTO LS_GOODMVT WHERE MOVE_TYPE = '261'.
*261批次自动确定
PERFORM FRM_CHARG_DETEMINE TABLES LT_GOODMVT_POST USING LS_GOODMVT .
ENDLOOP .
READ TABLE LT_GOODMVT INTO LS_GOODMVT WITH KEY MOVE_TYPE = '101' .
IF SY-SUBRC <> 0 .
LV_POST = 'X' .
ENDIF .
ENDIF .
*调用BAP进行报工。
CLEAR LT_LINK_CONF .
*工单确认与物料凭证行项目关联。
LOOP AT LT_GOODMVT_POST INTO LS_GOODMVT_POST .
LS_LINK_CONF-INDEX_GOODSMOV = SY-TABIX .
LS_LINK_CONF-INDEX_CONFIRM = 1 .
APPEND LS_LINK_CONF TO LT_LINK_CONF .
ENDLOOP .
CLEAR: LS_RETURN.
CLEAR: LT_DETIAL_RETURN.
CALL FUNCTION 'BAPI_PRODORDCONF_CREATE_TT'
EXPORTING
POST_WRONG_ENTRIES = '0'
TESTRUN = ''
IMPORTING
RETURN = LS_RETURN
TABLES
TIMETICKETS = LT_TIMETICKETS
GOODSMOVEMENTS = LT_GOODMVT_POST
LINK_CONF_GOODSMOV = LT_LINK_CONF
DETAIL_RETURN = LT_DETIAL_RETURN.
LOOP AT LT_DETIAL_RETURN INTO LS_DETAIL_RETURN WHERE TYPE CA 'EAX' .
LV_FLAG = 'X'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = LS_DETAIL_RETURN-ID
MSGNR = LS_DETAIL_RETURN-NUMBER
MSGV1 = ' '
MSGV2 = ' '
MSGV3 = ' '
MSGV4 = ' '
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_MESSAGE.
CONCATENATE GS_RESULT_TAB-MESSA LV_MESSAGE INTO GS_RESULT_TAB-MESSA .
ENDLOOP.
IF LV_FLAG IS INITIAL .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'
* IMPORTING
* RETURN =
.
GS_RESULT_TAB-ICONS = ICON_GREEN_LIGHT .
GS_RESULT_TAB-MESSA = '报工成功' .
ELSE .
*回滚。
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
* IMPORTING
* RETURN =
.
GS_RESULT_TAB-ICONS = ICON_RED_LIGHT .
ENDIF .
ENDFORM.
*****************************************************批次自动确定*************************************************************
FORM FRM_CHARG_DETEMINE TABLES LT_GOODMVT_POST STRUCTURE BAPI2017_GM_ITEM_CREATE
USING LS_GOODMVT TYPE BAPI2017_GM_ITEM_CREATE .
DATA:LT_IMSEG TYPE TABLE OF IMSEG,
LS_IMSEG TYPE IMSEG,
LV_RUECK TYPE CO_RUECK,
LV_RMZHL TYPE CO_RMZHL,
LV_NO_DIALOG TYPE XFELD.
DATA:LS_POST TYPE BAPI2017_GM_ITEM_CREATE .
LV_NO_DIALOG = 'X' .
LS_IMSEG-BWART = LS_GOODMVT-MOVE_TYPE .
LS_IMSEG-MATNR = LS_GOODMVT-MATERIAL .
LS_IMSEG-WERKS = LS_GOODMVT-PLANT .
LS_IMSEG-LGORT = LS_GOODMVT-STGE_LOC .
LS_IMSEG-MENGE = LS_GOODMVT-QUANTITY .
LS_IMSEG-ERFMG = LS_GOODMVT-ENTRY_QNT .
LS_IMSEG-RSNUM = LS_GOODMVT-RESERV_NO .
LS_IMSEG-RSPOS = LS_GOODMVT-RES_ITEM .
LS_IMSEG-KZEAR = LS_GOODMVT-WITHDRAWN .
LS_IMSEG-AUFNR = LS_GOODMVT-ORDERID.
LS_IMSEG-ERFME = LS_GOODMVT-ENTRY_UOM .
LS_IMSEG-MEINS = LS_GOODMVT-BASE_UOM .
LS_IMSEG-BDMNG = LS_GOODMVT-QUANTITY .
LS_IMSEG-BDTER = SY-DATUM .
LS_IMSEG-CHARG = LS_GOODMVT-BATCH .
LS_IMSEG-SOBKZ = LS_GOODMVT-SPEC_STOCK.
LS_IMSEG-KDAUF = LS_GOODMVT-SALES_ORD .
LS_IMSEG-KDPOS = LS_GOODMVT-S_ORD_ITEM .
LS_IMSEG-MAT_KDAUF = LS_GOODMVT-SALES_ORD .
LS_IMSEG-MAT_KDPOS = LS_GOODMVT-S_ORD_ITEM .
CLEAR LS_IMSEG-CHARG.
APPEND LS_IMSEG TO LT_IMSEG .
PERFORM BATCH_DETERMINATION IN PROGRAM SAPLCOWB IF FOUND
TABLES LT_IMSEG
USING LV_RUECK
LV_RMZHL
LV_NO_DIALOG
.
BREAK ZWANGGF .
LOOP AT LT_IMSEG INTO LS_IMSEG .
CLEAR LS_POST .
MOVE-CORRESPONDING LS_GOODMVT TO LS_POST .
*批次
LS_POST-BATCH = LS_IMSEG-CHARG .
*数量
LS_POST-QUANTITY = LS_IMSEG-ERFMG .
LS_POST-ENTRY_QNT = LS_IMSEG-ERFMG .
APPEND LS_POST TO LT_GOODMVT_POST .
ENDLOOP .
ENDFORM .
详细说明可参考SDN帖子