0% found this document useful (0 votes)
127 views

Commented Code

The document describes variables and data used to update delivery quantities and text for items. It loops through a list of items to prepare updates, check for text or quantity changes, update the relevant tables, and handle any errors encountered during the process. Temporary internal tables are used to collect item data and changes before updating the target tables.

Uploaded by

adavellys
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
127 views

Commented Code

The document describes variables and data used to update delivery quantities and text for items. It loops through a list of items to prepare updates, check for text or quantity changes, update the relevant tables, and handle any errors encountered during the process. Temporary internal tables are used to collect item data and changes before updating the target tables.

Uploaded by

adavellys
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 10

DATA: LS_POD TYPE ZSSD_DELIVERY_POST_STRUC,

LV_BEGIN_IDX TYPE I,
LV_END_IDX TYPE I,
LT_POD_BAD TYPE TABLE OF ZSSD_DELIVERY_POST_STRUC.

DATA: LV_DELIVERY TYPE VBELN_VL,


LS_RETURN TYPE BAPIRET2,
LV_ERROR TYPE C,
LV_MSG_TYPE TYPE BAPI_MTYPE,
LV_MSG_NO TYPE SYMSGNO,
LV_NB_POST LIKE BAPIRET2-MESSAGE_V1.

DATA: LV_NB_RECORD TYPE I,


LV_NB_ERROR_LINE TYPE I,
LV_NB_LINE TYPE I,
LV_NB_UPD_INDX TYPE I.

* delivery Header Structure


DATA: LS_VBKOK TYPE VBKOK.

* Delivery Item
DATA: LT_VBPOK TYPE TABLE OF VBPOK,
LS_VBPOK TYPE VBPOK.

FIELD-SYMBOLS: <LFS_POD_LINE> LIKE ZSSD_DELIVERY_POST_STRUC,


<LFS_MOB_DELIV_I> LIKE ZSD_MOB_DELIV_I.
DATA: LV_POST_PGI TYPE XFELD.
* Variables to update text
DATA: LV_TEXTNAME TYPE THEAD-TDNAME,
LT_LINES LIKE TLINE OCCURS 0 WITH HEADER LINE,
LT_TEXTH LIKE TEXTH_GN OCCURS 0 WITH HEADER LINE,
LT_TEXTL LIKE TEXTL_GN OCCURS 0 WITH HEADER LINE.
DATA: LT_MOB_DELIV_I LIKE ZSD_MOB_DELIV_I OCCURS 0 WITH HEADER LINE.

* convert delivery numbers into internal foramt


LOOP AT IT_POD_LIST ASSIGNING <LFS_POD_LINE>.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = <LFS_POD_LINE>-DELIVERY
IMPORTING
OUTPUT = <LFS_POD_LINE>-DELIVERY.

ENDLOOP.
SORT IT_POD_LIST BY DELIVERY LINE.

data: la_body TYPE soli,


lt_body TYPE soli_tab.
clear: la_body.
CONCATENATE '1' 'delivery:' <lfs_pod_line>-delivery INTO la_body SEPARATED BY
space.
append la_body to lt_body.

* if there is no text update or qty update then just update the z-table
LOOP AT IT_POD_LIST INTO LS_POD WHERE ITEM_NOTE IS INITIAL AND
POD_QTY IS INITIAL.
data: ls_qty TYPE char20.
ls_qty = ls_pod-pod_Qty.
clear: la_body.
CONCATENATE '2' 'Item' ls_pod-line ls_qty ls_pod-item_note INTO la_body SEPARATED
BY space.
append la_body to lt_body.

CLEAR: LT_MOB_DELIV_I.
LT_MOB_DELIV_I-VBELN_VL = LS_POD-DELIVERY.
LT_MOB_DELIV_I-POSNR_VL = LS_POD-LINE.
LT_MOB_DELIV_I-ITEM_TEXT_STATUS = 'C'.
LT_MOB_DELIV_I-QTY_CHANGE = 'C'.
LT_MOB_DELIV_I-DEL_QTY = LS_POD-SALE_QTY.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
INPUT = LS_POD-SALE_UOM
LANGUAGE = SY-LANGU
IMPORTING
OUTPUT = LT_MOB_DELIV_I-DEL_UOM
EXCEPTIONS
UNIT_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
APPEND LT_MOB_DELIV_I.
MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
ENDLOOP.

* update the line item text


LOOP AT IT_POD_LIST ASSIGNING <LFS_POD_LINE> WHERE ITEM_NOTE IS NOT INITIAL.
CLEAR: LT_LINES, LT_MOB_DELIV_I.
REFRESH: LT_LINES.

* prepare z-table entry


LT_MOB_DELIV_I-VBELN_VL = <LFS_POD_LINE>-DELIVERY.
LT_MOB_DELIV_I-POSNR_VL = <LFS_POD_LINE>-LINE.
LT_MOB_DELIV_I-DEL_QTY = <LFS_POD_LINE>-SALE_QTY.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
INPUT = <LFS_POD_LINE>-SALE_UOM
LANGUAGE = SY-LANGU
IMPORTING
OUTPUT = LT_MOB_DELIV_I-DEL_UOM
EXCEPTIONS
UNIT_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.

LT_LINES-TDFORMAT = '*'.
LT_LINES-TDLINE = <LFS_POD_LINE>-ITEM_NOTE(132).
APPEND LT_LINES.
LT_LINES-TDLINE = <LFS_POD_LINE>-ITEM_NOTE+132.
APPEND LT_LINES.
CLEAR: LV_TEXTNAME.
CONCATENATE <LFS_POD_LINE>-DELIVERY <LFS_POD_LINE>-LINE
INTO LV_TEXTNAME.
CALL FUNCTION 'CREATE_TEXT'
EXPORTING
FID = '0002'
FLANGUAGE = SY-LANGU
FNAME = LV_TEXTNAME
FOBJECT = 'VBBP'
SAVE_DIRECT = 'X'
* FFORMAT = '*'
TABLES
FLINES = LT_LINES
EXCEPTIONS
NO_INIT = 1
NO_SAVE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
* update Z table with error flag
LT_MOB_DELIV_I-ITEM_TEXT_STATUS = 'B'.
* assume no qty change. this will be updated later if qty is changed
LT_MOB_DELIV_I-QTY_CHANGE = 'C'.
ET_RETURN-ID = 'ZSD_MOB'.
ET_RETURN-NUMBER = 000.
ET_RETURN-MESSAGE_V1 = <LFS_POD_LINE>-DELIVERY.
ET_RETURN-MESSAGE_V2 = <LFS_POD_LINE>-LINE.
ET_RETURN-TYPE = 'E'.
APPEND ET_RETURN.
ELSE.
* update Z table with success flag
LT_MOB_DELIV_I-ITEM_TEXT_STATUS = 'A'.
* assume no qty change. this will be updated later if qty is changed
LT_MOB_DELIV_I-QTY_CHANGE = 'C'.
ENDIF.
APPEND LT_MOB_DELIV_I.
ENDLOOP.

IF LT_MOB_DELIV_I[] IS NOT INITIAL.


MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
CLEAR: LT_MOB_DELIV_I.
REFRESH: LT_MOB_DELIV_I.
ENDIF.

* exit if there are any errors. do not update qty until text are uploaded
successfully
IF ET_RETURN[] IS NOT INITIAL.
EXIT.
ENDIF.

* before updating the qty get all the entries for item from Z-table
* so qty flag can be updated correctly.
IF IT_POD_LIST[] IS NOT INITIAL.
SELECT *
INTO TABLE LT_MOB_DELIV_I
FROM ZSD_MOB_DELIV_I
FOR ALL ENTRIES IN IT_POD_LIST
WHERE VBELN_VL = IT_POD_LIST-DELIVERY
AND POSNR_VL = IT_POD_LIST-LINE.
ENDIF.

* now we update the Delivery Item Qty


LOOP AT IT_POD_LIST INTO LS_POD WHERE POD_QTY IS NOT INITIAL.
IF LV_DELIVERY NE LS_POD-DELIVERY.
clear: la_body.
CONCATENATE '3' 'Item' ls_pod-line ls_qty ls_pod-item_note INTO la_body SEPARATED
BY space.
append la_body to lt_body.

DESCRIBE TABLE LT_VBPOK LINES LV_NB_LINE.


IF LV_NB_LINE NE 0.
* update delivery
PERFORM UPDATE_DELIVERY TABLES LT_VBPOK
LT_TEXTH
LT_TEXTL
ET_RETURN
USING LV_DELIVERY
LV_POST_PGI.
DESCRIBE TABLE ET_RETURN LINES LV_NB_ERROR_LINE.
IF LV_NB_ERROR_LINE NE 0.
* update z-table with failure and exit
MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
EXIT.
ELSE.
* modify z-table to success and update
LOOP AT LT_MOB_DELIV_I ASSIGNING <LFS_MOB_DELIV_I>.
<LFS_MOB_DELIV_I>-QTY_CHANGE = 'A'.
ENDLOOP.
MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
* call method to block the sales order for delivery
ZCL_SD_MOB=>SO_MOB_APP_DEL_BLK_AND_MSG( EXPORTING IM_VBELN_VL =
LV_DELIVERY
IM_POSNR_VL = LS_VBPOK-
POSNR_VL ).
ENDIF.
ENDIF.
CLEAR: LT_VBPOK, LT_TEXTH, LT_TEXTL.
REFRESH: LT_VBPOK, LT_TEXTH, LT_TEXTL.
LV_BEGIN_IDX = SY-TABIX.
LV_END_IDX = SY-TABIX.
LV_DELIVERY = LS_POD-DELIVERY.
ENDIF.

* if there is any adjustments to process, then prepare line item


* otherwise do not need to do anything for that line
* IF LS_POD-SALE_QTY <> 0 OR
* ( LS_POD-SALE_QTY EQ 0 AND LS_POD-ZERO_COUNT EQ 'X' ).
LS_VBPOK-VBELN_VL = LS_POD-DELIVERY.
LS_VBPOK-POSNR_VL = LS_POD-LINE.
LS_VBPOK-MATNR = LS_POD-MATERIAL.
LS_VBPOK-CHARG = LS_POD-BATCH.
LS_VBPOK-LIANP = 'X'.
* update delivery qty only. no need to do anything else
LS_VBPOK-LFIMG = LS_POD-SALE_QTY.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
INPUT = LS_POD-SALE_UOM
LANGUAGE = SY-LANGU
IMPORTING
OUTPUT = LS_VBPOK-VRKME
EXCEPTIONS
UNIT_NOT_FOUND = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.

clear: la_body.
CONCATENATE '4' 'Item' ls_pod-line ls_qty ls_pod-item_note INTO la_body SEPARATED
BY space.
append la_body to lt_body.
* LS_VBPOK-VRKME = LS_POD-SALE_UOM.
* if Qty is Zero then delete the line item
IF LS_VBPOK-LFIMG = 0.
LS_VBPOK-LIPS_DEL = 'X'.
ENDIF.
* LS_VBPOK-LGMNG = LS_POD-STOCK_QTY.
* LS_VBPOK-MEINS = LS_POD-STOCK_UOM.
LV_END_IDX = SY-TABIX.
APPEND LS_VBPOK TO LT_VBPOK.

LV_NB_RECORD = LV_NB_RECORD + 1.
READ TABLE LT_MOB_DELIV_I WITH KEY VBELN_VL = LS_POD-DELIVERY
POSNR_VL = LS_POD-LINE.
IF SY-SUBRC = 0.
CLEAR: LV_NB_UPD_INDX.
LV_NB_UPD_INDX = SY-TABIX.
LT_MOB_DELIV_I-QTY_CHANGE = 'B'.
LT_MOB_DELIV_I-DEL_QTY = LS_POD-SALE_QTY.
LT_MOB_DELIV_I-DEL_UOM = LS_VBPOK-VRKME.
MODIFY LT_MOB_DELIV_I INDEX LV_NB_UPD_INDX.
ELSE.
LT_MOB_DELIV_I-VBELN_VL = LS_POD-DELIVERY.
LT_MOB_DELIV_I-POSNR_VL = LS_POD-LINE.
LT_MOB_DELIV_I-QTY_CHANGE = 'B'.
LT_MOB_DELIV_I-ITEM_TEXT_STATUS = 'C'.
LT_MOB_DELIV_I-DEL_QTY = LS_POD-SALE_QTY.
LT_MOB_DELIV_I-DEL_UOM = LS_VBPOK-VRKME.
APPEND LT_MOB_DELIV_I.
ENDIF.
* ENDIF.
ENDLOOP.

DESCRIBE TABLE LT_VBPOK LINES LV_NB_LINE.


IF LV_NB_LINE NE 0.
* update delivery

clear: la_body.
CONCATENATE '5' lv_post_pgi INTO la_body SEPARATED BY space.
append la_body to lt_body.

PERFORM UPDATE_DELIVERY TABLES LT_VBPOK


LT_TEXTH
LT_TEXTL
ET_RETURN
USING LV_DELIVERY
LV_POST_PGI.
DESCRIBE TABLE ET_RETURN LINES LV_NB_ERROR_LINE.
IF LV_NB_ERROR_LINE NE 0.
* update z-table with failure and exit
MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
EXIT.
ELSE.
* modify z-table to success and upate
LOOP AT LT_MOB_DELIV_I ASSIGNING <LFS_MOB_DELIV_I>.
<LFS_MOB_DELIV_I>-QTY_CHANGE = 'A'.
ENDLOOP.
MODIFY ZSD_MOB_DELIV_I FROM TABLE LT_MOB_DELIV_I.
* call method to block the sales order for delivery
ZCL_SD_MOB=>SO_MOB_APP_DEL_BLK_AND_MSG( EXPORTING IM_VBELN_VL = LV_DELIVERY
IM_POSNR_VL = LS_VBPOK-
POSNR_VL ).
ENDIF.
ENDIF.

YCL_SEND_EMAIL=>SEND_MAIL_TO_SO_WRITER( EXPORTING im_t_body = lt_body ).

___________ PGI ____________________

DATA: ls_vbkok TYPE vbkok,


lv_error_any TYPE xfeld,
lv_error_in_item_deletion TYPE xfeld,
lv_error_in_pod_update TYPE xfeld,
lv_error_in_interface TYPE xfeld,
lv_error_in_goods_issue TYPE xfeld,
lv_error_in_final_check TYPE xfeld,
lv_error_partner_update TYPE xfeld,
lv_error_sernr_update TYPE xfeld,
lv_error_id TYPE sy-msgid,
lv_error_type TYPE sy-msgty,
lv_error_no TYPE sy-msgno,
lv_error_v1 TYPE sy-msgv1,
lv_error_v2 TYPE sy-msgv2,
lv_error_v3 TYPE sy-msgv3,
lv_error_v4 TYPE sy-msgv4.

DATA: lt_prot LIKE prott OCCURS 0 WITH HEADER LINE.


DATA: lv_delivery TYPE vbeln_vl.
DATA: lt_mob_deliv_h LIKE zsd_mob_deliv_h OCCURS 0 WITH HEADER LINE.
FIELD-SYMBOLS: <lfs_mob_deliv_h> LIKE zsd_mob_deliv_h.
DATA: lv_date TYPE d,
lv_time TYPE t,
lv_timestamp TYPE timestamp,
lv_tzone TYPE ttzz-tzone.

* convert the delivery number into internal format


CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = i_delivery
IMPORTING
output = lv_delivery.

e_delivery = lv_delivery.

DATA: la_body TYPE soli,


lt_body TYPE soli_tab.
CLEAR: la_body.
CONCATENATE '1-PGI' 'at line 75' i_update INTO la_body SEPARATED BY space.
APPEND la_body TO lt_body.

IF i_update = 'X'.

** first check if signature update was successful or not


** if not do not do PGI. Technically this should not be even called from the app
** but trap that scenario here anyway
** comment out for now to test only PGI scenario
*
CLEAR: la_body.
CONCATENATE '2-PGI' 'at line 86' INTO la_body SEPARATED BY space.
APPEND la_body TO lt_body.

SELECT SINGLE *
INTO lt_mob_deliv_h
FROM zsd_mob_deliv_h
WHERE vbeln_vl = lv_delivery.
*
** check signature upload is successful first
* IF SY-SUBRC <> 0 OR
* LT_MOB_DELIV_H-SIGN_STATUS <> 'Y'.
* ET_RETURN-ID = 'ZSD_MOB'.
* ET_RETURN-TYPE = 'E'.
* ET_RETURN-NUMBER = 004.
* ET_RETURN-MESSAGE_V1 = LV_DELIVERY.
* APPEND ET_RETURN.
* EXIT.
* ELSE.
* set the data to update the table
lt_mob_deliv_h-vbeln_vl = lv_delivery.
lt_mob_deliv_h-longitude = c_longitude.
lt_mob_deliv_h-latitude = c_latitude.
lt_mob_deliv_h-signed_by = c_signed_by.
* Enhancements to app 2017 March
lt_mob_deliv_h-loaded_by = c_loaded_by.
lt_mob_deliv_h-cartons = c_cartons.
lt_mob_deliv_h-coils = c_coils.
lt_mob_deliv_h-pieces = c_pieces.
lt_mob_deliv_h-reels = c_reels.
lt_mob_deliv_h-pallets = c_pallets.
lt_mob_deliv_h-bundles = c_bundles.
lt_mob_deliv_h-ship_description = c_ship_description.
lt_mob_deliv_h-manifest_id = c_manifestid.

lv_date = c_signed_date.
lv_time = c_signed_time.
* Time coming in is in UTC timezone. Convert to System timezone
lv_tzone = 'UTC'.
CONVERT DATE lv_date TIME lv_time INTO TIME STAMP lv_timestamp TIME ZONE
lv_tzone.
SELECT SINGLE tzonesys
INTO lv_tzone
FROM ttzcu.
CONVERT TIME STAMP lv_timestamp TIME ZONE lv_tzone INTO DATE lv_date TIME
lv_time.
c_signed_date = lv_date.
c_signed_time = lv_time.
lt_mob_deliv_h-signed_date = c_signed_date.
lt_mob_deliv_h-signed_time = c_signed_time.
* ENDIF.

* check delivery is not already PGI'd


SELECT SINGLE wadat_ist wbstk
INTO (c_pgi_date, c_pgi_status)
FROM likp
JOIN vbuk
ON ( likp~vbeln = vbuk~vbeln )
WHERE likp~vbeln = lv_delivery.

IF ( c_pgi_date IS NOT INITIAL AND


c_pgi_status = 'C' ).
et_return-id = 'ZSD_MOB'.
et_return-type = 'E'.
et_return-number = 005.
et_return-message_v1 = lv_delivery.
APPEND et_return.
* if Delivery is PGI'd in SAP but not updated in Z-table then update it
IF lt_mob_deliv_h-pgi_status <> 'Y'.
lt_mob_deliv_h-pgi_status = 'Y'.
APPEND lt_mob_deliv_h.
MODIFY zsd_mob_deliv_h FROM TABLE lt_mob_deliv_h.
ENDIF.
EXIT.
ENDIF.

CLEAR: la_body.
CONCATENATE '3-PGI' 'at line 161' c_pgi_upd_status INTO la_body SEPARATED BY
space.
APPEND la_body TO lt_body.

* do we even have to perform PGI?


IF c_pgi_upd_status = 'N'.
lt_mob_deliv_h-pgi_status = ' '.
APPEND lt_mob_deliv_h.
MODIFY zsd_mob_deliv_h FROM TABLE lt_mob_deliv_h.
EXIT.
ENDIF.
* signature is updated, delivery is not PGI'd already so perform PGI
* setup data for FM

ls_vbkok-vbeln_vl = lv_delivery.
ls_vbkok-wabuc = 'X'.

CLEAR: la_body.
CONCATENATE '4-PGI' 'at line 179' 'Before call func' INTO la_body SEPARATED BY
space.
APPEND la_body TO lt_body.

CALL FUNCTION 'WS_DELIVERY_UPDATE_2'


EXPORTING
vbkok_wa = ls_vbkok
no_messages_update_1 = 'X'
commit = 'X'
* IF_NO_BUFFER_REFRESH = 'X'
* IF_LATE_DELIVERY_UPD = 'X'
delivery = lv_delivery
if_error_messages_send = ''
IMPORTING
ef_error_any = lv_error_any
ef_error_in_item_deletion = lv_error_in_item_deletion
ef_error_in_pod_update = lv_error_in_pod_update
ef_error_in_interface = lv_error_in_interface
ef_error_in_goods_issue = lv_error_in_goods_issue
ef_error_in_final_check = lv_error_in_final_check
ef_error_partner_update = lv_error_partner_update
ef_error_sernr_update = lv_error_sernr_update
TABLES
prot = lt_prot
EXCEPTIONS
error_message = 4.
IF lv_error_any EQ 'X' OR
sy-subrc = 4.
lv_error_id = sy-msgid.
lv_error_type = sy-msgty.
lv_error_no = sy-msgno.
lv_error_v1 = sy-msgv1.
lv_error_v2 = sy-msgv2.
lv_error_v3 = sy-msgv3.
lv_error_v4 = sy-msgv4.

PERFORM message_to_bapiret2
TABLES et_return
USING lv_error_id
lv_error_type
lv_error_no
lv_error_v1
lv_error_v2
lv_error_v3
lv_error_v4.
* there was an error, update the table with fail status
lt_mob_deliv_h-pgi_status = 'N'.
APPEND lt_mob_deliv_h.
MODIFY zsd_mob_deliv_h FROM TABLE lt_mob_deliv_h.
ELSE.
* no error, update the table with success status
lt_mob_deliv_h-pgi_status = 'Y'.
APPEND lt_mob_deliv_h.
MODIFY zsd_mob_deliv_h FROM TABLE lt_mob_deliv_h.
ENDIF.
ENDIF.

clear: la_body.
CONCATENATE '5-PGI' 'at line 236' INTO la_body SEPARATED BY space.
append la_body to lt_body.

* read PGI date/time after PGI.


SELECT SINGLE wadat_ist wbstk
INTO (c_pgi_date, c_pgi_status)
FROM likp
JOIN vbuk
ON ( likp~vbeln = vbuk~vbeln )
WHERE likp~vbeln = lv_delivery.
* read existing z-table entry if it is there
SELECT SINGLE longitude latitude pgi_status sign_status
signed_by signed_date signed_time
INTO (c_longitude, c_latitude, c_pgi_upd_status,
c_sign_status, c_signed_by, c_signed_date, c_signed_time)
FROM zsd_mob_deliv_h
WHERE vbeln_vl = lv_delivery.

YCL_SEND_EMAIL=>SEND_MAIL_TO_SO_WRITER( EXPORTING im_t_body = lt_body ).

ENDFUNCTION.

check ZSD_MOB function modules and add more email code. Later check if there is
something that can be changed to not PGI.

8000017455 - test delivery

You might also like