10-12-2006 1:23 PM
1.This is pgm Execute it will take more time . how to less time ?
please Sort out my problem?
REPORT ZRPT_MM_006.
TYPE-POOLS: slis.
tables : likp, lips, bseg, bkpf, mara, t001w, makt,ekko,ekpo.
DATA : gt_fieldcat TYPE slis_t_fieldcat_alv.
DATA : heading TYPE slis_t_listheader.
DATA : gt_events TYPE slis_t_event.
DATA : gs_keyinfo TYPE slis_keyinfo_alv.
DATA : gt_sort TYPE slis_t_sortinfo_alv.
DATA : gt_sp_group TYPE slis_t_sp_group_alv.
DATA : g_header_tab TYPE slis_tabname.
DATA : g_item_tab TYPE slis_tabname.
DATA : g_repid TYPE sy-repid.
SELECTION-SCREEN : BEGIN OF BLOCK t1 WITH FRAME TITLE text-007 .
SELECT-OPTIONS : s_vstel FOR likp-vstel OBLIGATORY,
s_matnr FOR lips-matnr,
s_lfdat FOR likp-lfdat OBLIGATORY,
s_matkl for mara-matkl,
s_werks for likp-werks.
SELECTION-SCREEN : END OF BLOCK t1.
PARAMETERS: p_vari LIKE disvariant-variant. " ALV Variant
data: begin of itab occurs 0,
lfdat like likp-lfdat,
vbeln like likp-vbeln,
vstel like likp-vstel,
werks like likp-werks,
matnr like lips-matnr,
maktx like makt-maktx,
matkl like lips-matkl,
lfimg like lips-lfimg,
vrkme like lips-vrkme,
dmbtr like bseg-dmbtr,
ebeln like ekko-ebeln,
ebelp like ekpo-ebelp,
bedat like ekko-bedat,
menge like ekpo-menge,
end of itab.
data : it_likp like likp occurs 0 with header line,
it_lips like lips occurs 0 with header line.
CONSTANTS : formname_top_of_page TYPE slis_formname VALUE 'TOP_OF_PAGE',
formaname_foreign_top_of_page TYPE slis_formname
VALUE 'FOREIGN_TOP_OF_PAGE'.
DATA : g_save(1) TYPE c,
g_exit(1) TYPE c,
gx_variant LIKE disvariant,
g_variant LIKE disvariant,
f2code LIKE sy-ucomm VALUE '&ETA',
layout TYPE slis_layout_alv.
DATA : repid LIKE sy-repid.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_vari.
PERFORM f4_for_variant.
************************************************************************
At Selection Screen *
************************************************************************
AT SELECTION-SCREEN.
PERFORM pai_of_selection_screen.
INITIALIZATION.
repid = sy-repid.
PERFORM field_cat_fill USING gt_fieldcat[].
PERFORM initialize_variant.
START-OF-SELECTION.
PERFORM build_eventtab USING gt_events[].
PERFORM build_comment USING heading[].
PERFORM build_layout .
PERFORM get_data.
perform process_data.
PERFORM display_data.
END-OF-SELECTION.
&----
*& Form field_cat_fill
&----
text
----
-->RT_FIELDCATtext
----
FORM field_cat_fill USING
rt_fieldcat TYPE slis_t_fieldcat_alv.
DATA : ls_fieldcat TYPE slis_fieldcat_alv,
v_pos TYPE i.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'LFDAT'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'Del.Date'.
ls_fieldcat-outputlen = '10'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'VBELN'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'Del.Doc.No.'.
ls_fieldcat-outputlen = '12'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'VSTEL'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'Iss.Plant'.
ls_fieldcat-outputlen = '10'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'WERKS'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'Rec.Plant'.
ls_fieldcat-outputlen = '10'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'MATNR'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'Material code'.
ls_fieldcat-outputlen = '18'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'MAKTX'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'Material Description'.
ls_fieldcat-outputlen = '40'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'MATKL'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'Mat.Group'.
ls_fieldcat-outputlen = '10'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'LFIMG'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'Delivery Qty.'.
ls_fieldcat-outputlen = '20'.
ls_fieldcat-just = 'R'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'VRKME'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'UOM'.
ls_fieldcat-outputlen = '3'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'DMBTR'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'Value'.
ls_fieldcat-outputlen = '15'.
ls_fieldcat-just = 'R'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'EBELN'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'PO No'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-just = 'R'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'EBELP'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'PO Item'.
ls_fieldcat-outputlen = '8'.
ls_fieldcat-just = 'R'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'BEDAT'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'PO Date'.
ls_fieldcat-outputlen = '10'.
ls_fieldcat-just = 'R'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'MENGE'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'PO qty'.
ls_fieldcat-outputlen = '15'.
ls_fieldcat-just = 'R'.
APPEND ls_fieldcat TO rt_fieldcat.
v_pos = v_pos + 1.
CLEAR ls_fieldcat.
ls_fieldcat-col_pos = v_pos.
ls_fieldcat-fieldname = 'DMBTR'.
ls_fieldcat-tabname = 'ITAB'.
ls_fieldcat-seltext_l = 'Total'.
ls_fieldcat-outputlen = '15'.
ls_fieldcat-just = 'R'.
APPEND ls_fieldcat TO rt_fieldcat.
ENDFORM. "field_cat_fill
&----
*& Form build_eventtab
&----
text
----
-->P_EVENTS text
----
FORM build_eventtab USING p_events TYPE slis_t_event.
DATA : ls_event TYPE slis_alv_event.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = p_events.
READ TABLE p_events WITH KEY name = slis_ev_top_of_page
INTO ls_event.
IF sy-subrc = 0.
MOVE formname_top_of_page TO ls_event-form.
APPEND ls_event TO p_events.
ENDIF.
ENDFORM. "build_eventtab
&----
*& Form build_comment
&----
text
----
-->P_HEADING text
----
FORM build_comment USING p_heading LIKE heading.
DATA: hline TYPE slis_listheader,
text(60) TYPE c,
text1(60) type c,
sep(20) TYPE c,
option(10).
*
CLEAR: hline, text.
hline-typ = 'H'.
WRITE: 'RunDate:' TO text,
sy-datum TO text+9,
'User' TO text+23,
sy-uname TO text+29,
'TCode' TO text+45,
sy-tcode TO text+52.
*
hline-info = text.
APPEND hline TO p_heading.
CLEAR text.
INCLUDE zselectionsalv.
ENDFORM. "build_comment
&----
*& Form top_of_page
&----
text
----
FORM top_of_page.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = heading.
if not s_vstel-low is initial.
clear t001w.
select single * from t001w where werks = s_vstel-low.
write: / 'Issuing Plant :', s_vstel-low, ' - ', t001w-name1.
endif.
if not s_vstel-high is initial.
clear t001w.
select single * from t001w where werks = s_vstel-high.
write: / ' to ', s_vstel-high, ' - ', t001w-name1.
endif.
if not s_matnr-low is initial.
write: / 'Material Code :', s_matnr-low.
endif.
if not s_matnr-high is initial.
write: ' to ', s_matnr-high.
endif.
if not s_lfdat-low is initial.
write: / 'Duration :', s_lfdat-low.
endif.
if not s_lfdat-high is initial.
write: ' to ', s_lfdat-high.
endif.
if not s_matkl-low is initial.
write: / 'Material Grp :', s_matkl-low.
endif.
if not s_matkl-high is initial.
write: ' to ', s_matkl-high.
endif.
if not s_werks-low is initial.
clear t001w.
select single * from t001w where werks = s_werks-low.
write: / 'Receiving Plant :', s_werks-low, ' - ', t001w-name1.
endif.
if not s_werks-high is initial.
clear t001w.
select single * from t001w where werks = s_werks-high.
write: ' to ', s_werks-high, ' - ', t001w-name1.
endif.
ENDFORM. "top_of_page
&----
*& Form display_data
&----
text
----
FORM display_data.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
I_INTERFACE_CHECK = ' '
I_BYPASSING_BUFFER =
I_BUFFER_ACTIVE = ' '
i_callback_program = repid
I_CALLBACK_PF_STATUS_SET = ' '
i_callback_user_command = 'USER_COMMAND'
I_STRUCTURE_NAME =
is_layout = layout
it_fieldcat = gt_fieldcat[]
IT_EXCLUDING =
IT_SPECIAL_GROUPS =
IT_SORT =
IT_FILTER =
IS_SEL_HIDE =
i_default = 'A'
i_save = g_save
is_variant = g_variant
it_events = gt_events[]
IT_EVENT_EXIT =
IS_PRINT = gt_print
IS_REPREP_ID =
I_SCREEN_START_COLUMN = 0
I_SCREEN_START_LINE = 0
I_SCREEN_END_COLUMN = 0
I_SCREEN_END_LINE = 0
IMPORTING
E_EXIT_CAUSED_BY_CALLER =
ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = itab
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. " WRITE_ALV
&----
*& Form get_data
&----
text
----
--> p1 text
<-- p2 text
----
FORM get_data .
select * from likp into corresponding fields of table it_likp
where vstel IN s_vstel
and lfdat IN s_lfdat
and werks IN s_werks.
CHECK NOT it_likp[] IS INITIAL.
if p_grn is initial.
select * from lips into corresponding fields of table it_lips
for all entries in it_likp
where vbeln = it_likp-vbeln
and matnr IN s_matnr
and matkl IN s_matkl
and bwart IN ('641')
and LFIMG ne 0.
else.
*
select * from lips into corresponding fields of table it_lips
for all entries in it_likp
where vbeln = it_likp-vbeln
and matnr IN s_matnr
and matkl IN s_matkl
and bwart IN ('642').
*
endif.
sort : it_likp, it_lips.
ENDFORM. " get_data
&----
*& Form process_data
&----
text
----
form process_data.
loop at it_likp.
loop at it_lips where vbeln = it_likp-vbeln.
move it_likp-lfdat to itab-lfdat.
move it_likp-vbeln to itab-vbeln.
move it_likp-vstel to itab-vstel.
move it_likp-werks to itab-werks.
move it_lips-matnr to itab-matnr.
clear makt.
select single * from makt where matnr = it_lips-matnr.
if sy-subrc = 0.
move makt-maktx to itab-maktx.
endif.
move it_lips-matkl to itab-matkl.
move it_lips-lfimg to itab-lfimg.
move it_lips-vrkme to itab-vrkme.
clear bkpf.
if p_grn is initial.
select single * from bkpf where xblnr = it_likp-vbeln
and tcode = 'VL02N'.
else.
select single * from bkpf where xblnr = it_likp-vbeln
and tcode = 'VL09'.
endif.
if sy-subrc = 0.
clear bseg.
select single * from bseg where belnr = bkpf-belnr
and bschl = '89'
and shkzg = 'S'
and ebeln = it_lips-VGBEL
and ebelp = it_lips-vgpos.
if sy-subrc = 0.
move bseg-dmbtr to itab-dmbtr.
else.
itab-dmbtr = 0.
endif.
endif.
perform get_poinfo.
append itab.
clear itab.
clear it_lips.
endloop.
clear it_likp.
endloop.
endform. "proccess_data
&----
*& Form get_poinfo
&----
text
----
form get_poinfo.
clear : ekko,ekpo.
select single * from ekko
where ebeln = it_lips-VGBEL.
select single * from ekpo
where ebeln = it_lips-VGBEL
and ebelp = it_lips-vgpos.
move : ekko-ebeln to itab-ebeln,
ekko-bedat to itab-bedat,
ekpo-ebelp to itab-ebelp,
ekpo-menge to itab-menge.
endform. "get_poinfo
&----
*& Form f4_for_variant
&----
text
----
FORM f4_for_variant.
g_save = 'A'.
g_variant-report = sy-repid.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = g_variant
i_save = g_save
IMPORTING
e_exit = g_exit
es_variant = gx_variant
EXCEPTIONS
not_found = 2.
IF sy-subrc = 2.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
IF g_exit = space.
p_vari = gx_variant-variant.
ENDIF.
ENDIF.
ENDFORM. " F4_FOR_VARIANT
&----
*& Form pai_of_selection_screen
&----
text
----
FORM pai_of_selection_screen.
IF NOT p_vari IS INITIAL.
MOVE g_variant TO gx_variant.
MOVE p_vari TO gx_variant-variant.
gx_variant-report = sy-repid.
CALL FUNCTION 'REUSE_ALV_VARIANT_EXISTENCE'
EXPORTING
i_save = g_save
CHANGING
cs_variant = gx_variant.
g_variant = gx_variant.
ELSE.
PERFORM initialize_variant.
ENDIF.
ENDFORM. " PAI_OF_SELECTION_SCREEN
&----
*& Form initialize_variant
&----
text
----
FORM initialize_variant.
g_save = 'A'.
CLEAR g_variant.
g_variant-report = repid.
gx_variant = g_variant.
CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
EXPORTING
i_save = g_save
CHANGING
cs_variant = gx_variant
EXCEPTIONS
not_found = 2.
IF sy-subrc = 0.
p_vari = gx_variant-variant.
ENDIF.
ENDFORM. " INITIALIZE_VARIANT
&----
*& Form build_layout
&----
text
----
FORM build_layout.
layout-f2code = f2code.
layout-zebra = 'X'.
layout-detail_popup = 'X'.
layout-no_vline = ' '.
ENDFORM. "build_layout
10-12-2006 1:27 PM
In form process_data,
1. Loop inside Loop not permitted.
2. Select Query Inseide loop not at all permitted. Use FOR ALL ENTRIES...
10-12-2006 1:30 PM
Hi,
1. First all remove all select * and select only the fields which you require for processing.
2. Since LIKP and LIPS are header and item table you can put a join between them, so that you can reduce a select
3. You need to remove select single * from BKPF and BSEG inside the LOOP and write it outside the LOOP.
4. Remove perform get_poinfo inside the LOOP and execute it separately.
5. Inside this perform get_poinfo, EKKO and EKPO are header and item level tables. So a inner join can be put on those tables.
Hope this will improve the performance of the report.
JLN.
10-12-2006 1:32 PM
Hi,
1.In your select statements from LIKP,LIPS select required fields only. Use join for tables LIKP & Lips.
2.If required create index on table with fields vstel
lfdat & werks.
3.Avoid using nested loops. This would take more abap time.
4.Take out select single statements outside the loop and retreive data by using for all entries . Inside the loop do the same logic by using read statements ( Binary search).
These steps will definetly improve performance.
Regards,
Sudheer
10-12-2006 1:32 PM
You can also use the transaction SE30 and monitor the program for the statements which are taking more time to excute.
10-12-2006 1:33 PM
I would advice to couple the below query into one...
select * from likp into corresponding fields of table it_likp
where vstel IN s_vstel
and lfdat IN s_lfdat
and werks IN s_werks.
CHECK NOT it_likp[] IS INITIAL.
if p_grn is initial.
select * from lips into corresponding fields of table it_lips
for all entries in it_likp
where vbeln = it_likp-vbeln
and matnr IN s_matnr
and matkl IN s_matkl
and bwart IN ('641')
and LFIMG ne 0.
Change it to -->
-->Also instead of all fields list the ones you are planning to use.
select {list of fields}
into corresponding fields of table it_lips
from lips as a inner join likp as b on avbeln = bvbeln
where a~matnr IN s_matnr
and a~matkl IN s_matkl
and a~bwart IN ('641')
and a~LFIMG ne 0
and b~vstel IN s_vstel
and b~lfdat IN s_lfdat
and b~werks IN s_werks.
10-12-2006 1:43 PM
Hi vijay
Regarding your program to reduce the execution time you can do following things in your program :
1) Avoid the following select * statements in the
FORM get_data .
select * from likp into corresponding fields of table it_likp
where vstel IN s_vstel
and lfdat IN s_lfdat
and werks IN s_werks.
select * from lips into corresponding fields of table it_lips
for all entries in it_likp
where vbeln = it_likp-vbeln
and matnr IN s_matnr
and matkl IN s_matkl
and bwart IN ('641')
and LFIMG ne 0.
<b>Instead you can select only the required fields into your internal tables it_likp & it_lips</b>. we must avoid select * statements . try not using into corresponding instead define your internal table according to field required. and use select field1 field2 .. from table name into table ITAB where...
2) In start of selection you can have perform get_data above other perform and these three
PERFORM build_eventtab USING gt_events[].
PERFORM build_comment USING heading[].
PERFORM build_layout
can be above PERFORM display_data if itab is not initial.
Just try both it might solve your problem
Thanks
10-12-2006 1:50 PM
Hi,
Most of the performance problems are due to the database statements. Open SQl statements. Please use the columns names instead of '*' where ever possible and avoid into corresponding fileds of table. This is a costly operation.
Where ever you use select single try and see if you can implement signle record buffering for the table.
Where ever possible dont use negative statements in Where clause and avoid using IN for range tables unless it is very important for your functionality.
Never execute select in a loop, try and see if you can use into table and appending table instead.
select * into table itab or
select * appending table itab.
Hope the above will help you.
Regards,
Sesh
Message was edited by: Seshatalpasai Madala