Crear ALV con columnas dinámicas
Caso: se desea utilizar un ALV dinámico, es decir con columnas dinámicas. Encontré un ejemplo por Internet, dejo la fuente al pie del post, realmente me sirvió para lo que necesitaba.
Solución: El ejemplo permite indicar la cantidad de filas y columnas y luego genera un ALV con dicha información
- image0012
- image0022
REPORT zprueba_alv_dinamico. TYPE-POOLS: slis. *& Título........: Test Alv Dinámico *& Descripción...: Segun la cantidad de columnas incrementar el catálogo de campos del ALV FIELD-SYMBOLS: <gt_dyntable> TYPE STANDARD TABLE, "Nombre de la tabla interna dinámica <gs_dyntable>, "Field symbol para crear un área de trabajo <gv_fldval> TYPE ANY. "Field Symbol para asignar valores DATA: gt_fieldcat TYPE slis_t_fieldcat_alv, "Lo utilizaremos al momento de invocar al ALV gt_fcat TYPE lvc_t_fcat."Lo utilizaremos al momento de crear la tabla dinámica DATA: gv_colno(2) TYPE n, "Nro de columna gv_flname(5) TYPE c. "Nombre del campo del catálogo PARAMETERS: pa_cols(5) TYPE c, "Campo de Texto para ingresar el número de columnas pa_rows(5) TYPE c. "Campo de Texto para ingresar el número de filas *----------------------------------------------------------------------* *START-OF-SELECTION * *----------------------------------------------------------------------* "Al Ejecutar el reporte se invocarán las siguientes rutinas PERFORM fill_dynamic_catalog. "Llena el catálogo de campos de la tabla dinámica PERFORM crea_dynamic_itable. "Crea la tabla interna dinámica PERFORM crea_dynamic_warea."Crear el área de trabajo para la tabla interna dinámica PERFORM fill_itable. "Llena de valores la tabla interna que se visualizará en el ALV PERFORM display_alv. "Visualiza el ALV *&---------------------------------------------------------------------* *& Form FILL_DYNAMIC_CATALOG *&---------------------------------------------------------------------* *"Llena el catálogo de campos de la tabla dinámica *----------------------------------------------------------------------* FORM fill_dynamic_catalog. DATA: ls_fcat TYPE lvc_s_fcat. "área de trabajo local para el catálogo de campos "La primera columna ls_fcat-fieldname = 'DESCRIPCION'. ls_fcat-datatype = 'CHAR'. ls_fcat-intlen = 15. APPEND ls_fcat TO gt_fcat. "Segun el número de columnas ingresado por el usuario en pantalla. DO pa_cols TIMES. CLEAR ls_fcat. MOVE sy-index TO gv_colno. CONCATENATE 'COL' gv_colno INTO ls_fcat-fieldname. ls_fcat-datatype = 'CHAR'. ls_fcat-intlen = 10. APPEND ls_fcat TO gt_fcat. ENDDO. ENDFORM. " FILL_DYNAMIC_CATALOG *&-----------------------------------------------------------------------* *& Form CREA_DYNAMIC_ITABLE *&-----------------------------------------------------------------------* *"Crea la tabla interna dinámica y asignamos a un field-symbol *&-----------------------------------------------------------------------* FORM crea_dynamic_itable . "Referencia de un Objeto DATA lo_newtable TYPE REF TO data. "Para la tabla interna dinámica "Invocamos al método 'create_dynamic_table' de la clase cl_alv_table_create "Como es una clase estática accedemos directamente desde la clase al método. CALL METHOD cl_alv_table_create=>create_dynamic_table EXPORTING it_fieldcatalog = gt_fcat IMPORTING ep_table = lo_newtable. ASSIGN lo_newtable->* TO <gt_dyntable>. ENDFORM. " CREA_DYNAMIC_ITABLE *&----------------------------------------------------------------------------------------------------* *& Form CREA_DYNAMIC_WAREA *&----------------------------------------------------------------------------------------------------* *"Crear el área de trabajo para la tabla interna dinámica y asignamos a un field-symbol *&----------------------------------------------------------------------------------------------------* FORM crea_dynamic_warea. "Referencia de un Objeto DATA lo_newline TYPE REF TO data. "Para el área de trabajo de la tabla interna dinámica. CREATE DATA lo_newline LIKE LINE OF <gt_dyntable>. ASSIGN lo_newline->* TO <gs_dyntable>. ENDFORM. " CREA_DYNAMIC_WAREA *&-----------------------------------------------------------------------* *& Form FILL_ITABLE *&-----------------------------------------------------------------------* *"Llena de valores la tabla interna que se visualizará en el ALV *&-----------------------------------------------------------------------* FORM fill_itable. DATA: lv_index_row(3) TYPE c, "Nro de fila que se esta tratando lv_index_col(3) TYPE c, "Nro de columna que se esta tratando lv_fldval(10) TYPE c. "Valor que será asignado en dicha celda de la fila y columna DO pa_rows TIMES. "Recorremos tantas filas se haya ingresado por pantalla lv_index_row = sy-index. *<gv_fldval> apuntará a la columna DESCRIPCION y por cada fila asignará su valor correspondiente *Por ejemplo si se tratase de un ALV dinámico que muestra las características de un vehículo sería bueno *que antes se haya definido primero una tabla interna que contega los nombres de cada característica por *ejemplo: COLOR, MODELO, AÑO DE FABRICACIÓN *etc. de tal manera que aquí lo que se haría es *hacer un read table a dicha tabla interna y según la fila que se este analizando leeríamos el texto. ASSIGN COMPONENT 'DESCRIPCION' OF STRUCTURE <gs_dyntable> TO <gv_fldval>. CONCATENATE 'FILA-' lv_index_row INTO lv_fldval. CONDENSE lv_fldval NO-GAPS. "NO-GAPS es para eliminar los espacios en blanco entre carácter <gv_fldval> = lv_fldval. DO pa_cols TIMES. "Por cada fila recorremos tantas columnas se haya ingresado por pantalla lv_index_col = sy-index. MOVE lv_index_col TO gv_colno. CONCATENATE 'COL' gv_colno INTO gv_flname. "<gv_fldval> apuntará a la columna COL01, COL02, COL03 y así sucesivamente según la columna que "se este analizando y ahí se almacenará el nuevo valor correspondiente. ASSIGN COMPONENT gv_flname OF STRUCTURE <gs_dyntable> TO <gv_fldval>. CONCATENATE 'VALOR' lv_index_row '-' lv_index_col INTO lv_fldval. CONDENSE lv_fldval NO-GAPS."NO-GAPS es para eliminar los espacios en blanco entre carácter <gv_fldval> = lv_fldval. ENDDO. "Cierra el Do del recorrido de Columnas por la fila en análisis APPEND <gs_dyntable> TO <gt_dyntable>."Añadimos la línea d valores a nuestra tabla interna dinámica ENDDO."Cierra el Do del recorrido de Filas ENDFORM. " FILL_ITABLE *&---------------------------------------------------------------------* *& Form DISPLAY_ALV *&---------------------------------------------------------------------* *"Visualiza el ALV *----------------------------------------------------------------------* FORM display_alv. PERFORM fill_catalog_alv. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING it_fieldcat = gt_fieldcat TABLES t_outtab = <gt_dyntable>. ENDFORM. " DISPLAY_ALV *&---------------------------------------------------------------------* *& Form FILL_CATALOG_ALV *&---------------------------------------------------------------------* *LLena el catálogo de campos del ALV a visualizar en Pantalla *----------------------------------------------------------------------* FORM fill_catalog_alv . DATA: ls_fieldcat TYPE slis_fieldcat_alv. ls_fieldcat-fieldname = 'DESCRIPCION'. ls_fieldcat-seltext_l = 'Nro de Fila'. ls_fieldcat-outputlen = '15'. APPEND ls_fieldcat TO gt_fieldcat. DO pa_cols TIMES. CLEAR ls_fieldcat. MOVE sy-index TO gv_colno. CONCATENATE 'COL' gv_colno INTO gv_flname. ls_fieldcat-fieldname = gv_flname. ls_fieldcat-seltext_s = gv_flname. ls_fieldcat-outputlen = '10'. APPEND ls_fieldcat TO gt_fieldcat. ENDDO. ENDFORM. " FILL_CATALOG_ALV
Links:
http://aalcantaraq.blogspot.com/2014/02/alv-dinamico-explicado-paso-paso.html
http://abaputiles.blogspot.com/2009/05/crear-un-alv-con-columnas-dinamicas.html
Categorías: ABAP/4
ALV, ALV dinámico
Comentarios (0)
Trackbacks (0)
Deja un comentario
Trackback