Create a Function module with following code, use following parameter in FM
Use Node WHRO (Outbound delivery Header Node
IV_LGNUM TYPE /SCWM/LGNUM
IT_DATA TYPE STANDARD TABLE
*Decleartion of variable
DATA: lv_route TYPE /scmb/de_route_id,
lv_output TYPE vbeln_vl,
ls_proch_o TYPE /scdl/dl_proch_o_upd_str,
ls_transs TYPE /scdl/dl_trans_upd_str,
ls_header_control TYPE bapiobdlvhdrctrlchg,
ls_heder_data TYPE bapiobdlvhdrchg,
lt_proch_o TYPE /scdl/dl_proch_o_upd_tab,
lt_transs TYPE /scdl/dl_trans_upd_tab,
lt_prochh TYPE TABLE OF /scdl/dl_proch_o_upd_str,
lt_trans TYPE TABLE OF /scdl/dl_trans_upd_str,
lt_return TYPE TABLE OF bapiret2,
ls_flds TYPE sval,
lt_flds TYPE TABLE OF sval,
lv_status TYPE char30,
lv_docno TYPE /scwm/sp_docno_int.
*Decleartion of constant
CONSTANTS: lc_rflag TYPE kzroute VALUE 'X',
lc_title TYPE sy-title VALUE 'Update Route',
lc_update TYPE char1 VALUE 'U',
lc_staus TYPE char30 VALUE 'Not Started',
lc_rno TYPE char10 VALUE 'ROUTE',
lc_msg TYPE char1 VALUE 'I',
lc_msge TYPE char1 VALUE 'E',
lc_tab TYPE char20 VALUE 'LIKP',
lc_msgs TYPE char1 VALUE 'S',
lc_gistat TYPE char30 VALUE 'Completed',
lc_not_started TYPE char30 VALUE '@08\QGoods',
lc_not_started1 TYPE char30 VALUE '@0A\QGoods Issue Not Posted@'.
*To update route at ODO on TU level
TYPES : BEGIN OF lty_data_del,
status_gi TYPE char30,
docno_h TYPE /scwm/sp_docno_int,
docid TYPE /scdl/dl_docid,
END OF lty_data_del.
TYPES : BEGIN OF lty_data_tu,
status_gm TYPE char30,
docno TYPE /scwm/sp_docno_int,
docid TYPE /scdl/dl_docid,
END OF lty_data_tu.
DATA : lt_data1 TYPE TABLE OF lty_data_tu,
lt_data TYPE TABLE OF lty_data_del.
lt_data = CORRESPONDING #( it_data ).
DATA(ls_data) = VALUE #( lt_data[ 1 ] ).
IF ls_data-docno_h IS INITIAL.
lt_data1 = CORRESPONDING #( it_data ).
ENDIF.
CLEAR lt_flds.
APPEND INITIAL LINE TO lt_flds ASSIGNING FIELD-SYMBOL(<lf_fldst>).
<lf_fldst>-tabname = lc_tab.
<lf_fldst>-fieldname = lc_rno.
*FM to trigger pop-up and capture value
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
popup_title = lc_title
TABLES
fields = lt_flds[]
EXCEPTIONS
error_in_fields = 1
OTHERS = 2.
IF sy-subrc EQ 0.
LOOP AT lt_flds ASSIGNING FIELD-SYMBOL(<lf_flds>).
lv_route = <lf_flds>-value.
ENDLOOP.
ENDIF.
*Validate the Route
IF lv_route IS NOT INITIAL.
SELECT SINGLE route
FROM tvro
INTO lv_route
WHERE route = lv_route.
IF sy-subrc NE 0.
MESSAGE s305(zlg001) WITH lv_route DISPLAY LIKE wmegc_severity_err.
RETURN.
ENDIF.
ELSE.
MESSAGE s306(zlg001) DISPLAY LIKE wmegc_severity_err.
RETURN.
ENDIF.
IF lt_data IS NOT INITIAL.
LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<lf_data>).
IF <lf_data>-status_gi IS NOT INITIAL.
lv_status = <lf_data>-status_gi.
lv_docno = <lf_data>-docno_h.
ELSE.
DATA(ls_data_tu) = VALUE #( lt_data1[ docid = <lf_data>-docid ] OPTIONAL ).
lv_docno = ls_data_tu-docno.
IF ( ls_data_tu-status_gm = icon_red_light ) OR ( ls_data_tu-status_gm = lc_not_started )
OR ( ls_data_tu-status_gm = lc_not_started1 ).
lv_status = lc_staus.
ENDIF.
ENDIF.
*Check if delivery GI status is not completed
IF lv_status NE lc_gistat.
*FM to reomve leading zero
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_docno
IMPORTING
output = lv_output.
IF lv_output IS NOT INITIAL.
ls_heder_data-deliv_numb = lv_output.
ls_heder_data-route = lv_route.
ls_header_control-deliv_numb = lv_output.
ls_header_control-route_flg = lc_rflag.
ENDIF.
*FM to update route on delivery VL03N
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
header_data = ls_heder_data
header_control = ls_header_control
delivery = ls_heder_data-deliv_numb
TABLES
return = lt_return.
IF sy-subrc = 0.
SELECT a~*,
b~*
INTO @DATA(ls_std) FROM /scdl/db_proch_o AS a
INNER JOIN /scdl/db_trans AS b ON
a~docid = b~docid WHERE a~docid = @<lf_data>-docid.
ENDSELECT.
ls_std-a-route_id = lv_route.
ls_std-b-route_id = lv_route.
ENDIF.
ls_proch_o = ls_std-a.
ls_transs = ls_std-b.
CLEAR:ls_std-b,ls_std-a.
ls_proch_o-objchg = lc_update.
APPEND INITIAL LINE TO lt_prochh ASSIGNING FIELD-SYMBOL(<lf_proch>).
<lf_proch> = ls_proch_o.
CLEAR ls_proch_o.
ls_transs-objchg = lc_update.
APPEND INITIAL LINE TO lt_trans ASSIGNING FIELD-SYMBOL(<lf_trans>).
<lf_trans> = ls_transs.
CLEAR ls_transs.
lt_proch_o = lt_prochh.
lt_transs = lt_trans.
*FM to update route against ODO
CALL FUNCTION '/SCDL/DBAL_DB_UPDATE'
EXPORTING
it_proch_o = lt_proch_o
it_trans = lt_transs
EXCEPTIONS
/scdl/cx_dl_dbal_db = 1
OTHERS = 2.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
MESSAGE TEXT-004 TYPE lc_msgs.
ENDIF.
ELSE.
MESSAGE TEXT-002 TYPE lc_msg.
ENDIF.
CLEAR: lv_output,ls_heder_data,ls_header_control,lt_proch_o.
ENDLOOP.
ELSE.
MESSAGE TEXT-003 TYPE lc_msge.
ENDIF.