Hola, tengo una consulta sobre alv oo, despliego la info al darle click al boton de modificar la idea es que se blanquee el campo nro de orden que tenia un valor y debe quedar en blanco, actualmente lo hace pero solo lo efectua en la tabla Z pero en el alv no lo veo reflejado solo si me salgo y vuelvo a entrar, luego que hago el update estoy lamando al method: CALL METHOD g_grid->refresh_table_display, pero no se si debo hacer otro paso antes, si me pueden dar algun apoyo al respecto se lo agradeceria.
LOOP AT ti_ztsfxdata_or INTO wa_modif WHERE sel EQ 'X'.
UPDATE ztsfxdata_or
SET aufnr = ' '
WHERE snig EQ wa_modif-snig
AND aufnr EQ wa_modif-aufnr
AND fecha EQ wa_modif-fecha.
READ TABLE ti_ztsfxdata_or WITH KEY snig = wa_modif-snig
aufnr = wa_modif-aufnr
fecha = wa_modif-fecha.
MODIFY ti_ztsfxdata_or FROM wa_modif INDEX sy-tabix.
CALL METHOD g_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified.
CREATE OBJECT g_event_receiver.
CALL METHOD g_grid->refresh_table_display.
ENDLOOP.
Hola @aalvarez2605
Yo sacaría el refresh del ALV fuera del LOOP, una vez tenga todos los cambios en la tabla para evitar n llamadas.
Los eventos del ALV los colocaría al momento de su creación.
Y para refrescar el front-end coloca cl_gui_cfw=>flush luego del refresh.
Saludos!
Hola gracias por tu respuesta, cuando me dices el refrescar front-end eso sustituiria al refresh normal o es aparte del refresh. Este es mi primer alv oo y no estoy muy ducha con los terminos.
Muchas Gracias.
Hola Ana! Bienvenida a OO
No, colocas el g_grid->refresh_table_display igualmente. Esto te sirve para actualizar el outtab (la tabla del ALV) y luego colocas el cl_gui_cfw=>flush, para que te actualice el front-end.
Es decir, con g_grid->refresh_table_display actualizarías el backend y luego con cl_gui_cfw=>flush actualizarías el frond-end (sapgui).
La idea es que seleccione el o los registros en el campo procesar y la informacion que aparece en el campo nro de orden se blanquee, es decir quede asi luego de darle al boton modificar.
El programa me actualiza en mi tabla Z ( es deir blanque el campo nro de orden) pero en el alv no lo hace inmediatamen te sino que tengo que salirme entrar nuevamente para ver la midificacion. El codigo lo tengo asi:
Selecciono Modificar y voy al form.
Aqui actualizo la tabla Z blanqueando el campo nro de orden.Y luego es que quiero que se refleje ese cambio en el alv.
Pero no se que me esta faltando para lograrlo.
Ya que no se borra o refresca la informacion solo si me salgo y entro nuevamente es que veo que se realizar el update.
Hola @aalvarez2605 buen día,
Dentro del loop limpias la variable aufnr?, solo veo que actualizas la tabla Z en BD.
Un consejo, en los loops utiliza field-symbols esto mejora el rendimiento.
Saludos!
Hola @aalvarez2605, tengo un problema muy similar al tuyo pero no lo he logrado resolver aun. Por favor avísame si lograste hacer lo que querías. Igualmente te aviso si logro hacerlo.
Hola @aalvarez2605. Ya logré refrescar el ALV OO luego de modificar una tabla base de datos. Lo que hice fue llamar de nuevo al ALV, esto se hace llamando el método SET_TABLE_FOR_FIRST_DISPLAY de la clase CL_GUI_ALV_GRID y el método SET_TOOLBAR_INTERACTIVE de la misma clase… Te envío una pantallazo
Lo importante es que modifiques en el mismo programa la tabla interna que le pasas al método, en mi caso es <fs_t_tlist>, a ese FS le iba borrando los registros que iba modificando para que no salieran cuando se volviera a generar el ALV.
Si te sirve yo lo hago de esta forma sin invocar el método “set_table_for first_display”. Esto lo coloco en el meto HANDLE_DATA_CHANGED del ALV OO.
call method er_data_changed->modify_cell
exporting
i_row_id = 1 "Numero de fila
i_tabix = sl_t_modi-tabix
i_fieldname = 'campo' "Nombre del campo que deseas modificar
i_value = '' "Valor que se le asigna al campo.
donde el er_data_changed es del tipo CL_ALV_CHANGED_DATA_PROTOCOL.