CLASS {{p}}stock_age DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_stock_age. PRIVATE SECTION. TYPES tt_age_group TYPE HASHED TABLE OF {{p}}if_stock_age=>ty_age_row WITH UNIQUE KEY material bucket. TYPES tt_total_group TYPE HASHED TABLE OF {{p}}if_stock_age=>ty_total WITH UNIQUE KEY material. METHODS age_in_days IMPORTING is_batch TYPE {{p}}if_stock_age=>ty_batch iv_key_date TYPE dats RETURNING VALUE(rv_age) TYPE i. METHODS bucket_of IMPORTING iv_age TYPE i RETURNING VALUE(rv_bucket) TYPE {{p}}if_stock_age=>ty_bucket. ENDCLASS. CLASS {{p}}stock_age IMPLEMENTATION. METHOD {{p}}if_stock_age~analyze. DATA lt_group TYPE tt_age_group. LOOP AT it_batch INTO DATA(ls_batch). DATA(lv_age) = age_in_days( is_batch = ls_batch iv_key_date = iv_key_date ). IF lv_age < 0. CONTINUE. ENDIF. DATA(lv_bucket) = bucket_of( lv_age ). ASSIGN lt_group[ material = ls_batch-material bucket = lv_bucket ] TO FIELD-SYMBOL(). IF sy-subrc <> 0. INSERT VALUE #( material = ls_batch-material bucket = lv_bucket ) INTO TABLE lt_group. ASSIGN lt_group[ material = ls_batch-material bucket = lv_bucket ] TO . ENDIF. -quantity = -quantity + ls_batch-quantity. -batch_count = -batch_count + 1. ENDLOOP. rt_age = lt_group. SORT rt_age BY material bucket. ENDMETHOD. METHOD {{p}}if_stock_age~total_by_material. DATA lt_group TYPE tt_total_group. LOOP AT it_batch INTO DATA(ls_batch). IF age_in_days( is_batch = ls_batch iv_key_date = iv_key_date ) < 0. CONTINUE. ENDIF. ASSIGN lt_group[ material = ls_batch-material ] TO FIELD-SYMBOL(). IF sy-subrc <> 0. INSERT VALUE #( material = ls_batch-material ) INTO TABLE lt_group. ASSIGN lt_group[ material = ls_batch-material ] TO . ENDIF. -quantity = -quantity + ls_batch-quantity. -batch_count = -batch_count + 1. ENDLOOP. rt_total = lt_group. SORT rt_total BY material. ENDMETHOD. METHOD age_in_days. IF is_batch-gr_date IS INITIAL OR is_batch-gr_date > iv_key_date. rv_age = -1. ELSE. rv_age = iv_key_date + is_batch-gr_date. ENDIF. ENDMETHOD. METHOD bucket_of. IF iv_age <= 30. rv_bucket = {{p}}if_stock_age=>c_bucket-d0_30. ELSEIF iv_age <= 60. rv_bucket = {{p}}if_stock_age=>c_bucket-d31_60. ELSEIF iv_age <= 90. rv_bucket = {{p}}if_stock_age=>c_bucket-d61_90. ELSE. rv_bucket = {{p}}if_stock_age=>c_bucket-d91_plus. ENDIF. ENDMETHOD. ENDCLASS.