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

Urgent help

Former Member
0 Likes
1,345

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

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
1,292

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.

9 REPLIES 9
Read only

Former Member
0 Likes
1,292

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.

Read only

0 Likes
1,292

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.

Read only

0 Likes
1,292

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.

Read only

0 Likes
1,292

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

Read only

Former Member
0 Likes
1,292

after append struct2.

add : clear struc2.

remove the three statements

else.

exit.

continue.

Read only

Former Member
0 Likes
1,292

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

Read only

Former Member
0 Likes
1,292

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 .

Read only

Former Member
0 Likes
1,293

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.

Read only

Former Member
0 Likes
1,292

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