Splitting Shipments based on Conditions
VT04: If Shipment document is created by Background Job (VT04) with Delivery document of Return Purchase order, skip all the validations. Follow one Return PO to one Shipment and splitting the shipments based on currency (WAERK), sales org (VKORG), Delivery date (LFDAT), Route (ROUTE), Bill-to (BP)-KUNNR, Ship to (SH)-KUNNR.
1.GO to T-code ‘SMOD’.
2.Click on search help then Information system.
3.Enter the package of program ‘SAPMV56A’ (Prog of VT04).
4.click on continue.
5.The Enhancement ‘V56MVT04’ and function module exit ‘EXIT_SAPLV56M_002’ is used for splitting shipments.
Implementing Function Module Exit.
1.Go to T-code ‘CMOD’.
2.Create the project.
3.click on enhancement assignments and enter the Enhancement name ‘V56MVT04’.
4.Click on ‘Components’.
5.Double click on function module exit ‘EXIT_SAPLV56M_002’ and double click on Include ‘ZXV56U27’ and write the logic to update the C_VTTP according to the requirement to split the shipments.
Sort C_VTTP by tknum, tpnum, tprfo.
FM: SD_SHIPMENT_COMBINE_DELIVERIES – Analyse
*&-----------------------------------------------------------------------------*
*& Include ZXV56U27
*&---------------------------------------------------------------------------
-*
TYPES:BEGIN OF lty_shipment,
vbeln TYPE vbeln,
posnr TYPE posnr,
waerk TYPE waerk,
vkorg TYPE vkorg,
lfdat TYPE lfdat,
route TYPE route,
bill_to TYPE vbpa-kunnr,
ship_to TYPE vbpa-kunnr,
zie_webedi1_sdi TYPE
vbap-zie_webedi1_sdi,
retpo TYPE retpo,
edi_flag TYPE char1,
zie_dobilunt_csa TYPE zie_dobilunt,
dobu_c_bstkd TYPE
bstkd,
END OF lty_shipment.
TYPES:BEGIN OF lty_retpo,
vbeln TYPE vbeln_vl,
posnr TYPE posnr_vl,
vgbel TYPE vgbel,
vgpos TYPE vgpos,
ebeln TYPE ebeln,
ebelp TYPE ebelp,
retpo TYPE retpo,
END OF lty_retpo.
TYPES:BEGIN OF lty_vbpa_n,
vbeln TYPE vbeln,
posnr TYPE posnr,
vgbel TYPE vgbel,
parvw TYPE parvw,
kunnr TYPE kunnr,
END OF lty_vbpa_n.
TYPES:BEGIN OF lty_vbap_n,
vbeln TYPE lips-vbeln,
posnr TYPE lips-posnr,
vgbel TYPE vbap-vbeln,
vgpos TYPE vbap-posnr,
zie_webedi1_sdi TYPE vbap-zie_webedi1_sdi,
vkorg TYPE vbak-vkorg,
vtweg TYPE vbak-vtweg,
spart TYPE vbak-spart,
END OF lty_vbap_n.
DATA:lt_shipment1
TYPE TABLE OF lty_shipment,
lt_shipment2 TYPE TABLE OF lty_shipment,
lr_shipment1 TYPE lty_shipment,
lr_shipment2 TYPE lty_shipment.
DATA:lt_retpo TYPE TABLE OF lty_retpo,
lr_retpo TYPE lty_retpo.
DATA:lt_vbpa_n
TYPE TABLE OF lty_vbpa_n,
lr_vbpa_n TYPE lty_vbpa_n.
DATA:lt_vbap_n
TYPE TABLE OF lty_vbap_n,
lr_vbap_n TYPE lty_vbap_n.
DATA:lf_tknum TYPE numc4 VALUE '0000',
lf_tpnum TYPE numc4 VALUE '0000',
lf_tprfo TYPE numc4 VALUE '0000'.
DATA: lr_vttp TYPE
vttp,
lr_vttp1 TYPE vttp.
DATA:lf_retpo TYPE
char1,
lf_delunit_a TYPE char1.
CONSTANTS: lc_s TYPE
char2 VALUE '$T',
lc_bill_to TYPE vbpa-parvw VALUE
'RE',
lc_ship_to TYPE vbpa-parvw VALUE
'WE',
lc_sold_to TYPE vbpa-parvw VALUE
'AG',
lc_posnr TYPE
vbpa-posnr VALUE '000000',
lc_a TYPE
char1 VALUE 'A',
lc_c TYPE
char1 VALUE 'C'.
CONSTANTS: lc_repid
TYPE repid VALUE 'ZCL_SD_SHIPMENT_COMBINE_KEY',
lc_param TYPE param_d VALUE 'VKORG',
lc_yes TYPE
char3 VALUE 'Yes',
lc_x TYPE
char1 VALUE 'X'.
IF sy-tcode = 'VT04' OR sy-batch = abap_true.
DATA(lt_vttp) = c_vttp[].
DATA(lt_vtrlk) = i_vtrlk[].
DATA(lt_vtrlp) = i_vtrlp[].
*************Get Data from
ZTS_PARAMETER for EDI Flag Split*********
SELECT repid,param,param_desc,wricef,value1
FROM ztsd_parameter
INTO TABLE @DATA(lt_param)
WHERE repid =
@lc_repid AND
param = @lc_param.
*********************Return
PO**************************************
*Fetching the ref po and ref item
from lips for Return PO
SELECT vbeln,posnr,vgbel,vgpos
FROM lips
INTO TABLE @DATA(lt_lips)
FOR ALL ENTRIES IN @lt_vtrlp
WHERE vbeln =
@lt_vtrlp-vbeln
AND posnr =
@lt_vtrlp-posnr
AND vgbel LIKE
'9%'.
*Fetching the data from ekpo
SELECT ebeln,ebelp,retpo
FROM ekpo
INTO TABLE @DATA(lt_ekpo)
FOR ALL ENTRIES IN @lt_lips
WHERE ebeln =
@lt_lips-vgbel
AND ebelp =
@lt_lips-vgpos+1(5).
*Passing retun po data to lt_retpo
LOOP AT lt_lips INTO DATA(lr_lips).
lr_retpo-vbeln = lr_lips-vbeln.
lr_retpo-posnr = lr_lips-posnr.
lr_retpo-vgbel = lr_lips-vgbel.
lr_retpo-vgpos = lr_lips-vgpos.
READ TABLE lt_ekpo INTO DATA(lr_ekpo) WITH KEY ebeln = lr_lips-vgbel
ebelp = lr_lips-vgpos+1(5).
IF sy-subrc
= 0.
lr_retpo-ebeln =
lr_ekpo-ebeln.
lr_retpo-ebelp =
lr_ekpo-ebelp.
lr_retpo-retpo =
lr_ekpo-retpo.
ENDIF.
APPEND lr_retpo TO lt_retpo.
CLEAR:lr_retpo.
ENDLOOP.
***Fetching REF doc and item for
Sales Order*************************
SELECT vbeln,posnr,vgbel,vgpos
FROM lips
INTO TABLE @DATA(lt_lips1)
FOR ALL ENTRIES IN @lt_vtrlp
WHERE vbeln =
@lt_vtrlp-vbeln
AND posnr =
@lt_vtrlp-posnr
AND vgbel NOT
LIKE '9%'.
*********************Bill to Party
and Ship to Party*****************
SELECT vbeln, posnr, parvw, kunnr
FROM vbpa INTO
TABLE @DATA(lt_vbpa)
FOR ALL ENTRIES IN @lt_lips1
WHERE vbeln = @lt_lips1-vgbel
AND posnr = @lc_posnr
AND parvw IN
( @lc_bill_to, @lc_ship_to, @lc_sold_to ).
LOOP AT lt_vbpa INTO
DATA(lr_vbpa1).
lr_vbpa_n-vgbel = lr_vbpa1-vbeln.
lr_vbpa_n-parvw = lr_vbpa1-parvw.
lr_vbpa_n-kunnr = lr_vbpa1-kunnr.
READ TABLE lt_lips1 INTO DATA(lr_lips1) WITH KEY vgbel = lr_vbpa1-vbeln.
IF sy-subrc
= 0.
lr_vbpa_n-vbeln = lr_lips1-vbeln.
ENDIF.
APPEND lr_vbpa_n TO lt_vbpa_n.
CLEAR: lr_vbpa_n.
ENDLOOP.
********Delivery Order to Billng
Unit(ZIE_DOBILUNT_CSA)*************
DATA(lt_vbpa_tmp) = lt_vbpa_n.
DELETE lt_vbpa_tmp WHERE
parvw <> lc_sold_to.
SELECT kunnr, vkorg, vtweg, spart, zie_dobilunt_csa
FROM knvv INTO
TABLE @DATA(lt_knvv)
FOR ALL ENTRIES IN @lt_vbpa_tmp
WHERE kunnr =
@lt_vbpa_tmp-kunnr.
**************************Get
VBKD***********************************
SELECT vbeln, posnr, bstkd
FROM vbkd INTO
TABLE @DATA(lt_vbkd)
FOR ALL ENTRIES IN @lt_lips1
WHERE vbeln = @lt_lips1-vgbel.
********************VBAK_VBAP DATA
:zie_webedi1_sdi*****************
SELECT a~vbeln,
a~posnr,
a~zie_webedi1_sdi,
b~vkorg,
b~waerk,
b~vtweg,
b~spart
FROM vbap AS
a JOIN vbak AS b
ON a~vbeln
= b~vbeln
INTO TABLE @DATA(lt_vbap)
FOR ALL ENTRIES IN @lt_lips1
WHERE a~vbeln = @lt_lips1-vgbel
AND a~posnr
= @lt_lips1-vgpos.
LOOP AT lt_vbap INTO
DATA(lr_vbap).
lr_vbap_n-vgbel = lr_vbap-vbeln.
lr_vbap_n-vgpos = lr_vbap-posnr.
lr_vbap_n-vkorg = lr_vbap-vkorg.
lr_vbap_n-vtweg = lr_vbap-vtweg.
lr_vbap_n-spart = lr_vbap-spart.
lr_vbap_n-zie_webedi1_sdi = lr_vbap-zie_webedi1_sdi.
READ TABLE lt_lips1 INTO DATA(ls_lips2) WITH KEY vgbel = lr_vbap-vbeln
vgpos = lr_vbap-posnr.
IF sy-subrc
= 0.
lr_vbap_n-vbeln = ls_lips2-vbeln.
lr_vbap_n-posnr = ls_lips2-posnr.
ENDIF.
APPEND lr_vbap_n TO lt_vbap_n.
CLEAR:lr_vbap_n.
ENDLOOP.
********Preparing data to split
shipments***************************
LOOP AT lt_vtrlp INTO
DATA(lr_vtrlp).
lr_shipment1-vbeln = lr_vtrlp-vbeln.
lr_shipment1-posnr = lr_vtrlp-posnr.
READ TABLE lt_vtrlk INTO DATA(lr_vtrlk) WITH KEY vbeln = lr_vtrlp-vbeln.
IF sy-subrc
= 0.
lr_shipment1-waerk = lr_vtrlk-waerk.
lr_shipment1-vkorg = lr_vtrlk-vkorg.
lr_shipment1-lfdat = lr_vtrlk-lfdat.
lr_shipment1-route = lr_vtrlk-route.
ENDIF.
READ TABLE lt_vbpa_n INTO DATA(ls_vbpa2) WITH KEY vbeln = lr_vtrlp-vbeln
parvw = lc_bill_to.
IF sy-subrc
= 0.
lr_shipment1-bill_to = ls_vbpa2-kunnr.
ENDIF.
READ TABLE lt_vbpa_n INTO DATA(ls_vbpa3) WITH KEY vbeln = lr_vtrlp-vbeln
parvw = lc_ship_to.
IF sy-subrc
= 0.
lr_shipment1-ship_to = ls_vbpa3-kunnr.
ENDIF.
READ TABLE lt_vbap_n INTO lr_vbap_n WITH KEY vbeln = lr_vtrlp-vbeln
posnr = lr_vtrlp-posnr.
IF sy-subrc
= 0.
lr_shipment1-zie_webedi1_sdi = lr_vbap_n-zie_webedi1_sdi.
READ TABLE lt_param INTO DATA(lr_param) WITH KEY value1 = lr_vtrlk-vkorg.
IF sy-subrc
= 0 AND lr_vbap_n-zie_webedi1_sdi = lc_yes.
lr_shipment1-edi_flag = lc_x.
ENDIF.
ENDIF.
READ TABLE lt_retpo INTO lr_retpo WITH
KEY vbeln = lr_vtrlp-vbeln
posnr = lr_vtrlp-posnr.
IF sy-subrc
= 0.
lr_shipment1-retpo = lr_retpo-retpo.
ENDIF.
READ TABLE lt_knvv INTO DATA(lr_knvv) WITH KEY kunnr = ls_vbpa2-kunnr
vkorg = lr_vbap_n-vkorg
vtweg = lr_vbap_n-vtweg
spart = lr_vbap_n-spart.
IF sy-subrc
= 0.
lr_shipment1-zie_dobilunt_csa = lr_knvv-zie_dobilunt_csa.
IF lr_shipment1-zie_dobilunt_csa = lc_c.
READ TABLE lt_vbkd INTO DATA(lr_vbkd) WITH KEY vbeln = lr_vbap_n-vgbel
posnr = lr_vbap_n-vgpos.
IF sy-subrc
= 0.
lr_shipment1-dobu_c_bstkd = lr_vbkd-bstkd.
ELSE.
READ TABLE lt_vbkd INTO lr_vbkd WITH KEY vbeln
= lr_vbap_n-vgbel
posnr = lc_posnr.
IF sy-subrc
= 0.
lr_shipment1-dobu_c_bstkd = lr_vbkd-bstkd.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
APPEND lr_shipment1 TO lt_shipment1.
CLEAR:lr_shipment1.
ENDLOOP.
lt_shipment2 = lt_shipment1.
SORT lt_shipment1 BY waerk
vkorg lfdat route bill_to ship_to
edi_flag retpo
zie_dobilunt_csa dobu_c_bstkd.
DELETE ADJACENT DUPLICATES FROM lt_shipment1
COMPARING waerk vkorg lfdat route bill_to ship_to
edi_flag
retpo zie_dobilunt_csa dobu_c_bstkd.
********************Splitting
Shpments****************************
********1 Return PO = 1 Shipment
LOOP AT lt_shipment1 INTO
lr_shipment1.
lf_tknum = lf_tknum + 1.
*******Splitting Shpments based on
currency(WAERK),Sales org(VKORG),
*******Delivery date(LFDAT),
Route(Route), Bill_to, Ship_to,Retun PO,
*******zie_webedi1_sdi,CPO(Delivery
order to Billing Unit)
LOOP AT lt_shipment2 INTO lr_shipment2 WHERE waerk = lr_shipment1-waerk
AND vkorg = lr_shipment1-vkorg
AND lfdat = lr_shipment1-lfdat
AND route = lr_shipment1-route
AND bill_to = lr_shipment1-bill_to
AND ship_to = lr_shipment1-ship_to
AND retpo = lr_shipment1-retpo
AND edi_flag = lr_shipment1-edi_flag
AND zie_dobilunt_csa = lr_shipment1-zie_dobilunt_csa
AND dobu_c_bstkd = lr_shipment1-dobu_c_bstkd.
*Check Return PO already added
into this shipment(1 RETUEN PO = 1 Shipment).
IF lf_retpo =
'X'.
lf_tknum = lf_tknum + 1.
CLEAR:lf_tpnum,lf_tprfo.
ENDIF.
*Populate Return PO into flag.
IF lr_shipment2-retpo = lc_x.
lf_retpo = lc_x.
ENDIF.
*Check delivery unit A already
added into this shipment(1 Delivery Unit A = 1 Shipment).
IF lf_delunit_a = lc_x.
lf_tknum = lf_tknum + 1.
CLEAR:lf_tpnum,lf_tprfo.
ENDIF.
*Populate delivery unit A into
flag.
IF lr_shipment2-zie_dobilunt_csa = lc_a.
lf_delunit_a = lc_x.
ENDIF.
lr_vttp1-vbeln =
lr_shipment2-vbeln.
READ TABLE lt_vttp INTO lr_vttp WITH KEY vbeln
= lr_shipment2-vbeln.
IF sy-subrc
= 0.
CONCATENATE lc_s lf_tknum INTO lr_vttp1-tknum.
lf_tpnum = lf_tpnum + 1.
lr_vttp1-tpnum = lf_tpnum.
lf_tprfo = lf_tprfo + 1.
lr_vttp1-tprfo = lf_tprfo.
**Modifying the Assignment of
deliveries to shipments
MODIFY c_vttp[] FROM lr_vttp1 INDEX sy-tabix.
ENDIF.
CLEAR:lr_vttp1.
ENDLOOP. "lt_shipment2
CLEAR:lf_tpnum,lf_tprfo.
CLEAR:lf_retpo,lf_delunit_a.
ENDLOOP. " lt_shipment1
SORT c_vttp[] BY tknum
tpnum tprfo.
CLEAR:lf_tknum.
ENDIF.
Output:
T-code :vt04
Splitting shipments if deliveries have different Sales org
8000001260 - 1140
8000001222 - 1130
Comments
Post a Comment