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: 

experts try to modify the code .

Former Member
0 Kudos

experts try to modify the code to increase performance. It is very difficult to alter this code ie removing select inside the loop etc. I hope someone is there to prove that they r expert

tables: zmtp, mkpf, mseg, mast, lfa1. “ztemp has lifnr, matnr,kbetr

data: begin of sk_data occurs 0,

matnr like mseg-matnr, "1

idnrk like stpo-idnrk, "2

kbetr like zmtp-kbetr, "3

menge like mseg-menge, "4

compu like mseg-menge, "5

alqty like mseg-menge, "6

scqty like mseg-menge, "7

chqty like mseg-menge, "8

lifnr like lfa1-lifnr, "9

bomus like mseg-menge, "bom usage

rsq like mseg-menge, "real scrap qty

end of sk_data.

data: t_data like table of sk_data with header line.

parameters: p_werks like t001w-werks obligatory memory id wer,

p_lifnr like lfa1-lifnr obligatory memory id lif.

select-options: s_budat for mkpf-budat.

start-of-selection.

perform get_data.

perform display.

top-of-page.

perform top.

form get_data .

data: lt_stb like stpox occurs 0 with header line.

data: begin of lt_we occurs 0,

mblnr like mkpf-mblnr,

end of lt_we.

data: lt_wo like table of lt_we with header line.

data: lt_wa like table of lt_we with header line.

data: lt_121 like table of lt_we with header line.

data: begin of lt_menge occurs 0,

mblnr like mseg-mblnr,

matnr like mseg-matnr,

bwart like mseg-bwart,

menge like mseg-menge,

end of lt_menge.

select mblnr into table lt_we

from mkpf

where budat in s_budat

and vgart = 'WE'.

select mblnr into table lt_wo

from mkpf

where budat in s_budat

and vgart = 'WO'.

select lifnr matnr kbetr

into corresponding fields of table t_data

from zmtp

where lifnr = p_lifnr.

select single * from lfa1

where lifnr = p_lifnr.

loop at t_data

if not lt_we[] is initial.

select mblnr matnr bwart menge into table lt_menge

from mseg

for all entries in lt_we

where mblnr = lt_we-mblnr

and matnr = t_data-matnr

and werks = p_werks

and bwart in ('101', '102').

loop at lt_menge.

if lt_menge-bwart = '102'.

lt_menge-menge = - lt_menge-menge.

endif.

t_data-menge =t_data-menge + lt_menge-menge.

endloop.

modify t_data.

endif.

if not lt_wo[] is initial.

select mblnr into table lt_121

from mseg

for all entries in lt_wo

where mblnr = lt_wo-mblnr

and matnr = t_data-matnr

and werks = p_werks

and bwart = '121'.

if not lt_121[] is initial.

select mblnr matnr bwart menge into table lt_menge

from mseg

for all entries in lt_121

where mblnr = lt_121-mblnr

and bwart in ('543', '544').

loop at lt_menge.

if lt_menge-bwart = '544'.

lt_menge-menge = - lt_menge-menge.

endif.

t_data-rsq = t_data-rsq + lt_menge-menge.

endloop.

modify t_data.

endif.

endif.

endloop.

loop at t_data.

select single stlnr into mast-stlnr

from mast

where matnr = t_data-matnr

and stlan = '1'

and werks = p_werks.

if sy-subrc = 0.

select single stlal into stko-stlal

from stko

where stlnr = mast-stlnr

and stlty = 'M'

and stlst <> '02'

and datuv <= sy-datum.

call function 'CS_BOM_EXPL_MAT_V2'

exporting

capid = 'PP01'

datuv = sy-datum

mtnrv = t_data-matnr

stlal = stko-stlal

stlan = '1'

werks = p_werks

tables

stb = lt_stb

exceptions

alt_not_found = 1

call_invalid = 2

material_not_found = 3

missing_authorization = 4

no_bom_found = 5

no_plant_data = 6

no_suitable_bom_found = 7

conversion_error = 8

others = 9.

loop at lt_stb.

if lt_stb-menge > 0.

sk_data = t_data.

sk_data-idnrk = lt_stb-idnrk.

sk_data-bomus = lt_stb-menge.

sk_data-compu = sk_data-menge * sk_data-bomus.

sk_data-alqty = sk_data-compu * sk_data-kbetr / 100. "

if not lt_wa[] is initial.

select mblnr matnr bwart menge into table lt_menge

from mseg

for all entries in lt_wa

where mblnr = lt_wa-mblnr

and matnr = sk_data-idnrk

and werks = p_werks

and bwart in ('551', '552').

loop at lt_menge.

if lt_menge-bwart = '552'.

lt_menge-menge = - lt_menge-menge.

endif.

sk_data-rsq = sk_data-rsq + lt_menge-menge.

endloop.

endif.

sk_data-scqty = sk_data-rsq.

sk_data-chqty =sk_data-scqty - sk_data-alqty.

append sk_data.

endif.

endloop.

else.

sk_data = t_data.

append sk_data.

endif.

endloop.

sort sk_data by matnr idnrk.

endform. " get_data

6 REPLIES 6

Former Member
0 Kudos

well without making use of the code-button your code gets kinda unreadable, so i stopped after a while.

BUT until that i already found at least one small room of improvement.

you are doing 2 selects on MKPF right after one another.

why dont you just do ONE select on you MKPF with a double where clause?

like


SELECT mblnr into table lt_wo
from mkpf
where budat in s_budat
and vgart = 'WO'
or   vgart = 'WE'.

just make sure when you want to loop over your old lt_wo, dont forget to do it like following:

LOOP at lt_wo where vgart = 'WO'.

kesavadas_thekkillath
Active Contributor
0 Kudos

select mblnr vgart appending table lt_we from mkpf

client specified

where mandt = sy-mandt and budat in s_budat

and ( vgart = 'WO' or vgart = 'WE' )

select lifnr matnr kbetr

into corresponding fields of table t_data

from zmtp

where lifnr = p_lifnr.

select single * from lfa1

where lifnr = p_lifnr.

loop at t_data

select mblnr matnr bwart menge into table lt_menge

from mseg

for all entries in lt_we

where mblnr = lt_we-mblnr

and matnr = t_data-matnr

and werks = p_werks

and bwart in ('101', '102')

and lt_we-vgart =' we'.

loop at lt_menge where bwart = '102'.

lt_menge-menge = lt_menge-menge * -1.

t_data-menge = t_data-menge + lt_menge-menge.

endloop.

modify t_data transporting menge.

select mblnr into table lt_121

from mseg

for all entries in lt_we

where mblnr = lt_we-mblnr

and matnr = t_data-matnr

and werks = p_werks

and bwart = '121'

and lt_we-vgart = 'WO'.

i,m stopping here

Its very hard to grasp u r code...plz tell u r requirement so that it will be easy to get u r code....specify the process logic

0 Kudos

Thanks Mohammed for ur reply. I want to improve the performance only , so i want to reduce the database access. For this sake i want to change the select statements ie removing selects inside loops etc. Thanks a lot for your reply

0 Kudos

if it helped plz provide some points....

Pawan_Kesari
Active Contributor
0 Kudos

Select statements in your code can be taken out of LOOPs. see the code below... I took out the select statements and inserted LOOPs for that...

I did these changes only for

IF NOT lt_we[] IS INITIAL

for rest of the code you can put same logic



TABLES: zmtp, mkpf, mseg, mast, lfa1.

DATA: BEGIN OF sk_data OCCURS 0,
            matnr LIKE mseg-matnr, "1
            idnrk LIKE stpo-idnrk, "2
            kbetr LIKE zmtp-kbetr, "3
            menge LIKE mseg-menge, "4
            compu LIKE mseg-menge, "5
            alqty LIKE mseg-menge, "6
            scqty LIKE mseg-menge, "7
            chqty LIKE mseg-menge, "8
            lifnr LIKE lfa1-lifnr, "9
            bomus LIKE mseg-menge, "bom usage
            rsq LIKE mseg-menge, "real scrap qty
      END OF sk_data.

DATA: t_data LIKE TABLE OF sk_data WITH HEADER LINE.

PARAMETERS: p_werks LIKE t001w-werks OBLIGATORY MEMORY ID wer,
            p_lifnr LIKE lfa1-lifnr  OBLIGATORY MEMORY ID lif.

SELECT-OPTIONS: s_budat FOR mkpf-budat.

START-OF-SELECTION.
  PERFORM get_data.
  PERFORM display.

TOP-OF-PAGE.
  PERFORM top.

*---------------------------------------------------------------------*
*       FORM get_data                                                 *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
FORM get_data .
  DATA: lt_stb LIKE stpox OCCURS 0 WITH HEADER LINE.
  DATA: BEGIN OF lt_we OCCURS 0,
          mblnr LIKE mkpf-mblnr,
          vgart LIKE mkpf-vgart,
        END OF lt_we.
  DATA: lt_wo  LIKE TABLE OF lt_we WITH HEADER LINE ,
        lt_wa  LIKE TABLE OF lt_we WITH HEADER LINE ,
        lt_121 LIKE TABLE OF lt_we WITH HEADER LINE .

  DATA: BEGIN OF lt_menge OCCURS 0,
          mblnr LIKE mseg-mblnr,
          matnr LIKE mseg-matnr,
          bwart LIKE mseg-bwart,
          menge LIKE mseg-menge,
        END OF lt_menge.

  RANGES : r_matnr FOR mara-matnr .

  SELECT mblnr
         vgart
    INTO TABLE lt_we
    FROM mkpf
   WHERE budat IN s_budat
     AND ( vgart = 'WE' OR vgart = 'WO' ).

*  SELECT mblnr
*    INTO TABLE lt_wo
*    FROM mkpf
*   WHERE budat IN s_budat
*     AND vgart = 'WO'.


  SELECT lifnr
         matnr
         kbetr
    INTO CORRESPONDING FIELDS OF TABLE t_data
    FROM zmtp
   WHERE lifnr = p_lifnr.

  LOOP AT t_data .
    r_matnr-sign   = 'I' .
    r_matnr-option = 'EQ' .
    r_matnr-low    = t_data-matnr .
    APPEND r_matnr .
  ENDLOOP.

  SELECT SINGLE *
    FROM lfa1
   WHERE lifnr = p_lifnr.

  SELECT mblnr
         matnr
         bwart
         menge
    INTO TABLE lt_menge
    FROM mseg
     FOR ALL ENTRIES IN lt_we
   WHERE mblnr = lt_we-mblnr
     AND matnr IN r_matnr
     AND werks = p_werks
     AND bwart IN ('101', '102', '121').


  LOOP AT t_data .

    LOOP AT lt_we WHERE matnr = t_data-matnr
                    AND vgart = 'WE' .
*   IF NOT lt_we[] IS INITIAL.

*     SELECT mblnr
*            matnr
*            bwart
*            menge
*       INTO TABLE lt_menge
*       FROM mseg
*        FOR ALL ENTRIES IN lt_we
*      WHERE mblnr = lt_we-mblnr
*        AND matnr = t_data-matnr
*        AND werks = p_werks
*        AND bwart IN ('101', '102').

      LOOP AT l_menge WHERE mblnr = lt_we-mblnr
                            T_DATA-MATNR
                            werks = p_werks  .

*       LOOP AT lt_menge.
        IF lt_menge-bwart = '102'.
          lt_menge-menge = - lt_menge-menge.
        ENDIF.
        t_data-menge =t_data-menge + lt_menge-menge.
      ENDLOOP.

      MODIFY t_data.

    ENDLOOP .
*   ENDIF. "IF NOT lt_we[] IS INITIAL.

    IF NOT lt_wo[] IS INITIAL.

      SELECT mblnr
        INTO TABLE lt_121
        FROM mseg
         FOR ALL ENTRIES IN lt_wo
       WHERE mblnr = lt_wo-mblnr
         AND matnr = t_data-matnr
         AND werks = p_werks
         AND bwart = '121'.

      IF NOT lt_121[] IS INITIAL.
        SELECT mblnr
               matnr
               bwart
               menge
          INTO TABLE lt_menge
          FROM mseg
           FOR ALL ENTRIES IN lt_121
         WHERE mblnr = lt_121-mblnr
           AND bwart IN ('543', '544').


        LOOP AT lt_menge.
          IF lt_menge-bwart = '544'.
            lt_menge-menge = - lt_menge-menge.
          ENDIF.

          t_data-rsq = t_data-rsq + lt_menge-menge.

        ENDLOOP.

        MODIFY t_data.
      ENDIF. "IF NOT lt_121[] IS INITIAL
    ENDIF. "IF NOT lt_wo[] IS INITIAL
  ENDLOOP.

  LOOP AT t_data.

    SELECT SINGLE stlnr
      INTO mast-stlnr
      FROM mast
     WHERE matnr = t_data-matnr
       AND stlan = '1'
       AND werks = p_werks.

    IF sy-subrc = 0.

      SELECT SINGLE stlal
        INTO stko-stlal
        FROM stko
       WHERE stlnr = mast-stlnr
         AND stlty = 'M'
         AND stlst <> '02'
         AND datuv <= sy-datum.

      CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
           EXPORTING
                capid                 = 'PP01'
                datuv                 = sy-datum
                mtnrv                 = t_data-matnr
                stlal                 = stko-stlal
                stlan                 = '1'
                werks                 = p_werks
           TABLES
                stb                   = lt_stb
           EXCEPTIONS
                alt_not_found         = 1
                call_invalid          = 2
                material_not_found    = 3
                missing_authorization = 4
                no_bom_found          = 5
                no_plant_data         = 6
                no_suitable_bom_found = 7
                conversion_error      = 8
                OTHERS                = 9.

      LOOP AT lt_stb.
        IF lt_stb-menge > 0.
          sk_data = t_data.
          sk_data-idnrk = lt_stb-idnrk.
          sk_data-bomus = lt_stb-menge.
          sk_data-compu = sk_data-menge * sk_data-bomus.
          sk_data-alqty = sk_data-compu * sk_data-kbetr / 100. "
          IF NOT lt_wa[] IS INITIAL.
            SELECT mblnr matnr bwart menge INTO TABLE lt_menge
            FROM mseg
            FOR ALL ENTRIES IN lt_wa
            WHERE mblnr = lt_wa-mblnr
            AND matnr = sk_data-idnrk
            AND werks = p_werks
            AND bwart IN ('551', '552').
            LOOP AT lt_menge.
              IF lt_menge-bwart = '552'.
                lt_menge-menge = - lt_menge-menge.
              ENDIF.
              sk_data-rsq = sk_data-rsq + lt_menge-menge.
            ENDLOOP.
          ENDIF.

          sk_data-scqty = sk_data-rsq.
          sk_data-chqty =sk_data-scqty - sk_data-alqty.
          APPEND sk_data.

        ENDIF.
      ENDLOOP.
    ELSE.
      sk_data = t_data.
      APPEND sk_data.
    ENDIF.
  ENDLOOP.

  SORT sk_data BY matnr idnrk.
ENDFORM. " get_data

0 Kudos

Thanks for ur time Pawan.some of the statements in the code are throughing errors please correct them. Also please tell me the use of ranges.The errors are comming at..

LOOP AT t_data .

LOOP AT lt_we WHERE matnr = t_data-matnr :" we dont have field matnr

AND vgart = 'WE' .

  • IF NOT lt_we[] IS INITIAL.

  • SELECT mblnr

  • matnr

  • bwart

  • menge

  • INTO TABLE lt_menge

  • FROM mseg

  • FOR ALL ENTRIES IN lt_we

  • WHERE mblnr = lt_we-mblnr

  • AND matnr = t_data-matnr

  • AND werks = p_werks

  • AND bwart IN ('101', '102').

LOOP AT l_menge WHERE mblnr = lt_we-mblnr

T_DATA-MATNR

werks = p_werks . "werks is not there

pls correct the code..where we have to end the loop .