CLASS {{p}}log_merger DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: ty_log_no TYPE c LENGTH 10, ty_district TYPE c LENGTH 4, BEGIN OF ty_log, log_no TYPE ty_log_no, district TYPE ty_district, length_cm TYPE i, diameter_cm TYPE i, END OF ty_log, tt_log TYPE STANDARD TABLE OF ty_log WITH EMPTY KEY, BEGIN OF ty_district_stat, district TYPE ty_district, log_qty TYPE i, total_length_cm TYPE i, END OF ty_district_stat, tt_district_stat TYPE STANDARD TABLE OF ty_district_stat WITH EMPTY KEY. METHODS combine IMPORTING it_first TYPE tt_log it_second TYPE tt_log RETURNING VALUE(rt_result) TYPE tt_log. METHODS count_by_district IMPORTING it_log TYPE tt_log RETURNING VALUE(rt_stat) TYPE tt_district_stat. PRIVATE SECTION. CONSTANTS: c_min_length TYPE i VALUE 200, c_min_diameter TYPE i VALUE 20. TYPES tt_log_keyed TYPE SORTED TABLE OF ty_log WITH UNIQUE KEY log_no. METHODS add_logs IMPORTING it_log TYPE tt_log CHANGING ct_keyed TYPE tt_log_keyed. METHODS is_ready IMPORTING is_log TYPE ty_log RETURNING VALUE(rv_ready) TYPE abap_bool. ENDCLASS. CLASS {{p}}log_merger IMPLEMENTATION. METHOD combine. DATA lt_keyed TYPE tt_log_keyed. add_logs( EXPORTING it_log = it_first CHANGING ct_keyed = lt_keyed ). add_logs( EXPORTING it_log = it_second CHANGING ct_keyed = lt_keyed ). LOOP AT lt_keyed INTO DATA(ls_log). IF is_ready( ls_log ) = abap_true. INSERT ls_log INTO TABLE rt_result. ENDIF. ENDLOOP. ENDMETHOD. METHOD count_by_district. DATA lt_stat TYPE SORTED TABLE OF ty_district_stat WITH UNIQUE KEY district. LOOP AT it_log INTO DATA(ls_log). ASSIGN lt_stat[ district = ls_log-district ] TO FIELD-SYMBOL(). IF sy-subrc <> 0. INSERT VALUE #( district = ls_log-district log_qty = 1 total_length_cm = ls_log-length_cm ) INTO TABLE lt_stat. ELSE. -log_qty += 1. -total_length_cm += ls_log-length_cm. ENDIF. ENDLOOP. rt_stat = lt_stat. ENDMETHOD. METHOD add_logs. LOOP AT it_log INTO DATA(ls_log). INSERT ls_log INTO TABLE ct_keyed. ENDLOOP. ENDMETHOD. METHOD is_ready. rv_ready = xsdbool( is_log-length_cm >= c_min_length OR is_log-diameter_cm >= c_min_diameter ). ENDMETHOD. ENDCLASS.