SAP 工单报工批次确定自动带出批次并拆分

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 原帖给与了优化。
优化点:增加了单位转换及一些简单逻辑

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值