segunda-feira, 4 de maio de 2015

Customizando botões no ALV - REUSE_ALV_GRID_DISPLAY

Para remover ou adicionar botões específicos no ALV, uma opção é copiar o PF-STATUS de um Grupo de Função Standard para seu programa e incluir ou remover os botões desejados.

Para pegar um PF-STATUS como exemplo, da para copiar o PF-STATUS "STANDARD" do Grupo de Funções SALV.

Depois de copiado e feito as alterações, é necessário alterar a chamada do seu ALV para que o programa chame o seu PF-STATUS customizado.

Abaixo o exemplo de código:

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_program       = l_repid
      is_layout                = lw_layout
      it_fieldcat              = tg_fieldcat
      i_callback_pf_status_set = 'F_PF_STATUS_DET'
      i_callback_user_command  = 'ALV_USER_COMMAND'
      i_save                   = 'A'
      it_sort                  = lt_sort
      is_variant               = lw_variant
    TABLES
      t_outtab                 = tg_saida
    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.

No parâmetro i_callback_pf_status_set você passa o nome do FORM em que irá setar o PF-STATUS customizado, conforme exemplo abaixo:

FORM f_pf_status_det USING ft_extab TYPE slis_t_extab.

  SET PF-STATUS 'STANDARD_DET' EXCLUDING ft_extab.

ENDFORM.                    " F_PF_STATUS

Fazendo isso o ALV irá apresentar o PF-STATUS alterado por você.

Um outro ponto que deve ser considerado fazendo está alteração é o tratamento do user command que deve ser alterado também caso tenha adicionado um novo botão. Para isso existe o parâmetro i_callback_user_command, no qual você deve passar o FORM em que será tratado a ação que o programa deverá tomar apos o seu novo botão ser clicado.

FORM alv_user_command USING f_ucomm LIKE sy-ucomm           "#EC CALLED
                          fw_selfield TYPE slis_selfield.   "#EC NEEDED

  CASE f_ucomm.
    WHEN 'BOTAO1'.
      PERFORM form1.

    WHEN 'BOTAO2'.
      PERFORM form2.

    WHEN 'BOTAO3'.
      PERFORM form3.

  ENDCASE.

ENDFORM.                    " F_USER_COMMAND

sexta-feira, 1 de maio de 2015

Criando MatchCode com Valores Supostos(Tabela Interna)

O exemplo abaixo mostra como criar um MatchCode com valores vindos de uma tabela interna:


TYPES: BEGIN OF tp_matchcode,
         maquina  TYPE zdmaquina,
         kurztext TYPE qtxt_code,
       END OF tp_matchcode.

* Declaração de Variáveis Locais:
DATA tg_matchcode TYPE TABLE OF tp_matchcode WITH HEADER LINE.
DATA tg_matchcode_value TYPE STANDARD TABLE OF ddshretval WITH HEADER LINE.

CLEAR p_equipamento.

SELECT maquina kurztext
  FROM ztab_maq_equip
  INTO TABLE tg_matchcode.


CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
  EXPORTING
    retfield     = 'KURZTEXT'
    dynpprog     = sy-repid
    dynpnr       = sy-dynnr
    window_title = 'Equipamento'
    value_org    = 'S'
  TABLES
    value_tab    = tg_matchcode
    return_tab   = tg_matchcode_value.

IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
  WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
  READ TABLE tg_matchcode INDEX 1.
  IF sy-subrc EQ 0.
    p_equipamento = tg_matchcode_value-fieldval.
  ENDIF.
ENDIF.