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.
7 de Julho de 2011 às 18:34
Parabéns pela matéria. Muito boa!!
15 de Setembro de 2011 às 21:00
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 :(
27 de Setembro de 2011 às 14:42
Parabéns pelo seu post Godinho.
Ficou bem facil de entender. Sou novo no ramo e vou precisar bastante de dicas como essas.
Obrigado.
21 de Março de 2013 às 13:18
Very clear and precise with a smile
31 de Outubro de 2013 às 0:24
Parabéns.
É uma ótima maneira de melhorar performance.
23 de Dezembro de 2013 às 16:35
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.