Some fields have different lengths in different tables, like ‘obj_name' is a char40 in TADIR but char120 in E071. Let’s say you want to select this field from TADIR and then select data from E071 by passing this field value. The following code is not possibe:
SELECT * FROM E071 INTO TABLE it WHERE obj_name = tadir-obj_name.
Here’s one practical solution instead:
DATA: obj_name_range TYPE RANGE OF tadir-obj_name.
SELECT * INTO TABLE it_tadir FROM tadir.
LOOP AT it_tadir INTO data(wa_tadir).
APPEND VALUE #( sign = 'I'
option = 'EQ'
low = it_tadir-obj_name ) TO obj_name_range.
ENDLOOP.
SELECT * INTO TABLE it_E071 FROM E071 WHERE obj_name IN obj_name_range.
- Declare the variable that will store the values of obj_name from tadir.
DATA: obj_name_range TYPE RANGE OF tadir-obj_name.
- Get data from tadir.
SELECT * INTO TABLE it_tadir FROM tadir.
- Pass obj_name’s value from tadir to the range (populate). Option 1:
LOOP AT it_tadir INTO data(wa_tadir).
APPEND VALUE #( sign = 'I'
option = 'EQ'
low = it_tadir-obj_name ) TO obj_name_range.
ENDLOOP.
Option 2:
DATA obj_name_range TYPE RANGE OF e071-obj_name.
obj_name_range = VALUE #( FOR <fs_tadir> IN it_tadir
( sign = 'I'
option = 'EQ'
low = <fs_tadir>-obj_name ) ).
- Use the range to select from E071.
SELECT * INTO TABLE it_E071 FROM E071 WHERE obj_name IN obj_name_range.
In WHERE clause use IN instead of = as it’s a range. 5. Using the range with FOR ALL ENTRIES IN If your SELECT has a FOR ALL ENTRIES IN condition you won’t be able to use another IN for the range condition like it was used above. Instead you could use the exemple below.
SELECT * INTO TABLE it_E071 FROM E071 FOR ALL ENTRIES IN it_tab2 WHERE field = it_tab2-field.
DELETE it_E071 WHERE obj_name NOT IN obj_name_range.