Macros - Velocidade de ponta
Normalmente quando há um pedaço de código que pretendemos reutilizar várias vezes, transformamo-lo numa sub-rotina que pode depois ser invocada repetidamente. Embora a SAP não saiba estruturar o seu próprio código, ainda assim, o ABAP, coitadinho, permite-o. E até disponibiliza várias alternativas para modularizar o código. Eu conto quatro alternativas que listo aqui, da mais rígida para a mais flácida: METHOD, FUNCTION, FORM, DEFINE. Se os 3 primeiros são já familiar de todos, o último - DEFINE - quase ninguém usa. O DEFINE permite definir macros em ABAP. E o que são macros? São sub-rotinas aparentes.
Aparentes porquê?
Porque enquanto nos outros três casos há de facto uma estruturação da lógica de execução do programa, no caso dos macros, esta estruturação acontece apenas a fingir, porque durante a compilação, na verdade os macros são substituídos pelo código que representam.
Então um exemplo: vou definir um macro para fazer continhas.
DEFINE faz_continha.
&1 = &1 + &2.
END-OF-DEFINITION.
DATA: var type i.
var = 0.
DO 100000 TIMES.
faz_continha var 1.
ENDDO.
Aparentemente isto é semelhante à utilização de FORMs. A diferença é que, durante a compilação, os macros são directamente substituídos pelo código que representam. Por isso mesmo nem sequer há qualquer validação de tipos de dados.
Além de ser, portanto, uma forma meio manhosa de estruturar o código, ainda sofre do problema não permitir fazer debug.
Então afinal qual é a vantagem? Vamos ver. A alternativa normal seria:
DATA: var type i.
var = 0.
DO 1000000 TIMES.
PERFORM faz_continha USING 1 CHANGING var.
ENDDO.
FORM faz_continha USING v2 CHANGING v1.
v1 = v1 + v2.
ENDFORM.
Se usarmos a transacção SE30 para comparar o tempo que cada uma demora, temos uma surpresa:
DEFINE: 6.439ms FORM: 773.882ms
Ou seja, a versão que usa macros é mais de 100x mais rápida do que a versão normal com sub-rotinas. Conclusão: a grande vantagem dos macros é velocidade.
O Abapinho saúda-vos.