PDA

Ver la Versión Completa : añadir un campo en la tabla interna en tiempo de ejcucion


kelvin.acosta
20/01/10, 18:59:44
Buenas tardes amigos,


Necesito su colaboracion una vez mas, resulta que tengo que hacer unos calculos entre dos fechas y sacar las semanas que resulten de la mismas, en funcion de eso necesito añadir un campo en la tabla interna en tiempo de ejcucion, esto asi porque por cada registro debo presentar la cantidad de semanas y los valores que tiene para cada una.:confused:

Espero su colaboracion como siempre, y gracias.

saludos,

ballan
21/01/10, 10:51:51
Para la creacion de tablas dinamicas se puede hacer de varias maneras

Dispones de la clase CL_RS_STRUC y para crear una estructura seria algo mas o menos asi (quiza el fieldsymbol no aparezca bien porque lleva el mayor y el menor que y lo puede interpretar como etiquetas HTML)


DATA: go_data TYPE REF TO data.
DATA: go_tab TYPE REF TO data.
DATA: go_str TYPE REF TO cl_rs_struc.

FIELD-SYMBOLS: <str> TYPE ANY,
<tab> TYPE ANY TABLE.

*Instanciamos la clase
CREATE OBJECT go_str.

*Añadimos un campo
go_str->add_element( EXPORTING i_id = 'NOMBRE_ESTRUCTURA'
i_sconame = 'MATNR'
i_type = 'MATNR' ).

*Creamos la estructura dinamicamente
go_str->create( EXPORTING i_id = 'NOMBRE_ESTRUCTURA'
i_dynamic = 'X'
RECEIVING r_r_data = go_data ).


*En el fieldsymbol tenemos la estructura
ASSIGN go_data->* to <str>

CREATE OBJECT go_tab TYPE TABLE OF <str>.

*Ahora en este fieldsymbol tendriamos la tabla
ASSIGN go_tab->* to <tab>


Hay otra forma que a mi modo de entender es mas sencilla y consiste en crearse un fieldcat y utilizar el metodo CREATE_DYNAMIC_TABLE de la clase CL_ALV_TABLE_CREATE

algo mas o menos asi


DATA: subrc TYPE sysubrc.

DATA: lo_tabla TYPE REF TO data,
lo_linea TYPE REF TO data,
lo_lincol TYPE REF TO data.

DATA: lt_fcat TYPE lvc_t_fcat,
lt_color TYPE lvc_t_scol.

DATA: ls_fcat LIKE LINE OF lt_fcat,
ls_layo TYPE lvc_s_layo,
ls_color LIKE LINE OF lt_color.

DATA: lv_filas(8) TYPE n,
lv_columnas(8) TYPE n,
lv_nombre_col TYPE char30,
lv_index(2) TYPE n,
lv_fname TYPE lvc_fname,
lv_nombre_col_color TYPE char30,
lv_columna TYPE char30.

DATA: lc_nombre_col TYPE char30 VALUE 'COL',
lc_nombre_col_color TYPE char30 VALUE '<LINEA>-'.

FIELD-SYMBOLS: <tabla> TYPE STANDARD TABLE,
<linea> TYPE ANY,
<color> TYPE ANY TABLE,
<lincol> TYPE lvc_s_styl.

SELECTION-SCREEN: BEGIN OF BLOCK a1.

PARAMETERS: p_rows TYPE num8,
p_cols TYPE num8.

SELECTION-SCREEN: END OF BLOCK a1.

START-OF-SELECTION.

* CLEAR: subrc, co_tabla, co_linea, cv_fname.

*Obtenemos la tabla interna con las columnas y filas deseadas

lv_filas = p_rows.
lv_columnas = p_cols.

DO lv_columnas TIMES.

lv_index = sy-index.

CONCATENATE lc_nombre_col lv_index INTO lv_nombre_col.

ls_fcat-fieldname = lv_nombre_col.

APPEND ls_fcat TO lt_fcat.
CLEAR ls_fcat.

ENDDO.

CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
i_style_table = 'X'
it_fieldcatalog = lt_fcat
IMPORTING
ep_table = lo_tabla
e_style_fname = lv_fname.

ASSIGN lo_tabla->* TO <tabla>.

CREATE DATA lo_linea LIKE LINE OF <tabla>.

ASSIGN lo_linea->* TO <linea>.

DO lv_filas TIMES.

APPEND <linea> TO <tabla>.

ENDDO.

VLozano
22/01/10, 07:09:26
Pregunta: ¿Realmente quieres añadir unos campos a una tabla interna en función del cálculo? ¿O quieres informar unos campos ya creados en ella?

Para lo primero, ni idea, aunque yo probablemente ni lo intentaría (sigo sin verle la lógica a algo así). Para lo segundo: mira la ayuda del comando MODIFY (itab).

kelvin.acosta
22/01/10, 14:27:37
Hola a todos;

Primero gracias ballan por el codigo que me enviestas, realmente es esto lo que quiero hacer, crear un estructura o tabla de manera dinamica y agregar campos segun mi necesidad.

Por otro lado, Vlozano e tema se debe a que porque cuando ejecuten mi programan van hacer una seleccion de fechas y entonces por cada semana que se contenga en ese rango de fechas debo presentar columnas,por eso no puedo tener una estrucutra estatica, esta debe ser dinamica.

Gracias ballan otras vez, voy a probar con este que me das el cual me parece logico, si tienes otro ejemplo me lo haces llegar..

saludos

VLozano
25/01/10, 08:34:26
Puff... menudo peñazo...

¿Y no te dejan "prenormalizar"? Creas DOS tablas internas, una que guardará los datos y la crearás "dinámicamente" según el ejemplo u otra vía que se te pueda ocurrir, y otra del palo:

- clave de los registros
- semana
- dato

Llenas esta primera tabla, luego haces un recuento de las semanas guardadas, y usas el ejemplo o lo que sea para crear la nueva tabla interna.

Menudo marronazo :p

Suerte

ballan
25/01/10, 09:21:26
Con los ejemplos que te he mandado te bastaria para hacer eso, cuando te peleas un poco con ello tampoco es tan complicado, solo te comento algo que se me olvido decirte en el anterior post, si utilizas la clase CL_ALV_TABLE_CREATE existe una limitacion, solo puedes crear 36 tablas dinamicas en un mismo modo

Que quiero decir con esto?

Es muy tipico que en el PBO de una dynpro se cree la tabla dinamica y luego hagamos lo necesario para mostrarla en un grid o algo asi, si pones tu codigo generador de la tabla dinamica dentro del PBO cada vez que se ejecute volvera a calcular la tabla y cuando sea la vez numero 37 te dara un dump, el codigo generador de los objetos dinamicos debes tenerlo "apartado" y llamarlo 1 vez solamente, en tu PBO lo que haras es crear el grid o lo que sea y las veces siguiente refrescarlo