What is the difference between OCCURS 0 and TYPE STANDARD TABLE

6.7k views Asked by At

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.
1

There are 1 answers

1
vwegert On BEST ANSWER

The difference is that OCCURS creates a table with a header line, while TYPE 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

  1. use a data dictionary structure instead of a local structure - it's easier to maintain and extend later on and
  2. don't use the REUSE function modules, but check the CL_SALV_* classes instead since they are officially supported and have a much cleaner API