O caminho mais curto para ir de SELECT a RANGE

Hoje debruçamo-nos sobre como tentar optimizar o código para transformar um SELECT num RANGE.
Comecemos pelo código mais simplório, sem qualquer tentativa de optimização:
DATA: lt_kunnr TYPE STANDARD TABLE OF kunnr,
lr_kunnr TYPE RANGE OF kunnr,
wa_kunnr LIKE LINE OF lr_kunnr.
FIELD-SYMBOLS: LIKE LINE OF lt_kunnr.
SELECT kunnr
INTO CORRESPONDING FIELDS OF TABLE lt_kunnr
FROM kna1.
wa_kunnr-sign = 'I'.
wa_kunnr-option = 'EQ'.
LOOP AT lt_kunnr ASSIGNING .
wa_kunnr-low = .
APPEND wa_kunnr TO lr_kunnr.
ENDLOOP.
- 7 comandos
- 4 variáveis
- 15 linhas
Há 8 anos atrás sugeri que podia ser um pouco melhorado:
DATA: r_kunnr TYPE RANGE OF kunnr,
wa_kunnr LIKE LINE OF r_kunnr.
SELECT kunnr AS low
INTO CORRESPONDING FIELDS OF TABLE r_kunnr
FROM kna1.
wa_kunnr-sign = 'I'.
wa_kunnr-option = 'EQ'.
MODIFY r_kunnr FROM wa_kunnr TRANSPORTING sign option WHERE low <> ''.
- 4 comandos
- 2 variáveis
- 10 linhas
Entretanto, com o ABAP 7.40 a manipulação de tabela internas sofisticou e permite simplificar mais:
DATA r_kunnr TYPE RANGE OF kunnr.
SELECT kunnr AS low
INTO CORRESPONDING FIELDS OF TABLE r_kunnr
FROM kna1.
r_kunnr = VALUE #( FOR wa IN r_kunnr
option = 'EQ' sign = 'I'
( low = wa-low ) ).
- 2 comandos
- 1 variável!
- 9 linhas
Mas depois o Sérgio Fraga mostrou-me que o SQL também sofisticou e permite agora fazer algo que não podia ser mais simples:
DATA r_kunnr TYPE RANGE OF kunnr.
SELECT 'EQ' AS option, 'I' AS sign, kunnr AS low
INTO CORRESPONDING FIELDS OF TABLE @r_kunnr
FROM kna1.
- 1 comando!
- 1 variável!
- 5 linhas
Nada mau! Melhor só mesmo se conseguisse declarar a variável inline mas não sei como o poderia fazer.
Actualização: o Gabriel mostrou que é de facto possível declarar a variável inline:
SELECT 'I' AS sign, 'EQ' AS option, kunnr AS low, kunnr AS high
INTO TABLE @DATA(r_kunnr)
FROM kna1.
É apenas fundamental que os campos sejam listados nesta ordem, incluindo o HIGH, para que a tabela interna gerada inline seja considerada um RANGE válido. Obrigado Gabriel!
- 1 comando!
- 0 variáveis!
- 3 linhas!
Os 7 comandos, 4 variáveis e 15 linhas ficaram reduzidos a 1 comando e 3 linhas. Agora sim, parece-me impossível simplificar mais!
O Abapinho saúda-vos.
7 de dezembro de 2019 às 20:17
Porque a meio passamos para lfa1?
8 de dezembro de 2019 às 3:20
Ops! Obrigado! Já substituí todas as LFA1 por KNA1 :)