PDA

Ver la Versión Completa : Refrescar ALV GRID OO Abap


Mr Robot
24/11/15, 22:23:01
Buenos Dias, Tardes o Noches.

-Estimados, aqui explico mi duda, por si alguien podria ayudarme.

Resulta que tengo 7 ALV, y necesito mostrarlos en una sola pantalla, por que se requiere para monitorear todos en tiempo real, resulta que ya encontre la forma de colocarlos en una sola Dynpro, mediante CC, y funciona bien, tengo una pantalla principal donde indico una fecha y al pulsar "Boton de Consulta", me muestra la informacion correspondiente en cada Recuadro con respecto a la fecha, hasta ahi todo bien, ahora cuando regreso a la pantalla anterior, ingreso otra fecha para consultar y muestre datos de la fecha nueva, doy "Boton de Consulta" y me vuelve a mostrar los datos de la fecha anterior ingresada.

Lo que necesito es una forma de refrescar la pantalla y asi me muestre los datos de la nueva fecha sin necesidad de cerrar la transaccion y volverla a ejecutar.

PD: He leido varios temas pero sin exito, Intente el REFRESH DISPLAY pero nada, intente limpiar mis TI y WA al regresar a la pantalla, pero sin resultados.

Agradeceria de corazon quien pueda apoyarme con eso, y Muchisimas gracias de Ante mano, compañeros Abaperos. :rolleyes:

Saludos.
Raynner F: ABAP.

naxito
26/11/15, 09:17:57
Buenas,
no tengo claro como habrás hecho el tema de tener tantos ALV en una pantalla.
Supongo que habrás creado 7 customs containers en la dynpro, y asignar cada ALV grid a un custom container,
Hay una solución más "bonita" a mi gusto, que te evita crear tantos customs containers, que es usar el objeto cl_gui_splitter_container.
En mi caso, tuve que hacer una pantalla con 3 ALVs. 1 en la mitad superior, y 2 en la mitad inferior.
Aqui el codigo para conseguir tener 3 containers, generados a partir de splitters.

data:
d_grid1 TYPE REF TO cl_gui_alv_grid, "grid superior
d_cc_grid1 TYPE REF TO cl_gui_container, "container para grid superior
d_grid2 TYPE REF TO cl_gui_alv_grid, "grid inferior izquierdo
d_cc_grid2 TYPE REF TO cl_gui_container,"container para grid inferior izquierdo
d_grid3 TYPE REF TO cl_gui_alv_grid, "grid inferior izquierdo
d_cc_grid3 TYPE REF TO cl_gui_container, "container para grid inferior derecho
d_container_bottom TYPE REF TO cl_gui_container,"container auxiliar que incluye d_cc_grid2 y d_cc_grid3
d_splitter TYPE REF TO cl_gui_splitter_container,
d_splitter_bottom TYPE REF TO cl_gui_splitter_container.

END-OF-SELECTION.
CALL SCREEN 100.
FORM f_set_screen_display .
* Las siguientes lineas son para crear la cabecera. Es necesario
* definir un splitter para separarla del ALV
CREATE OBJECT d_dyndoc
EXPORTING
style = 'ALV_GRID'.
* Creamos el splitter para el custom container
CREATE OBJECT d_splitter
EXPORTING
* parent = custom_container
parent = cl_gui_container=>default_screen "utiliza todo el tamaño disponible y no hay que crear un custom container en la dynpro
rows = 2 "filas
columns = 1. "
d_cc_grid1 = d_splitter->get_container( row = 1 column = 1 ).
d_container_bottom = d_splitter->get_container( row = 2 column = 1 ).
CREATE OBJECT d_splitter_bottom
EXPORTING
parent = d_container_bottom
rows = 1
columns = 2.
d_cc_grid2 = d_splitter_bottom->get_container( row = 1 column = 1 ).
d_cc_grid3 = d_splitter_bottom->get_container( row = 1 column = 2 ).

ENDFORM. " F_SET_SCREEN_DISPLAY
FORM f_set_alv.

IF d_grid1 IS INITIAL.
CREATE OBJECT d_grid1
EXPORTING
i_parent = d_cc_grid1.
CALL METHOD d_grid1->set_table_for_first_display
EXPORTING
is_layout = lr_layout1
CHANGING
it_fieldcatalog = i_fieldcatalog1
it_outtab = <ld_table1>
it_sort = lt_sort1.
ELSE.
CALL METHOD d_grid1->refresh_table_display.
ENDIF.
IF d_grid2 IS INITIAL.
CREATE OBJECT d_grid2
EXPORTING
i_parent = d_cc_grid2.
CALL METHOD d_grid2->set_table_for_first_display
EXPORTING
is_layout = lr_layout2
CHANGING
it_fieldcatalog = i_fieldcatalog2
it_outtab = <ld_table2>
it_sort = lt_sort2.
ELSE.
CALL METHOD d_grid2->refresh_table_display.
ENDIF.
IF d_grid3 IS INITIAL.
CREATE OBJECT d_grid3
EXPORTING
i_parent = d_cc_grid3.
CALL METHOD d_grid3->set_table_for_first_display
EXPORTING
is_layout = lr_layout3
CHANGING
it_fieldcatalog = i_fieldcatalog3
it_outtab = <ld_table3>
it_sort = lt_sort3.
ELSE.
CALL METHOD d_grid3->refresh_table_display.
ENDIF.
ENDFORM
MODULE m_status_0100 OUTPUT.
SET PF-STATUS 'MAIN100'.
IF d_splitter IS INITIAL.
PERFORM f_set_screen_display.
ENDIF.
* IF event_receiver IS INITIAL.
* CREATE OBJECT event_receiver.
* ENDIF.
PERFORM f_set_alv.
ENDMODULE. " M_STATUS_0100 OUTPUT



Con la clase cl_gui_splitter_container ofrece métodos para establecer el ancho alto, y mas cosas de un area seleccionada. lo que es bastante útil.

Para el tema de la actualización de las tablas. Debería funcionar si separas la creación y alimentación de las tablas inicial, del refresco de datos. tal y como hago yo.
De todos modos, puedes publicar tu codigo, tal vez podamos ver qué es lo que falla.