我在 YouTube 上观看了一个视频,该视频展示了如何通过单击 ALV 视图中的特定字段来调用交易,但是当在我的代码中复制它时,我无法实现此功能。 当我单击“EBELN”字段中的文档时,没有任何反应。
问题是该程序不会产生任何错误,但是当我尝试通过在调用事务部分放置断点来调试它时,它只是跳过该部分。此部分仅在双击“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。但是,由于这是热点点击,因此只需单击一下即可进入交易,而不是双击。