PDA

Ver la Versión Completa : ALV OO dinámico


Neo_25
23/10/09, 12:30:24
Buenas,
alguien me podría decir como se haría a grandes rasgos un ALV Orientado a Objetos Dinámico, es decir, q no se sabe cuantas columnas mostrará de manera fija.

Yo he hecho ALV OO, pero no dinámica.

Si alguien me podría decir algo. Por favor.

Lo ideal sería algo de código, por eso si me indican algún enlace con ello, perfecto.

Gracias

Neo_25
26/10/09, 14:11:17
Lo he resuelto de esta manera.
Es un código de la página:
http://www.saptechnical.com/Tutorials/ALV/DynamicALV/Demo.htm

*ALV OO dinámico
* Declaración de TYPE POOLS para el ALV
TYPE-POOLS: slis. " ALV Global Types
* Declaración de VARIABLES para la tabla interna dinámica y el ALV
DATA: l_structure TYPE REF TO DATA,
l_table TYPE REF TO DATA,
struc_desc TYPE REF TO cl_abap_structdescr,
lt_layout TYPE slis_layout_alv,
ls_lvc_fieldcatalogue TYPE lvc_s_fcat,
lt_lvc_fieldcatalogue TYPE lvc_t_fcat,
ls_fieldcatalogue TYPE slis_fieldcat_alv,
lt_fieldcatalogue TYPE slis_t_fieldcat_alv.
* Declaración de FIELD-SYMBOLS
FIELD-SYMBOLS : <it_table> TYPE STANDARD TABLE,
<dyn_str> TYPE ANY,
<str_comp> TYPE abap_compdescr.
* Textos para el TÍTULO del grid
DATA : t1(30), "texto escrito por nosotros
t2(10), "recibirá el nombre de la tabla
t3(50). "texto final a mostrar
* Declaración de SELECTION SCREEN para la tabla de entrada
PARAMETERS : p_table TYPE TABNAME."LIKE dd02l-tabname. "Nombre de la tabla
* initialization event
INITIALIZATION.
* start of selection event
START-OF-SELECTION.
* Textos para los TÍTULOS DEL GRID
t1 = 'ALV OO dinámico de la tabla: '. "texto introducido por nosotros
t2 = p_table. "nombre de la tabla seleccionada
* Texto final a mostrar en la pantalla
CONCATENATE t1 t2 INTO t3 SEPARATED BY space.
* C R E A R U N A E S T R U C T U R A D I N Á M I C A
CREATE DATA l_structure TYPE (p_table).
ASSIGN l_structure->* TO <dyn_str>.
* C A M P O S D E L A E S T R U C T U R A
struc_desc ?= cl_abap_typedescr=>describe_by_data( <dyn_str> ).
LOOP AT struc_desc->components ASSIGNING <str_comp>.
* construimos el Fieldcatalog
ls_lvc_fieldcatalogue-fieldname = <str_comp>-name.
ls_lvc_fieldcatalogue-ref_table = p_table.
APPEND ls_lvc_fieldcatalogue TO lt_lvc_fieldcatalogue.
* construimos el Fieldcatalog
ls_fieldcatalogue-fieldname = <str_comp>-name.
ls_fieldcatalogue-ref_tabname = p_table.
APPEND ls_fieldcatalogue TO lt_fieldcatalogue.
ENDLOOP.

* C R E A R L A T A B L A I N T E R N A D I N Á M I C A
CALL METHOD cl_alv_table_create=>create_dynamic_table
EXPORTING
it_fieldcatalog = lt_lvc_fieldcatalogue
IMPORTING
ep_table = l_table.
ASSIGN l_table->* TO <it_table>.
* recuperar los datos de la tabla seleccionada
SELECT * FROM (p_table)
INTO CORRESPONDING FIELDS OF TABLE <it_table>.
* LAYOUT del ALV
lt_layout-zebra = 'X'.
lt_layout-colwidth_optimize = 'X'.
lt_layout-window_titlebar = t3.
* MOSTRAR el ALV
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_layout = lt_layout
it_fieldcat = lt_fieldcatalogue
TABLES
t_outtab = <it_table>
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.