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

report performance

Former Member
0 Likes
1,908

Is there any way of improving performance for these set of statements.I need to retrieve the record with the max datab in A005 for the conditions in the select statement.

SELECT * FROM A005 INTO TABLE IT_A005 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A005 BY DATAB DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_A005 COMPARING MATNR .

LOOP AT IT_A005.

KNUMH = IT_A005-KNUMH.

ENDLOOP.

ENDLOOP.

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
1,839

*Declare constants @ the top as follows.

CONSTANTS: c_zero type INT01 value 0,

C_one type INT01 value 1,

C_v type char01 value 'V',

C_PR00 type char04 value 'PR00'.

And use them in ur code.

Please, check out for the data elements defined which matches ur requirements.

Also, USE 'EQ' instead of '=' wherever u are using '='. The places where 'EQ' doesn't work are READ and value assignment like a = b. so apart from these two areas, you should use 'EQ' it creates indexing.

IS UR REPORT WORKING AS EXPECTED? I MEAN u r finally concern about the output.

SELECT * FROM ZCOSTHIST INTO TABLE IT_ZCOSTHIST WHERE MATNR IN S-MATNR

AND BUKRS IN S-BUKRS.

  • take the most recent record for a material in zcosthist

SORT IT_ZCOSTHIST BY MATNR BUKRS ASCENDING DATERUN DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_ZCOSTHIST COMPARING MATNR BUKRS.

LOOP AT IT_ZCOSTHIST .

  • Compare zcosthist prices for PBTS,PSDI and PCSC with the prices

  • in VK13

  • check for the condition record in the access tables A118,A005,

  • A903,A904,A006,A004,A914 and A029 and take the price from KONP

  • based on the condition record number, compare the

  • prices if the prices are not equal move the record to it_zcosthistm

  • for displaying or updating the records

  • set cdate,ctime and cuser in zcosthist for the latest record of

  • each material by taking the latest record in cdhdr based on the

  • condition number

FOUND = c_zero.

MOVE-CORRESPONDING IT_ZCOSTHIST TO IT_ZCOSTHISTM.

SELECT KNUMH DATAB FROM A118 INTO TABLE IT_A118 WHERE KAPPL EQ c_V

(YOU CAN DECLARE A CONSTANT FOR THIS VALUE - DECLARE A variable for each constant u used)

AND KSCHL EQ c_PR00

AND MATNR EQ IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

IF SY-SUBRC EQ z_zero.

READ TABLE IT_A118 INTO WA_A118 INDEX 1.

FOUND = c_one.

KNUMH = WA_A118-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A904 INTO TABLE IT_A904 WHERE KAPPL EQ V

AND KSCHL EQ c_PR00

AND MATNR EQ IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

IF SY-SUBRC EQ c_zero.

READ TABLE IT_A904 INTO WA_A904 INDEX 1.

FOUND = c_one.

KNUMH = WA_A904-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A914 INTO TABLE IT_A914 WHERE KAPPL EQ c_V'

AND KSCHL EQ c_PR00

AND MATNR EQ IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

IF SY-SUBRC = 0.

READ TABLE IT_A914 INTO WA_A914 INDEX 1.

FOUND = 1.

KNUMH = WA_A914-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A005 INTO TABLE IT_A005 WHERE KAPPL EQ c_V

AND KSCHL EQ cPR00

AND MATNR EQ IT_ZCOSTHIST-MATNR.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A005 BY DATAB DESCENDING.

READ TABLE IT_A005 INTO WA_A005 INDEX 1.

KNUMH = WA_A005-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A006 INTO TABLE IT_A006

WHERE KAPPL EQ c_v

AND KSCHL EQ c_PR00

AND MATNR EQ IT_ZCOSTHIST-MATNR.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A006 BY DATAB DESCENDING.

READ TABLE IT_A006 INTO WA_A006 INDEX 1.

KNUMH = WA_A006-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A004 INTO TABLE IT_A004

WHERE KAPPL = 'c_v

AND KSCHL EQ c_pr00

AND MATNR EQ IT_ZCOSTHIST-MATNR.

IF SY-SUBRC EQ c_zero.

FOUND = c_one.

SORT IT_A004 BY DATAB DESCENDING.

READ TABLE IT_A004 INTO WA_A004 INDEX 1.

KNUMH = WA_A004-KNUMH.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

IF FOUND = c_one.

SELECT SINGLE * FROM KONP WHERE KNUMH EQ KNUMH.

IF SY-SUBRC EQ 0.

SELECT USERNAME UDATE UTIME FROM CDHDR INTO TABLE IT_CDHDR

WHERE OBJECTCLAS EQ 'COND_A'

AND OBJECTID EQ KNUMH

ORDER BY UDATE UTIME DESCENDING.

IF SY-SUBRC EQ 0.

READ TABLE IT_CDHDR INTO WA_CDHDR INDEX 1.

IT_ZCOSTHIST-CDATE = WA_CDHDR-UDATE.

IT_ZCOSTHIST-CTIME = WA_CDHDR-UTIME.

IT_ZCOSTHIST-CUSER = WA_CDHDR-USERNAME.

MODIFY IT_ZCOSTHIST INDEX SY-TABIX.

ENDIF.

IF ( IT_ZCOSTHIST-LIST_PRICE NE KONP-KBETR ) .

wa_ZCOSTHISTM-ACTUALPRICE = KONP-KBETR.

APPEND wa_zcosthistm to IT_ZCOSTHISTM.

ENDIF.

ENDIF.

ENDIF.

ENDLOOP.

12 REPLIES 12
Read only

Former Member
0 Likes
1,839

Try this:

Instead of using *, select fields individually and use MAX (datab) in the query with group by clause

Something like this for e.g.:

DATA: CARRID TYPE SFLIGHT-CARRID,

MINIMUM TYPE P DECIMALS 2,

MAXIMUM TYPE P DECIMALS 2.

SELECT CARRID MIN( PRICE ) MAX( PRICE )

INTO (CARRID, MINIMUM, MAXIMUM)

FROM SFLIGHT

GROUP BY CARRID.

WRITE: / CARRID, MINIMUM, MAXIMUM.

ENDSELECT.

Or may be using subqueries

SELECT * FROM A005 INTO TABLE IT_A005 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

AND DATAB = ( SELECT MAX( DATAB) FROM A005 ).

Thanks,

Santosh

Message was edited by:

SKJ

Read only

0 Likes
1,839

It seems like A005 is a pooled or a cluster table . I tried to apply a statement like this before but it gave an error. For some other tables same statement worked.

SELECT * FROM A914 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

EXIT.

ENDSELECT.

IF SY-SUBRC = 0.

FOUND = 1.

KNUMH = A914-KNUMH.

ENDIF

Read only

Former Member
0 Likes
1,839

hey hii

what's tht IT_ZCOSTHIST? r u looping around this internal table and putting ur SELECT query inside tht Ioop?

If case if so then u shud use FOR ALL ENTRIES.

SELECT * FROM A005 INTO TABLE IT_A005 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = <b>IT_ZCOSTHIST-MATNR</b>

IF IT_ZCOSTHIST[] is NOT INITIAL.

SELECT * FROM A005 INTO TABLE IT_A005

FOR ALL ENTRIES IN TABLE IT_ZCOSTHIST

WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = <b>IT_ZCOSTHIST-MATNR</b>

ENDIF.

IF SY-SUBRC EQ 0.

FOUND = 1.

SORT IT_A005 BY DATAB DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_A005 COMPARING MATNR .

LOOP AT IT_A005 into wa_aoo5. (Use work area ALWAYS)

KNUMH = wa_A005-KNUMH.

<b>I am not understanding what exactly r u doing here?</b>

ENDLOOP.

hope this will help.

bbye tac care

Ashwani

Read only

0 Likes
1,839

IF SY-SUBRC EQ 0.

FOUND = 1.

SORT IT_A005 BY DATAB DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_A005 COMPARING MATNR .

LOOP AT IT_A005 into wa_aoo5. (Use work area ALWAYS)

KNUMH = wa_A005-KNUMH.

I am not understanding what exactly r u doing here?

ENDLOOP.

loop there is only to retrieve the knumh of the only record left after deleting . Is there any other way to do it.

Read only

0 Likes
1,839

if there is only one record left after deleting and you are sure tht there will be ONLY ONE record then u can go ahead and assign like

READ table IT_A005 into wa_a005 INDEX 1.

and use wa_a005-knumh field further in ur report.

hope this will help.

thanks 'n regard,

Ashwani

Read only

0 Likes
1,839

SELECT * FROM ZCOSTHIST INTO TABLE IT_ZCOSTHIST WHERE MATNR IN S-MATNR AND BUKRS IN S-BUKRS.

  • take the most recent record for a material in zcosthist

SORT IT_ZCOSTHIST BY MATNR BUKRS ASCENDING DATERUN DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_ZCOSTHIST COMPARING MATNR BUKRS.

LOOP AT IT_ZCOSTHIST .

  • Compare zcosthist prices for PBTS,PSDI and PCSC with the prices

  • in VK13

  • check for the condition record in the access tables A118,A005,

  • A903,A904,A006,A004,A914 and A029 and take the price from KONP

  • based on the condition record number, compare the

  • prices if the prices are not equal move the record to it_zcosthistm

  • for displaying or updating the records

  • set cdate,ctime and cuser in zcosthist for the latest record of

  • each material by taking the latest record in cdhdr based on the

  • condition number

FOUND = 0.

MOVE-CORRESPONDING IT_ZCOSTHIST TO IT_ZCOSTHISTM.

SELECT * FROM A118 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

EXIT.

ENDSELECT.

IF SY-SUBRC = 0.

FOUND = 1.

KNUMH = A118-KNUMH.

ELSE.

SELECT * FROM A904 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

EXIT.

ENDSELECT.

IF SY-SUBRC = 0.

FOUND = 1.

KNUMH = A904-KNUMH.

ELSE.

SELECT * FROM A914 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

EXIT.

ENDSELECT.

IF SY-SUBRC = 0.

FOUND = 1.

KNUMH = A914-KNUMH.

ELSE.

SELECT * FROM A005 INTO TABLE IT_A005 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A005 BY DATAB DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_A005 COMPARING MATNR.

LOOP AT IT_A005.

KNUMH = IT_A005-KNUMH.

ENDLOOP.

ELSE.

SELECT * FROM A006 INTO TABLE IT_A006 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A006 BY DATAB DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_A006 COMPARING MATNR.

LOOP AT IT_A006.

KNUMH = IT_A006-KNUMH.

ENDLOOP.

ELSE.

SELECT * FROM A004 INTO TABLE IT_A004 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A004 BY DATAB DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_A004 COMPARING MATNR

.

LOOP AT IT_A004.

KNUMH = IT_A004-KNUMH.

ENDLOOP.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

IF FOUND = 1.

SELECT SINGLE * FROM KONP WHERE KNUMH = KNUMH.

IF SY-SUBRC = 0.

SELECT * FROM CDHDR WHERE OBJECTCLAS = 'COND_A' AND OBJECTID =

KNUMH ORDER BY UDATE UTIME DESCENDING.

EXIT.

ENDSELECT.

IF SY-SUBRC = 0.

IT_ZCOSTHIST-CDATE = CDHDR-UDATE.

IT_ZCOSTHIST-CTIME = CDHDR-UTIME.

IT_ZCOSTHIST-CUSER = CDHDR-USERNAME.

MODIFY IT_ZCOSTHIST INDEX SY-TABIX.

ENDIF.

IF ( IT_ZCOSTHIST-LIST_PRICE <> KONP-KBETR ) .

IT_ZCOSTHISTM-ACTUALPRICE = KONP-KBETR.

APPEND IT_ZCOSTHISTM.

ENDIF.

ENDIF.

ENDIF.

ENDLOOP.

  • modify zcosthist to set cdate,ctime and cuser

MODIFY ZCOSTHIST FROM TABLE IT_ZCOSTHIST.

The logic is very simple . First getting all the data to it_zcosthist then sorting and keeping only one record for each material in the internal table based on the daterun. Then for each record in the internal table . It gets the latest condition record from the corresponding access table then gets the price from KONP table based on the condition record number and compare the price in the internal table with the KONP price.

Read only

Former Member
0 Likes
1,839

Hi,



TYPES: begin of TP_IT_A005,
               DATAB like a005-datab,
               KNUMH like a005-knumh,
       end of TP_IT_A005.

DATA: it_a005 type sorted table of TP_IT_A005 ... (e.g. WITH HEADER LINE)
    with non-unique key DATAB.

SELECT DATAB KNUMH FROM A005 INTO TABLE IT_A005
   WHERE KAPPL = 'V'
   AND KSCHL = 'PR00'
   AND MATNR = IT_ZCOSTHIST-MATNR.

IF SY-SUBRC = 0.
  FOUND = 1.
*  SORT IT_A005 BY DATAB DESCENDING.
*  DELETE ADJACENT DUPLICATES FROM IT_A005 COMPARING MATNR .
*  LOOP AT IT_A005.
*    KNUMH = IT_A005-KNUMH.
*  ENDLOOP.
  describe table it_a005 lines l_lin.
  read table IT_A005 index l_lin.
ENDIF.


Regards,

Pavel

Read only

Former Member
0 Likes
1,839

get all the required data in an Internal Table and proceed from there by fetching the MAX DATAB value .

U can always process ITABs.

hope this will help.

Thanks 'n Regards,

Ashwani

Read only

Former Member
0 Likes
1,839

Please use the following ... hope this will help

SELECT * FROM ZCOSTHIST INTO TABLE IT_ZCOSTHIST

WHERE MATNR IN S-MATNR

AND BUKRS IN S-BUKRS.

  • take the most recent record for a material in zcosthist

SORT IT_ZCOSTHIST BY MATNR BUKRS ASCENDING DATERUN DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_ZCOSTHIST COMPARING MATNR BUKRS.

LOOP AT IT_ZCOSTHIST .

  • Compare zcosthist prices for PBTS,PSDI and PCSC with the prices

  • in VK13

  • check for the condition record in the access tables A118,A005,

  • A903,A904,A006,A004,A914 and A029 and take the price from KONP

  • based on the condition record number, compare the

  • prices if the prices are not equal move the record to it_zcosthistm

  • for displaying or updating the records

  • set cdate,ctime and cuser in zcosthist for the latest record of

  • each material by taking the latest record in cdhdr based on the

  • condition number

FOUND = 0. (You shoud declare a constant like ‘c_zero’ for any constants used)

MOVE-CORRESPONDING IT_ZCOSTHIST TO IT_ZCOSTHISTM.

SELECT * FROM A118 into table IT_A118

WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

EXIT. <b>-------&#61664;>>>>>>>>> Why r u putting an EXIT here ?</b>

ENDSELCT <b>-------&#61664;>>NOT NEED TO USE IT – ALWAYS AVIOD SELECT-ENDSELECT</b>

IF SY-SUBRC EQ 0.

FOUND = 1.

READ table it_a118 into wa_a118 Index 1.

gv_KNUMH = wa_A118-KNUMH.

ELSE.

SELECT * FROM A904 into table it_a904

WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

IF SY-SUBRC EQ 0.

FOUND = 1.

READ table it_a904 into wa_a904 Index 1.

gv_KNUMH = wa_A904-KNUMH.

ELSE.

SELECT * FROM A914 into table it_1914

WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

IF SY-SUBRC EQ 0.

FOUND = 1.

READ table it_a914 into wa_a914 Index 1.

gv_KNUMH = wa_A914-KNUMH.

ELSE.

SELECT * FROM A005 INTO TABLE IT_A005 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

.

IF SY-SUBRC EQ 0.

FOUND = 1.

SORT IT_A005 BY DATAB DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_A005 COMPARING MATNR.

READ table it_a105 into wa_a105 Index 1.

gv_KNUMH = wa_A105-KNUMH.

ELSE.

SELECT * FROM A006 INTO TABLE IT_A006 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

.

IF SY-SUBRC EQ 0.

FOUND = 1.

SORT IT_A006 BY DATAB DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_A006 COMPARING MATNR.

READ table it_a106 into wa_a106 Index 1.

gv_KNUMH = wa_A106-KNUMH.

ELSE.

SELECT * FROM A004 INTO TABLE IT_A004 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A004 BY DATAB DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_A004 COMPARING MATNR

.

READ table it_a004 into wa_a04 Index 1.

gv_KNUMH = wa_A104-KNUMH.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDLOOP.

IF FOUND = 1.

SELECT SINGLE * FROM KONP WHERE KNUMH = gv_KNUMH.

IF SY-SUBRC EQ 0.

SELECT * FROM CDHDR into wa_cdhdr

WHERE OBJECTCLAS = 'COND_A'

AND OBJECTID = KNUMH

ORDER BY UDATE UTIME DESCENDING.

ENDSELECT.

IF SY-SUBRC EQ 0.

IT_ZCOSTHIST-CDATE = CDHDR-UDATE.

IT_ZCOSTHIST-CTIME = CDHDR-UTIME.

IT_ZCOSTHIST-CUSER = CDHDR-USERNAME.

MODIFY IT_ZCOSTHIST INDEX SY-TABIX.

ENDIF.

IF ( IT_ZCOSTHIST-LIST_PRICE <> KONP-KBETR ) .

IT_ZCOSTHISTM-ACTUALPRICE = KONP-KBETR.

APPEND IT_ZCOSTHISTM.

ENDIF.

ENDIF.

ENDIF.

ENDLOOP.

  • modify zcosthist to set cdate,ctime and cuser

MODIFY ZCOSTHIST FROM TABLE IT_ZCOSTHIST.

please declare itabs and was for each and every dbtable.

like IT_ZCOSTHIST type ZCOSTHIST for work area

and wa_ZCOSTHIST type standard table of ZCOSTHIST.

hope this will help,

Thanks 'n Regards,

Ashwani

Read only

0 Likes
1,839

Ashwani,

As per your suggestions, i could improve the performance a little bit .. How to use the constants

FOUND = 0. (You shoud declare a constant like ‘c_zero’ for any constants used)

This is the code after all the modifications.

SELECT * FROM ZCOSTHIST INTO TABLE IT_ZCOSTHIST WHERE MATNR IN S-MATNR

AND BUKRS IN S-BUKRS.

  • take the most recent record for a material in zcosthist

SORT IT_ZCOSTHIST BY MATNR BUKRS ASCENDING DATERUN DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_ZCOSTHIST COMPARING MATNR BUKRS.

LOOP AT IT_ZCOSTHIST .

  • Compare zcosthist prices for PBTS,PSDI and PCSC with the prices

  • in VK13

  • check for the condition record in the access tables A118,A005,

  • A903,A904,A006,A004,A914 and A029 and take the price from KONP

  • based on the condition record number, compare the

  • prices if the prices are not equal move the record to it_zcosthistm

  • for displaying or updating the records

  • set cdate,ctime and cuser in zcosthist for the latest record of

  • each material by taking the latest record in cdhdr based on the

  • condition number

FOUND = 0.

MOVE-CORRESPONDING IT_ZCOSTHIST TO IT_ZCOSTHISTM.

SELECT KNUMH DATAB FROM A118 INTO TABLE IT_A118 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

IF SY-SUBRC = 0.

READ TABLE IT_A118 INTO WA_A118 INDEX 1.

FOUND = 1.

KNUMH = WA_A118-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A904 INTO TABLE IT_A904 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

IF SY-SUBRC = 0.

READ TABLE IT_A904 INTO WA_A904 INDEX 1.

FOUND = 1.

KNUMH = WA_A904-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A914 INTO TABLE IT_A914 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

IF SY-SUBRC = 0.

READ TABLE IT_A914 INTO WA_A914 INDEX 1.

FOUND = 1.

KNUMH = WA_A914-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A005 INTO TABLE IT_A005 WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A005 BY DATAB DESCENDING.

READ TABLE IT_A005 INTO WA_A005 INDEX 1.

KNUMH = WA_A005-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A006 INTO TABLE IT_A006

WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A006 BY DATAB DESCENDING.

READ TABLE IT_A006 INTO WA_A006 INDEX 1.

KNUMH = WA_A006-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A004 INTO TABLE IT_A004

WHERE KAPPL = 'V'

AND KSCHL = 'PR00'

AND MATNR = IT_ZCOSTHIST-MATNR.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A004 BY DATAB DESCENDING.

READ TABLE IT_A004 INTO WA_A004 INDEX 1.

KNUMH = WA_A004-KNUMH.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

IF FOUND = 1.

SELECT SINGLE * FROM KONP WHERE KNUMH = KNUMH.

IF SY-SUBRC = 0.

SELECT USERNAME UDATE UTIME FROM CDHDR INTO TABLE IT_CDHDR

WHERE OBJECTCLAS = 'COND_A'

AND OBJECTID = KNUMH

ORDER BY UDATE UTIME DESCENDING.

IF SY-SUBRC = 0.

READ TABLE IT_CDHDR INTO WA_CDHDR INDEX 1.

IT_ZCOSTHIST-CDATE = WA_CDHDR-UDATE.

IT_ZCOSTHIST-CTIME = WA_CDHDR-UTIME.

IT_ZCOSTHIST-CUSER = WA_CDHDR-USERNAME.

MODIFY IT_ZCOSTHIST INDEX SY-TABIX.

ENDIF.

IF ( IT_ZCOSTHIST-LIST_PRICE <> KONP-KBETR ) .

IT_ZCOSTHISTM-ACTUALPRICE = KONP-KBETR.

APPEND IT_ZCOSTHISTM.

ENDIF.

ENDIF.

ENDIF.

ENDLOOP.

Read only

0 Likes
1,839

Thanks a lot. Thanks everyone for your valuable answers.

Read only

Former Member
0 Likes
1,840

*Declare constants @ the top as follows.

CONSTANTS: c_zero type INT01 value 0,

C_one type INT01 value 1,

C_v type char01 value 'V',

C_PR00 type char04 value 'PR00'.

And use them in ur code.

Please, check out for the data elements defined which matches ur requirements.

Also, USE 'EQ' instead of '=' wherever u are using '='. The places where 'EQ' doesn't work are READ and value assignment like a = b. so apart from these two areas, you should use 'EQ' it creates indexing.

IS UR REPORT WORKING AS EXPECTED? I MEAN u r finally concern about the output.

SELECT * FROM ZCOSTHIST INTO TABLE IT_ZCOSTHIST WHERE MATNR IN S-MATNR

AND BUKRS IN S-BUKRS.

  • take the most recent record for a material in zcosthist

SORT IT_ZCOSTHIST BY MATNR BUKRS ASCENDING DATERUN DESCENDING.

DELETE ADJACENT DUPLICATES FROM IT_ZCOSTHIST COMPARING MATNR BUKRS.

LOOP AT IT_ZCOSTHIST .

  • Compare zcosthist prices for PBTS,PSDI and PCSC with the prices

  • in VK13

  • check for the condition record in the access tables A118,A005,

  • A903,A904,A006,A004,A914 and A029 and take the price from KONP

  • based on the condition record number, compare the

  • prices if the prices are not equal move the record to it_zcosthistm

  • for displaying or updating the records

  • set cdate,ctime and cuser in zcosthist for the latest record of

  • each material by taking the latest record in cdhdr based on the

  • condition number

FOUND = c_zero.

MOVE-CORRESPONDING IT_ZCOSTHIST TO IT_ZCOSTHISTM.

SELECT KNUMH DATAB FROM A118 INTO TABLE IT_A118 WHERE KAPPL EQ c_V

(YOU CAN DECLARE A CONSTANT FOR THIS VALUE - DECLARE A variable for each constant u used)

AND KSCHL EQ c_PR00

AND MATNR EQ IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

IF SY-SUBRC EQ z_zero.

READ TABLE IT_A118 INTO WA_A118 INDEX 1.

FOUND = c_one.

KNUMH = WA_A118-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A904 INTO TABLE IT_A904 WHERE KAPPL EQ V

AND KSCHL EQ c_PR00

AND MATNR EQ IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

IF SY-SUBRC EQ c_zero.

READ TABLE IT_A904 INTO WA_A904 INDEX 1.

FOUND = c_one.

KNUMH = WA_A904-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A914 INTO TABLE IT_A914 WHERE KAPPL EQ c_V'

AND KSCHL EQ c_PR00

AND MATNR EQ IT_ZCOSTHIST-MATNR

ORDER BY DATAB DESCENDING.

IF SY-SUBRC = 0.

READ TABLE IT_A914 INTO WA_A914 INDEX 1.

FOUND = 1.

KNUMH = WA_A914-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A005 INTO TABLE IT_A005 WHERE KAPPL EQ c_V

AND KSCHL EQ cPR00

AND MATNR EQ IT_ZCOSTHIST-MATNR.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A005 BY DATAB DESCENDING.

READ TABLE IT_A005 INTO WA_A005 INDEX 1.

KNUMH = WA_A005-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A006 INTO TABLE IT_A006

WHERE KAPPL EQ c_v

AND KSCHL EQ c_PR00

AND MATNR EQ IT_ZCOSTHIST-MATNR.

IF SY-SUBRC = 0.

FOUND = 1.

SORT IT_A006 BY DATAB DESCENDING.

READ TABLE IT_A006 INTO WA_A006 INDEX 1.

KNUMH = WA_A006-KNUMH.

ELSE.

SELECT KNUMH DATAB FROM A004 INTO TABLE IT_A004

WHERE KAPPL = 'c_v

AND KSCHL EQ c_pr00

AND MATNR EQ IT_ZCOSTHIST-MATNR.

IF SY-SUBRC EQ c_zero.

FOUND = c_one.

SORT IT_A004 BY DATAB DESCENDING.

READ TABLE IT_A004 INTO WA_A004 INDEX 1.

KNUMH = WA_A004-KNUMH.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

IF FOUND = c_one.

SELECT SINGLE * FROM KONP WHERE KNUMH EQ KNUMH.

IF SY-SUBRC EQ 0.

SELECT USERNAME UDATE UTIME FROM CDHDR INTO TABLE IT_CDHDR

WHERE OBJECTCLAS EQ 'COND_A'

AND OBJECTID EQ KNUMH

ORDER BY UDATE UTIME DESCENDING.

IF SY-SUBRC EQ 0.

READ TABLE IT_CDHDR INTO WA_CDHDR INDEX 1.

IT_ZCOSTHIST-CDATE = WA_CDHDR-UDATE.

IT_ZCOSTHIST-CTIME = WA_CDHDR-UTIME.

IT_ZCOSTHIST-CUSER = WA_CDHDR-USERNAME.

MODIFY IT_ZCOSTHIST INDEX SY-TABIX.

ENDIF.

IF ( IT_ZCOSTHIST-LIST_PRICE NE KONP-KBETR ) .

wa_ZCOSTHISTM-ACTUALPRICE = KONP-KBETR.

APPEND wa_zcosthistm to IT_ZCOSTHISTM.

ENDIF.

ENDIF.

ENDIF.

ENDLOOP.