Refresh CL_SALV_TABLE

Saludos a todos, vengo con la siguiente duda,
realizando un reporte con la clase cl_salv_table quisiera poder usar la misma dynpro para al ejecutar una función “al presionar un botón customizado de status” se genere un nuevo grid sin necesidad de generar otra pantalla es decir que se refresque el grid actual y muestre nuevos datos (nueva tabla y catalogo de datos), actualmente probé con el metodo refresh( ). y cl_gui_cfw=>flush( ). sin resultados adjunto un código para mejor comprensión, en espera de su gentil ayuda.
PD: Usar display( ). genera otra dynpro lo cual no deseo que suceda.

   TRY.
        cl_salv_table=>factory(
          IMPORTING
            r_salv_table   = l_salv_ob
          CHANGING
            t_table        = b_component_t ).
      CATCH cx_salv_msg .
    ENDTRY.

    lc_report = sy-repid.

    l_salv_ob->set_screen_status( pfstatus = 'ZFIGUI_MENU_LIST_FE'
                                  report = lc_report
                                  set_functions = l_salv_ob->c_functions_all ).

    l_alv_toolbar = l_salv_ob->get_functions( ).
    lt_func_list = l_alv_toolbar->get_functions( ).
    l_events = l_salv_ob->get_event( ).

    SET HANDLER cl_event_handler=>on_added_function FOR l_events.
    SET HANDLER cl_event_handler=>on_double_click FOR l_events.
    cl_event_handler=>lo_popup = l_salv_ob.

    CALL METHOD cl_event_handler=>get_data_alv(
      EXPORTING
        i_data = b_component_t ).

    l_cols_ob = l_salv_ob->get_columns( ).

    l_salv_ob->refresh( ).
    cl_gui_cfw=>flush( ).

Hola,

Probaste con el SET_DATA?

Saludos.

1 me gusta

@Adrian_Vera, tal como te dice @sconoredhot; con el SET_DATA funciona muy bien. debes controlarlo en el MODULE status_XXX OUTPUT.

2 Me gusta

gracias por tu respuesta el código ahora esta asi:
pero sigo sin resultados favorables.

    TRY.
        cl_salv_table=>factory(
          IMPORTING
            r_salv_table   = l_salv_ob
          CHANGING
            t_table        = b_component_t ).
      CATCH cx_salv_msg .
    ENDTRY.


    l_salv_ob->set_data(
    CHANGING
      t_table =  b_component_t ).

    l_salv_ob->refresh( ).
    cl_gui_cfw=>flush( ).

en b_component_t actualizas los datos?

Hola, Buenos dias

@Adrian_Vera creo que el problema radica en que no tienes la salida de la tabla asignada en un contenedor de la dynpro

MODULE status_0100 OUTPUT.
  SET PF-STATUS 'STATUS_100'.
  IF gr_ccontainer IS INITIAL.
    CREATE OBJECT gr_ccontainer
      EXPORTING
        container_name = 'G_CONTAINER'.
  ENDIF.

  IF cual_alv = 1.
    CALL METHOD cl_salv_table=>factory
      EXPORTING
        r_container    = gr_ccontainer
        container_name = 'G_CONTAINER'
      IMPORTING
        r_salv_table   = cl_alv
      CHANGING
        t_table        = it_ekko.

    CALL METHOD cl_alv->display.

  ELSE.

    CALL METHOD cl_alv->set_data
      CHANGING
        t_table = it_ekpo.

    CALL METHOD cl_alv->display.

  ENDIF.

ENDMODULE.                 " STATUS_0100  OUTPUT
1 me gusta

Buen día @jumanago, agradezco tu tiempo y ayuda si la tabla b_components_t es la nueva tabla a mostrar con los datos nuevos, actualmente el reporte muestra una dynpro autogenerada “1000” y ahí se muestran los datos no utilizo un contenedor, es absolutamente necesario crear un contenedor para actualizar estos datos?, el reporte no es de la clase que muestro datos dependiendo de una selección como digo en el post, el reporte ya muestra datos al cargar pero estos deben “actualizarse” (mostrar una tabla en el mismo contenedor con una estructura totalmente diferente) si presiono un boton por ejemplo mis datos se muestran actualmente por días y presionando un boton cambian a semanas o meses, no se si me explico?.

@adrian_vera para que se pueda ver los datos nuevos tienes que controlar los PBO y PAI de la dynpro, si lo generas automáticamente"1000" no puedes mostrar los nuevos datos por que estos se ejecutaría fuera del evento de la impresión de pantalla, ya que no puedes modificarla.

No conozco otra forma, diría que tienes que crear una dynpro y el contenedor para que logres mostrar la tabla que quieres visualizar con la estructura que quieras.

Recuerda
PBO (Process Before Output) : En este evento se programa todo lo necesario justo antes de mostrar la pantalla o dynpro.

PAI (Process After input): En este evento se programa todas las acciones que un usuario haga sobre la pantalla. Pulsar un botón, invocar un menú, etc

1 me gusta

@jumanago yo lo tengo mas que claro pero es un proyecto inmenso que no lo inicie yo (ese es el problema de contratar tercecros?) en todo caso si es necesario el contenedor me toca buscar otra solución como generar otro modo o sesión en todo caso agradezco tu tiempo y respuestas! y doy este tema por cerrado

@Adrian_Vera, entiendo que das por cerrado el tema… pero… tu respuesta fue la que solucionó este tema?

Desde mi ignorancia pregunto, no te sirvió ninguna respuesta de los compañeros para llegar a las conclusiones que llegaste?

@SidV diría que la de jumanago pero en realidad no dio solución en todo caso puedo marcar la de el como solución si gustas.

@adrian_vera la otra es que se me ocurre, seria que en la selección screen agregues un checkbox de que forma quieres que salga el ALV seria por días, semanas o meses, y organices la información y la muestra el ALV actual como esta.

@jumanago no te preocupes hablando con mi supervisor determinamos otra solución gracias por tus respuestas y tiempo.

Y cuál solución determinaron? No nos dejes ahora con la intriga :smiley_cat:

@SidV usar el método factory( ). y mostrar otras dynpro generadas de forma automática la única diferencia es que para cuando se quiera ver en mes o semana siempre se regresara a días con el boton back lo cual no crea ninguna inconsistencia y no es necesario refrescar la tabla es menos practico pero es la solución que me salvo, saludos :smiley: .

1 me gusta

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.