‎2006 Jun 01 11:14 AM
Hi all,
I created program for creating dynamic internal table as below :
type-pools : abap.
field-symbols: <dyn_table> type standard table,
<dyn_wa>,
<dyn_field>.
data: dy_table type ref to data,
dy_line type ref to data,
xfc type lvc_s_fcat,
ifc type lvc_t_fcat.
selection-screen begin of block b1 with frame.
parameters: p_table(30) type c default 'T001'.
selection-screen end of block b1.
start-of-selection.
perform get_structure.
perform create_dynamic_itab.
perform get_data.
perform write_out.
form get_structure.
data : idetails type abap_compdescr_tab,
xdetails type abap_compdescr.
data : ref_table_des type ref to cl_abap_structdescr.
xfc-fieldname = 'LIFNR'.
xfc-datatype = 'C'.
xfc-inttype = 'C'.
xfc-intlen = '10'.
xfc-decimals = '0'.
append xfc to ifc.
xfc-fieldname = 'EBELN'.
xfc-datatype = 'C'.
xfc-inttype = 'C'.
xfc-intlen = '10'.
xfc-decimals = '0'.
append xfc to ifc.
xfc-fieldname = 'MATKL'.
xfc-datatype = 'C'.
xfc-inttype = 'C'.
xfc-intlen = '9'.
xfc-decimals = '0'.
append xfc to ifc.
xfc-fieldname = 'WERKS'.
xfc-datatype = 'C'.
xfc-inttype = 'C'.
xfc-intlen = '4'.
xfc-decimals = '0'.
append xfc to ifc.
xfc-fieldname = 'MATNR'.
xfc-datatype = 'C'.
xfc-inttype = 'C'.
xfc-intlen = '18'.
xfc-decimals = '0'.
append xfc to ifc.
xfc-fieldname = 'MAKTX'.
xfc-datatype = 'C'.
xfc-inttype = 'C'.
xfc-intlen = '40'.
xfc-decimals = '0'.
append xfc to ifc.
endform.
form create_dynamic_itab.
Create dynamic internal table and assign to FS
call method cl_alv_table_create=>create_dynamic_table
exporting
it_fieldcatalog = ifc
importing
ep_table = dy_table.
assign dy_table->* to <dyn_table>.
Create dynamic work area and assign to FS
create data dy_line like line of <dyn_table>.
assign dy_line->* to <dyn_wa>.
endform.
form get_data.
Select Data from table.
select * into table <dyn_table>
from (p_table).
endform.
form write_out.
Write out data from table.
loop at <dyn_table> into <dyn_wa>.
do.
assign component sy-index
of structure <dyn_wa> to <dyn_field>.
if sy-subrc <> 0.
exit.
endif.
if sy-index = 1.
write:/ <dyn_field>.
else.
write: <dyn_field>.
endif.
enddo.
endloop.
endform.
The problem now that I am unable to access the fields of internal table as as "<dyn_table>-lifnr" nor the work area as "<dyn_wa>-lifnr" .It says structure does not have the field.
Its also not accessible in the debug mode.
How do I access the field to populate data to the table?
Pls post ur ideas.
Thanks,
stock
‎2006 Jun 01 11:18 AM
Hi
You can only use the field symbol (just as you're doing) but use the field name instead of the number:
assign component 'LIFNR'
of structure <dyn_wa> to <dyn_field>.
Max
‎2006 Jun 01 11:27 AM
Hi,
I do I write a statement like
<dyn_table>-lifnr = 1000010452.
<dyn_table>-matnr = v_matnr....
append <dyn_table>.
and so on ?
It does not accept the value for the internal table <dyn_table>.
Thanks,
stock
‎2006 Jun 01 11:31 AM
Do like this
FIELD-SYMBOLS : <FS_ANY> TYPE ANY.
ASSIGN COMPONENT 'LIFNR' OF STRUCTURE <dyn_table> TO <FS_ANY>.
<FS_ANY> = 1000010452.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <dyn_table> TO <FS_ANY>.
<FS_ANY> = V_MATNR ....
APPEND <DYN_TABLE>
This will work.
The error is becuase its dynamic and at design time while compiling the code it does not kow the name of the columns in DYN_TABLE.
Regards,
Ravi
Note :Please mark all the helpful answers
Message was edited by: Ravikumar Allampallam
‎2006 Jun 01 11:32 AM
Hi,
you can do some thing like this.....,
assign r_dyn_table->* to <t_dyn_table>.
create data r_wa_dyn_table like line of <t_dyn_table>.
assign r_wa_dyn_table->* to <wa_dyn_table>.
assign component 'FIELD1' of structure <wa_dyn_table> to <w_field>.
<w_field> = '10'.
assign component 'FIELD2' of structure <wa_dyn_table> to <w_field>.
<w_field> = '10'.
append <wa_dyn_table> to <t_dyn_table>.
assign component 'FIELD1' of structure <wa_dyn_table> to <w_field>.
<w_field> = '10'.
assign component 'FIELD2' of structure <wa_dyn_table> to <w_field>.
<w_field> = '10'.
append <wa_dyn_table> to <t_dyn_table>.regards
vijay
‎2006 Jun 01 11:32 AM
Hi
DATA: WA_LINE TYPE REF TO DATA.
create data WA_LINE like line of <dyn_table>.
ASSIGN WA_LINE->* TO <dyn_wa>.
LOOP AT xfc.
ASSIGN COMPONENT xfc-FIELDNAME OF STRUCTURE <dyn_wa> TO <FS_ANY>.
CASE xfc-FIELDNAME.
WHEN 'LIFNR'. <FS_ANY> = '1000010452'
WHEN 'MATNR'. <FS_ANY> = V_MATNR.
............
ENDCASE.
ENDLOOP.
APPEND <dyn_wa> to <dyn_table>.
Max
ENDLOOP.
‎2006 Jun 01 11:32 AM
Hi again,
1. <dyn_table>-lifnr = 1000010452.
It will not work.
2. We have to do it in two steps, for each field assignment.
varname = 'ITAB-LIFNR'.
ASSIGN (VARNAME) TO <fs>.
<FS> = '10000010452'.
varname = 'ITAB-matnr'.
ASSIGN (VARNAME) TO <fs>.
<FS> = v_matnr.
regards,
amit m.
‎2006 Jun 01 12:26 PM
Hi ,
One more obstacle.
How do I read from the dynamic internal table?
If I write as
loop at i_itab.
ASSIGN COMPONENT 'MATNR' OF STRUCTURE <fs_dyn_wa> TO <FS_ANY>.
read table <fs_dyn_table> with key <fs_any> = i_itab-matnr
into <fs_dyn_wa>.
.
.
.
.
.
endloop.
It gives error.
pls help with ur ideas.
Thanks,
Stock
‎2006 Jun 01 12:30 PM
Hi,
check this....
loop at <t_dyn_table> into <wa_dyn_table>.
assign component 'FIELD2' of structure <wa_dyn_table> to <w_field>.
assign component 'T_CELLCOLORS'
of structure <wa_dyn_table> to <t_cellcolors>.
clear wa_cellcolors.
wa_cellcolors-fname = 'FIELD2'.
if <w_field> = '10'.
wa_cellcolors-color-col = '7'.
else.
wa_cellcolors-color-col = '5'.
endif.
append wa_cellcolors to <t_cellcolors>.
modify <t_dyn_table> from <wa_dyn_table>.
endloop.Regards
Vijay
‎2006 Jun 01 1:04 PM
Hi,
FIELD-SYMBOLS : <FS_TAB> TYPE ANY.
LOOP AT <DYN_TAB> ASSIGNING <FS_TAB>.
ASSIGN COMPONENT 'LIFNR' OF STRUCTURE <FS_TAB> TO <FS_ANY>.
Now, <fs_any> will have the value of LIFNR field.
You can do the same with READ TABLE as well.
ENDLOOP.
Regards,
Ravi
Note : Please mark the helpful answers
‎2006 Jun 01 11:23 AM
Hi,
FIELD-SYMBOLS : <FS_ANY> TYPE ANY.
ASSIGN COMPONENT 'LIFNR' OF STRUCTURE <dyn_table> TO <FS_ANY>.
Now <FS_ANY> will have the value of <DYN_TABLE>-LIFNR.
Regards,
Ravi