此博客为原创博客,都是个人工作经历所得,转载请注明出处

MIGO采购订单收货批次增强


需求: MIGO 做采购订单收货时,化学品物料启用批次管理和产品生命周期的管理,采购收货或其他入库时,需要输入生产日期,根据批次生成规则,自动(或手工输入优先)生成批次号,针对移动类型:101、511、501、309、561、

批次生成规则:生产日期(年2位,月2位,日2位)+ 流水码(4位),按照每天的收货入库进行Check,例如:生产日期为:2020年12月31日,则2021年04月06日,第一次收货入库时的批次为:2012310001,第二次收货入库时,批次为:2012310002,依次类推。


MIGO收货入库增强函数参考:EXIT_SAPLV01Z_002 ;  SMOD: SAPLV01Z;

 

 

 

 

"替换为国瓷条件 --
CHECK sy-mandt = '302' OR sy-mandt = '602' OR sy-mandt = '802'
      OR sy-mandt = '301' OR sy-mandt = '601' OR sy-mandt = '801'.

DATA : lv_prog  LIKE d020s-prog,
       lv_dnum  LIKE d020s-dnum,
       lv_datum TYPE datum,
       lv_dates TYPE datum,
       lv_bklas TYPE bklas,
       lv_atwrt TYPE atwrt,
       lv_atinn TYPE atinn,
       ls_mch1  TYPE ztpp_mch1,
       ls_mch2  TYPE ztpp_mch2,
       it_dyn   TYPE STANDARD TABLE OF dynpread.
DATA:  lv_exit  TYPE c.


IF x_bncom-werks IS INITIAL.
  MESSAGE e027(zpp01) WITH '请输入工厂'. RAISE cancelled.
ENDIF.


PERFORM frm_change_charg IN PROGRAM zmme0003 USING x_bncom CHANGING new_charg lv_exit IF FOUND.
IF lv_exit = abap_true.
  RETURN.
ENDIF.

SELECT SINGLE bklas INTO lv_bklas FROM mbew WHERE matnr = x_bncom-matnr AND bwkey = x_bncom-werks.

*CASE lv_bklas.
*  WHEN '3010'.
CASE lv_bklas+(2).
  WHEN '30'.
    CASE sy-tcode.
      WHEN 'MIGO' .
        lv_prog = 'SAPLMIGO'.
        lv_dnum = '0110'.  

        APPEND VALUE #( fieldname = 'GOHEAD-BUDAT' ) TO it_dyn.
*获取屏幕记账日期
        CALL FUNCTION 'DYNP_VALUES_READ'
          EXPORTING
            dyname               = lv_prog
            dynumb               = lv_dnum
          TABLES
            dynpfields           = it_dyn
          EXCEPTIONS
            invalid_abapworkarea = 1
            invalid_dynprofield  = 2
            invalid_dynproname   = 3
            invalid_dynpronummer = 4
            invalid_request      = 5
            no_fielddescription  = 6
            invalid_parameter    = 7
            undefind_error       = 8
            double_conversion    = 9
            stepl_not_found      = 10
            OTHERS               = 11.
        IF sy-subrc = 0.
          READ TABLE it_dyn INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_dyn>).
          IF sy-subrc = 0.
            IF <fs_dyn>-fieldvalue IS NOT INITIAL.
              CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
                EXPORTING
                  date_external = <fs_dyn>-fieldvalue
                IMPORTING
                  date_internal = lv_datum.
            ELSE.
              lv_datum = sy-datum.
            ENDIF.
          ENDIF.
        ENDIF.
      WHEN 'MSC1N' .
        lv_datum = sy-datum.
      WHEN 'ZPDAxx'.
        DATA(lv_field) = '(SAPLZMM_FG0006)GV_BUDAT'.
        ASSIGN (lv_field) TO FIELD-SYMBOL(<lfs_budat>).
        IF <lfs_budat> IS ASSIGNED.
          lv_datum = <lfs_budat>.
        ELSE.
          lv_datum = sy-datum.
        ENDIF.
    ENDCASE.

    IF NOT lv_datum IS INITIAL.
      SELECT SINGLE * INTO ls_mch1 FROM ztpp_mch1 WHERE datum = lv_datum+2(6).
      IF sy-subrc = 0.
        ls_mch1-msnro = ls_mch1-msnro + 1.
      ELSE.
        ls_mch1-datum = lv_datum+2(6).
        ls_mch1-msnro = '0001'.
      ENDIF.

      CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
        EXPORTING
          date      = lv_datum
          days      = 0
          months    = 2
          signum    = '-'
          years     = 0
        IMPORTING
          calc_date = lv_dates.
      DATA(i_dat_del) = lv_dates+2(6).
      DELETE FROM ztpp_mch1 WHERE datum <= i_dat_del ##WARN_OK.

      MODIFY ztpp_mch1 FROM ls_mch1 ##WARN_OK.
      CONCATENATE ls_mch1-datum ls_mch1-msnro INTO new_charg.
    ELSE.
      CLEAR new_charg.
    ENDIF.
*  WHEN '7010' OR '7020'.   "成品 , 半成品,
  WHEN '70'.   "成品 , 半成品

    CHECK ( x_bncom-werks = '7500' OR x_bncom-werks = '7599' )
         AND ( lv_bklas = '7010' OR lv_bklas = '7020' ).

    CALL FUNCTION 'CONVERSION_EXIT_ATINN_INPUT'
      EXPORTING
        input  = 'LSGC_PRODUCTCODE'
      IMPORTING
        output = lv_atinn.

    SELECT SINGLE atwrt INTO lv_atwrt FROM ausp
      WHERE objek IN (  SELECT cuobj FROM inob WHERE klart = '023' AND objek = x_bncom-matnr AND obtab = 'MARA' )   "CUOBJ
        AND atinn = lv_atinn
        AND mafid = 'O'
        AND klart = '023'.
    IF sy-subrc = 0.
      CONDENSE lv_atwrt NO-GAPS.

      SELECT SINGLE * INTO ls_mch2 FROM ztpp_mch2 WHERE matnr = x_bncom-matnr AND gjahr = sy-datum+2(2).
      IF sy-subrc = 0.
        ls_mch2-msnro = ls_mch2-msnro + 1.
      ELSE.

*成品半成品流水码保留一年
        DATA(nian_tmp) = sy-datum+2(2) - 1.
        SELECT COUNT(*) FROM ztpp_mch2 WHERE matnr = x_bncom-matnr AND gjahr =  nian_tmp .
        IF sy-subrc = 0.
          DELETE ztpp_mch2 FROM ls_mch2.
        ENDIF.

        CLEAR ls_mch2.
        ls_mch2-matnr  = x_bncom-matnr.
        ls_mch2-pdcode = lv_atwrt(2).
        ls_mch2-gjahr  = sy-datum+2(2).
        ls_mch2-msnro  = '00001'.
      ENDIF.

      MODIFY ztpp_mch2 FROM ls_mch2.
      CONCATENATE lv_atwrt(2) sy-datum+2(2) ls_mch2-msnro INTO new_charg.
    ELSE.
      CLEAR new_charg.
    ENDIF.
  WHEN OTHERS.

ENDCASE.
  DATA: lr_werks TYPE RANGE OF aufk-werks,
        lr_xchpf TYPE RANGE OF marc-xchpf,
        lr_bwart TYPE RANGE OF mseg-bwart.
  DATA: lv_prog  LIKE d020s-prog,
        lv_dnum  LIKE d020s-dnum,
        it_dyn   TYPE STANDARD TABLE OF dynpread,
        lv_bwart LIKE mseg-bwart,
        lv_hsdat LIKE mcha-hsdat.

* 条件:工厂(GOITEM-WERKS = P101/P121/P900/P000)+ 化学品物料启用批次管理(MARC-XCHPF = ‘X’),
  SELECT SINGLE * INTO @DATA(ls_ztmm_enhance)
    FROM ztmm_enhance
   WHERE prog = 'ZMME0003_001' AND item = '000001' AND active = 'X'.
  IF sy-subrc NE 0.
    RETURN.
  ELSE.
    "s1.检查工厂
    PERFORM frm_value_split TABLES lr_werks USING ls_ztmm_enhance-value1 .
    IF x_bncom-werks NOT IN lr_werks.
      RETURN.
    ELSE.
      lv_exit = abap_true.
    ENDIF.
    "s2.检查是否启用批次号
    SELECT SINGLE xchpf INTO @DATA(lv_xchpf) FROM marc WHERE matnr = @x_bncom-matnr AND werks = @x_bncom-werks.
    PERFORM frm_xchpf_split TABLES lr_xchpf USING ls_ztmm_enhance-value2 .
    IF lv_xchpf NOT IN lr_xchpf.
      RETURN.
    ENDIF.
    "s3.检查移动类型
    CASE sy-tcode.
      WHEN 'MIGO' .
        lv_prog = 'SAPLMIGO'.
        lv_dnum = '0011'.
        APPEND VALUE #( fieldname = 'GODEFAULT_TV-BWART' ) TO it_dyn.

*获取屏幕抬头移动类型
        CALL FUNCTION 'DYNP_VALUES_READ'
          EXPORTING
            dyname               = lv_prog
            dynumb               = lv_dnum
          TABLES
            dynpfields           = it_dyn
          EXCEPTIONS
            invalid_abapworkarea = 1
            invalid_dynprofield  = 2
            invalid_dynproname   = 3
            invalid_dynpronummer = 4
            invalid_request      = 5
            no_fielddescription  = 6
            invalid_parameter    = 7
            undefind_error       = 8
            double_conversion    = 9
            stepl_not_found      = 10
            OTHERS               = 11.
        IF sy-subrc = 0.
          READ TABLE it_dyn INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_dyn>).
          IF sy-subrc = 0.
            IF <fs_dyn>-fieldvalue IS NOT INITIAL.
              lv_bwart = <fs_dyn>-fieldvalue.
            ENDIF.
          ENDIF.
        ENDIF.
      WHEN 'MSC1N' .
      WHEN 'ZPDAxx'.

      WHEN OTHERS."BAPI 做MIGO
    ENDCASE.

    PERFORM frm_bwart_split TABLES lr_bwart USING ls_ztmm_enhance-value3 .
    IF lv_bwart NOT IN lr_bwart.
      RETURN.
    ENDIF.
  ENDIF.

*  IF x_bncom-hsdat IS INITIAL.
*    MESSAGE e027(zpp01) WITH '请输入工厂'. RAISE cancelled.
*  ENDIF.


**获取屏幕项目生产日期
  CASE sy-tcode.
    WHEN 'MIGO' .
      lv_prog = 'SAPLMIGO'.
      lv_dnum = '0335'.
      CLEAR: it_dyn,it_dyn[].
      APPEND VALUE #( fieldname = 'GOITEM-HSDAT' ) TO it_dyn.

      CALL FUNCTION 'DYNP_VALUES_READ'
        EXPORTING
          dyname               = lv_prog
          dynumb               = lv_dnum
        TABLES
          dynpfields           = it_dyn
        EXCEPTIONS
          invalid_abapworkarea = 1
          invalid_dynprofield  = 2
          invalid_dynproname   = 3
          invalid_dynpronummer = 4
          invalid_request      = 5
          no_fielddescription  = 6
          invalid_parameter    = 7
          undefind_error       = 8
          double_conversion    = 9
          stepl_not_found      = 10
          OTHERS               = 11.
      IF sy-subrc = 0.
        READ TABLE it_dyn INDEX 1 ASSIGNING FIELD-SYMBOL(<fs_dyn_date>).
        IF sy-subrc = 0.
          IF <fs_dyn_date>-fieldvalue IS NOT INITIAL.
            CALL FUNCTION 'CONVERT_DATE_TO_INTERNAL'
              EXPORTING
                date_external = <fs_dyn_date>-fieldvalue
              IMPORTING
                date_internal = lv_hsdat.
          ENDIF.
        ENDIF.
      ENDIF.
    WHEN 'MSC1N' .
    WHEN 'ZPDAxx'.

    WHEN OTHERS."BAPI 做MIGO
  ENDCASE.

  BREAK sapwb0011.
  DATA: lv_lsm TYPE numc4.
  IF lv_hsdat IS NOT INITIAL.
    "MCHB
    SELECT MAX( charg )
          FROM mchb
         WHERE matnr = @x_bncom-matnr
           AND werks = @x_bncom-werks
           AND substring( charg,1,6 ) = @lv_hsdat+2(6)
          INTO @DATA(lv_charg).
    IF sy-subrc EQ 0.
      lv_lsm = lv_charg+6(4).
      lv_lsm = lv_lsm + 1.
    ELSE.
      lv_lsm = '0001'."改为4位流水码
    ENDIF.
    CONCATENATE lv_hsdat+2(6) lv_lsm INTO new_charg.
  ENDIF.

 

posted @ 2021-05-15 13:12  Rainystuday  阅读(1246)  评论(0编辑  收藏  举报