Подпрограмма обратного вызова REUSE_ALV_GRID_DISPLAY не запускается?

Я смотрел видео на YouTube, в котором показано, как вызвать транзакцию, щелкнув определенное поле в представлении ALV, но при репликации в своем коде мне не удалось реализовать эту функцию. Когда я нажимаю на документ в поле «ЭБЕЛЬН», ничего не происходит.

Проблема в том, что программа не выдает никаких ошибок, но когда я пытаюсь ее отладить, поместив точку останова в раздел транзакции вызова, она просто пропускает эту часть. Этот раздел выполняется только при двойном щелчке по полю «ebeln», но когда я дважды щелкаю, ничего не происходит.

Почему двойной щелчок не выполняет форму user_command?

что не так в моем коде?

PERFORM chama_alv.

*---------------------------------------------------------------------*
*       FORM CHAMA_ALV                                                *
*---------------------------------------------------------------------*
FORM chama_alv.
  CLEAR: fieldcat.
  REFRESH: fieldcat.

  PERFORM monta_fieldcat USING 'EBELN' 'LS_TABELA1' 'LS_TABELA1' 'DOCUMENTO' ' ' 'X'.
  PERFORM monta_fieldcat USING 'LIFNR' 'LS_TABELA1' 'LS_TABELA1' 'FORNECEDOR' ' ' ' '.
  PERFORM monta_fieldcat USING 'NAME1' 'LS_TABELA1' 'LS_TABELA1' 'NOME FORNECEDOR' ' ' ' '.
  PERFORM monta_fieldcat USING 'AEDAT' 'LS_TABELA1' 'LS_TABELA1' 'DATA CRIAÇÃO DO PEDIDO' ' ' ' '.
  PERFORM monta_fieldcat USING 'UDATE' 'LS_TABELA1' 'LS_TABELA1' 'DATA MODIFICAÇÃO' ' ' ' '.
  PERFORM monta_fieldcat USING 'COUNT' 'LS_TABELA1' 'LS_TABELA1' 'REAPROVAÇÕES' ' ' ' '.
  PERFORM monta_fieldcat USING 'TEXTO' 'LS_TABELA1' 'LS_TABELA1' 'MOTIVO' ' ' ' '.

  CLEAR sort.
  sort-fieldname = 'EBELN'.
  sort-up = 'X'.
  APPEND sort TO sort.

  layout-colwidth_optimize = 'X'.
  layout-zebra = 'X'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_callback_user_command = 'user_command'
      it_fieldcat             = fieldcat[]
      is_layout               = layout
      it_sort                 = sort[]
      i_grid_title            = w_tit
      i_default               = 'X'
      i_save                  = 'A'
      is_variant              = variante
      is_print                = print
    TABLES
      t_outtab                = lt_tabela1
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM MONTA_FIELDCAT                                           *
*---------------------------------------------------------------------*
FORM monta_fieldcat USING x_field x_tab x_ref x_text x_sum x_hotspot.
  fieldcat-fieldname     = x_field.
  fieldcat-tabname       = x_tab.
  fieldcat-ref_tabname   = x_ref.
  fieldcat-reptext_ddic  = x_text.
  fieldcat-do_sum        = x_sum.
  fieldcat-hotspot       = x_hotspot.

  IF x_field = 'UDATE' OR x_field = 'AEDAT'.
    fieldcat-inttype = 'D'.
  ENDIF.

  APPEND fieldcat.
  CLEAR fieldcat.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM SET_STATUS                                               *
*---------------------------------------------------------------------*
FORM set_status USING pf_tab TYPE slis_t_extab.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM ALV_INIT                                                 *
*---------------------------------------------------------------------*
FORM alv_init.
  CLEAR: variante.
  repid = sy-repid.

  variante-report = repid.
  CALL FUNCTION 'REUSE_ALV_VARIANT_DEFAULT_GET'
    EXPORTING
      i_save     = 'A'
    CHANGING
      cs_variant = variante
    EXCEPTIONS
      not_found  = 2.
  IF sy-subrc = 0.
  ENDIF.
ENDFORM.

*---------------------------------------------------------------------*
*       FORM USER_COMMAND                                             *
*---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
                         rs_selfield TYPE slis_selfield.

  CASE r_ucomm.
    WHEN '&IC1'.  
      CASE rs_selfield-fieldname.
        WHEN 'EBELN'.
          READ TABLE lt_tabela1 INTO ls_tabela1 INDEX rs_selfield-tabindex.
          IF sy-subrc = 0.
            SET PARAMETER ID 'BES' FIELD ls_tabela1-EBELN.
            CALL TRANSACTION 'ME23N' AND SKIP FIRST SCREEN.
          ENDIF.
      ENDCASE.
  ENDCASE.
ENDFORM.

В этом коде я извлекаю данные из таблиц ekko, cdhdr и cdpos и помещаю их во внутренние таблицы. Затем эти таблицы объединяются по номеру документа, и полученные данные сохраняются в итоговой таблице (lt_tabela1). Имея эту итоговую таблицу, я могу вызвать ALV для отображения данных. Кроме того, я хочу настроить его так, чтобы при нажатии на поле EBELN он переходил к транзакции ME23N, отображая номер документа, по которому был сделан щелчок.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я вижу, вы используете REUSE_ALV_GRID_DISPLAY для отображения. В настоящее время это считается устаревшим, поэтому вместо этого вы можете использовать объект SALV или ALV_GRID, который предоставит вам более простые, быстрые и лучшие возможности для отображения и редактирования таблиц.

Но на этом этапе у вас также есть таблица под названием fieldcatalog. Он содержит все настройки поля. Будет установлена ​​горячая точка, которую можно создать как событие для других объектов и обрабатывать внутри нее. Обычно это ключ к тому, какую логику запускать при щелчке по полю. Обычно мне нравится использовать объектно-ориентированный ALV_GRID, где этот метод может обрабатывать щелчок горячей точки.

К сожалению, у меня нет большого опыта работы с простой функцией REUSE_ALV_GRID_DISPLAY, но я быстро сгенерировал написанный мной код и проверил, что может быть не так. Что я действительно подозревал, так это то, что ABAP очень чувствителен к регистру. Мое первое предложение — писать слово USER_COMMAND с заглавной буквы, когда вы ему передаете. И вторая ошибка заключалась в том, что вы пропустили параметр i_callback_program при вызове функции. В этом случае достаточно передать ему значение sy-repid.

...
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
        EXPORTING
          i_callback_program = sy-repid
          i_callback_user_command = 'USER_COMMAND'
...

Лично я после исправления этих ошибок успешно вызвал транзакцию, но я все равно рекомендую использовать SALV или ALV_GRID. Однако, поскольку это клик по горячей точке, вы перейдете к транзакции одним щелчком мыши, а не двойным щелчком мыши.

Спасибо большое за вашу помощь! Вы были в точку. проблемы были из-за чувствительности к регистру и отсутствия параметра i_callback_program. После внесения этих изменений программа заработала отлично.

Lucas Ag 04.07.2024 14:14

Другие вопросы по теме