FUNCTION {{p}}bike_rebalance IMPORTING iv_dry_run TYPE abap_bool EXPORTING ev_applied TYPE i ev_rejected TYPE i. DATA lt_state TYPE STANDARD TABLE OF {{p}}station. DATA lt_moves TYPE STANDARD TABLE OF {{p}}move. SELECT station_id, station_name, capacity, bikes FROM {{p}}station INTO TABLE @lt_state. SELECT move_no, source_id, target_id, quantity FROM {{p}}move INTO TABLE @lt_moves. SORT lt_state BY station_id. SORT lt_moves BY move_no. ev_applied = 0. ev_rejected = 0. LOOP AT lt_moves INTO DATA(ls_move). IF ls_move-quantity <= 0 OR ls_move-source_id = ls_move-target_id. ev_rejected = ev_rejected + 1. CONTINUE. ENDIF. READ TABLE lt_state ASSIGNING FIELD-SYMBOL() WITH KEY station_id = ls_move-source_id BINARY SEARCH. IF sy-subrc <> 0. ev_rejected = ev_rejected + 1. CONTINUE. ENDIF. READ TABLE lt_state ASSIGNING FIELD-SYMBOL() WITH KEY station_id = ls_move-target_id BINARY SEARCH. IF sy-subrc <> 0. ev_rejected = ev_rejected + 1. CONTINUE. ENDIF. IF -bikes < ls_move-quantity OR -capacity - -bikes < ls_move-quantity. ev_rejected = ev_rejected + 1. CONTINUE. ENDIF. -bikes = -bikes - ls_move-quantity. -bikes = -bikes + ls_move-quantity. ev_applied = ev_applied + 1. ENDLOOP. IF iv_dry_run = abap_false. LOOP AT lt_state INTO DATA(ls_state). UPDATE {{p}}station SET bikes = @ls_state-bikes WHERE station_id = @ls_state-station_id. ENDLOOP. ENDIF. ENDFUNCTION.