Patrocinado por
Patrocinado por Inetum

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.

Escrever em muitas linhas ao mesmo tempo

images/thumbnail.jpg - Thumbnail

O editor de ABAP tem coisas que não lembram ao diabo. Até dá para escrever ao mesmo tempo em várias linhas.

Onde está o booleano?

images/thumbnail.jpg - Thumbnail

Não está. Mas eles - os senhores que fazem e refazem o ABAP propriamente dito - vão tentando remediar a situação. Olha por exemplo esta nova funcionalidade.

LOOP at tbl ASSIGNING <linha> CASTING

images/thumbnail.jpg - Thumbnail

Sabias que podes fazer LOOP de uma tabela interna com uma estrutura A para dentro de uma estrutura do tipo B?

INNER JOIN vs FOR ALL ENTRIES vs RANGES artificiais

images/thumbnail.jpg - Thumbnail

Uma vez que as operações de dados estão muito mais optimizadas no servidor de base de dados do que no ABAP, é sempre preferível o primeiro. FOR ALL ENTRIES só deve ser usado quando não se conseguir fazer INNER JOIN (como com a BSEG por exemplo). Quando possível, usar RANGES artificiais é preferível a usar FOR ALL ENTRIES mas é preciso cuidado para não ultrapassar o limite do parser de SQL.

Não usarás CHECKs directamente em user-exits

images/thumbnail.jpg - Thumbnail

É comum encontrar o comando CHECK em user-exits. A trágica consequência disto é que, se o CHECK falha, nenhum do código que se segue a esse CHECK será alcançado. Como é comum (ainda que má prática) que num user-exit sejam tratados vários assuntos diferentes, um CHECK relacionado com um assunto pode inibir o acesso aos assuntos seguintes. Uma forma simples de evitar este risco é, como sempre aconselho, encapsular o código em rotinas.