#1
|
|||
|
|||
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 |
#2
|
|||
|
|||
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 |
#3
|
|||
|
|||
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 |
#4
|
|||
|
|||
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'. |
#5
|
|||
|
|||
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 |
#6
|
||||
|
||||
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 |
#7
|
|||
|
|||
Muchas gracias, a veces parezco un poco cieguita :P
|
#8
|
|||
|
|||
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.. |
#9
|
|||
|
|||
Oye una duda, que es G_MSEG?? esa tabla donde la llenas?? No me quedo claro esa parte, agredeceria tu ayuda........ |
#10
|
|||
|
|||
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... Úlima edición por sponsor fecha: 23/06/10 a las 14:12:10. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|