Patrocinado por
Patrocinado por Inetum

MOVE-CORRESPONDING entre duas tabelas respeitando a chave

images/thumbnail.jpg - Thumbnail

O Abapinho não tem falado muito sobre o 7.40 porque as suas novidades têm já sido amplamente descritas em vários sites. Tentamos não inventar a roda.

Mas há pequenas pérolas úteis que ainda são pouco conhecidas. Esta é sobre uma delas.

Tens como objectivo preencher esta tabela T_DATA com itens de documentos financeiros:

BSEG-BUKRS
BSEG-BELNR
BSEG-GJAHR
BSEG-BUZEI
BSEG-LIFNR
LFA1-NAME1

Imagina a tabela já está preenchida com dados da BSEG, faltando preencher a coluna NAME1 que tem de ser obtida na LFA1. E que tens já outra tabela interna T_LFA1 preenchida com os dados da LFA1:

LFA1-LIFNR
LFA1-NAME1

Até à 7.40 terias de fazer algo neste género:

LOOP AT t_data ASSIGNING <s_data>.
  READ TABLE t_lfa1 ASSIGNING <s_lfa1> WITH KEY lifnr = <s_data>-lifnr.
  IF sy-subrc = 0.
    <s_data>-name1 = <s_lfa1>-name1.
  ENDIF.
ENDLOOP.

Agora olha só esta maravilha na 7.40:

t_data = CORRESPONDING #( t_data FROM t_lfa1 USING lifnr = lifnr ).

Coisa mais linda! Num único comando, a coluna NAME1 da T_DATA fica preenchida a partir das tabela T_LFA1, respeitando a chave LIFNR. E podes adicionar-lhe um MAPPING caso alguns dos campos não sejam iguais nas duas estruturas.

O que até aqui dava um trabalhão porque obrigava a LOOP, READ TABLE, variáveis auxiliares e atribuições manuais, reduz-se agora a uma única operação de uma linha, que ainda por cima é mais legível e fácil de compreender!

E o novo commando CORRESPONDING tem uma série de afinações possíveis. Dá, por exemplo, para definir quais os campos que se quer copiar e quais os que não se quer copiar. Por exemplo, assim copiamos apenas o NAME1 sem correr o risco de destruir os restantes campos:

t_data = CORRESPONDING #( t_data FROM t_lfa1 USING lifnr = lifnr
                          MAPPING name1 EXCEPT * ).

O Abapinho saúda-vos.