Patrocinado por
Patrocinado por Inetum

É 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/

Usarás a SALV em vez das antigas funções de ALV

images/thumbnail.jpg - Thumbnail
As classes SALV são mais versáteis e sofisticadas do que os antigos módulos de função. Portanto, para ALVs novas, usa sempre a SALV. Excepção feita para ALVs que precisem de editar os dados pois nesse caso as SALV ainda são muito pouco capazes. https://scn.sap.com/docs/DOC-10365 https://scn.sap.com/docs/DOC-10366

Concatenemos

images/thumbnail.jpg - Thumbnail
Temos duas variáveis: DATA palavra1 TYPE string. DATA palavra2 TYPE string. DATA: frase TYPE string. palavra1 = ‘isto’. palavra2 = ‘aquilo’. E queremos concatená-las metendo entre elas a palavra ‘mais’ e, claro, separando-as por espaços.

Comunicação por evento entre programas

images/thumbnail.jpg - Thumbnail
Na mitologia grega a forma de comunicação mais frequentemente utilizada pelos deuses para comunicar com os mortais era o estupro. Estupravam por dá cá aquela palha. O mais parecido que temos com estupro no ABAP é o comando SUBMIT, que é também a forma mais comum de comunicação entre dois programas.