为什么ALV双击时没有触发REUSE_ALV_GRID_DISPLAY的i_callback_user_command给出的子例程?

问题描述 投票:0回答:1

我在 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
事务,显示单击的文档编号。

abap alv
1个回答
0
投票

我看到您正在使用 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。但是,由于这是热点点击,因此只需单击一下即可进入交易,而不是双击。

© www.soinside.com 2019 - 2024. All rights reserved.