Patrocinado por
Patrocinado por Inetum

O caminho mais curto para ir de SELECT a RANGE

images/thumbnail.jpg - Thumbnail

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: <kunnr> 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 <kunnr>.
  wa_kunnr-low = <kunnr>.
  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.