07-12-2007 9:17 AM
Hello,
i would like to create an internal range table about a table, which Name is in a Field.
I had create a Table with following Fields:
FALL CHAR10
LFDNR INT2
ZUORD CHAR5
FNAME M_COMB_FNAME
SIGN SIGN
OPTIO OPTION
HIGH HIGH_RANGE
LOW LOW_RANGE
At first i would like to create an internal range table, about a table which standing in the Field FNAME. And if there is a new Tablename in the Field FNAME, than i would like to create a new internal range table.
My suggestions are:
At First to create a Fieldsymbol:
assign (FNAME) to ).
And now, to create the new range table.
But How?
there are "create data", but it´s not working.
And then to fill the range table...
Is there anybody, who could help me.
Thanks.
07-12-2007 5:59 PM
Hello Tobias
Here is a sample report showing how to create range itabs dynamically.
*&---------------------------------------------------------------------*
*& Report ZUS_SDN_RTTI_CREATE_RANGE
*&
*&---------------------------------------------------------------------*
*& NOTE: create range itab dynamically
*&
*&---------------------------------------------------------------------*
REPORT ZUS_SDN_RTTI_CREATE_RANGE.
TYPE-POOLS: abap.
CONSTANTS:
gc_range TYPE tabname VALUE 'RSDSSELOPT'.
DATA:
gd_tabnam TYPE string,
gd_tabfield TYPE string,
go_table TYPE REF TO cl_salv_table,
go_sdescr TYPE REF TO cl_abap_structdescr,
go_sdescr_new TYPE REF TO cl_abap_structdescr,
go_tdescr TYPE REF TO cl_abap_tabledescr,
go_typedescr TYPE REF TO cl_abap_typedescr,
gdo_handle TYPE REF TO data,
gs_component TYPE abap_compdescr,
gt_components TYPE abap_compdescr_tab,
*
gs_comp TYPE abap_componentdescr,
gt_comp TYPE abap_component_tab.
*
FIELD-SYMBOLS:
<gt_range> TYPE STANDARD TABLE.
PARAMETER:
p_tabfld(61) TYPE c DEFAULT 'KNB1-KUNNR'.
START-OF-SELECTION.
" Describe structure
go_sdescr ?= cl_abap_structdescr=>describe_by_name( gc_range ).
gt_components = go_sdescr->components.
REFRESH: gt_comp.
LOOP AT gt_components INTO gs_component.
CLEAR: gs_comp.
IF ( gs_component-name = 'LOW' OR
gs_component-name = 'HIGH' ).
" Take data description from parameter !!!
gs_comp-type ?= cl_abap_datadescr=>describe_by_name( p_tabfld ).
ELSE.
" Build fieldname
CONCATENATE gc_range gs_component-name INTO gd_tabfield
SEPARATED BY '-'.
gs_comp-type ?= cl_abap_datadescr=>describe_by_name( gd_tabfield ).
ENDIF.
gs_comp-name = gs_component-name.
APPEND gs_comp TO gt_comp.
ENDLOOP.
go_sdescr_new = cl_abap_structdescr=>create( gt_comp ).
go_tdescr = cl_abap_tabledescr=>create( go_sdescr_new ).
" Create data refence followed by table creation
CREATE DATA gdo_handle TYPE HANDLE go_tdescr.
ASSIGN gdo_handle->* TO <gt_range>.
DO 5 TIMES.
APPEND INITIAL LINE TO <gt_range>.
ENDDO.
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = go_table
CHANGING
t_table = <gt_range>.
go_table->display( ).
CATCH cx_salv_msg .
ENDTRY.
" Display component list in order to prove that indeed the field names
" are used (instead of the data element names)
TRY.
CALL METHOD cl_salv_table=>factory
IMPORTING
r_salv_table = go_table
CHANGING
t_table = gt_comp.
go_table->display( ).
CATCH cx_salv_msg .
ENDTRY.
END-OF-SELECTION.
Regards
Uwe
07-13-2007 3:14 PM
Thanks, that was my answer:
lr_strucdescr ?= CL_ABAP_STRUCTDESCR=>describe_by_name( <fs> ).
lr_tabledescr ?= cl_abap_tabledescr=>create( p_line_type = lr_strucdescr ).
create data lr_data_struct TYPE HANDLE lr_strucdescr.
ASSIGN lr_data_struct->* TO <fs_struct>.
create data lr_data_table TYPE HANDLE lr_tabledescr.
ASSIGN lr_data_table->* TO <fs_table> .
Regard