"
Apoiado por

RANGE instantâneo – É só juntar água

Vou ensinar-te uma fórmula mágica para gerar um RANGE em que praticamente é só juntar água.

Imagina que queres fazer um RANGE a partir de uma seleção da base de dados para depois o utilizar num outro SELECT qualquer. Claro que o poderias fazer assim:


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

E assim usaste 15 linhas de código e 4 variáveis.
Mas vê lá agora esta alternativa:


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

Repara como logo no SELECT renomeio logo o campo KUNNR para LOW por forma a poder metê-lo directamente no sítio certo do RANGE.
Repara também com o comando MODIFY actualiza de uma só vez todas as linhas do RANGE com apenas os campos que explicitamos.

E assim, usando apenas 10 linhas de código e 2 variáveis ficas com uma coisa que é mais sintética, mais bonita de se olhar e que manda muito mais sainete.

Granda pinta, não? É só vantagens.

Eu farto-me de usar isto.

Atenção que os RANGEs têm um limite de (não tenho a certeza mas acho serem) 2000 linhas.

O Abapinho saúda-vos.

2 comentários a “RANGE instantâneo – É só juntar água”

  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


Acerca do Abapinho
O Abapinho é suportado pelo WordPress
Artigos (RSS) e Comentários (RSS).