"
Apoiado por

LOOP ASSIGNING em vez de LOOP INTO

No princípio era o INTO.
Aliás, no princípio nem sequer era o INTO.

No final do século XX o mais comum era fazer-se isto:


DATA: BEGIN OF itbl OCCURS 0,
    kunnr LIKE kna1-kunnr,
    name1 LIKE kna1-name1,
  END OF itbl.

SELECT (...)

LOOP AT itbl.
  (...)
  itbl-name1 = itbl-kunnr.
  MODIFY itbl.
ENDLOOP.

O que é uma grande javardice porque tabelas com área de trabalho implícita são no mínimo confusas e ambíguas.

Depois, no início do século contemporâneo, começou a ganhar-se algum pudor e passou a fazer-se isto:


TYPES: BEGIN OF ty_kna1,
    kunnr TYPE kunnr,
    name1 TYPE name1,
  END OF ty_kna1.

DATA: lt_kna1 TYPE STANDARD TABLE OF ty_kna1,
      ls_kna1 LIKE LINE OF lt_kna1.

SELECT (...)

LOOP AT lt_kna1 INTO ls_kna1.
  (...)
  ls_kna1-name1 = ls_kna1-kunnr.
  MODIFY lt_kna1 FROM ls_kna1.
ENDLOOP.

É melhorzinho porque já usa uma área de trabalho explícita. Mas mesmo assim obriga a que o ABAP passe boa parte do tempo a copiar os dados da lt_kna1 para a ls_kna1 e vice-versa sem necessidade nenhuma e ainda requer a invocação explícita do MODIFY.

Mas agora que a primeira década do novo século findou e que até as festas dos anos 80 e dos Bee Gees já começam a caducar e a dar lugar a festas dos anos 90 com Pearl Jam, já não há desculpa para não fazerem assim:


TYPES: BEGIN OF ty_kna1,
    kunnr TYPE kunnr,
    name1 TYPE name1,
  END OF ty_kna1.

DATA: lt_kna1 TYPE STANDARD TABLE OF ty_kna1.
FIELD-SYMBOLS: <lt_kna1> TYPE ty_kna1.

SELECT (...)

LOOP AT lt_kna1 ASSIGNING <lt_kna1>.
  <lt_kna1>-name1 = <lt_kna1>-kunnr.
ENDLOOP.

E é esta a solução mais rápida de todas (pré-HANA, claro). Já não é preciso fazer MODIFY porque qualquer alteração feita a <lt_kna1> é imediatamente reflectida na lt_kna1 visto que o field-symbol não é mais do que um ponteiro.

Em pleno século XXI, evite-se usar áreas de trabalho sempre que possível. Assim de repente diria que a única circunstância em que ainda fazem sentido é quando se pretende inserir novos registos numa tabela interna.

O Abapinho saúda-vos.

6 comentários a “LOOP ASSIGNING em vez de LOOP INTO”

  1. Leandro Diz:

    Parabéns pela matéria. Muito boa!!

  2. André Diz:

    E tem muita gente que ainda diz que utilizar field-symbols em loop é estranho… Mas depois que se acostuma isso é muito bom… Só tem um único problema, não funciona Watchpoint :(

  3. Alex Lima Ferreira Diz:

    Parabéns pelo seu post Godinho.
    Ficou bem facil de entender. Sou novo no ramo e vou precisar bastante de dicas como essas.
    Obrigado.

  4. susan Diz:

    Very clear and precise with a smile

  5. Rafael Chagas Diz:

    Parabéns.
    É uma ótima maneira de melhorar performance.

  6. Welber T. Diz:

    Fala sério, o ganho é mínimo, para não dizer nulo ao fazer um loop assign e perde toda facilidade de análise futura usando watchpoint. Coloca um LOOP INTO e um LOOP ASSIGN dentro de uma transação que calcula o tempo e perfomance e me dizer se a diferença vale a pena. Performance deve levar em consideração não apenas o resultado final em tempo, mas também a facilidade de manutenção futura. Ao meu ver, fazer isso em todos os casos, é errado. Generalizar para mim é sempre o maior erro de programação.

Deixe um comentário


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