Alguns campos têm comprimentos diferentes em tabelas diferentes, como ‘obj_name' é um char40 em TADIR mas char120 em E071. Digamos que você queira selecionar este campo de TADIR e então selecionar dados de E071 passando o valor deste campo. O código a seguir não é possível:
SELECT * FROM E071 INTO TABLE it WHERE obj_name = tadir-obj_name.
Aqui está uma solução prática em vez disso:
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 a variável que armazenará os valores de obj_name de tadir.
DATA: obj_name_range TYPE RANGE OF tadir-obj_name.
- Obtenha dados de tadir.
SELECT * INTO TABLE it_tadir FROM tadir.
- Passe o valor de obj_name de tadir para o range (popular). Opção 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.
Opção 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 o range para selecionar de E071.
SELECT * INTO TABLE it_E071 FROM E071 WHERE obj_name IN obj_name_range.
Na cláusula WHERE use IN em vez de = pois é um range. 5. Usando o range com FOR ALL ENTRIES IN Se o seu SELECT tiver uma condição FOR ALL ENTRIES IN, você não poderá usar outro IN para a condição do range como foi usado acima. Em vez disso, você poderia usar o exemplo abaixo.
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.