REPORT {{p}}subs_sum. TYPES: BEGIN OF ty_line, magazine TYPE {{p}}subs-magazine, num_subs TYPE i, revenue TYPE {{p}}subs-monthly_fee, END OF ty_line. TYPES tt_line TYPE STANDARD TABLE OF ty_line WITH DEFAULT KEY. TYPES tt_magazine TYPE RANGE OF {{p}}subs-magazine. DATA gv_magazine TYPE {{p}}subs-magazine. PARAMETERS p_from TYPE d OBLIGATORY. SELECT-OPTIONS s_mag FOR gv_magazine. CLASS lcl_report DEFINITION FINAL. PUBLIC SECTION. CLASS-METHODS select_totals IMPORTING iv_from TYPE d it_magazine TYPE tt_magazine RETURNING VALUE(rt_lines) TYPE tt_line. CLASS-METHODS keep_regulars IMPORTING it_lines TYPE tt_line RETURNING VALUE(rt_lines) TYPE tt_line. CLASS-METHODS display CHANGING ct_lines TYPE tt_line. ENDCLASS. CLASS lcl_report IMPLEMENTATION. METHOD select_totals. SELECT magazine COUNT( * ) AS num_subs SUM( monthly_fee ) AS revenue FROM {{p}}subs INTO CORRESPONDING FIELDS OF TABLE rt_lines WHERE sub_status = 'A' AND start_date >= iv_from AND magazine IN it_magazine GROUP BY magazine. ENDMETHOD. METHOD keep_regulars. DATA ls_line TYPE ty_line. LOOP AT it_lines INTO ls_line. IF ls_line-num_subs >= 2. APPEND ls_line TO rt_lines. ENDIF. ENDLOOP. SORT rt_lines BY revenue DESCENDING. ENDMETHOD. METHOD display. DATA: lo_alv TYPE REF TO cl_salv_table, lo_error TYPE REF TO cx_salv_msg. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv CHANGING t_table = ct_lines ). lo_alv->display( ). CATCH cx_salv_msg INTO lo_error. MESSAGE lo_error TYPE 'I' DISPLAY LIKE 'E'. ENDTRY. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA gt_lines TYPE tt_line. gt_lines = lcl_report=>select_totals( iv_from = p_from it_magazine = s_mag[] ). gt_lines = lcl_report=>keep_regulars( gt_lines ). lcl_report=>display( CHANGING ct_lines = gt_lines ). CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. METHODS removes_small_groups FOR TESTING. METHODS sorts_by_revenue FOR TESTING. ENDCLASS. CLASS ltc_report IMPLEMENTATION. METHOD removes_small_groups. DATA: lt_lines TYPE tt_line, lt_kept TYPE tt_line, ls_line TYPE ty_line. ls_line-magazine = 'SMALL'. ls_line-num_subs = 1. ls_line-revenue = 10. APPEND ls_line TO lt_lines. ls_line-magazine = 'BIG'. ls_line-num_subs = 2. ls_line-revenue = 20. APPEND ls_line TO lt_lines. lt_kept = lcl_report=>keep_regulars( lt_lines ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_kept ) ). READ TABLE lt_kept INTO ls_line INDEX 1. cl_abap_unit_assert=>assert_equals( exp = 'BIG' act = ls_line-magazine ). ENDMETHOD. METHOD sorts_by_revenue. DATA: lt_lines TYPE tt_line, lt_kept TYPE tt_line, ls_line TYPE ty_line. ls_line-magazine = 'LOW'. ls_line-num_subs = 2. ls_line-revenue = 10. APPEND ls_line TO lt_lines. ls_line-magazine = 'HIGH'. ls_line-num_subs = 2. ls_line-revenue = 30. APPEND ls_line TO lt_lines. lt_kept = lcl_report=>keep_regulars( lt_lines ). READ TABLE lt_kept INTO ls_line INDEX 1. cl_abap_unit_assert=>assert_equals( exp = 'HIGH' act = ls_line-magazine ). ENDMETHOD. ENDCLASS.