CLASS {{p}}licence_merger DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. INTERFACES {{p}}if_licence_merge. PRIVATE SECTION. TYPES tt_merged TYPE HASHED TABLE OF {{p}}if_licence_merge=>ty_licence WITH UNIQUE KEY product cost_centre. METHODS add_rows IMPORTING it_rows TYPE {{p}}if_licence_merge=>tt_licences CHANGING ct_merged TYPE tt_merged. METHODS normalize IMPORTING is_row TYPE {{p}}if_licence_merge=>ty_licence RETURNING VALUE(rs_row) TYPE {{p}}if_licence_merge=>ty_licence. METHODS is_relevant IMPORTING is_row TYPE {{p}}if_licence_merge=>ty_licence RETURNING VALUE(rv_relevant) TYPE abap_bool. METHODS trim_upper IMPORTING iv_text TYPE string RETURNING VALUE(rv_text) TYPE string. ENDCLASS. CLASS {{p}}licence_merger IMPLEMENTATION. METHOD {{p}}if_licence_merge~merge. DATA lt_merged TYPE tt_merged. add_rows( EXPORTING it_rows = it_primary CHANGING ct_merged = lt_merged ). add_rows( EXPORTING it_rows = it_secondary CHANGING ct_merged = lt_merged ). rt_merged = lt_merged. SORT rt_merged BY product cost_centre. ENDMETHOD. METHOD add_rows. LOOP AT it_rows INTO DATA(ls_row). DATA(ls_norm) = normalize( ls_row ). IF is_relevant( ls_norm ) = abap_false. CONTINUE. ENDIF. READ TABLE ct_merged ASSIGNING FIELD-SYMBOL() WITH TABLE KEY product = ls_norm-product cost_centre = ls_norm-cost_centre. IF sy-subrc = 0. -seats = -seats + ls_norm-seats. IF ls_norm-unit_price > -unit_price. -unit_price = ls_norm-unit_price. ENDIF. ELSE. INSERT ls_norm INTO TABLE ct_merged. ENDIF. ENDLOOP. ENDMETHOD. METHOD normalize. rs_row = is_row. rs_row-product = trim_upper( CONV string( is_row-product ) ). rs_row-cost_centre = trim_upper( CONV string( is_row-cost_centre ) ). ENDMETHOD. METHOD is_relevant. rv_relevant = xsdbool( is_row-product IS NOT INITIAL AND is_row-cost_centre IS NOT INITIAL AND is_row-seats >= 1 ). ENDMETHOD. METHOD trim_upper. DATA(lv_text) = iv_text. SHIFT lv_text LEFT DELETING LEADING space. SHIFT lv_text RIGHT DELETING TRAILING space. rv_text = to_upper( lv_text ). ENDMETHOD. ENDCLASS.