REPORT {{p}}ski_lift_old. DATA gv_lift TYPE {{p}}skiride-lift_id. PARAMETERS p_season TYPE c LENGTH 4 OBLIGATORY. SELECT-OPTIONS s_lift FOR gv_lift. CLASS lcl_report DEFINITION FINAL. PUBLIC SECTION. TYPES ty_season TYPE c LENGTH 4. TYPES tt_lift TYPE RANGE OF {{p}}skiride-lift_id. TYPES: BEGIN OF ty_line, lift_id TYPE {{p}}skiride-lift_id, rides TYPE i, tickets TYPE i, revenue TYPE {{p}}skiride-fare, END OF ty_line, tt_line TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY. METHODS collect IMPORTING iv_season TYPE ty_season it_lift TYPE tt_lift RETURNING VALUE(rt_lines) TYPE tt_line. METHODS display CHANGING ct_lines TYPE tt_line. ENDCLASS. CLASS lcl_report IMPLEMENTATION. METHOD collect. SELECT lift_id, COUNT( * ) AS rides, SUM( tickets ) AS tickets, SUM( tickets * fare ) AS revenue FROM {{p}}skiride WHERE season = @iv_season AND lift_id IN @it_lift GROUP BY lift_id ORDER BY revenue DESCENDING INTO CORRESPONDING FIELDS OF TABLE @rt_lines. ENDMETHOD. METHOD display. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv) CHANGING t_table = ct_lines ). lo_alv->display( ). CATCH cx_salv_msg INTO DATA(lx_error). MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'. ENDTRY. ENDMETHOD. ENDCLASS. START-OF-SELECTION. DATA(go_report) = NEW lcl_report( ). DATA(gt_lines) = go_report->collect( iv_season = p_season it_lift = s_lift[] ). go_report->display( CHANGING ct_lines = gt_lines ). CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS. PRIVATE SECTION. CLASS-DATA go_env TYPE REF TO if_osql_test_environment. CLASS-METHODS class_setup. CLASS-METHODS class_teardown. METHODS totals_per_lift FOR TESTING. METHODS lift_filter FOR TESTING. ENDCLASS. CLASS ltc_report IMPLEMENTATION. METHOD class_setup. go_env = cl_osql_test_environment=>create( i_dependency_list = VALUE #( ( '{{P}}SKIRIDE' ) ) ). DATA lt_ride TYPE STANDARD TABLE OF {{p}}skiride WITH EMPTY KEY. lt_ride = VALUE #( ( ride_id = 1 lift_id = 'NORD' season = '2026' tickets = 10 fare = 25 ) ( ride_id = 2 lift_id = 'NORD' season = '2026' tickets = 6 fare = 25 ) ( ride_id = 3 lift_id = 'SUED' season = '2026' tickets = 20 fare = 30 ) ). go_env->insert_test_data( lt_ride ). ENDMETHOD. METHOD class_teardown. go_env->destroy( ). ENDMETHOD. METHOD totals_per_lift. DATA(lt_lines) = NEW lcl_report( )->collect( iv_season = '2026' it_lift = VALUE #( ) ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ). cl_abap_unit_assert=>assert_equals( exp = 'SUED' act = lt_lines[ 1 ]-lift_id ). cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 600 ) act = lt_lines[ 1 ]-revenue ). cl_abap_unit_assert=>assert_equals( exp = 2 act = lt_lines[ 2 ]-rides ). cl_abap_unit_assert=>assert_equals( exp = 16 act = lt_lines[ 2 ]-tickets ). cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 400 ) act = lt_lines[ 2 ]-revenue ). ENDMETHOD. METHOD lift_filter. DATA(lt_lines) = NEW lcl_report( )->collect( iv_season = '2026' it_lift = VALUE #( ( sign = 'I' option = 'EQ' low = 'NORD' ) ) ). cl_abap_unit_assert=>assert_equals( exp = 1 act = lines( lt_lines ) ). cl_abap_unit_assert=>assert_equals( exp = 'NORD' act = lt_lines[ 1 ]-lift_id ). cl_abap_unit_assert=>assert_equals( exp = CONV {{p}}skiride-fare( 400 ) act = lt_lines[ 1 ]-revenue ). ENDMETHOD. ENDCLASS.