The ABAP select statement command has a number of options and additions which allows you to fine tune your database selection. One such
addition is the 'FOR ALL ENTRIES' statement. This allows you to build an internal table and then restrict thew second
database select to only get entries contained in this itab.
Below is a simple ABAP code example of how to select data using the 'FOR ALL ENTRIES' addition! It basically
builds an internal table containing a list of purchase order numbers(EBELN) from table EKKO and then only retrieves
entries from EKPO where the PO number exists in this internal table.
There is a strange feature that happens if you use an empty internal table as the for entries restriction
along side a basic where clause.. see below for full details and example ABAP code.
REPORT ZSELECTCOMMAND. *Select FOR ALL ENTRIES command data: it_ekko type STANDARD TABLE OF ekko, wa_ekko like line of it_ekko, it_ekpo type standard table of ekpo, wa_ekpo like line of it_ekpo. SELECT * UP TO 10 ROWS "only return first 10 hits FROM ekko INTO TABLE it_ekko. loop at it_ekko into wa_ekko. write:/ wa_ekko-ebeln. endloop. IF sy-subrc EQ 0. * The FOR ALL ENTRIES comand only retrieves data which matches * entries within a particular internal table. SELECT * FROM ekpo INTO TABLE it_ekpo FOR ALL ENTRIES IN it_ekko WHERE ebeln EQ it_ekko-ebeln. write:/ 'FOR ALL ENTRIES comand '. loop at it_ekpo into wa_ekpo. write:/ wa_ekpo-ebeln, wa_ekpo-ebelp. endloop. ENDIF.
This leads me onto the strange feature mentioned above that I would not really expect to happen, although I'm sure there
is a logical reason for it. If you use the FOR ALL ENTRIES addition, but use an itab that is empty
and you also use a standard where clause entry such as where "EBELN EQ WA_EKKO-EBELN" what would you expect to happen?
....Remember an empty for all entries table returns everything!!! but would you expect it to still restrict on the
other where clause entry? See code below for demonstration of what happens (SPOILER ALERT: EBELN EQ WA_EKKO-EBELN is ignored and all
entries are retrieved).
*Empty for all entries table DATA: gd_lines TYPE i. SELECT * FROM ekpo INTO TABLE it_ekpo WHERE ebeln EQ wa_ekko-ebeln. DESCRIBE TABLE it_ekpo LINES gd_lines. WRITE:/ 'Number of lines without for all entries:', gd_lines. *Restricts based on entries in it_ekko and ebeln EQ wa_ekko-ebeln SELECT * FROM ekpo INTO TABLE it_ekpo FOR ALL ENTRIES IN it_ekko WHERE ebeln EQ it_ekko-ebeln AND ebeln EQ wa_ekko-ebeln. DESCRIBE TABLE it_ekpo LINES gd_lines. WRITE:/ 'Number of lines with for all entries itab:', gd_lines. *Only difference to the above code is that it_ekko is empty REFRESH it_ekko. SELECT * FROM ekpo INTO TABLE it_ekpo FOR ALL ENTRIES IN it_ekko WHERE ebeln EQ it_ekko-ebeln AND ebeln EQ wa_ekko-ebeln. DESCRIBE TABLE it_ekpo LINES gd_lines. WRITE:/ 'Number of lines with empty for all entries itab:', gd_lines.
Result output