Esse é para os casos de se desejar colocar uma lista de valores (matchcode) especifico em um campo de uma lista ALV.
Não esquecer de colocar o flag no campo que vai ter o F4 no fieldcat.
      WHEN 'ORIGTP'.
        <lfsw_fcat>-edit       = 'X'.
        <lfsw_fcat>-f4availabl = 'X'.
e tem q registrar o evento no objeto ALV.
  DATA: lt_f4 TYPE lvc_t_f4.
  DATA: lw_f4 TYPE lvc_s_f4.
  CLEAR lw_f4.
  lw_f4-fieldname  = 'ORIGTP'.
  lw_f4-register   = 'X'.
  APPEND lw_f4 TO lt_f4.
  CALL METHOD gcl_alv->register_f4_for_fields
    EXPORTING
      it_f4 = lt_f4.
No meu caso coloquei o código acima antes do método SET_TABLE_FOR_FIRST_DISPLAY.
Abaixo restante do código.
=========================================================
Criação do evento.
CLASS gcl_alv_event DEFINITION. 
    on_f4
       FOR EVENT onf4 OF cl_gui_alv_grid
        IMPORTING e_fieldname
                  e_fieldvalue
                  es_row_no
                  er_event_data
                  et_bad_cells
                  e_display.
ENDCLASS.     
=========================================================
*Implementação da classe.
CLASS gcl_alv_event IMPLEMENTATION. 
  METHOD on_f4.
    PERFORM on_f4 USING e_fieldname
                        e_fieldvalue
                        es_row_no
                        er_event_data
                        et_bad_cells
                        e_display.
  ENDMETHOD.                                                "on_f4
ENDCLASS.    
==================================================
"Implementaçao da rotina.. 
" As linhas em vermelho são obrigatórias pois elas modificam o valor em tela logo após a seleção do valor da lista.. e o m_event_handler evita um erro que dá no retorno a tela.
FORM on_f4  USING f_fieldname    TYPE lvc_fname
                  f_fieldvalue   TYPE lvc_value
                  fw_row_no      TYPE lvc_s_roid
                  fcl_event_data TYPE REF TO cl_alv_event_data
                  ft_bad_cells   TYPE lvc_t_modi
                  f_display      TYPE char01.
  DATA: lw_alv  TYPE ze_gnre_rel_lote,
        lw_modi TYPE lvc_s_modi.
  DATA: l_origtp TYPE zgnre_origtp.
  FIELD-SYMBOLS: <lfst_modi> TYPE lvc_t_modi.
  ASSIGN fcl_event_data->m_data->* TO <lfst_modi>.
  CHECK sy-subrc = 0.
  READ TABLE gt_alv INTO lw_alv INDEX fw_row_no-row_id.
  CHECK sy-subrc = 0.
  CASE f_fieldname.
    WHEN 'ORIGTP'.
      IF lw_alv-gnreid IS INITIAL.
        PERFORM f4_codreceita USING lw_alv-regio
                           CHANGING l_origtp.
        f_fieldvalue = l_origtp.
        CLEAR lw_modi.
        lw_modi-row_id    = fw_row_no-row_id.
        lw_modi-fieldname = f_fieldname.
        lw_modi-value = f_fieldvalue.
        APPEND lw_modi TO <lfst_modi>.
      ENDIF.
      fcl_event_data->m_event_handled = 'X'.
  ENDCASE.
ENDFORM.                                                    " ON_F4
*&---------------------------------------------------------------------*
*&      Form  F4_CODRECEITA
*&---------------------------------------------------------------------*
FORM f4_codreceita USING f_regio TYPE regio
                CHANGING f_origtp TYPE zgnre_origtp.
  DATA: lt_rettab TYPE TABLE OF ddshretval,
        lt_c023 TYPE TABLE OF zc023.
  DATA: lw_rettab TYPE ddshretval.
  SELECT *
    INTO TABLE lt_c023
    FROM zc023
   WHERE regio EQ f_regio.
  CHECK sy-subrc = 0.
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      ddic_structure  = 'ZC023'
      retfield        = 'ORIGTP'
      value_org       = 'S'
    TABLES
      value_tab       = lt_c023
      return_tab      = lt_rettab
    EXCEPTIONS
      parameter_error = 1
      no_values_found = 2
      OTHERS          = 3.
  CHECK sy-subrc = 0.
  READ TABLE lt_rettab INTO lw_rettab INDEX 1.
  CHECK sy-subrc = 0.
  f_origtp = lw_rettab-fieldval.
ENDFORM.                    " F4_CODRECEITA   
 
Nenhum comentário:
Postar um comentário