CLASS {{p}}league_table DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. TYPES ty_team TYPE c LENGTH 10. TYPES: BEGIN OF ty_match, home_team TYPE ty_team, away_team TYPE ty_team, home_goals TYPE i, away_goals TYPE i, END OF ty_match. TYPES tt_match TYPE STANDARD TABLE OF ty_match WITH EMPTY KEY. TYPES: BEGIN OF ty_row, rank TYPE i, team TYPE ty_team, played TYPE i, won TYPE i, drawn TYPE i, lost TYPE i, goals_for TYPE i, goals_against TYPE i, goal_diff TYPE i, points TYPE i, END OF ty_row. TYPES tt_row TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY. METHODS evaluate IMPORTING it_matches TYPE tt_match RETURNING VALUE(rt_table) TYPE tt_row. PRIVATE SECTION. TYPES tt_work TYPE HASHED TABLE OF ty_row WITH UNIQUE KEY team. METHODS is_invalid IMPORTING is_match TYPE ty_match RETURNING VALUE(rv_bad) TYPE abap_bool. METHODS add_result IMPORTING iv_team TYPE ty_team iv_goals_for TYPE i iv_goals_against TYPE i CHANGING ct_work TYPE tt_work. METHODS assign_rank CHANGING ct_table TYPE tt_row. ENDCLASS. CLASS {{p}}league_table IMPLEMENTATION. METHOD evaluate. DATA lt_work TYPE tt_work. LOOP AT it_matches INTO DATA(ls_match). IF is_invalid( ls_match ) = abap_false. add_result( EXPORTING iv_team = ls_match-home_team iv_goals_for = ls_match-home_goals iv_goals_against = ls_match-away_goals CHANGING ct_work = lt_work ). add_result( EXPORTING iv_team = ls_match-away_team iv_goals_for = ls_match-away_goals iv_goals_against = ls_match-home_goals CHANGING ct_work = lt_work ). ENDIF. ENDLOOP. rt_table = lt_work. SORT rt_table BY points DESCENDING goal_diff DESCENDING goals_for DESCENDING team ASCENDING. assign_rank( CHANGING ct_table = rt_table ). ENDMETHOD. METHOD is_invalid. rv_bad = xsdbool( is_match-home_team IS INITIAL OR is_match-away_team IS INITIAL OR is_match-home_team = is_match-away_team OR is_match-home_goals < 0 OR is_match-away_goals < 0 ). ENDMETHOD. METHOD add_result. ASSIGN ct_work[ team = iv_team ] TO FIELD-SYMBOL(). IF sy-subrc <> 0. INSERT VALUE ty_row( team = iv_team ) INTO TABLE ct_work ASSIGNING . ENDIF. -played = -played + 1. -goals_for = -goals_for + iv_goals_for. -goals_against = -goals_against + iv_goals_against. -goal_diff = -goals_for - -goals_against. IF iv_goals_for > iv_goals_against. -won = -won + 1. -points = -points + 3. ELSEIF iv_goals_for = iv_goals_against. -drawn = -drawn + 1. -points = -points + 1. ELSE. -lost = -lost + 1. ENDIF. ENDMETHOD. METHOD assign_rank. DATA lv_rank TYPE i. DATA lv_position TYPE i. DATA ls_previous TYPE ty_row. LOOP AT ct_table ASSIGNING FIELD-SYMBOL(). lv_position = lv_position + 1. IF lv_position = 1 OR -points <> ls_previous-points OR -goal_diff <> ls_previous-goal_diff OR -goals_for <> ls_previous-goals_for. lv_rank = lv_position. ENDIF. -rank = lv_rank. ls_previous = . ENDLOOP. ENDMETHOD. ENDCLASS.