09-19-2013 1:25 AM
I am having an internal table ITAB1 with following fields and values:
FLD1 | FLD2 | FLD3 |
V100 | AA | 100 |
V100 | BB | 2 |
V100 | CC | 3 |
I have another internal table ITAB2 with following fields and values:
FLD3 |
100 |
200 |
400 |
I want to append ITAB2 in ITAB1 in such a way that it should have the output as below (Based upon value in ITAB2, FLD1 and FLD3 should change when FLD2 = AA.).
FLD1 | FLD2 | FLD3 |
V100 | AA | 100 |
V100 | BB | 2 |
V100 | CC | 3 |
V200 | AA | 200 |
V200 | BB | 2 |
V200 | CC | 3 |
V400 | AA | 400 |
V400 | BB | 2 |
V400 | CC | 3 |
**I have an understanding how to do this using Work area, but I have to do this using field symbols as later there is possibility that I have to determine conditional value (FLD2 = AA) dynamically.
Would really appreciate the help provided.
Thanks
09-19-2013 6:14 AM
Hi Kaur,
I have tried in different way . Check the program.
*TYPES:BEGIN OF ty_s,
* fld1 TYPE char4,
* fld2 TYPE char4,
* fld3 TYPE char4,
* END OF ty_s.
TYPES :BEGIN OF ty_s1,
fld TYPE char4,
fld2 TYPE char4,
fld3 TYPE char4,
END OF ty_s1.
DATA itab3 TYPE TABLE OF ty_s1.
DATA itab TYPE TABLE OF ty_s1.
DATA x_itab TYPE ty_s1.
DATA itab1 TYPE TABLE OF ty_s1.
DATA x_itab1 TYPE ty_s1.
DATA var TYPE char8.
FIELD-SYMBOLS: <fs> LIKE LINE OF itab1.
FIELD-SYMBOLS: <fs1> LIKE LINE OF itab.
x_itab-fld = 'V100'.
x_itab-fld2 = 'AA'.
x_itab-fld3 = '100'.
APPEND x_itab TO itab.
x_itab-fld = 'V100'.
x_itab-fld2 = 'BB'.
x_itab-fld3 = '2'.
APPEND x_itab TO itab.
x_itab-fld = 'V100'.
x_itab-fld2 = 'CC'.
x_itab-fld3 = '3'.
APPEND x_itab TO itab.
IF sy-subrc EQ 0.
x_itab1-fld3 = '100'.
APPEND x_itab1 TO itab1.
x_itab1-fld3 = '200'.
APPEND x_itab1 TO itab1.
x_itab1-fld3 = '400'.
APPEND x_itab1 TO itab1.
ENDIF.
APPEND LINES OF itab1 TO itab3.
CLEAR itab1.
IF sy-subrc EQ 0.
LOOP AT itab3 ASSIGNING <fs> .
LOOP AT itab ASSIGNING <fs1> .
CONCATENATE 'V' <fs>-fld3 INTO var.
x_itab1-fld = var.
x_itab1-fld2 = <fs1>-fld2.
IF sy-tabix EQ 1.
x_itab1-fld3 = <fs>-fld3.
ELSE.
x_itab1-fld3 = <fs1>-fld3.
ENDIF.
APPEND x_itab1 TO itab1.
ENDLOOP.
ENDLOOP.
ENDIF.
WRITE 'Internal table'.
LOOP at itab1 INTO x_itab1.
WRITE :/ x_itab1-fld,
at 10 x_itab1-fld2 ,
at 20 x_itab1-fld3.
ENDLOOP.
Output:
09-19-2013 4:35 AM
Hi S Kaur,
Try like this..
TYPES : BEGIN OF ty_itab1,
fld1 TYPE string,
fld2 TYPE string,
fld3 TYPE i,
END OF ty_itab1,
BEGIN OF ty_itab2,
fld3 TYPE i,
END OF ty_itab2.
DATA : it_itab1 TYPE TABLE OF ty_itab1,
it_itab2 TYPE TABLE OF ty_itab2,
it_itab3 TYPE TABLE OF ty_itab2,
wa_itab1 TYPE ty_itab1,
wa_itab3 TYPE ty_itab2.
perform itab using :
'V100' 'AA' ' ',
'V100' 'BB' '2',
'V100' 'CC' '3',
'V200' 'AA' ' ',
'V200' 'BB' '2',
'V200' 'CC' '3',
'V400' 'AA' ' ',
'V400' 'BB' '2',
'V400' 'CC' '3'.
wa_itab3-fld3 = '100'.
append wa_itab3 to it_itab2.
clear wa_itab3.
wa_itab3-fld3 = '200'.
append wa_itab3 to it_itab2.
clear wa_itab3.
wa_itab3-fld3 = '300'.
append wa_itab3 to it_itab2.
clear wa_itab3.
it_itab3 = it_itab2.
sort : it_itab1 by fld1 fld2,
it_itab3 by fld3.
Loop at it_itab1 into wa_itab1.
at new fld1.
read TABLE it_itab3 into wa_itab3 INDEX 1.
if sy-subrc = 0.
wa_itab1-fld3 = wa_itab3-fld3.
MODIFY it_itab1 from wa_itab1 TRANSPORTING fld3.
delete it_itab3 INDEX 1.
clear wa_itab1.
endif.
ENDAT.
endloop.
Loop at it_itab1 into wa_itab1.
Write : / wa_itab1-fld1,
wa_itab1-fld2,
wa_itab1-fld3.
endloop.
*&---------------------------------------------------------------------*
*& Form itab
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_FLD1 text
* -->P_FLD2 text
* -->P_FLD3 text
*----------------------------------------------------------------------*
form itab using p_fld1 type any
p_fld2 type any
p_fld3 type any.
wa_itab1-fld1 = p_fld1.
wa_itab1-fld2 = p_fld2.
wa_itab1-fld3 = p_fld3.
append wa_itab1 to it_itab1.
clear wa_itab1.
endform. " itab
09-19-2013 6:14 AM
Hi Kaur,
I have tried in different way . Check the program.
*TYPES:BEGIN OF ty_s,
* fld1 TYPE char4,
* fld2 TYPE char4,
* fld3 TYPE char4,
* END OF ty_s.
TYPES :BEGIN OF ty_s1,
fld TYPE char4,
fld2 TYPE char4,
fld3 TYPE char4,
END OF ty_s1.
DATA itab3 TYPE TABLE OF ty_s1.
DATA itab TYPE TABLE OF ty_s1.
DATA x_itab TYPE ty_s1.
DATA itab1 TYPE TABLE OF ty_s1.
DATA x_itab1 TYPE ty_s1.
DATA var TYPE char8.
FIELD-SYMBOLS: <fs> LIKE LINE OF itab1.
FIELD-SYMBOLS: <fs1> LIKE LINE OF itab.
x_itab-fld = 'V100'.
x_itab-fld2 = 'AA'.
x_itab-fld3 = '100'.
APPEND x_itab TO itab.
x_itab-fld = 'V100'.
x_itab-fld2 = 'BB'.
x_itab-fld3 = '2'.
APPEND x_itab TO itab.
x_itab-fld = 'V100'.
x_itab-fld2 = 'CC'.
x_itab-fld3 = '3'.
APPEND x_itab TO itab.
IF sy-subrc EQ 0.
x_itab1-fld3 = '100'.
APPEND x_itab1 TO itab1.
x_itab1-fld3 = '200'.
APPEND x_itab1 TO itab1.
x_itab1-fld3 = '400'.
APPEND x_itab1 TO itab1.
ENDIF.
APPEND LINES OF itab1 TO itab3.
CLEAR itab1.
IF sy-subrc EQ 0.
LOOP AT itab3 ASSIGNING <fs> .
LOOP AT itab ASSIGNING <fs1> .
CONCATENATE 'V' <fs>-fld3 INTO var.
x_itab1-fld = var.
x_itab1-fld2 = <fs1>-fld2.
IF sy-tabix EQ 1.
x_itab1-fld3 = <fs>-fld3.
ELSE.
x_itab1-fld3 = <fs1>-fld3.
ENDIF.
APPEND x_itab1 TO itab1.
ENDLOOP.
ENDLOOP.
ENDIF.
WRITE 'Internal table'.
LOOP at itab1 INTO x_itab1.
WRITE :/ x_itab1-fld,
at 10 x_itab1-fld2 ,
at 20 x_itab1-fld3.
ENDLOOP.
Output:
09-19-2013 6:16 AM
Hi,
Use this code
ty-tab1 contain 3 fields fld1,fld2,fld3
v_index and v_lines are integer with value 0
v_fld3 is a charter type of length 3
FIELD-SYMBOLS <fs> TYPE ty_tab1.
DESCRIBE TABLE t_tab2 LINES v_lines.
"Appending Values to Table
DO v_lines - 1 TIMES.
INSERT LINES OF t_tab1 FROM 1 TO v_lines INTO TABLE t_tab1.
ENDDO.
"Using Field Symbol To Modify Values
LOOP AT t_tab1 ASSIGNING <fs>.
IF sy-tabix MOD v_lines EQ 1.
v_index = v_index + 1.
ENDIF.
READ TABLE t_tab2 INTO v_fld3 INDEX v_index.
IF sy-subrc EQ 0.
CONCATENATE <fs>-fld1(1) v_fld3 INTO <fs>-fld1.
IF <fs>-fld2 = 'AA'.
<fs>-fld3 = v_fld3.
ENDIF.
ENDIF.
ENDLOOP.
Regards,
Jeffin
09-19-2013 6:32 AM
Hi,
i think this will work for you
TYPES : BEGIN OF ty_itab1,
fld1 TYPE string,
fld2 TYPE string,
fld3 TYPE i,
END OF ty_itab1,
BEGIN OF ty_itab2,
fld3 TYPE i,
END OF ty_itab2.
DATA : it_tab1 TYPE TABLE OF ty_itab1,
it_tab3 TYPE TABLE OF ty_itab2,
wa_tab1 TYPE ty_itab1,
wa_tab3 TYPE ty_itab2.
FIELD-SYMBOLS: <f1> TYPE ty_itab1,
<f2> STRUCTURE wa_tab1 DEFAULT %DUMMY%,
<f3> STRUCTURE wa_tab3 DEFAULT %DUMMY%,
<f4> TYPE ty_itab2.
ASSIGN wa_tab1 TO <f2>.
<f2>-fld1 = 'V100' .
<f2>-fld2 = 'AA' .
<f2>-fld3 = ' '.
APPEND <f2> TO it_tab1.
<f2>-fld1 = 'V100' .
<f2>-fld2 = 'BB' .
<f2>-fld3 = '2'.
APPEND <f2> TO it_tab1.
<f2>-fld1 = 'V100' .
<f2>-fld2 = 'CC' .
<f2>-fld3 = '3'.
APPEND <f2> TO it_tab1.
<f2>-fld1 = 'V200' .
<f2>-fld2 = 'AA' .
<f2>-fld3 = ' '.
APPEND <f2> TO it_tab1.
<f2>-fld1 = 'V200' .
<f2>-fld2 = 'BB' .
<f2>-fld3 = '2'.
APPEND <f2> TO it_tab1.
<f2>-fld1 = 'V200' .
<f2>-fld2 = 'CC' .
<f2>-fld3 = '3'.
APPEND <f2> TO it_tab1.
<f2>-fld1 = 'V400' .
<f2>-fld2 = 'AA' .
<f2>-fld3 = ' '.
APPEND <f2> TO it_tab1.
<f2>-fld1 = 'V400' .
<f2>-fld2 = 'BB' .
<f2>-fld3 = '2'.
APPEND <f2> TO it_tab1.
<f2>-fld1 = 'V400' .
<f2>-fld2 = 'CC' .
<f2>-fld3 = '3'.
APPEND <f2> TO it_tab1.
UNASSIGN <f2>.
ASSIGN wa_tab3 TO <f3> .
<f3>-fld3 = '100'.
APPEND <f3> TO it_tab3.
<f3>-fld3 = '200'.
APPEND <f3> TO it_tab3.
<f3>-fld3 = '400'.
APPEND <f3> TO it_tab3.
UNASSIGN <f3>.
SORT : it_tab1 BY fld1 fld2,
it_tab3 BY fld3.
LOOP AT it_tab1 ASSIGNING <f1>.
READ TABLE it_tab3 INTO wa_tab3 INDEX 1.
IF sy-subrc = 0.
IF <f1>-fld2 = 'AA'.
<f1>-fld3 = wa_tab3-fld3.
DELETE it_tab3 INDEX 1.
ENDIF.
ENDIF.
ENDLOOP.
UNASSIGN <f1>.
LOOP AT it_tab1 ASSIGNING <f1>.
WRITE : / <f1>-fld1,
<f1>-fld2,
<f1>-fld3.
ENDLOOP.
UNASSIGN <F1>.
09-19-2013 7:47 AM
Hi Kaur,
I would suggest you have a third internal table with the same structure as first internal table.
If I have understood correctly, you want to determine the field name (fld2) that is used for validation dynamically.
Try this logic.
DATA : it_itab1 TYPE TABLE OF ty_itab1,
it_itab2 TYPE TABLE OF ty_itab1,
it_itab3 TYPE TABLE OF ty_itab2,
wa_itab1 TYPE ty_itab1,
wa_itab2 type ty_itab1,
wa_itab3 TYPE ty_itab2,
lv_prev_fld1 type string,
field_name type string.
FIELD-SYMBOLS : <fs1>,<fs2>.
" As required the field name can be assigned dynamically, maybe from a parameter.
field_name = 'FLD2'.
assign wa_itab1 to <fs1>.
loop at it_itab3 into wa_itab3.
loop at it_itab1 into wa_itab1.
assign component field_name of STRUCTURE <fs1> to <fs2>.
if <fs2> is ASSIGNED and <fs2> = 'AA'. " AA can also be provided dynamically if required
concatenate wa_itab1-fld1+0(1) wa_itab3-fld3 into wa_itab1-fld1.
wa_itab1-fld3 = wa_itab3-fld3.
append wa_itab1 to it_itab2.
elseif not lv_prev_fld1 is INITIAL.
wa_itab1-fld1 = lv_prev_fld1.
append wa_itab1 to it_itab2.
endif .
lv_prev_fld1 = wa_itab1-fld1.
endloop.
endloop.
The output is as required.
Assuming, fld1 and fld3 are character/string fields. Else you have to move them to string field to perform the concatenate operation.