CLASS {{p}}keg_tour_merger DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: BEGIN OF ty_entry, pub_id TYPE c LENGTH 8, keg_type TYPE c LENGTH 4, kegs TYPE i, END OF ty_entry, tt_entry TYPE STANDARD TABLE OF ty_entry WITH EMPTY KEY, BEGIN OF ty_pub, pub_id TYPE c LENGTH 8, kegs TYPE i, END OF ty_pub, tt_pub TYPE STANDARD TABLE OF ty_pub WITH EMPTY KEY. METHODS merge_tours IMPORTING it_tour_a TYPE tt_entry it_tour_b TYPE tt_entry RETURNING VALUE(rt_tour) TYPE tt_entry. METHODS top_pubs IMPORTING it_tour TYPE tt_entry iv_count TYPE i RETURNING VALUE(rt_pubs) TYPE tt_pub. PRIVATE SECTION. TYPES tt_agg TYPE HASHED TABLE OF ty_entry WITH UNIQUE KEY pub_id keg_type. TYPES tt_pub_agg TYPE HASHED TABLE OF ty_pub WITH UNIQUE KEY pub_id. METHODS add_entries IMPORTING it_tour TYPE tt_entry CHANGING ct_agg TYPE tt_agg. METHODS add_pubs IMPORTING it_tour TYPE tt_entry CHANGING ct_pub TYPE tt_pub_agg. ENDCLASS. CLASS {{p}}keg_tour_merger IMPLEMENTATION. METHOD merge_tours. DATA lt_agg TYPE tt_agg. add_entries( EXPORTING it_tour = it_tour_a CHANGING ct_agg = lt_agg ). add_entries( EXPORTING it_tour = it_tour_b CHANGING ct_agg = lt_agg ). rt_tour = lt_agg. SORT rt_tour BY pub_id keg_type. ENDMETHOD. METHOD top_pubs. IF iv_count < 1. RETURN. ENDIF. DATA lt_agg TYPE tt_pub_agg. add_pubs( EXPORTING it_tour = it_tour CHANGING ct_pub = lt_agg ). rt_pubs = lt_agg. SORT rt_pubs BY kegs DESCENDING pub_id ASCENDING. DATA(lv_from) = iv_count + 1. IF lines( rt_pubs ) >= lv_from. DELETE rt_pubs FROM lv_from. ENDIF. ENDMETHOD. METHOD add_entries. LOOP AT it_tour INTO DATA(ls_entry). IF ls_entry-kegs < 1. CONTINUE. ENDIF. DATA(ls_norm) = VALUE ty_entry( pub_id = to_upper( ls_entry-pub_id ) keg_type = to_upper( ls_entry-keg_type ) kegs = ls_entry-kegs ). ASSIGN ct_agg[ pub_id = ls_norm-pub_id keg_type = ls_norm-keg_type ] TO FIELD-SYMBOL(). IF sy-subrc = 0. -kegs = -kegs + ls_norm-kegs. ELSE. INSERT ls_norm INTO TABLE ct_agg. ENDIF. ENDLOOP. ENDMETHOD. METHOD add_pubs. LOOP AT it_tour INTO DATA(ls_entry). IF ls_entry-kegs < 1. CONTINUE. ENDIF. DATA(lv_pub_id) = to_upper( ls_entry-pub_id ). ASSIGN ct_pub[ pub_id = lv_pub_id ] TO FIELD-SYMBOL(). IF sy-subrc = 0. -kegs = -kegs + ls_entry-kegs. ELSE. DATA(ls_new) = VALUE ty_pub( pub_id = lv_pub_id kegs = ls_entry-kegs ). INSERT ls_new INTO TABLE ct_pub. ENDIF. ENDLOOP. ENDMETHOD. ENDCLASS.