Проблема обновления ALV при навигации по команде пользователя - PullRequest
0 голосов
/ 11 мая 2019

У меня есть 2 экрана 7000 и 7001, экран 7000 содержит одну кнопку, когда мы нажимаем на нее, она должна перейти к экрану 7001, но она не работает должным образом. Экран 7000 также имеет некоторые детали для отображения в качестве alv.

экран перемещался к экрану 7001, но данные не обновлялись. может ли кто-нибудь помочь в этом. Я использую контейнер alv grid. для обоих экранов я использую одинаковую сетку alv

Пример кода:

screen 7000 PAI:
WHEN 'DISPLAY'.
      call SCREEN 7001.

screen 7001 PBO:
 GET REFERENCE OF m_instance->gt_field INTO lr_output.

  CREATE OBJECT gr_grid
    EXPORTING
      i_parent = cl_gui_container=>default_screen.

  CALL FUNCTION 'ZLSO_GENERATE_GENERIC_FIELDCAT'
    EXPORTING
      ir_input_value   = lr_output
    IMPORTING
      et_fieldcat_fcat = lt_fldcat
    EXCEPTIONS
      xc_invalid_type  = 1
      xc_empty_table   = 2
      xc_unknown_error = 3
      OTHERS           = 4.
  IF sy-subrc <> 0.
    MESSAGE ' Error in generating ALV' TYPE 'E'.
  ENDIF.

  CALL METHOD gr_grid->set_table_for_first_display
    EXPORTING
      is_layout       = gs_layout
    CHANGING
      it_fieldcatalog = lt_fldcat
      it_outtab       = m_instance->gt_field.

  gr_grid->refresh_table_display( ).

1 Ответ

4 голосов
/ 12 мая 2019

1) Основная проблема

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

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

В вашем случае у вас есть 2 сетки ALV, назначенные одному и тому же фиктивному контейнеру DEFAULT_SCREEN;ваш элемент управления является экземпляром класса CL_GUI_ALV_GRID, вы можете вызвать метод FREE для его освобождения.

2) В вашем коде есть другая проблема

Решение, приведенное выше, должно решить вашу непосредственную проблему, но это создаст другую, потому что вам придется повторно создавать экземпляр ALV Grid при возвращении к экрану 7000, и это сбросит положение прокрутки и т. Д.

Вы можете избежать этого, изменив что-то еще в своем коде, как я объясню ниже.

Dynpro (экран ABAP) содержит элементы пользовательского интерфейса, но если вы назначаете элемент управления «фиктивному экрану» (любому изстатические атрибуты *SCREEN* из CL_GUI_CONTAINER), этот элемент управления будет отображаться поверх dynpro (элементы пользовательского интерфейса dynpro не отображаются вообще, кроме панели инструментов).

Вместо использования фиктивных экранов, вы должны определить настраиваемую область управления в вашем dynpro, дать ей имя, а затем в PBO создать настраиваемый контейнер (класс CL_GUI_CUSTOM_CONTAINER), указав название области и назначив сетку ALV этому контейнеру.

Если вы сделаете это на двух экранах, у вас будет только одна сетка ALV на контейнер, и вы выиграете 'на каждом шаге навигации требуется освободить и восстановить экземпляры элементов управления.

...