"
Apoiado por

Obtém valores únicos de campo de tabela interna

Em SQL consegue-se obter os valores únicos de um campo recorrendo ao DISTINCT. Quando os dados já estão numa tabela interna, antes do ABAP 7.40 tinha de se fazer um LOOP e um COLLECT.

Mas agora que vivemos em tempos mais modernos, há uma forma simples e elegante que consegue o mesmo com um único comando.

Assim:


TYPES ty_t_land1 TYPE STANDARD TABLE OF land1 WITH KEY table_line.

SELECT * FROM kna1 INTO TABLE @data(t_kna1).

DATA(t_land1) =  VALUE ty_t_land1(
    FOR GROUPS land1 OF wa IN t_kna1
    GROUP BY wa-land1 ASCENDING
    WITHOUT MEMBERS
    ( land1 ) ).

Bonito? Bonito!

Actualizaçõa: o Vasco Nascimento notou que o código acima só funciona com estruturas simples (flat) e propôs uma alternativa que também funciona com estruturas complexas (deep):


TYPES:
  BEGIN OF ty_land1,
    land1 TYPE land1,
  END OF ty_land1.
TYPES ty_t_land1 TYPE STANDARD TABLE OF ty_land1.

SELECT * FROM kna1 INTO TABLE @data(t_kna1).

DATA(lt_land1) = VALUE ty_t_land1(
  FOR GROUPS land1 OF wa IN t_kna1
  GROUP BY wa-land1 ASCENDING
  WITHOUT MEMBERS
  ( land1 = land1 ) ).

Obrigado Vasco!

O Abapinho saúda-vos.

Um comentário a “Obtém valores únicos de campo de tabela interna”

  1. Vasco Nascimento Diz:

    Hi,
    The code above is for flat tables, another version of this code that works with structured tables:

    TYPES: begin of ty_land1,
    land1 type land1
    end of ty_land1.
    TYPES ty_t_land1 TYPE STANDARD TABLE OF ty_land1.

    DATA: lt_land1 type ty_t_land1.

    SELECT * FROM kna1 INTO TABLE @data(t_kna1).

    lt_land1 = VALUE #(
    FOR GROUPS land1 OF wa IN t_kna1
    GROUP BY wa-land1 ASCENDING
    WITHOUT MEMBERS
    ( land1 = land1 ) ).

Deixe um comentário


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