Редактируемое поле CL_GUI_ALV_GRID не обновляется

У меня есть сетка ALV с редактируемым полем, если я проверяю введенные данные и отображаю ошибки, ALV обновляется, если я пытаюсь изменить входные данные, в других случаях ALV больше не обновляется.

Код в PAI:

    ls_layout-cwidth_opt = abap_true.  
    CREATE OBJECT go_alv     
     EXPORTING
      i_parent          = cl_gui_custom_container=>screen0
    EXCEPTIONS
      error_cntl_create = 1
      error_cntl_init   = 2
      error_cntl_link   = 3
      error_dp_create   = 4
      OTHERS            = 5. 

        IF sy-subrc EQ 0.
    
    *   Adapting field catalog
        CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
          EXPORTING
            i_structure_name       = 'ZAMOUNT'
          CHANGING
            ct_fieldcat            = lt_fieldcat.
        IF sy-subrc EQ 0. 
  *     Field catalog specifics       
        LOOP AT lt_fieldcat ASSIGNING <ls_fieldcat>. 
              IF  <ls_fieldcat>-fieldname = 'DMBTR'.
                <ls_fieldcat>-edit = abap_true.
              ENDIF.
    
          ENDLOOP.
        ENDIF.

    *   Show data usig ALV class
        go_alv->set_table_for_first_display(
                  EXPORTING
                    is_layout       = ls_layout
                  CHANGING
                    it_outtab       = gt_out
                    it_fieldcatalog = lt_fieldcat ).
    
          go_alv->set_ready_for_input( EXPORTING
            i_ready_for_input = 1 ).
    
          CALL METHOD go_alv->register_edit_event
            EXPORTING
              i_event_id = cl_gui_alv_grid=>mc_evt_enter.
    
          CALL METHOD go_alv->register_edit_event
            EXPORTING
              i_event_id = cl_gui_alv_grid=>mc_evt_modified.
      ENDIF.

Код в PBO:

        IF go_alv IS NOT INITIAL.

        CALL METHOD go_alv->check_changed_data( ).

        PERFORM check_amounts   TABLES gt_out
                              CHANGING gv_sum_amounts
                                       gv_tot_amount.

       
        CALL METHOD go_alv->refresh_table_display
          EXPORTING
            is_stable      = VALUE #( row = abap_true
                                      col = abap_true )
            i_soft_refresh = 'X'.           
            cl_gui_cfw=>flush( ).

    ENDIF.

При выполнении check_amounts я заполняю поле ALV ошибками, если пользователь изменяет поле ввода и ошибка удаляется во внутренней таблице, но не отображается в ALV.

Я также попытался реализовать метод data_change_finished, вызвав обновление внутри, но я не решил аномалию.

Можешь мне помочь? Спасибо


person stella    schedule 02.03.2021    source источник
comment
Отвечает ли это на ваш вопрос? Сетка ALV не обновляется   -  person Sandra Rossi    schedule 03.03.2021


Ответы (1)


Я не совсем уверен, понимаю ли я вашу проблему, но вот некоторые потенциальные проблемы, которые я вижу:

  1. Ваши проверки действительности разделились. С одной стороны, есть событие data_changed. С другой стороны, у вас есть выполнение check_amounts.
  • Если событие data_changed обнаруживает ошибку ввода, оно покажет вам красный контур на вашей сетке. Во внутренней таблице (gt_out) это поле останется таким же, как и раньше (оно не будет обновлять таблицу с неверным вводом!). Возможно, именно поэтому вы думаете, что в вашей сетке должно быть сообщение, но его нет.
  1. Вы определили собственную локальную версию для события data_changed? Чем обработчики отсутствуют. Когда вы пытались выполнить обновление в событии data_changed_finished, вам определенно понадобится обработчик для этого.
  • Также вы сказали, что обновляете только метод data_changed_finished. Тогда вам нужно также указать выполнение check_amount. В противном случае вы вызвали обновление слишком рано.
  • В методе data_changed_finished у вас есть автоматически обновляемая таблица (gt_out) из метода data_changed. Вы должны иметь возможность обновить его здесь и отправить в свою сетку с обновлением.
  1. Мне не нравится, что вы вызываете метод check_changed_data в своем PBO. Из-за вызовов register_edit_event событие data_changed уже запускается, когда вы нажимаете Enter или переходите к следующему полю. Обычно вы вызываете этот метод только тогда, когда получаете отдельную пользовательскую команду, которая может быть запущена до того, как событие может быть запущено, чтобы быть уверенным, что у вас есть правильные данные.
  • Не уверен на 100% в этом, но для ваших вызовов register_edit_event идентификатор события cl_gui_alv_grid = ›mc_evt_modified должен уже включать идентификатор события cl_gui_alv_grid =› mc_evt_enter.

Я бы попытался определить локальный класс для обработки событий data_changed и data_changed_finished и поместить check_amount и обновить в метод для события data_changed_finished. Может быть, вам это поможет? Если у вас есть какие-либо вопросы по этому поводу, дайте мне знать, и я могу более подробно рассказать.

С уважением

person Herr Berthm    schedule 03.03.2021