Monday, June 24, 2013

Material Aging Report

*&---------------------------------------------------------------------*
*& Report  ZFI_MATERIAL_AGE
*&---------------------------------------------------------------------*
*& Created By   : Pampaniya Rakesh
*& Requested By :
*& Date         : 24.06.2013
*& TCode        : ZMC46
*& Description  : Material Aging Report
*&---------------------------------------------------------------------*
report ZINVTRY_AGING.
*&---------------------------------------------------------------------*
*& Type-Pool Declaration
*&---------------------------------------------------------------------*
type-poolsslis.
*&---------------------------------------------------------------------*
*& ALV Data Declaration
*&---------------------------------------------------------------------*
datait_fieldcat            type slis_t_fieldcat_alv.
datawa_fieldcat            like line of it_fieldcat.
datat_list_top_of_page     type slis_t_listheader.
datait_events              type slis_t_event with header line.
datag_save                 type value 'A'.
datagt_sort type slis_t_sortinfo_alv.
datagx_save                type value 'A'.
datagx_variant             type disvariant.
datag_variant              type disvariant.
datags_layout              type slis_layout_alv.
datat_formname_top_of_page type slis_formname value 'TOP_OF_PAGE'.
datat_i_event              type slis_alv_event.
*&---------------------------------------------------------------------*
*& External Table Declaration                                          *
*&---------------------------------------------------------------------*
tables mchbh,mchb,mseg.
*&---------------------------------------------------------------------*
*& Internal Table Declaration                                          *
*&---------------------------------------------------------------------*
types begin of ty_mchbh,
          matnr type mchbh-matnr,
          werks type mchbh-werks,
          lgort type mchbh-lgort,
          charg type mchbh-charg,
          lfgja type mchbh-lfgja,
          lfmon type mchbh-lfmon,
          clabs type mchbh-clabs,
          cumlm type mchbh-cumlm,
          cinsm type mchbh-cinsm,
          ceinm type mchbh-ceinm,
          cspem type mchbh-cspem,
          cretm type mchbh-cretm,
          mtart type mara-mtart,
          maktx type makt-maktx,
          budat type mkpf-budat,
          price type mbewh-verpr,
          value type wtgxxx,
          flag(1type c,
        end of ty_mchbh.

types begin of ty_mchb,
          matnr type mchbh-matnr,
          werks type mchbh-werks,
          lgort type mchbh-lgort,
          charg type mchbh-charg,
          lfgja type mchbh-lfgja,
          lfmon type mchbh-lfmon,
          clabs type mchbh-clabs,
          cumlm type mchbh-cumlm,
          cinsm type mchbh-cinsm,
          ceinm type mchbh-ceinm,
          cspem type mchbh-cspem,
          cretm type mchbh-cretm,
        end of ty_mchb.

types begin of ty_matnr,
          matnr type mara-matnr,
          mtart type mara-mtart,
          flag(1type c,
        end of ty_matnr.

types begin of ty_mbewh,
          matnr type mbewh-matnr,
          lfgja type mbewh-lfgja,
          lfmon type mbewh-lfmon,
          lbkum type mbewh-lbkum,
          salk3 type mbewh-salk3,
          vprsv type mbewh-vprsv,
          verpr type mbewh-verpr,
          stprs type mbewh-stprs,
        end of ty_mbewh.

types begin of ty_final,
          matnr type mchbh-matnr,
          werks type mchbh-werks,
          lgort type mchbh-lgort,
          charg type mchbh-charg,
          salk3 type mbewh-salk3,
          meins type mara-meins,
          nodue type wtgxxx,
          day_0_30 type wtgxxx,
          day_31_60 type wtgxxx,
          day_61_90 type wtgxxx,
          day_91_120 type wtgxxx,
          day_121_180 type wtgxxx,
          day_181_270 type wtgxxx,
          day_271_365 type wtgxxx,
          day_m_365 type wtgxxx,
          total type wtgxxx,
          maktx type makt-maktx,
          mtart type mara-mtart,
          clabs type mchbh-clabs,
          price type mbewh-verpr,
          budat type mkpf-budat,
        end of ty_final.

types begin of ty_month,
         matnr type mchbh-matnr,
         werks type mchbh-werks,
         lgort type mchbh-lgort,
         charg type mchbh-charg,
         lfmon type mchbh-lfmon,
         lfgja type mchbh-lfgja,
         clabs type mchbh-clabs,
         cinsm type mchbh-cinsm,
         cspem type mchbh-cspem,
         ceinm type mchbh-ceinm,
         cretm type mchbh-cretm,
        end of ty_month.

data it_mchbh type table of ty_mchbh,
       wa_mchbh type ty_mchbh,
       it_mchbh1 type table of ty_mchbh,
       wa_mchbh1 type ty_mchbh,
       it_mchbh2 type table of ty_mchbh,
       wa_mchbh2 type ty_mchbh,
       it_mchb type table of ty_mchb,
       wa_mchb type ty_mchb,
       it_mchb1 type table of ty_mchb,
       wa_mchb1 type ty_mchb,
       it_matnr type table of ty_matnr,
       wa_matnr type ty_matnr,
       it_mbewh type table of ty_mbewh,
       wa_mbewh type ty_mbewh,
       it_mbewh1 type table of ty_mbewh,
       wa_mbewh1 type ty_mbewh,
       it_mbew type table of ty_mbewh,
       wa_mbew type ty_mbewh,
       it_mbew1 type table of ty_mbewh,
       wa_mbew1 type ty_mbewh,
       it_mbew2 type table of ty_mbewh,
       wa_mbew2 type ty_mbewh,
       it_final type table of ty_final,
       wa_final type ty_final,
       it_month type table of ty_month,
       wa_month type ty_month.
*&---------------------------------------------------------------------*
*& Variables Declaration                                               *
*&---------------------------------------------------------------------*
data mblnr type mseg-mblnr.
data p_date1 type char10"sy-datum.
data p_date type sy-datum.
data month like t009b-bumon.
data year like t009b-bdatj.
data days like t009b-butag.
data wd0 type sy-datum,
       wd30 type sy-datum,
       wd31 type sy-datum,
       wd60 type sy-datum,
       wd61 type sy-datum,
       wd90 type sy-datum,
       wd91 type sy-datum,
       wd120 type sy-datum,
       wd121 type sy-datum,
       wd180 type sy-datum,
       wd181 type sy-datum,
       wd270 type sy-datum,
       wd271 type sy-datum,
       wd365 type sy-datum,
       wd15 type sy-datum,
       wd16 type sy-datum,
       wd17 type sy-datum,
       wd18 type sy-datum.
data x1 type mchbh-lfmon.
data lfmon type mchbh-lfmon.
data v_name2 type t001w-name2.
*&---------------------------------------------------------------------*
*& Selection-screen                                                    *
*&---------------------------------------------------------------------*
selection-screen begin of block blk1 with frame title text-t01.
selection-screen begin of block var with frame title variant.
  parameters spmon type spmon obligatory.
  select-options s_werks for mchbh-werks obligatory.
  select-options s_matnr for mchbh-matnr.
   "" obligatory.
  select-options s_lgort for mchbh-lgort.
  select-options s_charg for mchbh-charg.
  selection-screen skip.
  parameters     r1 radiobutton group rb,
                   r2 radiobutton group rb.
  selection-screen end of block var.
selection-screen end   of block blk1.
*&---------------------------------------------------------------------*
*& At Selection Screen                                                 *
*&---------------------------------------------------------------------*
at selection-screen.
*&---------------------------------------------------------------------*
*& Initialization Event                                                *
*&---------------------------------------------------------------------*
initialization.
*&---------------------------------------------------------------------*
*& Start of Selection Event                                            *
*&---------------------------------------------------------------------*
start-of-selection.
  perform get_data.
  perform get_com_dtl.
  BREAK 10115.
  if it_mchbh[] is not initial.
    perform alv_fieldcat.
    perform get_events.
    perform sub_comment_build using t_list_top_of_page.
    perform alv_display.
  else.
    message 'No Data Found' type 'I'.
  endif.
*&---------------------------------------------------------------------*
*&      Form  GET_DATA
*&---------------------------------------------------------------------*
form get_data.
  break 10115.
  select matnr mtart
    from mara
    into corresponding fields of table it_matnr
   where matnr in s_matnr.
*     and mtart in ('ROH','VERP','ZERP','HALB','FERT','ZERT','HAWA').
  if sy-subrc 0.
    sort it_matnr by matnr.
    delete adjacent duplicates from it_matnr comparing matnr.
  endif.
  if it_matnr is not initial.
    select matnr werks lgort charg lfgja
           lfmon clabs cumlm cinsm ceinm
           cspem cretm
      from mchbh
      into corresponding fields of table it_mchbh2
       for all entries in it_matnr
     where matnr it_matnr-matnr
       and werks in s_werks
       and lgort in s_lgort.
  endif.
  sort it_mchbh2 by matnr werks lgort charg lfgja lfmon.
  delete adjacent duplicates from it_mchbh2
         comparing matnr werks lgort charg"lfgja lfmon.
  if s_charg[] is not initial.
    delete it_mchbh2 where charg not in s_charg.
  endif.
  if it_matnr[] is not initial.
    select matnr werks lgort charg lfgja
           lfmon clabs cumlm cinsm ceinm
           cspem cretm
      from mchbh
      into corresponding fields of table it_mchbh
       for all entries in it_matnr
     where matnr it_matnr-matnr
       and werks in s_werks
       and lgort in s_lgort
       and charg in s_charg
       and lfgja spmon+0(4)
       and lfmon spmon+4(2).

    select matnr werks lgort charg lfgja
           lfmon clabs cumlm cinsm ceinm
           cspem cretm
      from mchb
      into corresponding fields of table it_mchb
       for all entries in it_matnr
     where matnr it_matnr-matnr
       and werks in s_werks
       and lgort in s_lgort
       and charg in s_charg.
  endif.
  sort it_mchbh by matnr werks lgort charg lfgja lfmon.
  delete adjacent duplicates from it_mchbh
         comparing matnr werks lgort charg lfgja lfmon.

  sort it_mchb by matnr werks lgort charg lfgja lfmon.
  delete adjacent duplicates from it_mchb
         comparing matnr werks lgort charg lfgja lfmon.
*****
  loop at it_mchbh2 into wa_mchbh2.
    read table it_mchbh into wa_mchbh
                        with key matnr wa_mchbh2-matnr
                                 werks wa_mchbh2-werks
                                 lgort wa_mchbh2-lgort
                                 charg wa_mchbh2-charg.
    if sy-subrc eq 0.
      wa_mchbh2-flag 'X'.
    endif.
    modify it_mchbh2 from wa_mchbh2.
    clear wa_mchbh2.
  endloop.
  delete it_mchbh2 where flag 'X'.
****
  break 10115.
  if it_mchbh2[] is not initial.
    loop at it_mchbh2 into wa_mchbh2.
      wa_mchbh2-lfgja '0000'.
      wa_mchbh2-lfmon '00'.
      wa_mchbh2-clabs 0.
      wa_mchbh2-cinsm 0.
      wa_mchbh2-cumlm 0.
      wa_mchbh2-cspem 0.
      wa_mchbh2-ceinm 0.
      wa_mchbh2-cretm 0.
      modify it_mchbh2 from wa_mchbh2.
      clear wa_mchbh2.
    endloop.
  endif.
*****
  break 10115.
  if it_mchbh2[] is not initial.
    loop at it_mchbh2 into wa_mchbh2.
      wa_month-matnr wa_mchbh2-matnr.
      wa_month-werks wa_mchbh2-werks.
      wa_month-lgort wa_mchbh2-lgort.
      wa_month-charg wa_mchbh2-charg.
****For Min Month And Year

      select single minlfgja )
        from mchbh
        into wa_month-lfgja
       where matnr wa_month-matnr
         and werks wa_month-werks
         and lgort wa_month-lgort
         and charg wa_month-charg
         and lfgja => spmon+0(4).

      if wa_month-lfgja spmon+0(4).
        select single minlfmon )
          from mchbh
          into wa_month-lfmon
         where matnr wa_month-matnr
           and werks wa_month-werks
           and lgort wa_month-lgort
           and charg wa_month-charg
           and lfgja wa_month-lfgja
           and lfmon => spmon+4(2).
      endif.
      if wa_month-lfmon < spmon+4(2).
        select single minlfgja )
          from mchbh
          into wa_month-lfgja
         where matnr wa_month-matnr
           and werks wa_month-werks
           and lgort wa_month-lgort
           and charg wa_month-charg
           and lfgja > spmon+0(4).
      endif.
      if wa_month-lfgja > spmon+0(4).
        select single minlfmon )
          from mchbh
          into wa_month-lfmon
         where matnr wa_month-matnr
           and werks wa_month-werks
           and lgort wa_month-lgort
           and charg wa_month-charg
           and lfgja wa_month-lfgja.
      endif.

****For Qty.
      select single clabs cinsm cspem ceinm cretm
        from mchbh
        into (wa_month-clabs,wa_month-cinsm,
              wa_month-cspem,wa_month-ceinm,
              wa_month-cretm)
       where matnr wa_month-matnr
         and werks wa_month-werks
         and lgort wa_month-lgort
         and charg wa_month-charg
         and lfgja wa_month-lfgja
         and lfmon wa_month-lfmon.
      if sy-subrc ne 0.
        select single lfgja lfmon clabs cinsm
                      cspem ceinm cretm
          from mchb
          into (wa_month-lfgja,wa_month-lfmon,wa_month-clabs,
                wa_month-cinsm,wa_month-cspem,wa_month-ceinm,
                wa_month-cretm)
         where matnr wa_month-matnr
           and werks wa_month-werks
           and lgort wa_month-lgort
           and charg wa_month-charg.
      endif.

      append wa_month to it_month.
      clear wa_month,lfmon.
    endloop.
  endif.
  sort it_month by matnr werks lgort charg lfgja lfmon.
  delete adjacent duplicates from it_month
         comparing matnr werks lgort charg.
  loop at it_month into wa_month.
    move-corresponding wa_month to wa_mchbh.
    append wa_mchbh to it_mchbh.
    clear wa_mchbh.
  endloop.
****
  if it_mchbh[] is not initial.
    select matnr lfgja lfmon lbkum
           salk3 vprsv verpr stprs
      from mbewh
      into corresponding fields of table it_mbewh
       for all entries in it_mchbh
     where matnr it_mchbh-matnr
       and lfmon spmon+4(2)
       and lfgja spmon+0(4)
       and bwkey it_mchbh-werks.

    select matnr lfgja lfmon lbkum
           salk3 vprsv verpr stprs
      from mbew
      into corresponding fields of table it_mbew
       for all entries in it_mchbh
     where matnr it_mchbh-matnr
       and lfmon spmon+4(2)
       and lfgja spmon+0(4)
       and bwkey it_mchbh-werks.
  endif.

  loop at it_mchbh into wa_mchbh.
    read table it_matnr into wa_matnr
               with key matnr wa_mchbh-matnr.
    if sy-subrc 0.
      wa_mchbh-mtart wa_matnr-mtart.
    endif.

    select single maktx
      from makt
      into wa_mchbh-maktx
     where matnr wa_mchbh-matnr.

    if wa_mchbh-mtart 'ROH' or
       wa_mchbh-mtart 'VERP' or
       wa_mchbh-mtart 'ZERP'.
      select single a~lwedt
        into wa_mchbh-budat
        from mch1 as a
       inner join mcha as b
          on a~matnr b~matnr
         and a~charg b~charg
       where a~matnr wa_mchbh-matnr
         and a~charg wa_mchbh-charg
         and a~lvorm space
         and b~werks wa_mchbh-werks.
    elseif wa_mchbh-mtart 'HALB' or
           wa_mchbh-mtart 'FERT' or
           wa_mchbh-mtart 'ZERT' or
           wa_mchbh-mtart 'HAWA'.
      select single a~hsdat
        into wa_mchbh-budat
        from mch1 as a
       inner join mcha as b
          on a~matnr b~matnr
         and a~charg b~charg
       where a~matnr wa_mchbh-matnr
         and a~charg wa_mchbh-charg
         and a~lvorm space
         and b~werks wa_mchbh-werks.
    endif.

    read table it_mbewh into wa_mbewh
                        with key matnr wa_mchbh-matnr.
    if sy-subrc 0.
      if wa_mchbh-mtart 'ROH' or
         wa_mchbh-mtart 'VERP' or
         wa_mchbh-mtart 'ZERP'.
        wa_mchbh-price wa_mbewh-verpr.
        wa_mchbh-value wa_mchbh-clabs + wa_mchbh-cinsm +
                           wa_mchbh-cspem + wa_mchbh-ceinm +
                           wa_mchbh-cretm )
                           * wa_mchbh-price.
      elseif wa_mchbh-mtart 'HALB' or
             wa_mchbh-mtart 'FERT' or
             wa_mchbh-mtart 'ZERT' or
             wa_mchbh-mtart 'HAWA'..
        wa_mchbh-price wa_mbewh-stprs.
        wa_mchbh-value wa_mchbh-clabs + wa_mchbh-cinsm +
                           wa_mchbh-cspem + wa_mchbh-ceinm +
                           wa_mchbh-cretm )
                           * wa_mchbh-price.
      endif.
    endif.

    modify it_mchbh from wa_mchbh.
    clear wa_mchbh.
  endloop.
*****
  break abapdev2.
  loop at it_mchbh into wa_mchbh where price eq 0.
****For Min Year For Price
    if wa_mchbh-mtart 'ROH' or
       wa_mchbh-mtart 'VERP' or
       wa_mchbh-mtart 'ZERP'.
*****
      select single minlfgja )
        from mbewh
        into wa_mchbh1-lfgja
       where matnr wa_mchbh-matnr
         and bwkey wa_mchbh-werks
         and lfgja => spmon+0(4)
         and verpr ne 0.
    elseif wa_mchbh-mtart 'HALB' or
           wa_mchbh-mtart 'FERT' or
           wa_mchbh-mtart 'ZERT' or
           wa_mchbh-mtart 'HAWA'..
      select single minlfgja )
        from mbewh
        into wa_mchbh1-lfgja
       where matnr wa_mchbh-matnr
         and bwkey wa_mchbh-werks
         and lfgja => spmon+0(4)
         and stprs ne 0.
    endif.

****For Min Month For Price
    if wa_mchbh-mtart 'ROH' or
       wa_mchbh-mtart 'VERP' or
       wa_mchbh-mtart 'ZERP'.
      if wa_mchbh1-lfgja spmon+0(4).
        select single minlfmon )
          from mbewh
          into wa_mchbh1-lfmon
         where matnr wa_mchbh-matnr
           and bwkey wa_mchbh-werks
           and lfgja wa_mchbh1-lfgja
           and lfmon => spmon+4(2)
           and verpr ne 0.
      endif.
      if wa_mchbh1-lfmon < spmon+4(2).
        select single minlfgja )
          from mbewh
          into wa_mchbh1-lfgja
         where matnr wa_mchbh-matnr
           and bwkey wa_mchbh-werks
           and lfgja > spmon+0(4)
           and verpr ne 0.
      endif.
      if wa_mchbh1-lfgja > spmon+0(4).
        select single minlfmon )
          from mbewh
          into wa_mchbh1-lfmon
         where matnr wa_mchbh-matnr
           and bwkey wa_mchbh-werks
           and lfgja wa_mchbh1-lfgja
           and verpr ne 0.
      endif.

    elseif wa_mchbh-mtart 'HALB' or
           wa_mchbh-mtart 'FERT' or
           wa_mchbh-mtart 'ZERT' or
           wa_mchbh-mtart 'HAWA'..
      if wa_mchbh1-lfgja spmon+0(4).
        select single minlfmon )
          from mbewh
          into wa_mchbh1-lfmon
         where matnr wa_mchbh-matnr
           and bwkey wa_mchbh-werks
           and lfgja wa_mchbh1-lfgja
           and lfmon => spmon+4(2)
           and stprs ne 0.
      endif.
      if wa_mchbh1-lfmon < spmon+4(2).
        select single minlfgja )
          from mbewh
          into wa_mchbh1-lfgja
         where matnr wa_mchbh-matnr
           and bwkey wa_mchbh-werks
           and lfgja > spmon+0(4)
           and stprs ne 0.
      endif.
      if wa_mchbh1-lfgja > spmon+0(4).
        select single minlfmon )
          from mbewh
          into wa_mchbh1-lfmon
         where matnr wa_mchbh-matnr
           and bwkey wa_mchbh-werks
           and lfgja wa_mchbh1-lfgja
           and stprs ne 0.
      endif.
    endif.
****For price.
    if wa_mchbh-mtart 'ROH' or
       wa_mchbh-mtart 'VERP' or
       wa_mchbh-mtart 'ZERP'.
      select single verpr
        from mbewh
        into wa_mchbh-price
       where matnr wa_mchbh-matnr
         and bwkey wa_mchbh-werks
         and lfgja wa_mchbh1-lfgja
         and lfmon wa_mchbh1-lfmon.
      if sy-subrc ne 0.
        select single verpr
          from mbew
          into wa_mchbh-price
         where matnr wa_mchbh-matnr
           and bwkey wa_mchbh-werks.
      endif.
    elseif wa_mchbh-mtart 'HALB' or
           wa_mchbh-mtart 'FERT' or
           wa_mchbh-mtart 'ZERT' or
           wa_mchbh-mtart 'HAWA'.
      select single stprs
        from mbewh
        into wa_mchbh-price
      where matnr wa_mchbh-matnr
        and bwkey wa_mchbh-werks
        and lfgja wa_mchbh1-lfgja
        and lfmon wa_mchbh1-lfmon.
      if sy-subrc ne 0.
        select single stprs
          from mbew
          into wa_mchbh-price
         where matnr wa_mchbh-matnr
           and bwkey wa_mchbh-werks.
      endif.
    endif.
****for value
    wa_mchbh-value wa_mchbh-clabs + wa_mchbh-cinsm +
                       wa_mchbh-cspem + wa_mchbh-ceinm +
                       wa_mchbh-cretm )
                       * wa_mchbh-price.
    modify it_mchbh from wa_mchbh.
    clear wa_mchbh,wa_mchbh1.
  endloop.
  sort it_mchbh by matnr charg werks.

  perform get_p_date.
  perform date_seting.

  loop at it_mchbh into wa_mchbh.
    wa_final-matnr wa_mchbh-matnr.
    wa_final-werks wa_mchbh-werks.
    wa_final-lgort wa_mchbh-lgort.
    wa_final-charg wa_mchbh-charg.
    wa_final-clabs wa_mchbh-clabs + wa_mchbh-cinsm +
                     wa_mchbh-cspem + wa_mchbh-ceinm +
                     wa_mchbh-cretm.

    if r1 'X'.
****For Ageing Value
      if wa_mchbh-budat between wd0 and wd30.
        wa_final-day_0_30 wa_final-day_0_30 +
                            wa_mchbh-value.
      endif.

      if wa_mchbh-budat between wd31 and wd60.
        wa_final-day_31_60 wa_final-day_31_60 +
                             wa_mchbh-value.
      endif.

      if wa_mchbh-budat between wd61 and wd90.
        wa_final-day_61_90 wa_final-day_61_90 +
                             wa_mchbh-value.
      endif.

      if wa_mchbh-budat between wd91 and wd120.
        wa_final-day_91_120 wa_final-day_91_120 +
                              wa_mchbh-value.
      endif.

      if wa_mchbh-budat between wd121 and wd180.
        wa_final-day_121_180 wa_final-day_121_180 +
                               wa_mchbh-value.
      endif.

      if wa_mchbh-budat between wd181 and wd270.
        wa_final-day_181_270 wa_final-day_181_270 +
                               wa_mchbh-value.
      endif.

      if wa_mchbh-budat between wd271 and wd365.
        wa_final-day_271_365 wa_final-day_271_365 +
                               wa_mchbh-value.
      endif.

      if wa_mchbh-budat < wd271.
        wa_final-day_m_365 wa_final-day_m_365 +
                             wa_mchbh-value.
      endif.

      if wa_mchbh-budat > wd30.
        wa_final-nodue wa_final-nodue +
                         wa_mchbh-value.
      endif.

    elseif r2 'X'.
      if wa_mchbh-budat between wd0 and wd30.
        wa_final-day_0_30 wa_final-day_0_30 +
                            wa_final-clabs.
      endif.

      if wa_mchbh-budat between wd31 and wd60.
        wa_final-day_31_60 wa_final-day_31_60 +
                             wa_final-clabs.
      endif.

      if wa_mchbh-budat between wd61 and wd90.
        wa_final-day_61_90 wa_final-day_61_90 +
                             wa_final-clabs.
      endif.

      if wa_mchbh-budat between wd91 and wd120.
        wa_final-day_91_120 wa_final-day_91_120 +
                              wa_final-clabs.
      endif.

      if wa_mchbh-budat between wd121 and wd180.
        wa_final-day_121_180 wa_final-day_121_180 +
                               wa_final-clabs.
      endif.

      if wa_mchbh-budat between wd181 and wd270.
        wa_final-day_181_270 wa_final-day_181_270 +
                               wa_final-clabs.
      endif.

      if wa_mchbh-budat between wd271 and wd365.
        wa_final-day_271_365 wa_final-day_271_365 +
                               wa_final-clabs.
      endif.

      if wa_mchbh-budat < wd271.
        wa_final-day_m_365 wa_final-day_m_365 +
                             wa_final-clabs.
      endif.

      if wa_mchbh-budat > wd30.
        wa_final-nodue wa_final-nodue +
                         wa_final-clabs.
      endif.
    endif.
    append wa_final to it_final.
    clear wa_final.
  endloop.

  loop at it_final into wa_final.
    read table it_mchbh into wa_mchbh
                        with key matnr wa_final-matnr
                                 werks wa_final-werks
                                 lgort wa_final-lgort
                                 charg wa_final-charg.
    if sy-subrc 0.
      wa_final-maktx wa_mchbh-maktx.
      wa_final-mtart wa_mchbh-mtart.
      wa_final-price wa_mchbh-price.
      wa_final-budat wa_mchbh-budat.
    endif.

    select single meins
      from mara
      into wa_final-meins
     where matnr wa_final-matnr.

    wa_final-total wa_final-day_0_30 + wa_final-day_31_60 +
                     wa_final-day_61_90 + wa_final-day_91_120 +
                     wa_final-day_121_180 + wa_final-day_181_270
                     + wa_final-day_271_365 + wa_final-day_m_365
                     + wa_final-nodue.
    modify it_final from wa_final.
    clear wa_final.
  endloop.
  delete adjacent duplicates from it_final
                  comparing matnr werks lgort charg.
  delete it_final where clabs is initial.
endform.                    " GET_DATA
*&---------------------------------------------------------------------*
*&      Form  ALV_FIELDCAT
*&---------------------------------------------------------------------*
form alv_fieldcat .
  datacounter type i.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'MATNR'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'Material'.
  wa_fieldcat-no_zero    'X'.
  wa_fieldcat-outputlen  '20'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'MEINS'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'UOM'.
  wa_fieldcat-no_zero    'X'.
  wa_fieldcat-outputlen  '20'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'MAKTX'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'Material Desc.'.
  wa_fieldcat-no_zero    'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'MTART'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'Material Type'.
  wa_fieldcat-no_zero    'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'WERKS'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'Plant'.
  wa_fieldcat-no_zero    'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'LGORT'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'Storage Loc.'.
  wa_fieldcat-no_zero    'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'CHARG'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'Batch'.
*  wa_fieldcat-no_zero    = 'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'BUDAT'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'Date Of Mfg.'.
*  wa_fieldcat-no_zero    = 'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'CLABS'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'Quantity'.
*  wa_fieldcat-no_zero    = 'X'.
  wa_fieldcat-do_sum     'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'PRICE'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'Price'.
  wa_fieldcat-no_zero    'X'.
*  wa_fieldcat-do_sum     = 'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'NODUE'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'Not Due'.
*  wa_fieldcat-no_zero    = 'X'.
  wa_fieldcat-do_sum     'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'DAY_0_30'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  '00 - 30 Days'.
*  wa_fieldcat-no_zero    = 'X'.
  wa_fieldcat-do_sum     'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'DAY_31_60'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  '31 - 60 Days'.
*  wa_fieldcat-no_zero    = 'X'.
  wa_fieldcat-do_sum     'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'DAY_61_90'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  '61 - 90 Days'.
*  wa_fieldcat-no_zero    = 'X'.
  wa_fieldcat-do_sum     'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'DAY_91_120'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  '91 - 120 Days'.
*  wa_fieldcat-no_zero    = 'X'.
  wa_fieldcat-do_sum     'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'DAY_121_180'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  '121 - 180 Days'.
*  wa_fieldcat-no_zero    = 'X'.
  wa_fieldcat-do_sum     'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'DAY_181_270'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  '181 - 270 Days'.
*  wa_fieldcat-no_zero    = 'X'.
  wa_fieldcat-do_sum     'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'DAY_271_365'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  '271 - 365 Days'.
*  wa_fieldcat-no_zero    = 'X'.
  wa_fieldcat-do_sum     'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'DAY_M_365'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'More then 365 Days'.
*  wa_fieldcat-no_zero    = 'X'.
  wa_fieldcat-do_sum     'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

  counter counter + 1.
  wa_fieldcat-col_pos    counter.
  wa_fieldcat-fieldname  'TOTAL'.
  wa_fieldcat-tabname    'IT_FINAL'.
  wa_fieldcat-seltext_l  'Total'.
*  wa_fieldcat-no_zero    = 'X'.
  wa_fieldcat-do_sum     'X'.
  append wa_fieldcat to it_fieldcat.
  clear wa_fieldcat.

endform.                    " ALV_FIELDCAT
*&---------------------------------------------------------------------*
*&      Form  GET_EVENTS
*&---------------------------------------------------------------------*
form get_events .
  call function 'REUSE_ALV_EVENTS_GET'
    exporting
      i_list_type     0
    importing
      et_events       it_events[]
    exceptions
      list_type_wrong 1
      others          2.
  if sy-subrc <> 0.
    message id sy-msgid type sy-msgty number sy-msgno
            with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  endif.

  read table it_events with key name slis_ev_top_of_page
                                into it_events.
  if sy-subrc 0.
    move t_formname_top_of_page to it_events-form.
    append it_events.
  endif.
endform.                    " GET_EVENTS
*&---------------------------------------------------------------------*
*&      Form  SUB_COMMENT_BUILD
*&---------------------------------------------------------------------*
form sub_comment_build  using  i_top_of_page type slis_t_listheader.
  datals_line type slis_listheader.
  datawrk_name     type string.
  dataspmon2 type string.

  wrk_name v_name2"'Claris Lifesciences Ltd.'.
  concatenate spmon+4(2'.' spmon+0(4into spmon2.
  clear ls_line.

  ls_line-typ  'H'.
  ls_line-info wrk_name.
  append ls_line to i_top_of_page.

  ls_line-typ  'H'.
  ls_line-info 'Material Ageing Report'.
  append ls_line to i_top_of_page.

  ls_line-typ  'S'.
  ls_line-key  'Ageing For :-'.
  ls_line-info spmon2.
  append ls_line to i_top_of_page.
endform.                    " SUB_COMMENT_BUILD
*&---------------------------------------------------------------------*
*&      Form  top_of_page
*&---------------------------------------------------------------------*
form top_of_page.
  call function 'REUSE_ALV_COMMENTARY_WRITE'
    exporting
      it_list_commentary t_list_top_of_page.
endform.                    "top_of_page
*&---------------------------------------------------------------------*
*&      Form  ALV_DISPLAY
*&---------------------------------------------------------------------*
form alv_display .
  gs_layout-zebra                'X'.
  gs_layout-detail_popup         'X'.
  gs_layout-detail_initial_lines 'X'.
*  gs_layout-colwidth_optimize    = 'X'.

  call function 'REUSE_ALV_GRID_DISPLAY'
    exporting
      it_fieldcat        it_fieldcat
      it_events          it_events[]
      i_callback_program sy-repid
      is_layout          gs_layout
      it_sort            gt_sort[]
      i_save             g_save
      is_variant         gx_variant
*      i_callback_pf_status_set   = 'ZSTANDARD'
*      i_callback_user_command = 'USER_COMMAND'
    tables
      t_outtab           it_final[].
  .
endform.                    " ALV_DISPLAY
*&---------------------------------------------------------------------*
*&      Form  GET_P_DATE
*&---------------------------------------------------------------------*
form get_p_date .
  if spmon is not initial.
    clear p_date,p_date1,month,year.
    month spmon+4(2).
    year spmon+0(4).
    call function 'NUMBER_OF_DAYS_PER_MONTH_GET'
      exporting
        par_month month
        par_year  year
      importing
        par_days  days.
    if days is not initial.
      concatenate days '.' spmon+4(2'.' spmon+0(4into p_date1.
      concatenate spmon+0(4spmon+4(2days into p_date.
*      p_date = p_date1.
    endif.
  endif.
endform.                    " GET_P_DATE
*&---------------------------------------------------------------------*
*&      Form  DATE_SETING
*&---------------------------------------------------------------------*
form date_seting .
  clear:wd0,wd30,wd31,wd60,wd61,wd90,wd91,wd120,
        wd121,wd180,wd181,wd270,wd271,wd365,wd15.
****
* 0 - 30 DAYS
  wd30 p_date.

  data:wa_duration like psen_duration_dec,
       w_date type endda.

  clear:wa_duration,w_date.
  wa_duration-caldd '30'.

  perform date_duration using wa_duration
        changing w_date.

  wd0 w_date.

****
* 31 - 60 DAYS
*wd31 = wd30 - 60.
*wd60 = wd30 - 31.

  clear:wa_duration,w_date.
  wa_duration-caldd '60'.

  perform date_duration using wa_duration
        changing w_date.
  wd31 w_date.

  clear:wa_duration,w_date.
  wa_duration-caldd '31'.

  perform date_duration using wa_duration
        changing w_date.
  wd60 w_date.

****
* 61 - 90 DAYS
*wd61 = wd30 - 90.
*wd90 = wd30 - 61.

  clear:wa_duration,w_date.
  wa_duration-caldd '90'.

  perform date_duration using wa_duration
        changing w_date.
  wd61 w_date.

  clear:wa_duration,w_date.
  wa_duration-caldd '61'.

  perform date_duration using wa_duration
        changing w_date.
  wd90 w_date.

****
* 91 - 120 DAYS
*wd91 = wd30 - 120.
*wd120 = wd30 - 91.

  clear:wa_duration,w_date.
  wa_duration-caldd '120'.

  perform date_duration using wa_duration
        changing w_date.
  wd91 w_date.

  clear:wa_duration,w_date.
  wa_duration-caldd '91'.

  perform date_duration using wa_duration
        changing w_date.
  wd120 w_date.

****
* 121 - 180 DAYS
*wd121 = wd30 - 180.
*wd180 = wd30 - 121.

  clear:wa_duration,w_date.
  wa_duration-caldd '180'.

  perform date_duration using wa_duration
        changing w_date.
  wd121 w_date.

  clear:wa_duration,w_date.
  wa_duration-caldd '121'.

  perform date_duration using wa_duration
        changing w_date.
  wd180 w_date.

****
* 181 - 270 DAYS
*wd270 = wd30 - 181.
*wd181 = wd30 - 270.

  clear:wa_duration,w_date.
  wa_duration-caldd '181'.

  perform date_duration using wa_duration
        changing w_date.
  wd270 w_date.

  clear:wa_duration,w_date.
  wa_duration-caldd '270'.

  perform date_duration using wa_duration
        changing w_date.
  wd181 w_date.

****
* 271 - 365 DAYS
*wd365 = wd30 - 271.
*wd271 = wd30 - 365.

  clear:wa_duration,w_date.
  wa_duration-caldd '271'.

  perform date_duration using wa_duration
        changing w_date.
  wd365 w_date.

  clear:wa_duration,w_date.
  wa_duration-caldd '365'.

  perform date_duration using wa_duration
        changing w_date.
  wd271 w_date.

endform.                    " DATE_SETING
*&---------------------------------------------------------------------*
*&      Form  DATE_DURATION
*&---------------------------------------------------------------------*
form date_duration  using    p_wa_duration
                    changing p_w_date.
  call function 'HR_SEN_CALE_DAYS_DATE'
    exporting
      id_date                  p_date
      id_operator              '-'
      is_duration              p_wa_duration
    importing
      ed_date                  p_w_date
    exceptions
      conversion_not_specified 1
      conversion_not_possible  2
      others                   3.
  if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  endif.
endform.                    " DATE_DURATION

*&---------------------------------------------------------------------*
*&      Form  GET_COM_DTL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
form get_com_dtl .

select single name2 from t001w into v_name2 where werks s_werks-low.

endform.                    " GET_COM_DTL