Я смотрел видео на 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
, отображая номер документа, по которому был сделан щелчок.
Я вижу, вы используете 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. После внесения этих изменений программа заработала отлично.