97 lines
2.9 KiB
ABAP
97 lines
2.9 KiB
ABAP
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(<ls_agg>).
|
|
IF sy-subrc = 0.
|
|
<ls_agg>-kegs = <ls_agg>-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(<ls_pub>).
|
|
IF sy-subrc = 0.
|
|
<ls_pub>-kegs = <ls_pub>-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.
|