SAP 工单报工批次确定自动带出批次并拆分
业务使用注意点:因为批次自动先进先出了,所以当该库存在不良批次时,一定要及时将不良批次调拨离该库位,否则系统就认为该批次可用。
SAP 生产工单报工货物移动界面,点击批次确定,自动分配批次并根据批次数量按照先进先出进行拆分。
1.依旧使用‘批次确认’按钮。
2.在批次确认的逻辑里增强
第一步增强:设置批次取数逻辑
程序 LCOWBFC1 call_batch_determination 这个FORM结尾的地方
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""$"$\SE:(1) Form CALL_BATCH_DETERMINATION, End A
*$*$-Start: (1)---------------------------------------------------------------------------------$*$*
ENHANCEMENT 1 ZPPEH_004. "active version
********报工自动进行批次分配**************
"循环内表处理
DATA:LV_IND_ST TYPE I.
DATA:LV_IND_TO_TABLE TYPE I.
DATA:LV_IND_FOR_START_SORT TYPE I.
DATA:LV_G_LAST_ENTRIES TYPE I.
DATA:LV_ERFMG TYPE MB_ERFMG."剩余需求数量
DATA:LV_FLAG TYPE C.
DATA: LV_MATNR TYPE MARA-MATNR,
LV_IN_MEINS TYPE MARA-MEINS,
LV_OUT_MEINS TYPE MARA-MEINS,
LV_IN_VALUE TYPE MENGE_D,
LV_OUT_VALUE TYPE MENGE_D.
TYPES: BEGIN OF VS_MCHB,
MATNR TYPE MCHB-MATNR,
WERKS TYPE MCHB-WERKS,
LGORT TYPE MCHB-LGORT,
CHARG TYPE MCHB-CHARG,
CLABS TYPE MCHB-CLABS,
MEINS TYPE MARA-MEINS,
END OF VS_MCHB.
DATA:VT_MCHB TYPE TABLE OF VS_MCHB WITH HEADER LINE.
CLEAR:VT_MCHB[],VT_MCHB,LV_ERFMG."情况临时变量\
IF SY-TCODE = 'CO11N'.
*******************最后一次消耗自动补齐未提货量*******************************
DATA GT_COMP1 like table of GT_COMP WITH HEADER LINE.
LOOP AT GT_COMP.
if GT_COMP-lgort+0(1) <> 4.
MESSAGE '请填写线边仓' TYPE 'E'.
ELSE.
MOVE GT_COMP[] TO GT_COMP1[].
SORT GT_COMP1 BY RSPOS.
DELETE GT_COMP1 WHERE RSPOS <> GT_COMP-RSPOS.
DESCRIBE TABLE GT_COMP1 LINES DATA(LV_LINES).
IF LV_LINES > 1.
ELSE.
IF GT_COMP-ENDKZ = 'X'.
GT_COMP-ERFMG = GT_COMP-BDMNG - GT_COMP-ENMNG.
GT_COMP-ERFME = GT_COMP-MEINS.
MODIFY GT_COMP.
ENDIF.
ENDIF.
CLEAR GT_COMP.
ENDIF.
ENDLOOP.
*******************最后一次消耗自动补齐未提货量*******************************
SORT GT_COMP BY MATNR ASCENDING.
LOOP AT GT_COMP.
GT_COMP-MARK = 'X'.
GT_COMP-CHARG = ''.
IF GT_COMP-ERFME <> GT_COMP-MEINS.
*报工消耗数量转换成基本单位数量
LV_MATNR = GT_COMP-MATNR.
LV_IN_MEINS = GT_COMP-ERFME.
LV_OUT_MEINS = GT_COMP-MEINS.
LV_IN_VALUE = GT_COMP-ERFMG.
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
I_MATNR = LV_MATNR
I_IN_ME = LV_IN_MEINS
I_OUT_ME = LV_OUT_MEINS
I_MENGE = LV_IN_VALUE
IMPORTING
E_MENGE = LV_OUT_VALUE
EXCEPTIONS
ERROR_IN_APPLICATION = 1
ERROR = 2
OTHERS = 3.
GT_COMP-ERFMG = LV_OUT_VALUE.
*需求数量转换成基本单位数量
LV_MATNR = GT_COMP-MATNR.
LV_IN_MEINS = GT_COMP-ERFME.
LV_OUT_MEINS = GT_COMP-MEINS.
LV_IN_VALUE = GT_COMP-MENGE.
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
I_MATNR = LV_MATNR
I_IN_ME = LV_IN_MEINS
I_OUT_ME = LV_OUT_MEINS
I_MENGE = LV_IN_VALUE
IMPORTING
E_MENGE = LV_OUT_VALUE
EXCEPTIONS
ERROR_IN_APPLICATION = 1
ERROR = 2
OTHERS = 3.
GT_COMP-MENGE = LV_OUT_VALUE.
GT_COMP-ERFME = LV_OUT_MEINS.
ENDIF.
IF GT_COMP-ERFMG = '0'.
DELETE GT_CONTROL_TAB WHERE ind_to_table = GT_COMP-IND_ST .
DELETE GT_COMP.
ELSE.
LV_IND_ST = LV_IND_ST + 1.
GT_COMP-IND_ST = LV_IND_ST.
MODIFY GT_COMP.
* MODIFY GT_CONTROL_TAB.
ENDIF.
CLEAR GT_COMP.
ENDLOOP.
DESCRIBE TABLE GT_CONTROL_TAB LINES LV_IND_FOR_START_SORT.
LV_IND_TO_TABLE = LV_IND_FOR_START_SORT.
LOOP AT GT_CONTROL_TAB.
IF LV_IND_FOR_START_SORT > 0.
GT_CONTROL_TAB-IND_FOR_START_SORT = LV_IND_FOR_START_SORT.
GT_CONTROL_TAB-IND_TO_TABLE = LV_IND_TO_TABLE.
MoDIFY GT_CONTROL_TAB.
ENDIF.
LV_IND_FOR_START_SORT = LV_IND_FOR_START_SORT - 1.
LV_IND_TO_TABLE = LV_IND_TO_TABLE - 1.
ENDLOOP.
CLEAR:LV_IND_ST.
SORT GT_COMP by MATNR WERKS LGORT.
DATA: LV_MATNR1 LIKE MSEG-MATNR,
LV_WERKS1 LIKE MSEG-WERKS,
LV_LGORT1 LIKE MSEG-LGORT.
LOOP AT GT_COMP." WHERE MARK = 'X'.
IF GT_COMP-MATNR = LV_MATNR1
AND GT_COMP-WERKS = LV_WERKS1
AND GT_COMP-LGORT = LV_LGORT1.
ELSE.
LV_FLAG = 'X'.
CLEAR:VT_MCHB[].
ENDIF.
LV_ERFMG = GT_COMP-ERFMG."将数量存入变量,后续判断使用
IF GT_COMP-MARK EQ 'X' AND GT_COMP-LGORT IS NOT INITIAL
AND GT_COMP-WERKS IS NOT INITIAL AND gt_comp-ERFMG > 0 .
IF LV_FLAG = 'X'.
SELECT MCHB~MATNR MCHB~WERKS MCHB~LGORT MCHB~CHARG MCHB~CLABS MARA~MEINS
INTO CORRESPONDING FIELDS OF TABLE VT_MCHB
FROM MCHB
LEFT JOIN MARA ON MCHB~MATNR = MARA~MATNR
WHERE MCHB~MATNR = GT_COMP-MATNR
AND MCHB~WERKS = GT_COMP-WERKS
AND MCHB~LGORT = GT_COMP-LGORT
AND MCHB~LVORM = ''
AND MCHB~CLABS <> 0.
SORT VT_MCHB BY CHARG ASCENDING.
ENDIF.
LOOP AT VT_MCHB WHERE CLABS <> 0.
IF LV_ERFMG > 0."判断是否数量已满足
IF VT_MCHB-CLABS >= LV_ERFMG."如果批次数量>剩余需求数量,也就是该批次可以满足需求数量
GT_COMP-CHARG = VT_MCHB-CHARG."则填写该批次
VT_MCHB-CLABS = VT_MCHB-CLABS - LV_ERFMG."更新该批次剩余数量
LV_ERFMG = '0'."剩余需求量更新为0
ELSE."该批次数量不足,使用全部本批次,不足数量循环下一批,并插入行
GT_COMP-CHARG = VT_MCHB-CHARG."则填写该批次
GT_COMP-ERFMG = VT_MCHB-CLABS."修改本次循环的需求数量
VT_MCHB-CLABS = VT_MCHB-CLABS - LV_ERFMG."更新批次剩余数量
IF VT_MCHB-CLABS < 0."如果批次量小于0
VT_MCHB-CLABS = '0'."如果更新剩余批次量为0
ENDIF.
LV_ERFMG = LV_ERFMG - GT_COMP-ERFMG."更新剩余需求量
INSERT GT_COMP.
CLEAR:GT_COMP-CHARG.
GT_COMP-ERFMG = LV_ERFMG. "更新需求量为剩余需求量
SORT GT_CONTROL_TAB BY ind_to_table DESCENDING.
READ TABLE GT_CONTROL_TAB INDEX 1.
MOVE:
GT_CONTROL_TAB-IND_TO_TABLE TO LV_G_LAST_ENTRIES,
GT_CONTROL_TAB-IND_TO_TABLE TO LV_IND_TO_TABLE,
GT_CONTROL_TAB-IND_TO_TABLE TO LV_IND_FOR_START_SORT,
GT_CONTROL_TAB-IND_TO_TABLE TO LV_IND_ST.
LV_G_LAST_ENTRIES = LV_G_LAST_ENTRIES + 1 .
LV_IND_TO_TABLE = LV_IND_TO_TABLE + 1.
LV_IND_FOR_START_SORT = LV_IND_FOR_START_SORT + 1.
LV_IND_ST = LV_IND_ST + 1.
G_LAST_ENTRIES = LV_G_LAST_ENTRIES .
GT_CONTROL_TAB-IND_TO_TABLE = LV_IND_TO_TABLE.
GT_CONTROL_TAB-IND_FOR_START_SORT = LV_IND_FOR_START_SORT .
GT_COMP-IND_ST = LV_IND_ST .
MODIFY GT_COMP.
APPEND GT_CONTROL_TAB.
ENDIF.
MODIFY VT_MCHB .
MODIFY GT_COMP.
ELSE.
EXIT.
ENDIF.
ENDLOOP.
ENDIF.
MODIFY GT_COMP.
CLEAR VT_MCHB.
CLEAR:LV_FLAG.
MOVE GT_COMP-MATNR TO LV_MATNR1.
MOVE GT_COMP-WERKS TO LV_WERKS1.
MOVE GT_COMP-LGORT TO LV_LGORT1.
ENDLOOP.
ENDIF.
LOOP AT GT_COMP.
IF GT_COMP-CHARG IS INITIAL.
MOVE 'ZZZZZZZZZZ' TO GT_COMP-CHARG.
MODIFY GT_COMP.
ENDIF.
ENDLOOP.
SORT GT_COMP BY MATNR CHARG.
LV_G_LAST_ENTRIES = 0.
LV_IND_TO_TABLE = 0.
LV_IND_FOR_START_SORT = 0.
LV_IND_ST = 0.
CLEAR:GT_CONTROL_TAB[].
LOOP AT GT_COMP.
LV_G_LAST_ENTRIES = LV_G_LAST_ENTRIES + 1 .
LV_IND_TO_TABLE = LV_IND_TO_TABLE + 1.
LV_IND_FOR_START_SORT = LV_IND_FOR_START_SORT + 1.
LV_IND_ST = LV_IND_ST + 1.
G_LAST_ENTRIES = LV_G_LAST_ENTRIES .
GT_CONTROL_TAB-IND_TO_TABLE = LV_IND_TO_TABLE.
GT_CONTROL_TAB-IND_FOR_START_SORT = LV_IND_FOR_START_SORT .
GT_COMP-IND_ST = LV_IND_ST .
IF GT_COMP-CHARG = 'ZZZZZZZZZZ'.
MOVE '' TO GT_COMP-CHARG.
MODIFY GT_COMP.
ENDIF.
IF GT_COMP-MSGTY = 'E' AND GT_COMP-MSGNO = '362' .
GT_COMP-ERFMG = GT_COMP-ERFMG - GT_COMP-msgv2.
MODIFY GT_COMP.
ENDIF.
MODIFY GT_COMP.
APPEND GT_CONTROL_TAB.
CLEAR: GT_COMP,GT_CONTROL_TAB.
ENDLOOP.
SORT GT_CONTROL_TAB BY ind_to_table.
* SORT GT_COMP BY MATNR CHARG.
*
* GV_LINE = 0.
* LOOP AT GT_COMP.
* GV_LINE = GV_LINE + 1.
* GT_COMP-ind_st = GV_LINE .
* MODIFY GT_COMP.
* CLEAR GT_COMP.
* ENDLOOP.
MESSAGE '批次确认执行成功,若未分配,请检查指定地点库存是否足够!' type 'S'.
ENDENHANCEMENT.
*$*$-End: (1)---------------------------------------------------------------------------------$*$*
ENDFORM. " CALL_BATCH_DETERMINATION
第二步增强:屏蔽批次确定下一屏幕
程序 LV01FFD0 dialog 这个FORM最开始
ENHANCEMENT 1 ZPPEH_004,. "active version
IF SY-TCODE = 'CO11N'.
no_dialog = 'X'.
ENDIF.
ENDENHANCEMENT.
基于:https://www.cnblogs.com/sapSB/p/6023711.html 原帖给与了优化。
优化点:增加了单位转换及一些简单逻辑