‎2008 Mar 06 5:32 AM
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
‎2008 Mar 07 10:46 AM
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.