Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

performance issues

Former Member
0 Likes
383

hi all,

here is my program ... please tell me some performnce tips in this program . because it long time to execute.

&----


*& Report ZMAP_VARIANCE

*&

&----


*& Request : REDK904796

*& Dev.Class: ZGST

*& Description : Report for MAP Variance.

&----


REPORT ZMAP_VARIANCE.

type-pools : vrm,

slis.

        • Types Declaration *****

types: begin of ty_main,

werks type ekpo-werks,

name1 type t001w-name1,

matnr type ekpo-matnr,

txz01 type ekpo-txz01,

verpr type mbew-verpr,

netpr type ekpo-netpr,

dfval type ekpo-netpr,

varns type ekpo-netpr,

labst type mard-labst,

varvl type ekpo-netpr,

end of ty_main,

begin of ty_ekpo,

werks type ekpo-werks,

matnr type ekpo-matnr,

txz01 type ekpo-txz01,

netpr type ekpo-netpr,

aedat type ekpo-aedat,

end of ty_ekpo,

begin of ty_t001,

werks type t001w-werks,

name1 type t001w-name1,

end of ty_t001,

begin of ty_mbew,

matnr type mbew-matnr,

bwkey type mbew-bwkey,

verpr type mbew-verpr,

end of ty_mbew,

begin of ty_mard,

matnr type mard-matnr,

werks type mard-werks,

lgort type mard-lgort,

labst type mard-labst,

end of ty_mard.

        • Internal Tables for Data Processing ****

data: begin of itab occurs 0,

matnr type mara-matnr,

werks type marc-werks,

end of itab,

v_maktx type makt-maktx,

v_year type MSEG-MJAHR,

v_mblnr type mseg-mblnr.

data: it_main type table of ty_main,

wa_main type ty_main,

it_temp type table of ty_main,

wa_temp type ty_main,

it_ekpo type table of ty_ekpo,

it_ekpo1 type table of ty_ekpo,

wa_ekpo type ty_ekpo,

it_mbew type table of ty_mbew,

wa_mbew type ty_mbew,

it_mard type table of ty_mard,

wa_mard type ty_mard,

it_t001 type table of ty_t001,

wa_t001 type ty_t001,

v_matnr type mara-matnr,

v_werks type marc-werks.

        • ALV Tables Declaration ****

data: it_fldcat type slis_t_fieldcat_alv with header line,

wa_layout type slis_layout_alv.

DATA : BEGIN OF IT_MKPF OCCURS 0,

MBLNR TYPE MSEG-MBLNR,

MENGE TYPE MSEG-MENGE,

MATNR(18)," type mseg-matnr,

WERKS TYPE MSEG-WERKS,

DMBTR TYPE MBEW-VERPR,

BUDAT TYPE MKPF-BUDAT,

CPUTM TYPE MKPF-CPUTM,

END OF IT_MKPF.

DATA: BEGIN OF I_REGIO OCCURS 0,

WERKS LIKE T001W-WERKS,

END OF I_REGIO,

v_regio type T001W-REGIO.

        • Data for Drop Down Menu in Selection Screen ****

DATA: name TYPE vrm_id,

list TYPE vrm_values,

value LIKE LINE OF list,

name1 TYPE vrm_id,

list1 TYPE vrm_values,

value1 LIKE LINE OF list.

        • Selection Screen Design ****

selection-screen begin of block b1 with frame title text-001.

select-options : s_werks for v_werks,

s_matnr for v_matnr.

selection-screen begin of line.

selection-screen comment (31) comm1.

parameters : p_frwd(2) AS LISTBOX VISIBLE LENGTH 4,

p_verpr type mbew-verpr.

selection-screen end of line.

selection-screen begin of line.

selection-screen comment (31) comm2.

parameters : p_frwd1(2) AS LISTBOX VISIBLE LENGTH 4,

p_varns type ekpo-netpr.

selection-screen end of line.

  • PARAMETERS: p_varns type ekpo-netpr.

selection-screen end of block b1.

        • Logic for Dropdown Menu in Selectin Screen ****

AT SELECTION-SCREEN OUTPUT.

comm1 = 'MAP'.

comm2 = 'Variance'.

name = 'P_FRWD'.

value-key = '01'.

value-text = '>'.

APPEND value TO list.

value-key = '02'.

value-text = '<'.

APPEND value TO list.

value-key = '03'.

value-text = '>='.

APPEND value TO list.

value-key = '04'.

value-text = '<='.

APPEND value TO list.

value-key = '05'.

value-text = '='.

APPEND value TO list.

value-key = '06'.

value-text = '<>'.

APPEND value TO list.

CALL FUNCTION 'VRM_SET_VALUES'

EXPORTING

ID = name

VALUES = list.

name1 = 'P_FRWD1'.

value1-key = '01'.

value1-text = '>'.

APPEND value1 TO list1.

value1-key = '02'.

value1-text = '<'.

APPEND value1 TO list1.

value1-key = '03'.

value1-text = '>='.

APPEND value1 TO list1.

value1-key = '04'.

value1-text = '<='.

APPEND value1 TO list1.

value1-key = '05'.

value1-text = '='.

APPEND value1 TO list1.

value1-key = '06'.

value1-text = '<>'.

APPEND value1 TO list1.

CALL FUNCTION 'VRM_SET_VALUES'

EXPORTING

ID = name1

VALUES = list1.

        • Selection Screen Fields Validations ****

at selection-screen.

select single werks

from t001w

into wa_main-werks

where werks in s_werks.

if sy-subrc <> 0.

message text-002 type 'E'.

endif.

select single matnr

from mara

into wa_main-matnr

where matnr in s_matnr.

if sy-subrc <> 0.

message text-003 type 'E'.

endif.

if s_werks is initial and s_matnr is initial.

message text-004 type 'E'.

ENDIF.

if not p_verpr is initial and p_frwd is initial.

message text-005 type 'E'.

elseif p_verpr is initial and not p_frwd is initial.

message text-006 type 'E'.

endif.

        • Start of Selection ****

start-of-selection.

        • Data Fetching ****

perform get_data.

        • Processing Building Final Internal Table ****

perform build_itab.

        • Generating Field Catalog itab ****

perform build_fldcat.

        • Dropdown Options for MAP ****

case p_frwd.

when '01'.

perform gt_list.

when '02'.

perform lt_list.

when '03'.

perform ge_list.

when '04'.

perform le_list.

when '05'.

perform eq_list.

when '06'.

perform ne_list.

when others.

perform disp_list.

endcase.

&----


*& Form gt_list

&----


  • Subroutine for List having more than MAP

----


FORM gt_list .

it_temp[] = it_main[].

  • if not p_varns is initial.

delete it_temp where verpr <= p_verpr.

  • delete it_temp where varns <> p_varns.

perform variance_col.

    • else.

  • delete it_temp where verpr <= p_verpr.

  • endif.

PERFORM grid_display.

ENDFORM. " gt_list

&----


*& Form lt_list

&----


  • Subroutine for List having less than MAP

----


FORM lt_list .

it_temp[] = it_main[].

  • if not p_varns is initial.

delete it_temp where verpr >= p_verpr.

  • delete it_temp where varns <> p_varns.

perform variance_col.

  • else.

  • delete it_temp where verpr >= p_verpr.

  • endif.

PERFORM grid_display.

ENDFORM. " lt_list

&----


*& Form ge_list

&----


  • Subroutine for List having more than or equal to MAP

----


FORM ge_list .

it_temp[] = it_main[].

  • if not p_varns is initial.

delete it_temp where verpr < p_verpr. " and varns <> p_varns.

  • delete it_temp where varns <> p_varns.

perform variance_col.

  • else.

  • delete it_temp where verpr < p_verpr.

  • endif.

PERFORM grid_display.

ENDFORM. " ge_list

&----


*& Form le_list

&----


  • Subroutine for List having less than or equal to MAP

----


FORM le_list .

it_temp[] = it_main[].

  • if not p_varns is initial.

delete it_temp where verpr > p_verpr.

  • delete it_temp where varns <> p_varns. " and varns <> p_varns.

perform variance_col.

  • else.

  • delete it_temp where verpr > p_verpr.

  • endif.

PERFORM grid_display.

ENDFORM. " le_list

&----


*& Form eq_list

&----


  • Subroutine for List having equal to MAP

----


FORM eq_list .

it_temp[] = it_main[].

  • if not p_varns is initial.

delete it_temp where verpr <> p_verpr.

  • delete it_temp where varns <> p_varns. "and varns <> p_varns.

perform variance_col.

  • else.

  • delete it_temp where verpr <> p_verpr.

  • endif.

PERFORM grid_display.

ENDFORM. " eq_list

&----


*& Form ne_list

&----


  • Subroutine for List having not equal to MAP

----


FORM ne_list .

it_temp[] = it_main[].

  • if not p_varns is initial.

delete it_temp where verpr = p_verpr. " and varns <> p_varns.

  • delete it_temp where varns <> p_varns.

perform variance_col.

  • else.

  • delete it_temp where verpr = p_verpr.

  • endif.

PERFORM grid_display.

ENDFORM. " ne_list

&----


*& Form disp_list

&----


  • Subroutine for Displaying List

----


FORM disp_list .

it_temp[] = it_main[].

  • if not p_varns is initial.

  • delete it_temp where varns <> p_varns.

  • delete it_temp where varns <> p_varns.

perform variance_col.

  • endif.

        • Grid Display ****

PERFORM grid_display.

ENDFORM. " disp_list

&----


*& Form get_data

&----


  • Data Fetching

----


FORM get_data .

**************Commented By Pawan***************************

  • select werks

  • matnr

  • txz01

  • netpr

  • aedat

    • up to 15 rows

  • from ekpo

  • into table it_ekpo

  • where werks in s_werks

  • and matnr in s_matnr.

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

  • if not s_werks is initial and s_matnr is initial.

  • sort it_ekpo by werks matnr aedat descending.

  • delete adjacent DUPLICATES FROM it_ekpo comparing werks matnr.

  • elseif not s_matnr is initial and s_werks is initial.

  • sort it_ekpo by matnr werks aedat descending.

  • delete adjacent DUPLICATES FROM it_ekpo comparing matnr werks.

  • endif.

  • if not s_werks is initial and not s_matnr is initial.

  • sort it_ekpo by werks matnr aedat descending.

  • delete adjacent DUPLICATES FROM it_ekpo comparing matnr werks.

  • endif.

                            • changes for getting all articles ***************

************Commened By Pawan******************************

*select mara~matnr werks

  • from mara inner join marc

  • on maramatnr eq marcmatnr

  • into table itab

  • where mara~matnr in s_matnr

  • and werks in s_werks.

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

select werks matnr from marc into table it_ekpo where matnr in s_matnr

and werks in s_werks.

*********************Commented By Pawan***************************************

*loop at itab.

  • read table it_ekpo into wa_ekpo with key matnr = itab-matnr. " werks = itab-werks.

  • if sy-subrc <> 0.

  • wa_ekpo-matnr = itab-matnr.

  • wa_ekpo-werks = itab-werks.

  • select single maktx from makt into v_maktx

  • where matnr eq itab-matnr.

  • wa_ekpo-txz01 = v_maktx.

  • append wa_ekpo to it_ekpo1.

  • clear: wa_ekpo, v_maktx.

  • endif.

*endloop.

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

*append lines of it_ekpo1 TO it_ekpo.

*append lines of itab to it_ekpo.

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

if not it_ekpo is initial.

select werks

name1

from t001w

into table it_t001

for all entries in it_ekpo

where werks eq it_ekpo-werks.

select matnr

bwkey

verpr

from mbew

into table it_mbew

for all entries in it_ekpo

where bwkey eq it_ekpo-werks

and matnr eq it_ekpo-matnr.

select matnr

werks

lgort

labst

from mard

into table it_mard

for all entries in it_ekpo

where matnr eq it_ekpo-matnr

and werks eq it_ekpo-werks.

endif.

ENDFORM. " get_data

&----


*& Form build_itab

&----


  • Generating Main Internal table

----


FORM build_itab .

sort : it_mard by matnr werks,

it_t001 by werks,

it_mbew by matnr.

*sort it_ekpo by werks matnr.

loop at it_ekpo into wa_ekpo.

wa_main-werks = wa_ekpo-werks.

wa_main-matnr = wa_ekpo-matnr.

select single maktx from makt into wa_ekpo-txz01 where matnr = wa_ekpo-matnr.

if sy-subrc = 0.

wa_main-txz01 = wa_ekpo-txz01.

endif.

  • wa_main-netpr = wa_ekpo-netpr.

  • select mblnr

  • menge

  • dmbtr

  • from mseg

  • into table it_mseg

  • where matnr eq wa_ekpo-matnr

  • and werks eq wa_ekpo-werks.

  • sort it_mseg by mblnr descending.

                                  • Chnages done for Latest Purchase Price ***************

*SELECT MBLNR MENGE MATNR WERKS DMBTR FROM MSEG

  • INTO CORRESPONDING FIELDS OF table IT_MKPF

  • WHERE MATNR = wa_ekpo-MATNR

  • AND WERKS = wa_ekpo-werks

  • AND BWART = '101'.

*if sy-subrc = 0.

    • append it_mkpf.

*

  • LOOP AT IT_MKPF.

  • SELECT SINGLE BUDAT CPUTM FROM MKPF

  • INTO (IT_MKPF-BUDAT, IT_MKPF-CPUTM)

  • WHERE MBLNR = IT_MKPF-MBLNR.

  • MODIFY IT_MKPF.

  • ENDLOOP.

  • SORT IT_MKPF BY MATNR BUDAT DESCENDING CPUTM ASCENDING.

    • READ TABLE IT_MKPF INDEX 1.

  • loop at it_mkpf where dmbtr <> 0 and menge <> 0.

  • at first.

  • read table it_mkpf index sy-tabix.

  • wa_main-netpr = it_mkpf-dmbtr / it_mkpf-menge.

  • endat.

  • endloop.

    • if it_mkpf-menge <> 0.

    • wa_main-netpr = IT_MKPF-DMBTR / IT_MKPF-MENGE .

    • endif.

*endif.

  • clear it_mkpf.

  • refresh it_mkpf.

SELECT MBLNR MENGE MATNR WERKS DMBTR FROM MSEG

INTO table IT_MKPF

WHERE MATNR = wa_ekpo-MATNR

AND WERKS = wa_ekpo-werks

AND BWART = '101'.

IF SY-SUBRC <> 0.

REFRESH I_REGIO.

        • TO SELECT GRN LATEST DOCUMENT FROM DIFFERENT SITE IN SAME REGION

SELECT SINGLE REGIO FROM T001W INTO v_REGIO WHERE WERKS = wa_ekpo-werks.

SELECT WERKS FROM T001W

INTO TABLE I_REGIO WHERE REGIO = v_REGIO.

LOOP AT I_REGIO.

SELECT MBLNR MENGE MATNR WERKS DMBTR FROM MSEG

INTO table IT_MKPF

WHERE MATNR = wa_ekpo-MATNR

AND WERKS = I_REGIO-WERKS

AND BWART = '101'

AND DMBTR NE '0.00'.

if sy-subrc = 0.

exit.

endif.

  • APPEND IT_MKPF.

*

  • ENDSELECT.

ENDLOOP.

ENDIF.

*FOR LATEST DOCUMENT

LOOP AT IT_MKPF.

SELECT SINGLE BUDAT CPUTM FROM MKPF

INTO (IT_MKPF-BUDAT, IT_MKPF-CPUTM)

WHERE MBLNR = IT_MKPF-MBLNR.

MODIFY IT_MKPF.

ENDLOOP.

SORT IT_MKPF BY MATNR BUDAT DESCENDING CPUTM ASCENDING.

READ TABLE IT_MKPF INDEX 1.

wa_main-netpr = IT_MKPF-DMBTR / IT_MKPF-MENGE .

  • ENDIF.

  • REFRESH IT_MKPF.

                            • If purchase Price not available in both site and region level

                            • PP taken from latest GRN in current year.

if it_mkpf-dmbtr = 0.

CALL FUNCTION 'GET_CURRENT_YEAR'

EXPORTING

BUKRS = '1000'

DATE = SY-DATUM

IMPORTING

  • CURRM =

CURRY = v_year

  • PREVM =

  • PREVY =

.

  • v_year = sy-datum+4(4).

select max( mblnr )

from mseg

into v_mblnr

where matnr eq wa_ekpo-matnr

and bwart eq '101'

and gjahr eq v_year

and dmbtr > 0

and menge > 0.

if not v_mblnr is initial.

select single

dmbtr

menge

from mseg

into (it_mkpf-dmbtr, it_mkpf-menge)

where mblnr eq v_mblnr.

wa_main-netpr = it_mkpf-dmbtr / it_mkpf-menge.

endif.

endif.

clear it_mkpf.

refresh it_mkpf.

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

read table it_t001 into wa_t001 with key werks = wa_ekpo-werks binary search.

wa_main-name1 = wa_t001-name1.

read table it_mbew into wa_mbew with key matnr = wa_ekpo-matnr bwkey = wa_ekpo-werks binary search.

wa_main-verpr = wa_mbew-verpr.

wa_main-dfval = wa_main-verpr - wa_main-netpr.

if wa_main-verpr <> 0.

wa_main-varns = wa_main-dfval / wa_main-verpr * 100.

else.

wa_main-varns = 0.

endif.

loop at it_mard into wa_mard where matnr = wa_ekpo-matnr and werks = wa_ekpo-werks.

wa_main-labst = wa_main-labst + wa_mard-labst.

endloop.

wa_main-varvl = wa_main-dfval * wa_main-labst.

*new code added

if wa_main-labst <> 0.

append wa_main to it_main.

endif.

clear: wa_main,

wa_ekpo,

wa_mbew,

wa_t001,

wa_mard.

endloop.

***this is commented by amit.

  • loop AT it_main into wa_main.

  • if wa_main-labst = 0.

  • delete it_main index sy-tabix.

  • endif.

  • endloop.

sort it_main by werks matnr.

ENDFORM. " build_itab

&----


*& Form build_fldcat

&----


  • Generating Field Catalog

----


FORM build_fldcat .

wa_layout-zebra = 'X'.

WA_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.

it_fldcat-fieldname = 'WERKS'.

it_fldcat-tabname = 'IT_TEMP'.

it_fldcat-seltext_m = 'Site Code'.

append it_fldcat.

clear it_fldcat.

it_fldcat-fieldname = 'NAME1'.

it_fldcat-tabname = 'IT_TEMP'.

it_fldcat-seltext_m = 'Site Name'.

append it_fldcat.

clear it_fldcat.

it_fldcat-fieldname = 'MATNR'.

it_fldcat-tabname = 'IT_TEMP'.

it_fldcat-seltext_m = 'Article Code'.

append it_fldcat.

clear it_fldcat.

it_fldcat-fieldname = 'TXZ01'.

it_fldcat-tabname = 'IT_TEMP'.

it_fldcat-seltext_m = 'Article Description'.

append it_fldcat.

clear it_fldcat.

it_fldcat-fieldname = 'VERPR'.

it_fldcat-tabname = 'IT_TEMP'.

it_fldcat-seltext_m = 'MAP'.

append it_fldcat.

clear it_fldcat.

it_fldcat-fieldname = 'NETPR'.

it_fldcat-tabname = 'IT_TEMP'.

it_fldcat-seltext_m = 'Latest Purchase Price'.

append it_fldcat.

clear it_fldcat.

it_fldcat-fieldname = 'DFVAL'.

it_fldcat-tabname = 'IT_TEMP'.

it_fldcat-seltext_m = 'Difference Value'.

append it_fldcat.

clear it_fldcat.

it_fldcat-fieldname = 'VARNS'.

it_fldcat-tabname = 'IT_TEMP'.

it_fldcat-seltext_m = 'Variance%'.

append it_fldcat.

clear it_fldcat.

it_fldcat-fieldname = 'LABST'.

it_fldcat-tabname = 'IT_TEMP'.

it_fldcat-seltext_m = 'Closing Stock'.

append it_fldcat.

clear it_fldcat.

it_fldcat-fieldname = 'VARVL'.

it_fldcat-tabname = 'IT_TEMP'.

it_fldcat-seltext_m = 'Variance Value'.

append it_fldcat.

clear it_fldcat.

ENDFORM. " build_fldcat

&----


*& Form grid_display

&----


  • Grid Display

----


FORM grid_display .

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'

EXPORTING

  • I_INTERFACE_CHECK = ' '

  • I_BYPASSING_BUFFER = ' '

  • I_BUFFER_ACTIVE = ' '

I_CALLBACK_PROGRAM = sy-cprog

  • I_CALLBACK_PF_STATUS_SET = ' '

  • I_CALLBACK_USER_COMMAND = ' '

  • I_CALLBACK_TOP_OF_PAGE = ' '

  • I_CALLBACK_HTML_TOP_OF_PAGE = ' '

  • I_CALLBACK_HTML_END_OF_LIST = ' '

  • I_STRUCTURE_NAME =

  • I_BACKGROUND_ID = ' '

I_GRID_TITLE = 'MAP VARIANCE REPORT'

  • I_GRID_SETTINGS =

IS_LAYOUT = wa_layout

IT_FIELDCAT = it_fldcat[]

  • IT_EXCLUDING =

  • IT_SPECIAL_GROUPS =

  • IT_SORT =

  • IT_FILTER =

  • IS_SEL_HIDE =

  • I_DEFAULT = 'X'

  • I_SAVE = ' '

  • IS_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 = it_temp

  • EXCEPTIONS

  • PROGRAM_ERROR = 1

  • OTHERS = 2

.

IF SY-SUBRC <> 0.

  • MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

  • WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

ENDIF.

ENDFORM. " grid_display

&----


*& Form variance_col

&----


  • text

----


FORM variance_col .

        • Dropdown Options for Variance ****

case p_frwd1.

when '01'.

delete it_temp where varns <= p_varns.

when '02'.

delete it_temp where varns >= p_varns.

when '03'.

delete it_temp where varns < p_varns.

when '04'.

delete it_temp where varns > p_varns.

when '05'.

delete it_temp where varns <> p_varns.

when '06'.

delete it_temp where varns = p_varns.

when others.

endcase.

ENDFORM. " variance_col

1 REPLY 1
Read only

Former Member
0 Likes
358

Hi Sekhar,

1. When trying to fetch records based on the select options, always check if the selectoptions is not initial.

2. If the table used in 'IN' clause contains large number of data, it results in performance issue. Try to use 'FOR ALL ENTRIES IN....WHERE..' if possible.

3. DONOT put a select query inside a LOOP.

UR CODE -

*loop at itab.

  • select single maktx from makt into v_maktx

  • where matnr eq itab-matnr.

*endloop.

Instead, Fetch records from maktx for all emtries in itab WHERE matnr eq itab-matnr.

4. Instead of putting teh internal table in a loop, you can directly use - DELETE <internal table> WHERE field1 = 'abc'<condition>.

5. Try to use primary keys or keys with indexes created on them.