106 lines
3.2 KiB
ABAP
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.
|