quinta-feira, 12 de junho de 2014

ALV - campo com matchcode F4 - Implementação manual

 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.
  DATAlt_f4 TYPE lvc_t_f4.
  DATAlw_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