PDA

Ver la Versión Completa : Problemas creando tabla dinámica


uo4396
30/04/09, 15:33:21
Hola a todos;

Estoy intentando crear una tabla dinámica. El código es el siguiente:

TYPE-POOLS: abap, col.
* Tablas dinámicas
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
<dyn_wa>,
<fs>.

DATA: gt_dyn TYPE REF TO data,
gw_dyn TYPE REF TO data,
r_table TYPE REF TO cl_salv_table,
r_header TYPE REF TO cl_salv_form_element,
r_footer TYPE REF TO cl_salv_form_element,
r_columns_table TYPE REF TO cl_salv_columns_table,
r_column_table TYPE REF TO cl_salv_column_table,
r_datadescr TYPE REF TO cl_abap_datadescr,
r_structdescr TYPE REF TO cl_abap_structdescr,
gw_component TYPE abap_componentdescr,
gt_component TYPE abap_component_tab.

DATA: l_idx(2) TYPE c,
l_matnr TYPE matnr,
l_maktx TYPE maktx,
l_matkl TYPE matkl,
l_hslxx(6) TYPE C,
lt_color TYPE lvc_t_scol,
l_desc TYPE char50.

r_datadescr ?= cl_abap_datadescr=>describe_by_data( l_desc ).
gw_component-name = 'MATERIAL'.
gw_component-type = r_datadescr.
APPEND gw_component TO gt_component.


El problema lo tengo al realizar la llamada al método siguiente :

cl_abap_datadescr=>describe_by_data( l_desc ).

Para que sirve el parámetro que le estoy pasando al método describe_by_data?

Depende que cabecera me cree para la tabla mas adelante me lanza una excepción y no se campo exactamente pasar para que me funcione.
Si por ejemplo tengo definida una variable asi:

l_hslxx(6) TYPE c,

Y es la que le paso al método:

DO p_times TIMES.
l_idx = sy-index.
CONDENSE l_idx NO-GAPS.
r_datadescr ?= cl_abap_datadescr=>describe_by_data( l_hslxx ).
CONCATENATE 'HOY' l_idx INTO gw_component-name SEPARATED BY space.
gw_component-type = r_datadescr.
APPEND gw_component TO gt_component.
ENDDO.

El programa luego me casca en la siguiente sentencia:

CREATE DATA gw_dyn TYPE HANDLE r_structdescr.

¿ Alguien sabe que estoy haciendo mal ?

Saludos y gracias

DavidXD_XD
01/05/09, 02:24:49
Hola, te paso como creo una tabla interna y una estructura en forma dinamica, es muy similar a lo que colocas pero aver si se entiende mejor :D

TYPE-POOLS: abap, col, slis.
* Tablas dinámicas
FIELD-SYMBOLS: <dyn_table> TYPE STANDARD TABLE,
<dyn_wa>,
<fs>.

* Variables Globales
DATA: gt_dyn TYPE REF TO DATA,
gw_dyn TYPE REF TO DATA.

FORM build_dynamic_table.

DATA: lr_datadescr TYPE REF TO cl_abap_datadescr,
lr_structdescr TYPE REF TO cl_abap_structdescr,
ls_component TYPE abap_componentdescr,
lt_component TYPE abap_component_tab.

DATA: l_descr TYPE char50,
l_indx(3) TYPE n,
l_char5(5) TYPE c.

* Columna 1
* El metodo describe_by_data nos devuelve los atributos que tiene el tipo
* de variable que se le inserta como parametro y se le asigna al campo type
lr_datadescr ?= cl_abap_datadescr=>describe_by_data( l_descr ).
ls_component-name = 'COLUMNA'.
ls_component-type = lr_datadescr.
APPEND ls_component TO lt_component.
* Columnas Dinamicas
DO p_col TIMES.
l_indx = sy-index.
CONDENSE l_indx NO-GAPS.
lr_datadescr ?= cl_abap_datadescr=>describe_by_data( l_char5 ).
CONCATENATE 'COL' l_indx INTO ls_component-name.
ls_component-type = lr_datadescr.
APPEND ls_component TO lt_component.
ENDDO.
* Creando la tabla interna
TRY.
lr_structdescr = cl_abap_structdescr=>create( p_components = lt_component ).
CATCH cx_sy_struct_creation.
WRITE: / 'Excepcion:', 'CX_SY_STRUCT_CREATION'.
ENDTRY.
* Aqui creo una estructura
CREATE DATA gw_dyn TYPE HANDLE lr_structdescr.
ASSIGN gw_dyn->* TO <dyn_wa>.
* Y aqui creo una tabla interna con los campos de la estructura
CREATE DATA gt_dyn LIKE STANDARD TABLE OF <dyn_wa>.
ASSIGN gt_dyn->* TO <dyn_table>.

ENDFORM. " build_dynamic_table