price list report

31
Price List Report - Simulate a Pricing Procedure Purpose The purpose of this document is to describe the functionality provided by a new program "ZO2C_PRICE_LIST" which can be used to simulate a pricing procedure and provide a "price list" report for a range of materials specified on the selection-screen. Audience This document is intended for use by SAP SD functional consultants and end users who wish to see the Gross/Net/Cost Price of a range of materials. Uploading program ZO2C_PRICE_LIST The program source code is given in later section "Program Source Code". This source code can be uploaded into any SAP system by using the "Upload" function from transaction SE38. The name of the program can be modified to adhere to local SAP program naming standards, as required. The program was created on SAP ECC version 6.0, but may work on some earlier SAP release versions. All program text elements will be generated automatically (in English) upon running the program for the first time. Selection-Screen A brief description of the selection-screen is given below. The Sales Area and Product sections are used to restrict the range of materials for which the Price List is to be generated. Additionally, the "plant" field is also used to restrict the report to show only materials which exist in the specified plant. The "Additional Information for Price Calculation" section contains some of the information which is needed for the simulation of a pricing procedure. A SAP Standard Pricing Procedure, Order Type and Item Category are defaulted by the program. However, as most SAP installations will have custom (Y..., Z...) versions of these, it may be necessary to change these default values when the program is executed on the local SAP system. A quantity of 1 KG is also defaulted. This can modified if the price list needs to be generated for larger quantities (which takes scaled price conditions into account). The pricing date is defaulted to the current date, and this is the date on which all price conditions must be valid. All materials where no gross price is found will be suppressed from the report if the "Hide lines with no gross price" flag is ticked. Finally, an ALV report variant can be specified in the last section of the selection- screen.

Upload: naresh-babu-mamilla

Post on 15-Oct-2014

52 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Price List Report

Price List Report - Simulate a Pricing Procedure

Purpose

The purpose of this document is to describe the functionality provided by a new program

"ZO2C_PRICE_LIST" which can be used to simulate a pricing procedure and provide a "price list" report

for a range of materials specified on the selection-screen.

Audience

This document is intended for use by SAP SD functional consultants and end users who wish to see the

Gross/Net/Cost Price of a range of materials.

Uploading program ZO2C_PRICE_LIST

The program source code is given in later section "Program Source Code". 

This source code can be uploaded into any SAP system by using the "Upload" function from transaction

SE38. The name of the program can be modified to adhere to local SAP program naming standards, as

required.

The program was created on SAP ECC version 6.0, but may work on some earlier SAP release versions.

All program text elements will be generated automatically (in English) upon running the program for the

first time.

Selection-Screen

A brief description of the selection-screen is given below.

The Sales Area and Product sections are used to restrict the range of materials for which the Price List is

to be generated. Additionally, the "plant" field is also used to restrict the report to show only materials

which exist in the specified plant.

The "Additional Information for Price Calculation" section contains some of the information which is

needed for the simulation of a pricing procedure.  A SAP Standard Pricing Procedure, Order Type and

Item Category are defaulted by the program. However, as most SAP installations will have custom (Y...,

Z...) versions of these, it may be necessary to change these default values when the program is

executed on the local SAP system.

A quantity of 1 KG is also defaulted.  This can modified if the price list needs to be generated for larger

quantities (which takes scaled price conditions into account).

The pricing date is defaulted to the current date, and this is the date on which all price conditions must

be valid.

All materials where no gross price is found will be suppressed from the report if the "Hide lines with no

gross price" flag is ticked.

Finally, an ALV report variant can be specified in the last section of the selection-screen.

Report Layout

The program produces a simple ALV report with the pricing information for each material found.

Page 2: Price List Report

The population of each column is the report is given below:

Column SAP Field Description

SOrg MVKE-

VKORG

Sales Organisation

D Ch MVKE-

VTWEG

Distribution Channel

Material MVKE-

MATNR

Material Number

Only the materials which exist for the specified Sales Area (in table MVKE) and specified

Plant (in table MARC) will appear in the report.  Materials where the deletion indicator is

set at either plant or Sales Area level will be excluded from the report.

Description MAKT-

MAKTX

Material Description in the logon language

Gross Price KOMP-

KZWI1

As a default, the gross price is taken from the Subtotal 1 field in the Pricing Procedure.If

Subtotal 1 is used for an alternative purpose in the local SAP system, the subroutine

"GET_PRICE_CONDITIONS" will need to be updated to calculate in the Gross Price in a

different way.

Program ZO2C_PRICE_LIST contains a 2nd way of determining the Gross Price - where it

will use the condition rate from the 1st active non-statistical condition type found of class

"B" (Prices). 

For performance reasons, this alternative gross price determination is deactivated in the

supplied source code, but this can be reactivated by a local developer if need be.  The

relevant coding is also contained in subroutine "GET_PRICE_CONDITIONS".   

*   loop at ft_komv ASSIGNING <komv>

*        where koaid = gc_koaid_price.

*     gd_gross_price = <komv>-kwert.

*     exit.

*   endloop.

Net Price KOMP-

NETWR

The net price calculated by the pricing procedure is used for this column.  Note: this is not

the unit net price (NETPR), but the total net price (NETWR) for the quantity entered on the

selection-screen.

Cost Price KOMP-

WAVWR

The total cost price calculated by the pricing procedure.

This is normally derived from statistical condition type VPRS in the pricing procedure,

which itself is taken from the standard price in the material master (MBEW-STPRS).

Curr KOMK-

WAERK

The currency used in the pricing procedure

Product

Hierarchy

MVKE-

PRODH

The product hierarchy from the sales view of the material

Customer P_KUNNR The customer number entered on the selection-screen

Page 3: Price List Report

Name KNA1-

NAME1

The first line of the customer's name

Cust Country KNA1-

LAND1

The customer country

Pricing Date P_PRSDT The pricing date entered on the selection-screen

Note: the Gross, Net and Cost Price columns will always be calculated using the quantity specified on the

selection screen.  i.e. they will show the total prices, not the unit prices.

Custom Pricing Fields

If the local SAP pricing procedures contain custom (e.g. ZZ...) fields in the header or item field

catalogues, it will be necessary to populate these custom fields in this program. 

A developer will need to update subroutine "GET_PRICE_CONDITIONS" in the sections below to fill each

custom field.

* If any bespoke ZZ... fields exist in the HEADER table KOMK,

* these should be filled here

* MOVE:              hdrtable1-zzfielda     TO fs_komk-zzfielda,

*                    hdrtable2-zzfieldb     TO fs_komk-zzfieldb. 

* If any bespoke ZZ... fields exist in the ITEM table KOMP (or append

* structure KOMPAZ), these should be filled here

* MOVE:              itemtable1-zzfielda    TO fs_komp-zzfielda,

*                    itemtable2-zzfieldb    TO fs_komp-zzfieldb.

This is very similar to the way in which the custom fields are passed to the pricing communication

structures in the SAP standard userexits below (in program MV45AFZZ):

USEREXIT_PRICING_PREPARE_TKOMK (Header)

USEREXIT_PRICING_PREPARE_TKOMP (Item)             

Program Source Code

REPORT  zo2c_price_list.

************************************************************************

* Report ZO2C_PRICE_LIST           Author : Ali Crawshaw               *

*                                                                      *

*                                  Date   : 22/03/2010                 *

*                                                                      *

* Description: Report to simulate the pricing procedure and show       *

*              the Gross, Net and Cost price of a material             *

Page 4: Price List Report

*                                                                      *

************************************************************************

* Revision history :                                                   *

************************************************************************

* Date       :                  Modification Id  :                     *

* Name       :                                                         *

* Description:                                                         *

*                                                                      *

************************************************************************

*************************** DATA DECLARATIONS **************************

***** TABLES

TABLES: mara,

        mvke,

        knvv,

        komp.

***** TYPES

TYPES: BEGIN OF gty_mvke.

        INCLUDE STRUCTURE mvke.

TYPES: END OF gty_mvke.

TYPES: BEGIN OF gty_report,

         vkorg       TYPE vkorg,

         vtweg       TYPE vtweg,

         matnr       TYPE matnr,

         maktx       TYPE maktx,     "Material Description

         gross_price TYPE netpr,

         net_price   TYPE netpr,

         cost_price  TYPE netpr,

         waerk       TYPE waerk,

         prodh       TYPE prodh_d,

         kunnr       TYPE kunnr,

         kunnr_land1 TYPE land1,

         kunnr_name1 TYPE name1,

         prsdt       TYPE prsdt,

Page 5: Price List Report

       END OF gty_report.

TYPES: BEGIN OF gty_makt,

         matnr      TYPE matnr,

         maktx      TYPE maktx,

       END OF gty_makt.

TYPES: BEGIN OF gty_vkorg_bukrs,

         vkorg    TYPE vkorg,

         bukrs    TYPE bukrs,

       END OF gty_vkorg_bukrs.

TYPES: BEGIN OF gty_marc,

         matnr    TYPE matnr,

         werks    TYPE werks_d,

         lvorm    TYPE lvorm,

       END OF gty_marc.

***** TYPE-POOLS

TYPE-POOLS: slis.

***** INTERNAL TABLES

* Standard Tables

DATA: gt_komv         TYPE STANDARD TABLE OF komv,

      gt_report       TYPE STANDARD TABLE OF gty_report,

      gt_alv_fieldcat TYPE                   slis_t_fieldcat_alv.

* Hashed Tables

DATA: gth_vkorg_bukrs TYPE HASHED TABLE OF   gty_vkorg_bukrs

                           WITH UNIQUE KEY   vkorg.

* Sorted Tables

DATA: gtsrt_makt      TYPE SORTED   TABLE OF gty_makt

                           WITH UNIQUE KEY   matnr,

      gtsrt_mvke      TYPE SORTED   TABLE OF gty_mvke

                           WITH UNIQUE KEY   matnr

                                             vkorg

                                             vtweg,

      gtsrt_marc      TYPE SORTED   TABLE OF gty_marc

                           WITH UNIQUE KEY   matnr

                                             werks,

Page 6: Price List Report

      gtsrt_textpool  TYPE SORTED   TABLE OF textpool

                           WITH UNIQUE KEY   id key.

*****

DATA: gs_komk             TYPE komk,

      gs_komp             TYPE komp,

      gs_mara             TYPE mara,

      gs_knvv             TYPE knvv,

      gs_alv_layout       TYPE slis_layout_alv,

      gs_alv_dis_variant  TYPE disvariant,

      gs_textpool         TYPE textpool.

***** TYPE-POOLS

TYPE-POOLS: slis.

***** CONSTANTS

CONSTANTS: gc_x                TYPE c            VALUE 'X',

           gc_alv_var_save     TYPE c            VALUE 'A'.  "Save all types of variant

***** VARIABLES

DATA: gd_maktx               TYPE maktx,

      gd_bukrs               TYPE bukrs,

      gd_kunnr_name1         TYPE name1,

      gd_kunnr_land1         TYPE land1,

      gd_sales_area          TYPE char8,

      gd_last_sales_area     TYPE char6,

      gd_price_found_flag    TYPE flag,

      gd_gross_price         TYPE netpr,

      gd_net_price           TYPE netpr,

      gd_cost_price          TYPE netpr,

      gd_mat_exists_in_plant TYPE flag.

***** FIELD-SYMBOLS

FIELD-SYMBOLS: <mvke>        TYPE gty_mvke,

               <report>      TYPE gty_report,

               <makt>        TYPE gty_makt,

               <vkorg_bukrs> TYPE gty_vkorg_bukrs,

               <textpool>    TYPE textpool.

Page 7: Price List Report

*----- SELECTION-SCREEN ------------------------------------------------

***** Selections Block

SELECTION-SCREEN BEGIN OF BLOCK sels WITH  FRAME

                                     TITLE text-s01.

****** ...Sales Area

SELECTION-SCREEN BEGIN OF BLOCK area WITH  FRAME

                                     TITLE text-s03.

SELECT-OPTIONS: s_vkorg  FOR  mvke-vkorg,

                s_vtweg  FOR  mvke-vtweg.

PARAMETERS:     p_spart  LIKE mara-spart DEFAULT '01'.

SELECTION-SCREEN END OF BLOCK area.

***** ...Product

SELECTION-SCREEN BEGIN OF BLOCK prod WITH  FRAME

                                     TITLE text-s04.

SELECT-OPTIONS: s_matnr  FOR  mvke-matnr.

SELECTION-SCREEN END OF BLOCK prod.

***** ...Additional fields for price calculation

SELECTION-SCREEN BEGIN OF BLOCK addi WITH  FRAME

                                      TITLE text-s05.

PARAMETERS:     p_kunnr  LIKE knvv-kunnr                      OBLIGATORY,

                p_werks  LIKE komp-werks                      OBLIGATORY,

                p_waers  LIKE komk-waerk DEFAULT     'EUR'    OBLIGATORY.

SELECTION-SCREEN SKIP 1.

PARAMETERS:     p_kalsm  TYPE kalsmasd   DEFAULT     'RVAA01' OBLIGATORY,

                p_auart  TYPE auart      DEFAULT     'TA'     OBLIGATORY,

                p_pstyv  TYPE pstyv      DEFAULT     'TAN'    OBLIGATORY,

                p_taxm1  TYPE taxm1      DEFAULT     '1'      OBLIGATORY,

                p_taxk1  TYPE taxk1      DEFAULT     '1'      OBLIGATORY.

SELECTION-SCREEN SKIP 1.

parameters:     p_qty    TYPE kwmeng     DEFAULT     '1'      OBLIGATORY,

                p_vrkme  TYPE vrkme      DEFAULT     'KG'     OBLIGATORY.

SELECTION-SCREEN SKIP 1.

PARAMETERS:     p_prsdt  LIKE komk-prsdt DEFAULT sy-datum.

PARAMETERS:     p_hdnogr AS   CHECKBOX   DEFAULT 'X'.

Page 8: Price List Report

SELECTION-SCREEN END OF BLOCK addi.

SELECTION-SCREEN END OF BLOCK sels.

***** Report Display Variant

SELECTION-SCREEN BEGIN OF BLOCK vari WITH  FRAME

                                     TITLE text-s02.

PARAMETERS: p_alvvar TYPE slis_vari.

SELECTION-SCREEN END OF BLOCK vari.

*************************** MAIN PROCESSING ****************************

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

*& Event INITIALIZATION                                                *

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

INITIALIZATION.

* Set the report name, as this is needed to save/retrieve ALV variants

  gs_alv_dis_variant = sy-repid.

* Build the Text Elements if this is the first time the program

* is being run on this system

  PERFORM build_program_text_elements.

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

*& Event AT SELECTION-SCREEN                                           *

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

* F4 Drop-down for ALV variant

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_alvvar.

  PERFORM f4_alv_variant CHANGING p_alvvar.

* Check that the ALV variant specified exists

AT SELECTION-SCREEN ON p_alvvar.

  IF NOT p_alvvar IS INITIAL.

    gs_alv_dis_variant-variant = p_alvvar.

    CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'

      EXPORTING

        i_save        = gc_alv_var_save

      CHANGING

        cs_variant    = gs_alv_dis_variant

      EXCEPTIONS

        wrong_input   = 1

Page 9: Price List Report

        not_found     = 2

        program_error = 3

        OTHERS        = 4.

*   If not found, display a message

    IF sy-subrc IS NOT INITIAL.

      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

    ENDIF.

  ENDIF.

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

*& Event START-OF-SELECTION                                            *

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

START-OF-SELECTION.

* Initialise everything

  PERFORM init_data.

* Get all the materials by plant

  PERFORM get_all_materials_by_plant.

* Read the materials

  PERFORM get_all_materials_by_salesarea.

* Build the report data

  PERFORM build_report_data.

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

*& Event END-OF-SELECTION                                            *

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

END-OF-SELECTION.

* Buld the ALV field catalog

  PERFORM alv_build_field_catalog.

* And display the report

  PERFORM alv_display_report.

******************************** FORMS *********************************

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

*&      Form  GET_ALL_MATERIALS_BY_SALESAREA

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

*       Get the list of materials

Page 10: Price List Report

*----------------------------------------------------------------------*

FORM get_all_materials_by_salesarea .

  REFRESH gtsrt_mvke.

* Check that we found some materials for the plant entered on the selection

* screen

  CHECK gtsrt_marc[] IS NOT INITIAL.

* Get all the materials for this Sales Area

  SELECT * INTO TABLE gtsrt_mvke

         FROM mvke

         FOR ALL ENTRIES IN gtsrt_marc

         WHERE matnr EQ gtsrt_marc-matnr

         AND   vkorg IN s_vkorg

         AND   vtweg IN s_vtweg

         AND   lvorm =  space.   "No deletion indicator set

* No SUBRC check required

ENDFORM.                    " GET_ALL_MATERIALS_BY_SALESAREA

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

*&      Form  ALV_BUILD_FIELD_CATALOG

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

*       Build the ALV field catalog

*----------------------------------------------------------------------*

FORM alv_build_field_catalog .

* Build the field catalog

  DATA:  ls_fieldcat       TYPE slis_fieldcat_alv,

         ld_col_pos        TYPE i.

  CLEAR:  ls_fieldcat,

          ld_col_pos.

  REFRESH gt_alv_fieldcat.

*----- Macro to add a field to the catalog -------------------------------

  DEFINE add_field_to_catalog.

    add 1 to ld_col_pos.

*   &1 Field Name

*   &2 Key field - i.e. highlight

Page 11: Price List Report

*   &3 Text Headomg

*   &4 Output Length

*   &5 Remove leading zeros

*   &6 Show field

    ls_fieldcat-col_pos       = ld_col_pos.

    ls_fieldcat-tabname       = 'GT_REPORT'.

    ls_fieldcat-fieldname     = &1.

*   Field specific handling

    case &1.

      when others.

*       Do nothing

    endcase.

*   Highlight this field in BLUE?

    if &2 is not initial.

      ls_fieldcat-key           = 'X'.

      ls_fieldcat-emphasize     = 'C333'.

    endif.

    ls_fieldcat-seltext_l     = &3.

    ls_fieldcat-outputlen     = &4.

    ls_fieldcat-no_zero       = &5.

*   Do we hide this field?

    if &6 is initial.

      ls_fieldcat-no_out        = 'X'.

    endif.

    append ls_fieldcat to gt_alv_fieldcat.

    clear: ls_fieldcat.

  END-OF-DEFINITION.

*----- Get the Column Titles ---------------------------------------------

  add_field_to_catalog:

*   Field Name                Key     Text            Len   NoZero Show field

    'VKORG'                   space   text-a01        4     space  gc_x,

    'VTWEG'                   space   text-a02        2     space  gc_x,

    'MATNR'                   gc_x    text-a03        18    space  gc_x,

Page 12: Price List Report

    'MAKTX'                   space   text-a04        35    space  gc_x,

    'GROSS_PRICE'             space   text-a05        12    space  gc_x,

    'NET_PRICE'               gc_x    text-a06        12    space  gc_x,

    'COST_PRICE'              space   text-a07        12    space  gc_x,

    'WAERK'                   space   text-a08        3     space  gc_x,

    'PRODH'                   space   text-a09        12    space  gc_x,

    'KUNNR'                   space   text-a10        10    gc_x   gc_x,

    'KUNNR_NAME1'             space   text-a11        12    space  gc_x,

    'KUNNR_LAND1'             space   text-a12        12    space  gc_x,

    'PRSDT'                   space   text-a13        10    space  gc_x.

ENDFORM.                    " ALV_BUILD_FIELD_CATALOG

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

*&      Form  ALV_DISPLAY_REPORT

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

*       Display the report

*----------------------------------------------------------------------*

FORM alv_display_report .

* Set the ALV display options

  CLEAR gs_alv_layout.

  gs_alv_layout-colwidth_optimize = 'X'.

  gs_alv_layout-min_linesize      = 255.

* And display the report

* Call the ALV

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

    EXPORTING

*     I_INTERFACE_CHECK                 = ' '

*     I_BYPASSING_BUFFER                = ' '

*     I_BUFFER_ACTIVE                   = ' '

      i_callback_program                = sy-repid

*     i_callback_pf_status_set          = 'SET_CUSTOM_ALV_PF_STATUS'

*     i_callback_user_command           = 'HANDLE_ALV_EVENTS'

*     I_CALLBACK_TOP_OF_PAGE            = ' '

*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '

*     I_CALLBACK_HTML_END_OF_LIST       = ' '

Page 13: Price List Report

*     I_STRUCTURE_NAME                  =

*     I_BACKGROUND_ID                   = ' '

*     I_GRID_TITLE                      =

*     I_GRID_SETTINGS                   =

      is_layout                         = gs_alv_layout

      it_fieldcat                       = gt_alv_fieldcat[]

*     IT_EXCLUDING                      =

*     IT_SPECIAL_GROUPS                 =

*     IT_SORT                           =

*     IT_FILTER                         =

*     IS_SEL_HIDE                       =

*     I_DEFAULT                         = 'X'

      i_save                            = gc_alv_var_save

      is_variant                        = gs_alv_dis_variant

*     IT_EVENTS                         =

*     IT_EVENT_EXIT                     =

*     IS_PRINT                          =

*     IS_REPREP_ID                      =

*     I_SCREEN_START_COLUMN             = 0

*     I_SCREEN_START_LINE               = 0

*     I_SCREEN_END_COLUMN               = 0

*     I_SCREEN_END_LINE                 = 0

*     I_HTML_HEIGHT_TOP                 = 0

*     I_HTML_HEIGHT_END                 = 0

*     IT_ALV_GRAPHICS                   =

*     IT_HYPERLINK                      =

*     IT_ADD_FIELDCAT                   =

*     IT_EXCEPT_QINFO                   =

*     IR_SALV_FULLSCREEN_ADAPTER        =

*   IMPORTING

*     E_EXIT_CAUSED_BY_CALLER           =

*     ES_EXIT_CAUSED_BY_USER            =

    TABLES

      t_outtab                          = gt_report

Page 14: Price List Report

    EXCEPTIONS

      OTHERS                            = 0.

* No SUBRC check required

ENDFORM.                    " ALV_DISPLAY_REPORT

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

*&      Form  GET_MAKTX

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

*       Get the material description

*----------------------------------------------------------------------*

FORM get_maktx  USING    fd_matnr  TYPE matnr

                CHANGING fd_maktx  TYPE maktx.

  CLEAR fd_maktx.

* If we haven't already done so, read in all the material descriptions

  IF gtsrt_makt[] IS INITIAL.

    SELECT matnr

           maktx

           INTO TABLE gtsrt_makt

           FROM makt

           WHERE spras = sy-langu.

  ENDIF.

* Now get the material description

  READ TABLE gtsrt_makt ASSIGNING <makt>

             WITH TABLE KEY matnr = fd_matnr.

  IF sy-subrc IS INITIAL.

    fd_maktx = <makt>-maktx.

  ENDIF.

ENDFORM.                    " GET_MAKTX

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

*&      Form  F4_ALV_VARIANT

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

*       Search help for variant

*----------------------------------------------------------------------*

FORM f4_alv_variant CHANGING fd_var LIKE disvariant-variant.

* Fill the structure needed by the report

Page 15: Price List Report

  gs_alv_dis_variant-variant = fd_var.

* Look for any existing variants

  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'

    EXPORTING

      is_variant = gs_alv_dis_variant

      i_save     = gc_alv_var_save

    IMPORTING

      es_variant = gs_alv_dis_variant

    EXCEPTIONS

      OTHERS     = 1.

* Display error if not found

  IF sy-subrc IS NOT INITIAL.

    MESSAGE ID     sy-msgid

            TYPE   'S'

            NUMBER sy-msgno

            WITH   sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

* Otherwise, update the display variant structure

  ELSE.

    fd_var = gs_alv_dis_variant-variant.

  ENDIF.

ENDFORM.                    " F4_ALV_VARIANT

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

*&      Form  READ_CUSTOMER

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

*       Get the Customer details from KNA1 + KNVV

*----------------------------------------------------------------------*

FORM read_customer USING    fd_kunnr       TYPE kunnr

                           fd_vkorg       TYPE vkorg

                           fd_vtweg       TYPE vtweg

                  CHANGING fs_knvv        TYPE knvv

                           fd_kunnr_name1 TYPE name1

                           fd_kunnr_land1 TYPE land1.

  CLEAR: fs_knvv,

         fd_kunnr_name1,

Page 16: Price List Report

         fd_kunnr_land1.

  CHECK fd_kunnr IS NOT INITIAL.

* Get the Customer Name

  SELECT SINGLE name1

                land1

                INTO (fd_kunnr_name1,

                      fd_kunnr_land1)

                FROM kna1

                WHERE kunnr = fd_kunnr.

  CHECK sy-subrc IS INITIAL.

* Look to see if we have a customer

  SELECT SINGLE * INTO fs_knvv

                FROM knvv

                WHERE kunnr = fd_kunnr

                AND   vkorg = fd_vkorg

                AND   vtweg = fd_vtweg

                AND   spart = p_spart.

* NO SUBRC check required

ENDFORM.                    " READ_CUSTOMER

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

*&      Form  BUILD_REPORT_DATA

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

*       Build the Report data

*----------------------------------------------------------------------*

FORM build_report_data.

  CLEAR: gd_sales_area,

         gd_last_sales_area.

* Loop around the materials found

  LOOP AT gtsrt_mvke ASSIGNING <mvke>.

*   Build the Sales area that we can use for checking later

    CONCATENATE <mvke>-vkorg

                <mvke>-vtweg

                INTO gd_sales_area.  "No space separation required

*   Change of Sales Org, redetermine the company code of the Sales Org

Page 17: Price List Report

    ON CHANGE OF <mvke>-vkorg.

      PERFORM get_bukrs USING    <mvke>-vkorg

                        CHANGING gd_bukrs.

    ENDON.

*   Every time there is a change of Sales Area, re-read the customer's

*   Sales Area data

    IF gd_sales_area <> gd_last_sales_area.

      PERFORM read_customer USING    p_kunnr

                                     <mvke>-vkorg

                                     <mvke>-vtweg

                            CHANGING gs_knvv

                                     gd_kunnr_name1

                                     gd_kunnr_land1.

    ENDIF.

*   Take note of the Sales Area we've just processed

    gd_last_sales_area = gd_sales_area.

*   Every time the material changes, get the material general view

*   details

    ON CHANGE OF <mvke>-matnr.

      PERFORM read_material USING    <mvke>-matnr

                            CHANGING gs_mara

                                     gd_maktx

                                     gd_mat_exists_in_plant.

    ENDON.

*   Check that the current material exists in the plant entered

*   on the selection-screen

    CHECK gd_mat_exists_in_plant = gc_x.

*   Get the Price condition data

    PERFORM get_price_conditions TABLES   gt_komv

                                 USING    <mvke>

                                          gs_mara

                                          gs_knvv

                                          gd_bukrs

                                 CHANGING gs_komk

Page 18: Price List Report

                                          gs_komp

                                          gd_gross_price

                                          gd_net_price

                                          gd_cost_price

                                          gd_price_found_flag.

*   Add the price information to the report

    IF gd_price_found_flag = gc_x.

      PERFORM add_line_to_report   TABLES   gt_komv

                                   USING    <mvke>

                                            gs_mara

                                            gs_komk

                                            gs_komp

                                            gd_gross_price

                                            gd_net_price

                                            gd_cost_price

                                            gd_maktx

                                            p_kunnr

                                            gd_kunnr_name1

                                            gd_kunnr_land1.

    ENDIF.

  ENDLOOP.  "GT_MVKE

* Sort the report

  SORT gt_report BY vkorg

                    vtweg

                    matnr.

ENDFORM.                    " BUILD_REPORT_DATA

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

*&      Form  GET_PRICE_CONDITIONS

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

*       Read the price conditions and determine the Gross, Net +

*       Cost price

*----------------------------------------------------------------------*

FORM get_price_conditions    TABLES   ft_komv             STRUCTURE komv

                             USING    fs_mvke             TYPE      mvke

Page 19: Price List Report

                                      fs_mara             TYPE      mara

                                      fs_knvv             TYPE      knvv

                                      fd_bukrs            TYPE      bukrs

                             CHANGING fs_komk             TYPE      komk

                                      fs_komp             TYPE      komp

                                      fd_gross_price      TYPE      netpr

                                      fd_net_price        TYPE      netpr

                                      fd_cost_price       TYPE      netpr

                                      fd_price_found_flag TYPE      flag.

* Init

  CLEAR: fs_komk,

         fs_komp,

         fd_price_found_flag,

         fd_gross_price,

         fd_net_price,

         fd_cost_price.

  REFRESH ft_komv.

* MARA and MVKE below may not be too relevant for the header level, but

* they are still moved to FS_KOMK here just in case any relevant fields

* are found at the header level

  MOVE-CORRESPONDING: fs_mvke        TO fs_komk,            "#EC ENHOK

                      fs_mara        TO fs_komk,            "#EC ENHOK

                      fs_knvv        TO fs_komk.            "#EC ENHOK

  MOVE:               p_prsdt        TO fs_komk-kurrf_dat,

                      p_prsdt        TO fs_komk-fkdat,

                      p_prsdt        TO fs_komk-prsdt,

                      p_prsdt        TO fs_komk-erdat,

                      p_prsdt        TO fs_komk-fbuda,

                      p_prsdt        TO fs_komk-audat,

                      p_taxk1        TO fs_komk-taxk1,      "Customer Tax Code

                      p_auart        TO fs_komk-auart,

                      p_auart        TO fs_komk-auart_sd,

                      p_kalsm        TO fs_komk-kalsm,

Page 20: Price List Report

                      'V'            TO fs_komk-kappl,

                      p_spart        TO fs_komk-spart,

                      '$000000001'   TO fs_komk-belnr,

                      '$000000001'   TO fs_komk-knumv,

                      p_waers        TO fs_komk-waerk,

                      p_waers        TO fs_komk-hwaer,

                      fd_bukrs       TO fs_komk-bukrs,

                      fs_mvke-vkorg  TO fs_komk-vkorgau,

                      p_werks        TO fs_komk-werks,

                      fs_knvv-kunnr  TO fs_komk-knrze,

                      fs_knvv-kunnr  TO fs_komk-kunre,

                      fs_knvv-kunnr  TO fs_komk-kunwe,

                      fs_knvv-konda  TO fs_komk-konda,

                      'C'            TO fs_komk-vbtyp,

                      'H'            TO fs_komk-trtyp,

                      '01'           TO fs_komk-vsbed,

                      '1'            TO fs_komp-ix_komk.

* If any bespoke ZZ... fields exist in the HEADER table KOMK,

* these should be filled here

* MOVE:              hdrtable1-zzfielda     TO fs_komk-zzfielda,

*                    hdrtable2-zzfieldb     TO fs_komk-zzfieldb.

  MOVE-CORRESPONDING: fs_mara               TO fs_komp,     "#EC ENHOK

                      fs_mvke               TO fs_komp.     "#EC ENHOK

  MOVE:               p_qty                 TO fs_komp-mgame,

                      p_qty                 TO fs_komp-mglme,

                      p_qty                 TO fs_komp-lmeng,

                      'X'                   TO fs_komp-prsfd,

                      'X'                   TO fs_komp-prsok,

                      'X'                   TO fs_komp-evrwr,

                      '1'                   TO fs_komp-kursk,

                      p_vrkme               TO fs_komp-meins,

                      p_vrkme               TO fs_komp-lagme,

                      p_vrkme               TO fs_komp-vrkme,

Page 21: Price List Report

                      p_taxm1               TO fs_komp-taxm1,    "Material Tax Code

                      p_pstyv               TO fs_komp-pstyv,

                      fs_mara-matnr         TO fs_komp-pmatn,

                      '000010'              TO fs_komp-kposn,

                      '000010'              TO fs_komp-taxps,

                      '000010'              TO fs_komp-aupos,

                      p_spart               TO fs_komp-spart,

                      '1'                   TO fs_komp-ix_komk,

                      '1'                   TO fs_komp-umvkz,

                      '1'                   TO fs_komp-umvkn,

                      '1'                   TO fs_komp-anz_tage,

                      '1'                   TO fs_komp-anz_monate,

                      '1'                   TO fs_komp-anz_wochen,

                      '1'                   TO fs_komp-anz_jahre,

                      '1'                   TO fs_komp-stf_tage,

                      '1'                   TO fs_komp-stf_monate,

                      '1'                   TO fs_komp-stf_wochen,

                      '1'                   TO fs_komp-stf_jahre,

                      '$TEMP'               TO fs_komp-aubel,

                      p_werks               TO fs_komp-werks.

* If any bespoke ZZ... fields exist in the ITEM table KOMP (or append

* structure KOMPAZ), these should be filled here

* MOVE:              itemtable1-zzfielda    TO fs_komp-zzfielda,

*                    itemtable2-zzfieldb    TO fs_komp-zzfieldb.

* Call the Pricing module

  CALL FUNCTION 'PRICING'

    EXPORTING

      calculation_type        = 'B'        "Carry out new Pricing

      comm_head_i             = fs_komk

      comm_item_i             = fs_komp

*     PRELIMINARY             = ' '

*     NO_CALCULATION          = ' '

    IMPORTING

Page 22: Price List Report

      comm_head_e             = fs_komk

      comm_item_e             = fs_komp

    TABLES

      tkomv                   = ft_komv

*     SVBAP                   =

*   CHANGING

*     REBATE_DETERMINED       = ' '

    EXCEPTIONS

      OTHERS                  = 0.  "No SUBRC check required, as we handle this below

* Remove any statistical or inactive conditions

  DELETE ft_komv

         WHERE kinak =  gc_x

         OR    kstat =  gc_x.

*----- GROSS Price ------------------------------------------------------

* This is normally stored in subtotal 1 in some of the SAP standard pricing

* procedures (this may need to be changed for some SPA installations)

  IF fs_komp-kzwi1 IS NOT INITIAL.

    fd_gross_price = fs_komp-kzwi1.

* If not found in subtotal 1

  ELSE.

*   We could look for the first PRICE (KOAID=B)

*   price condition (inactive + statistical records would already have been

*   removed above)

*   For performance reasons, this has been deactivated here, but could be

*   reinstated later if need be

*   loop at ft_komv ASSIGNING <komv>

*        where koaid = gc_koaid_price.

*     gd_gross_price = <komv>-kwert.

*     exit.

*   endloop.

*   If the gross price is still initial, check if the "hide records with

*   no gross price" flag was set on the selection-screen.  If so, clear the

*   price found flag (done again for program clarity), and exit the form

Page 23: Price List Report

*   As the flag is not set, it means that the record will not appear on the

*   report

    IF     fd_gross_price IS INITIAL

       AND p_hdnogr       =  gc_x.

      CLEAR fd_price_found_flag.

      EXIT.

    ENDIF.

  ENDIF.

* If we have found a gross price, set the price found flag

  fd_price_found_flag = gc_x.

*----- NET Price -------------------------------------------------------

* Use the NETWR field instead of NETPR, in case the user enters a

* quantity greater than 1 on the selection-screen.  NETPR would only

* have the unit price, whereas NETWR has the price for the entire

* quantity

  IF fs_komp-netwr IS NOT INITIAL.

    fd_net_price = fs_komp-netwr.

* If not found in subtotal 2

  ELSE.

*   Otherwise, try one of the subtotal fields (this could differ

*   according to each pricing procedure, SAP standard puts it in

*   subtotal 2).

    fd_net_price = fs_komp-kzwi2.

  ENDIF.

*----- COST Price ------------------------------------------------------

* The cost price should be returned in the field FS_KOMP-WAVWR

* Inside function PRICING, the cost is derived from condition type

* VPRS.  SAP Standard normally brings this price in from MBEW-STPRS

* but this will not be found if no plant (i.e. valuation area) is

* passed to the PRICING function - hence why this is mandatory on the

* selection-screen

  IF fs_komp-wavwr IS NOT INITIAL.

    fd_cost_price = fs_komp-wavwr.

  ENDIF.

Page 24: Price List Report

ENDFORM.                    " GET_PRICE_CONDITIONS

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

*&      Form  GET_BUKRS

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

*       Get the company code

*----------------------------------------------------------------------*

FORM get_bukrs  USING    fd_vkorg   TYPE vkorg

                CHANGING fd_bukrs   TYPE bukrs.

* Read in all the Sales Orgs

  IF gth_vkorg_bukrs[] IS INITIAL.

    SELECT vkorg

           bukrs

           INTO TABLE gth_vkorg_bukrs

           FROM tvko.

  ENDIF.

* Now read the table

  READ TABLE gth_vkorg_bukrs ASSIGNING <vkorg_bukrs>

             WITH TABLE KEY vkorg = fd_vkorg.

  IF sy-subrc IS INITIAL.

    fd_bukrs = <vkorg_bukrs>-bukrs.

  ENDIF.

ENDFORM.                    " GET_BUKRS

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

*&      Form  ADD_LINE_TO_REPORT

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

*       Add a line to the report

*----------------------------------------------------------------------*

FORM add_line_to_report TABLES    ft_komv        STRUCTURE komv "#EC NEEDED

                        USING     fs_mvke        TYPE      mvke

                                  fs_mara        TYPE      mara

                                  fs_komk        TYPE      komk

                                  fs_komp        TYPE      komp

                                  fd_gross_price TYPE      netpr

                                  fd_net_price   TYPE      netpr

Page 25: Price List Report

                                  fd_cost_price  TYPE      netpr

                                  fd_maktx       TYPE      maktx

                                  fd_kunnr       TYPE      kunnr

                                  fd_kunnr_name1 TYPE      name1

                                  fd_kunnr_land1 TYPE      land1.

* Add a blank line to the report

  APPEND INITIAL LINE TO gt_report ASSIGNING <report>.

* Then fill the relevant data

  MOVE-CORRESPONDING: fs_komk        TO <report>,           "#EC ENHOK

                      fs_komp        TO <report>,           "#EC ENHOK

                      fs_mara        TO <report>,           "#EC ENHOK

                      fs_mvke        TO <report>.           "#EC ENHOK

  MOVE:               fd_maktx       TO <report>-maktx,

                      fd_gross_price TO <report>-gross_price,

                      fd_net_price   TO <report>-net_price,

                      fd_cost_price  TO <report>-cost_price,

                      fd_kunnr       TO <report>-kunnr,

                      fd_kunnr_name1 TO <report>-kunnr_name1,

                      fd_kunnr_land1 TO <report>-kunnr_land1.

ENDFORM.                    " ADD_LINE_TO_REPORT

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

*&      Form  READ_MATERIAL

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

*       Read the material details (from MARA/MAKT)

*----------------------------------------------------------------------*

FORM read_material  USING    fd_matnr               TYPE matnr

                    CHANGING fs_mara                TYPE mara

                             fd_maktx               TYPE maktx

                             fd_mat_exists_in_plant TYPE flag.

  CLEAR: fs_mara,

         fd_maktx,

         fd_mat_exists_in_plant.

* Read the material GENERAL VIEW details

  SELECT SINGLE * INTO fs_mara

Page 26: Price List Report

                FROM mara

                WHERE matnr = fd_matnr.

* Get the material description

  PERFORM get_maktx USING    fd_matnr

                    CHANGING fd_maktx.

* Check that the material exists in the plant entered on the selection

* screen

  READ TABLE gtsrt_marc TRANSPORTING NO FIELDS

             WITH TABLE KEY matnr = fd_matnr

                            werks = p_werks.         "#EC *

*            Table is sorted, so no BINARY SEARCH necessary

* If found, set the Mat exists in plant

  IF sy-subrc IS INITIAL.

    fd_mat_exists_in_plant = gc_x.

  ENDIF.

ENDFORM.                    " READ_MATERIAL

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

*&      Form  INIT_DATA

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

*       Initialise everything

*----------------------------------------------------------------------*

FORM init_data .

* Empty the internal tables

  REFRESH: gt_komv,

           gtsrt_mvke,

           gt_report,

           gt_alv_fieldcat,

           gtsrt_makt,

           gth_vkorg_bukrs.

* Clear the variables

  CLEAR: gd_maktx,

         gd_bukrs,

         gd_kunnr_name1,

         gd_kunnr_land1,

Page 27: Price List Report

         gd_sales_area,

         gd_last_sales_area,

         gd_price_found_flag,

         gd_gross_price,

         gd_net_price,

         gd_cost_price.

ENDFORM.                    " INIT_DATA

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

*&      Form  BUILD_PROGRAM_TEXT_ELEMENTS

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

*       Build the program text elements if necesssary

*----------------------------------------------------------------------*

FORM build_program_text_elements .

*----- Method to add an entry to the Textpool --------------------------

  DEFINE m_add_to_textpool.

*   &1 = Text Element Type

*        S = Selection-Screen

*        I = Text Symbol

*   &2 = Text Key (Selection-screen field name or text-symbol xxx id)

*   &3 = Text Description

*   Initialise

    clear gs_textpool.

*   Textpool Type

    gs_textpool-id     = &1.

*   Textpool Key/Name

    gs_textpool-key    = &2.

*   Text Description

*   Note: for some reason, 8 blank spaces must be added to the

*   start of any Selection-screen Select-options or Parameters

    if &1 = 'S'.  "Select-option or Parameter

      move: '        ' to gs_textpool-entry+0(8),

            &3         to gs_textpool-entry+8.

    else.         "All others, e.g. Text Elements, Report Heading

      gs_textpool-entry  = &3.

Page 28: Price List Report

    endif.

*   Also get the length of the text element

    gs_textpool-length = strlen( gs_textpool-entry ).

    insert gs_textpool into table gtsrt_textpool.

  END-OF-DEFINITION.

*----- End of Method ---------------------------------------------------

* Read the textpool for this program to see if the text elements have

* already been loaded

  REFRESH gtsrt_textpool.

  READ TEXTPOOL sy-repid INTO     gtsrt_textpool

                         LANGUAGE sy-langu.

* Now look for an arbitrary text element (e.g. A01) to see if we have already

* built the text elements on a previous run of the program

  READ TABLE gtsrt_textpool ASSIGNING <textpool>

             WITH TABLE KEY id  = 'I'

                            key = 'A01'.

*            Table is SORTED type, so no BINARY SEARCH necessary

* If not found, start to build the text elements

  IF sy-subrc IS NOT INITIAL.

*   Start by removing whichever texts are already existing

    UNASSIGN <textpool>.

    REFRESH gtsrt_textpool.

*   Text-Symbols

    m_add_to_textpool:

      'I' 'A01' 'SOrg',

      'I' 'A02' 'DCh',

      'I' 'A03' 'Material',

      'I' 'A04' 'Description',

      'I' 'A05' 'Gross Price',

      'I' 'A06' 'Net Price',

      'I' 'A07' 'Cost Price',

      'I' 'A08' 'Curr',

      'I' 'A09' 'Prod Hierarchy',

Page 29: Price List Report

      'I' 'A10' 'Customer',

      'I' 'A11' 'Name',

      'I' 'A12' 'Cust Country',

      'I' 'A13' 'Pricing Date',

      'I' 'S01' 'Selections',

      'I' 'S02' 'Report',

      'I' 'S03' 'Sales Area',

      'I' 'S04' 'Product',

      'I' 'S05' 'Additional Information for Price Calculation'.

*   Selection-screen texts

*   Note: for some reason, 8 blank spaces must be added to the

*   start of any Select-options or Parameters texts.  This is

*   done inside the macro

    m_add_to_textpool:

      'S' 'P_ALVVAR' 'Report Display Variant',

      'S' 'P_AUART'  'Order Type',

      'S' 'P_HDNOGR' 'Hide lines with no gross price',

      'S' 'P_KALSM'  'Pricing Procedure',

      'S' 'P_KUNNR'  'Customer',

      'S' 'P_PRSDT'  'Pricing date',

      'S' 'P_PSTYV'  'Item Category',

      'S' 'P_QTY'    'Quantity for Calculation',

      'S' 'P_SPART'  'Division',

      'S' 'P_TAXK1'  'Customer Tax Code',

      'S' 'P_TAXM1'  'Material Tax Code',

      'S' 'P_VRKME'  'Sales UoM',

      'S' 'P_WAERS'  'Currency',

      'S' 'P_WERKS'  'Plant',

      'S' 'S_MATNR'  'Material',

      'S' 'S_VKORG'  'Sales Organization',

      'S' 'S_VTWEG'  'Distribution Channel'.

*   Report Title

    m_add_to_textpool:

      'R' space      'Price List Report'.

Page 30: Price List Report

*   Now delete the old textpool (regardless of how much was there)

    DELETE TEXTPOOL sy-repid LANGUAGE sy-langu.

*   And insert the new textpool + commit

    INSERT textpool sy-repid FROM gtsrt_textpool LANGUAGE sy-langu.

    COMMIT WORK AND WAIT.

*   Now we need to resubmit the program

    SUBMIT (sy-repid)

           VIA SELECTION-SCREEN.

  ENDIF.

ENDFORM.                    " BUILD_PROGRAM_TEXT_ELEMENTS

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

*&      Form  GET_ALL_MATERIALS_BY_PLANT

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

*       Get all the materials for the plant entered on the selection

*       screen

*----------------------------------------------------------------------*

FORM get_all_materials_by_plant .

* Init

  REFRESH gtsrt_marc.

* Get all the materials found for the plant

  SELECT matnr

         werks

         lvorm

         INTO TABLE gtsrt_marc

         FROM marc

         WHERE matnr IN s_matnr

         AND   werks =  p_werks

         AND   lvorm =  space.   "No deletion indicator set

* No SUBRC check required

ENDFORM.                    " GET_ALL_MATERIALS_BY_PLANT