<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>estilo on Abapinho</title><link>https://abapinho.com/tags/estilo/</link><description>Recent content in estilo on Abapinho</description><generator>Hugo -- gohugo.io</generator><language>pt</language><copyright>&amp;copy;2009-2026 Nuno Godinho</copyright><lastBuildDate>Mon, 08 Jun 2026 09:00:00 +0000</lastBuildDate><atom:link href="https://abapinho.com/tags/estilo/index.xml" rel="self" type="application/rss+xml"/><item><title>Atributos que são variáveis globais disfarçadas</title><link>https://abapinho.com/2026/06/atributos-variaveis-globais/</link><pubDate>Mon, 08 Jun 2026 09:00:00 +0000</pubDate><guid>https://abapinho.com/2026/06/atributos-variaveis-globais/</guid><description>&lt;p>Não há coisa pior do que ver código a abusar das variáveis. São tão delicadas e no entanto tão mal tratadas, coitadas. E a quem as tem de ler. A pior forma de tratar uma variável é fazê-la global. Parece mentira mas em 2025 este crime continua a flagelar os nossos sistemas. Ora aqui está uma forma de lhes mostrar amor.&lt;/p></description></item><item><title>Kintsugi</title><link>https://abapinho.com/2025/10/kintsugi/</link><pubDate>Mon, 13 Oct 2025 09:00:00 +0100</pubDate><guid>https://abapinho.com/2025/10/kintsugi/</guid><description>&lt;p>Quando no Japão se quebra um objecto de porcelana, às vezes, em vez de o deitarem fora, remendam-no. Mas não remendam de qualquer maneira; É com ouro. Esta técnica chama-se Kintsugi.&lt;/p></description></item><item><title>Porquê sempre MODIFY?</title><link>https://abapinho.com/2025/10/porque-modify/</link><pubDate>Mon, 06 Oct 2025 09:00:00 +0100</pubDate><guid>https://abapinho.com/2025/10/porque-modify/</guid><description>&lt;p>É hábito em ABAP usar o MODIFY em vez de INSERT e UPDATE. Costumas fazê-lo? Explica-me porquê. É preguiça? É medo? É na base do &amp;ldquo;já agora&amp;rdquo;? Ou é mais na base do &amp;ldquo;caga nisso&amp;rdquo;?&lt;/p></description></item><item><title>Reconstantes</title><link>https://abapinho.com/2025/02/reconstantes/</link><pubDate>Mon, 17 Feb 2025 09:00:00 +0000</pubDate><guid>https://abapinho.com/2025/02/reconstantes/</guid><description>&lt;p>O meu projecto tem constantes espalhadas por todo o lado, com nomes confusos ou errados. Uma salgalhada. Encontrei uma forma de reorganizar e rearrumar as constantes para que o código novo possa usar constantes bonitas sem espatifar o código antigo que pode continuar a usar as confusas.&lt;/p></description></item><item><title>Finalmente temos FINAL</title><link>https://abapinho.com/2025/02/final/</link><pubDate>Mon, 03 Feb 2025 09:00:00 +0000</pubDate><guid>https://abapinho.com/2025/02/final/</guid><description>&lt;p>Não há coisa pior do que ver gente a abusar das variáveis. São tão delicadas e no entanto tão mal tratadas, coitadas. Ora aqui está uma forma de lhes mostrar algum amor.&lt;/p></description></item><item><title>Como gostas tu das linhas em branco?</title><link>https://abapinho.com/2024/12/linhas-em-branco/</link><pubDate>Mon, 30 Dec 2024 09:00:00 +0000</pubDate><guid>https://abapinho.com/2024/12/linhas-em-branco/</guid><description>&lt;p>Toda a gente usa linhas em branco para melhor organizar o código. Mas onde usar e quantas usar? Falemos disso.&lt;/p></description></item><item><title>Declarações de dados limpas</title><link>https://abapinho.com/2022/11/clean-data-declarations/</link><pubDate>Mon, 07 Nov 2022 09:00:00 +0000</pubDate><guid>https://abapinho.com/2022/11/clean-data-declarations/</guid><description>&lt;p>Quando escreveres código deves estar sempre preocupado com quão fácil será mantê-lo. Isso é particularmente importante nas declarações de variáveis. E é tão simples de aplicar.&lt;/p></description></item><item><title>Livrei-me finalmente dos prefixos</title><link>https://abapinho.com/2022/09/prefixos/</link><pubDate>Mon, 12 Sep 2022 09:09:00 +0100</pubDate><guid>https://abapinho.com/2022/09/prefixos/</guid><description>&lt;p>Demorei muitos anos mas finalmente livrei-me do raio dos prefixos.&lt;/p></description></item><item><title>Os galhos dos IFs devem ser curtos</title><link>https://abapinho.com/2022/05/ifs-curtos/</link><pubDate>Mon, 02 May 2022 09:00:00 +0100</pubDate><guid>https://abapinho.com/2022/05/ifs-curtos/</guid><description>&lt;p>Imagina que és um macaco pendurado no galho de uma árvore. Queres saltar para outro galho mas ele está tão longe que não o consegues ver. Se saltares arriscas-te a cair ao chão. É mau.&lt;/p></description></item><item><title>Escapa aos hackers</title><link>https://abapinho.com/2022/03/escape/</link><pubDate>Mon, 28 Mar 2022 09:00:00 +0000</pubDate><guid>https://abapinho.com/2022/03/escape/</guid><description>&lt;p>Um dos principais pontos fracos de um programa são os dados introduzidos pelos utilizadores.&lt;/p></description></item><item><title>Faz apenas uma coisa por LOOP</title><link>https://abapinho.com/2022/03/split-loop/</link><pubDate>Mon, 14 Mar 2022 09:00:00 +0000</pubDate><guid>https://abapinho.com/2022/03/split-loop/</guid><description>&lt;p>Os programadores ABAP são muito poupadinhos. Quando lhes aparece um LOOP à frente gostam de o aproveitar para fazer tudo e mais alguma coisa. Mesmo que esse LOOP fique com centenas ou milhares de linhas.&lt;/p></description></item><item><title>Evita o ABAP obsoleto</title><link>https://abapinho.com/2022/03/obsoletos/</link><pubDate>Mon, 07 Mar 2022 09:00:00 +0000</pubDate><guid>https://abapinho.com/2022/03/obsoletos/</guid><description>&lt;p>O ABAP evolui (embora durante muitos anos não parecesse). E à medida que evolui vai deixando para trás alguns comandos ou formas de fazer as coisas porque disponibiliza outras melhores.&lt;/p>
&lt;p>Para além de aprender a usar as novidades é também importante aprender a deixar de usar o que vai ficando obsoleto.&lt;/p></description></item><item><title>Um programa é um animal</title><link>https://abapinho.com/2022/02/animal/</link><pubDate>Mon, 28 Feb 2022 09:00:00 +0000</pubDate><guid>https://abapinho.com/2022/02/animal/</guid><description>&lt;p>Quando os programas estão mal feitos por terem código duplicado, se os reescrevemos ficam mais curtos. Mas se, pelo contrário, estiverem mal feitos por não estarem devidamente estruturados em várias classes com vários métodos, podem ficar bem mais longos se os reescrervemos de acordo com as boas prácticas.&lt;/p></description></item><item><title>Os blocos de código devem ser curtos</title><link>https://abapinho.com/2022/02/blocos-curtos/</link><pubDate>Mon, 07 Feb 2022 09:00:00 +0000</pubDate><guid>https://abapinho.com/2022/02/blocos-curtos/</guid><description>&lt;p>Infelizmente isto não acontece no código Z dos clientes onde tenho trabalhado. Tanto os IFs como os LOOPs tendem a ser tão grandes que ninguém percebe nada do que lá está. Ainda no outro dia vi um &lt;code>LOOP&lt;/code> com mais de 1500 linhas.&lt;/p></description></item><item><title>Se amas o próximo, evita o CLEAR</title><link>https://abapinho.com/2021/12/evita-o-clear/</link><pubDate>Mon, 13 Dec 2021 09:00:59 +0000</pubDate><guid>https://abapinho.com/2021/12/evita-o-clear/</guid><description>&lt;p>Demasiadas regressões acontecem porque alguém se esquece de fazer CLEAR ou de não fazer CLEAR a uma variável.&lt;/p></description></item><item><title>As condições IF devem ser simples de entender</title><link>https://abapinho.com/2021/11/as-condicoes-if-devem-ser-simples-de-entender/</link><pubDate>Mon, 01 Nov 2021 09:00:45 +0000</pubDate><guid>https://abapinho.com/2021/11/as-condicoes-if-devem-ser-simples-de-entender/</guid><description>&lt;p>Porque haveria de ser difícil lê-las? Só tornaria mais difícil a vida de quem vier a precisar de a entender.&lt;/p>
&lt;p>Lá porque uma condição IF é complexa não é por isso que tem de ser complicada.&lt;/p></description></item><item><title>SELECT WHERE field IN (*, x)</title><link>https://abapinho.com/2021/07/select-where-field-in-a-b/</link><pubDate>Mon, 19 Jul 2021 09:00:53 +0000</pubDate><guid>https://abapinho.com/2021/07/select-where-field-in-a-b/</guid><description>&lt;p>Vamos por partes.&lt;/p>
&lt;p>Imagina um cenário em que tens uma tabela de parametrização com vários níveis de detalhe que podem ou não estar definidos:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>BUKRS (empresa)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>WERKS (plant)&lt;/p>
&lt;/li>
&lt;li>
&lt;p>LGORT (depósito)&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>Quando um dos campos está vazio, é um wildcard, ou seja, é válido para todos os valores.&lt;/p></description></item><item><title>Insere sem excepções em tabelas internas com chave única</title><link>https://abapinho.com/2021/07/insert-into-table/</link><pubDate>Mon, 05 Jul 2021 09:00:51 +0000</pubDate><guid>https://abapinho.com/2021/07/insert-into-table/</guid><description>&lt;p>Quantas vezes na tua vida de consultor tiveste de lidar com dumps que aconteceram em consequência de um programa tentar inserir duas linhas com a mesma chave numa tabela interna definida com UNIQUE KEY?&lt;/p>
&lt;p>Chega.&lt;/p></description></item><item><title>Funções manequins</title><link>https://abapinho.com/2021/05/funcoes-manequins/</link><pubDate>Mon, 10 May 2021 09:00:54 +0000</pubDate><guid>https://abapinho.com/2021/05/funcoes-manequins/</guid><description>Como é que se há-de traduzir dummy? Fica manequim.
Comecei a trabalhar recentemente num cliente novo e reparei que fazem aqui uma coisa que me agradou. Quando precisam de invocar por RFC módulos de função em outros sistemas SAP, criam localmente um módulo de função com o mesmo nome mas sem código, apenas com um comentário explicando que é uma função remota noutro sistema.
A virtude disto é que assim pode usar-se a ferramenta where-used para descobrir todos os sítios onde é invocada.</description></item><item><title>Lookup em tabela sem ter de lidar com a excepção CX_SY_ITAB_LINE_NOT_FOUND</title><link>https://abapinho.com/2020/06/lookup-em-tabela-sem-ter-de-lidar-com-a-excepcao-cx_sy_itab_line_not_found/</link><pubDate>Mon, 15 Jun 2020 09:00:08 +0000</pubDate><guid>https://abapinho.com/2020/06/lookup-em-tabela-sem-ter-de-lidar-com-a-excepcao-cx_sy_itab_line_not_found/</guid><description>&lt;p>Antes do 7.40 ter modernizado o ABAP, um lookup a uma tabela obrigava a declarar uma variável auxiliar e a pelo menos 4 linhas de código.&lt;/p></description></item><item><title>Clean ABAP</title><link>https://abapinho.com/2020/05/clean-abap/</link><pubDate>Wed, 13 May 2020 12:54:21 +0000</pubDate><guid>https://abapinho.com/2020/05/clean-abap/</guid><description>&lt;p>Durante muitos anos, quando entrava em discussões sobre ABAP OO ser melhor do que FORMs, INCLUDEs e CALL FUNCTIONs, o mais comum é a pessoa do lado de lá continuar convencida de que OO é bom nas outras linguagens mas não traz vantagens para o ABAP. Logo a começar pelo atroz código standard SAP que parece ter sido escrito para provar que é possível fazer algo que viola todas as boas prácticas de programação e mesmo assim funciona.&lt;/p></description></item><item><title>NÃO</title><link>https://abapinho.com/2020/04/nao/</link><pubDate>Tue, 28 Apr 2020 12:08:03 +0000</pubDate><guid>https://abapinho.com/2020/04/nao/</guid><description>&lt;p>Não,
o ABAP
&lt;a href="https://blogs.sap.com/2014/09/29/abap-news-for-740-sp08-logical-expressions/#comment-82607">nunca vai ter&lt;/a>
o operador NOT.&lt;/p></description></item><item><title>MOVE-CORRESPONDING entre duas tabelas respeitando a chave</title><link>https://abapinho.com/2020/03/move-corresponding-entre-duas-tabelas-respeitando-a-chave/</link><pubDate>Mon, 23 Mar 2020 09:00:04 +0000</pubDate><guid>https://abapinho.com/2020/03/move-corresponding-entre-duas-tabelas-respeitando-a-chave/</guid><description>&lt;p>O Abapinho não tem falado muito sobre o 7.40 porque as suas novidades têm já sido amplamente descritas em vários sites. Tentamos não inventar a roda.&lt;/p>
&lt;p>Mas há pequenas pérolas úteis que ainda são pouco conhecidas. Esta é sobre uma delas.&lt;/p></description></item><item><title>O caminho mais curto para ir de SELECT a RANGE</title><link>https://abapinho.com/2019/11/o-caminho-mais-curto-para-ir-de-select-a-range/</link><pubDate>Wed, 13 Nov 2019 10:21:31 +0000</pubDate><guid>https://abapinho.com/2019/11/o-caminho-mais-curto-para-ir-de-select-a-range/</guid><description>&lt;p>Hoje debruçamo-nos sobre como tentar optimizar o código para transformar um SELECT num RANGE.&lt;/p></description></item><item><title>É tão simples converter uma MESSAGE numa EXCEPTION</title><link>https://abapinho.com/2019/11/converter-message-em-exception/</link><pubDate>Mon, 04 Nov 2019 10:30:44 +0000</pubDate><guid>https://abapinho.com/2019/11/converter-message-em-exception/</guid><description>&lt;p>Há alguns anos atrás &lt;a href="https://abapinho.com/2015/06/converter-excepcao-em-classe-de-excepcao/">mostrei como se podia converter uma MESSAGE normal numa excepção tipificada&lt;/a>. Entretanto o ABAP evoluiu um bocadinho e agora, na versão 7.40, aquela solução complexa já não é necessária.&lt;/p></description></item><item><title>A árvore dos pacotes Z - Uma proposta modesta</title><link>https://abapinho.com/2019/10/arvore-de-pacotes-z/</link><pubDate>Wed, 23 Oct 2019 09:00:46 +0000</pubDate><guid>https://abapinho.com/2019/10/arvore-de-pacotes-z/</guid><description>&lt;p>Quem lê o Abapinho sabe que eu defendo o uso e abuso do &lt;a href="https://abapinho.com/2014/07/pacotes-2-0/">ABAP Package Concept&lt;/a>. Hoje em dia a primeira coisa que eu faço quando começo um desenvolvimento novo é criar-lhe um pacote encapsulado que guardará todos os seus objectos que, nos casos mais complexos, será um pacote &amp;ldquo;Main&amp;rdquo; ainda subdividido em vários sub-pacotes.&lt;/p>
&lt;p>Fica aqui a minha modesta proposta para criar uma árvore de pacotes Z que ajude a organizar aquilo que é normalmente uma confusão danada.&lt;/p></description></item><item><title>IF sem IS INITIAL em métodos booleanos</title><link>https://abapinho.com/2019/08/if-sem-is-initial-em-metodos-booleanos/</link><pubDate>Tue, 27 Aug 2019 09:00:07 +0000</pubDate><guid>https://abapinho.com/2019/08/if-sem-is-initial-em-metodos-booleanos/</guid><description>&lt;p>O sistema do cliente onde trabalho actualmente foi finalmente actualizado para o 7.50 e, depois de tantos anos preso ao ABAP convencional, posso desfrutar as maravilhas introduzidas no 7.40.&lt;/p>
&lt;p>São às dúzias essas maravilhas, e não vou começar aqui a fazer artigos sobre cada uma porque já existem artigos espalhados pela net sobre quase todas elas o Abapinho faz sempre o possível por ensinar algo novo ou, pelo menos, pouco conhecido.&lt;/p>
&lt;p>Mas há uma singela funcionalidade que, não sendo nada de extraordinário, me agrada: já não é preciso fazer IS INITIAL no comando IF quando a condição é um método que retorna um booleano.&lt;/p></description></item><item><title>Quando o código cheira mal</title><link>https://abapinho.com/2019/02/quando-o-codigo-cheira-mal/</link><pubDate>Mon, 25 Feb 2019 09:00:12 +0000</pubDate><guid>https://abapinho.com/2019/02/quando-o-codigo-cheira-mal/</guid><description>&lt;p>É frequente ao programar começar a sentir um cheiro desagradável. Normalmente não consigo logo identificar o que é. Sinto apenas uma leve mas incómoda fragrância. À medida que vou cheirando com mais propósito vou conseguindo perceber de onde vem. Mas mesmo nessa altura, muitas vezes ainda não me é perfeitamente claro porque é que aquele cheiro dali vem.&lt;/p></description></item><item><title>Não é para reutilizar que se encapsula</title><link>https://abapinho.com/2019/02/nao-e-para-reutilizar-que-se-encapsula/</link><pubDate>Mon, 18 Feb 2019 09:00:18 +0000</pubDate><guid>https://abapinho.com/2019/02/nao-e-para-reutilizar-que-se-encapsula/</guid><description>&lt;p>Desde 1998 que oiço colegas ABAPers dizerem que não vale a pena meter determinado código numa função ou método porque não lhes parece que este vá tornar a ser reutilizado. E lá vão continuando na SE38 a fazer os seus reports cheios de includes.&lt;/p>
&lt;p>A ideia de que a principal razão para encapsular código é poder reutilizá-lo é um dos maiores mal entendidos da história do nosso planeta.&lt;/p></description></item><item><title>Refactorizarás: Extrair método</title><link>https://abapinho.com/2019/01/refactorizacao-extrair-metodo/</link><pubDate>Wed, 02 Jan 2019 09:00:23 +0000</pubDate><guid>https://abapinho.com/2019/01/refactorizacao-extrair-metodo/</guid><description>&lt;p>No mundo do SAP, o código ABAP onde cai é onde fica.&lt;/p>
&lt;p>Num dia o Manel faz uma coisa mal porque está com pressa ou não sabe fazer melhor. Um ano depois pedem ao António para fazer uma pequena alteração. O António vê a asneira do Manel mas não a melhora porque, por alguma razão, no mundo do SAP, alterar código que está a funcionar, por muito mau que seja, é tabu. Em vez disso, acrescenta o seu código ao já existente de forma geralmente acrítica.&lt;/p>
&lt;p>Esta atitude, quando adoptada por todos, contribui para uma inevitável erosão do código de um sistema que, após alguns anos, se tornará ingerível.&lt;/p>
&lt;p>No meu entender, isso está errado e vai contra os interesses do cliente. Aliás, mesmo se o cliente não quiser que se mexa no código antigo&amp;hellip; eu mexo. Quem é ele para me dizer como é que se programa?&lt;/p></description></item><item><title>Comentário sobre comentários</title><link>https://abapinho.com/2018/11/comentario-sobre-comentarios/</link><pubDate>Mon, 26 Nov 2018 09:00:19 +0000</pubDate><guid>https://abapinho.com/2018/11/comentario-sobre-comentarios/</guid><description>&lt;p>Na escola aprende-se que o código deve ter sempre comentários. Depois, na vida real, descobrimos que nem toda a gente prestou atenção na escola.&lt;/p>
&lt;p>Sempre tive o cuidado de comentar os vários passos do meu código, especialmente as partes mais obscuras ou que não são auto-explicativas.&lt;/p>
&lt;p>Mas depois de ler o livro &lt;em>&lt;a href="https://www.goodreads.com/book/show/3735293-clean-code">Clean Code&lt;/a>&lt;/em> do &lt;a href="https://en.wikipedia.org/wiki/Robert_C._Martin">Uncle Bob&lt;/a>, a minha opinião mudou. Hoje acredito que quanto menos comentários melhor. E no entanto não acho que esta mudança seja contraditória.&lt;/p></description></item><item><title>ABAP, o lobotomizador</title><link>https://abapinho.com/2018/10/abap-o-lobotomizador/</link><pubDate>Mon, 15 Oct 2018 09:27:05 +0000</pubDate><guid>https://abapinho.com/2018/10/abap-o-lobotomizador/</guid><description>&lt;p>O João estuda Engenharia Informática na Universidade onde aprende Java, polimorfismo, encapsulamento e uma série de outras técnicas e boas prácticas. Quando termina o curso é contratado por uma empresa para trabalhar em SAP. No curso de introdução ao ABAP que a empresa lhe oferece, a primeira coisa que ensinam é como fazer o programa ZJOAO. Explicam assim:&lt;/p>
&lt;p>_&amp;ldquo;Vais à SE38, crias o programa ZJOAO e crias logo os includes ZJOAO_TOP, ZJOAO_FRM e ZJOAO_SEL. Depois metes as variáveis todas no _TOP, o ecrã de selecção no _SEL e todos os FORMs no &lt;em>FRM. A partir daqui é só ires programando. Primeiro escreves START-OF-SELECTION e a seguir fazes todos os SELECTs e depois escreves END-OF-SELECTION e mostras tudo numa ALV. É simples, vês? Bem-vindo ao ABAP.&amp;rdquo;&lt;/em>&lt;/p></description></item><item><title>Serialização - Clona a Dolly em ABAP</title><link>https://abapinho.com/2017/10/serializacao-abap/</link><pubDate>Mon, 30 Oct 2017 09:00:20 +0000</pubDate><guid>https://abapinho.com/2017/10/serializacao-abap/</guid><description>&lt;p>Este artigo é da autoria de José Vília.&lt;/p>
&lt;p>A ovelha Dolly está no ABAP e eu não sabia.&lt;/p>
&lt;p>Depois de criar uma instância de uma classe, gostava de partilhá-la com outro programa totalmente independente para que este outro programa posso usá-la como se a tivesse instanciado.&lt;/p>
&lt;p>Como se de uma fábrica de ovelhas Dollies se tratasse, o ABAP pode utilizar serialização para resolver o problema.&lt;/p></description></item><item><title>Protocolo de erros da ALV Grid</title><link>https://abapinho.com/2017/09/alv-grid-built-in-error-protocol/</link><pubDate>Mon, 11 Sep 2017 09:00:20 +0000</pubDate><guid>https://abapinho.com/2017/09/alv-grid-built-in-error-protocol/</guid><description>&lt;p>A lei do menor esforço, esse grande axioma da Humanidade, tem, no mundo da programação, a particularidade de, em muitos casos, acabar por ser simplesmente a lei do esforço adiado. Porque é muito provável que algo que tenha sido desenvolvido de acordo com esta lei venha mais tarde a precisar de um grande esforço extra. Seja dos utilizadores que vão utilizar esse algo ou dos programadores que mais tarde terão de o manter.&lt;/p>
&lt;p>Atire a primeira pedra aquele que não se deixou guiar por esta lei ao desenvolver este ou aquele programas.&lt;/p>
&lt;p>Eu não atiro.&lt;/p></description></item><item><title>PlantUML - Finalmente o UML dá para usar</title><link>https://abapinho.com/2017/09/plantuml-finalmente-o-uml-da-para-usar/</link><pubDate>Tue, 05 Sep 2017 09:00:59 +0000</pubDate><guid>https://abapinho.com/2017/09/plantuml-finalmente-o-uml-da-para-usar/</guid><description>&lt;p>&lt;strong>Prólogo&lt;/strong>&lt;/p>
&lt;p>Quando digo que gosto de usar diagramas de classes UML para documentar o meu código as pessoas acham que sou maluco.&lt;/p>
&lt;p>&lt;strong>Introdução&lt;/strong>&lt;/p>
&lt;p>O UML ganhou má fama porque as pessoas pensam que primeiro se faz o diagrama de classes todo em UML e só depois o programa. Mas isso era em 1996, quando se achava que a primeira coisa a fazer era o desenho técnico todo, mesmo que na práctica ninguém nunca o fizesse.&lt;/p>
&lt;p>Hoje em dia felizmente já não temos vergonha de dizer que o próprio acto de programar é já em si uma forma de desenhar.&lt;/p></description></item><item><title>ASSERT vs Excepção</title><link>https://abapinho.com/2017/01/excepcao-vs-assert/</link><pubDate>Mon, 23 Jan 2017 09:00:56 +0000</pubDate><guid>https://abapinho.com/2017/01/excepcao-vs-assert/</guid><description>&lt;p>Quem lê o Abapinho sabe quanto gosto de classes de excepções. No entanto, este não é o único mecanismo que o ABAP disponibiliza para controlo de erros.&lt;/p>
&lt;p>Há outro, chamado ASSERT, que devia ser mais usado, e que hoje trago à baila.&lt;/p></description></item><item><title>Obtém o texto mais profundo de cadeia de excepções</title><link>https://abapinho.com/2017/01/texto-mais-profundo-de-cadeia-de-excepcoes/</link><pubDate>Mon, 16 Jan 2017 10:34:04 +0000</pubDate><guid>https://abapinho.com/2017/01/texto-mais-profundo-de-cadeia-de-excepcoes/</guid><description>&lt;p>Nos dias que correm se não estás a usar objectos &lt;a href="https://abapinho.com/2012/10/mariquinhas-pe-de-salsa/">és totó&lt;/a>.&lt;/p>
&lt;p>Se usas objectos, espero que estejas a seguir a &lt;a href="https://abapinho.com/2015/01/usaras-classes-de-excepcao/">boa práctica&lt;/a> de usar classes de excepções.&lt;/p>
&lt;p>E se usas classes de excepção é bom que entendas a melhor forma de as usar, particularmente as &lt;a href="https://abapinho.com/2015/02/cadeias-de-excepcoes/">vantagens de as encadear&lt;/a>.&lt;/p>
&lt;p>Com tudo isto esclarecido, chegamos ao que nos traz aqui hoje. No artigo sobre &lt;a href="https://abapinho.com/2015/02/cadeias-de-excepcoes/">cadeias de excepções&lt;/a> mostrei como, para obter o texto da excepção mais profunda, a que foi inicialmente espoletada, se pode fazer um DO WHILE:&lt;/p></description></item><item><title>Como devolver um REF TO data sem fazer asneira</title><link>https://abapinho.com/2017/01/devolver-ref-to-data/</link><pubDate>Mon, 02 Jan 2017 09:00:26 +0000</pubDate><guid>https://abapinho.com/2017/01/devolver-ref-to-data/</guid><description>&lt;p>Tenho usado cada vez mais referências em ABAP.&lt;/p>
&lt;p>Primeiro usava REF TO só para classes mas vou percebendo cada vez mais as vantagens de as usar também para estruturas de dados. Mas, tal como acontece em C++, há que ter cuidado quando se lida con referências para dados pois facilmente a coisa pode dar para o torto.&lt;/p>
&lt;p>Neste artigo tento mostrar como usar e como não usar o REF TO data. Comecemos por ver um exemplo de como não usar:&lt;/p></description></item><item><title>$PACOTES locais</title><link>https://abapinho.com/2016/11/pacotes-locais/</link><pubDate>Mon, 07 Nov 2016 09:00:37 +0000</pubDate><guid>https://abapinho.com/2016/11/pacotes-locais/</guid><description>&lt;p>Todos os objectos criados em SAP têm de estar associados a um pacote.&lt;/p>
&lt;p>Até recentemente, quando eu queria fazer um teste rápido criava o objecto no pacote $TMP. Tinha assim a garantia de este nunca viria a ser transportado.&lt;/p>
&lt;p>Mas por vezes há necessidade de criar coisas no sistema de desenvolvimento que não pretendemos nunca vir a transportar mas que queremos que lá existam eternamente. Como o ZSAPLINK e o abapGit, por exemplo. Mas se as associarmos todas as pacote $TMP fica uma valente confusão.&lt;/p></description></item><item><title>INSERT wa INTO itbl REFERENCE INTO ref. Bug?</title><link>https://abapinho.com/2016/10/reference-into-ref-bug/</link><pubDate>Mon, 03 Oct 2016 09:00:43 +0000</pubDate><guid>https://abapinho.com/2016/10/reference-into-ref-bug/</guid><description>&lt;p>Tenho usado cada vez mais referências em ABAP. Primeiro usava REF TO só para classes mas agora vou percebendo as vantagens de as usar também para estruturas de dados.&lt;/p>
&lt;p>Recentemente descobri um comportamento muito lamentável do seguinte comando:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-ABAP" data-lang="ABAP">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00f">INSERT&lt;/span> &lt;span style="color:#000">wa&lt;/span> &lt;span style="color:#00f">INTO&lt;/span> &lt;span style="color:#000">itbl&lt;/span> &lt;span style="color:#00f">REFERENCE INTO&lt;/span> &lt;span style="color:#000">ref&lt;/span>.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>Mas antes de me queixar sobre isso, dou um bocado de contexto.&lt;/p></description></item><item><title>Devíamos ser responsabilizados pela merda que fazemos</title><link>https://abapinho.com/2016/09/deviamos-ser-responsabilizados/</link><pubDate>Mon, 19 Sep 2016 09:00:33 +0000</pubDate><guid>https://abapinho.com/2016/09/deviamos-ser-responsabilizados/</guid><description>&lt;p>Se, ao construir uma ponte, um engenheiro civil fizer mal as contas a ponte cai. Mas não é só a ponte que cai. Esse engenheiro civil provavelmente também cai. Ou pelo menos desequilibra-se. Porque quando fez o projecto da ponte assinou-o, assumindo responsabilidade pelo que fez.&lt;/p>
&lt;p>Nós os programadores ABAP não temos esses problemas.&lt;/p></description></item><item><title>GROUP BY em LOOPs a tabelas internas</title><link>https://abapinho.com/2016/03/group-by-loops-tabelas-internas/</link><pubDate>Mon, 21 Mar 2016 09:00:57 +0000</pubDate><guid>https://abapinho.com/2016/03/group-by-loops-tabelas-internas/</guid><description>&lt;p>Todos já ordenamos tabelas internas e utilizamos a instrução AT NEW.
Mas a partir da 7.40, podemos utilizar GROUP BY no LOOP.&lt;/p>
&lt;p>É fantástico a capacidade de agrupamento em que os valores do registo processado no loop podem ser comparados, recorrendo a expressões e até métodos.&lt;/p>
&lt;p>O agrupamento é realizado num primeiro LOOP e pode ser processado a seguir. Experimentem o seguinte código e, tal como eu, ficarão impressionados com o caminho que o ABAP está a seguir.&lt;/p></description></item><item><title>Eu te baptizo em nome do ABAP</title><link>https://abapinho.com/2015/10/eu-te-baptizo-em-nome-do-abap/</link><pubDate>Mon, 26 Oct 2015 09:00:05 +0000</pubDate><guid>https://abapinho.com/2015/10/eu-te-baptizo-em-nome-do-abap/</guid><description>&lt;p>Quando aprendemos ABAP ensinam-nos uma série de regras sobre como dar nomes a variáveis. Ainda que nem todos acabem por dar nomes iguais, ainda assim partilham-se algumas ideias rígidas:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>As variáveis locais começam por L: L_BUKRS;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>As variáveis globais começam por G: G_MODE;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>As tabelas internas têm de ter lá um T_: LT_MARA;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>As estruturas têm de ter lá um S_: LS_MARA;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>As referências para objectos começam por R_: R_CUSTOMER;&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Os parâmetros &lt;em>input&lt;/em> devem começar por I, os &lt;em>output&lt;/em> por O, os &lt;em>changing&lt;/em> por C e os &lt;em>returning&lt;/em> por R.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>E a mais estúpida de todas, os &lt;em>field-symbols&lt;/em> devem começar por FS_: &amp;lt;FS_MARA&amp;gt;.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>No início do século XXI isto até fazia sentido (excepto a dos &lt;em>field-symbols&lt;/em> que já na altura era tão estúpida como escrever a palavra &amp;ldquo;lápis&amp;rdquo; em todos os lápis que tivermos). Hoje quase já não. Passo a explicar.&lt;/p></description></item><item><title>CONCATENATE LINES OF itbl</title><link>https://abapinho.com/2015/10/concatenate-lines-of-itbl/</link><pubDate>Mon, 05 Oct 2015 09:00:50 +0000</pubDate><guid>https://abapinho.com/2015/10/concatenate-lines-of-itbl/</guid><description>&lt;p>Se queres serializar um conjunto de &lt;em>strings&lt;/em> que tens guardadas numa tabela interna tens duas formas de o fazer. Uma ranhosa e outra cheia de estilo.&lt;/p></description></item><item><title>Modificar uma campo em todas as linhas de tabela interna</title><link>https://abapinho.com/2015/08/modificar-uma-campo-em-todas-as-linhas-de-uma-tabela-interna/</link><pubDate>Mon, 31 Aug 2015 09:00:25 +0000</pubDate><guid>https://abapinho.com/2015/08/modificar-uma-campo-em-todas-as-linhas-de-uma-tabela-interna/</guid><description>&lt;p>O que vos vou mostrar não é propriamente uma novidade. Até &lt;a href="https://abapinho.com/2011/07/range-instantaneo/">já foi usado antes&lt;/a> no Abapinho. Mas como se continua a ver por aí muita gente a fazer LOOPs a tabelas internas para alterar um campo, achei que valia a pena recordar.&lt;/p></description></item><item><title>DELETE vs CLEAR vs REFRESH vs FREE</title><link>https://abapinho.com/2015/07/delete-vs-clear-vs-refresh-vs-free/</link><pubDate>Mon, 27 Jul 2015 09:00:01 +0000</pubDate><guid>https://abapinho.com/2015/07/delete-vs-clear-vs-refresh-vs-free/</guid><description>&lt;p>DELETE
CLEAR
REFRESH
FREE&lt;/p>
&lt;p>São várias maneiras de limpar os dados de uma tabela interna.
À partida parecem iguais.
Mas não são.&lt;/p></description></item><item><title>CASE dentro de SELECT (brevemente em todos os SAPs)</title><link>https://abapinho.com/2015/07/case-dentro-de-select-brevemente-em-todos-os-saps/</link><pubDate>Mon, 20 Jul 2015 09:00:42 +0000</pubDate><guid>https://abapinho.com/2015/07/case-dentro-de-select-brevemente-em-todos-os-saps/</guid><description>Prepara-te porque em breve terás muitas surpresas. É que o ABAP está a aprender troques novos. Repara neste:
CONSTANTS: lc_menina TYPE STRING VALUE ‘MENINA&amp;#39;, lc_menino TYPE STRING VALUE ‘MENINO’, lc_senhor TYPE STRING VALUE ’SENHOR’, lc_senhora TYPE STRING VALUE ‘SENHORA’. SELECT nome, CASE WHEN sexo_id = ‘M&amp;#39; AND idade &amp;lt; 18 THEN @lc_menino WHEN sexo_id = ‘F’ AND idade &amp;lt; 18 THEN @lc_menina WHEN sexo_id = ‘M&amp;#39; AND idade &amp;gt;=18 THEN @lc_senhor WHEN sexo_id = ‘F’ AND idade &amp;gt;=18 THEN @lc_senhora END AS titulo FROM zpessoa WHERE pessoa_id = @pessoa_id INTO CORRESPONDING FIELDS OF @lt_pessoas.</description></item><item><title>Tenta converter WRITEs para ALVs</title><link>https://abapinho.com/2015/07/tenta-converter-writes-para-alvs/</link><pubDate>Mon, 06 Jul 2015 09:00:46 +0000</pubDate><guid>https://abapinho.com/2015/07/tenta-converter-writes-para-alvs/</guid><description>Relatórios que ainda escrevem directamente no ecrã são muito difíceis de manter quando é necessário alterá-los. Se o tiveres de fazer revê o código e, se o esforço não for demasiado, considera convertê-lo para ALV. Se tiveres dúvidas quanto às consequências disto, envolve um funcional nesta decisão.</description></item><item><title>Converter excepção em classe de excepção</title><link>https://abapinho.com/2015/06/converter-excepcao-em-classe-de-excepcao/</link><pubDate>Mon, 01 Jun 2015 09:00:21 +0000</pubDate><guid>https://abapinho.com/2015/06/converter-excepcao-em-classe-de-excepcao/</guid><description>&lt;p>Se ainda não usas classes de excepção fazes mal. Porque são muito boas para a saúde do código. Além de nutritivas, emagrecem-no e tornam-no mais resistente a doenças.&lt;/p>
&lt;p>Mas há casos em que ainda é preciso lidar com as antigas excepções. Por exemplo quando se invoca um módulo de função.&lt;/p>
&lt;p>Neste artigo apresento uma sugestão um bocado rebuscada mas que funciona muito bem para integrar as excepções antigas com classe de excepção de uma forma simples. A solução é rebuscada mas só tem de ser feita uma vez. Uma vez feita, a forma como se a usa não tem nada de rebuscado.&lt;/p></description></item><item><title>Encapsularás, encapsularás, encapsularás</title><link>https://abapinho.com/2015/05/encapsularas-encapsularas-encapsularas/</link><pubDate>Mon, 11 May 2015 11:40:10 +0000</pubDate><guid>https://abapinho.com/2015/05/encapsularas-encapsularas-encapsularas/</guid><description>Historicamente os programas ABAP tendem a ser muito loooongos. Todas as boas prácticas de programação ensinam que não há uma única vantagem nisso. Se uma rotina, seja ela um programa, um método, uma função ou outra coisa, tiver mais do que 200-300 linhas, desconfia e considera seriamente modularizá-la em várias sub-rotinas. Esta abordagem tem a vantagem adicional de potenciar a reutilização de código. Mas a maior vantagem é o encapsulamento, isolando variáveis no seu contexto local, em vez de as ter todas juntas, tendo como resultado código mais seguro e mais claro.</description></item><item><title>Reutilizarás, não reescreverás</title><link>https://abapinho.com/2015/05/reutilizaras-nao-reescreveras/</link><pubDate>Mon, 04 May 2015 09:00:28 +0000</pubDate><guid>https://abapinho.com/2015/05/reutilizaras-nao-reescreveras/</guid><description>Se o mesmo pedaço de código estiver repetido mais do que uma vez, pergunta-te porquê e tenta evitá-lo, criando uma rotina reutilizável. Se, num programa, existir mais do que um SELECT para a mesma tabela, tenta fundi-los num único. Por vezes a utilização inteligente de RANGES para unificar parâmetros pode evitar a necessidade de múltiplos SELECTs a uma mesma tabela. Se o mesmo código for usado em dois programas diferentes tenta, ao invés, mover esse código para uma classe que possa ser partilhada pelos dois.</description></item><item><title>Evitarás variáveis globais</title><link>https://abapinho.com/2015/04/evitaras-variaveis-globais/</link><pubDate>Mon, 13 Apr 2015 09:00:36 +0000</pubDate><guid>https://abapinho.com/2015/04/evitaras-variaveis-globais/</guid><description>Quanto mais variáveis globais existirem num programa, mais obscuro ele se tornará. Evita-as. Esta é uma das regras mais básicas da boa programação e deve ser seguida o mais possível. Mesmo se muitas variáveis tiverem de ser passadas entre rotinas. O esforço é um pouco maior, mas daí resultará código muito mais claro e seguro. Excepções podem ser feitas no caso de relatórios muito simples que revolvam à volta de uma única tabela interna, tabela esta que poderá ser declarada globalmente sem comprometer a clareza do código.</description></item><item><title>Como perguntar se a linha existe sem parecer antiquado</title><link>https://abapinho.com/2015/04/como-perguntar-se-a-linha-existe-sem-parecer-antiquado/</link><pubDate>Mon, 06 Apr 2015 14:08:12 +0000</pubDate><guid>https://abapinho.com/2015/04/como-perguntar-se-a-linha-existe-sem-parecer-antiquado/</guid><description>&lt;p>Há muito tempo atrás dizias &amp;ldquo;porreiro pá&amp;rdquo;. Depois começaste a dizer &amp;ldquo;baril&amp;rdquo;. Depois era &amp;ldquo;fixe&amp;rdquo;. Hoje dizes &amp;ldquo;altamente&amp;rdquo;. É importante não te baralhares para não dares mau aspecto.&lt;/p>
&lt;p>E como perguntas a uma tabela interna se a linha existe?&lt;/p></description></item><item><title>Usarás TRANSPORTING NO FIELDS</title><link>https://abapinho.com/2015/03/usaras-transporting-no-fields/</link><pubDate>Mon, 09 Mar 2015 09:00:02 +0000</pubDate><guid>https://abapinho.com/2015/03/usaras-transporting-no-fields/</guid><description>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.</description></item><item><title>Pré-definir SELECT-OPTIONs</title><link>https://abapinho.com/2015/02/pre-definir-select-options/</link><pubDate>Mon, 09 Feb 2015 09:00:23 +0000</pubDate><guid>https://abapinho.com/2015/02/pre-definir-select-options/</guid><description>&lt;p>O Abapinho recebeu uma carta.&lt;/p>
&lt;p>Sr Abapinho,&lt;/p>
&lt;p>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.&lt;/p></description></item><item><title>Cadeias de excepções</title><link>https://abapinho.com/2015/02/cadeias-de-excepcoes/</link><pubDate>Mon, 02 Feb 2015 09:00:48 +0000</pubDate><guid>https://abapinho.com/2015/02/cadeias-de-excepcoes/</guid><description>&lt;p>Hoje vou ensinar-te a encadear excepções. É uma solução muito práctica para um problema complicado mas pouco óbvio.&lt;/p>
&lt;p>Começo por descrever o problema.&lt;/p>
&lt;p>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.&lt;/p>
&lt;p>Tens várias hipóteses:&lt;/p></description></item><item><title>Ignorar excepções de um módulo de função</title><link>https://abapinho.com/2015/01/ignorar-excepcoes-de-um-modulo-de-funcao/</link><pubDate>Mon, 26 Jan 2015 09:00:25 +0000</pubDate><guid>https://abapinho.com/2015/01/ignorar-excepcoes-de-um-modulo-de-funcao/</guid><description>&lt;p>Quando chamas um módulo de função que devolve excepções normalmente dás-lhes números sequenciais tipo isto:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-ABAP" data-lang="ABAP">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00f">CALL FUNCTION&lt;/span> &lt;span style="color:#5a2">&amp;#39;VAI_ALI_MAS_VOLTA&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#00f">EXPORTING&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">ali&lt;/span> = &lt;span style="color:#5a2">&amp;#39;Barreiro&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#00f">EXCEPTIONS&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">NOT_FOUND&lt;/span> = &lt;span style="color:#3af">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#000">GOT_LOST&lt;/span> = &lt;span style="color:#3af">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#00f">OTHERS&lt;/span> = &lt;span style="color:#3af">3&lt;/span>.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>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.&lt;/p></description></item><item><title>Concatenemos</title><link>https://abapinho.com/2015/01/concatenemos/</link><pubDate>Mon, 05 Jan 2015 09:00:35 +0000</pubDate><guid>https://abapinho.com/2015/01/concatenemos/</guid><description>&lt;p>Temos duas variáveis:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-ABAP" data-lang="ABAP">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00f">DATA&lt;/span> &lt;span style="color:#000">palavra1&lt;/span> &lt;span style="color:#00f">TYPE &lt;/span>&lt;span style="color:#000">string&lt;/span>.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00f">DATA&lt;/span> &lt;span style="color:#000">palavra2&lt;/span> &lt;span style="color:#00f">TYPE &lt;/span>&lt;span style="color:#000">string&lt;/span>.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00f">DATA&lt;/span>: &lt;span style="color:#000">frase&lt;/span> &lt;span style="color:#00f">TYPE &lt;/span>&lt;span style="color:#000">string&lt;/span>.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">palavra1&lt;/span> = &lt;span style="color:#f00">‘&lt;/span>&lt;span style="color:#000">isto&lt;/span>&lt;span style="color:#f00">’&lt;/span>.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#000">palavra2&lt;/span> = &lt;span style="color:#f00">‘&lt;/span>&lt;span style="color:#000">aquilo&lt;/span>&lt;span style="color:#f00">’&lt;/span>.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;p>E queremos concatená-las metendo entre elas a palavra ‘mais’ e, claro, separando-as por espaços.&lt;/p></description></item><item><title>Onde está o booleano?</title><link>https://abapinho.com/2014/12/onde-esta-o-booleano/</link><pubDate>Wed, 10 Dec 2014 18:12:58 +0000</pubDate><guid>https://abapinho.com/2014/12/onde-esta-o-booleano/</guid><description>&lt;p>Não está.&lt;/p>
&lt;p>Mas eles - os senhores que fazem e refazem o ABAP propriamente dito - vão tentando remediar a situação.&lt;/p>
&lt;p>Olha por exemplo esta nova funcionalidade.&lt;/p></description></item><item><title>LOOP at tbl ASSIGNING &amp;lt;linha&amp;gt; CASTING</title><link>https://abapinho.com/2014/12/loop-at-tbl-into-linha-casting/</link><pubDate>Mon, 01 Dec 2014 09:50:19 +0000</pubDate><guid>https://abapinho.com/2014/12/loop-at-tbl-into-linha-casting/</guid><description>&lt;p>Sabias que podes fazer LOOP de uma tabela interna com uma estrutura A para dentro de uma estrutura do tipo B?&lt;/p></description></item><item><title>Não usarás CHECKs directamente em user-exits</title><link>https://abapinho.com/2014/11/nao-usaras-checks-directamente-em-user-exits/</link><pubDate>Mon, 10 Nov 2014 09:00:51 +0000</pubDate><guid>https://abapinho.com/2014/11/nao-usaras-checks-directamente-em-user-exits/</guid><description>É 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.</description></item><item><title>Usarás LIKE LINE OF itbl</title><link>https://abapinho.com/2014/10/usaras-like-line-of-itbl/</link><pubDate>Mon, 20 Oct 2014 10:25:10 +0000</pubDate><guid>https://abapinho.com/2014/10/usaras-like-line-of-itbl/</guid><description>Ao declarar uma estrutura que vai receber dados de uma tabela interna, em vez de a declarares directamente com o seu tipo, usa LIKE LINE OF. Assim, não só ficará claro que estão relacionadas como, se mudares o tipo da tabela interna, não terás de te preocupar em mudar também o tipo da estrutura.</description></item><item><title>Usarás uma tabela de constantes</title><link>https://abapinho.com/2014/08/usa-uma-tabela-de-constantes/</link><pubDate>Thu, 28 Aug 2014 09:00:45 +0000</pubDate><guid>https://abapinho.com/2014/08/usa-uma-tabela-de-constantes/</guid><description>Sempre que achares que um valor que estás a usar num programa pode mudar e não o puderes tornar um parâmetro de entrada ou do ecrã de seleccção, guarda-o numa tabela de constantes (ex: ZCONSTS). Esta tabela nunca deverá ser usada directamente. Em vez disso, cria uma classe ZCL_CONSTS que aceda a ela e usa sempre esta classe para obter as tuas constantes. Como é mostrado neste artigo: Não caias na tentação de usar a T900 ou outras tabelas do género para este propósito.</description></item><item><title>Criarás e adoptarás bibliotecas de ferramentas comuns</title><link>https://abapinho.com/2014/08/cria-e-adopta-bibliotecas-de-ferramentas-comuns/</link><pubDate>Thu, 21 Aug 2014 09:00:04 +0000</pubDate><guid>https://abapinho.com/2014/08/cria-e-adopta-bibliotecas-de-ferramentas-comuns/</guid><description>Código que seja usado comummente deve estar disponível centralmente, se possível guardado em pacotes bem identificados (ex: ZFERRAMENTAS) para que seja facilmente encontrados e transportados.
Há muito código já disponível na Internet que permite executar várias funções comummente necessárias (ex: ABAP2XLSX). Adopta-o;
Para as tuas tarefas mais comuns, desenvolve ferramentas que possas reutilizar, juntando-as à biblioteca central;
Divulga a biblioteca entre os colegas do teu projecto para evitar que venham a perder tempo a criar código duplicado;</description></item><item><title>Usarás o comando TABLES só quando inevitável</title><link>https://abapinho.com/2014/07/usaras-o-comando-tables-so-quando-inevitavel/</link><pubDate>Thu, 31 Jul 2014 09:00:20 +0000</pubDate><guid>https://abapinho.com/2014/07/usaras-o-comando-tables-so-quando-inevitavel/</guid><description>Uma das únicas situações onde é inevitável é com SELECT-OPTIONS. Em todos os outros casos, declara explicitamente uma variável local com uma estrutura equivalente. Basicamente o comando TABLES cria variáveis globais obscuras que aumentam a ambiguidade do código. E variáveis globais devem ser evitadas na maior parte dos casos.</description></item><item><title>Usarás FIELD-SYMBOLs em vez de variáveis de estrutura</title><link>https://abapinho.com/2014/07/usaras-field-symbols-em-vez-de-variaveis-de-estrutura/</link><pubDate>Thu, 24 Jul 2014 09:00:50 +0000</pubDate><guid>https://abapinho.com/2014/07/usaras-field-symbols-em-vez-de-variaveis-de-estrutura/</guid><description>READ TABLE itbl ASSIGNING é sempre mais rápido que READ TABLE itbl INTO wa. Além disso, quando precisares de alterar dados em registos de uma tabela interna, assim não precisas de usar o comando MODIFY nem da variável auxiliar que às vezes usas para guardar o SY-TABIX. A única situação em que uma variável de estrutura é aconselhada é quando queres adicionar linhas novas a uma tabela interna. Algumas pessoas defendem que as variáveis de estrutura devem ser usadas sempre que não se quiser alterar os dados da tabela interna.</description></item><item><title>Pacotes 2.0</title><link>https://abapinho.com/2014/07/pacotes-2-0/</link><pubDate>Mon, 21 Jul 2014 09:00:12 +0000</pubDate><guid>https://abapinho.com/2014/07/pacotes-2-0/</guid><description>&lt;p>O repositório do R/3 é uma coisa maravilhosa. Um vasto armazém de elementos de dados, estruturas, tabelas e muito mais, prontamente disponíveis a todos. Como programadores, é fácil e conveniente escolher estes objectos e puxa-los para os nossos programas à medida das necessidades sem que a preciosa linha de pensamento seja interrompida.
Mas nem tudo é sol e flores. Se não tiveres cuidado com os cogumelos que apanhas podes dar por ti com um envenenado entre mãos.&lt;/p></description></item><item><title>Agruparás partes que estejam relacionadas</title><link>https://abapinho.com/2014/07/agruparas-partes-que-estejam-relacionadas/</link><pubDate>Thu, 17 Jul 2014 09:00:16 +0000</pubDate><guid>https://abapinho.com/2014/07/agruparas-partes-que-estejam-relacionadas/</guid><description>Às vezes encontras um IMPORT no código mas não fazes ideia onde está o EXPORT correspondente. Quando for necessário comunicar entre programas distintos, isto deverá ser feito através de um par de métodos de uma mesma classe. Assim, quando nos cruzarmos com um, conseguimos facilmente saber qual é o outro. Para implementar esta comunicação, evita utilizar EXPORT/IMPORT sempre que possível. Ao invés, usa um atributo estático da classe.</description></item><item><title>Evitarás mensagens dinâmicas</title><link>https://abapinho.com/2014/07/evitaras-mensagens-dinamicas/</link><pubDate>Thu, 10 Jul 2014 08:30:17 +0000</pubDate><guid>https://abapinho.com/2014/07/evitaras-mensagens-dinamicas/</guid><description>Quando precisares de enviar uma mensagem dinâmica por parâmetro, garante que ainda assim usas o comando MESSAGE de forma a que o “where-used” não lhe perca o rasto. Ao fazeres MESSAGE E001 INTO V_DUMMY, os detalhes da mensagem ficam disponível nas variáveis de sistema SY-MSGNO, SY-MSGTY, etc. Além disso, os textos das mensagens nunca devem ficar explicitamente definidos no programa mas sim definidos através da transacção SE91. https://abapinho.com/2009/09/evitar-mensagens-dinamicas/</description></item><item><title>Não implementarás código em user-exits</title><link>https://abapinho.com/2014/06/nao-implementaras-codigo-em-user-exits-badis-enhancements-etc/</link><pubDate>Thu, 26 Jun 2014 09:00:47 +0000</pubDate><guid>https://abapinho.com/2014/06/nao-implementaras-codigo-em-user-exits-badis-enhancements-etc/</guid><description>Todo o código que colocares em user-exits (BADIs, enhancements, SMOD, etc.) deverá ser encapsulado.
É comum incluir num user-exit múltiplas partes independentes. Cada uma destas partes deverá ser encapsulada no seu próprio método. Mesmo que seja constituída por apenas uma linha de código;
Isto deve ser aplicado tanto a implementações novas como a alterações a código existente;
A necessidade de alteração de código existente deverá ser vista sempre como uma oportunidade para reorganizar em métodos código clássico existente, uma vez que este terá necessariamente de ser testado de novo;</description></item><item><title>Não implementarás blocos de processamento clássico</title><link>https://abapinho.com/2014/06/nao-implementaras-blocos-de-processamento-classico/</link><pubDate>Thu, 19 Jun 2014 09:00:32 +0000</pubDate><guid>https://abapinho.com/2014/06/nao-implementaras-blocos-de-processamento-classico/</guid><description>Official ABAP Programming Guidelines (page 34): [Quando um bloco de processamento clássico for necessário], deves imediatamente delegar a execução para um método apropriado (ver a regra 6.37, Não implementes código dentro de Módulos de Função nem dentro de Subrotinas, e a regra 6.44, Não implementes código dentro de Módulos de Diálogo nem de Blocos de Evento).</description></item><item><title>SELECT dentro de SELECT</title><link>https://abapinho.com/2014/05/select-dentro-de-select/</link><pubDate>Mon, 26 May 2014 09:00:03 +0000</pubDate><guid>https://abapinho.com/2014/05/select-dentro-de-select/</guid><description>&lt;p>Provavelmente por razões históricas, os programadores ABAP não exploram as possibilidades do SQL. Muitos há que em vez de usarem INNER JOINs, ainda julgam que é mais rápido fazer vários SELECTs para tabelas internas e depois trabalhar os dados em ABAP. Mas a verdade é que, mesmo que se haja excepções, a regra é: quanto menos acessos à base de dados, melhor a performance. E faz sentido porque, afinal, porque foram escritas explicitamente para isso, as bases de dados relacionais são muito mais peritas em processar dados relacionais do que um programa ABAP.&lt;/p>
&lt;p>Mas claro que há coisas que, pela sua complexidade, não podem ser feitas com um simples INNER JOIN. Ainda assim, algumas dessas coisas podem ser feitas num único SELECT.&lt;/p></description></item><item><title>Boas prácticas do Abapinho</title><link>https://abapinho.com/2014/03/boas-practicas-do-abapinho/</link><pubDate>Mon, 17 Mar 2014 09:00:54 +0000</pubDate><guid>https://abapinho.com/2014/03/boas-practicas-do-abapinho/</guid><description>Ao longo dos últimos tempos compilei um conjunto de boas prácticas que fui adoptando para mim próprio. Resolvi partilhá-las aqui, criando para isso uma nova categoria (que aparecerá em breve no menu à esquerda) sob a qual serão agrupadas. A ideia original era fazer um PDF mas, como elas estão em constante revisão e ampliação, tornava-se pouco práctico. Como tal, serão publicadas uma a uma.
O objectivo é que estas possam ser vistas no seu conjunto como uma referência acessível de fácil consulta.</description></item><item><title>O detective do ABAP</title><link>https://abapinho.com/2014/03/o-detective-do-abap/</link><pubDate>Mon, 10 Mar 2014 09:00:42 +0000</pubDate><guid>https://abapinho.com/2014/03/o-detective-do-abap/</guid><description>&lt;p>Em SAP, quando um desenvolvimento está concluído, chega finalmente o momento de o enviar para outros sistemas onde pode ser devidamente testado e por fim executado pelos utilizadores.
Mas antes disso, é crucial verificar se não existem lapsos, erros e afins que possam levar ao aparecimento de alguns comportamentos imprevisíveis por parte dos nossos programas.
Existe uma ferramenta muito útil que permite filtrar alguns desses erros e lacunas. Chama-se ABAP Code Inspector.&lt;/p></description></item><item><title>APPEND LINES OF classe->metodo() TO itbl</title><link>https://abapinho.com/2014/01/append-lines-of-classe-metodo-to-itbl/</link><pubDate>Mon, 27 Jan 2014 22:33:25 +0000</pubDate><guid>https://abapinho.com/2014/01/append-lines-of-classe-metodo-to-itbl/</guid><description>&lt;p>O ABAP anda cada vez mais esperto. Ainda sou do tempo em que não se fazia nada dele. E agora, lentamente, com mais de um quinto de século de atraso, lá vai tentado imitar o C e o Java e ficando mais flexível.&lt;/p>
&lt;p>Eu ia fazer algo deste tipo:&lt;/p></description></item><item><title>Usa sempre classes de mensagens nas classe de excepção</title><link>https://abapinho.com/2013/12/classes-de-mensagens-nas-classe-de-excepcao/</link><pubDate>Mon, 16 Dec 2013 09:00:49 +0000</pubDate><guid>https://abapinho.com/2013/12/classes-de-mensagens-nas-classe-de-excepcao/</guid><description>&lt;p>As classes de excepção permitem declarar múltiplos textos que descrevem os diferentes erros possíveis que elas podem representar.&lt;/p>
&lt;p>Há no entanto uma opção para a associar a uma classe de mensagens (SE91). Isto permite que, em vez de os textos serem definidos directamente ali na classe de excepção, sejam antes definidos como clássicas mensagens da SE91. E tem vantagens.&lt;/p></description></item><item><title>Funções Z misturadas com vistas de manutenção, não!</title><link>https://abapinho.com/2013/06/funcoes-z-com-vistas-de-manutencao-nao/</link><pubDate>Mon, 24 Jun 2013 09:00:02 +0000</pubDate><guid>https://abapinho.com/2013/06/funcoes-z-com-vistas-de-manutencao-nao/</guid><description>&lt;p>A dica de hoje não é uma dica. É um conselho.&lt;/p>
&lt;p>Criada uma tabela, depois crias as suas vistas de manutenção. As vistas de manutenção vivem dentro de um grupo de funções. Grupo de funções esse que te é pedido aquando da criação delas. Porque afinal aquilo não passa de um conjunto de código gerado, sendo que a maior parte são ainda assim includes standard. Montes deles.&lt;/p>
&lt;p>Apresento-te o problema: há quem crie funções Z suas e as coloque em grupos de função que contêm vistas de manutenção. É verdade. Há quem o faça.&lt;/p></description></item><item><title>Gosto do LIKE</title><link>https://abapinho.com/2013/06/gosto-do-like/</link><pubDate>Mon, 17 Jun 2013 09:00:16 +0000</pubDate><guid>https://abapinho.com/2013/06/gosto-do-like/</guid><description>&lt;p>Nos maus velhos tempos em que o ABAP era ainda mais antiquado do que é hoje, as declarações de variáveis eram quase todas feitas com LIKE e referenciadas a campos de tabelas:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-ABAP" data-lang="ABAP">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00f">DATA&lt;/span>: &lt;span style="color:#000">V_KUNNR&lt;/span> &lt;span style="color:#00f">LIKE &lt;/span>&lt;span style="color:#000">KNA1&lt;/span>-&lt;span style="color:#000">KUNNR&lt;/span>.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Escrever dinheiro sem preocupações decimais</title><link>https://abapinho.com/2013/05/escrever-dinheiro-sem-preocupacoes-decimais/</link><pubDate>Mon, 13 May 2013 09:00:50 +0000</pubDate><guid>https://abapinho.com/2013/05/escrever-dinheiro-sem-preocupacoes-decimais/</guid><description>&lt;p>Há quem leia a TCURX para descobrir o número de casas decimais de uma MOEDA quando precisa de escrever um campo endinheirado para uma variável ALFANUMERICA.&lt;/p>
&lt;p>És assim? Não sejas.&lt;/p></description></item><item><title>Finalmente encadeiam-se expressões</title><link>https://abapinho.com/2013/04/expressoes-encadeadas/</link><pubDate>Mon, 15 Apr 2013 09:00:33 +0000</pubDate><guid>https://abapinho.com/2013/04/expressoes-encadeadas/</guid><description>&lt;p>Finalmente, com o &lt;em>SAP NetWeaver 7.0 Enhancement Package 2&lt;/em> o ABAP começa a parecer-se com uma linguagem de programação normal.&lt;/p>
&lt;p>Até já dá para encadear expressões, vê lá tu!&lt;/p></description></item><item><title>Decimais para alfa-numéricos sem depender do utilizador</title><link>https://abapinho.com/2013/04/decimais-para-alfa-numericos-sem-depender-do-utilizador/</link><pubDate>Mon, 08 Apr 2013 09:00:46 +0000</pubDate><guid>https://abapinho.com/2013/04/decimais-para-alfa-numericos-sem-depender-do-utilizador/</guid><description>&lt;p>Ao ler um ficheiro com valores numéricos para uma tabela interna ou vice-versa, o sucesso da conversão destes depende de o utilizador tem definido o ponto ou a vírgula como separador decimal. É costume ir então ler a configuração do utilizador e depois, adaptar os valores vindos do ficheiro com ponto ou vírgula conforme.&lt;/p>
&lt;p>Mas isto é lamentável e pouco elegante. Devia haver uma forma de não fazer a coisa depender do utilizador.&lt;/p>
&lt;p>E há.&lt;/p></description></item><item><title>Partilhar constantes entre várias classes</title><link>https://abapinho.com/2013/03/partilhar-constantes-entre-varias-classes/</link><pubDate>Mon, 25 Mar 2013 09:00:35 +0000</pubDate><guid>https://abapinho.com/2013/03/partilhar-constantes-entre-varias-classes/</guid><description>&lt;p>Imagina que tens uma manada de classes relacionadas as quais partilham entre elas uma manada de constantes. Dizendo a mesma coisa de outra forma, gostavas que todas as classes da manada tivessem acesso de forma simples à manada de constantes.&lt;/p>
&lt;p>(Se estás baralhado, fica sabendo que a manada era só para baralhar)&lt;/p>
&lt;p>Continuando.&lt;/p></description></item><item><title>Criar RANGEs no DDIC sem ficar com os dentes a ranger</title><link>https://abapinho.com/2013/03/ranges-no-ddic/</link><pubDate>Mon, 04 Mar 2013 18:26:40 +0000</pubDate><guid>https://abapinho.com/2013/03/ranges-no-ddic/</guid><description>&lt;p>Cada vez uso mais RANGEs. Uso-os ao pequeno-almoço, ao almoço, ao jantar e fora das refeições. É como o molho de soja. Umas colheradas daquilo e fica logo tudo mais saboroso.&lt;/p></description></item><item><title>Vantagens do LIKE LINE OF</title><link>https://abapinho.com/2012/11/vantagens-do-like-line-of/</link><pubDate>Mon, 26 Nov 2012 09:00:40 +0000</pubDate><guid>https://abapinho.com/2012/11/vantagens-do-like-line-of/</guid><description>&lt;p>Partamos do princípio de que és uma pessoa com alguma dignidade e que por isso já não usas tabelas internas com HEADER LINE ;)&lt;/p>
&lt;p>Posto isto, imaginemos que declaras uma tabela interna:&lt;/p></description></item><item><title>INSERT e APPEND com ASSIGNING FIELD-SYMBOL</title><link>https://abapinho.com/2012/11/insert-initial-line-into-table/</link><pubDate>Mon, 05 Nov 2012 09:00:11 +0000</pubDate><guid>https://abapinho.com/2012/11/insert-initial-line-into-table/</guid><description>&lt;p>A verdade nua e crua, custe o que custar, é que as estruturas estão fora de moda. Agora o que está em voga é FIELD-SYMBOLS.&lt;/p>
&lt;p>Quando fazes um LOOP a uma tabela interna, claro que também &lt;a href="https://abapinho.com/2011/07/assigning-vs-into/">usas ASSIGNING FIELD-SYMBOL em vez de INTO estrutura&lt;/a>, não é?&lt;/p>
&lt;p>Mas o que me lixava era o APPEND e o INSERT. Ainda não sabia como evitar usar uma estrutura para adicionar registos.&lt;/p></description></item><item><title>Se ainda não usas ABAP Objects és mariquinhas pé-de-salsa</title><link>https://abapinho.com/2012/10/mariquinhas-pe-de-salsa/</link><pubDate>Mon, 01 Oct 2012 09:00:20 +0000</pubDate><guid>https://abapinho.com/2012/10/mariquinhas-pe-de-salsa/</guid><description>A SAP tem um livro chamado Official ABAP Programming Guidelines que descreve regras e boas práticas de como programar em ABAP. E lá diz assim (dizia em estrangeiro, eu traduzi):
Pág. 42: Regra 3.1: Usa ABAP Objects sempre que possível para novos desenvolvimentos. Só podes criar blocos de processamento clássicos em casos excepcionais.
Pág. 45: Num bloco de processamento clássico, deverás delegar imediatamente a execução para um método apropriado (ver Regra 6.</description></item><item><title>Mais RANGEs, menos SELECTs</title><link>https://abapinho.com/2012/06/mais-ranges-menos-selects/</link><pubDate>Mon, 04 Jun 2012 09:00:33 +0000</pubDate><guid>https://abapinho.com/2012/06/mais-ranges-menos-selects/</guid><description>&lt;p>O dicionário diz o seguinte do verbete &amp;ldquo;estilo&amp;rdquo;: &amp;ldquo;conjunto de aspectos formais e recursos expressivos que caracterizam um texto&amp;rdquo;.&lt;/p>
&lt;p>Dá mais gosto ler textos com estilo do que textos sem estilo. Se o ABAP é uma linguagem, um programa em ABAP é um texto. Há programas que, no que toca ao estilo, parecem escritos com os pés; enquanto há outros que se poderia jurar que a pena que os escreveu deixou-se guiar pelas alvas mãos de uma qualquer donzela do século XVIII afligida por males de amor. Felizmente penso que não é possível escrever programas em ABAP tão pirosos quanto esta última frase.&lt;/p>
&lt;p>Aqui no Abapinho usa-se a etiqueta &amp;ldquo;estilo&amp;rdquo; para identificar artigos que falam sobre isso mesmo: estilo. Estes artigos tentam encontrar formas de melhorar o estilo dos programas ABAP. Esta é uma das etiquetas favoritas do Abapinho como podes ver &lt;a href="https://abapinho.com/tags/estilo/">aqui&lt;/a>. E isto que estás a ler é mais um desses artigos.&lt;/p>
&lt;p>Adiante.&lt;/p></description></item><item><title>Constantes gregárias</title><link>https://abapinho.com/2012/05/constantesgregarias/</link><pubDate>Mon, 14 May 2012 10:00:28 +0000</pubDate><guid>https://abapinho.com/2012/05/constantesgregarias/</guid><description>&lt;p>Se és daqueles que, em vez de usarem constantes, espetam com os valores directamente no código, então pára de ler isto e vai ali para o canto de castigo durante 1 hora que é para aprenderes a não ser mandrião. Quando voltares podes continuar a ler.&lt;/p></description></item><item><title>Pesquisar por atributos de objectos em tabelas internas</title><link>https://abapinho.com/2012/03/atributos-de-objectos-em-tabelas-internas/</link><pubDate>Mon, 26 Mar 2012 10:00:17 +0000</pubDate><guid>https://abapinho.com/2012/03/atributos-de-objectos-em-tabelas-internas/</guid><description>&lt;p>Há cada vez mais objectos em ABAP, cada vez menos medo deles e, vê só!, cada vez mais gente a escrevê-los e a usá-los. Ora, se começam a aparecer objectos por todo o lado, é normal e desejável que comecem a enfiá-los também dentro de tabelas internas. Também eu guardei há uns tempos um monte de objectos dentro de tabelas mas infelizmente na altura não sabia disto que vou ensinar aqui. Tinha-me dado jeito.&lt;/p>
&lt;p>Mas afinal o que vou eu ensinar aqui?&lt;/p></description></item><item><title>O que diz uma mensagem?</title><link>https://abapinho.com/2012/01/texto-mensagem/</link><pubDate>Mon, 02 Jan 2012 10:00:15 +0000</pubDate><guid>https://abapinho.com/2012/01/texto-mensagem/</guid><description>Queres obter o texto de uma mensagem da qual só sabes o ID e o número e não sabes como? Aprende aqui:
DATA texto TYPE string. MESSAGE ID &amp;#39;00&amp;#39; TYPE &amp;#39;E&amp;#39; NUMBER &amp;#39;163&amp;#39; WITH &amp;#39;123&amp;#39; INTO texto. É só isto. Agora do lado de dentro da variável texto encontras o seguinte texto:
&amp;ldquo;O mandante 123 não existe no sistema&amp;rdquo;
Obrigado a Peteris B pela foto.
O Abapinho saúda-vos.</description></item><item><title>Automatizar catálogo de campos de ALV</title><link>https://abapinho.com/2011/12/automatizar-catalogo-alv/</link><pubDate>Mon, 12 Dec 2011 10:00:00 +0000</pubDate><guid>https://abapinho.com/2011/12/automatizar-catalogo-alv/</guid><description>&lt;p>Às vezes pergunto-me qual será, no mundo, a percentagem de código ABAP desnecessário. Um exemplo paradigmático de como se pode desperdiçar tempo a escrever código que não serve para nada e só prejudica é a tão frequente definição das descrições dos campos de uma ALV directamente em ABAP.&lt;/p></description></item><item><title>Adeus DESCRIBE TABLE. Já vais tarde.</title><link>https://abapinho.com/2011/11/lines/</link><pubDate>Mon, 07 Nov 2011 10:20:18 +0000</pubDate><guid>https://abapinho.com/2011/11/lines/</guid><description>Durante doze anos Quando quis contar As linhas de uma itab Fazia o que todos fazem: DESCRIBE TABLE itab LINES linhas.
Até que outro dia Vi uma coisa que, Parece mentira, Nunca antes vira: LINES( itab ).
Dá no mesmo E sem ter de declarar O raio da variável.
Assim, em vez de:
DATA: linhas TYPE i. DESCRIBE TABLE itabl LINES linhas. IF linhas = 42. WRITE &amp;#39;A tua tabela é a verdade&amp;#39;.</description></item><item><title>A mensagem travesti</title><link>https://abapinho.com/2011/10/mensagem-travesti/</link><pubDate>Mon, 31 Oct 2011 10:00:55 +0000</pubDate><guid>https://abapinho.com/2011/10/mensagem-travesti/</guid><description>Nos módulos AT SELECTION-SCREEN de um REPORT é-te possível lançar mensagens de erro e voltar ao ecrã de selecção. Mas uma vez que passes do START-OF-SELECTION, se lançares uma mensagem de erro, o programa termina. A solução para dar um erro e, ainda assim, regressar ao ecrã de selecção, é travestir a mensagem:
START-OF-SELECTION. IF condicao_desejada. MESSAGE S208(00) with &amp;#39;Erro!&amp;#39; DISPLAY LIKE &amp;#39;E&amp;#39;. EXIT. ENDIF. WRITE &amp;#39;Olá, eu sou o resto do programa&amp;#39;.</description></item><item><title>O circunlóquio do VALUE CHECK</title><link>https://abapinho.com/2011/10/value-check/</link><pubDate>Mon, 24 Oct 2011 10:00:24 +0000</pubDate><guid>https://abapinho.com/2011/10/value-check/</guid><description>Nunca te aconteceu esbarrares com uma coisa no ABAP que parece que é mas não é? A documentação diz que é, tudo indica que assim seja, e depois afinal não é.
Provavelmente já precisaste de, ao definir um parâmetro no ecrã de selecção de um relatório, limitar as possibilidades do que o utilizador pode introduzir aos valores disponíveis no tipo de dados desse parâmetro, certo? Para isto existe o VALUE CHECK.</description></item><item><title>De pé ó vítimas da fome</title><link>https://abapinho.com/2011/10/importar-classes-locais/</link><pubDate>Tue, 11 Oct 2011 10:55:54 +0000</pubDate><guid>https://abapinho.com/2011/10/importar-classes-locais/</guid><description>Classes. Sempre as houve entre as pessoas. Mas no ABAP ainda há poucos que as tenham em conta. Se ser classicista na sociedade pode resultar em pedantismo, no ABAP, a única luta de classes é a que alguns travam para que estas sejam mais usadas.
Há dois tipos de classes: as globais e as locais. As globais são criadas na transacção SE24. As locais, que por sinal dou por mim a usar cada vez mais, são feitas declarativamente na SE38.</description></item><item><title>SPLIT INTO TABLE</title><link>https://abapinho.com/2011/10/split-into-table/</link><pubDate>Mon, 03 Oct 2011 10:00:13 +0000</pubDate><guid>https://abapinho.com/2011/10/split-into-table/</guid><description>Aqui vos mostro uma forma criativa de preencher uma tabela interna com constantes que aprendi num programa standard. Imagina que querias criar uma tabela interna com os seguintes tipos de documento financeiro:
AB AF CH DG DZ EX F3 F4.
A forma mais convencional seria assim:
DATA: t_blart TYPE STANDARD TABLE OF blart, wa_blart LIKE LINE OF t_blart. wa_blart = &amp;#39;AB&amp;#39;. APPEND wa_blart TO t_blart. wa_blart = &amp;#39;AF&amp;#39;. APPEND wa_blart TO t_blart.</description></item><item><title>Parâmetros não parametrizáveis</title><link>https://abapinho.com/2011/09/parametros-nao-parametrizaveis/</link><pubDate>Mon, 12 Sep 2011 10:00:52 +0000</pubDate><guid>https://abapinho.com/2011/09/parametros-nao-parametrizaveis/</guid><description>Volta não volta aparece um cliente que pede a um funcional que pede a um programador que crie um parâmetro protegido contra escrita no ecrã de selecção de um programa. É um bocado cretino visto que a ideia dos parâmetros é serem parametrizáveis.
Mas enfim, vê-se de tudo.
Os clientes têm tanta imaginação que a SAP devia criar um módulo de cinema, SAP CI, especialmente para eles poderem realizar os tantos filmes que lhes vão na cabeça.</description></item><item><title>CASE de pernas para o ar</title><link>https://abapinho.com/2011/08/case-de-pernas-para-o-ar/</link><pubDate>Mon, 08 Aug 2011 10:00:47 +0000</pubDate><guid>https://abapinho.com/2011/08/case-de-pernas-para-o-ar/</guid><description>Qual é a tua cor preferida?
SELECTION-SCREEN BEGIN OF BLOCK b1. PARAMETERS: p_azul BUTTONGROUP GROUP COR DEFAULT &amp;#39;X&amp;#39;, p_verde BUTTONGROUP GROUP COR, p_roxo BUTTONGROUP GROUP COR. SELECTION-SCREEN END OF BLOCK b1. Se respondeste azul sobrevives e podes atravessar a ponte.
De qualquer das formas, em ABAP costuma fazer-se o seguinte para descobrir a cor que o utilizador escolheu:
IF p_azul = &amp;#39;X&amp;#39;. lv_cor = &amp;#39;AZUL&amp;#39;. ELSE IF p_verde = &amp;#39;X&amp;#39;. lv_cor = &amp;#39;VERDE&amp;#39;.</description></item><item><title>As funções *_SINGLE_READ</title><link>https://abapinho.com/2011/08/funcoes-single-read/</link><pubDate>Mon, 01 Aug 2011 10:43:04 +0000</pubDate><guid>https://abapinho.com/2011/08/funcoes-single-read/</guid><description>&lt;p>Quando se quer obter um único registo de uma tabela da base de dados é costume usar-se o SELECT SINGLE que, como toda a gente sabe, na sua forma mais básica reza assim:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="background-color:#fff;-moz-tab-size:2;-o-tab-size:2;tab-size:2;">&lt;code class="language-ABAP" data-lang="ABAP">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#00f">SELECT&lt;/span> &lt;span style="color:#00f">SINGLE&lt;/span> *
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#00f">FROM&lt;/span> &lt;span style="color:#000">KNA1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#00f">WHERE&lt;/span> &lt;span style="color:#000">KUNNR&lt;/span> = &lt;span style="color:#5a2">&amp;#39;1234567890&amp;#39;&lt;/span>.&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>RANGE instantâneo - É só juntar água</title><link>https://abapinho.com/2011/07/range-instantaneo/</link><pubDate>Mon, 11 Jul 2011 11:07:07 +0000</pubDate><guid>https://abapinho.com/2011/07/range-instantaneo/</guid><description>Vou ensinar-te uma fórmula mágica para gerar um RANGE em que praticamente é só juntar água.
Imagina que queres fazer um RANGE a partir de uma seleção da base de dados para depois o utilizar num outro SELECT qualquer. Claro que o poderias fazer assim:
DATA: lt_kunnr TYPE STANDARD TABLE OF kunnr, lr_kunnr TYPE RANGE OF kunnr, wa_kunnr LIKE LINE OF lr_kunnr. FIELD-SYMBOLS: &amp;lt;kunnr&amp;gt; LIKE LINE OF lt_kunnr. SELECT kunnr INTO TABLE lt_kunnr FROM kna1.</description></item><item><title>LOOP ASSIGNING em vez de LOOP INTO</title><link>https://abapinho.com/2011/07/assigning-vs-into/</link><pubDate>Sat, 02 Jul 2011 12:25:03 +0000</pubDate><guid>https://abapinho.com/2011/07/assigning-vs-into/</guid><description>&lt;p>No princípio era o INTO.
Aliás, no princípio nem sequer era o INTO.&lt;/p></description></item><item><title>Macros globais</title><link>https://abapinho.com/2011/05/macros-globais/</link><pubDate>Thu, 19 May 2011 18:02:41 +0000</pubDate><guid>https://abapinho.com/2011/05/macros-globais/</guid><description>Noutro artigo falámos de macros, uma funcionalidade relativamente obscura e pouco utilizada que tanto pode ser útil como criar uma grande salganhada. Mas estas não são as únicas macros do ABAP. Há outras, ainda mais obscuras e com ainda maior potencial de enfarelhamento de um sistema: as macros globais.
Nem sei se revele isto de tão esquisito que é&amp;hellip; Mas também não me parece bem escondê-lo&amp;hellip; Seja, revelarei.
É possível definir macros a nível global do sistema que podem ser utilizadas em qualquer programa ABAP.</description></item><item><title>Import/Export = Contrabando</title><link>https://abapinho.com/2010/08/importexport/</link><pubDate>Sat, 14 Aug 2010 00:37:24 +0000</pubDate><guid>https://abapinho.com/2010/08/importexport/</guid><description>&lt;p>O Java, uma linguagem de programação bem pensada, ajuda o programador a organizar o seu código obrigando-o a desenvolvê-lo de forma estruturada. A sua própria filosofia potencia o pensamento estruturado e promove coerência e arrumação.&lt;/p>
&lt;p>Já o ABAP&amp;hellip; promove o caos. Está cheio de caminhos perniciosos que levam direitinho a um inferno confuso e labiríntico. E geralmente são as coisas aparentemente mais convenientes que se revelam as mais perigosas.&lt;/p>
&lt;p>Uma das conveniências piores é a parelha &lt;strong>IMPORT&lt;/strong> e &lt;strong>EXPORT&lt;/strong>.&lt;/p></description></item><item><title>Macros - Velocidade de ponta</title><link>https://abapinho.com/2009/09/macros-velocidade-de-ponta/</link><pubDate>Wed, 16 Sep 2009 02:37:52 +0000</pubDate><guid>https://abapinho.com/2009/09/macros-velocidade-de-ponta/</guid><description>&lt;p>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.&lt;/p>
&lt;p>Aparentes porquê?&lt;/p></description></item><item><title>Evitar mensagens dinâmicas</title><link>https://abapinho.com/2009/09/evitar-mensagens-dinamicas/</link><pubDate>Mon, 07 Sep 2009 17:40:15 +0000</pubDate><guid>https://abapinho.com/2009/09/evitar-mensagens-dinamicas/</guid><description>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.</description></item><item><title>READ TABLE blablabla TRANSPORTING NO FIELDS</title><link>https://abapinho.com/2009/08/transporting-no-fields/</link><pubDate>Thu, 20 Aug 2009 04:51:19 +0000</pubDate><guid>https://abapinho.com/2009/08/transporting-no-fields/</guid><description>Por vezes ao fazer READ TABLE a uma tabela interna queremos apenas verificar se um determinado registo existe, e não nos preocupamos com os dados retornados. Algo tipo:
READ TABLE lt_kna1 INTO wa_kna1 WITH KEY kunnr = l_kunnr. CHECK SY-SUBRC = 0. Ora já que a estrutura WA_KNA1 não vai ser necessária de qualquer forma, mais vale não a usar, usando antes a opção TRANSPORTING NO FIELDS:
READ TABLE lt_kna1 TRANSPORTING NO FIELDS WITH KEY kunnr = l_kunnr.</description></item></channel></rss>