Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
66 lines
1.7 KiB
ABAP
66 lines
1.7 KiB
ABAP
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(<ls_source>)
|
|
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(<ls_target>)
|
|
WITH KEY station_id = ls_move-target_id BINARY SEARCH.
|
|
IF sy-subrc <> 0.
|
|
ev_rejected = ev_rejected + 1.
|
|
CONTINUE.
|
|
ENDIF.
|
|
|
|
IF <ls_source>-bikes < ls_move-quantity
|
|
OR <ls_target>-capacity - <ls_target>-bikes < ls_move-quantity.
|
|
ev_rejected = ev_rejected + 1.
|
|
CONTINUE.
|
|
ENDIF.
|
|
|
|
<ls_source>-bikes = <ls_source>-bikes - ls_move-quantity.
|
|
<ls_target>-bikes = <ls_target>-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.
|