Application Development 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: 

Time limit error no matter what optimization I do...

aris_hidalgo
Contributor
0 Kudos

Hello Experts,

I am trying to optimize the code below since it always results in time limi error when we transport

it to production server. I have tried eliminating some select inside the loop and using for all entries

but it still gets the error. Anyway, below is the code and I hoe you can help me out on this one guys.

Thank you and take care!

LOOP AT lt_vbap ASSIGNING <wa_vbap>.

IF <wa_vbap>-auart EQ 'ZUCI' OR

<wa_vbap>-auart EQ 'ZURV' OR

<wa_vbap>-auart EQ 'ZUPR'.

  • Check if a delivery document has been created

  • CLEAR wa_vbill. "used wa_vbfa-vbeln instead of wa_vbill

*Start of modification - AVH - 04/11/07

*/ Used read table instead of fetching records from database every loop

  • SELECT SINGLE vbeln

  • FROM vbfa

  • INTO wa_vbill

  • WHERE vbelv = <wa_vbap>-vbeln

  • AND ( ( vbtyp_n EQ 'J' AND vbtyp_v = 'C' )

  • OR ( vbtyp_n EQ 'T' AND vbtyp_v = 'H' ) ).

CLEAR wa_vbfa.

READ TABLE lt_vbfa INTO wa_vbfa WITH KEY vbelv = <wa_vbap>-vbeln

vbtyp_n = 'J'

vbtyp_v = 'C'

BINARY SEARCH

TRANSPORTING vbeln.

IF sy-subrc <> 0.

READ TABLE lt_vbfa INTO wa_vbfa WITH KEY vbelv = <wa_vbap>-vbeln

vbtyp_n = 'T'

vbtyp_v = 'H'

BINARY SEARCH

TRANSPORTING vbeln.

ENDIF.

*End of modification - AVH - 04/11/07

IF sy-subrc <> 0.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ELSE.

  • Check if within selection parameters

CLEAR wa_likp.

*Start of modification - AVH - 04/11/07

  • READ TABLE lt_likp INTO wa_likp WITH KEY vbeln = wa_vbill.

READ TABLE lt_likp INTO wa_likp WITH KEY vbeln = wa_vbfa-vbeln.

*End of modification - AVH - 04/11/07

*Start of modification - AVH - 04/11/07

*/ Used wa_vbfa instead of variable wa_vbill

IF sy-subrc <> 0.

  • SELECT SINGLE *

  • FROM likp

  • INTO wa_likp

  • WHERE vbeln = wa_vbill.

SELECT SINGLE *

FROM likp

INTO wa_likp

WHERE vbeln = wa_vbfa-vbeln.

*End of modification - AVH - 04/11/07

APPEND wa_likp TO lt_likp.

ENDIF.

IF NOT wa_likp-wadat_ist IN s_erdat.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ENDIF.

ENDIF.

ELSE.

  • Check if this has already been billed

  • CLEAR wa_vbill. "Used wa_vbfa instead of wa_vbill

*Start of modification - AVH - 04/11/07

*/ Used read table instead of fetching records from database every loop

  • SELECT SINGLE vbeln

  • FROM vbfa

  • INTO wa_vbill

  • WHERE vbelv = <wa_vbap>-vbeln

  • AND ( ( vbtyp_n EQ 'M' AND vbtyp_v = 'C' )

  • OR ( vbtyp_n EQ 'O' AND vbtyp_v = 'H' ) ).

CLEAR wa_vbfa.

READ TABLE lt_vbfa INTO wa_vbfa WITH KEY vbelv = <wa_vbap>-vbeln

vbtyp_n = 'M'

vbtyp_v = 'C'

BINARY SEARCH

TRANSPORTING vbeln.

IF sy-subrc <> 0.

READ TABLE lt_vbfa INTO wa_vbfa WITH KEY vbelv = <wa_vbap>-vbeln

vbtyp_n = 'O'

vbtyp_v = 'H'

BINARY SEARCH

TRANSPORTING vbeln.

ENDIF.

*End of modification - AVH - 04/11/07

IF sy-subrc <> 0.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ELSE.

  • Check if within selection parameters

CLEAR wa_vbrk.

*Start of modification - AVH - 04/11/07

*/ Used wa_vbfa instead of variable wa_vbill.

  • READ TABLE lt_vbrk INTO wa_vbrk WITH KEY vbeln = wa_vbill.

READ TABLE lt_vbrk INTO wa_vbrk WITH KEY vbeln = wa_vbfa-vbeln.

IF sy-subrc <> 0.

  • SELECT SINGLE vbeln fkdat

  • FROM vbrk

  • INTO wa_vbrk

  • WHERE vbeln = wa_vbill.

  • APPEND wa_vbrk TO lt_vbrk.

SELECT SINGLE vbeln fkdat

FROM vbrk

INTO wa_vbrk

WHERE vbeln = wa_vbfa-vbeln.

APPEND wa_vbrk TO lt_vbrk.

ENDIF.

*End of modification

IF NOT wa_vbrk-fkdat IN s_erdat.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ENDIF.

ENDIF.

ENDIF.

  • Get Material Type and Division

IF <wa_vbap>-spart IS NOT INITIAL.

SELECT SINGLE mtart

FROM mara

INTO lv_mtart

WHERE matnr = <wa_vbap>-matnr.

ELSE.

SELECT SINGLE mtart spart

FROM mara

INTO (lv_mtart,<wa_vbap>-spart)

WHERE matnr = <wa_vbap>-matnr.

ENDIF.

  • If material division is same as parameter division

IF <wa_vbap>-spart = p_spart.

    • If material is subsidiary-owned

  • IF <wa_vbap>-spart in lr_spart.

  • If customer is the same as that of parameter division

IF <wa_vbap>-kunnr NE lr_kunnr OR <wa_vbap>-auart EQ 'ZUDO' OR <wa_vbap>-auart EQ 'ZUS3'.

  • If item is a free good, tag order type as 'ZUPR' to treat

  • the item the same way as 'ZUPR'

IF <wa_vbap>-pstyv = 'TANN' OR

<wa_vbap>-pstyv = 'ZKNF' OR

<wa_vbap>-pstyv = 'ZKNN' OR

<wa_vbap>-pstyv = 'ZFLO' OR

<wa_vbap>-pstyv = 'ZKBF' OR

<wa_vbap>-pstyv = 'ZKLN' OR

<wa_vbap>-pstyv = 'ZREN'.

lv_auart = <wa_vbap>-auart.

IF lv_auart EQ 'ZUPR'.

CLEAR <wa_vbap>-pstyv.

ENDIF.

<wa_vbap>-auart = 'ZUPR'.

CLEAR: lv_mtart.

ENDIF.

  • Set Cost of Goods Sold Account

<wa_vbap>-cogshkont = '0050000010'.

  • CASE <wa_vbap>-auart.

  • WHEN 'ZUDO' OR 'ZUPR' OR 'ZUCI'.

  • IF p_rtrns EQ 'X'.

  • <wa_vbap>-del_ind = 'X'.

  • CONTINUE.

  • ENDIF.

*

  • WHEN 'ZURD'.

  • IF p_issue EQ 'X'.

  • <wa_vbap>-del_ind = 'X'.

  • CONTINUE.

  • ENDIF.

*

  • WHEN OTHERS.

  • <wa_vbap>-del_ind = 'X'.

  • CONTINUE.

*

  • ENDCASE.

CASE <wa_vbap>-auart.

WHEN 'ZUPR'.

CASE lv_mtart.

WHEN 'ZUL4'.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

WHEN OTHERS.

  • Check if division is defined in mapping table

READ TABLE lt_ulsub INTO wa_ulsub

WITH KEY spart = <wa_vbap>-spart.

IF sy-subrc = 0.

<wa_vbap>-kostl = wa_ulsub-kostlp.

<wa_vbap>-bukrs = wa_ulsub-bukrsp.

<wa_vbap>-type = 'TP'.

  • Set Cost of Goods Sold Account

IF lv_auart = 'ZUPR'.

<wa_vbap>-cogshkont = '0050000006'.

ENDIF.

ELSE.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ENDIF.

ENDCASE.

WHEN 'ZUCI' OR 'ZUDO' OR 'ZURD' OR 'ZUS3'.

  • Get cost center from header text

PERFORM get_cost_center USING <wa_vbap>-vbeln

CHANGING <wa_vbap>-kostl.

  • * Change by LGTE 11-02-2006

  • Check if Medvale sales

IF <wa_vbap>-auart EQ 'ZUCI' AND <wa_vbap>-kostl IS INITIAL.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

  • Check if UL Cost Center

ELSEIF <wa_vbap>-kostl NE gv_ul_kostl.

  • IF <wa_vbap>-kostl NE gv_ul_kostl.

  • * End change.

    • Get material division and check if subsidiary product

  • SELECT SINGLE spart FROM mara INTO <wa_vbap>-spart

  • WHERE matnr = <wa_vbap>-matnr.

READ TABLE lt_ulsub INTO wa_ulsub

WITH KEY spart = <wa_vbap>-spart.

IF sy-subrc = 0.

  • Get requestor's company code from cost center data

SELECT SINGLE bukrs

FROM csks

INTO <wa_vbap>-bukrs

WHERE kokrs = lc_kokrs

AND kostl = <wa_vbap>-kostl

AND datbi GE sy-datum

AND datab LE sy-datum.

IF sy-subrc = 0.

  • For donations, only include if a subsidiary company is donating

IF <wa_vbap>-auart EQ 'ZUDO' OR <wa_vbap>-auart EQ 'ZUS3'.

IF NOT <wa_vbap>-kunnr IN lr_kunnrnt.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ENDIF.

  • CHECK <wa_vbap>-kunnr IN lr_kunnrnt.

ENDIF.

  • For ZUCI, if the company code of the costcenter is UL, do not include

IF <wa_vbap>-bukrs EQ gc_ul_bukrs.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ENDIF.

IF <wa_vbap>-bukrs = wa_ulsub-bukrsp.

<wa_vbap>-type = 'RV'.

ELSE.

<wa_vbap>-type = 'RV'.

ENDIF.

ELSE.

  • Check if customer defined in table ZFI_DONATIONS

SELECT SINGLE kunnr FROM zfi_donations INTO <wa_vbap>-kostl

WHERE kunnr = <wa_vbap>-kostl.

IF sy-subrc <> 0.

lv_error = 'X'.

CONCATENATE 'Cost center/Customer' <wa_vbap>-kostl

'does not exist. Please check Sales Order'

<wa_vbap>-vbeln

INTO lt_disp-message SEPARATED BY space.

lt_disp-type = 'E'.

<wa_vbap>-del_ind = 'X'.

APPEND lt_disp.

CONTINUE.

ELSE.

<wa_vbap>-type = 'RV'.

ENDIF.

ENDIF.

ELSE.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ENDIF.

ELSE.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ENDIF.

WHEN OTHERS.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ENDCASE.

ELSE.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ENDIF.

ELSE.

<wa_vbap>-del_ind = 'X'.

CONTINUE.

ENDIF.

  • Get company code description

SELECT SINGLE butxt

FROM t001

INTO <wa_vbap>-butxt

WHERE bukrs = <wa_vbap>-bukrs.

IF sy-subrc <> 0.

SELECT SINGLE name1

FROM kna1

INTO <wa_vbap>-butxt

WHERE kunnr = <wa_vbap>-kostl.

ENDIF.

    • Change by LGTE on 11-02-2006

  • Get Transaction Type

CASE <wa_vbap>-auart.

WHEN 'ZUPR'. "UL Promo/Samples

IF <wa_vbap>-pstyv = 'TANN' OR

<wa_vbap>-pstyv = 'ZKNF' OR

<wa_vbap>-pstyv = 'ZKNN' OR

<wa_vbap>-pstyv = 'ZFLO' OR

<wa_vbap>-pstyv = 'ZKBF' OR

<wa_vbap>-pstyv = 'ZKLN' OR

<wa_vbap>-pstyv = 'ZREN'.

<wa_vbap>-ltext = 'Free Goods'.

ELSE.

<wa_vbap>-ltext = 'Product Samples'.

ENDIF.

WHEN 'ZUDO'. "Donations - R/3

<wa_vbap>-ltext = 'Donations - R/3'.

WHEN 'ZUCI'. "Donations - ZUCI

<wa_vbap>-ltext = 'Donations - ZUCI'.

WHEN 'ZURD' OR 'ZUS3'. "UL Returns - Donation

<wa_vbap>-ltext = 'UL Returns - Donation'.

ENDCASE.

    • Get cost center description

  • SELECT SINGLE ltext FROM cskt INTO <wa_vbap>-ltext

  • WHERE spras = sy-langu

  • AND kokrs = lc_kokrs

  • AND kostl = <wa_vbap>-kostl

  • AND datbi GE sy-datum.

    • End of change.

  • Get material description

SELECT SINGLE maktx

FROM makt

INTO <wa_vbap>-maktx

WHERE matnr = <wa_vbap>-matnr

AND spras = sy-langu.

    • Get division from material master

  • SELECT SINGLE spart FROM mara INTO <wa_vbap>-spart

  • WHERE matnr = <wa_vbap>-matnr.

  • Get division description

SELECT SINGLE vtext

FROM tspat

INTO <wa_vbap>-vtext

WHERE spras = sy-langu

AND spart = <wa_vbap>-spart.

  • Get Valuation Class

SELECT SINGLE bklas

FROM mbew

INTO lv_bklas

WHERE matnr = <wa_vbap>-matnr.

  • Determine G/L of FG Based on Valuation Class

READ TABLE lt_val_cls INTO wa_val_cls WITH TABLE KEY bklas = lv_bklas.

<wa_vbap>-fghkont = wa_val_cls-hkont.

  • Determine Cost Center of Cogs Account

READ TABLE lt_ulsub INTO wa_ulsub WITH TABLE KEY spart = <wa_vbap>-spart.

<wa_vbap>-cogskostl = wa_ulsub-kostlp.

ENDLOOP. "ENDLOOP

1 ACCEPTED SOLUTION

Former Member
0 Kudos

Hi,

Hopefully it can help you:

1. Try remove all SELECT statement within LOOP, replace with select all data before LOOP using For ALL ENTRIES.

2. Try use READ TABLE using BINARY SEARCH. Don't forget to SORT the table according your Search Key.

If it still couldn;t help, try run your report in background.

Regards,

2 REPLIES 2

Former Member
0 Kudos

Hi,

Hopefully it can help you:

1. Try remove all SELECT statement within LOOP, replace with select all data before LOOP using For ALL ENTRIES.

2. Try use READ TABLE using BINARY SEARCH. Don't forget to SORT the table according your Search Key.

If it still couldn;t help, try run your report in background.

Regards,

Former Member
0 Kudos

Hi..

<b>CASE <wa_vbap>-auart.

WHEN 'ZUPR'.

CASE lv_mtart.

WHEN 'ZUL4'.</b>

i could n't understand how case stmt is nested which is not possible...

check ur code once.

Ram