Definir Layout (Disposición) desde los parametros del reporte en ABAP

Los layouts (o disposición) en los reportes ALV de SAP son muy útiles ya que permite modificar las columnas a visualizar, filtrar, totalizar, etc. Por lo general el layout se selecciona luego de generado el reporte, pero existe una forma de seleccionar el layout desde los parámetros (antes de que el reporte se haya desplegado), la utilidad de esto es que de esta forma el layout puede guardarse dentro de la variable. (Al final de articulo hay un ejemplo completo para que solo lo copies, pegues y adaptes a tus necesidades)

Mostrar selección de layout en los parametros del reporte.

Para hacer esto solo debemos ingresar un poco de código a nuestro reporte ALV, primero declaramos un par de variables adicionales.

"Variables
DATA: i_varian LIKE disvariant OCCURS 0 WITH HEADER LINE.

Ahora en tus parametros debes agregar uno para el layout

SELECTION-SCREEN BEGIN OF BLOCK visualizacion WITH FRAME TITLE text-001.
  PARAMETER: p_layout LIKE disvariant-variant.
SELECTION-SCREEN END OF BLOCK visualizacion.

Agregamos un evento para activar el match code del layout

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_layout.

  i_varian-report = sy-repid.
  i_varian-username = sy-uname.
  APPEND i_varian.

  "** Nota: gt_fieldcat Es la variable con el parametro it_fieldcat en la funcion REUSE_ALV_GRID_DISPLAY **
  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
    EXPORTING
      is_variant          = i_varian
      it_default_fieldcat = gt_fieldcat 
      i_save              = 'A'
    IMPORTING
      es_variant          = i_varian
    EXCEPTIONS
      not_found           = 1
      program_error       = 2
      OTHERS              = 3.
  IF sy-subrc = 0.
    p_layout = i_varian-variant.
  ENDIF.

Y para asegurarnos que el layout funciona sin importar si se digita o selecciona del match code agregamos este código, justo en el evento mostrado:

START-OF-SELECTION.

  IF p_layout IS NOT INITIAL.
    IF i_varian-report IS INITIAL.
      i_varian-report = sy-repid.
      i_varian-username = sy-uname.
      i_varian-variant = p_layout.
      APPEND i_varian.
    ENDIF.
  ENDIF.

.... "Resto de tu codigo

Finalmente cuando muestres tu reporte ALV, debes incluir el layout. Ten cuidado únicamente en las lineas:
is_variant = i_varian y i_save = ‘A’

 CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = g_repid
      is_layout                = gs_layout
      it_fieldcat              = gt_fieldcat[]
      i_save                   = 'A'
      is_variant               = i_varian "--> Solo ten cuidado de agregar este parametro
    TABLES
      t_outtab                 = it_reporte
    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.

Ejemplo completo

Entiendo que es un ejemplo bastante largo, así que si tuviste algún problema en alguno de los pasos, aquí hay un ejemplo completo en este listado de como agregar el layout o disposición como parámetro en tu reporte. Para usarlo solo crea un nuevo programa y pega todo este código en él.

REPORT  ZLayOut NO STANDARD PAGE HEADING.

TYPE-POOLS:  slis.

tables bkpf.

"Variables
DATA: i_varian LIKE disvariant OCCURS 0 WITH HEADER LINE.

"Variables para el uso en ALV Reports
DATA: g_repid LIKE sy-repid,
gs_print            TYPE slis_print_alv,
gt_list_top_of_page TYPE slis_t_listheader,
gt_events           TYPE slis_t_event,
gt_sort             TYPE slis_t_sortinfo_alv,
gs_layout           TYPE slis_layout_alv,
gt_fieldcat         TYPE slis_t_fieldcat_alv,
fieldcat_ln         LIKE LINE OF gt_fieldcat.

DATA: BEGIN OF it_reporte OCCURS 0,
  bukrs TYPE bukrs,
  belnr	TYPE belnr_d,
  gjahr	TYPE gjahr,
END OF it_reporte.

SELECTION-SCREEN BEGIN OF BLOCK parametros WITH FRAME TITLE text-001.
select-options: pbukrs for bkpf-bukrs,
           pbelnr	for bkpf-belnr,
           pgjahr	for bkpf-gjahr.
SELECTION-SCREEN END OF BLOCK parametros.

"Mostrar selección de layout en parametros
SELECTION-SCREEN BEGIN OF BLOCK visualizacion WITH FRAME TITLE text-002.
PARAMETER: p_layout LIKE disvariant-variant MEMORY ID zrai_lay.
SELECTION-SCREEN END OF BLOCK visualizacion.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_layout.

  i_varian-report = sy-repid.
  i_varian-username = sy-uname.
  APPEND i_varian.

  CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
    EXPORTING
      is_variant          = i_varian
      it_default_fieldcat = gt_fieldcat
      i_save              = 'A'
    IMPORTING
      es_variant          = i_varian
    EXCEPTIONS
      not_found           = 1
      program_error       = 2
      OTHERS              = 3.
  IF sy-subrc = 0.
    p_layout = i_varian-variant.
  ENDIF.

START-OF-SELECTION.

  IF p_layout IS NOT INITIAL.
    IF i_varian-report IS INITIAL.
      i_varian-report = sy-repid.
      i_varian-username = sy-uname.
      i_varian-variant = p_layout.
      APPEND i_varian.
    ENDIF.
  ENDIF.

  "Select que llena la tabla de nuestro reporte
  SELECT bukrs belnr gjahr
  INTO TABLE it_reporte
  FROM bkpf
  WHERE  bukrs in pbukrs
  AND    belnr in pbelnr
  AND    gjahr in pgjahr.

  "Definir el catalogo de campos, quiza esta no es la mejor forma
  "pero para este ejemplo no importa.
  fieldcat_ln-fieldname = 'BUKRS'.
  fieldcat_ln-seltext_l = 'Sociedad'.
  APPEND fieldcat_ln TO gt_fieldcat.
  CLEAR fieldcat_ln.

  fieldcat_ln-fieldname = 'BELNR'.
  fieldcat_ln-seltext_l = 'Documento'.
  APPEND fieldcat_ln TO gt_fieldcat.
  CLEAR fieldcat_ln.

  fieldcat_ln-fieldname = 'GJAHR'.
  fieldcat_ln-seltext_l = 'Ejercicio'.
  APPEND fieldcat_ln TO gt_fieldcat.
  CLEAR fieldcat_ln.

  "Desplegar la tabla it_reporte en ALV de SAP
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = sy-repid
      it_fieldcat              = gt_fieldcat[]
      i_save                   = 'A'
      is_variant               = i_varian "-- Solo ten cuidado de agregar este parametro
     TABLES
      t_outtab                 = it_reporte
    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.
Definir Layout (Disposición) desde los parametros del reporte en ABAP

3 comentarios en «Definir Layout (Disposición) desde los parametros del reporte en ABAP»

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll hacia arriba