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

Popular posts from this blog

Passing Dynamic Variables to SO10 TEXT

Implicit Enhancement with Example

TMG Events