O comando collect é usado para fazer a compressão dos dados (idem o comando APPEND), tendo como principal diferença que não permite ter duas chaves para valores diferentes, collect do inglês para o português é recolha, significando recolher ao encontrar um dado igual. O dado igual significa uma chave para a tabela interna, podendo ser qualquer tipo de dado, por default o primeiro campo da tabela interna é a chave primaria da tabela Entendendo o que o collect faz realmente: Exemplo:
DATA: BEGIN OF T_COLLECT OCCURS 0,
NOME(20) TYPE C,
DESCRICAO(20) TYPE C,
VALOR TYPE I,
END OF T_COLLECT.
DATA WA_T_COLLECT LIKE T_COLLECT.
Temos a tabela T_COLLECT contendo três campos, quando carregamos os valores para a tabela primeiro é carregado uma HEADER TABLE ou uma WORK AREA, para depois anexar estes valores para a tabela interna. Ex.:Carregando a HEADER TABLE
T_COLLECT-NOME = ‘UDERSON’.
T_COLLECT-DESCRICAO = ‘TESTE 1 DO COLLECT’.
T_COLLECT-VALOR = 100.
Carregando a WORK AREA:
WA_T_COLLECT-NOME = ”.
WA_T_COLLECT-DESCRICAO = ‘TESTE 3 DO COLLECT’.
WA_T_COLLECT-VALOR = 300.
Após carregar a HEADER TABLE ou a WORK AREA, é necessário anexar os valores para a tabela interna, por dedução usamos o comando APPEND, que transfere os dados da HEADER ou da WORK AREA para tabela interna, criando a cada APPEND uma nova linha de dados, o comando COLLECT como já citado faz a mesma coisa, porem com uma diferença, quando a chave que está na HEADER ou na WORK AREA é encontrada ja inserida na tabela interna o comando COLLECT verifica todos os campos numéricos, somando cada campo relativo. Então o que realmente o comando COLLECT faz é encontrar valores chaves iguais e somar os campos numéricos, quando a chave é igual porem os campos textos são diferentes ele cria uma nova linha de valores, onde as somas dos valores numéricos não são realizadas por conter dados textos diferentes. Carregando a HEADER TABLE anexando os valores conforme a explicação.
T_COLLECT-NOME = ‘UDERSON’.
T_COLLECT-DESCRICAO = ‘TESTE 1 DO COLLECT’.
T_COLLECT-VALOR = 100.
COLLECT T_COLLECT.
Carregando a WORK AREA e transferindo os valores para a tabela interna confoem a explicação :
WA_T_COLLECT-NOME = ”.
WA_T_COLLECT-DESCRICAO = ‘TESTE 3 DO COLLECT’.
WA_T_COLLECT-VALOR = 300.
COLLECT WA_T_COLLECT INTO T_COLLECT.
Ob.: Quando os valores são transferidos apartir de uma WORK AREA, a HEADER da TABELA INTERNA não é carregada.
Exemplo:
REPORT Z_SINTAXE_GERAL.
DATA: BEGIN OF T_COLLECT OCCURS 0,
NOME(20) TYPE C,
DESCRICAO(20) TYPE C,
VALOR TYPE I,
TOTAL TYPE I,
END OF T_COLLECT.
DATA WA_T_COLLECT LIKE T_COLLECT.
DATA: CONT TYPE I VALUE 1.
T_COLLECT-NOME = ‘UDERSON’.
T_COLLECT-DESCRICAO = ‘TESTE 1 DO COLLECT’.
T_COLLECT-VALOR = 100.
T_COLLECT-TOTAL = 200.
COLLECT T_COLLECT.
T_COLLECT-NOME = ‘LEANDRO’.
T_COLLECT-DESCRICAO = ‘TESTE 2 DO COLLECT’.
T_COLLECT-VALOR = 1000.
T_COLLECT-TOTAL = 200.
COLLECT T_COLLECT.
T_COLLECT-NOME = ‘UDERSON’.
T_COLLECT-DESCRICAO = ‘TESTE 1 DO COLLECT’.
T_COLLECT-VALOR = 400.
T_COLLECT-TOTAL = 200.
COLLECT T_COLLECT.
T_COLLECT-NOME = ‘LEANDRO’.
T_COLLECT-DESCRICAO = ‘TESTE 2 DO COLLECT’.
T_COLLECT-VALOR = 1300.
T_COLLECT-TOTAL = 200.
COLLECT T_COLLECT
T_COLLECT-NOME = ‘GUILHERME’.
T_COLLECT-DESCRICAO = ‘TESTE 2 DO COLLECT’.
T_COLLECT-VALOR = 300.
T_COLLECT-TOTAL = 200.
COLLECT T_COLLECT.
WA_T_COLLECT-NOME = ”.
WA_T_COLLECT-DESCRICAO = ‘TESTE 3 DO COLLECT’.
WA_T_COLLECT-VALOR = 300.
WA_T_COLLECT-TOTAL = 200.
COLLECT WA_T_COLLECT INTO T_COLLECT.
WA_T_COLLECT-NOME = ”.
W_T_COLLECT-DESCRICAO = ‘TESTE 3 DO COLLECT’.
WA_T_COLLECT-VALOR = 300.
WA_T_COLLECT-TOTAL = 200.
COLLECT WA_T_COLLECT INTO T_COLLECT.
WA_T_COLLECT-NOME = ”.
WA_T_COLLECT-DESCRICAO = ‘TESTE 3 DO COLLECT’.
WA_T_COLLECT-VALOR = 300.
WA_T_COLLECT-TOTAL = 200.
COLLECT WA_T_COLLECT INTO T_COLLECT.
LOOP AT T_COLLECT.
WRITE: ‘NOME: ‘, T_COLLECT-NOME, ‘ DESCRIÇÃO: ‘, T_COLLECT-DESCRICAO, ‘ VALOR: ‘, T_COLLECT-VALOR, ‘TOTAL:’, T_COLLECT-TOTAL.
SKIP.
ENDLOOP.
T_COLLECT-NOME = ‘UDERSON’.
T_COLLECT-DESCRICAO = ‘TESTE 1 DO COLLECT’.
T_COLLECT-VALOR = 100.
T_COLLECT-TOTAL = 200.
APPEND T_COLLECT.
T_COLLECT-NOME = ‘LEANDRO’.
T_COLLECT-DESCRICAO = ‘TESTE 2 DO COLLECT’.
T_COLLECT-VALOR = 1000.
T_COLLECT-TOTAL = 200.
APPEND T_COLLECT.
T_COLLECT-NOME = ‘UDERSON’.
T_COLLECT-DESCRICAO = ‘TESTE 1 DO COLLECT’.
T_COLLECT-VALOR = 400.
T_COLLECT-TOTAL = 200.
APPEND T_COLLECT.
T_COLLECT-NOME = ‘LEANDRO’.
T_COLLECT-DESCRICAO = ‘TESTE 2 DO COLLECT’.
T_COLLECT-VALOR = 1300.
T_COLLECT-TOTAL = 200.
APPEND T_COLLECT.
T_COLLECT-NOME = ‘GUILHERME’.
T_COLLECT-DESCRICAO = ‘TESTE 2 DO COLLECT’.
T_COLLECT-VALOR = 300.
T_COLLECT-TOTAL = 200.
APPEND T_COLLECT.
LOOP AT T_COLLECT.
IF ( SY-TABIX > 4 ).
IF ( CONT = 1 ).
ULINE.
ENDIF.
WRITE: ‘NOME: ‘, T_COLLECT-NOME, ‘ DESCRIÇÃO: ‘, T_COLLECT-DESCRICAO, ‘ VALOR: ‘, T_COLLECT-VALOR, ‘TOTAL:’, T_COLLECT-TOTAL.
SKIP.
CONT = CONT + 1.
ENDIF.
ENDLOOP.
Filed under: Artigos ABAP/4 - Basicos | Leave a comment »