Sei sulla pagina 1di 17

*&---------------------------------------------------------------------*

*& Report  Z_VA25_QUOTATIONS
*&
*&---------------------------------------------------------------------*
* Object created:  Z_VA25_QUOTATIONS                                  *
* ---------------                                                     
*
* Title  : VA25 Quotations Report                                     *
* Author : SWATIJ (Swati Jain)                                        *
* Date   : 01.08.2019                                                 
*
*                                                                   
  *
* Function description: The Quotations report gives the list of       *
* quotations created in the system. The output will display the       *
* quotations and the orders created against it                        *
*---------------------------------------------------------------------*
*&
*&--------------------------------------------------------------------*
REPORT z_va25_quotations.

***===================================================================
*                 Data Declarations
***===================================================================
INCLUDE z_va25_quotations_top.

***===================================================================
*                 Selection Screen
***===================================================================

INCLUDE z_va25_quotations_s01.

***===================================================================
*                Class Declaration
***===================================================================
INCLUDE  z_va25_quotations_cls_defin.

***===================================================================
*              Class Implementation
***===================================================================
INCLUDE  z_va25_quotations_cls_impln.

INITIALIZATION.

  DATA(lo_lcls) = NEW lcl_quotation_disp( p_vkorg ).

AT SELECTION-SCREEN.
  lo_lcls->validate_selection( ).

START-OF-SELECTION.
*** Create object
  DATA(lo_sales) = NEW lcl_quotation_disp( p_vkorg ).

  lo_sales->build_quotation( ).

  lo_sales->disp_quotation( ).

*&---------------------------------------------------------------------*
*&  Include           Z_VA25_QUOTATIONS_TOP
*&---------------------------------------------------------------------*

CLASS lcl_quotation_disp DEFINITION DEFERRED.

TABLES : vbak.
TYPES : BEGIN OF ty_final,
*         vkbur     TYPE vkbur,             "Sales Office
          vbeln     TYPE vbeln_va,          "Sales Document no
          sales_ord TYPE vbeln_nach,        "Sales Order
          posnr     TYPE posnr_va ,         "Sales document item
          abgru     TYPE abgru_va,          "Reason for rejection
          kunnr     TYPE kunnr,             "Sold-to-party/Customer code
          name1     TYPE name1_gp,          "Customer description/Name1
          matnr      TYPE matnr,             "Material no.
          arktx      TYPE arktx,             "Material Description
          audat     TYPE audat,             "Document date
          kwmeng    TYPE kwmeng ,           "Ordered Quantity
          bmeng     TYPE bmeng ,            "Confirm Quantity
          bal_qty   TYPE kwmeng,            "Balance Quantity
          net_price TYPE netpr,             "Net price
          kzwi6      TYPE kzwi6,             "Net value
          loss_qty  TYPE kwmeng,            "Order loss Quantity
          bstkd      TYPE bstkd,             "PO number
          angdt      TYPE angdt_v,           "Valid from
          bnddt      TYPE bnddt,             "Valid to
          matkl      TYPE matkl,             "Material Group
          gbsta      TYPE gbsta,             "Status
          vbeln_inv TYPE vbeln_nach,        "Invoice Number
          fkimg      TYPE fkimg,             "Invoice Quantity
          kbetr      TYPE kbetr,             "Invoice Cost
          netwr      TYPE netwr_fp,          "Invoice Sales/Invoice net value
          charg     TYPE charg_d,           "Batch Number
          lost_sale TYPE netpr,             "Lost Sales value
          sales_exe TYPE pad_vorna,         "Sales Executive name
        END OF ty_final.

DATA : gt_final TYPE STANDARD TABLE OF ty_final,
       gs_final TYPE ty_final.

*&---------------------------------------------------------------------*
*&  Include           Z_VA25_QUOTATIONS_S01
*&---------------------------------------------------------------------*

*--------------------------------------------------------------------*
* Selection Screen
*--------------------------------------------------------------------*

SELECTION-SCREEN : BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

PARAMETERS:     p_vkorg TYPE vbak-vkorg OBLIGATORY.

SELECT-OPTIONS : s_vtweg FOR vbak-vtweg ,
                 s_spart FOR vbak-spart,
                 s_vbeln FOR vbak-vbeln,
                 s_vkbur FOR vbak-vkbur ,
                 s_vkgrp FOR vbak-vkgrp,
                 s_kunnr FOR vbak-kunnr,
                 s_audat FOR vbak-audat OBLIGATORY,
                 s_auart FOR vbak-auart.

SELECTION-SCREEN : END OF BLOCK b1.

*&---------------------------------------------------------------------*
*&  Include           Z_VA25_QUOTATIONS_CLS_DEFIN
*&---------------------------------------------------------------------*
CLASS lcl_quotation_disp DEFINITION CREATE PUBLIC.

  PUBLIC SECTION.
    TYPES:BEGIN OF ty_invcost,
            knumv TYPE knumv,
            kposn TYPE   kposn,
            kschl TYPE kscha,
            kbetr TYPE kbetr,
          END OF ty_invcost.

    DATA : lt_invcost TYPE STANDARD TABLE OF ty_invcost,
           lv_bmeng   TYPE bmeng.

    DATA   : lo_salv TYPE REF TO cl_salv_table.

    METHODS: validate_selection,
      constructor IMPORTING iv_vkorg TYPE vkorg,
      build_quotation,
      disp_quotation.

  PRIVATE SECTION.
    TYPES : BEGIN OF ty_invoice,
              vbelv     TYPE vbeln_von,
              posnv      TYPE posnr_von,
              vbeln_inv  TYPE vbeln_nach,
              posnr_inv TYPE posnr_nach,
              fkimg      TYPE fkimg,
              netwr      TYPE netwr_fp,
              charg     TYPE charg_d,
              kbetr      TYPE kbetr,
            END OF ty_invoice.

    DATA : ls_invoice    TYPE ty_invoice,
           lt_invoice    TYPE TABLE OF ty_invoice,
           lt_final      TYPE STANDARD TABLE OF ty_final,
           lt_final_tmp  TYPE STANDARD TABLE OF ty_final,
           ls_final      TYPE ty_final,
           ls_final_temp TYPE ty_final.

    DATA  : lv_vkorg TYPE vkorg.

ENDCLASS.

*&---------------------------------------------------------------------*
*&  Include           Z_VA25_QUOTATIONS_CLS_IMPLN
*&---------------------------------------------------------------------*

CLASS lcl_quotation_disp IMPLEMENTATION.

  METHOD validate_selection.

*&----------------------------------------------
***            Sales Org Validation
*&----------------------------------------------

    IF p_vkorg IS NOT INITIAL.

      SELECT  vkorg
        FROM  tvko
         INTO TABLE @DATA(lt_tvko)
         WHERE vkorg = @p_vkorg.

*** Check for Sales Org Authorization
      IF lt_tvko[] IS NOT INITIAL.
        LOOP AT lt_tvko ASSIGNING FIELD-SYMBOL(<fs_tvko>).
          IF <fs_tvko> IS ASSIGNED.
            AUTHORITY-CHECK OBJECT 'ZVA25_ORG1'
             ID 'VKORG' FIELD <fs_tvko>-vkorg
             ID 'ACTVT' FIELD '03'.

            IF sy-subrc = 0.
            ELSE.
              MESSAGE e398(00) WITH text-002.
            ENDIF.
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDIF.
  ENDMETHOD.
  METHOD constructor.

    lv_vkorg  = iv_vkorg .

  ENDMETHOD.

  METHOD build_quotation.
    DATA : lv_invqty TYPE fkimg,
*           lv_first_name TYPE pad_vorna.
           lv_name   TYPE string.
    CONSTANTS :lc_parvw TYPE parvw VALUE 'VE'.   "Internal conversion partner 
function PE is VE
*** Fetch sales document header details from VBAK
    SELECT vbeln,
           angdt,
           bnddt,
           audat,
           auart,
           vkorg,
           vtweg,
           spart,
           vkgrp,
           vkbur,
           kunnr
      FROM vbak
      INTO TABLE @DATA(lt_vbak)
      WHERE vbeln IN @s_vbeln
        AND audat IN @s_audat
        AND auart IN @s_auart
        AND vkorg EQ @lv_vkorg
        AND vtweg IN @s_vtweg
        AND spart IN @s_spart
        AND vkgrp IN @s_vkgrp
        AND vkbur IN @s_vkbur
        AND kunnr IN @s_kunnr.

    IF lt_vbak[] IS NOT INITIAL.
      SORT lt_vbak BY vbeln .

*** Fetch customer no from KNA1 for all selected customers from sales docuem
nt header

      SELECT kunnr,
             name1
        FROM kna1
        INTO TABLE @DATA(lt_kna1)
       FOR ALL ENTRIES IN @lt_vbak
       WHERE kunnr  EQ @lt_vbak-kunnr.
*** Fetch sales document item data from VBAP
      SELECT vbeln,
             posnr,
             matnr,
             matkl,
             arktx,
             abgru,
             kwmeng,
             kzwi6
        FROM vbap
        INTO TABLE @DATA(lt_vbap)
        FOR ALL ENTRIES IN @lt_vbak
        WHERE vbeln EQ @lt_vbak-vbeln.

      IF lt_vbap[] IS NOT INITIAL.
        SORT lt_vbap BY vbeln posnr.

*** Fetch Overall processing Status of the SD document item from VBUP
        SELECT vbeln,
               posnr,
               gbsta
          FROM vbup
          INTO TABLE @DATA(lt_vbup)
          FOR ALL ENTRIES IN @lt_vbap
          WHERE vbeln EQ @lt_vbap-vbeln
          AND   posnr EQ @lt_vbap-posnr.

        IF lt_vbup[] IS NOT INITIAL.
          SORT lt_vbup BY vbeln posnr.
        ENDIF.
      ENDIF.
*** Fetch Customer Purchase Order reference number from VBKD
      SELECT vbeln,
             posnr,
             bstkd
        FROM vbkd
        INTO TABLE @DATA(lt_vbkd)
        FOR ALL ENTRIES IN @lt_vbak
        WHERE vbeln EQ @lt_vbak-vbeln.

      IF lt_vbkd[] IS NOT INITIAL.
        SORT lt_vbkd BY vbeln posnr DESCENDING.
        DELETE ADJACENT DUPLICATES FROM lt_vbkd COMPARING vbeln.
      ENDIF.

*** Fetch Personnel no from VBPA for Partner function as PE
      SELECT vbeln,
             posnr,
             parvw,
             pernr
        FROM vbpa
        INTO TABLE @DATA(lt_vbpa)
        FOR ALL ENTRIES IN @lt_vbap
        WHERE vbeln EQ @lt_vbap-vbeln
        AND   parvw EQ @lc_parvw.

      IF lt_vbpa[] IS NOT INITIAL.
        SORT lt_vbpa BY vbeln posnr parvw.
      ENDIF.

*** Fetch Invoice no from VBFA for sales document header as preceding SD do
cument and document category as  ( 'M' : Invoice)
      SELECT vbelv,
             posnv,
             vbeln,
             posnn,
             vbtyp_n,
             erdat,
             erzet
        FROM vbfa
        INTO TABLE @DATA(lt_vbfa)
        FOR ALL ENTRIES IN @lt_vbak
        WHERE vbelv EQ @lt_vbak-vbeln
        AND   vbtyp_n EQ 'M'.

      IF lt_vbfa[] IS NOT INITIAL.
        SORT lt_vbfa BY vbelv posnv.

*** Fetch document condition no from VBRK for the invoice no fetched above
        SELECT   vbeln,
                 knumv,
                 fksto
                 FROM vbrk
                 INTO TABLE @DATA(lt_vbrk)
                 FOR ALL ENTRIES IN @lt_vbfa
                 WHERE vbeln EQ @lt_vbfa-vbeln.

*** To Identify invoices which are cancelled
        IF lt_vbrk[] IS NOT INITIAL.
          SORT lt_vbrk BY vbeln.
          LOOP AT  lt_vbfa ASSIGNING FIELD-SYMBOL(<fs_vbfa_tmp>) .
            READ TABLE lt_vbrk TRANSPORTING NO FIELDS WITH KEY vbeln = <fs_vbf
a_tmp>-vbeln
                                                               fksto = 'X' BIN
ARY SEARCH.
            IF sy-subrc = 0.
              CLEAR <fs_vbfa_tmp>.
            ELSE.
              CONTINUE.
            ENDIF.
          ENDLOOP.
        ENDIF.
        DELETE lt_vbfa WHERE vbelv IS INITIAL.

*** Fetch Invoiced Quantity and Invoice net value for the selected invoices 
from VBRP
        SELECT vbeln,
               posnr,
               fkimg,
               netwr,
               charg
          FROM vbrp
          INTO TABLE @DATA(lt_vbrp)
          FOR ALL ENTRIES IN @lt_vbfa
          WHERE vbeln EQ @lt_vbfa-vbeln
          AND   posnr EQ @lt_vbfa-posnn.

*** Pass document codition no from vbrk and item no from vbrp to internal t
able lt_invcost.
        APPEND INITIAL LINE TO lt_invcost ASSIGNING FIELD-
SYMBOL(<fs_invcost>).

        SORT lt_vbrk BY vbeln.
        IF lt_vbrp IS NOT INITIAL.
          LOOP AT lt_vbrp ASSIGNING FIELD-SYMBOL(<fs_vbrp>).
            READ TABLE lt_vbrk ASSIGNING FIELD-SYMBOL(<fs_vbrk>) WITH KEY vbel
n = <fs_vbrp>-vbeln BINARY SEARCH.
            IF sy-subrc = 0 AND <fs_vbrk> IS ASSIGNED.
              <fs_invcost>-knumv = <fs_vbrk>-knumv.
              <fs_invcost>-kposn = <fs_vbrp>-posnr.
              APPEND <fs_invcost> TO lt_invcost.
            ENDIF.
          ENDLOOP.
        ENDIF.

**** Fetch Invoice cost (condition amount percentage rate) from KONV for the 
document condition no of selected invoice by item .
        IF lt_invcost[] IS NOT INITIAL.
          SORT lt_invcost BY knumv kposn.
          SELECT knumv,
                 kposn,
                 kschl,
                 kbetr
            FROM konv
            INTO TABLE @DATA(lt_konv)
            FOR ALL ENTRIES IN @lt_invcost
            WHERE knumv EQ @lt_invcost-knumv
            AND   kposn EQ @lt_invcost-kposn
            AND   kschl EQ 'VPRS'.
        ENDIF.
        SORT lt_konv BY knumv kposn.

        LOOP AT lt_vbfa ASSIGNING FIELD-SYMBOL(<fs_vbfa>).
*** Fetch Invoice numbers to lt_invoice table in order to fetch all invoices 
including plitted invoice for quotation

          ls_invoice-vbelv = <fs_vbfa>-vbelv.
          ls_invoice-posnv = <fs_vbfa>-posnv.
          ls_invoice-vbeln_inv = <fs_vbfa>-vbeln.
          ls_invoice-posnr_inv = <fs_vbfa>-posnn.
          SORT lt_vbrp BY vbeln posnr.
          READ TABLE lt_vbrp ASSIGNING FIELD-SYMBOL(<fs_vbrp_inv>) WITH KEY vb
eln = <fs_vbfa>-vbeln
                                                                        posnr 
= <fs_vbfa>-posnn BINARY SEARCH.

*** Populate invoice quantity , invoice sales and Batch number to lt_invoice 
including splitted invoice for quotation
          IF ( sy-subrc = 0 AND  <fs_vbrp_inv> IS ASSIGNED ).
            ls_invoice-fkimg =  <fs_vbrp_inv>-fkimg.
            ls_invoice-netwr =  <fs_vbrp_inv>-netwr.
            ls_invoice-charg =  <fs_vbrp_inv>-charg.
          ENDIF.

          READ TABLE lt_vbrk ASSIGNING FIELD-SYMBOL(<fs_vbrk_inv>) WITH KEY vb
eln = <fs_vbrp_inv>-vbeln BINARY SEARCH.
          IF sy-subrc = 0 AND <fs_vbrk_inv> IS ASSIGNED.
            READ TABLE lt_konv ASSIGNING FIELD-SYMBOL(<fs_konv>) WITH KEY knum
v = <fs_vbrk_inv>-knumv
                                                                        kposn 
= <fs_vbrp_inv>-posnr BINARY SEARCH.
*** Populate Invoice cost
            IF ( sy-subrc = 0 AND <fs_konv> IS ASSIGNED ).
              ls_invoice-kbetr = <fs_konv>-kbetr.
            ENDIF.
          ENDIF.

          APPEND ls_invoice TO lt_invoice.
        ENDLOOP.

      ENDIF.

*** && Fetch Sales Order from VBFA by passing preceding document(vbelv-
quotation)
*** and document category of subsequent document  as 'C'
      IF lt_vbap[] IS NOT INITIAL.
        SELECT vbelv,
               posnv,
               vbeln,
               posnn,
               vbtyp_n
          FROM vbfa
          INTO TABLE @DATA(lt_vbfa1)
          FOR ALL ENTRIES IN @lt_vbap
          WHERE vbelv EQ @lt_vbap-vbeln
          AND   posnv EQ @lt_vbap-posnr
          AND   vbtyp_n EQ 'C'.

        IF lt_vbfa1[] IS NOT INITIAL.
          SORT lt_vbfa1 BY vbelv posnv.
        ENDIF.
      ENDIF.
    ENDIF.

    DELETE lt_invoice WHERE vbelv IS INITIAL.

    UNASSIGN  : <fs_vbrk>, <fs_vbrp> , <fs_invcost>.

***& ----------------------------------------------------------
*** Process final internal table
***& ----------------------------------------------------------
    IF lt_vbap[] IS NOT INITIAL.
      SORT lt_vbap BY vbeln posnr ASCENDING.

      LOOP AT lt_vbap ASSIGNING FIELD-SYMBOL(<fs_vbap>).

***  Populate  item no ,material group , material no, material description 
,rejection reason,  ordered qty, net price and net value
        gs_final-posnr = <fs_vbap>-posnr.
        gs_final-matkl = <fs_vbap>-matkl.
        gs_final-matnr = <fs_vbap>-matnr.
        gs_final-arktx = <fs_vbap>-arktx.
        gs_final-abgru = <fs_vbap>-abgru.
        gs_final-kwmeng = <fs_vbap>-kwmeng.
        gs_final-kzwi6 = <fs_vbap>-kzwi6.

*** Populate Sales Order from LT_VBFA1
        READ TABLE lt_vbfa1 ASSIGNING FIELD-SYMBOL(<fs_order>) WITH KEY vbelv 
= <fs_vbap>-vbeln
                                                                      posnv = 
<fs_vbap>-posnr BINARY SEARCH.

        IF sy-subrc = 0 AND <fs_order> IS ASSIGNED.
          gs_final-sales_ord = <fs_order>-vbeln.    "Subsequent document
        ENDIF.
*** Fetch Sales Executive no from PA0002 by passing pernr from lt_vbpa
        READ TABLE lt_vbpa ASSIGNING FIELD-SYMBOL(<fs_vbpa>) WITH KEY vbeln = 
<fs_vbap>-vbeln BINARY SEARCH.

        IF sy-subrc = 0 AND <fs_vbpa> IS ASSIGNED.
*          SELECT SINGLE vorna  FROM pa0002 INTO lv_first_name WHERE pernr 
= <fs_vbpa>-pernr.
*          gs_final-sales_exe  = lv_first_name.
          SELECT SINGLE vorna , nachn FROM pa0002 INTO @DATA(ls_name) WHERE pe
rnr = @<fs_vbpa>-pernr.
          CONCATENATE ls_name-vorna ls_name-nachn INTO lv_name SEPARATED BY sp
ace.
          gs_final-sales_exe  = lv_name.
        ENDIF.

*** Net price = Net value/Ordered Quantity
        IF <fs_vbap>-kwmeng NE 0.
          gs_final-net_price = <fs_vbap>-kzwi6 / <fs_vbap>-kwmeng.
        ELSE.
          gs_final-net_price = <fs_vbap>-kzwi6.
        ENDIF.

        SORT lt_vbak BY vbeln ASCENDING.
        READ TABLE lt_vbak ASSIGNING FIELD-SYMBOL(<fs_vbak>) WITH KEY vbeln = 
<fs_vbap>-vbeln BINARY SEARCH.

*** populate sales office , doc date, sales doc, valid from and to
        IF  ( sy-subrc = 0 AND <fs_vbak> IS ASSIGNED ).
*          gs_final-vkbur = <fs_vbak>-vkbur.
          gs_final-audat = <fs_vbak>-audat.
          gs_final-vbeln = <fs_vbak>-vbeln.
          gs_final-angdt = <fs_vbak>-angdt.
          gs_final-bnddt = <fs_vbak>-bnddt.

          SORT lt_kna1 BY kunnr.
          READ TABLE lt_kna1 ASSIGNING FIELD-SYMBOL(<fs_kna1>) WITH KEY kunnr  
= <fs_vbak>-kunnr BINARY SEARCH.

*** Populate Customer no and name
          IF sy-subrc = 0 AND <fs_kna1>  IS ASSIGNED.
            gs_final-kunnr = <fs_kna1>-kunnr.
            gs_final-name1 = <fs_kna1>-name1.
          ENDIF.

          SORT lt_vbkd BY vbeln.
          READ TABLE lt_vbkd ASSIGNING FIELD-SYMBOL(<fs_vbkd>) WITH KEY vbeln 
= <fs_vbak>-vbeln BINARY SEARCH.

*** Populate PO ref no .
          IF sy-subrc = 0 AND <fs_vbkd> IS ASSIGNED.
            gs_final-bstkd = <fs_vbkd>-bstkd.
          ENDIF.

*** Fetch confirmed Quantity for selected sales item from VBEP
          SELECT vbeln,
                 posnr,
             SUM( bmeng ) AS bmeng
             FROM vbep
             INTO @DATA(ls_vbep)
             WHERE vbeln EQ @<fs_vbap>-vbeln
             AND   posnr EQ @<fs_vbap>-posnr
             GROUP BY vbeln, posnr.
          ENDSELECT.

*** Populate confirmed quantity
          gs_final-bmeng = ls_vbep-bmeng .
*** Populate balance quantity  (ordered qty -Confirmed qty)
          gs_final-bal_qty = gs_final-kwmeng - gs_final-bmeng.
          SORT lt_vbup BY vbeln posnr.
          READ TABLE lt_vbup ASSIGNING FIELD-SYMBOL(<fs_vbup>) WITH KEY vbeln 
= <fs_vbap>-vbeln
                                                                        posnr 
= <fs_vbap>-posnr BINARY SEARCH.
*** Populate Item status
          IF sy-subrc = 0 AND <fs_vbup> IS ASSIGNED.
            gs_final-gbsta = <fs_vbup>-gbsta.
          ENDIF.
        ENDIF.
        APPEND gs_final TO gt_final.

        CLEAR  :gs_final, ls_name, lv_name.
      ENDLOOP.
    ENDIF.

    SORT gt_final BY vbeln posnr.
    DELETE ADJACENT DUPLICATES FROM gt_final COMPARING ALL FIELDS.

*** Copy final table to lt_final ad fetch invoice related sales doc to lt_f
inal_tmp
    lt_final[]  = gt_final[].

    SORT lt_final .
    IF lt_invoice[] IS NOT INITIAL.
      LOOP AT lt_invoice ASSIGNING FIELD-SYMBOL(<fs_invoice>) .

        READ TABLE lt_final INTO ls_final WITH KEY vbeln = <fs_invoice>-vbelv
                                                   posnr =  <fs_invoice>-
posnv.

        ls_final-vbeln_inv = <fs_invoice>-vbeln_inv.
        ls_final-fkimg = <fs_invoice>-fkimg.
        ls_final-netwr = <fs_invoice>-netwr.
        ls_final-charg = <fs_invoice>-charg.
        ls_final-kbetr = <fs_invoice>-kbetr.
        APPEND ls_final TO lt_final_tmp.
        CLEAR ls_final.
      ENDLOOP.
    ENDIF.
***&&& delete entries from gt_final which is available in lt_final-tmp,
***so as to invoice related sales docu will be in lt_final_tmp
    IF lt_final_tmp[] IS NOT INITIAL.
      LOOP AT lt_final_tmp ASSIGNING FIELD-SYMBOL(<fs_final>).

        READ TABLE lt_final INTO ls_final WITH KEY  vbeln = <fs_final>-vbeln
                                                    posnr = <fs_final>-posnr B
INARY SEARCH.

        IF sy-subrc = 0.
          DELETE TABLE gt_final FROM ls_final .
          CLEAR ls_final.
          APPEND <fs_final> TO gt_final.
        ENDIF.
      ENDLOOP.
    ENDIF.

    SORT gt_final BY vbeln posnr.

****** Populate  Order loss quantity =  (Order qty )- (sum of invoiced qty 
of invoice with same item )

    CLEAR: gs_final, ls_final, ls_final_temp.
    REFRESH :lt_final_tmp.
    IF gt_final[] IS NOT INITIAL.
      LOOP AT gt_final INTO gs_final.
        ls_final_temp = gs_final.
        AT NEW posnr.
          CLEAR lv_invqty.
        ENDAT.

        lv_invqty =    lv_invqty + gs_final-fkimg.
        AT END OF posnr.
          ls_final_temp-loss_qty = ls_final_temp-kwmeng - lv_invqty.
          APPEND ls_final_temp TO lt_final_tmp.
        ENDAT.
      ENDLOOP.
    ENDIF.

    IF lt_final_tmp[] IS NOT INITIAL.
      SORT lt_final_tmp BY vbeln posnr.
      LOOP AT gt_final ASSIGNING FIELD-SYMBOL(<fs_final1>).

        READ TABLE lt_final_tmp INTO ls_final_temp WITH KEY vbeln = <fs_final1
>-vbeln
                                                             posnr = <fs_final
1>-posnr BINARY SEARCH.
        IF sy-subrc = 0.
          <fs_final1>-loss_qty = ls_final_temp-loss_qty.
***  lost sales value = Order loss qty * Net price
          <fs_final1>-lost_sale = ls_final_temp-loss_qty * ls_final_temp-
net_price.
          IF <fs_final1>-loss_qty < 0.
            <fs_final1>-loss_qty = 0.
          ENDIF.
          CLEAR :ls_final_temp.
        ENDIF.
      ENDLOOP.
    ENDIF.

    SORT gt_final BY vbeln posnr.
    DELETE ADJACENT DUPLICATES FROM gt_final COMPARING ALL FIELDS .

  ENDMETHOD.

  METHOD disp_quotation.

    DATA : columns TYPE REF TO cl_salv_columns_table,
           column  TYPE REF TO cl_salv_column.

    TRY.
        CALL METHOD cl_salv_table=>factory
*      EXPORTING
*        list_display   = IF_SALV_C_BOOL_SAP=>FALSE
*        r_container    =
*        container_name =
          IMPORTING
            r_salv_table = lo_salv
          CHANGING
            t_table      = gt_final.

        lo_salv->get_functions( )->set_all( abap_true ).

        columns = lo_salv->get_columns(  ).
        columns->set_optimize( abap_true ).

***& Set short text and Long Text for columns in output

        columns->get_column( 'VBELN' )->set_short_text( 'Quot.Doc.' ).
        columns->get_column( 'VBELN' )->set_medium_text( 'Quotation Doc.' ).
        columns->get_column( 'VBELN' )->set_long_text( 'Quotation Document' ).
        columns->get_column( 'POSNR' )->set_short_text( 'Quot.Item' ).
        columns->get_column( 'POSNR' )->set_medium_text( 'Quotation Item' ).
        columns->get_column( 'POSNR' )->set_long_text( 'Quotation Item' ).
        columns->get_column( 'SALES_ORD' )->set_short_text( 'Sales Ord' ).
        columns->get_column( 'SALES_ORD' )->set_medium_text( 'Sales Order' ).
        columns->get_column( 'SALES_ORD' )->set_long_text( 'Sales Order' ).
        columns->get_column( 'KUNNR' )->set_short_text( 'Sold-to pt' ).
        columns->get_column( 'KUNNR' )->set_medium_text( 'Sold-to party' ).
        columns->get_column( 'ABGRU' )->set_short_text( '' ).                  
"To overwite the dictionary field label
        columns->get_column( 'ABGRU' )->set_medium_text( '' ).                 
 "To overwite the dictionary field label
        columns->get_column( 'NAME1' )->set_short_text( 'Name1' ).
        columns->get_column( 'BSTKD' )->set_short_text( 'PO No. ' ).
        columns->get_column( 'BSTKD' )->set_output_length( 20 ).
        columns->get_column( 'BSTKD' )->set_medium_text( 'PO Number' ).
        columns->get_column( 'BSTKD' )->set_long_text( 'Purchase Order Number' 
) .
        columns->get_column( 'BAL_QTY' )->set_short_text( ' ' ).
        columns->get_column( 'BAL_QTY' )->set_medium_text( 'Balance Quan' ).
        columns->get_column( 'BAL_QTY' )->set_long_text( 'Balance Quantity' ).
        columns->get_column( 'KZWI6' )->set_short_text( '' ).                  
"To overwite the dictionary field label
        columns->get_column( 'KZWI6' )->set_medium_text( '' ).                 
"To overwite the dictionary field label
        columns->get_column( 'KZWI6' )->set_long_text( 'Net Value' ).
        columns->get_column( 'LOSS_QTY' )->set_short_text( '' ).
        columns->get_column( 'LOSS_QTY' )->set_medium_text( 'Order loss qty' )
.
        columns->get_column( 'LOSS_QTY' )->set_long_text( 'Order loss qty' ).
        columns->get_column( 'GBSTA' )->set_short_text( 'Status' ).
        columns->get_column( 'VBELN_INV' )->set_short_text( 'Invoice No').
        columns->get_column( 'VBELN_INV' )->set_medium_text( 'Invoice No.' ).
        columns->get_column( 'VBELN_INV' )->set_long_text( 'Invoice Number' ).
        columns->get_column( 'FKIMG' )->set_short_text( '' ).
        columns->get_column( 'FKIMG' )->set_medium_text( 'Invoice Qty' ).
        columns->get_column( 'KBETR' )->set_short_text( '' ).
        columns->get_column( 'KBETR' )->set_medium_text( 'Cost per item' ).
        columns->get_column( 'KBETR' )->set_long_text( 'Cost per item' ).
        columns->get_column( 'NETWR' )->set_short_text( '' ).
        columns->get_column( 'NETWR' )->set_medium_text( '' ) .
        columns->get_column( 'NETWR' )->set_long_text( 'Invoice Net sales' ) .
        columns->get_column( 'LOST_SALE' )->set_short_text( '' ).
        columns->get_column( 'LOST_SALE' )->set_medium_text( 'Lost sales value
' ).
        columns->get_column( 'LOST_SALE' )->set_long_text( 'Lost sales value' 
).
        columns->get_column( 'SALES_EXE' )->set_short_text( '' ).
        columns->get_column( 'SALES_EXE' )->set_medium_text( 'Sales Exe Name' 
).
        columns->get_column( 'SALES_EXE' )->set_long_text( 'Sales Executive Na
me' ).

      CATCH cx_salv_msg .
    ENDTRY.

    lo_salv->display( ).
  ENDMETHOD.

ENDCLASS.

Potrebbero piacerti anche