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.