2006 Feb 25 10:31 AM
Hi Experts,
While looping the following code I am getting only all data for header & item
For first record. I am not getting header data for remaining records.
I want to get all data (both header & item) for all records.
Please anyone help me.
loop at cdhdr.
Len = strlen( cdhdr-objectid ).
pos = Len - r_datasize-low.
w_kvalue = cdhdr-objectid+pos(r_datasize-low).
struct1-OBJECTCLAS = cdhdr-OBJECTCLAS.
struct1-OBJECTID = cdhdr-OBJECTID.
struct1-KEYVALUE = w_kvalue.
struct1-CHANGENR = cdhdr-CHANGENR.
struct1-USERNAME = cdhdr-USERNAME.
struct1-UDATE = cdhdr-UDATE.
struct1-UTIME = cdhdr-UTIME.
struct1-TCODE = cdhdr-TCODE.
struct1-PLANCHNGNR = cdhdr-PLANCHNGNR.
struct1-ACT_CHNGNO = cdhdr-ACT_CHNGNO.
struct1-WAS_PLANND = cdhdr-WAS_PLANND.
struct1-CHANGE_IND = cdhdr-CHANGE_IND.
struct1-LANGU = cdhdr-LANGU.
struct1-VERSION = cdhdr-VERSION.
append struct1.
loop at tcdpos1 .
if tcdpos1-tabkey+3(14) eq cdhdr-OBJECTID.
struct2-TABNAME = Tcdpos1-TABNAME.
struct2-TABKEY = Tcdpos1-TABKEY.
struct2-FNAME = Tcdpos1-FNAME.
struct2-CHNGIND = Tcdpos1-CHNGIND.
struct2-TEXT_CASE = Tcdpos1-TEXT_CASE.
struct2-OUTLEN = Tcdpos1-OUTLEN.
struct2-F_OLD = Tcdpos1-F_OLD.
struct2-F_NEW = Tcdpos1-F_NEW.
struct2-KEYGUID = Tcdpos1-KEYGUID.
struct2-TABKEY254 = Tcdpos1-TABKEY254.
struct2-EXT_KEYLEN = Tcdpos1-EXT_KEYLEN.
append struct2.
else.
exit.
continue.
endif.
endloop.
endloop.
<b>Output of this code</b>
~HeaderKOSTL10000000001000100042875803022005112454KS02**UE
~itemCSKSB800100000000010009999123119940101STRASU0035asdad*0033
~itemCSKSB800100000000010009999123119940101NAME4U0035asdad*0033
~itemCSKSB800100000000010009999123119940101NAME3U0035asdasd*0033
~itemCSKSB800100000000010009999123119940101NAME2U0035dada*0033
~ Header KOSTL10000000002100210042876103022005114629KS02**UE
~ Header KOSTL10000000002100210042876003022005114433KS02**UE
~ Header KOSTL10000000002100210042875903022005112507KS02**UE
~ Header KOSTL20000000009590959043040920022006111733KS02**UE
~ Header KOSTL20000000009590959043040820022006111712KS02**UE
2006 Feb 25 6:27 PM
Try this.
DATA: BEGIN OF i_output OCCURS 0,
record(1000).
DATA: END OF i_output.
LOOP AT cdhdr.
len = STRLEN( cdhdr-objectid ).
pos = Len - r_datasize-low.
w_kvalue = cdhdr-objectid+pos(r_datasize-low).
CONCATENATE 'Header'
cdhdr-objectclas
cdhdr-objectid
w_kvalue
cdhdr-changenr
cdhdr-username
cdhdr-udate
cdhdr-utime
cdhdr-tcode
cdhdr-planchngnr
cdhdr-act_chgno
cdhdr-was_plannd
cdhdr-change_ind
cdhdr-langu
cdhdr-version
INTO i_output-record SEPARATED BY '*'.
APPEND i_output.
CLEAR i_output.
LOOP AT tcdpos1 WHERE objectid = cdhdr-objectid.
CONCATENATE tcdpos1-tabname
tcdpos1-tabkey
tcdpos1-fname
tcdpos1-chngind
tcdpos1-text_case
tcdpos1-outlen
tcdpos1-f_old
tcdpos1-f_new
tcdpos1-keyguid
tcdpos1-tabkey254
tcdpos1-ext_keylen
INTO i_output-record SEPARATED BY '*'.
APPEND i_output.
CLEAR i_output.
ENDLOOP.
ENDLOOP.
2006 Feb 25 10:58 AM
Hi silviya,
1. The reason is that the logic is incorrect.
2. remove the 3 lines
else.
exit.
continue.
3. There are other ways of using
logic, but since u have used two loops,
(instead of 1 loop, and 2nd READ Statement),
u can remove the above 3 lines.
regards,
amit m.
2006 Feb 25 11:13 AM
Hi All,
I am not getting exact output even i removed that lines & used read statement.
tcdpos1-tabkey+3(14) & objectid have same values while debugging.whenever it is satisfying it writes struct2.
Please verify my code.
loop at cdhdr.
Len = strlen( cdhdr-objectid ).
pos = Len - r_datasize-low.
w_kvalue = cdhdr-objectid+pos(r_datasize-low).
struct1-OBJECTCLAS = cdhdr-OBJECTCLAS.
struct1-OBJECTID = cdhdr-OBJECTID.
struct1-KEYVALUE = w_kvalue.
struct1-CHANGENR = cdhdr-CHANGENR.
struct1-USERNAME = cdhdr-USERNAME.
struct1-UDATE = cdhdr-UDATE.
struct1-UTIME = cdhdr-UTIME.
struct1-TCODE = cdhdr-TCODE.
struct1-PLANCHNGNR = cdhdr-PLANCHNGNR.
struct1-ACT_CHNGNO = cdhdr-ACT_CHNGNO.
struct1-WAS_PLANND = cdhdr-WAS_PLANND.
struct1-CHANGE_IND = cdhdr-CHANGE_IND.
struct1-LANGU = cdhdr-LANGU.
struct1-VERSION = cdhdr-VERSION.
append struct1.
clear struct1.
loop at tcdpos1 .
*read table tcdpos1 with key tabkey+3(14) = cdhdr-objectid.
if tcdpos1-tabkey+3(14) eq cdhdr-OBJECTID.
*
struct2-TABNAME = Tcdpos1-TABNAME.
struct2-TABKEY = Tcdpos1-TABKEY.
struct2-FNAME = Tcdpos1-FNAME.
struct2-CHNGIND = Tcdpos1-CHNGIND.
struct2-TEXT_CASE = Tcdpos1-TEXT_CASE.
struct2-OUTLEN = Tcdpos1-OUTLEN.
struct2-F_OLD = Tcdpos1-F_OLD.
struct2-F_NEW = Tcdpos1-F_NEW.
struct2-KEYGUID = Tcdpos1-KEYGUID.
struct2-TABKEY254 = Tcdpos1-TABKEY254.
struct2-EXT_KEYLEN = Tcdpos1-EXT_KEYLEN.
append struct2.
clear struct2.
else.
exit.
endif.
endloop.
endloop.
2006 Feb 25 11:27 AM
Hi again,
1. if tcdpos1-tabkey+3(14) eq cdhdr-OBJECTID
why are u using this condition ?
2. why don't u compare both the field names
fully ?
<b> if tcdpos1-objectid eq cdhdr-OBJECTID</b>
regards,
amit m.
2006 Feb 25 11:35 AM
Hi
Try to use this condition
IF tcdpos1-tabkey+3(len) EQ cdhdr-objectid(len)
instead of
if tcdpos1-tabkey+3(14) eq cdhdr-OBJECTID.
Anyway: Why don't you want to use the field objectid of CDPOS instead of TABKEY? Shouldn't it be better?
Max
2006 Feb 25 10:58 AM
after append struct2.
add : clear struc2.
remove the three statements
else.
exit.
continue.
2006 Feb 25 11:09 AM
Hi
Your code should be like this:
LOOP AT cdhdr.
len = STRLEN( cdhdr-objectid ).
pos = len - r_datasize-low.
w_kvalue = cdhdr-objectid+pos(r_datasize-low).
struct1-objectclas = cdhdr-objectclas.
struct1-objectid = cdhdr-objectid.
struct1-keyvalue = w_kvalue.
struct1-changenr = cdhdr-changenr.
struct1-username = cdhdr-username.
struct1-udate = cdhdr-udate.
struct1-utime = cdhdr-utime.
struct1-tcode = cdhdr-tcode.
struct1-planchngnr = cdhdr-planchngnr.
struct1-act_chngno = cdhdr-act_chngno.
struct1-was_plannd = cdhdr-was_plannd.
struct1-change_ind = cdhdr-change_ind.
struct1-langu = cdhdr-langu.
struct1-version = cdhdr-version.
APPEND struct1.
LOOP AT tcdpos1 WHERE objectclas = cdhdr-objectclas AND
objectid = cdhdr-objectid.
IF tcdpos1-tabkey+3(14) EQ cdhdr-objectid.
struct2-tabname = tcdpos1-tabname.
struct2-tabkey = tcdpos1-tabkey.
struct2-fname = tcdpos1-fname.
struct2-chngind = tcdpos1-chngind.
struct2-text_case = tcdpos1-text_case.
struct2-outlen = tcdpos1-outlen.
struct2-f_old = tcdpos1-f_old.
struct2-f_new = tcdpos1-f_new.
struct2-keyguid = tcdpos1-keyguid.
struct2-tabkey254 = tcdpos1-tabkey254.
struct2-ext_keylen = tcdpos1-ext_keylen.
APPEND struct2.
ELSE.
EXIT.
CONTINUE.
ENDIF.
ENDLOOP.
ENDLOOP.
This line of code
"IF tcdpos1-tabkey+3(14) EQ cdhdr-objectid" I believe it's wrong:
TABKEY field have the value of the key of the record has been changed, but it can be different from the OBJECTID that's the key of the main object.
For example:
I want to know the modification of a vendor:
- the main object is the table LFA1, so the OBJECTID is LIFNR, if I change a copmany code data, so if I change a data in LFB1 table, it'll be:
OBJECTID -
> LIFNR
TABKEY -
> LIFNR+BUKRS
TABNAME -
> LFB1
Max
2006 Feb 25 11:39 AM
loop at cdhdr.
Len = strlen( cdhdr-objectid ).
pos = Len - r_datasize-low.
w_kvalue = cdhdr-objectid+pos(r_datasize-low).
struct1-OBJECTCLAS = cdhdr-OBJECTCLAS.
struct1-OBJECTID = cdhdr-OBJECTID.
struct1-KEYVALUE = w_kvalue.
struct1-CHANGENR = cdhdr-CHANGENR.
struct1-USERNAME = cdhdr-USERNAME.
struct1-UDATE = cdhdr-UDATE.
struct1-UTIME = cdhdr-UTIME.
struct1-TCODE = cdhdr-TCODE.
struct1-PLANCHNGNR = cdhdr-PLANCHNGNR.
struct1-ACT_CHNGNO = cdhdr-ACT_CHNGNO.
struct1-WAS_PLANND = cdhdr-WAS_PLANND.
struct1-CHANGE_IND = cdhdr-CHANGE_IND.
struct1-LANGU = cdhdr-LANGU.
struct1-VERSION = cdhdr-VERSION.
append struct1.
clear struct1.
loop at tcdpos1 where tcdpos1-tabkey+3(14) eq cdhdr-OBJECTID .
*read table tcdpos1 with key tabkey+3(14) = cdhdr-objectid.
*if tcdpos1-tabkey+3(14) eq cdhdr-OBJECTID.
*
struct2-TABNAME = Tcdpos1-TABNAME.
struct2-TABKEY = Tcdpos1-TABKEY.
struct2-FNAME = Tcdpos1-FNAME.
struct2-CHNGIND = Tcdpos1-CHNGIND.
struct2-TEXT_CASE = Tcdpos1-TEXT_CASE.
struct2-OUTLEN = Tcdpos1-OUTLEN.
struct2-F_OLD = Tcdpos1-F_OLD.
struct2-F_NEW = Tcdpos1-F_NEW.
struct2-KEYGUID = Tcdpos1-KEYGUID.
struct2-TABKEY254 = Tcdpos1-TABKEY254.
struct2-EXT_KEYLEN = Tcdpos1-EXT_KEYLEN.
append struct2.
clear struct2.
else.
exit.
endif.
endloop.
endloop.
remove the if for a while and see if u r able to populate the fields first .
2006 Feb 25 6:27 PM
Try this.
DATA: BEGIN OF i_output OCCURS 0,
record(1000).
DATA: END OF i_output.
LOOP AT cdhdr.
len = STRLEN( cdhdr-objectid ).
pos = Len - r_datasize-low.
w_kvalue = cdhdr-objectid+pos(r_datasize-low).
CONCATENATE 'Header'
cdhdr-objectclas
cdhdr-objectid
w_kvalue
cdhdr-changenr
cdhdr-username
cdhdr-udate
cdhdr-utime
cdhdr-tcode
cdhdr-planchngnr
cdhdr-act_chgno
cdhdr-was_plannd
cdhdr-change_ind
cdhdr-langu
cdhdr-version
INTO i_output-record SEPARATED BY '*'.
APPEND i_output.
CLEAR i_output.
LOOP AT tcdpos1 WHERE objectid = cdhdr-objectid.
CONCATENATE tcdpos1-tabname
tcdpos1-tabkey
tcdpos1-fname
tcdpos1-chngind
tcdpos1-text_case
tcdpos1-outlen
tcdpos1-f_old
tcdpos1-f_new
tcdpos1-keyguid
tcdpos1-tabkey254
tcdpos1-ext_keylen
INTO i_output-record SEPARATED BY '*'.
APPEND i_output.
CLEAR i_output.
ENDLOOP.
ENDLOOP.
2006 Feb 26 11:45 AM
Hi Silviya,
Why don't you use this function module and
LOOP AT l_cdhdr.
SELECT * FROM cdpos APPENDING CORRESPONDING FIELDS OF TABLE l_cdpos
WHERE objectclas = l_cdhdr-objectclas
AND objectid = l_cdhdr-objectid
AND changenr = l_cdhdr-changenr.
CALL FUNCTION 'CHANGEDOCUMENT_READ_POSITIONS'
EXPORTING
ARCHIVE_HANDLE = 0
changenumber = l_cdhdr-changenr
TABLEKEY = ' '
TABLENAME = ' '
IMPORTING
HEADER =
TABLES
editpos = l_cdshw
editpos_with_header = l_cdred
EXCEPTIONS
no_position_found = 1
WRONG_ACCESS_TO_ARCHIVE = 2
OTHERS = 3
You can define l_cdred as an internal table with type cdred. cdred is a strcuture with details from header and details.
Try it and let me know.
regards
Ravi