‎2007 Feb 27 10:07 PM
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.
‎2007 Feb 28 12:36 AM
*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.
‎2007 Feb 27 10:22 PM
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
‎2007 Feb 27 10:32 PM
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
‎2007 Feb 27 10:31 PM
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
‎2007 Feb 27 10:42 PM
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.
‎2007 Feb 27 10:47 PM
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
‎2007 Feb 27 10:50 PM
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.
‎2007 Feb 27 10:38 PM
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
‎2007 Feb 27 10:42 PM
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
‎2007 Feb 27 11:20 PM
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>------->>>>>>>>> Why r u putting an EXIT here ?</b>
ENDSELCT <b>------->>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
‎2007 Feb 28 12:16 AM
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.
‎2007 Feb 28 12:49 AM
‎2007 Feb 28 12:36 AM
*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.