Basicamente você escolhe o layout do relatório já na tela de parâmetros.
Para isto é necessário que antes você tenha gravado um layout, claro!
REPORT ZSAPeiros.
* Global Declarations
DATA:
gs_key TYPE salv_s_layout_key,
gs_layouts TYPE salv_s_layout_info,
gs_layout TYPE lvc_s_layo,
gt_saida TYPE TABLE OF mara,
gt_fieldcat TYPE lvc_t_fcat,
gs_variant TYPE disvariant.
* Parameters
PARAMETERS p_layout TYPE slis_vari.
* Action for Layout parameter field
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_layout.
gs_key-report = sy-repid.
gs_layouts = cl_salv_layout_service=>f4_layouts( s_key = gs_key
restrict = '1' ).
p_layout = gs_layouts-layout.
START-OF-SELECTION.
* Populate Data Report
SELECT * UP TO 10 ROWS FROM mara INTO TABLE gt_saida.
IF sy-subrc IS INITIAL.
SORT gt_saida BY matnr.
ENDIF.
* Layout
gs_layout-col_opt = abap_true.
gs_layout-zebra = abap_true.
* Layout Variant
gs_variant-report = sy-repid.
gs_variant-variant = p_layout.
* Get fields from structure/table
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'MARA'
i_client_never_display = abap_true
CHANGING
ct_fieldcat = gt_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
* Display ALV Report Data
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout
it_fieldcat_lvc = gt_fieldcat
i_save = abap_true
is_variant = gs_variant
TABLES
t_outtab = gt_saida[]
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc IS NOT INITIAL.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.