"
Apoiado por

Arquivo de Setembro, 2009

O maravilhoso mundo do Application Log

Uma boa parte dos reports, interfaces ou jobs, têm de produzir algum tipo de relatório. É normal ver isso feito recorrendo ao comando WRITE. Ora nos dias que correm, usar o comando WRITE para isto é como recorrer a um par de pedras para acender uma fogueira. Afinal, porque não usar o Application Log que é muito mais simples e prático e standard e é só vantagens?

Application log

O Application Log é um sistema standard do SAP para guardar logs aplicacionais e é usado por várias transacções standard. Ao utilizá-lo podemos simplificar e uniformizar os logs dos nossos programas. Vamos aprender aqui como é simples usá-lo nos nossos desenvolvimentos.

Ler o resto do artigo »

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ê?

Ler o resto do artigo »

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.


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