采购申请检查并警告提示

77 篇文章 2 订阅
22 篇文章 0 订阅

设置:采购申请检查并警告提示
增强:MEREQ001
EXIT_SAPLMEREQ_005

&---------------------------------------------------------------------
*& 包含 ZXM02U05
&---------------------------------------------------------------------

DATA:BEGIN OF ls_eine,
       matnr TYPE marc-matnr,
       lifnr TYPE a017-lifnr,
       ekorg TYPE a017-ekorg,
       esokz TYPE a017-esokz,
       werks TYPE a017-werks,
       minbm TYPE eine-minbm,
     END OF ls_eine.
DATA:lt_eine LIKE TABLE OF ls_eine.
DATA:lv_minbm TYPE eine-minbm.
DATA:lv_minbmc TYPE string.
DATA:lv_mengec TYPE string.
DATA:lv_mess(200).
DATA:is_mess TYPE bapiret2.
DATA: symsgv      TYPE symsgv.
DATA:lv_mess2(200).
DATA:lv_kc TYPE mard-labst.
DATA:lv_frkrq TYPE sy-datum.
DATA:lv_lrkrq TYPE sy-datum.
DATA:lv_lckrq TYPE sy-datum.
DATA:lw_sl    LIKE mseg-menge.
DATA: BEGIN OF it_mseg OCCURS 0,
        matnr TYPE mseg-matnr,
        werks TYPE mseg-werks,
        mblnr TYPE mseg-mblnr,
        mjahr TYPE mseg-mjahr,
        zeile TYPE mseg-zeile,
        bwart TYPE mseg-bwart,
        menge TYPE mseg-menge,
        meins TYPE mseg-meins,
        ebeln TYPE mseg-ebeln,
        ebelp TYPE mseg-ebelp,
        afnam TYPE ekpo-afnam,
        aufnr TYPE mseg-aufnr,
        budat TYPE mseg-budat_mkpf,
      END OF it_mseg.
DATA:it_mseg_h LIKE TABLE OF it_mseg WITH HEADER LINE.

"1 标准件
"2 取物料对应信息记录的最小订购量
"3 最小订购量为1不检查
"4 存在多个不相同的最小订购量时,不检查
IF sy-tcode = 'ME51N' OR  sy-tcode = 'ME52N' OR sy-tcode = 'ME53N' .
  IF ( ( im_data_new-menge <> im_data_old-menge ) OR  im_data_old IS INITIAL ) AND im_data_new-menge > 0 .
    IF im_data_new-matnr <> '' AND im_data_new-werks <> ''.
      SELECT COUNT(*) FROM mara WHERE matnr = im_data_new-matnr AND zdz = 'N'.
      IF sy-subrc = 0.
        CLEAR :lv_minbm,lv_minbmc,lv_mengec,lv_mess.
        REFRESH:lt_eine.

        SELECT
            a018~matnr
            a018~lifnr
            a018~ekorg
            a018~esokz
            eine~minbm
          INTO CORRESPONDING FIELDS OF TABLE lt_eine
              FROM a018
              JOIN konp ON a018~knumh EQ konp~knumh
              JOIN eina ON eina~matnr EQ a018~matnr
                       AND eina~lifnr EQ a018~lifnr
                       AND eina~loekz EQ ''
              JOIN eine ON eina~infnr EQ eine~infnr
                       AND eine~werks EQ ''
                       AND eine~loekz EQ ''
                       AND eine~ekorg EQ a018~ekorg
                WHERE a018~matnr = im_data_new-matnr
                  AND a018~esokz = im_data_new-pstyp
                  AND a018~kappl = 'M'
                  AND a018~kschl = 'PB00'
                  AND a018~datbi GE sy-datum
                  AND a018~datab LE sy-datum
                  AND konp~kschl = 'PB00'
                  AND konp~kbetr > 0
                  AND konp~loevm_ko = ''.
  •                AND eine~minbm > 1.
    
          SELECT
              a017~matnr
              a017~lifnr
              a017~ekorg
              a017~esokz
              a017~werks
              eine~minbm
            APPENDING CORRESPONDING FIELDS OF TABLE lt_eine
                FROM a017
                JOIN konp ON a017~knumh EQ konp~knumh
                JOIN eina ON eina~matnr EQ a017~matnr
                         AND eina~lifnr EQ a017~lifnr
                         AND eina~loekz EQ ''
                JOIN eine ON eina~infnr EQ eine~infnr
                         AND eine~werks EQ a017~werks
                         AND eine~loekz EQ ''
                         AND eine~ekorg EQ a017~ekorg
                  WHERE a017~matnr = im_data_new-matnr
                    AND a017~werks = im_data_new-werks
                    AND a017~esokz = im_data_new-pstyp
                    AND a017~kappl = 'M'
                    AND a017~kschl = 'PB00'
                    AND a017~datbi GE sy-datum
                    AND a017~datab LE sy-datum
                    AND konp~kschl = 'PB00'
                    AND konp~kbetr > 0
                    AND konp~loevm_ko = ''.
    
  •                AND eine~minbm > 1.
    
          IF lt_eine IS NOT INITIAL.
    
            SORT lt_eine BY lifnr DESCENDING werks DESCENDING. "工厂价格优先级高,去重排除非工厂级价格
            DELETE ADJACENT DUPLICATES FROM lt_eine COMPARING lifnr.
    
            DATA(lines) = lines( lt_eine[] ).
            IF lines > 1.
              READ TABLE lt_eine INTO ls_eine INDEX 1.
              lv_minbm = ls_eine-minbm.
              LOOP AT lt_eine INTO ls_eine.
                IF lv_minbm <> ls_eine-minbm..
                  CLEAR lv_minbm.
                  EXIT.  "说明存在多个最小订购量,不检查
                ENDIF.
              ENDLOOP.
    
            ELSE.
              READ TABLE lt_eine INTO ls_eine INDEX 1.
              lv_minbm = ls_eine-minbm.
            ENDIF.
    
            IF lv_minbm > 1.
              IF lv_minbm > im_data_new-menge.
                lv_minbmc = lv_minbm / 1.
                lv_mengec = im_data_new-menge / 1.
                CONCATENATE '请注意,物料:' im_data_new-matnr '申请数量:' lv_mengec  ' 小于 最小订购量:' lv_minbmc INTO lv_mess SEPARATED BY space.
    
                symsgv = lv_mess.
                CALL METHOD cl_message_mm=>create
                  EXPORTING
                    im_msgid         = 'ZMM'
                    im_msgty         = 'W'
                    im_msgno         = '000'
                    im_msgv1         = symsgv
                    im_force_collect = mmpur_yes
                  EXCEPTIONS
                    OTHERS           = 0.
              ENDIF.
            ENDIF.
          ENDIF.
    
        ENDIF.
      ENDIF.
    ENDIF.
    
    ">360账龄内的数量 > 0,长账龄
    "库龄<360天 ,过去4个月无领料记录且最新入库日期>4个月 ,低周转
    IF im_data_new-matnr <> '' AND im_data_new-werks <> '' AND im_data_old IS INITIAL.
      CLEAR:lv_kc,lw_sl,lv_frkrq,lv_lrkrq,lv_lckrq,lv_mess2.
      SELECT SUM( labst ) INTO lv_kc FROM mard WHERE matnr = im_data_new-matnr AND werks = im_data_new-werks.
      IF lv_kc > 0.
        REFRESH:it_mseg.
        SELECT
            mseg~matnr
            mseg~werks
            mseg~mblnr
            mseg~mjahr
            mseg~zeile
            mseg~bwart
            mseg~menge
            mseg~meins
            mseg~ebeln
            mseg~ebelp
            mseg~aufnr
            mseg~budat_mkpf AS budat
            ekpo~afnam
            INTO CORRESPONDING FIELDS OF TABLE it_mseg
             FROM mseg
             JOIN matdoc AS d ON d~mblnr EQ mseg~mblnr AND d~mjahr EQ mseg~gjahr AND d~zeile EQ mseg~zeile
             LEFT JOIN ekpo ON mseg~ebeln EQ ekpo~ebeln AND mseg~ebelp EQ ekpo~ebelp
             WHERE mseg~matnr EQ im_data_new-matnr
               AND mseg~werks EQ im_data_new-werks
               AND mseg~shkzg = 'S'
               AND mseg~bwart IN ( '101','105','561','531' )
               AND d~cancelled EQ '' .
        IF sy-subrc = 0.
          SORT it_mseg BY budat DESCENDING.
          lw_sl = lv_kc.
          LOOP AT it_mseg.
            IF sy-tabix = 1.
              lv_lrkrq = it_mseg-budat. "最后入库日期
            ENDIF.
            IF it_mseg-menge >= lw_sl.
              lv_frkrq = it_mseg-budat."最早入库日期
              lw_sl = 0.
              EXIT.
            ELSE.
              lw_sl = lw_sl - it_mseg-menge.
              lv_frkrq = it_mseg-budat."最早入库日期
            ENDIF.
          ENDLOOP.
    
          IF sy-datum - lv_frkrq > 360. "长账龄
            CONCATENATE '请注意,物料:' im_data_new-matnr ',当前为长账龄物料' INTO lv_mess2 SEPARATED BY space.
            symsgv = lv_mess.
            CALL METHOD cl_message_mm=>create
              EXPORTING
                im_msgid         = 'ZMM'
                im_msgty         = 'W'
                im_msgno         = '000'
                im_msgv1         = symsgv
                im_force_collect = mmpur_yes
              EXCEPTIONS
                OTHERS           = 0.
          ELSE.
            IF sy-datum - lv_lrkrq > 120.
              REFRESH:it_mseg_h.
              SELECT
                  mseg~matnr
                  mseg~werks
                  mseg~mblnr
                  mseg~mjahr
                  mseg~zeile
                  mseg~bwart
                  mseg~menge
                  mseg~meins
                  mseg~ebeln
                  mseg~ebelp
                  mseg~aufnr
                  mseg~budat_mkpf AS budat
                  ekpo~afnam
                  INTO CORRESPONDING FIELDS OF TABLE it_mseg_h
                   FROM mseg
                   JOIN matdoc AS d ON d~mblnr EQ mseg~mblnr AND d~mjahr EQ mseg~gjahr AND d~zeile EQ mseg~zeile
                   LEFT JOIN ekpo ON mseg~ebeln EQ ekpo~ebeln AND mseg~ebelp EQ ekpo~ebelp
                   WHERE mseg~matnr EQ im_data_new-matnr
                     AND mseg~werks EQ im_data_new-werks
                     AND mseg~shkzg = 'H'
                     AND mseg~bwart IN ( '261','201','Z71','Z73','Z75','Z77','Z79','Z81','Z83' )
                     AND d~cancelled EQ '' .
              IF sy-subrc = 0.
                SORT it_mseg_h BY budat DESCENDING.
                READ TABLE it_mseg_h INDEX 1.
                IF sy-datum - it_mseg_h-budat > 120.
                  CONCATENATE '请注意,物料:' im_data_new-matnr ',当前为低周转物料' INTO lv_mess2 SEPARATED BY space.
                  symsgv = lv_mess.
                  CALL METHOD cl_message_mm=>create
                    EXPORTING
                      im_msgid         = 'ZMM'
                      im_msgty         = 'W'
                      im_msgno         = '000'
                      im_msgv1         = symsgv
                      im_force_collect = mmpur_yes
                    EXCEPTIONS
                      OTHERS           = 0.
                ENDIF.
              ENDIF.
            ENDIF.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
    

    ENDIF.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值