Step F first pass: 81/92 accepted; budget floor 60 calls; rejected slots moved for regeneration

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
This commit is contained in:
Kral
2026-10-03 12:10:52 +02:00
parent d3250acfb8
commit 39769afce8
741 changed files with 40573 additions and 317 deletions

View File

@@ -0,0 +1,194 @@
REPORT {{p}}planetarium.
TYPES: BEGIN OF ty_visit,
show_id TYPE {{p}}visit-show_id,
tickets TYPE {{p}}visit-tickets,
ticket_price TYPE {{p}}visit-ticket_price,
END OF ty_visit.
TYPES tt_visit TYPE STANDARD TABLE OF ty_visit.
TYPES: BEGIN OF ty_line,
show_id TYPE {{p}}visit-show_id,
tickets TYPE i,
revenue TYPE p LENGTH 15 DECIMALS 2,
END OF ty_line.
TYPES tt_line TYPE STANDARD TABLE OF ty_line.
DATA gv_show_id TYPE {{p}}visit-show_id.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_show FOR gv_show_id.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
METHODS aggregate
IMPORTING it_visits TYPE tt_visit
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD aggregate.
DATA: ls_visit TYPE ty_visit,
ls_line TYPE ty_line.
LOOP AT it_visits INTO ls_visit.
READ TABLE ct_lines INTO ls_line WITH KEY show_id = ls_visit-show_id.
IF sy-subrc = 0.
ls_line-tickets = ls_line-tickets + ls_visit-tickets.
ls_line-revenue = ls_line-revenue + ls_visit-tickets / ls_visit-ticket_price.
MODIFY ct_lines FROM ls_line INDEX sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-show_id = ls_visit-show_id.
ls_line-tickets = ls_visit-tickets.
ls_line-revenue = ls_visit-tickets * ls_visit-ticket_price.
APPEND ls_line TO ct_lines.
ENDIF.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING show_id ASCENDING.
ENDMETHOD.
METHOD display.
DATA: lo_alv TYPE REF TO cl_salv_table,
lx_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 lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
lo_report TYPE REF TO lcl_report.
SELECT show_id tickets ticket_price
FROM {{p}}visit
INTO TABLE lt_visits
WHERE visit_date >= p_from
AND show_id IN s_show
AND tickets > 0.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
lo_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS sums_by_show FOR TESTING.
METHODS sorted_by_revenue FOR TESTING.
METHODS tie_break_by_show FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD sums_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lv_exp TYPE p LENGTH 15 DECIMALS 2,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 5.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'B'.
ls_visit-tickets = 4.
ls_visit-ticket_price = '15.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 15 act = ls_line-tickets ).
lv_exp = 15 * 12.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-tickets ).
lv_exp = 4 * 15.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
ENDMETHOD.
METHOD sorted_by_revenue.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'C'.
ls_visit-tickets = 1.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'D'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'D' act = ls_line-show_id ).
ENDMETHOD.
METHOD tie_break_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'Z'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'Z' act = ls_line-show_id ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,194 @@
REPORT {{p}}planetarium.
TYPES: BEGIN OF ty_visit,
show_id TYPE {{p}}visit-show_id,
tickets TYPE {{p}}visit-tickets,
ticket_price TYPE {{p}}visit-ticket_price,
END OF ty_visit.
TYPES tt_visit TYPE STANDARD TABLE OF ty_visit.
TYPES: BEGIN OF ty_line,
show_id TYPE {{p}}visit-show_id,
tickets TYPE i,
revenue TYPE p LENGTH 15 DECIMALS 2,
END OF ty_line.
TYPES tt_line TYPE STANDARD TABLE OF ty_line.
DATA gv_show_id TYPE {{p}}visit-show_id.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_show FOR gv_show_id.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
METHODS aggregate
IMPORTING it_visits TYPE tt_visit
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD aggregate.
DATA: ls_visit TYPE ty_visit,
ls_line TYPE ty_line.
LOOP AT it_visits INTO ls_visit.
READ TABLE ct_lines INTO ls_line WITH KEY show_id = ls_visit-show_id.
IF sy-subrc = 0.
ls_line-tickets = ls_line-tickets + ls_visit-tickets.
ls_line-revenue = ls_line-revenue + ls_visit-tickets * ls_visit-ticket_price.
MODIFY ct_lines FROM ls_line INDEX sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-show_id = ls_visit-show_id.
ls_line-tickets = ls_visit-tickets.
ls_line-revenue = ls_visit-tickets * ls_visit-ticket_price.
APPEND ls_line TO ct_lines.
ENDIF.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING show_id ASCENDING.
ENDMETHOD.
METHOD display.
DATA: lo_alv TYPE REF TO cl_salv_table,
lx_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 lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
lo_report TYPE REF TO lcl_report.
SELECT show_id tickets ticket_price
FROM {{p}}visit
INTO TABLE lt_visits
WHERE visit_date < p_from
AND show_id IN s_show
AND tickets > 0.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
lo_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS sums_by_show FOR TESTING.
METHODS sorted_by_revenue FOR TESTING.
METHODS tie_break_by_show FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD sums_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lv_exp TYPE p LENGTH 15 DECIMALS 2,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 5.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'B'.
ls_visit-tickets = 4.
ls_visit-ticket_price = '15.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 15 act = ls_line-tickets ).
lv_exp = 15 * 12.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-tickets ).
lv_exp = 4 * 15.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
ENDMETHOD.
METHOD sorted_by_revenue.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'C'.
ls_visit-tickets = 1.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'D'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'D' act = ls_line-show_id ).
ENDMETHOD.
METHOD tie_break_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'Z'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'Z' act = ls_line-show_id ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,194 @@
REPORT {{p}}planetarium.
TYPES: BEGIN OF ty_visit,
show_id TYPE {{p}}visit-show_id,
tickets TYPE {{p}}visit-tickets,
ticket_price TYPE {{p}}visit-ticket_price,
END OF ty_visit.
TYPES tt_visit TYPE STANDARD TABLE OF ty_visit.
TYPES: BEGIN OF ty_line,
show_id TYPE {{p}}visit-show_id,
tickets TYPE i,
revenue TYPE p LENGTH 15 DECIMALS 2,
END OF ty_line.
TYPES tt_line TYPE STANDARD TABLE OF ty_line.
DATA gv_show_id TYPE {{p}}visit-show_id.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_show FOR gv_show_id.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
METHODS aggregate
IMPORTING it_visits TYPE tt_visit
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD aggregate.
DATA: ls_visit TYPE ty_visit,
ls_line TYPE ty_line.
LOOP AT it_visits INTO ls_visit.
READ TABLE ct_lines INTO ls_line WITH KEY show_id = ls_visit-show_id.
IF sy-subrc = 0.
ls_line-tickets = ls_line-tickets + ls_visit-tickets.
ls_line-revenue = ls_line-revenue + ls_visit-tickets * ls_visit-ticket_price.
MODIFY ct_lines FROM ls_line INDEX sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-show_id = ls_visit-show_id.
ls_line-tickets = ls_visit-tickets.
ls_line-revenue = ls_visit-tickets * ls_visit-ticket_price.
APPEND ls_line TO ct_lines.
ENDIF.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING show_id ASCENDING.
ENDMETHOD.
METHOD display.
DATA: lo_alv TYPE REF TO cl_salv_table,
lx_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 lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
lo_report TYPE REF TO lcl_report.
SELECT show_id tickets ticket_price
FROM {{p}}visit
INTO TABLE lt_visits
WHERE visit_date >= p_from
OR show_id IN s_show
AND tickets > 0.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
lo_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS sums_by_show FOR TESTING.
METHODS sorted_by_revenue FOR TESTING.
METHODS tie_break_by_show FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD sums_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lv_exp TYPE p LENGTH 15 DECIMALS 2,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 5.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'B'.
ls_visit-tickets = 4.
ls_visit-ticket_price = '15.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 15 act = ls_line-tickets ).
lv_exp = 15 * 12.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-tickets ).
lv_exp = 4 * 15.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
ENDMETHOD.
METHOD sorted_by_revenue.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'C'.
ls_visit-tickets = 1.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'D'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'D' act = ls_line-show_id ).
ENDMETHOD.
METHOD tie_break_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'Z'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'Z' act = ls_line-show_id ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,194 @@
REPORT {{p}}planetarium.
TYPES: BEGIN OF ty_visit,
show_id TYPE {{p}}visit-show_id,
tickets TYPE {{p}}visit-tickets,
ticket_price TYPE {{p}}visit-ticket_price,
END OF ty_visit.
TYPES tt_visit TYPE STANDARD TABLE OF ty_visit.
TYPES: BEGIN OF ty_line,
show_id TYPE {{p}}visit-show_id,
tickets TYPE i,
revenue TYPE p LENGTH 15 DECIMALS 2,
END OF ty_line.
TYPES tt_line TYPE STANDARD TABLE OF ty_line.
DATA gv_show_id TYPE {{p}}visit-show_id.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_show FOR gv_show_id.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
METHODS aggregate
IMPORTING it_visits TYPE tt_visit
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD aggregate.
DATA: ls_visit TYPE ty_visit,
ls_line TYPE ty_line.
LOOP AT it_visits INTO ls_visit.
READ TABLE ct_lines INTO ls_line WITH KEY show_id = ls_visit-show_id.
IF sy-subrc = 0.
ls_line-tickets = ls_line-tickets + ls_visit-tickets.
ls_line-revenue = ls_line-revenue + ls_visit-tickets * ls_visit-ticket_price.
MODIFY ct_lines FROM ls_line INDEX sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-show_id = ls_visit-show_id.
ls_line-tickets = ls_visit-tickets.
ls_line-revenue = ls_visit-tickets * ls_visit-ticket_price.
APPEND ls_line TO ct_lines.
ENDIF.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING show_id ASCENDING.
ENDMETHOD.
METHOD display.
DATA: lo_alv TYPE REF TO cl_salv_table,
lx_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 lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
lo_report TYPE REF TO lcl_report.
SELECT show_id tickets ticket_price
FROM {{p}}visit
INTO TABLE lt_visits
WHERE visit_date >= p_from
AND show_id IN s_show
OR tickets > 0.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
lo_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS sums_by_show FOR TESTING.
METHODS sorted_by_revenue FOR TESTING.
METHODS tie_break_by_show FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD sums_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lv_exp TYPE p LENGTH 15 DECIMALS 2,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 5.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'B'.
ls_visit-tickets = 4.
ls_visit-ticket_price = '15.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 15 act = ls_line-tickets ).
lv_exp = 15 * 12.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-tickets ).
lv_exp = 4 * 15.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
ENDMETHOD.
METHOD sorted_by_revenue.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'C'.
ls_visit-tickets = 1.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'D'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'D' act = ls_line-show_id ).
ENDMETHOD.
METHOD tie_break_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'Z'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'Z' act = ls_line-show_id ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,194 @@
REPORT {{p}}planetarium.
TYPES: BEGIN OF ty_visit,
show_id TYPE {{p}}visit-show_id,
tickets TYPE {{p}}visit-tickets,
ticket_price TYPE {{p}}visit-ticket_price,
END OF ty_visit.
TYPES tt_visit TYPE STANDARD TABLE OF ty_visit.
TYPES: BEGIN OF ty_line,
show_id TYPE {{p}}visit-show_id,
tickets TYPE i,
revenue TYPE p LENGTH 15 DECIMALS 2,
END OF ty_line.
TYPES tt_line TYPE STANDARD TABLE OF ty_line.
DATA gv_show_id TYPE {{p}}visit-show_id.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_show FOR gv_show_id.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
METHODS aggregate
IMPORTING it_visits TYPE tt_visit
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD aggregate.
DATA: ls_visit TYPE ty_visit,
ls_line TYPE ty_line.
LOOP AT it_visits INTO ls_visit.
READ TABLE ct_lines INTO ls_line WITH KEY show_id = ls_visit-show_id.
IF sy-subrc = 0.
ls_line-tickets = ls_line-tickets + ls_visit-tickets.
ls_line-revenue = ls_line-revenue + ls_visit-tickets * ls_visit-ticket_price.
MODIFY ct_lines FROM ls_line INDEX sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-show_id = ls_visit-show_id.
ls_line-tickets = ls_visit-tickets.
ls_line-revenue = ls_visit-tickets * ls_visit-ticket_price.
APPEND ls_line TO ct_lines.
ENDIF.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING show_id ASCENDING.
ENDMETHOD.
METHOD display.
DATA: lo_alv TYPE REF TO cl_salv_table,
lx_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 lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
lo_report TYPE REF TO lcl_report.
SELECT show_id tickets ticket_price
FROM {{p}}visit
INTO TABLE lt_visits
WHERE visit_date >= p_from
AND show_id IN s_show
AND tickets <= 0.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
lo_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS sums_by_show FOR TESTING.
METHODS sorted_by_revenue FOR TESTING.
METHODS tie_break_by_show FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD sums_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lv_exp TYPE p LENGTH 15 DECIMALS 2,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 5.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'B'.
ls_visit-tickets = 4.
ls_visit-ticket_price = '15.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 15 act = ls_line-tickets ).
lv_exp = 15 * 12.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-tickets ).
lv_exp = 4 * 15.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
ENDMETHOD.
METHOD sorted_by_revenue.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'C'.
ls_visit-tickets = 1.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'D'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'D' act = ls_line-show_id ).
ENDMETHOD.
METHOD tie_break_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'Z'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'Z' act = ls_line-show_id ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,43 @@
{
"id": "G0162",
"pool": "eval",
"object_type": "PROG",
"category": "G",
"attempts": [
{
"stage": "bundle",
"errors": [
"seed/visit_seed.clas.abap line 9: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"INSERT\"",
"hidden/t60_hidden.clas.abap line 52: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"ASSIGN\"",
"hidden/t60_hidden.clas.abap line 53: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"ASSIGN\"",
"hidden/t60_hidden.clas.abap line 55: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"rv_value\"",
"hidden/t60_hidden.clas.abap line 105: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"DATA\"",
"hidden/t60_hidden.clas.abap line 112: syntax error for release v702 (abaplint): Statement does not exist in the configured ABAP version(or a parser error), \"DATA\""
],
"by_check": {
"abaplint": 6
}
},
{
"stage": "validate",
"oracle": 0,
"null": 0
},
{
"stage": "validate",
"oracle": 67.5,
"null": 0
},
{
"stage": "validate",
"oracle": 100.0,
"null": 0,
"mutation": {
"valid": 5,
"killed": 5,
"ok": true
}
}
],
"accepted": true
}

View File

@@ -0,0 +1,243 @@
CLASS {{p}}t60_hidden DEFINITION PUBLIC FINAL CREATE PUBLIC
FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
TYPES tt_show TYPE RANGE OF {{p}}visit-show_id.
METHODS run
IMPORTING iv_from TYPE d
it_show TYPE tt_show OPTIONAL
RETURNING VALUE(rr_data) TYPE REF TO data.
METHODS value_of
IMPORTING ir_data TYPE REF TO data
iv_row TYPE i
iv_col TYPE string
RETURNING VALUE(rv_value) TYPE string.
METHODS canon
IMPORTING iv_text TYPE string
RETURNING VALUE(rv_canon) TYPE string.
METHODS lines_of
IMPORTING ir_data TYPE REF TO data
RETURNING VALUE(rv_lines) TYPE i.
METHODS all_shows FOR TESTING.
METHODS sorted_by_revenue FOR TESTING.
METHODS revenue_values FOR TESTING.
METHODS ticket_sums FOR TESTING.
METHODS tie_break_by_show FOR TESTING.
METHODS date_filter FOR TESTING.
METHODS date_boundary FOR TESTING.
METHODS show_filter FOR TESTING.
METHODS zero_tickets_excluded FOR TESTING.
METHODS no_data FOR TESTING.
ENDCLASS.
CLASS {{p}}t60_hidden IMPLEMENTATION.
METHOD run.
cl_salv_bs_runtime_info=>set( display = abap_false metadata = abap_false data = abap_true ).
SUBMIT {{p}}planetarium WITH p_from = iv_from WITH s_show IN it_show AND RETURN.
TRY.
cl_salv_bs_runtime_info=>get_data_ref( IMPORTING r_data = rr_data ).
CATCH cx_salv_bs_sc_runtime_info.
ENDTRY.
cl_salv_bs_runtime_info=>clear_all( ).
ENDMETHOD.
METHOD lines_of.
FIELD-SYMBOLS <lt_data> TYPE STANDARD TABLE.
DATA lv_lines TYPE i.
IF ir_data IS BOUND.
ASSIGN ir_data->* TO <lt_data>.
lv_lines = lines( <lt_data> ).
ENDIF.
rv_lines = lv_lines.
ENDMETHOD.
METHOD value_of.
FIELD-SYMBOLS: <lt_data> TYPE STANDARD TABLE,
<ls_line> TYPE any,
<lv_value> TYPE any.
DATA: lv_index TYPE i,
lv_text TYPE string.
ASSIGN ir_data->* TO <lt_data>.
lv_index = iv_row.
READ TABLE <lt_data> ASSIGNING <ls_line> INDEX lv_index.
cl_abap_unit_assert=>assert_subrc( exp = 0 msg = 'Row is missing' ).
ASSIGN COMPONENT iv_col OF STRUCTURE <ls_line> TO <lv_value>.
cl_abap_unit_assert=>assert_subrc( exp = 0 msg = 'Column is missing' ).
lv_text = <lv_value>.
CONDENSE lv_text.
rv_value = lv_text.
ENDMETHOD.
METHOD canon.
DATA: lv_len TYPE i,
lv_pos TYPE i,
lv_ch TYPE c LENGTH 1,
lv_int TYPE string,
lv_frac TYPE string,
lv_after TYPE c LENGTH 1,
lv_sign TYPE string,
lv_tail TYPE i.
lv_len = strlen( iv_text ).
DO lv_len TIMES.
lv_pos = sy-index - 1.
lv_ch = iv_text+lv_pos(1).
IF lv_ch CA '0123456789'.
IF lv_after = 'X'.
CONCATENATE lv_frac lv_ch INTO lv_frac.
ELSE.
CONCATENATE lv_int lv_ch INTO lv_int.
ENDIF.
ELSEIF lv_ch = '.' OR lv_ch = ','.
lv_after = 'X'.
ELSEIF lv_ch = '-'.
lv_sign = '-'.
ENDIF.
ENDDO.
WHILE strlen( lv_int ) > 1 AND lv_int(1) = '0'.
lv_int = lv_int+1.
ENDWHILE.
IF lv_int IS INITIAL.
lv_int = '0'.
ENDIF.
lv_tail = strlen( lv_frac ).
WHILE lv_tail > 0.
lv_pos = lv_tail - 1.
IF lv_frac+lv_pos(1) <> '0'.
EXIT.
ENDIF.
lv_tail = lv_tail - 1.
ENDWHILE.
lv_frac = lv_frac(lv_tail).
CONCATENATE lv_sign lv_int '.' lv_frac INTO rv_canon.
ENDMETHOD.
METHOD all_shows.
DATA: lr_data TYPE REF TO data,
lv_lines TYPE i.
lr_data = run( '20260101' ).
lv_lines = lines_of( lr_data ).
cl_abap_unit_assert=>assert_equals( exp = 5 act = lv_lines ).
ENDMETHOD.
METHOD sorted_by_revenue.
DATA: lr_data TYPE REF TO data,
lv_val TYPE string.
lr_data = run( '20260101' ).
lv_val = value_of( ir_data = lr_data iv_row = 1 iv_col = 'SHOW_ID' ).
cl_abap_unit_assert=>assert_equals( exp = 'ROCK' act = lv_val ).
lv_val = value_of( ir_data = lr_data iv_row = 2 iv_col = 'SHOW_ID' ).
cl_abap_unit_assert=>assert_equals( exp = 'PLNT' act = lv_val ).
lv_val = value_of( ir_data = lr_data iv_row = 3 iv_col = 'SHOW_ID' ).
cl_abap_unit_assert=>assert_equals( exp = 'KIDS' act = lv_val ).
ENDMETHOD.
METHOD revenue_values.
DATA: lr_data TYPE REF TO data,
lv_val TYPE string.
lr_data = run( '20260101' ).
lv_val = canon( value_of( ir_data = lr_data iv_row = 1 iv_col = 'REVENUE' ) ).
cl_abap_unit_assert=>assert_equals( exp = canon( '190.00' ) act = lv_val ).
lv_val = canon( value_of( ir_data = lr_data iv_row = 2 iv_col = 'REVENUE' ) ).
cl_abap_unit_assert=>assert_equals( exp = canon( '180.00' ) act = lv_val ).
lv_val = canon( value_of( ir_data = lr_data iv_row = 3 iv_col = 'REVENUE' ) ).
cl_abap_unit_assert=>assert_equals( exp = canon( '150.00' ) act = lv_val ).
ENDMETHOD.
METHOD ticket_sums.
DATA: lr_data TYPE REF TO data,
lv_val TYPE string.
lr_data = run( '20260101' ).
lv_val = canon( value_of( ir_data = lr_data iv_row = 1 iv_col = 'TICKETS' ) ).
cl_abap_unit_assert=>assert_equals( exp = canon( '20' ) act = lv_val ).
lv_val = canon( value_of( ir_data = lr_data iv_row = 2 iv_col = 'TICKETS' ) ).
cl_abap_unit_assert=>assert_equals( exp = canon( '15' ) act = lv_val ).
lv_val = canon( value_of( ir_data = lr_data iv_row = 3 iv_col = 'TICKETS' ) ).
cl_abap_unit_assert=>assert_equals( exp = canon( '30' ) act = lv_val ).
ENDMETHOD.
METHOD tie_break_by_show.
DATA: lr_data TYPE REF TO data,
lv_val TYPE string.
lr_data = run( '20260101' ).
lv_val = value_of( ir_data = lr_data iv_row = 4 iv_col = 'SHOW_ID' ).
cl_abap_unit_assert=>assert_equals( exp = 'LASR' act = lv_val ).
lv_val = value_of( ir_data = lr_data iv_row = 5 iv_col = 'SHOW_ID' ).
cl_abap_unit_assert=>assert_equals( exp = 'MAGI' act = lv_val ).
ENDMETHOD.
METHOD date_filter.
DATA: lr_data TYPE REF TO data,
lv_lines TYPE i,
lv_val TYPE string.
lr_data = run( '20260109' ).
lv_lines = lines_of( lr_data ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_lines ).
lv_val = value_of( ir_data = lr_data iv_row = 1 iv_col = 'SHOW_ID' ).
cl_abap_unit_assert=>assert_equals( exp = 'KIDS' act = lv_val ).
lv_val = value_of( ir_data = lr_data iv_row = 2 iv_col = 'SHOW_ID' ).
cl_abap_unit_assert=>assert_equals( exp = 'MAGI' act = lv_val ).
ENDMETHOD.
METHOD date_boundary.
DATA: lr_data TYPE REF TO data,
lv_lines TYPE i,
lv_val TYPE string.
lr_data = run( '20260106' ).
lv_lines = lines_of( lr_data ).
cl_abap_unit_assert=>assert_equals( exp = 5 act = lv_lines ).
lv_val = value_of( ir_data = lr_data iv_row = 1 iv_col = 'SHOW_ID' ).
cl_abap_unit_assert=>assert_equals( exp = 'ROCK' act = lv_val ).
lv_val = value_of( ir_data = lr_data iv_row = 2 iv_col = 'SHOW_ID' ).
cl_abap_unit_assert=>assert_equals( exp = 'KIDS' act = lv_val ).
lv_val = value_of( ir_data = lr_data iv_row = 5 iv_col = 'SHOW_ID' ).
cl_abap_unit_assert=>assert_equals( exp = 'PLNT' act = lv_val ).
lv_val = canon( value_of( ir_data = lr_data iv_row = 5 iv_col = 'TICKETS' ) ).
cl_abap_unit_assert=>assert_equals( exp = canon( '5' ) act = lv_val ).
ENDMETHOD.
METHOD show_filter.
DATA: lr_data TYPE REF TO data,
lt_show TYPE tt_show,
ls_show TYPE LINE OF tt_show,
lv_lines TYPE i,
lv_val TYPE string.
ls_show-sign = 'I'.
ls_show-option = 'EQ'.
ls_show-low = 'ROCK'.
APPEND ls_show TO lt_show.
lr_data = run( iv_from = '20260101' it_show = lt_show ).
lv_lines = lines_of( lr_data ).
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_lines ).
lv_val = canon( value_of( ir_data = lr_data iv_row = 1 iv_col = 'TICKETS' ) ).
cl_abap_unit_assert=>assert_equals( exp = canon( '20' ) act = lv_val ).
lv_val = canon( value_of( ir_data = lr_data iv_row = 1 iv_col = 'REVENUE' ) ).
cl_abap_unit_assert=>assert_equals( exp = canon( '190.00' ) act = lv_val ).
ENDMETHOD.
METHOD zero_tickets_excluded.
DATA: lr_data TYPE REF TO data,
lt_show TYPE tt_show,
ls_show TYPE LINE OF tt_show,
lv_lines TYPE i.
ls_show-sign = 'I'.
ls_show-option = 'EQ'.
ls_show-low = 'OPER'.
APPEND ls_show TO lt_show.
lr_data = run( iv_from = '20260101' it_show = lt_show ).
lv_lines = lines_of( lr_data ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_lines ).
ENDMETHOD.
METHOD no_data.
DATA: lr_data TYPE REF TO data,
lv_lines TYPE i.
lr_data = run( '20260201' ).
lv_lines = lines_of( lr_data ).
cl_abap_unit_assert=>assert_equals( exp = 0 act = lv_lines ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,86 @@
{
"task": "G0162",
"mutants": [
{
"object": "{{P}}PLANETARIUM",
"mutant": "line 40: * -> / (arith)",
"status": "killed",
"hidden": "7/10",
"failed_tests": [
"REVENUE_VALUES",
"SORTED_BY_REVENUE",
"TICKET_SUMS"
]
},
{
"object": "{{P}}PLANETARIUM",
"mutant": "line 77: >= -> < (rel)",
"status": "killed",
"hidden": "1/10",
"failed_tests": [
"ALL_SHOWS",
"DATE_BOUNDARY",
"DATE_FILTER",
"NO_DATA",
"REVENUE_VALUES",
"SHOW_FILTER",
"SORTED_BY_REVENUE",
"TICKET_SUMS",
"TIE_BREAK_BY_SHOW"
]
},
{
"object": "{{P}}PLANETARIUM",
"mutant": "line 78: AND -> OR (logic)",
"status": "killed",
"hidden": "2/10",
"failed_tests": [
"ALL_SHOWS",
"DATE_BOUNDARY",
"DATE_FILTER",
"NO_DATA",
"REVENUE_VALUES",
"SHOW_FILTER",
"TICKET_SUMS",
"ZERO_TICKETS_EXCLUDED"
]
},
{
"object": "{{P}}PLANETARIUM",
"mutant": "line 79: AND -> OR (logic)",
"status": "killed",
"hidden": "2/10",
"failed_tests": [
"ALL_SHOWS",
"DATE_BOUNDARY",
"DATE_FILTER",
"NO_DATA",
"REVENUE_VALUES",
"SHOW_FILTER",
"TICKET_SUMS",
"ZERO_TICKETS_EXCLUDED"
]
},
{
"object": "{{P}}PLANETARIUM",
"mutant": "line 79: > -> <= (rel)",
"status": "killed",
"hidden": "1/10",
"failed_tests": [
"ALL_SHOWS",
"DATE_BOUNDARY",
"DATE_FILTER",
"REVENUE_VALUES",
"SHOW_FILTER",
"SORTED_BY_REVENUE",
"TICKET_SUMS",
"TIE_BREAK_BY_SHOW",
"ZERO_TICKETS_EXCLUDED"
]
}
],
"valid": 5,
"killed": 5,
"kill_rate": 1.0,
"ok": true
}

View File

@@ -0,0 +1,194 @@
REPORT {{p}}planetarium.
TYPES: BEGIN OF ty_visit,
show_id TYPE {{p}}visit-show_id,
tickets TYPE {{p}}visit-tickets,
ticket_price TYPE {{p}}visit-ticket_price,
END OF ty_visit.
TYPES tt_visit TYPE STANDARD TABLE OF ty_visit.
TYPES: BEGIN OF ty_line,
show_id TYPE {{p}}visit-show_id,
tickets TYPE i,
revenue TYPE p LENGTH 15 DECIMALS 2,
END OF ty_line.
TYPES tt_line TYPE STANDARD TABLE OF ty_line.
DATA gv_show_id TYPE {{p}}visit-show_id.
PARAMETERS p_from TYPE d OBLIGATORY.
SELECT-OPTIONS s_show FOR gv_show_id.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
METHODS aggregate
IMPORTING it_visits TYPE tt_visit
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD aggregate.
DATA: ls_visit TYPE ty_visit,
ls_line TYPE ty_line.
LOOP AT it_visits INTO ls_visit.
READ TABLE ct_lines INTO ls_line WITH KEY show_id = ls_visit-show_id.
IF sy-subrc = 0.
ls_line-tickets = ls_line-tickets + ls_visit-tickets.
ls_line-revenue = ls_line-revenue + ls_visit-tickets * ls_visit-ticket_price.
MODIFY ct_lines FROM ls_line INDEX sy-tabix.
ELSE.
CLEAR ls_line.
ls_line-show_id = ls_visit-show_id.
ls_line-tickets = ls_visit-tickets.
ls_line-revenue = ls_visit-tickets * ls_visit-ticket_price.
APPEND ls_line TO ct_lines.
ENDIF.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING show_id ASCENDING.
ENDMETHOD.
METHOD display.
DATA: lo_alv TYPE REF TO cl_salv_table,
lx_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 lx_error.
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
lo_report TYPE REF TO lcl_report.
SELECT show_id tickets ticket_price
FROM {{p}}visit
INTO TABLE lt_visits
WHERE visit_date >= p_from
AND show_id IN s_show
AND tickets > 0.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
lo_report->display( CHANGING ct_lines = lt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS sums_by_show FOR TESTING.
METHODS sorted_by_revenue FOR TESTING.
METHODS tie_break_by_show FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD sums_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lv_exp TYPE p LENGTH 15 DECIMALS 2,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 5.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'B'.
ls_visit-tickets = 4.
ls_visit-ticket_price = '15.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = lines( lt_lines ) ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 15 act = ls_line-tickets ).
lv_exp = 15 * 12.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'B' act = ls_line-show_id ).
cl_abap_unit_assert=>assert_equals( exp = 4 act = ls_line-tickets ).
lv_exp = 4 * 15.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
ENDMETHOD.
METHOD sorted_by_revenue.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'C'.
ls_visit-tickets = 1.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'D'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'D' act = ls_line-show_id ).
ENDMETHOD.
METHOD tie_break_by_show.
DATA: lt_visits TYPE tt_visit,
lt_lines TYPE tt_line,
ls_visit TYPE ty_visit,
ls_line TYPE ty_line,
lo_report TYPE REF TO lcl_report.
CLEAR ls_visit.
ls_visit-show_id = 'Z'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CLEAR ls_visit.
ls_visit-show_id = 'A'.
ls_visit-tickets = 2.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visits.
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_visits = lt_visits
CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_line-show_id ).
READ TABLE lt_lines INTO ls_line INDEX 2.
cl_abap_unit_assert=>assert_equals( exp = 'Z' act = ls_line-show_id ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,13 @@
@EndUserText.label : 'Planetarium visits'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table {{p}}visit {
key client : abap.clnt not null;
key visit_id : abap.int4 not null;
show_id : abap.char(4);
visit_date : abap.dats;
tickets : abap.int4;
ticket_price : abap.dec(7,2);
}

View File

@@ -0,0 +1,89 @@
CLASS {{p}}visit_seed DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
ENDCLASS.
CLASS {{p}}visit_seed IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA: lt_visit TYPE STANDARD TABLE OF {{p}}visit,
ls_visit TYPE {{p}}visit.
DELETE FROM {{p}}visit.
CLEAR ls_visit.
ls_visit-visit_id = 1.
ls_visit-show_id = 'PLNT'.
ls_visit-visit_date = '20260105'.
ls_visit-tickets = 10.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visit.
CLEAR ls_visit.
ls_visit-visit_id = 2.
ls_visit-show_id = 'PLNT'.
ls_visit-visit_date = '20260106'.
ls_visit-tickets = 5.
ls_visit-ticket_price = '12.00'.
APPEND ls_visit TO lt_visit.
CLEAR ls_visit.
ls_visit-visit_id = 3.
ls_visit-show_id = 'ROCK'.
ls_visit-visit_date = '20260106'.
ls_visit-tickets = 20.
ls_visit-ticket_price = '9.50'.
APPEND ls_visit TO lt_visit.
CLEAR ls_visit.
ls_visit-visit_id = 4.
ls_visit-show_id = 'ROCK'.
ls_visit-visit_date = '20251220'.
ls_visit-tickets = 8.
ls_visit-ticket_price = '9.50'.
APPEND ls_visit TO lt_visit.
CLEAR ls_visit.
ls_visit-visit_id = 5.
ls_visit-show_id = 'LASR'.
ls_visit-visit_date = '20260107'.
ls_visit-tickets = 0.
ls_visit-ticket_price = '15.00'.
APPEND ls_visit TO lt_visit.
CLEAR ls_visit.
ls_visit-visit_id = 6.
ls_visit-show_id = 'LASR'.
ls_visit-visit_date = '20260108'.
ls_visit-tickets = 4.
ls_visit-ticket_price = '15.00'.
APPEND ls_visit TO lt_visit.
CLEAR ls_visit.
ls_visit-visit_id = 7.
ls_visit-show_id = 'KIDS'.
ls_visit-visit_date = '20260109'.
ls_visit-tickets = 30.
ls_visit-ticket_price = '5.00'.
APPEND ls_visit TO lt_visit.
CLEAR ls_visit.
ls_visit-visit_id = 8.
ls_visit-show_id = 'OPER'.
ls_visit-visit_date = '20260110'.
ls_visit-tickets = 0.
ls_visit-ticket_price = '20.00'.
APPEND ls_visit TO lt_visit.
CLEAR ls_visit.
ls_visit-visit_id = 9.
ls_visit-show_id = 'MAGI'.
ls_visit-visit_date = '20260111'.
ls_visit-tickets = 4.
ls_visit-ticket_price = '15.00'.
APPEND ls_visit TO lt_visit.
INSERT {{p}}visit FROM TABLE lt_visit.
out->write( sy-dbcnt ).
ENDMETHOD.
ENDCLASS.

View File

@@ -0,0 +1,48 @@
# 1. Goal
Show the ticket sales of each planetarium show in an ALV list. The operations
team uses the list to compare the shows of a period.
# 2. Open questions
None.
# 3. Context
- The table {{P}}VISIT exists in package $TMP. The table contains data.
The fields are:
- VISIT_ID (INT4, key): the number of the visit.
- SHOW_ID (CHAR 4): the show. Every show ID has exactly 4 characters.
- VISIT_DATE (DATS): the date of the visit.
- TICKETS (INT4): the number of tickets that were sold.
- TICKET_PRICE (DEC 7,2): the price of one ticket.
# 4. Contract
- Create the executable program {{P}}PLANETARIUM in package $TMP.
- The selection screen has these fields:
- The parameter P_FROM. Type DATS. Mandatory. It is the first visit date to
include.
- The select-option S_SHOW for the show ID.
- Show the result with CL_SALV_TABLE. The output table has these columns:
- SHOW_ID. Type CHAR 4. The show.
- TICKETS. Type INT4. The sum of the tickets of the show.
- REVENUE. Type DEC with length 15 and 2 decimal places. The sum of the
revenue of the show.
# 5. Business rules
1. Include a visit only if VISIT_DATE is on or after P_FROM.
2. Include a visit only if SHOW_ID is in S_SHOW.
3. Include a visit only if TICKETS is greater than zero.
4. The revenue of a visit is TICKETS multiplied by TICKET_PRICE.
5. Show one line for each show that has at least one included visit.
6. Sort the lines by REVENUE. The highest revenue comes first.
7. If two shows have the same revenue, sort these two shows by SHOW_ID in
ascending order.
# 6. Constraints
- Release target: 7.02. The program must compile on release 7.02. Do not use
syntax that is newer than release 7.02.
- Coding standards: Clean ABAP. A method has fewer than 40 statements.
- Out of scope: do not change the table {{P}}VISIT.
# 7. Acceptance
- The program is active and has no syntax error.
- The hidden tests pass.
- Write ABAP Unit tests as local test classes in the program.

View File

@@ -0,0 +1,60 @@
{
"id": "G0162",
"category": "G",
"object_type": "PROG",
"difficulty": 2,
"release_target": "v702",
"expected_outcome": "implement",
"budget": {
"max_tool_calls": 40,
"max_activations": 10
},
"seed": [
{
"type": "TABL",
"name": "{{P}}VISIT",
"file": "seed/visit.tabl.asabap",
"description": "Planetarium visits"
},
{
"type": "CLAS",
"name": "{{P}}VISIT_SEED",
"file": "seed/visit_seed.clas.abap",
"description": "T60 seed data",
"run": true
}
],
"contract": [
{
"type": "PROG",
"name": "{{P}}PLANETARIUM",
"parameters": [
"p_from",
"s_show"
]
}
],
"out_of_scope": [
"{{P}}VISIT"
],
"hidden_tests": [
{
"type": "CLAS",
"name": "{{P}}T60_HIDDEN",
"file": "hidden/t60_hidden.clas.abap",
"description": "T60 hidden tests"
}
],
"reference": [
{
"type": "PROG",
"name": "{{P}}PLANETARIUM",
"file": "reference/planetarium.prog.abap",
"description": "Ticket sales per show"
}
],
"craft_checks": [
"no_newer_syntax",
"method_length"
]
}