"
Supported by

Instant RANGE – just add water

I’m going to teach you a magic formula for creating a RANGE that is almost as easy as just adding water.

Imagine that you want to create a RANGE from a database selection to then use it in another SELECT. Obviously you can do it like this:


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 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.

And here you used 15 lines of code and 4 variables.
But now look at this alternative:


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 <> ''.

Note that right away in the SELECT the field KUNNR is renamed LOW so that it can be go directly in the right place in the RANGE.
Note also how the command MODIFY updates all the lines of the RANGE at the same time using only the fields that we have specified.

Therefore using only 10 lines of code and 2 variables you are left with something more concise, more attractive to look at and much more fun.

Cool, huh? And only advantages.

I use it all the time.

Note that the RANGEs have a 2000-line limit (not sure about this but think I’m right).

Greetings from Abapinho

2 comentários a “Instant RANGE – just add water”

  1. Marco Silva Diz:

    Tecnicamente acho muito bem visto, mas na pratica nao vejo bem em que situação usar isso, pois para seleccionar noutra tabela em vez de criar um range faria mais rapidamente um join ou um for all entries.

    Quanto ao limite de X linhas, julgo que tem exclusivamente a ver com o tamanho admitido para uma clausula WHERE (64K na maioria das vezes) e o uso de um range vai gerar uma clausula tipo where x = 1 or x = 2 or (…) x = 2000. Mas mesmo nesse caso se ja se tiver um range, fazendo um for all entries do range em vez de o utilizar directamente na clausula where contorna-se o problema do dump.

    Espero ter trazido uma opiniao util ;-)

  2. Nuno Godinho Diz:

    Olá Marco,

    Eu uso normalmente em pequenos ranges. Imagina que queres seleccionar dados de uma tabela filtrados por tipo de documento e também por empresa. Pressupõe que se as tabelas de configuração estiverem vazias deverás seleccionar tudo. Neste caso o problema do FOR ALL ENTRIES é que só podes usar um por SELECT. O problema do INNER JOIN é que se não houver registos de tipos de documento ou de empresas ele devolverá zero linhas. Neste caso os ranges dão jeito. É certo que parece um exemplo rebuscado mas a verdade é que uso frequentemente.

    Outro exemplo é a possibilidade de este conjunto de tipos de documento e/ou empresas fazerem parte de uma configuração que depois é usada em muitos SELECTs. É certo que podes fazer sempre INNER JOIN mas não só vais ler estas tabelas várias vezes em vez de apenas uma como também terás de repetir em todos os SELECTs os critérios para obter apenas os tipos de documento e empresas desejados.

    Espero ter sido claro..

Deixe um comentário


About Abapinho
Abapinho runs on WordPress
Articles (RSS) e Comments (RSS).