SAP MM库存异动报表

时间:2020-08-03 09:52:12   收藏:0   阅读:82

************************************************************************
*程式代號:ZMMR058
*程式名稱:庫存異動明細查詢(不包含品檢中庫存)
*         -------- -----------------------------------------------------
*         20161130 程式建立                              By Qi
************************************************************************

REPORT zmmr058.

TABLES: marc,mara,mard,mseg,mkpf,mchb,mbew,mardh,t001w .
TYPE-POOLS: slis.

DEFINE fieldcat.
  clear w_fieldcat.
  w_fieldcat-col_pos       = &1.
  w_fieldcat-fieldname     = &2.
  w_fieldcat-seltext_l     = &3.
  w_fieldcat-no_convext    = &4.
  w_fieldcat-key           = &5.
  append w_fieldcat to g_fieldcat.
END-OF-DEFINITION.

DATABEGIN OF itabs,
        shkzg LIKE mseg-shkzg,
        bldat LIKE mkpf-bldat,
        cputm LIKE mkpf-cputm,
        budat LIKE mkpf-budat,
        bwart LIKE mseg-bwart,
        ebeln LIKE mseg-ebeln,
        kdauf LIKE mseg-kdauf,
        aufnr LIKE mseg-aufnr,
        kunnr LIKE mseg-kunnr,
        smbln LIKE mseg-smbln,
        kostl LIKE mseg-kostl,
        mblnr LIKE mkpf-mblnr,
        zeile LIKE mseg-zeile,
        matnr LIKE mseg-matnr,
        lifnr LIKE mseg-lifnr,
        lgort LIKE mseg-lgort,
        charg LIKE mseg-charg,
        menge LIKE mseg-menge,
        meins LIKE mseg-meins,
        sgtxt LIKE mseg-sgtxt,
      END OF  itabs.
DATA: itab  LIKE itabs OCCURS WITH HEADER LINE,
      ritab LIKE itabs OCCURS WITH HEADER LINE.

DATABEGIN OF stabs,
        shkzg LIKE mseg-shkzg,
        bldat LIKE mkpf-bldat,
        cputm LIKE mkpf-cputm,
        budat LIKE mkpf-budat,
        bwart LIKE mseg-bwart,
        ebeln LIKE mseg-ebeln,
        kdauf LIKE mseg-kdauf,
        aufnr LIKE mseg-aufnr,
        kunnr LIKE mseg-kunnr,
        smbln LIKE mseg-smbln,
        kostl LIKE mseg-kostl,
        mblnr LIKE mkpf-mblnr,
        zeile LIKE mseg-zeile,
        matnr LIKE mseg-matnr,
        lifnr LIKE mseg-lifnr,
        lgort LIKE mseg-lgort,
        charg LIKE mseg-charg,
        menge LIKE mseg-menge,
        meins LIKE mseg-meins,
        sgtxt LIKE mseg-sgtxt,
        tqty3 LIKE mseg-menge,
      END OF  stabs.
DATA sitabs LIKE stabs OCCURS WITH HEADER LINE .


DATABEGIN OF riitabs,
        matnr LIKE mchbh-matnr,
        werks LIKE mchbh-werks,
        lfgja LIKE mchbh-lfgja,
        lfmon LIKE mchbh-lfmon,
        lgort LIKE mchbh-lgort,
        charg LIKE mchbh-charg,
        clabs LIKE mchbh-clabs,
      END OF riitabs.

DATA riitab LIKE riitabs OCCURS WITH HEADER LINE .
DATA wriitab LIKE  riitabs.

DATA:  BEGIN OF liitabs,
         matnr LIKE mchb-matnr,
         werks LIKE mchb-werks,
         lgort LIKE mchb-lgort,
         charg LIKE mchb-charg,
       END OF liitabs.
DATA liitab LIKE liitabs OCCURS WITH HEADER LINE.

RANGES: r_budat FOR mkpf-budat .


DATA:smenge     LIKE mseg-meins,
     p_matnr    LIKE mseg-matnr,
     m_text(70TYPE c,
     t_year     TYPE date,
     t_month    TYPE date,
     t_date     TYPE date,
     tqty1      LIKE mseg-menge,
     tqty2      LIKE mseg-menge,
     tqty3      LIKE mseg-menge,
     tqty4      LIKE mseg-menge.


DATA: g_repid    LIKE sy-repid,
      g_fieldcat TYPE slis_t_fieldcat_alv,
      g_layout   TYPE slis_layout_alv,
      g_sort     TYPE slis_t_sortinfo_alv WITH HEADER LINE,
      g_skip(1)  TYPE c.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.

SELECT-OPTIONS: s_matnr FOR mseg-matnr NO INTERVALS NO-EXTENSION OBLIGATORY.
PARAMETERS:     p_werks LIKE mseg-werks.
SELECT-OPTIONS: s_lgort FOR mchb-lgort NO INTERVALS NO-EXTENSION ,
                s_budat FOR mkpf-budat .

SELECTION-SCREEN END OF BLOCK b1.

INITIALIZATION.

START-OF-SELECTION.
  CLEAR:m_text,t_date,r_budat.
  r_budat[] = s_budat[].
  READ TABLE r_budat INDEX .
  IF sy-subrc .
    IF r_budat-low+6(2) <> 01 .
      r_budat-low+6(201 .
      MODIFY r_budat INDEX .
    ENDIF .
  ENDIF .
  p_matnr = s_matnr-low.
  SELECT SINGLE * FROM marc WHERE matnr = p_matnr AND werks = p_werks.
  IF sy-subrc <> 0.
    CONCATENATE p_matnr ‘ Not material exist, check your input !‘
      INTO m_text.
    MESSAGE m_text TYPE ‘I‘.
  ENDIF.
  SELECT SINGLE * FROM mara WHERE matnr = p_matnr AND lvorm ‘X‘.
  IF sy-subrc 0.
    CONCATENATE p_matnr ‘ This material number has been deleted.‘
     INTO m_text.
    MESSAGE m_text TYPE ‘I‘.
  ENDIF.
  PERFORM tamard.
  PERFORM  trrecords.
  PERFORM  amount.
  PERFORM trstolist.
  PERFORM list_data.


*&---------------------------------------------------------------------*
*&      Form  AMOUNT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM amount .
  CLEAR: t_year, t_date .
  t_year = s_budat-low(4).
  t_month = s_budat-low+4(2).
  SELECT *  INTO CORRESPONDING FIELDS OF TABLE riitab
    FROM  mchbh  WHERE matnr = p_matnr  AND werks = p_werks
                       AND lfgja = t_year
                       AND lgort IN  s_lgort
                       AND lfmon < t_month .



ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  TRRECORDS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM trrecords .
  CLEAR: m_text .
  IF s_budat-low+6(201.
    SELECT * INTO CORRESPONDING FIELDS OF TABLE itab  FROM
         mseg INNER JOIN mkpf ON  mseg~mblnr = mkpf~mblnr
         WHERE mseg~matnr = p_matnr AND mkpf~budat >= s_budat-low
         AND mkpf~budat <= s_budat-high
         AND mseg~lgort IN s_lgort
         AND ( mseg~bwart <> ‘321‘ OR ( mseg~bwart ‘321‘ AND mseg~xauto ‘X‘  )   )
         AND  ( mseg~bwart <> ‘322‘  OR ( mseg~bwart ‘322‘ AND mseg~xauto ‘X‘ )  )
         AND mseg~insmk  ‘‘
         .

  ELSE  .
    SELECT * INTO CORRESPONDING FIELDS OF TABLE ritab  FROM
       mseg INNER JOIN mkpf ON  mseg~mblnr = mkpf~mblnr
       WHERE mseg~matnr = p_matnr AND mkpf~budat >= r_budat-low
       AND mkpf~budat < s_budat-low
       AND mseg~lgort IN s_lgort
       AND ( mseg~bwart <> ‘321‘ OR ( mseg~bwart ‘321‘ AND mseg~xauto ‘X‘  )   )
       AND  ( mseg~bwart <> ‘322‘  OR ( mseg~bwart ‘322‘ AND mseg~xauto ‘X‘)  )
       AND mseg~insmk  ‘‘ .

    SELECT * INTO CORRESPONDING FIELDS OF TABLE itab  FROM
       mseg INNER JOIN mkpf ON  mseg~mblnr = mkpf~mblnr
       WHERE mseg~matnr = p_matnr AND mkpf~budat >= s_budat-low
       AND mkpf~budat <= s_budat-high
       AND mseg~lgort IN s_lgort
       AND ( mseg~bwart <> ‘321‘ OR ( mseg~bwart ‘321‘ AND mseg~xauto ‘X‘  )  )
       AND ( mseg~bwart <> ‘322‘ OR ( mseg~bwart ‘322‘ AND mseg~xauto ‘X‘  )  )
       AND mseg~insmk  ‘‘ .


  ENDIF .
  IF sy-subrc <> .
    CONCATENATE p_matnr ‘ This material has no data during this period.‘
  INTO m_text.
    MESSAGE m_text TYPE ‘I‘ .
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  TRSTOLIST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM trstolist .
  CLEAR: tqty1,tqty2,tqty3,tqty4,sitabs .

  SORT riitab BY lfgja lfmon DESCENDING.
  SORT itab by matnr lgort charg budat bldat cputm  .
  LOOP AT liitab .
    READ TABLE riitab WITH KEY lgort = liitab-lgort charg = liitab-charg  .
    IF sy-subrc .
      IF NOT ritab[]  IS INITIAL .
        LOOP AT ritab WHERE matnr = p_matnr AND  lgort = riitab-lgort AND charg = riitab-charg
                   AND   budat  >= r_budat-low  AND budat <  s_budat-low .

            IF ritab-shkzg ‘S‘ .
               tqty1  = tqty1 + ritab-menge .
            ELSE .
                tqty2  = tqty2 + ritab-menge .
            ENDIF.

        ENDLOOP.
            tqty3 = riitab-clabs + tqty1 - tqty2 .

        LOOP AT itab WHERE matnr = p_matnr AND  lgort = riitab-lgort AND charg = riitab-charg
                 AND   budat  >= s_budat-low  AND budat <=  s_budat-high .
          MOVE-CORRESPONDING itab TO sitabs.
          IF sitabs-shkzg ‘S‘ .
            tqty3 = tqty3 + sitabs-menge .
          ELSE .
            tqty3 = tqty3 - sitabs-menge .
            sitabs-menge = sitabs-menge * -.
          ENDIF.
          sitabs-tqty3 = tqty3 .
          APPEND sitabs .

        ENDLOOP.
        CLEAR: tqty1, tqty2 , tqty3.
      ELSE .
        tqty3 = riitab-clabs .
        LOOP AT itab   WHERE matnr = p_matnr AND lgort = riitab-lgort AND charg = riitab-charg
                AND   budat  >= s_budat-low  AND budat <=  s_budat-high .
          MOVE-CORRESPONDING itab TO sitabs.
          IF sitabs-shkzg ‘S‘ .
            tqty3 = tqty3 + sitabs-menge .
          ELSE .
            tqty3 = tqty3 - sitabs-menge .
            sitabs-menge = sitabs-menge * -.
          ENDIF.

          sitabs-tqty3 = tqty3 .
          APPEND sitabs .
        ENDLOOP.
        CLEAR tqty3.
      ENDIF.

    ELSE .
      tqty3 .
      LOOP AT itab   WHERE  matnr = p_matnr AND lgort = liitab-lgort AND charg = liitab-charg
              AND   budat  >= s_budat-low  AND budat <=  s_budat-high .
        MOVE-CORRESPONDING itab TO sitabs.
        IF sitabs-shkzg ‘S‘ .
          tqty3 = tqty3 + sitabs-menge .
        ELSE .
          tqty3 = tqty3 - sitabs-menge .
          sitabs-menge = sitabs-menge * -.
        ENDIF.

        sitabs-tqty3 = tqty3 .
        APPEND sitabs .
      ENDLOOP.
      CLEAR tqty3.
    ENDIF.
  ENDLOOP .
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  TAMARD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM tamard .
  CLEAR m_text .
  SELECT * FROM mchb INTO CORRESPONDING FIELDS OF TABLE liitab WHERE
        matnr IN s_matnr
    AND werks = p_werks.

  IF sy-subrc <> .
    CONCATENATE p_matnr ‘ This material has no location .‘
    INTO m_text.
    MESSAGE m_text TYPE ‘I‘ .
  ENDIF .
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  LIST_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM list_data .
  PERFORM set_alv_layout.
  PERFORM set_alv_fieldcat.
  PERFORM alv_list.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_ALV_LAYOUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_alv_layout .
  g_repid = sy-repid.
  g_layout-colwidth_optimize ‘X‘.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  SET_ALV_FIELDCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_alv_fieldcat .
  DATA: w_fieldcat TYPE slis_fieldcat_alv.
  fieldcat:
    1   ‘BLDAT‘         ‘輸入日期‘(010)               ‘X‘  ‘X‘,
    2   ‘CPUTM‘         ‘時間‘(020)                   ‘ ‘  ‘ ‘,
    3   ‘BUDAT‘         ‘過賬日期‘(030)                   ‘ ‘  ‘ ‘,
    4   ‘BWART‘         ‘異動碼‘(040)               ‘ ‘  ‘ ‘,
    5   ‘EBELN‘        ‘採購單號‘(050)               ‘ ‘  ‘ ‘,
    6    ‘KDAUF‘         ‘銷售訂單號碼‘(060)              ‘ ‘  ‘ ‘,
    7    ‘AUFNR‘         ‘工單‘(070)                   ‘ ‘  ‘ ‘,
    8    ‘KUNNR‘         ‘客戶代碼‘(080)       ‘ ‘  ‘ ‘,
    9    ‘SMBLN‘         ‘回轉物料文件號碼‘(090)              ‘ ‘  ‘ ‘,
    10   ‘KOSTL‘       ‘成本中心‘(100)   ‘X‘  ‘ ‘,
    11   ‘MBLNR‘       ‘目的文件號碼‘(110)   ‘ ‘  ‘ ‘,
    12   ‘ZEILE‘         ‘項次‘(120)       ‘ ‘  ‘ ‘,
    13   ‘MATNR‘         ‘料號‘(130)       ‘ ‘  ‘ ‘,
    14   ‘LIFNR‘          ‘供應商代碼‘(140)                 ‘ ‘ ‘ ‘ ,
    15   ‘LGORT‘          ‘倉庫代碼‘(150)               ‘ ‘ ‘ ‘ ,
    15   ‘CHARG‘          ‘批次‘(150)               ‘ ‘ ‘ ‘ ,
    15   ‘MENGE‘          ‘異動數量‘(150)               ‘ ‘ ‘ ‘ ,
    15   ‘MEINS‘          ‘單位‘(150)               ‘ ‘ ‘ ‘,
    15   ‘SGTXT‘          ‘備註‘(150)               ‘ ‘ ‘ ‘ ,
    15   ‘TQTY3‘          ‘異動后庫存‘(150)               ‘ ‘ ‘ ‘ .
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  ALV_LIST
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM alv_list .

  CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY‘
    EXPORTING
      i_callback_program = g_repid
      is_layout          = g_layout
      it_fieldcat        = g_fieldcat[]
    TABLES
      t_outtab           = sitabs[].

ENDFORM.

原文:https://www.cnblogs.com/coderfarmer/p/13424547.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!