PDA

Ver la Versión Completa : Capturar eventos en alv


sanckok
11/03/08, 09:46:20
Hola a todos,

Antes de nada, pedir perdon por postear con anterioridad este mensage en un tema que no tocaba, lo vuelvo a poner aqui.

Es la primera vez que posteo, ya que normalmente encuentro lo que necesito.
Ahora se me presenta un problema y no se como solucionarlo :(
En un ALV tengo una columna que es editable. Necesito saber cuando se modifica para poder hacer un calculo en ese mismo momento.
Entiendo que tengo que capturar el evento DATA_CHANGED o LIST_MODIFY, pero no me hace el efecto deseado.

A alguien se le ocurre como puedo hacer esto, si voy bien encaminado o mejor hacerlo de otra forma.

He mirado de hacerlo con objetos, pero tendria que modificar todo el programa y no quiero, ya que lo tienen en produccion.

Muchas gracias por leerme

ibecerra
11/03/08, 12:47:57
Que tal, lo podrias hacer con un enter, es decir te creas un status "Menu" lo invocas desde el alv.
pero debes hacer algo especial en el status.. en el boton que tiene un
√ poner la palabra enter o ok.
luego cuando estes en la celda editables y des enter se accionara el
USER_COMMAND
ejemplo..
si llamo a la funcion para displayar el alv
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = g_repid
i_callback_pf_status_set = 'SET_STATUS' ---LLAMADA DEL MENU
i_callback_user_command = 'USER_COMMAND' -- ,, DEL USERCOMMAD
i_structure_name = 'TI_INTERNA'
is_layout = gs_layout
it_fieldcat = gt_fieldcat[]
IT_EXCLUDING = gs_exclude[]
i_save = g_save
is_variant = g_variant
it_events = gt_events[]
is_print = gs_print
TABLES
t_outtab = TI_INTERNA
EXCEPTIONS
program_error = 1
OTHERS = 2.



FORM user_command USING pa_ucomm LIKE sy-ucomm
pa_tabla TYPE slis_selfield.
CASE pa_ucomm.
when 'ENTER'.

CHECK NOT pa_tabla-value IS INITIAL.
READ TABLE TI_INTERNA INDEX pa_tabla-tabindex. "Te indica en la posicion q se encuentra.
IF SY-SUBRC EQ 0.
aqui pones tu logica de calculo.... y actualizas tu tabla interna
ENDIF.
* y por ultimo para refrescarla ejecutas la siguiente sentencia
pa_tabla-refresh = 'X'.
pa_tabla-col_stable = 'X'.
pa_tabla-row_stable = 'X'.

encase.
espero poder haberte ayudado.
saludos

sanckok
11/03/08, 14:12:02
Muchas gracias,
La verdad es que al final lo he conseguido. Pongo aqui como lo he hecho, ya que creo que le puede ir bien a alguien

Primero agrego el evento DATA_CHANGED a la llamada del alv, en tu codigo seria en el gt_events[]
FORM eventtab_build USING it_events TYPE slis_t_event.

DATA: l_event TYPE slis_alv_event.

CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = it_events.


l_event-name = 'DATA_CHANGED'.
l_event-form = 'DATA_CHANGED'.
APPEND l_event TO it_events.
ENDFORM. "eventtab_build

Luego creo la rutina DATA_CHANGED para efectuar los cambios necesarios. El evento salta con el INTRO

FORM data_changed USING rr_data TYPE REF TO cl_alv_changed_data_protocol.
DATA : ls_mod_cell TYPE lvc_s_modi,
lv_value TYPE lvc_value .
data c_texto like tj30t-txt30.
* Inicialitzacions
data rs_selfield TYPE slis_selfield.

* Tractament de les dades modificades
SORT rr_data->mt_mod_cells BY row_id .
LOOP AT rr_data->mt_mod_cells INTO ls_mod_cell.
IF ls_mod_cell-fieldname = 'ESTAT'.
SELECT SINGLE txt30 INTO c_texto
FROM tj30t
WHERE stsma = 'ZCSIORD'
AND estat = ls_mod_cell-value
AND spras = sy-langu.
READ TABLE g_mseg index ls_mod_cell-row_id .
if sy-subrc = 0.
g_mseg-txt30 = c_texto.
modify g_mseg index ls_mod_cell-row_id.
call method rr_data->MODIFY_CELL
exporting i_row_id = ls_mod_cell-row_id
i_fieldname = 'TXT30'
i_value = c_texto.
ENDIF.
ENDIF.
ENDLOOP.
* MESSAGE i300.
ENDFORM.


Muchas gracias de nuevo

sanckok
11/03/08, 15:27:03
Perdon, para que funcione, se me ha olvidado decir una cosa
En la funcion REUSE_ALV_GRID_DISPLAY se le ha de pasar un parametro:
i_grid_settings = i_lvc_s_glay

Y llenarlo con:
DATA i_lvc_s_glay LIKE lvc_s_glay.

i_lvc_s_glay-edt_cll_cb = 'X'.

sanvic
27/05/09, 16:02:04
Hola, use el change data y me sirvio pero lo uso para recuperar la descripción del campo que se acaba de modificar, y claro como no pasa despues por el user command no se actualiza, sabe alguien como arreglarlo.

Gracias,
Salu2

negrogho
27/05/09, 17:08:00
Sanvic

el metodo para modificar la celda en el Alv tambien te lo pusieron en el ejemplo

call method rr_data->MODIFY_CELL
exporting i_row_id = ls_mod_cell-row_id
i_fieldname = 'TXT30'
i_value = c_texto.

saludos

sanvic
28/05/09, 07:42:57
Muchas gracias, a veces parezco un poco cieguita :P

ksper
05/01/10, 17:30:28
Yo tengo un reporte ALV, donde solo una columna es editable, le pongo el valor que quiero y le doy enter y de manera de visualizar se ven los campos que cambie y demas... pero no se como actualizar mi tabla Z... :(

osea como actualizo mi tabla interna para que tome los nuvos valores introducidos y de ahi actualizar mi tabla z....

espero me puedan ayudar..

saludos..

ksper
05/01/10, 18:05:11
Muchas gracias,
La verdad es que al final lo he conseguido. Pongo aqui como lo he hecho, ya que creo que le puede ir bien a alguien

Primero agrego el evento DATA_CHANGED a la llamada del alv, en tu codigo seria en el gt_events[]
FORM eventtab_build USING it_events TYPE slis_t_event.

DATA: l_event TYPE slis_alv_event.

CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = it_events.


l_event-name = 'DATA_CHANGED'.
l_event-form = 'DATA_CHANGED'.
APPEND l_event TO it_events.
ENDFORM. "eventtab_build

Luego creo la rutina DATA_CHANGED para efectuar los cambios necesarios. El evento salta con el INTRO

FORM data_changed USING rr_data TYPE REF TO cl_alv_changed_data_protocol.
DATA : ls_mod_cell TYPE lvc_s_modi,
lv_value TYPE lvc_value .
data c_texto like tj30t-txt30.
* Inicialitzacions
data rs_selfield TYPE slis_selfield.

* Tractament de les dades modificades
SORT rr_data->mt_mod_cells BY row_id .
LOOP AT rr_data->mt_mod_cells INTO ls_mod_cell.
IF ls_mod_cell-fieldname = 'ESTAT'.
SELECT SINGLE txt30 INTO c_texto
FROM tj30t
WHERE stsma = 'ZCSIORD'
AND estat = ls_mod_cell-value
AND spras = sy-langu.
READ TABLE g_mseg index ls_mod_cell-row_id .
if sy-subrc = 0.
g_mseg-txt30 = c_texto.
modify g_mseg index ls_mod_cell-row_id.
call method rr_data->MODIFY_CELL
exporting i_row_id = ls_mod_cell-row_id
i_fieldname = 'TXT30'
i_value = c_texto.
ENDIF.
ENDIF.
ENDLOOP.
* MESSAGE i300.
ENDFORM.


Muchas gracias de nuevo



Oye una duda, que es G_MSEG??

esa tabla donde la llenas?? No me quedo claro esa parte,
agredeceria tu ayuda........

sponsor
23/06/10, 14:03:32
a mi este codigo no me hace nada, y no tengo claro que es lo que le tengo k pasar al import it_event de la llamada al alv grid.. hay que ponerle tab_events[]??

donde se deben colocar los performs de estos forms?

Poniendole eso no hace nada...

sponsor
26/06/10, 19:14:49
alguien que se le ocurra algo?

sponsor
28/06/10, 07:00:32
no acabo de aclararme donde debo poner los performs a las rutinas eventtab y a la rutina data_changed, tampoco se exactamente que es rr_data que es lo que se le pasa a la rutina data_changed...

alguien me lo puede explicar?

julian.cely
03/07/13, 20:05:10
LOOP AT rr_data->mt_mod_cells INTO ls_mod_cell.
IF ls_mod_cell-fieldname = 'ESTAT'.
SELECT SINGLE txt30 INTO c_texto
FROM tj30t
WHERE stsma = 'ZCSIORD'
AND estat = ls_mod_cell-value
AND spras = sy-langu.
READ TABLE g_mseg index ls_mod_cell-row_id .
IF sy-subrc = 0.
g_mseg-txt30 = c_texto.
modify g_mseg index ls_mod_cell-row_id.
call method rr_data->MODIFY_CELL
exporting i_row_id = ls_mod_cell-row_id
i_fieldname = 'TXT30'
i_value = c_texto.
ENDIF.
ENDIF.
ENDLOOP.


Yo creería que se podría mejorar el performance del reporte, sacando ese SELECT del LOOP, haces el SELECT antes del LOOP con un FOR ALL ENTRIES de la rr_data, luego dentro del LOOP lo que haces es un READ TABLE a la rr_data WITH KEY con la llave del área de trabajo que controla el LOOP. Espero que les sirva.