FUNCTION {{p}}banquet_fee IMPORTING iv_order_id TYPE string EXPORTING ev_total TYPE decfloat34 ev_portions TYPE i ev_dishes TYPE i EXCEPTIONS no_positions unknown_dish invalid_quantity. DATA lt_positions TYPE STANDARD TABLE OF {{p}}pos. DATA lt_dishes TYPE HASHED TABLE OF {{p}}dish WITH UNIQUE KEY dish_id. DATA lt_seen TYPE HASHED TABLE OF {{p}}pos WITH UNIQUE KEY dish_id. DATA ls_position TYPE {{p}}pos. DATA ls_dish TYPE {{p}}dish. CLEAR: ev_total, ev_portions, ev_dishes. SELECT order_id, pos_no, dish_id, qty FROM {{p}}pos WHERE order_id = @iv_order_id INTO TABLE @lt_positions. IF lt_positions IS INITIAL. RAISE no_positions. ENDIF. LOOP AT lt_positions INTO ls_position. IF ls_position-qty <= 0. RAISE invalid_quantity. ENDIF. ENDLOOP. SELECT dish_id, dish_name, price FROM {{p}}dish INTO TABLE @lt_dishes. LOOP AT lt_positions INTO ls_position. READ TABLE lt_dishes INTO ls_dish WITH TABLE KEY dish_id = ls_position-dish_id. IF sy-subrc <> 0. RAISE unknown_dish. ENDIF. ev_total = ev_total + ls_dish-price * ls_position-qty. ev_portions = ev_portions + ls_position-qty. INSERT ls_position INTO TABLE lt_seen. ENDLOOP. ev_dishes = lines( lt_seen ). IF ev_portions >= 50. ev_total = round( val = ev_total * 95 / 100 dec = 2 mode = cl_abap_math=>round_half_up ). ENDIF. ENDFUNCTION.