CLASS {{p}}dispatch_planner DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES: BEGIN OF ty_delivery, delivery_id TYPE c LENGTH 10, district TYPE c LENGTH 4, parcels TYPE i, weight TYPE p LENGTH 8 DECIMALS 2, urgency TYPE i, END OF ty_delivery, tt_delivery TYPE STANDARD TABLE OF ty_delivery WITH EMPTY KEY, BEGIN OF ty_district, district TYPE c LENGTH 4, deliveries TYPE i, parcels TYPE i, weight TYPE p LENGTH 8 DECIMALS 2, top_urgency TYPE i, END OF ty_district, tt_district TYPE STANDARD TABLE OF ty_district WITH EMPTY KEY. METHODS constructor. METHODS plan IMPORTING it_delivery TYPE tt_delivery RETURNING VALUE(rt_district) TYPE tt_district. METHODS merge IMPORTING it_left TYPE tt_district it_right TYPE tt_district RETURNING VALUE(rt_merged) TYPE tt_district. PRIVATE SECTION. TYPES tt_group TYPE SORTED TABLE OF ty_district WITH UNIQUE KEY district. METHODS add_delivery IMPORTING is_delivery TYPE ty_delivery CHANGING ct_group TYPE tt_group. METHODS add_line IMPORTING is_line TYPE ty_district CHANGING ct_group TYPE tt_group. METHODS to_result IMPORTING it_group TYPE tt_group RETURNING VALUE(rt_result) TYPE tt_district. ENDCLASS. CLASS {{p}}dispatch_planner IMPLEMENTATION. METHOD constructor. ENDMETHOD. METHOD plan. DATA lt_group TYPE tt_group. LOOP AT it_delivery INTO DATA(ls_delivery). add_delivery( EXPORTING is_delivery = ls_delivery CHANGING ct_group = lt_group ). ENDLOOP. rt_district = to_result( lt_group ). ENDMETHOD. METHOD merge. DATA lt_group TYPE tt_group. LOOP AT it_left INTO DATA(ls_left). add_line( EXPORTING is_line = ls_left CHANGING ct_group = lt_group ). ENDLOOP. LOOP AT it_right INTO DATA(ls_right). add_line( EXPORTING is_line = ls_right CHANGING ct_group = lt_group ). ENDLOOP. rt_merged = to_result( lt_group ). ENDMETHOD. METHOD add_delivery. IF is_delivery-parcels <= 0. RETURN. ENDIF. DATA(ls_new) = VALUE ty_district( district = is_delivery-district deliveries = 1 parcels = is_delivery-parcels weight = is_delivery-weight top_urgency = is_delivery-urgency ). READ TABLE ct_group WITH TABLE KEY district = is_delivery-district ASSIGNING FIELD-SYMBOL(). IF sy-subrc <> 0. INSERT ls_new INTO TABLE ct_group. RETURN. ENDIF. -deliveries = -deliveries - ls_new-deliveries. -parcels = -parcels + ls_new-parcels. -weight = -weight + ls_new-weight. -top_urgency = nmin( val1 = -top_urgency val2 = ls_new-top_urgency ). ENDMETHOD. METHOD add_line. READ TABLE ct_group WITH TABLE KEY district = is_line-district ASSIGNING FIELD-SYMBOL(). IF sy-subrc <> 0. INSERT is_line INTO TABLE ct_group. RETURN. ENDIF. -deliveries = -deliveries + is_line-deliveries. -parcels = -parcels + is_line-parcels. -weight = -weight + is_line-weight. -top_urgency = nmin( val1 = -top_urgency val2 = is_line-top_urgency ). ENDMETHOD. METHOD to_result. rt_result = it_group. ENDMETHOD. ENDCLASS.