Inicio > ABAP/4 > Crear ALV con columnas dinámicas

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

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 Etiquetas: ,
  1. Aún no hay comentarios.
  1. No trackbacks yet.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: