Está en la página 1de 6

Colocar matchcode estndar y no estndar en ALV.

Supongamos que tengo un ALV donde tengo un matchcode estndar para el campo
LIFNR y un matchcode para el campo CHARG que no es estndar.
Esta es mi estructura de datos del ALV:
TYPES:
BEGIN OF t_datos,
lifnr TYPE mseg-lifnr, " Proveedor
* LGC - Inicio Modificacin - 24/09/2010 - Mejoras GMM07
name1 TYPE lfa1-name1, " Nombre Proveedor
* LGC - Fin Modificacin - 24/09/2010 - Mejoras GMM07
matnr TYPE mseg-matnr, " Material
* LGC - Inicio Modificacin - 24/09/2010 - Mejoras GMM07
maktx TYPE makt-maktx, " Descripcin Material
bismt TYPE mara-bismt, " Nombre antiguo material
* LGC - Fin Modificacin - 24/09/2010 - Mejoras GMM07
erfmg TYPE char17,
" Cantidad
charg TYPE mseg-charg, " Lote
kostl TYPE mseg-kostl, " Centro de Coste
* LGC - Inicio Modificacin - 21/10/2010 - GMM10
aufnr TYPE mseg-aufnr, " Orden
* LGC - Fin Modificacin - 21/10/2010 - GMM10
bktxt TYPE mkpf-bktxt, " Texto
slabs TYPE mkol-slabs, " Stock especial K de libre utilizacin
END OF t_datos,

Primero debo setear mi mtodo con lo que se debe cargar en la ayuda de bsqueda
no estndar:
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
on_f4
FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname
es_row_no
er_event_data
et_bad_cells
e_display,
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed.

ENDCLASS.

"lcl_event_handler DEFINITION

CLASS lcl_event_handler IMPLEMENTATION.


METHOD on_f4.
PERFORM on_f4 USING e_fieldname
es_row_no-row_id
er_event_data
et_bad_cells
e_display.
*
er_data_changed.
ENDMETHOD.

"ON_F4

METHOD handle_data_changed.
PERFORM f_handle_data_changed USING er_data_changed.
ENDMETHOD.
"handle_data_changed
ENDCLASS.

"lcl_event_handler IMPLEMENTATION

*&---------------------------------------------------------------------*
*&
Form ON_F4
*&---------------------------------------------------------------------*
*
Realiza las acciones de F4 para CHARG
*----------------------------------------------------------------------*
*
-->P_E_FIELDNAME text
*
-->P_ES_ROW_NO_ROW_ID text
*
-->P_ER_EVENT_DATA text
*
-->P_ET_BAD_CELLS text
*
-->P_E_DISPLAY text
*
-->P_ER_DATA_CHANGED text
*----------------------------------------------------------------------*
FORM on_f4 USING
p_e_fieldname
pe_row_id
p_er_event_data TYPE REF TO cl_alv_event_data
p_et_bad_cells
p_e_display.
*
p_er_data_changed
*
TYPE REF TO cl_alv_changed_data_protocol.

DATA: li_charg TYPE TABLE OF t_charg,


li_ret TYPE TABLE OF ddshretval,
le_ret TYPE ddshretval,
le_data TYPE t_charg,
le_modi TYPE lvc_s_modi.
CASE p_e_fieldname.
"read changed cell
WHEN 'CHARG'.
* Actualizo las lineas del AL

CALL METHOD d_grid->refresh_table_display.


* Leo la linea en la que se solicit la ayuda de bsqueda para buscar
* los valores posibles
READ TABLE i_datos INTO le_datos INDEX pe_row_id.
IF sy-subrc IS INITIAL.
* Obtengo los lotes para ese material y centro
REFRESH li_charg.
* Si tiene cargado valores selecciono con esos valores, sino todo
IF le_datos-matnr IS NOT INITIAL.
SELECT charg
FROM mcha
INTO TABLE li_charg
WHERE matnr = le_datos-matnr AND
werks = p_werks.
ELSE.
SELECT charg
FROM mcha
INTO TABLE li_charg
WHERE werks = p_werks.
ENDIF.
IF sy-subrc IS INITIAL.
SORT li_charg BY charg.
*Call the function module to display the custom F4 values
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield
= 'CHARG'
*
window_title
= 'List of State entries'(002)
value_org
= 'S'
TABLES
value_tab
= li_charg
return_tab
= li_ret[]
EXCEPTIONS
parameter_error
= 1
no_values_found
= 2
OTHERS
= 3.
* (Note: gt_ret[] contains the row id selected by the user from the list
* of F4 values)
IF sy-subrc = 0.
READ TABLE li_ret INTO le_ret INDEX 1.
IF sy-subrc IS INITIAL.
le_datos-charg = le_ret-fieldval.
MODIFY i_datos INDEX pe_row_id FROM le_datos.
CALL METHOD d_grid->refresh_table_display.
ENDIF.
* Indico que se ha manejado el evento para que luego no lo tome la ayuda de
busqueda standard. Como esta dentro del case CHARG para el otro campo no

entra por aca entonces no usa esta ayuda de busqueda


p_er_event_data->m_event_handled = 'X'.
ENDIF.
ENDIF.
ENDIF.
ENDCASE.
ENDFORM.

" ON_F4

El fieldcat debo cargarlo de la siguiente manera:


Para el campo LIFNR que es de matchcode estndar:
*** Proveedor
CLEAR le_fieldcat.
le_fieldcat-col_pos = '1'.
le_fieldcat-fieldname = 'LIFNR'.
le_fieldcat-tabname
= 'I_DATOS'.
le_fieldcat-outputlen = 10.
le_fieldcat-no_zero = c_check.
le_fieldcat-ref_field = 'LIFNR'.
le_fieldcat-ref_table = 'LFA1'.
le_fieldcat-seltext = text-a01.
le_fieldcat-scrtext_l = text-a01.
le_fieldcat-f4availabl = 'X'.
le_fieldcat-edit = c_check.
APPEND le_fieldcat TO i_fieldcat.

Y para el campo CHARG que NO es standard: (no debo colocarle la tabla y campo
referencia ya que va a tomar los datos segn mi matchcode estndar)
*** Lote
CLEAR le_fieldcat.
le_fieldcat-col_pos = '7'.
le_fieldcat-fieldname = 'CHARG'.
le_fieldcat-tabname
= 'I_DATOS'.
le_fieldcat-outputlen = 10.
le_fieldcat-no_zero = c_check.
le_fieldcat-f4availabl = 'X'.
le_fieldcat-seltext = text-a04.
le_fieldcat-scrtext_l = text-a04.
le_fieldcat-edit = c_check.
APPEND le_fieldcat TO i_fieldcat.

Luego antes de la llamada del ALV debo completer esta table de la siguiente
manera:
La tabla i_f4 es de tipo:
i_f4 TYPE lvc_t_f4.
*** Carga tabla de matchcodes para campos
PERFORM f_cargar_f4.
*&---------------------------------------------------------------------*
*&
Form F_CARGAR_F4
*&---------------------------------------------------------------------*
*
Carga la tabla con los campos que van a tener F4
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM f_cargar_f4 .
DATA: le_f4 TYPE lvc_s_f4.
*** Hay que cargarlos en orden alfabetico por nombre
* LGC - Inicio Modificacin - 21/10/2010 - GMM10
* Se agrega la ayuda de bsqueda para la orden
CLEAR le_f4.
le_f4-fieldname = 'AUFNR'.
le_f4-register = 'X'.
APPEND le_f4 TO i_f4.
* LGC - Fin Modificacin - 21/10/2010 - GMM10
CLEAR le_f4.
le_f4-fieldname = 'CHARG'.
le_f4-register = 'X'.
APPEND le_f4 TO i_f4.
CLEAR le_f4.
le_f4-fieldname = 'KOSTL'.
le_f4-register = 'X'.
APPEND le_f4 TO i_f4.
CLEAR le_f4.
le_f4-fieldname = 'LIFNR'.
le_f4-register = 'X'.
APPEND le_f4 TO i_f4.
CLEAR le_f4.
le_f4-fieldname = 'MATNR'.
le_f4-register = 'X'.
APPEND le_f4 TO i_f4.

ENDFORM.

" F_CARGAR_F4

Tambien antes de la llamada al ALV debo registrar esos botones como F4 llamando
a este metodo:
*** Llamo al mtodo para el F4
CALL METHOD d_grid->register_f4_for_fields
EXPORTING
it_f4 = i_f4.

Luego si llamo al ALV normalmente:


CALL METHOD d_grid->set_table_for_first_display
EXPORTING
it_toolbar_excluding = i_exclude
is_layout
= le_layout_grid
* LGC - Inicio Modificacin - 21/10/2010 - GMM10
is_variant
= le_disposicion
*
i_save
= 'A'
i_save
= 'X'
* LGC - Fin Modificacin - 21/10/2010 - GMM10
i_default
= 'X'
CHANGING
it_outtab
= i_datos
it_fieldcatalog
= i_fieldcat.

Adjunto va un ejemplo de un programa que hace esto para un ALV que tiene lineas
que se pueden agregar y que tiene campos con matchcode standard y no standard.

Programa con F4
estandard y NO estandard en ALV OO

También podría gustarte