PDA

Ver la Versión Completa : Ayuda data_changed alv.


miguel.esteban.martin
11/03/09, 14:27:21
No tengo muy claro como se utiliza este metodo, podiais esplicarme como se usa.
Mi programa tiene un alv que muestra los datos de mi tabla interna, tengo un campo editable y cuando cambie ese campo quiero que se modifique en mi tabla interna, me podias decir como se hace???
muchas gracias

crounly
11/03/09, 14:51:18
Asi es, se puede utilizar para trasportar los datos de tu ALV OO a la tabla interna, pero tienes que registrar el evento que producira tal efecto...

Vamos por partes, como dijo Jack el Destripador

Este seria un ejemplo de un ALV con una columna editable, cuando me introduzcan un dato lo replico en todos los registros de la tabla interna con igual clave ( ZBOX, para el ejemplo )

1º La clase para manejar los eventos, tal que asi:

CLASS lcl_event_handler DEFINITION.

PUBLIC SECTION.

METHODS:

HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED
OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED
E_ONF4
E_ONF4_BEFORE
E_ONF4_AFTER.


ENDCLASS. "lcl_event_handler DEFINITION






*---------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.

METHOD HANDLE_DATA_CHANGED.
* itab_ty_agrup es tipo de la tabla interna del alv

FIELD-SYMBOLS: <zfield> TYPE itab_ty_agrup,
<FD> TYPE LINE OF itab_ty_agrup.


ASSIGN er_data_changed->mp_mod_rows->* TO <zfield>.

* Esta es la linea que ha cambiado
READ TABLE <zfield> INDEX 1 ASSIGNING <FD>.

* itab_alv_dynpro , tabla interna del ALV
LOOP AT itab_alv_dynpro ASSIGNING <FS>
WHERE ZBOX EQ <FD>-ZBOX.

<FS>-ZDATA = <FD>-zdata. "Este es el campo editable

ENDLOOP.

call method gr_alvgrid->refresh_table_display.

ENDMETHOD. "handler_method



ENDCLASS. "lcl_event_handler IMPLEMENTATION


2.- DATA: r_handler TYPE REF TO lcl_event_handler.

3.- Cuando lanzo por primera vez el ALV

*----REGISTRAMOS EL EVENTO ENTER
* gr_alvgrid es el nombre de mi implementacion del ALV OO

CREATE OBJECT r_handler.
SET HANDLER r_HANDLER->HANDLE_DATA_CHANGED FOR gr_alvgrid.

*---- Registrado el evento ENTER
CALL METHOD gr_alvgrid->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.

*---- Registrado el evento cambio de celda o cursor arriba , abajo
CALL METHOD gr_alvgrid->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = cl_gui_alv_grid=>mc_evt_modified.

*---- ALV GRID por pantalla
CALL METHOD gr_alvgrid->set_table_for_first_display
EXPORTING
is_layout = gs_layout_oo
CHANGING
it_outtab = itab_alv_dynpro[]
it_fieldcatalog = gt_fieldcat_oo
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4 .

Con esto ya lo tendrias controlado, permuta y combina a tu gusto pero no lo mezclez con ron que da resaca

Suerte

miguel.esteban.martin
11/03/09, 15:08:58
muchisismas gracias, solo una pregunta mas, no hay forma de hacerlo sin fieldsymbols????

crounly
11/03/09, 15:17:31
Para leer el registro modificado

ASSIGN er_data_changed->mp_mod_rows->* TO <zfield>.


me parece que no, para el resto ya es una mania propia :)