Application Development 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: 

Cambiar estructura alv

Former Member
0 Kudos

Buenos días, estoy trabajando en un alv con la clase cl_salv_table. estoy intentando girarlo, me explico, hacer que las que ahora son las  columnas pasen a ser los registros y los registros las columnas. Todo esto podría solucionarlo generando otra tabla interna y poner una u otra en el contenedor de acuerdo al evento, sin embargo la  complicación viene porque nunca se cuantos registros voy a tener y quiero crear una tabla con un millón de columnas.

He estado trasteando con crear la estructura de la tabla en tiempo de ejecución, y lo he logrado usando GENERATE SUBROUTINE , sin embargo me crea la estructura pero sólo dentro del perform dinámico, fuera no existe.

Llevo varios días con este problema, si alguno conoce alguna función (en la que no tenga que cambiar la clase que estoy usando para el alv, eso es inviable)  o alguna forma de crear una estructura  o añadirle campos a una estructura en tiempo de ejecución estaría muy agradecido.

Un saludo,

Muchas  gracias.

1 ACCEPTED SOLUTION

roberto_vacca2
Active Contributor
0 Kudos

Hola.

Una solución podría derivar desde aquí.

Es una rutina que se mueve el contenido de las filas de las columnas de una manera dinámica.

DATA: comp_tab TYPE cl_abap_structdescr=>component_table,

           comp LIKE LINE OF comp_tab.

DATA: BEGIN OF it_tab OCCURS 0,

                  col1 TYPE string,

                  col2 TYPE string,

           END OF it_tab,

           i_rowsn TYPE i,

           n_index(2) TYPE n.

REFRESH it_tab.

it_tab-col1 = '0000'.

it_tab-col2 = 'Text1'.

APPEND it_tab.

it_tab-col1 = '0021'.

it_tab-col2 = 'Text2'.

APPEND it_tab.

it_tab-col1 = '0002'.

it_tab-col2 = 'Text3'.

APPEND it_tab.

DESCRIBE TABLE it_tab LINES i_rowsn.

"Build your components in Rows number

CHECK NOT i_rowsn IS INITIAL.

DO i_rowsn TIMES.

  CLEAR comp.

  MOVE sy-index TO n_index.

  CONCATENATE 'Header' n_index INTO comp-name.

  comp-type ?= cl_abap_datadescr=>describe_by_name( 'CHAR250_D' ). "<= here you'll need a valid "data type content reference name

  APPEND comp TO comp_tab.

ENDDO.

* Building dynamic structure

DATA struct_type TYPE REF TO cl_abap_structdescr.

struct_type = cl_abap_structdescr=>create( comp_tab ).

* Create table and work area

DATA: table_type TYPE REF TO cl_abap_tabledescr.

table_type = cl_abap_tabledescr=>create( p_line_type = struct_type ).

DATA: my_table TYPE REF TO DATA.

CREATE DATA my_table TYPE HANDLE table_type.

FIELD-SYMBOLS <table> TYPE STANDARD TABLE.

ASSIGN my_table->* to <table>.

* Create your lines

DATA: my_row TYPE REF TO DATA.

CREATE DATA my_row TYPE HANDLE struct_type.

FIELD-SYMBOLS <row> TYPE ANY.

ASSIGN my_row->* TO <row>.

DATA: fname(40) TYPE c.

FIELD-SYMBOLS <f_value> TYPE ANY.

DO i_rowsn TIMES.

  CLEAR comp.

  MOVE sy-index TO n_index.

  CONCATENATE '<row>-Header' n_index INTO fname.

  ASSIGN (fname) TO <f_value>.

  CHECK sy-subrc EQ 0.

  READ TABLE it_tab INDEX sy-index.

  CHECK sy-subrc EQ 0.

  <f_value> = it_tab-col2.

ENDDO.

APPEND <row> TO <table>.

Espero poder ayudar.

Saludos

2 REPLIES 2

roberto_vacca2
Active Contributor
0 Kudos

Hola.

Una solución podría derivar desde aquí.

Es una rutina que se mueve el contenido de las filas de las columnas de una manera dinámica.

DATA: comp_tab TYPE cl_abap_structdescr=>component_table,

           comp LIKE LINE OF comp_tab.

DATA: BEGIN OF it_tab OCCURS 0,

                  col1 TYPE string,

                  col2 TYPE string,

           END OF it_tab,

           i_rowsn TYPE i,

           n_index(2) TYPE n.

REFRESH it_tab.

it_tab-col1 = '0000'.

it_tab-col2 = 'Text1'.

APPEND it_tab.

it_tab-col1 = '0021'.

it_tab-col2 = 'Text2'.

APPEND it_tab.

it_tab-col1 = '0002'.

it_tab-col2 = 'Text3'.

APPEND it_tab.

DESCRIBE TABLE it_tab LINES i_rowsn.

"Build your components in Rows number

CHECK NOT i_rowsn IS INITIAL.

DO i_rowsn TIMES.

  CLEAR comp.

  MOVE sy-index TO n_index.

  CONCATENATE 'Header' n_index INTO comp-name.

  comp-type ?= cl_abap_datadescr=>describe_by_name( 'CHAR250_D' ). "<= here you'll need a valid "data type content reference name

  APPEND comp TO comp_tab.

ENDDO.

* Building dynamic structure

DATA struct_type TYPE REF TO cl_abap_structdescr.

struct_type = cl_abap_structdescr=>create( comp_tab ).

* Create table and work area

DATA: table_type TYPE REF TO cl_abap_tabledescr.

table_type = cl_abap_tabledescr=>create( p_line_type = struct_type ).

DATA: my_table TYPE REF TO DATA.

CREATE DATA my_table TYPE HANDLE table_type.

FIELD-SYMBOLS <table> TYPE STANDARD TABLE.

ASSIGN my_table->* to <table>.

* Create your lines

DATA: my_row TYPE REF TO DATA.

CREATE DATA my_row TYPE HANDLE struct_type.

FIELD-SYMBOLS <row> TYPE ANY.

ASSIGN my_row->* TO <row>.

DATA: fname(40) TYPE c.

FIELD-SYMBOLS <f_value> TYPE ANY.

DO i_rowsn TIMES.

  CLEAR comp.

  MOVE sy-index TO n_index.

  CONCATENATE '<row>-Header' n_index INTO fname.

  ASSIGN (fname) TO <f_value>.

  CHECK sy-subrc EQ 0.

  READ TABLE it_tab INDEX sy-index.

  CHECK sy-subrc EQ 0.

  <f_value> = it_tab-col2.

ENDDO.

APPEND <row> TO <table>.

Espero poder ayudar.

Saludos

0 Kudos

Muchas gracias, Roberto.

Tiene muy buena pinta, voy a probarlo y te cuento.

Un saludo.