REPORT {{p}}carwash_rpt. TABLES: {{p}}carwash, {{p}}washpgm. PARAMETERS: p_from TYPE d OBLIGATORY, p_to TYPE d OBLIGATORY. SELECT-OPTIONS: s_prog FOR {{p}}carwash-wash_prog. TYPES: BEGIN OF ty_out, wash_prog TYPE {{p}}carwash-wash_prog, prog_text TYPE {{p}}washpgm-prog_text, washes TYPE i, revenue TYPE {{p}}carwash-price, vip_washes TYPE i, vip_revenue TYPE {{p}}carwash-price, END OF ty_out. TYPES: BEGIN OF ty_data, wash_prog TYPE {{p}}carwash-wash_prog, price TYPE {{p}}carwash-price, cust_type TYPE {{p}}carwash-cust_type, END OF ty_data. DATA: gt_out TYPE STANDARD TABLE OF ty_out WITH HEADER LINE, gt_data TYPE STANDARD TABLE OF ty_data WITH HEADER LINE. DATA: gv_text TYPE {{p}}washpgm-prog_text, gv_alv TYPE REF TO cl_salv_table. START-OF-SELECTION. SELECT * FROM {{p}}carwash INTO CORRESPONDING FIELDS OF TABLE gt_data WHERE wash_date >= p_from AND wash_date <= p_to. LOOP AT gt_data. IF gt_data-wash_prog IN s_prog. READ TABLE gt_out WITH KEY wash_prog = gt_data-wash_prog. IF sy-subrc = 0. gt_out-washes = gt_out-washes + 1. gt_out-revenue = gt_out-revenue + gt_data-price. IF gt_data-cust_type = 'VIP'. gt_out-vip_washes = gt_out-vip_washes + 1. gt_out-vip_revenue = gt_out-vip_revenue + gt_data-price. ENDIF. MODIFY gt_out INDEX sy-tabix. ELSE. CLEAR gt_out. gt_out-wash_prog = gt_data-wash_prog. gt_out-washes = 1. gt_out-revenue = gt_data-price. IF gt_data-cust_type = 'VIP'. gt_out-vip_washes = 1. gt_out-vip_revenue = gt_data-price. ELSE. gt_out-vip_washes = 0. gt_out-vip_revenue = 0. ENDIF. APPEND gt_out. ENDIF. ENDIF. ENDLOOP. LOOP AT gt_out. CLEAR gv_text. SELECT SINGLE prog_text FROM {{p}}washpgm INTO gv_text WHERE wash_prog = gt_out-wash_prog. gt_out-prog_text = gv_text. MODIFY gt_out. ENDLOOP. SORT gt_out BY revenue DESCENDING. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = gv_alv CHANGING t_table = gt_out[] ). gv_alv->display( ). CATCH cx_salv_msg. ENDTRY.