Files
abap-llm/tasks_gen/train/G1110/seed/scrap_pay.prog.abap
2026-10-05 18:02:52 +02:00

106 lines
3.2 KiB
ABAP

REPORT {{p}}scrap_pay.
*--------------------------------------------------------------------*
* Payout list of the recycling yard.
* Legacy program. The output columns and the values must not change.
*--------------------------------------------------------------------*
TYPES: BEGIN OF ty_out,
metal TYPE {{p}}scrap-metal,
total_kg TYPE p LENGTH 13 DECIMALS 3,
total_pay TYPE p LENGTH 15 DECIMALS 2,
deliv_cnt TYPE i,
END OF ty_out.
DATA: gv_metal TYPE {{p}}scrap-metal,
gt_scrap TYPE STANDARD TABLE OF {{p}}scrap,
gt_out TYPE STANDARD TABLE OF ty_out,
gs_out TYPE ty_out.
CONSTANTS: c_bonus TYPE p LENGTH 5 DECIMALS 2 VALUE '1.10',
c_limit TYPE p LENGTH 13 DECIMALS 3 VALUE '500.000'.
PARAMETERS p_date TYPE d OBLIGATORY.
SELECT-OPTIONS s_metal FOR gv_metal.
START-OF-SELECTION.
PERFORM read_data.
PERFORM build_totals.
PERFORM add_bonus.
PERFORM sort_list.
PERFORM show_list.
*&---------------------------------------------------------------------*
*& Form read_data
*&---------------------------------------------------------------------*
FORM read_data.
CLEAR gt_scrap.
SELECT * FROM {{p}}scrap INTO TABLE gt_scrap
WHERE deliv_date = p_date
AND metal IN s_metal.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form build_totals
*&---------------------------------------------------------------------*
FORM build_totals.
DATA: ls_scrap TYPE {{p}}scrap,
lv_pay TYPE p LENGTH 15 DECIMALS 2,
lv_index TYPE sy-tabix.
CLEAR gt_out.
LOOP AT gt_scrap INTO ls_scrap.
CLEAR lv_index.
READ TABLE gt_out INTO gs_out WITH KEY metal = ls_scrap-metal.
IF sy-subrc = 0.
lv_index = sy-tabix.
ELSE.
CLEAR gs_out.
gs_out-metal = ls_scrap-metal.
ENDIF.
lv_pay = ls_scrap-weight_kg * ls_scrap-price_kg.
gs_out-total_kg = gs_out-total_kg + ls_scrap-weight_kg.
gs_out-total_pay = gs_out-total_pay + lv_pay.
gs_out-deliv_cnt = gs_out-deliv_cnt + 1.
IF lv_index IS INITIAL.
APPEND gs_out TO gt_out.
ELSE.
MODIFY gt_out FROM gs_out INDEX lv_index.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form add_bonus
*&---------------------------------------------------------------------*
FORM add_bonus.
LOOP AT gt_out INTO gs_out.
IF gs_out-total_kg >= c_limit.
gs_out-total_pay = gs_out-total_pay * c_bonus.
MODIFY gt_out FROM gs_out.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form sort_list
*&---------------------------------------------------------------------*
FORM sort_list.
SORT gt_out BY total_pay DESCENDING.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form show_list
*&---------------------------------------------------------------------*
FORM show_list.
DATA lo_alv TYPE REF TO cl_salv_table.
TRY.
cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
CHANGING t_table = gt_out ).
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lx_error).
MESSAGE lx_error TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDFORM.