FUNCTION {{p}}meal_bill IMPORTING iv_week TYPE string EXPORTING ev_meals TYPE decfloat34 ev_pupils TYPE decfloat34 ev_amount TYPE decfloat34 ev_discount TYPE decfloat34 EXCEPTIONS invalid_price. TYPES: BEGIN OF ty_pupil_sum, pupil TYPE string, meals TYPE i, gross TYPE decfloat34, amount TYPE decfloat34, END OF ty_pupil_sum. DATA lt_pupil TYPE SORTED TABLE OF ty_pupil_sum WITH UNIQUE KEY pupil. SELECT pupil, price, cancelled FROM {{P}}MEALBK WHERE week_key = @iv_week INTO TABLE @DATA(lt_book). LOOP AT lt_book INTO DATA(ls_book). IF ls_book-price < 0. RAISE invalid_price. ENDIF. IF ls_book-cancelled = 'X' OR ls_book-price = 0. CONTINUE. ENDIF. READ TABLE lt_pupil ASSIGNING FIELD-SYMBOL() WITH TABLE KEY pupil = ls_book-pupil. IF sy-subrc <> 0. INSERT VALUE #( pupil = ls_book-pupil ) INTO TABLE lt_pupil ASSIGNING . ENDIF. -meals = -meals + 1. -gross = -gross + ls_book-price. ENDLOOP. LOOP AT lt_pupil ASSIGNING . -amount = -gross. IF -meals >= 5. -amount = round( val = -gross * 9 / 10 dec = 2 mode = cl_abap_math=>round_half_up ). ENDIF. ev_meals = ev_meals + -meals. ev_amount = ev_amount + -amount. ev_discount = ev_discount + -gross - -amount. ENDLOOP. ev_pupils = lines( lt_pupil ). ENDFUNCTION.