/* POPUP INI */
/* POPUP FIM */

Conteúdo

ALV com Layout informado na tela de parâmetros

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.

Que tal uma tela de parâmetros diferentona?

Não tive muitas idéias de ícones ou utilidade disso na tela de parâmetros, mas aposto que você terá!


REPORT ZSAPeiros.

DATA l_field TYPE string.
FIELD-SYMBOLS <fs_tab> TYPE ANY.

SELECTION-SCREEN BEGIN OF TABBED BLOCK t1 FOR 10 LINES.
SELECTION-SCREEN TAB (50) tab1 USER-COMMAND tab1 DEFAULT SCREEN 101.
SELECTION-SCREEN TAB (50) tab2 USER-COMMAND tab2 DEFAULT SCREEN 102.
SELECTION-SCREEN TAB (50) tab3 USER-COMMAND tab3 DEFAULT SCREEN 103.
SELECTION-SCREEN END OF BLOCK t1.

SELECTION-SCREEN BEGIN OF SCREEN 101 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK 1 WITH FRAME TITLE text-t01.
PARAMETERS p_bukrs TYPE bukrs.
SELECTION-SCREEN END OF BLOCK 1.
SELECTION-SCREEN END OF SCREEN 101.

SELECTION-SCREEN BEGIN OF SCREEN 102 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK 2 WITH FRAME TITLE text-t02.
PARAMETERS p_werks TYPE werks_d.
SELECTION-SCREEN END OF BLOCK 2.
SELECTION-SCREEN END OF SCREEN 102.

SELECTION-SCREEN BEGIN OF SCREEN 103 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK 3 WITH FRAME TITLE text-t03.
PARAMETERS p_kunnr TYPE kunnr.
SELECTION-SCREEN END OF BLOCK 3.
SELECTION-SCREEN END OF SCREEN 103.

INITIALIZATION.
  l_field = '(ZSAPEIROS)TAB1'.
  ASSIGN (l_field) TO <fs_tab>.
  CONCATENATE '@0Y@' 'Novo' INTO <fs_tab> RESPECTING BLANKS.

  l_field = '(ZSAPEIROS)TAB2'.
  ASSIGN (l_field) TO <fs_tab>.
  CONCATENATE '@0Z@' 'Alterar' INTO <fs_tab> RESPECTING BLANKS.

  l_field = '(ZSAPEIROS)TAB3'.
  ASSIGN (l_field) TO <fs_tab>.
  CONCATENATE '@0W@' 'Excluir' INTO <fs_tab> RESPECTING BLANKS.

Parâmetros um ao lado do outro

Radiobutton é um saco né? Aquele cara que fica um debaixo do outro, ocupando muita tela.
SQN!
Basta você utilizar begin of line na declaração de seus parâmetros e pronto! Este comando faz com que o bloco de campos entre o begin of line e o end of line, fiquem na mesma linha, bastando a você apenas informar os textos e informações de posicionamento.


REPORT ZSAPeiros.

SELECTION-SCREEN BEGIN OF BLOCK b01 WITH FRAME TITLE text-000.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_check1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(10)  p_campo1.
PARAMETERS: p_check2 AS CHECKBOX.
SELECTION-SCREEN COMMENT 16(8) p_campo2.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_check3 RADIOBUTTON GROUP r01 DEFAULT 'X'.
SELECTION-SCREEN COMMENT 3(10)  p_campo3.
PARAMETERS: p_check4 RADIOBUTTON GROUP r01.
SELECTION-SCREEN COMMENT 16(10) p_campo4.
PARAMETERS: p_check5 RADIOBUTTON GROUP r01.
SELECTION-SCREEN COMMENT 29(10) p_campo5.
PARAMETERS: p_check6 RADIOBUTTON GROUP r01.
SELECTION-SCREEN COMMENT 42(8) p_campo6.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN SKIP.

SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(8) p_campo7.
PARAMETERS: p_check7 TYPE char10.
SELECTION-SCREEN COMMENT 25(8) p_campo8.
PARAMETERS: p_check8 TYPE char10.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b01.

AT SELECTION-SCREEN OUTPUT.
  p_campo1 = 'Campo 01'.
  p_campo2 = 'Campo 02'.
  p_campo3 = 'Campo 03'.
  p_campo4 = 'Campo 04'.
  p_campo5 = 'Campo 05'.
  p_campo6 = 'Campo 06'.
  p_campo7 = 'Campo 07'.
  p_campo8 = 'Campo 08'.

INITIALIZATION.
  sy-title = 'SAPeiros: Campos na mesma linha'.

Ocultar parâmetros de tela

Ocultar campos da tela é muito comum. Neste caso, quando clica em um radiobutton, mostra um campo texto, se clicar no outro radiobutton, aparece o outro campo texto.
REPORT ZSAPeiros.

PARAMETERS:
  p_r1    RADIOBUTTON GROUP r1 DEFAULT 'X' USER-COMMAND x1,
  p_r2    RADIOBUTTON GROUP r1,
  p_1(10) TYPE c,
  p_2(10) TYPE c.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    IF p_r1 EQ 'X'.
      IF screen-name EQ 'P_1' OR
         screen-name EQ '%_P_1_%_APP_%-TEXT'.
        screen-invisible = 0.
        screen-active    = 1.
        MODIFY SCREEN.
      ENDIF.
      IF screen-name EQ 'P_2' OR
         screen-name EQ '%_P_2_%_APP_%-TEXT'.
        screen-invisible = 1.
        screen-active    = 0.
        MODIFY SCREEN.
      ENDIF.
    ELSE.
      IF screen-name EQ 'P_1' OR
         screen-name EQ '%_P_1_%_APP_%-TEXT'.
        screen-invisible = 1.
        screen-active    = 0.
        MODIFY SCREEN.
      ENDIF.
      IF screen-name EQ 'P_2' OR
         screen-name EQ '%_P_2_%_APP_%-TEXT'.
        screen-invisible = 0.
        screen-active    = 1.
        MODIFY SCREEN.
      ENDIF.
    ENDIF.
  ENDLOOP.

INITIALIZATION.
  %_p_r1_%_app_%-text = 'Radio 1'.
  %_p_r2_%_app_%-text = 'Radio 2'.
  %_p_1_%_app_%-text  = 'Texto 1'.
  %_p_2_%_app_%-text  = 'Texto 2'.

Como deixar 2 ou mais campos/parâmetros na mesma linha

Neste caso, para uma melhor visualização, foi solicitado manter os grupos de radiobutons um ao lado do outro.
REPORT ZSAPeiros.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-t01.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS p_r1_1   RADIOBUTTON GROUP r1 DEFAULT 'X'.
SELECTION-SCREEN COMMENT 4(30) text-001.

PARAMETERS p_r2_1   RADIOBUTTON GROUP r2 DEFAULT 'X'.
SELECTION-SCREEN COMMENT 38(30) text-002.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS p_r1_2   RADIOBUTTON GROUP r1.
SELECTION-SCREEN COMMENT 4(30) text-003.

PARAMETERS p_r2_2   RADIOBUTTON GROUP r2.
SELECTION-SCREEN COMMENT 38(30) text-004.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS p_r1_3   RADIOBUTTON GROUP r1.
SELECTION-SCREEN COMMENT 4(30) text-005.

PARAMETERS p_r2_3   RADIOBUTTON GROUP r2.
SELECTION-SCREEN COMMENT 38(30) text-006.
SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b2.

Eliminar abas de-ate do Select-Options

Quando você precisa que um parâmetro tenha mais opções, mas que não pode ter a condição DE-ATÉ, ou seja, pode adicionar N opções, mas apenas na parte DE, não basta colocar NO INTERVALS no seu select-options, mas também é necessário restringir as abas DE-ATE quando clicar para adicionar novas opções.
REPORT ZSAPeiros.

* Declarar a tabela do seu Select-Options
* Obs.: Existem outras maneiras, mas esta é a mais prática
TABLES j_1bnfstx.

* Declarar os tipos necessários para eliminar as abas do select-options
TYPE-POOLS: sscr, sedi.

* Declare seu select-options
SELECT-OPTIONS: s_type FOR j_1bnfstx-taxtyp.

* O código deve ficar logo que se inicializa o programa
INITIALIZATION.

* Declarações necessárias para a função SELECT_OPTIONS_RESTRICT
* a qual é responsável pela restrinção do select-options
  DATA:
      ls_opt_list   TYPE sscr_opt_list,   "Option List
      ls_restrict   TYPE sscr_restrict,   "Option Restrict
      ls_ass        TYPE sscr_ass.        "Screen Object

* Limpe a estrutura sempre que for populá-la
  CLEAR ls_opt_list.

* Preencha o Option List
  ls_opt_list-name       = 'OBJECTKEY1'.
  ls_opt_list-options-bt = space.
  ls_opt_list-options-cp = space.
  ls_opt_list-options-eq = 'X'.
  ls_opt_list-options-ge = space.
  ls_opt_list-options-gt = space.
  ls_opt_list-options-le = space.
  ls_opt_list-options-lt = space.
  ls_opt_list-options-nb = space.
  ls_opt_list-options-ne = space.
  ls_opt_list-options-np = space.

* Adicione os dados da estrutura no Option Restrict-opt_list_tab
  APPEND ls_opt_list TO ls_restrict-opt_list_tab.

* Limpe a estrutura sempre que for populá-la
  CLEAR ls_ass.

* Preencha o Screen Object
  ls_ass-kind    = 'S'.
  ls_ass-name    = 'S_TYPE'.
  ls_ass-sg_main = 'I'.
  ls_ass-sg_addy = space.
  ls_ass-op_main = 'OBJECTKEY1'.

* Adicione os dados da estrutura no Option Restrict-ass_tab
  APPEND ls_ass TO ls_restrict-ass_tab.

* Chame a função que faz tal procedimento
  CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
    EXPORTING
      program                = sy-repid
      restriction            = ls_restrict
    EXCEPTIONS
      too_late               = 1
      repeated               = 2
      selopt_without_options = 3
      selopt_without_signs   = 4
      invalid_sign           = 5
      empty_option_list      = 6
      invalid_kind           = 7
      repeated_kind_a        = 8
      OTHERS                 = 9.

  IF sy-subrc IS NOT INITIAL.
    MESSAGE 'Erro ao restringir abas do parâmetro de seleção!' TYPE 'E'.
  ENDIF.

Alimentar Select-Options manualmente

Caso você não tenha um elemento de dados com informações, ou simplesmente não queira utilizar um, basta inserir desta maneira, para que o usuário fique apenas com as informações que você adicionar ao campo. Neste exemplo, o campo terá apenas os estados do Brasil.
REPORT ZSAPeiros.

* Definição grupo de tipos
TYPE-POOLS: vrm.

* Definição de tipos
TYPES:
  BEGIN OF ty_t005u,
    bland     TYPE          t005u-bland,    "Código estado
    bezei     TYPE          t005u-bezei,    "Descr. estado
    END OF ty_t005u.

* Declaração de tabelas internas/estruturas
DATA:
  t_t005u     TYPE TABLE OF ty_t005u,       "Chaves província
  w_t005u     TYPE          ty_t005u,       "Chaves província
  t_lista     TYPE          vrm_values,     "Valores listbox
  w_lista     TYPE          vrm_value.      "Valores listbox

* Parâmetros de seleção
PARAMETERS p_bland TYPE t005u-bland AS LISTBOX VISIBLE LENGTH 20.

* Ações de tela antes da execução do programa
AT SELECTION-SCREEN OUTPUT.
  SELECT bland bezei
    FROM t005u
    INTO TABLE t_t005u
   WHERE spras EQ 'PT'
     AND land1 EQ 'BR'.

* Monta linhas do listbox com dados dos estados
  LOOP AT t_t005u INTO w_t005u.
    w_lista-key  = w_t005u-bland.
    w_lista-text = w_t005u-bezei.
    APPEND w_lista TO t_lista.
  ENDLOOP.

* Ordena
  SORT t_lista BY key.

* Função para setar os valores selecionados no parâmetro de tela
  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id              = 'P_BLAND'
      values          = t_lista
    EXCEPTIONS
      id_illegal_name = 1
      OTHERS          = 2.

* Inicializar parâmetros
INITIALIZATION.
  sy-title               = 'SAPeiros: Alimentar Select-Options manualmente'.
  %_p_bland_%_app_%-text = 'Estado'.

* Ações após execução
END-OF-SELECTION.
  sy-title               = 'SAPeiros: Alimentar Select-Options manualmente'.
  WRITE: / p_bland.
/* POPUP INI */ /* POPUP FIM */