Files
abap-llm/tasks_gen/train/G1106/reference/bake_sales.prog.abap
2026-10-05 18:02:52 +02:00

174 lines
5.4 KiB
ABAP

REPORT {{p}}bake_sales.
DATA gv_shop TYPE {{p}}deliv-shop.
PARAMETERS p_date TYPE d OBLIGATORY.
SELECT-OPTIONS s_shop FOR gv_shop.
CLASS lcl_report DEFINITION FINAL.
PUBLIC SECTION.
TYPES: BEGIN OF ty_raw,
shop TYPE {{p}}deliv-shop,
loaves TYPE {{p}}deliv-loaves,
unit_price TYPE {{p}}deliv-unit_price,
END OF ty_raw.
TYPES tt_raw TYPE STANDARD TABLE OF ty_raw.
TYPES: BEGIN OF ty_line,
shop TYPE {{p}}deliv-shop,
loaves TYPE i,
revenue TYPE {{p}}deliv-unit_price,
deliveries TYPE i,
END OF ty_line.
TYPES tt_line TYPE STANDARD TABLE OF ty_line.
METHODS aggregate
IMPORTING it_raw TYPE tt_raw
CHANGING ct_lines TYPE tt_line.
METHODS display
CHANGING ct_lines TYPE tt_line.
ENDCLASS.
CLASS lcl_report IMPLEMENTATION.
METHOD aggregate.
DATA lt_sorted TYPE tt_raw.
DATA ls_raw TYPE ty_raw.
DATA ls_line TYPE ty_line.
CLEAR ct_lines.
lt_sorted = it_raw.
SORT lt_sorted BY shop.
LOOP AT lt_sorted INTO ls_raw.
AT NEW shop.
CLEAR ls_line.
ls_line-shop = ls_raw-shop.
ENDAT.
ls_line-loaves = ls_line-loaves + ls_raw-loaves.
ls_line-revenue = ls_line-revenue + ls_raw-loaves * ls_raw-unit_price.
ls_line-deliveries = ls_line-deliveries + 1.
AT END OF shop.
APPEND ls_line TO ct_lines.
ENDAT.
ENDLOOP.
SORT ct_lines BY revenue DESCENDING shop ASCENDING.
ENDMETHOD.
METHOD display.
DATA lo_alv TYPE REF TO cl_salv_table.
DATA 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.
DATA go_report TYPE REF TO lcl_report.
DATA gt_raw TYPE lcl_report=>tt_raw.
DATA gt_lines TYPE lcl_report=>tt_line.
START-OF-SELECTION.
SELECT * FROM {{p}}deliv
WHERE deliv_date = p_date
AND shop IN s_shop
INTO CORRESPONDING FIELDS OF TABLE gt_raw.
CREATE OBJECT go_report.
go_report->aggregate( EXPORTING it_raw = gt_raw CHANGING ct_lines = gt_lines ).
go_report->display( CHANGING ct_lines = gt_lines ).
CLASS ltc_report DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION.
METHODS add_raw
IMPORTING iv_shop TYPE {{p}}deliv-shop
iv_loaves TYPE i
iv_price TYPE {{p}}deliv-unit_price
CHANGING ct_raw TYPE lcl_report=>tt_raw.
METHODS sums_one_shop FOR TESTING.
METHODS sorts_by_revenue FOR TESTING.
METHODS keeps_shops_apart FOR TESTING.
ENDCLASS.
CLASS ltc_report IMPLEMENTATION.
METHOD add_raw.
DATA ls_raw TYPE lcl_report=>ty_raw.
ls_raw-shop = iv_shop.
ls_raw-loaves = iv_loaves.
ls_raw-unit_price = iv_price.
APPEND ls_raw TO ct_raw.
ENDMETHOD.
METHOD sums_one_shop.
DATA lt_raw TYPE lcl_report=>tt_raw.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
DATA lo_report TYPE REF TO lcl_report.
DATA lv_exp TYPE {{p}}deliv-unit_price.
DATA lv_count TYPE i.
add_raw( EXPORTING iv_shop = 'NORD' iv_loaves = 10 iv_price = '2.00'
CHANGING ct_raw = lt_raw ).
add_raw( EXPORTING iv_shop = 'NORD' iv_loaves = 5 iv_price = '4.00'
CHANGING ct_raw = lt_raw ).
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_raw = lt_raw CHANGING ct_lines = lt_lines ).
DESCRIBE TABLE lt_lines LINES lv_count.
cl_abap_unit_assert=>assert_equals( exp = 1 act = lv_count ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
cl_abap_unit_assert=>assert_equals( exp = 15 act = ls_line-loaves ).
cl_abap_unit_assert=>assert_equals( exp = 2 act = ls_line-deliveries ).
lv_exp = '40.00'.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-revenue ).
ENDMETHOD.
METHOD sorts_by_revenue.
DATA lt_raw TYPE lcl_report=>tt_raw.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA ls_line TYPE lcl_report=>ty_line.
DATA lo_report TYPE REF TO lcl_report.
DATA lv_exp TYPE {{p}}deliv-shop.
add_raw( EXPORTING iv_shop = 'A' iv_loaves = 10 iv_price = '1.00'
CHANGING ct_raw = lt_raw ).
add_raw( EXPORTING iv_shop = 'B' iv_loaves = 10 iv_price = '9.00'
CHANGING ct_raw = lt_raw ).
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_raw = lt_raw CHANGING ct_lines = lt_lines ).
READ TABLE lt_lines INTO ls_line INDEX 1.
cl_abap_unit_assert=>assert_subrc( exp = 0 ).
lv_exp = 'B'.
cl_abap_unit_assert=>assert_equals( exp = lv_exp act = ls_line-shop ).
ENDMETHOD.
METHOD keeps_shops_apart.
DATA lt_raw TYPE lcl_report=>tt_raw.
DATA lt_lines TYPE lcl_report=>tt_line.
DATA lo_report TYPE REF TO lcl_report.
DATA lv_count TYPE i.
add_raw( EXPORTING iv_shop = 'A' iv_loaves = 1 iv_price = '1.00'
CHANGING ct_raw = lt_raw ).
add_raw( EXPORTING iv_shop = 'B' iv_loaves = 1 iv_price = '1.00'
CHANGING ct_raw = lt_raw ).
CREATE OBJECT lo_report.
lo_report->aggregate( EXPORTING it_raw = lt_raw CHANGING ct_lines = lt_lines ).
DESCRIBE TABLE lt_lines LINES lv_count.
cl_abap_unit_assert=>assert_equals( exp = 2 act = lv_count ).
ENDMETHOD.
ENDCLASS.