I am new to ABAP, and I am creating ALV using FM 'REUSE_ALV_FIELDCATALOG_MERGE' and 'REUSE_ALV_GRID_DISPLAY'.
It is working when I defined internal table IT_MARD
using obsolete occurs 0 definition. But I am getting Exception condition "NO_FIELDCATALOG_AVAILABLE" raised, when I defined internal table using type standard table
. Could you please explain difference between these two definition and why it is not working in the latter case. The following is the code.
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.
The difference is that
OCCURS
creates a table with a header line, whileTYPE STANDARD TABLE OF
does not (unless you explicitly tell it to). I suppose that the function module is able to guess the structure from a table with a header line, but not a table without a header line. My suggestions would be to