MUNDOSAP

MUNDOSAP (foro/index.php)
-   Programación ABAP IV (foro/forumdisplay.php?f=4)
-   -   Capturar eventos en alv (foro/showthread.php?t=11687)

sanckok 11/03/08 09:46:20

Capturar eventos en alv
 
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




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...


Husos Horarios son GMT. La hora en este momento es 15:14:12.

www.mundosap.com 2006 - Spain
software crm, crm on demand, software call center, crm act, crm solutions, crm gratis, crm web