0

我是 ABAP 的新手,我正在使用 FM 'REUSE_ALV_FIELDCATALOG_MERGE' 和 'REUSE_ALV_GRID_DISPLAY' 创建 ALV。

IT_MARD当我使用过时的发生 0定义定义内部表时,它正在工作 。但是当我使用type standard table. 您能否解释一下这两个定义之间的区别以及为什么它在后一种情况下不起作用。以下是代码。

REPORT  ztest_fieldcatalog3.
TYPE-POOLS:slis.
*Semi Automatic Fieldcatalog Generation.
*DATA: BEGIN OF IT_MARD OCCURS 0,
*        MATNR LIKE MARD-MATNR,
*        WERKS LIKE MARD-WERKS,           ""
*        LGORT LIKE MARD-LGORT,
*        PSTAT LIKE MARD-PSTAT,
*      END OF IT_MARD.

TYPES: BEGIN OF ty_mard,
        matnr type mard-matnr,
        werks type mard-werks,
        lgort type mard-lgort,
        pstat type mard-pstat,
      END OF ty_mard.

DATA: IT_MARD TYPE STANDARD TABLE OF ty_mard.


"Use function module create  Fieldcat.
DATA:l_program TYPE sy-repid VALUE sy-repid.

DATA:i_fieldcat TYPE slis_t_fieldcat_alv.

SELECT matnr
       werks
       lgort
       pstat
  FROM mard
  INTO CORRESPONDING FIELDS OF TABLE it_mard
  UP TO 100 ROWS.


CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
  EXPORTING
    i_program_name     = l_program
    i_internal_tabname = 'IT_MARD'
    i_inclname         = l_program
    i_bypassing_buffer = 'X'
  CHANGING
    ct_fieldcat        = i_fieldcat[].
IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.


"Call ALV and pass fieldcatalog and data
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    i_callback_program = l_program
    it_fieldcat        = i_fieldcat
  TABLES
    t_outtab           = it_mard.
IF sy-subrc <> 0.
  MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
          WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
4

1 回答 1

1

不同之处在于OCCURS创建带有标题行的表,而TYPE STANDARD TABLE OF没有(除非您明确告诉它)。我想功能模块能够从带有标题行的表中猜测结构,但不能从没有标题行的表中猜测结构。我的建议是

  1. 使用数据字典结构而不是本地结构 - 以后更容易维护和扩展
  2. 不要使用 REUSE 功能模块,而是检查 CL_SALV_* 类,因为它们是官方支持的并且有更简洁的 API
于 2014-11-28T21:33:16.427 回答