Patrocinado por
Patrocinado por Inetum

Como perguntar se a linha existe sem parecer antiquado

images/thumbnail.jpg - Thumbnail
Há muito tempo atrás dizias “porreiro pá”. Depois começaste a dizer “baril”. Depois era “fixe”. Hoje dizes “altamente”. É importante não te baralhares para não dares mau aspecto. E como perguntas a uma tabela interna se a linha existe?

Calem-se as mensagens das funções

images/thumbnail.jpg - Thumbnail
Há módulos de função standard que lançam mensagens e não deviam. Não deviam porque depois queremos usá-las em programas não interactivos e, em vez de devolverem o erro, atiram com uma mensagem para o ecrã que dá cabo do processo. Mas, provavelmente por ter tomado consciência deste problema, a SAP disponibilizou uma forma elegante (mas muito mal documentada) de resolver o problema.

Procurar texto numa WebDynpro

images/thumbnail.jpg - Thumbnail
A SAP não sabe fazer as coisas bem à primeira. As WebDynpros são um bom exemplo disso. Aquilo nem sequer permite pesquisar texto. É triste. Felizmente o Sérgio Fraga descobriu uma forma, ainda que rebuscada:

É o meu aniversário!

images/thumbnail.jpg - Thumbnail
Tenho 6 anos! (Obrigado Caleb Prichard pela foto)

Usarás sempre uma estrutura pré-definida nas ALVs

images/thumbnail.jpg - Thumbnail
É comum encontrar as estruturas de dados das ALVs declaradas explicitamente no código. Quando isto é feito, o catálogo de campos tem de ser criado manualmente. Se em vez disso se usar uma estrutura pré-definida (do DDIC ou como TYPE), o catálogo de campos pode ser criado automaticamente. Esta abordagem é sempre melhor resultando em menos código, mesmo que o catálogo de campos tenha de ser reajustado aqui e ali. https://abapinho.

Usarás TRANSPORTING NO FIELDS

images/thumbnail.jpg - Thumbnail
Muitas vezes fazes READ TABLE itbl ou LOOP AT itbl apenas para verificar se um registo existe (CHECK SY-SUBRC = 0). Ora para isso, os dados do registo não são realmente necessários. Nestes casos usa sempre TRANSPORTING NO FIELDS. Assim evitas ter de declarar uma estrutura destino e o programa fica mais rápido porque não tem de perder tempo a copiar dados.

Fazer debug a um ciclo infinito já em execução

images/thumbnail.jpg - Thumbnail
Imagina que tens um programa a executar um ciclo infinito ou, pelo menos, um ciclo com 70x7 iterações. Nunca mais acaba e tu queres saber o que lá se passa. No passado tinhas de ir à SM50, seleccionar o processo e escolher no menu “Administração | Programa | Depuração”. Mas agora há uma forma muito mais simples.

De quantos includes é feita uma classe?

images/thumbnail.jpg - Thumbnail
Por muitas voltas que eles dêem no ABAP, acaba tudo por ir dar à SE38. Até os métodos das classes ABAP são guardados em includes. Às vezes quando há um dump diz que o problema está, por exemplo, aqui: CL_MESSAGE_HELPER=============CM001.

Tornar a prender uma ordem de transporte liberada

images/thumbnail.jpg - Thumbnail
Liberaste uma ordem de transporte porque achavas que estava tudo pronto. Mas afinal ainda faltava fazer mais uma pequena modificação. E agora vais ter de criar uma nova ordem e transportar as duas. Que grande chatice. Calma.

Apresentando a app EGSAP_TECH

images/thumbnail.jpg - Thumbnail
Já conheces a app EGSAP_TECH? É um repositório de informação SAP. Aqui fica uma descrição delan nas palavas dos próprios criadores:

Pré-definir SELECT-OPTIONs

images/thumbnail.jpg - Thumbnail
O Abapinho recebeu uma carta. Sr Abapinho, Todos sabemos como colocar valores por defeito em select options usando o comando DEFAULT. O que nem toda a gente sabe é que podemos também definir por defeito a opção e o sinal e mesmo o botão para restingir o select options.

Cadeias de excepções

images/thumbnail.jpg - Thumbnail
Hoje vou ensinar-te a encadear excepções. É uma solução muito práctica para um problema complicado mas pouco óbvio. Começo por descrever o problema. Imagina que estás na aplicação BANANA. É uma aplicação bastante complexa. Tem, aliás, três módulos. São eles BANANA1, BANANA2 e BANANA3. Cada um tem a sua classe de excepção ZCX_BANANA1, ZCX_BANANA2 e ZCX_BANANA3. E como a aplicação até está bem desenhada, todas as classes de excepção herdam da mesma ZCX_BANANA. Agora imagina o seguinte cenário. Estás no módulo BANANA1 a fazer não sei o quê. E lá tens de chamar uma classe do módulo MORANGO Ora essa classe lança, claro, excepções, do tipo ZCX_MORANGO. Este é o contexto. Tens várias hipóteses:

Ignorar excepções de um módulo de função

images/thumbnail.jpg - Thumbnail
Quando chamas um módulo de função que devolve excepções normalmente dás-lhes números sequenciais tipo isto: CALL FUNCTION 'VAI_ALI_MAS_VOLTA' EXPORTING ali = 'Barreiro' EXCEPTIONS NOT_FOUND = 1 GOT_LOST = 2 OTHERS = 3. Mas se a seguir não tiveres o cuidado de ter um IF ou um CASE a olharem para o SY-SUBRC o Code Inspector pode devolve-te um erro caso esteja configurado para tal.

Usarás classes de excepção

images/thumbnail.jpg - Thumbnail
Nas classes, considera usar classes de excepção tipificadas em vez das excepções antigas. As novas têm imensas vantagens e, uma vez compreendidas, permitem produzir um código mais simples e robusto. https://zevolving.com/2011/12/class-based-exception/

Usarás literais prontos a traduzir nos programas

images/thumbnail.jpg - Thumbnail
Em programas, em vez de WRITE TEXT-001, usa WRITE ‘bla bla bla’(001). Assim, terás sempre um texto por defeito e além disso o programa será mais legível. https://abapinho.com/en/2011/11/programas-poliglotas/