"
Supported by

(Português) Evitar mensagens dinâmicas

Sorry, this entry is only available in European Portuguese. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

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 “(Português) 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


About Abapinho
Abapinho runs on WordPress
Articles (RSS) e Comments (RSS).