FUNCTION {{p}}track_fee IMPORTING it_paths TYPE STANDARD TABLE EXPORTING et_fees TYPE STANDARD TABLE EXCEPTIONS invalid_distance invalid_category. TYPES: BEGIN OF ty_sum, train_cat TYPE c LENGTH 2, path_count TYPE i, total_km TYPE p LENGTH 13 DECIMALS 2, total_fee TYPE p LENGTH 13 DECIMALS 2, END OF ty_sum. DATA: lt_sums TYPE SORTED TABLE OF ty_sum WITH UNIQUE KEY train_cat, lv_cat TYPE c LENGTH 2, lv_km TYPE p LENGTH 13 DECIMALS 2, lv_flag TYPE c LENGTH 1, lv_rate TYPE p LENGTH 5 DECIMALS 2, lv_raw TYPE decfloat34, lv_fee TYPE p LENGTH 13 DECIMALS 2. FIELD-SYMBOLS: TYPE any, TYPE any, TYPE ty_sum, TYPE any. CLEAR et_fees. LOOP AT it_paths ASSIGNING . ASSIGN COMPONENT 'TRAIN_CAT' OF STRUCTURE TO . lv_cat = . ASSIGN COMPONENT 'DISTANCE_KM' OF STRUCTURE TO . lv_km = . ASSIGN COMPONENT 'NIGHT_FLAG' OF STRUCTURE TO . lv_flag = . IF lv_km <= 0. RAISE invalid_distance. ENDIF. CASE lv_cat. WHEN 'IC'. lv_rate = '1.20'. WHEN 'RG'. lv_rate = '0.90'. WHEN 'FR'. lv_rate = '0.60'. WHEN 'SP'. lv_rate = '1.50'. WHEN OTHERS. RAISE invalid_category. ENDCASE. lv_raw = lv_km * lv_rate. IF lv_flag = 'X'. lv_raw = lv_raw * 12 / 10. ENDIF. lv_fee = round( val = lv_raw dec = 2 mode = cl_abap_math=>round_half_up ). IF lv_fee < 5. lv_fee = 5. ENDIF. READ TABLE lt_sums ASSIGNING WITH TABLE KEY train_cat = lv_cat. IF sy-subrc <> 0. INSERT VALUE ty_sum( train_cat = lv_cat ) INTO TABLE lt_sums ASSIGNING . ENDIF. -path_count = -path_count + 1. -total_km = -total_km + lv_km. -total_fee = -total_fee + lv_fee. ENDLOOP. LOOP AT lt_sums ASSIGNING . APPEND INITIAL LINE TO et_fees ASSIGNING . ASSIGN COMPONENT 'TRAIN_CAT' OF STRUCTURE TO . = -train_cat. ASSIGN COMPONENT 'PATH_COUNT' OF STRUCTURE TO . = -path_count. ASSIGN COMPONENT 'TOTAL_KM' OF STRUCTURE TO . = -total_km. ASSIGN COMPONENT 'TOTAL_FEE' OF STRUCTURE TO . = -total_fee. ENDLOOP. ENDFUNCTION.