The Difference Between SY-TABIX and SY-INDEX

Please below an explanation of the system variables SY-TABIX and SY-INDEX:

 

SY-TABIX:

  • SY-TABIX contains the current line in an internal table. That is, it will contain the position of the record we are accessing in an internal table.

SY-TABIX in different scenarios:

  • Statement ‘APPEND’ will set SY-TABIX to the position of the last table row
  • Statement ‘COLLECT’ will set SY-TABIX to the position of the appended table row
  • Statement ‘LOOP’ will set SY-TABIX to the position of the record we are accessing (or current loop record)
  • Statement ‘READ’ will set SY-TABIX to the position of the record we are reading
  • Statement ‘SEARCH’ will set SY-TABIX to the position of the table row in which the search string was found

Note: SY-TABIX is set to 0 with hashed tables.

 

SY-INDEX:

  • SY-INDEX contains the number of loop passes in DO and WHILE loop.

Code demonstrating different between SY-TABIX and SY-INDEX:

*&--------------------------------------------------------------------&*
*& Program Description:                                               &*
*& -----------------------                                            &*
*& This demo program will demonstrate the difference between SY-TABIX &*
*& and SY-INDEX.                                                      &*
*&                                                                    &*
*& Author:  ABAPCOOKBOOK                                              &*
*& Website: www.abapcookbook.com                                      &*
************************************************************************

REPORT ZDEMOSYINDEXTABIX.

 *Internal tables and structures:
DATA:
  lt_bkpf     TYPE STANDARD TABLE OF bkpf,
  lt_bseg     TYPE STANDARD TABLE OF bseg,
  lst_bkpf    TYPE bkpf,
  lst_bseg    TYPE bseg.

*---------------------------------------*
*DUMMY RETRIEVAL:                       *
*---------------------------------------*
*Dummy retrieval for demo purposes.
*Data at header level.
SELECT *
  FROM bkpf
  INTO TABLE lt_bkpf
 UP TO 10 ROWS.

IF sy-subrc EQ 0.

* Sort and delete adjacent duplicates not necessary as
* we are sorting and deleting by primary keys. However, we
* will leave like that to remember that its a best practice
* to sort and delete adjacents duplicates when using for
* all entries.
  SORT lt_bkpf BY bukrs belnr gjahr.
  DELETE ADJACENT DUPLICATES FROM lt_bkpf COMPARING bukrs belnr gjahr.

* Data at item level.
  SELECT *
    FROM bseg
    INTO TABLE lt_bseg
 FOR ALL ENTRIES IN lt_bkpf
   WHERE bukrs EQ lt_bkpf-bukrs
     AND belnr EQ lt_bkpf-belnr
     AND gjahr EQ lt_bkpf-gjahr.

  IF sy-subrc EQ 0.

*   Sorting not required but its just for
*   information purposes.
    SORT lt_bseg BY bukrs belnr gjahr.

  ENDIF.

ENDIF.

*---------------------------------------*
*SY-TABIX (LOOP):                       *
*---------------------------------------*
LOOP AT lt_bkpf INTO lst_bkpf.

* Displaying the SY-TABIX when use
* inside a loop.
  WRITE: /1 sy-vline,
         2(40) \'SY-TABIX (LOOP BKPF):\',
         41 sy-vline,
         50(10) sy-tabix,
         61 sy-vline.

  WRITE:/1(61) sy-uline.

ENDLOOP.

WRITE:/1 sy-uline.

*---------------------------------------*
*SY-TABIX (READ STATEMENT):             *
*---------------------------------------*
LOOP AT lt_bkpf INTO lst_bkpf.

  READ TABLE lt_bseg
  TRANSPORTING NO FIELDS
  WITH KEY bukrs = lst_bkpf-bukrs
           belnr = lst_bkpf-belnr
           gjahr = lst_bkpf-gjahr
           BINARY SEARCH.

  IF sy-subrc EQ 0.

*   SY-TABIX will returns the position of record
*   found in the \'LT_BSEG\'.
    WRITE: /1 sy-vline,
           2(40) \'SY-TABIX (READ BSEG):\',
           41 sy-vline,
           50(10) sy-tabix,
           61 sy-vline.

    WRITE:/1(61) sy-uline.

  ENDIF.

* Clearing necessary items.
  CLEAR:
    lst_bkpf.

ENDLOOP.

WRITE:/1 sy-uline.

*---------------------------------------*
*SY-INDEX (DO-ENDDO or WHILE-ENDWHILE): *
*---------------------------------------*
DO 5 TIMES.

* Displaying the SY-INDEX when use
* inside a DO loop, same results is 
* expected inside a WHILE loop.
  WRITE: /1 sy-vline,
         2(40) \'SY-INDEX (DO LOOP):\',
         41 sy-vline,
         50(10) sy-index,
         61 sy-vline.

  WRITE:/1(61) sy-uline.

ENDDO.

The results:

\"image002\"