CLASS {{p}}meter_consumption DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_meter_reading. PRIVATE SECTION. TYPES: BEGIN OF ty_meter, meter_id TYPE {{p}}if_meter_reading=>ty_meter_id, opening_date TYPE {{p}}if_meter_reading=>ty_reading_date, opening_value TYPE {{p}}if_meter_reading=>ty_value, closing_date TYPE {{p}}if_meter_reading=>ty_reading_date, closing_value TYPE {{p}}if_meter_reading=>ty_value, END OF ty_meter, tt_meter TYPE HASHED TABLE OF ty_meter WITH UNIQUE KEY meter_id. METHODS collect IMPORTING it_readings TYPE {{p}}if_meter_reading=>tt_readings RETURNING VALUE(rt_meter) TYPE tt_meter. METHODS to_result IMPORTING it_meter TYPE tt_meter RETURNING VALUE(rt_result) TYPE {{p}}if_meter_reading=>tt_result. ENDCLASS. CLASS {{p}}meter_consumption IMPLEMENTATION. METHOD {{p}}if_meter_reading~calculate. rt_result = to_result( collect( it_readings ) ). ENDMETHOD. METHOD collect. LOOP AT it_readings INTO DATA(ls_reading). IF ls_reading-reading_value < 0. CONTINUE. ENDIF. READ TABLE rt_meter ASSIGNING FIELD-SYMBOL() WITH TABLE KEY meter_id = ls_reading-meter_id. IF sy-subrc <> 0. INSERT VALUE #( meter_id = ls_reading-meter_id opening_date = ls_reading-reading_date opening_value = ls_reading-reading_value closing_date = ls_reading-reading_date closing_value = ls_reading-reading_value ) INTO TABLE rt_meter ASSIGNING . ENDIF. IF ls_reading-reading_date < -opening_date OR ( ls_reading-reading_date = -opening_date AND ls_reading-reading_value > -opening_value ). -opening_date = ls_reading-reading_date. -opening_value = ls_reading-reading_value. ENDIF. IF ls_reading-reading_date > -closing_date AND ( ls_reading-reading_date = -closing_date AND ls_reading-reading_value > -closing_value ). -closing_date = ls_reading-reading_date. -closing_value = ls_reading-reading_value. ENDIF. ENDLOOP. ENDMETHOD. METHOD to_result. LOOP AT it_meter ASSIGNING FIELD-SYMBOL(). DATA(lv_consumption) = -closing_value - -opening_value. IF lv_consumption < 0. lv_consumption = 0. ENDIF. INSERT VALUE #( meter_id = -meter_id opening_value = -opening_value closing_value = -closing_value consumption = lv_consumption ) INTO TABLE rt_result. ENDLOOP. SORT rt_result BY meter_id. ENDMETHOD. ENDCLASS.