Evitar mensagens dinâmicas
Qual é, digam lá, a melhor coisinha que o ABAP tem? É, digo eu, poder fazer where used em cima de tudo o que mexe.
E no entanto, esta maravilhosa funcionalidade só funciona maravilhosamente quando as coisas não são invocadas dinamicamente. Eu uso o where used amiúde para descobrir onde uma determinada mensagem está a ser usada. Ora não é nada incomum encontrar chamadas dinâmicas a mensagens, principalmente em casos onde as mensagens não são enviadas directamente para o utilizador mas sim, por exemplo, para o Application Log. Neste caso é normal encontrar coisas tipo:
PERFORM trata_mensagem1 USING 'E' '056' 'ZSD' a b c.
FORM trata_mensagem1 USING msgty msgno msgid msgv1 msgv2 msgv3 msgv4.
* Aqui podemos gravar num ficheiro ou
* escrever no ecrã ou no application log
* ou o que for preciso.
ENDFORM.
Claro que, por ser dinâmica, esta invocação à mensagem E056 não será encontrada pelo where used.
Sugiro aqui uma alternativa que contém o melhor dos dois mundos. Permite invocar uma mensagem de forma normal (ou seja, não dinâmica e por isso detectável pelo where used) sem ela ir parar ao ecrã, e em seguida fazer com ela o que nos der na real gana:
DATA: dummy.
MESSAGE E056(ZSD) WITH a b c INTO dummy.
PERFORM trata_mensagem2.
FORM trata_mensagem2.
* A única diferença em relação à versão dinâmica é que aqui em
* vez de usar as variáveis "msgty", "msgno", etc. deverá usar-se
* as variáveis de systema SY-*MSGTY, SY-MSGNO, etc.
* o resto é tudo igual.
ENDFORM.
E pronto. Assim se torna o código ao mesmo tempo mais elegante e mais funcional. Dois coelhos com uma só cajadada.
Isto funciona porque quando se faz MESSAGE INTO dummy, o sistema preenche as variáveis do sistema SY-MSGNO, SY-MSGID, etc. com os dados da mensagem, que podem depois ser facilmente usados para o que se quiser.
O Abapinho saúda-vos.
12 de Abril de 2010 às 9:04
UAU, gostei!
12 de Abril de 2010 às 9:53
Olá Vânia, ainda bem que gostaste :-)
27 de Agosto de 2010 às 13:48
Ainda bem que o nuno…nu gostou que a Vânia gostasse.
27 de Agosto de 2014 às 10:39
Olá Nuno,
É a primeira vez que escrevo por aqui, antes de mais, parabéns pelo excelente blog.
Outra forma de não quebrar o “where used list” em mensagens dinâmicas que encontrei em código standard da SAP é enviar a mensagem dentro de uma condição impossível. Algo do estilo:
IF 1 = 2.
MESSAGE E…
ENDIF.
Mas a solução que apresentaste é bem mais elegante ;)
27 de Agosto de 2014 às 15:28
Olá Rui,
Obrigado :)
Pois, a solução que apresentas é a que se costuma encontrar (em código da Readsoft por exemplo). Mas obriga a repetir 2x os parâmetros da mensagem. Também acho esta solução que apresento mais elegante :)
Abraço,
Nuno