11-03-2015 8:26 AM
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.
11-03-2015 9:14 AM
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
11-03-2015 9:14 AM
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
11-03-2015 9:29 AM
Muchas gracias, Roberto.
Tiene muy buena pinta, voy a probarlo y te cuento.
Un saludo.