Patrocinado por
Patrocinado por Inetum

Mais RANGEs, menos SELECTs

images/thumbnail.jpg - Thumbnail

O dicionário diz o seguinte do verbete “estilo”: “conjunto de aspectos formais e recursos expressivos que caracterizam um texto”.

Dá mais gosto ler textos com estilo do que textos sem estilo. Se o ABAP é uma linguagem, um programa em ABAP é um texto. Há programas que, no que toca ao estilo, parecem escritos com os pés; enquanto há outros que se poderia jurar que a pena que os escreveu deixou-se guiar pelas alvas mãos de uma qualquer donzela do século XVIII afligida por males de amor. Felizmente penso que não é possível escrever programas em ABAP tão pirosos quanto esta última frase.

Aqui no Abapinho usa-se a etiqueta “estilo” para identificar artigos que falam sobre isso mesmo: estilo. Estes artigos tentam encontrar formas de melhorar o estilo dos programas ABAP. Esta é uma das etiquetas favoritas do Abapinho como podes ver aqui. E isto que estás a ler é mais um desses artigos.

Adiante.

É muito comum ver código coisas como isto:

IF i_kunnr IS INITIAL.
  IF i_name1 IS INITIAL.
    SELECT SINGLE * INTO w_kna1 FROM kna1.
  ELSE.
    SELECT SINGLE * INTO w_kna1 FROM kna1
      WHERE name1 = i_name1.
  ENDIF.
ELSE.
  IF i_name1 IS INITIAL.
    SELECT SINGLE * INTO w_kna1 FROM kna1
      WHERE kunnr = i_kunnr.
  ELSE.
    SELECT SINGLE * INTO w_kna1 FROM kna1
      WHERE kunnr = i_kunnr AND name1 = i_name1.
  ENDIF.
ENDIF.

Ou seja, temos dois parâmetros opcionais que podemos usar para seleccionar um registo da KNA1 e conforme estes venham preenchidos fazemos o SELECT adequado. Tem estilo? Não. Vou mostrar-te outra forma de fazer o mesmo:

DATA: r_kunnr TYPE RANGE OF kunnr,
          s_kunnr LIKE LINE OF r_kunnr,
          r_name1 TYPE RANGE OF name1,
          s_name1 LIKE LINE OF r_name1.

IF i_kunnr IS NOT INITIAL.
  s_kunnr-option = 'EQ'.
  s_kunnr-sign = 'I'.
  s_kunnr-low = i_kunnr.
  APPEND s_kunnr TO r_kunnr.
ENDIF.

IF i_name1 IS NOT INITIAL.
  s_name1-option = 'EQ'.
  s_name1-sign = 'I'.
  s_name1-low = i_name1.
  APPEND s_name1 TO r_name1.
ENDIF.

SELECT SINGLE * INTO w_kna1 FROM kna1
  WHERE kunnr IN r_kunnr AND name1 IN r_name1.

Que tal assim? Faz a mesma coisa, mas tem muito mais estilo.

Outra forma seria usar um SELECT dinâmico, mas neste caso seria desnecessariamente complicado.

O Abapinho saúda-vos.