Обновленные записи cl_salv_table не отображаются на подэкране - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь отобразить обновленные записи в ALV, но старые записи отображаются.

Вот код, написанный на экране выхода из рабочего задания.

  TRY.
**// Create SALV
      cl_salv_table=>factory(
        EXPORTING
          r_container    = lo_cust_container
        IMPORTING
          r_salv_table   = lo_alv_table
        CHANGING
          t_table        = gt_wflog ).


**// Functions
      DATA(lo_alv_functions) = lo_alv_table->get_functions( ).
      lo_alv_functions->set_all( abap_true ).

**// Display Settings
      DATA(lo_alv_display) = lo_alv_table->get_display_settings( ).
      lo_alv_display->set_striped_pattern( abap_true ).

**// Layout Settings
      DATA: ls_layout_key TYPE salv_s_layout_key.
      DATA(lo_alv_layout) = lo_alv_table->get_layout( ).
      ls_layout_key-report = sy-repid.
      lo_alv_layout->set_key( ls_layout_key ).
      lo_alv_layout->set_save_restriction( cl_salv_layout=>restrict_user_independant ).
*      lo_alv_layout->set_default( abap_true ).

**// Columns
      DATA: lo_alv_column TYPE REF TO cl_salv_column_table.
      DATA(lo_alv_columns) = lo_alv_table->get_columns( ).

********* Unhide Columns
      lo_alv_column ?= lo_alv_columns->get_column( 'AUFNR' ). "lo_alv_column->set_visible( abap_true ).
      lo_alv_column ?= lo_alv_columns->get_column( 'LMTID' ). "lo_alv_column->set_visible( abap_true ).


**/ Hide columns
      lo_alv_column ?= lo_alv_columns->get_column( 'UNAME' ). lo_alv_column->set_technical( abap_true ).
*      lo_alv_column ?= lo_alv_columns->get_column( 'MANDT_RESB' ). lo_alv_column->set_technical( abap_true ).
*      lo_alv_column ?= lo_alv_columns->get_column( 'RSNUM_RESB' ). lo_alv_column->set_technical( abap_true ).

**// Display
      lo_alv_columns->set_optimize( abap_true ).

      lo_alv_table->set_data( CHANGING t_table = gt_wflog[] ).


      lo_alv_table->display( ).


    CATCH cx_salv_msg cx_salv_error INTO DATA(lx_salv_msg).
      MESSAGE lx_salv_msg->get_text( ) TYPE 'I'.
  ENDTRY.

Я пытался использованный метод refre sh lo_alv_table->REFRESH( ). с опцией soft или full refre sh, но ничего не произошло. Первый раз данные вызова в порядке, когда подэкран вызывается снова и происходит изменение данных, тогда обновленные записи не отображаются. Я могу видеть обновленные записи в таблице во время отладки.

Ответы [ 2 ]

1 голос
/ 16 января 2020

Скорее всего, у вас есть исключение CX_SALV_NO_NEW_DATA_ALLOWED, которое перехватывается предложением TRY во время второго вызова вашего экземпляра. Вот почему метод display() не выполняется.

В документации к методу SET_DATA есть примечание:

Вы не можете вызывать эти методы в обработчик события. Если вы
сделаете это, вы получите ошибку.

...

Исключения
CX_SALV_NO_NEW_DATA_ALLOWED
Вы вызвали SET_DATA в обработчике событий.

В вашем контекстном экране выход аналогичен обработчику событий, так как он вызывается каким-либо событием.

Решение подтверждается OP: "Это работает отлично"

Добавлено в объявления в верхней части списка.

DATA go_alv_table TYPE REF TO cl_salv_table.

Добавлено в коде

IF go_alv_table IS NOT BOUND.
  cl_salv_table=>factory( )
  ...
ENDIF.

Добавлено после вызова метода set_data

go_alv_table->refresh( refresh_mode = if_salv_c_refresh=>soft ).
0 голосов
/ 16 января 2020

Это хорошо известная проблема с элементами управления. Если вы создаете экземпляр любого GUI элемента управления (в вашем случае это сетка ALV) внутри контейнера, в котором уже был элемент управления, который не был освобожден до (в вашем случае сначала создается экземпляр сетки ALV). используя cl_salv_table=>factory), тогда старый элемент управления по-прежнему отображается, новый элемент не отображается.

Два решения:

  • Либо вы продолжаете создавать экземпляр элемента управления, но тогда вы должны освободить предыдущий контроль. Для этого вы должны позвонить control->FREE( ) с последующим оператором FREE control. Этот метод доступен для всех элементов управления (даже сам контейнер может быть освобожден, тогда все его внутренние элементы управления освобождаются).

  • Или вы изменяете логи c, создавая экземпляр элемента управления только один раз, и вы обновляете sh его содержимое.

Особый случай: некоторые элементы управления могут быть обернуты некоторыми классами-обертками, которые не предоставляют доступ к элементу управления (например, классы SALV) ), поэтому проще всего освободить контейнер, к которому прикреплен элемент управления.

...