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!