"
Apoiado por

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.

5 comentários a “Evitar mensagens dinâmicas”

  1. Vania Diz:

    UAU, gostei!

  2. nununo Diz:

    Olá Vânia, ainda bem que gostaste :-)

  3. Major Lamelas Diz:

    Ainda bem que o nuno…nu gostou que a Vânia gostasse.

  4. Rui Diz:

    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 ;)

  5. Nuno Godinho Diz:

    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

Deixe um comentário


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