Вы находитесь на странице: 1из 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.

Program a con F4 estandard y NO estandard en ALV OO