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)
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.
Excelente ayuda. gracias
Me alegra que te haya sido útil
Muy pero muy completo! Muchas gracias!