<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Abapinho</title>
	<atom:link href="https://abapinho.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://abapinho.com</link>
	<description>ABAP em português</description>
	<lastBuildDate>Fri, 07 Jan 2022 21:56:55 +0000</lastBuildDate>
	<language>pt-PT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.8.3</generator>
<site xmlns="com-wordpress:feed-additions:1">103302775</site>	<item>
		<title>Se amas o próximo, evita o CLEAR</title>
		<link>https://abapinho.com/2021/12/evita-o-clear/</link>
					<comments>https://abapinho.com/2021/12/evita-o-clear/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 13 Dec 2021 09:00:59 +0000</pubDate>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[estilo]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4771</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/12/piacaba.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/12/piacaba.jpg?w=374&amp;ssl=1 374w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/12/piacaba.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/12/piacaba.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Demasiadas regressões acontecem porque alguém se esquece de fazer CLEAR ou de não fazer CLEAR a uma variável. Estes são os cenários em que já vi o CLEAR ser usado: Antes de atribuir o valor a uma variável; Antes, durante ou depois de um ciclo (LOOP, DO ou outro), para fazer reset a uma variável [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/12/evita-o-clear/">Se amas o próximo, evita o CLEAR</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/12/piacaba.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/12/piacaba.jpg?w=374&amp;ssl=1 374w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/12/piacaba.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/12/piacaba.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Demasiadas regressões acontecem porque alguém se esquece de fazer CLEAR ou de não fazer CLEAR a uma variável.</p>
<p><span id="more-4771"></span></p>
<p>Estes são os cenários em que já vi o CLEAR ser usado:</p>
<ol>
<li>Antes de atribuir o valor a uma variável;</li>
<li>Antes, durante ou depois de um ciclo (LOOP, DO ou outro), para fazer reset a uma variável auxiliar;</li>
<li>No início de uma rotina para iniciar os seus parâmetros;</li>
<li>Quando uma tabela interna grande já não é precisa, para libertar memória;</li>
<li>Porque é PRECISO fazer CLEAR a uma variável.</li>
</ol>
<p>Vamos analisar cada um dos cenários:</p>
<p>1. Antes de atribuir o valor a uma variável</p>
<p>Custa a acreditar mas já vi isto várias vezes:</p>
<pre><code>
DATA sum TYPE i.
CLEAR sum.
sum = a + b.
</code></pre>
<p>É redundante. É inútil. É pateta.</p>
<p>Ou isto:</p>
<pre><code>
LOOP AT itbl INTO wa.
  calc = wa-a + wa-b.
  (...)
  CLEAR calc.
ENDLOOP.
</code></pre>
<p>Não parece tão pateta como o primeiro exemplo, mas é.</p>
<p>Conclusão: é sempre inútil. Pára de fazer isto.</p>
<p>2. Antes, durante ou depois de um ciclo</p>
<p>Isto é inútil, claro:</p>
<pre><code>
LOOP AT itbl INTO wa.
  (...)
  CLEAR wa.
ENDLOOP.
</code></pre>
<p>Livra-te desse CLEAR.</p>
<p>Isto já não é inútil:</p>
<pre><code>
METHOD report_itbl_a.
  DATA sum TYPE i.
  LOOP AT itbl_a INTO wa.
    CLEAR sum.
    LOOP AT itbl_b INTO wb WHERE a = wa-a.
      sum = sum + wb-value.
    ENDLOOP.
    WRITE: / wa-a, sum.
  ENDLOOP.
ENDMETHOD.
</code></pre>
<p>No entanto, este CLEAR também pode ser evitado se <a href="https://refactoring.com/catalog/extractFunction.html">encapsularmos</a> o conteúdo do LOOP exterior:</p>
<pre><code>
METHOD report_itbl_a.
  LOOP AT itbl_a INTO wa.
    sum = sum_itbl_b( wa-a ).
    WRITE: / wa-a, sum.
  ENDLOOP:
ENDMETHOD.

METHOD sum_itbl_b.
  result = REDUCE #(
    INIT sum = 0
    FOR wa in itbl_b WHERE ( a = a )
    NEXT sum = sum + wa-value ).
ENDMETHOD.
</code></pre>
<p>Assim o CLEAR já não é necessário porque a variável auxiliar é local ao método SUM_ITBL_B.</p>
<p>A maior parte dos CLEARs podem ser evitados se o <i>scope</i> das variáveis auxiliares for o menor possível.</p>
<p>3. Para inicializar os parâmetros de uma rotina</p>
<p>Reumindo:</p>
<ul>
<li>IMPORTING: Não podes nem deves fazer-lhes CLEAR;</li>
<li>CHANGING: Se a lógica de negócio o exigir, pode fazer sentido usar o CLEAR;</li>
<li>RETURNING: Isto é sempre passado por valor por isso começa já limpo, não há por que o limpar mais ainda;</li>
<li>EXPORTING: Como estes são passados por referência, foi sempre boa práctica usar CLEAR para limpar estes parâmetros logo no início da rotina. Mas o Clean ABAP sugere uma alternativa melhor: <a href="https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-clear-value-parameters">passá-los valor</a>.</li>
</ul>
<p>Conclusão: O único cenário em que o CLEAR pode ser usado é para limpar um parâmetro CHANGING.</p>
<p>4. Quando uma tabela interna grande já não é necessária</p>
<p>Se a RAM for escassa, é boa ideia tentar libertar memória pro-activamente o mais cedo possível. Mas nesse caso o CLEAR não é a melhor opção porque não liberta a memória imediatamente. Em vez disso, deverias usar o FREE.</p>
<p>5. Porque é PRECISO fazer CLEAR a uma variável</p>
<p>Pronto. Este é o único cenário em que usar CLEAR faz todo o sentido: a lógica de negócio precisar de limpar uma variável.</p>
<p>A conclusão é: evita ao máximo usar CLEARs. São das maiores causas de regressões. Principalmente naquele tipo de código horrível com rotinas de milhares de linhas seguidas e dúzias de variáveis globais. Curiosamente, usei um CLEAR há uns dias por esta razão já depois de ter escrito este artigo. E reparei nisso exactamente porque uso o CLEAR mesmo muito raramente (até há uns dias também o usava para limpar parâmetros EXPORTING mas vou deixar de o fazer agora que sei que podem ser passados por valor.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/12/evita-o-clear/">Se amas o próximo, evita o CLEAR</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/12/evita-o-clear/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4771</post-id>	</item>
		<item>
		<title>Não sejas do contra</title>
		<link>https://abapinho.com/2021/11/nao-sejas-do-contra/</link>
					<comments>https://abapinho.com/2021/11/nao-sejas-do-contra/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Tue, 30 Nov 2021 09:00:14 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4764</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/11/aranha.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/11/aranha.jpg?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/11/aranha.jpg?zoom=2&amp;resize=150%2C150&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/11/aranha.jpg?zoom=3&amp;resize=150%2C150&amp;ssl=1 450w" sizes="(max-width: 150px) 100vw, 150px" />A legibilidade é muito importante em todo o texto escrito. Talvez com a excepção da poesia concreta. Na sequência do post anterior, aqui fica um par de regras que minimizam o esforço que alguém tem de fazer para compreender expressões booleanas. 1. Tenta que as condições sejam positivas. É mais fácil entender &#8220;eu quero ir&#8221; [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/11/nao-sejas-do-contra/">Não sejas do contra</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/11/aranha.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/11/aranha.jpg?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/11/aranha.jpg?zoom=2&amp;resize=150%2C150&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/11/aranha.jpg?zoom=3&amp;resize=150%2C150&amp;ssl=1 450w" sizes="(max-width: 150px) 100vw, 150px" /><p>A legibilidade é muito importante em todo o texto escrito. Talvez com a excepção da <a href="https://cdn.culturagenial.com/imagens/aranha.jpg" rel="noopener" target="_blank">poesia concreta</a>.</p>
<p>Na sequência do <a href="https://abapinho.com/2021/11/as-condicoes-if-devem-ser-simples-de-entender/" rel="noopener" target="_blank">post anterior</a>, aqui fica um par de regras que minimizam o esforço que alguém tem de fazer para compreender expressões booleanas.</p>
<p><span id="more-4764"></span></p>
<p>1. <a href="https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#try-to-make-conditions-positive" rel="noopener" target="_blank">Tenta que as condições sejam positivas</a>. É mais fácil entender &#8220;eu quero ir&#8221; do que &#8220;eu não quero ficar&#8221;.</p>
<p>2. Se tens mesmo de usar a negativa, <a href="https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-is-not-to-not-is" rel="noopener" target="_blank">prefere IS NOT a NOT IS</a>. embora em português se diga &#8220;eu não quero ficar&#8221;, em programação é mais simples dizer &#8220;eu quero não ficar&#8221;.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/11/nao-sejas-do-contra/">Não sejas do contra</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/11/nao-sejas-do-contra/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4764</post-id>	</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>
					<comments>https://abapinho.com/2021/11/as-condicoes-if-devem-ser-simples-de-entender/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 01 Nov 2021 09:00:45 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[estilo]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4757</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/cancela.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/cancela.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/cancela.jpg?resize=300%2C298&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/cancela.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Porque haveria de ser difícil lê-las? Só tornaria mais difícil a vida de quem vier a precisar de a entender. Lá porque uma condição IF é complexa não é por isso que tem de ser complicada. O Clean ABAP tem algumas sugestões para conseguir isto: Considera decompor condições complexas Considera extrair condições complexas Evita ramos [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/11/as-condicoes-if-devem-ser-simples-de-entender/">As condições IF devem ser simples de entender</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/cancela.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/cancela.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/cancela.jpg?resize=300%2C298&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/cancela.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Porque haveria de ser difícil lê-las? Só tornaria mais difícil a vida de quem vier a precisar de a entender.</p>
<p>Lá porque uma condição IF é complexa não é por isso que tem de ser complicada.</p>
<p><span id="more-4757"></span></p>
<p>O <a href="https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md" rel="noopener" target="_blank">Clean ABAP</a> tem algumas sugestões para conseguir isto:</p>
<ul>
<li><a href="https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#consider-decomposing-complex-conditions" target="_blank" rel="noopener">Considera decompor condições complexas</a></li>
<li><a href="https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#consider-extracting-complex-conditions" target="_blank" rel="noopener">Considera extrair condições complexas</a></li>
<li><a href="https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#no-empty-if-branches" target="_blank" rel="noopener">Evita ramos vazios no IF</a></li>
<li><a href="https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-case-to-else-if-for-multiple-alternative-conditions" target="_blank" rel="noopener">Prefere CASE a ELSE IF em múltiplas condições alternativas</a></li>
</ul>
<p>Aqui está um exemplo de uma condição IF difícil de ler:</p>
<pre><code>
IF price &gt; 1000 AND customer_debt &gt; 10000 AND salesorder_status = '1'.
    " code to block invoice
 ENDIF.
</code></pre>
<p>Ok, concedo que não é assim tão difícil, mas serve-nos como exemplo.</p>
<p>Isto seria uma evolução:</p>
<pre><code>
IF should_be_blocked( ).
   " code to block invoice
ENDIF.

METHOD should_be_blocked.
  result = COND #(
    WHEN is_expensive( price ) AND
      customer( kunnr ).is_deadbeat( ) AND
      NOT salesorder( vbeln ).is_delivered( ) THEN abap_true
    ELSE abap_false ).
ENDMETHOD.

(...)
</code></pre>
<p>Sim, até pode ser um exagero. Mas levei a coisa longe demais de propósito só para exemplificar o que pode ser feito para tornar aquele IF inicial mais simples de ler e entender.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/11/as-condicoes-if-devem-ser-simples-de-entender/">As condições IF devem ser simples de entender</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/11/as-condicoes-if-devem-ser-simples-de-entender/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4757</post-id>	</item>
		<item>
		<title>SELECT com CASE</title>
		<link>https://abapinho.com/2021/10/select-com-case/</link>
					<comments>https://abapinho.com/2021/10/select-com-case/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 25 Oct 2021 12:20:22 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4754</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/termometro.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/termometro.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/termometro.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/termometro.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />O ABAP está a permitir fazer coisas cada vez mais interessantes em SQL. A última que descobri foi que agora se pode usar CASEs. Funciona assim: SELECT CASE WHEN temperature</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/10/select-com-case/">SELECT com CASE</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/termometro.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/termometro.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/termometro.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/10/termometro.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>O ABAP está a permitir fazer coisas cada vez mais interessantes em SQL. A última que descobri foi que agora se pode usar CASEs.</p>
<p><span id="more-4754"></span></p>
<p>Funciona assim:</p>
<pre><code>
SELECT
  CASE
    WHEN temperature <= 5 THEN 'FREEZING'
    WHEN temperature <= 15 THEN 'COLD'
    WHEN temperature <= 25 THEN 'MILD'
    ELSE 'HOT'
  END AS weather
FROM zweather
WHERE date = sy-datum
INTO @DATA(weather_today).
</code></pre>
<p>Não só evita código desnecessário como fica mais claro e simples de perceber.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/10/select-com-case/">SELECT com CASE</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/10/select-com-case/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4754</post-id>	</item>
		<item>
		<title>Já tenho saudades tuas Sérgio!</title>
		<link>https://abapinho.com/2021/08/ja-tenho-saudades-tuas-sergio/</link>
					<comments>https://abapinho.com/2021/08/ja-tenho-saudades-tuas-sergio/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 02 Aug 2021 08:00:55 +0000</pubDate>
				<category><![CDATA[Histórias]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4731</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/08/sergiofraga.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/08/sergiofraga.jpg?w=200&amp;ssl=1 200w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/08/sergiofraga.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />O meu querido amigo Sérgio Fraga faleceu. O Abapinho também é dele. Para sempre. Obrigado amigo por tudo o que foste.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/08/ja-tenho-saudades-tuas-sergio/">Já tenho saudades tuas Sérgio!</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/08/sergiofraga.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/08/sergiofraga.jpg?w=200&amp;ssl=1 200w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/08/sergiofraga.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>O meu querido amigo Sérgio Fraga faleceu.</p>
<p>O Abapinho <a href="https://abapinho.com/?s=fraga">também é dele</a>.<br />
Para sempre.</p>
<p>Obrigado amigo por tudo o que foste.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/08/ja-tenho-saudades-tuas-sergio/">Já tenho saudades tuas Sérgio!</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/08/ja-tenho-saudades-tuas-sergio/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4731</post-id>	</item>
		<item>
		<title>As duplas negativas dos RANGEs</title>
		<link>https://abapinho.com/2021/07/as-duplas-negativas-dos-ranges/</link>
					<comments>https://abapinho.com/2021/07/as-duplas-negativas-dos-ranges/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 26 Jul 2021 08:00:15 +0000</pubDate>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[segredo]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4712</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/schrodinger.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/schrodinger.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/schrodinger.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/schrodinger.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Os RANGEs têm propriedades interessantes. Por exemplo, estas duas linhas parecem a mesma coisa mas não são: Sign Option Low I NE X E EQ X Marado, né? Ontem cruzei-me com outro tipo de dupla negação bizarra no qual nunca tinha pensado. Quando usamos um RANGE como critério no WHERE de um SELECT e este [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/07/as-duplas-negativas-dos-ranges/">As duplas negativas dos RANGEs</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/schrodinger.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/schrodinger.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/schrodinger.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/schrodinger.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Os RANGEs têm propriedades interessantes.</p>
<p><span id="more-4712"></span></p>
<p>Por exemplo, estas duas linhas parecem a mesma coisa mas não são:</p>
<table>
<tr>
<th>Sign</th>
<th>Option</th>
<th>Low</th>
</tr>
<tr>
<td>I</td>
<td>NE</td>
<td>X</td>
</tr>
<tr>
<td>E</td>
<td>EQ</td>
<td>X</td>
</tr>
</table>
<p>Marado, né?</p>
<p>Ontem cruzei-me com outro tipo de dupla negação bizarra no qual nunca tinha pensado. Quando usamos um RANGE como critério no WHERE de um SELECT e este está vazio, o critério devolve sempre TRUE. É contra-intuitivo porque o correcto seria dar FALSE (em rigor o valor a comparar não está no RANGE) mas dá imenso jeito que assim seja. O RANGE vazio funciona como um <em>wildcard</em>. Ok.</p>
<p>Mas, e se se usar o NOT assim:</p>
<pre><code>
DATA r TYPE RANGE of kunnr.

SELECT * FROM kna1 INTO TABLE @data(t)
WHERE kunnr NOT IN r.
</code></pre>
<p>Portanto, o RANGE está vazio e por isso logicamente que qualquer KUNNR não se encontra lá e como tal o NOT IN r deveria dar TRUE. Mas, como o RANGE vazio funciona como <em>wildcard</em> e devolve TRUE quando deveria devolver FALSE,&#8230; a negação devolve FALSE quando deveria devolver TRUE. E ainda bem. Acho eu&#8230;</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/07/as-duplas-negativas-dos-ranges/">As duplas negativas dos RANGEs</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/07/as-duplas-negativas-dos-ranges/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4712</post-id>	</item>
		<item>
		<title>SELECT WHERE field IN (*, x)</title>
		<link>https://abapinho.com/2021/07/select-where-field-in-a-b/</link>
					<comments>https://abapinho.com/2021/07/select-where-field-in-a-b/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 19 Jul 2021 08:00:53 +0000</pubDate>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[estilo]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4701</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/tricot.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/tricot.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/tricot.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/tricot.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Vamos por partes. 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: BUKRS (empresa) WERKS (plant) LGORT (depósito) Quando um dos campos está vazio, é um wildcard, ou seja, é válido para todos os valores. A configuração da tabela é a seguinte: BUKRS [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/07/select-where-field-in-a-b/">SELECT WHERE field IN (*, x)</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/tricot.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/tricot.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/tricot.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/tricot.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Vamos por partes.</p>
<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:</p>
<ol>
<li>BUKRS (empresa)</li>
<li>WERKS (plant)</li>
<li>LGORT (depósito)</li>
</ol>
<p>Quando um dos campos está vazio, é um wildcard, ou seja, é válido para todos os valores.</p>
<p><span id="more-4701"></span></p>
<p>A configuração da tabela é a seguinte:</p>
<table>
<tbody>
<tr>
<th>BUKRS</th>
<th>WERKS</th>
<th>LGORT</th>
<th>VALUE</th>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>Z1</td>
</tr>
<tr>
<td>E1</td>
<td>W1</td>
<td></td>
<td>Z2</td>
</tr>
<tr>
<td>E1</td>
<td>W1</td>
<td>L1</td>
<td>Z4</td>
</tr>
<tr>
<td>E1</td>
<td>W2</td>
<td></td>
<td>Z3</td>
</tr>
</tbody>
</table>
<p>Portanto, a primeira linha define o valor por defeito e as outras definem valores de outros cenários mais ou menos específicos.</p>
<p>Já vi código com um SELECT para cada possível combinação, que é a coisa mais estúpida possível porque neste casos já são 8 SELECTs e se amanhã alguém adicionar um quarto campo terá de fazer 16 SELECTs.</p>
<p>O mais comum, que na minha opinião é igualmente lamentável, é presumir que os campos se preenchem a partir da esquerda, o que reduz a lógica a um SELECT por cada campo chave da tabela. Algo assim:</p>
<pre><code>
SELECT value INTO result
FROM zparams
WHERE BUKRS = i_bukrs
  AND WERKS = i_werks
  AND LGORT = i_lgort.

IF sy-subrc &lt;&gt; 0.
  SELECT value INTO result
  FROM zparams
  WHERE BUKRS = i_bukrs
    AND WERKS = i_werks.

  IF sy-subrc &lt;&gt; 0.
    SELECT value INTO result
    FROM zparams
    WHERE BUKRS = i_bukrs.
  ENDIF.

ENDIF.
</code></pre>
<p>São 3 SELECTs e 2 IFs. É muita coisa.</p>
<p>Até há pouco tempo eu fazia um RANGE para cada campo chave e depois resolvia a coisa com um único SELECT ordenado de forma a que as linhas mais específicas sejam as primeiras:</p>
<pre><code>
DATA r_bukrs TYPE RANGE OF bukrs.
DATA r_werks TYPE RANGE OF werks_d.
DATA r_lgort TYPE RANGE OF lgort_d.

IF i_bukrs IS NOT INITIAL.
  r_burks = VALUE #( option = 'EQ' sign = 'I' ( low = i_bukrs ) ).
ENDIF.
IF i_werks IS NOT INITIAL.
  r_werks = VALUE #( option = 'EQ' sign = 'I' ( low = i_werks ) ).
ENDIF.
IF i_lgort IS NOT INITIAL.
  r_lgort = VALUE #( option = 'EQ' sign = 'I' ( low = i_lgort ) ).
ENDIF.

SELECT value INTO result
UP TO 1 ROWS
FROM zparams
WHERE BUKRS IN r_bukrs
  AND WERKS IN r_werks
  AND LGORT IN r_lgort
ORDER BY bukrs DESCENDING werks DESCENDING lgort DESCENDING.
ENDSELECT.
</code></pre>
<p>Ainda é muito código e usa 3 variáveis auxiliares mas ao menos a lógica é mais simples de manter: um SELECT e nenhum IF.</p>
<p>Mas recentemente lembrei-me de que é possível simplificar imenso:</p>
<pre><code>
SELECT value INTO result
UP TO 1 ROWS
FROM zparams
WHERE BUKRS IN (space, i_bukrs) 
  AND WERKS IN (space, i_werks)
  AND LGORT IN (space, i_lgort)
ORDER BY bukrs DESCENDING werks DESCENDING lgort DESCENDING.
ENDSELECT.
</code></pre>
<p>Olé!! Um SELECT, zero IFs, zero variáveis auxiliares.</p>
<p>Obrigado <a href="https://visualhunt.co/a6/9d50a0f7">hello-julie</a> pela foto.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/07/select-where-field-in-a-b/">SELECT WHERE field IN (*, x)</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/07/select-where-field-in-a-b/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4701</post-id>	</item>
		<item>
		<title>Insere sem excepções em tabelas internas com chave única</title>
		<link>https://abapinho.com/2021/07/insert-into-table/</link>
					<comments>https://abapinho.com/2021/07/insert-into-table/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 05 Jul 2021 08:00:51 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[estilo]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4690</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/esquilo.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/esquilo.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/esquilo.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/esquilo.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />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? Chega. Desde o século XX que nos habituaram a usar o comando APPEND para inserir numa tabela interna. Mas já há [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/07/insert-into-table/">Insere sem excepções em tabelas internas com chave única</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/esquilo.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/esquilo.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/esquilo.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/07/esquilo.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><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?</p>
<p>Chega.</p>
<p><span id="more-4690"></span></p>
<p>Desde o século XX que nos habituaram a usar o comando APPEND para inserir numa tabela interna. Mas já há algum tempo que a <a href="https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-insert-into-table-to-append-to" rel="noopener" target="_blank">própria SAP o desaconselha</a> e sugere usar INSERT INTO TABLE ao invés.</p>
<p>E fazem bem porque o APPEND acrescenta uma linha no final da tabela e no caso das SORTED TABLE é muito provável que dê asneira. Já o INSERT INTO TABLE, pelo contrário, adapta-se a todo o tipo de tabelas.</p>
<p>Mas o INSERT INTO TABLE tem outra vantagem: não lança excepções. Em vez disso, devolve um erro na SY-SUBRC caso não tenha conseguido inserir. Claro que este erro tem de ser tratado.</p>
<p>Dito isto, eu não tenho nada contra excepções e a minha forma preferida de inserir entradas numa tabela interna, seja ela qual for, é a nova VALUE #() que lança uma excepção caso hajam chaves repetidas. Ainda assim, seria fantástico se adicionassem a opção DISTINCT ao VALUE pois este tornar-se-ia ainda mais útil.</p>
<p>O Abapinho saúda-vos.</p>
<p>Foto: <a href="https://visualhunt.co/a6/22e2dcd9">Jo Zimny</a></p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/07/insert-into-table/">Insere sem excepções em tabelas internas com chave única</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/07/insert-into-table/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4690</post-id>	</item>
		<item>
		<title>Popula manulamente uma LISTBOX</title>
		<link>https://abapinho.com/2021/06/popula-manulamente-listbox/</link>
					<comments>https://abapinho.com/2021/06/popula-manulamente-listbox/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 14 Jun 2021 11:47:10 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[segredo]]></category>
		<category><![CDATA[ui]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4682</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/placa_estrada_brasil.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/placa_estrada_brasil.jpg?w=450&amp;ssl=1 450w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/placa_estrada_brasil.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/placa_estrada_brasil.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Em 2012 lamentei que a LISTBOX fosse tão pouco usada. Ensinei a usá-la com elementos de dado standard, que a populam automaticamente. Hoje vou-te ensinar como a podes popular tu próprio se quiseres listar opções que não venham de um elemento de dados. É fácil. Mas pouco óbvio. Há uma FM standard que a popula [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/06/popula-manulamente-listbox/">Popula manulamente uma LISTBOX</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/placa_estrada_brasil.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/placa_estrada_brasil.jpg?w=450&amp;ssl=1 450w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/placa_estrada_brasil.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/placa_estrada_brasil.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Em 2012 <a href="https://abapinho.com/en/2012/10/ninguemligaaolistbox/">lamentei que a LISTBOX fosse tão pouco usada</a>. Ensinei a usá-la com elementos de dado standard, que a populam automaticamente. Hoje vou-te ensinar como a podes popular tu próprio se quiseres listar opções que não venham de um elemento de dados.</p>
<p><span id="more-4682"></span></p>
<p>É fácil. Mas pouco óbvio. Há uma FM standard que a popula a partir de uma tabela interna:</p>
<pre><code>
PARAMETERS: p_virus TYPE C AS LISTBOX VISIBLE LENGTH 25.

INITIALIZATION.
  DATA(values) =
    VALUE vrm_values(
      ( key = '1' text = 'COVID-19' )
      ( key = '2' text = 'Bird flu' )
      ( key = '3' text = 'Spanish flu' )
    ).

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id              = 'P_VIRUS'
      values          = values
    EXCEPTIONS
      id_illegal_name = 1
      OTHERS          = 2.
</code></pre>
<p>É isto.</p>
<p><a href="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/listbox.png?ssl=1"><img loading="lazy" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/listbox.png?resize=300%2C189&#038;ssl=1" alt="" width="300" height="189" class="alignnone size-medium wp-image-4687" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/listbox.png?resize=300%2C189&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/listbox.png?w=394&amp;ssl=1 394w" sizes="(max-width: 300px) 100vw, 300px" data-recalc-dims="1" /></a></p>
<p>Foto: <a href="https://visualhunt.co/a6/66ca720f">MarianaLeme</a>.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/06/popula-manulamente-listbox/">Popula manulamente uma LISTBOX</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/06/popula-manulamente-listbox/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4682</post-id>	</item>
		<item>
		<title>SELECTION-SCREEN FUNCTION KEY N</title>
		<link>https://abapinho.com/2021/06/selection-screen-function-key-n/</link>
					<comments>https://abapinho.com/2021/06/selection-screen-function-key-n/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 07 Jun 2021 08:00:33 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[secret]]></category>
		<category><![CDATA[ui]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4672</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/virus.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/virus.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/virus.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/virus.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Há tantas coisas que se podem fazer nos ecrãs de selecção. Aqui está mais uma: cinco botões na barra de ferramentas. Para usar estes botões é preciso: declarar uma estrutura especial chamada SSCRFIELDS; preencher os seus campos FUNCTXT_01 até 05 com os textos dos botões; declarar os botões que queremos usar com o comando SELECTION-SCREEN [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/06/selection-screen-function-key-n/">SELECTION-SCREEN FUNCTION KEY N</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/virus.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/virus.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/virus.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/virus.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Há tantas coisas que se podem fazer nos ecrãs de selecção. Aqui está mais uma: cinco botões na barra de ferramentas.</p>
<p><span id="more-4672"></span></p>
<p>Para usar estes botões é preciso:</p>
<ul>
<li>declarar uma estrutura especial chamada SSCRFIELDS;</li>
<li>preencher os seus campos FUNCTXT_01 até 05 com os textos dos botões;</li>
<li>declarar os botões que queremos usar com o comando SELECTION-SCREEN FUNCTION KEY N (em que N é um número de 1 a 5);</li>
<li>Usar o SSCRFIELDS-UCOMM no AT SELECTION-SCREEN para saber que botão foi empurrado.</li>
</ul>
<p>Aqui está um programa exemplo:</p>
<pre><code>
REPORT zvirus.

TABLES sscrfields.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS: p_matnr TYPE matnr.
SELECTION-SCREEN: FUNCTION KEY 1,
                  FUNCTION KEY 2,
                  FUNCTION KEY 3.
SELECTION-SCREEN END OF BLOCK b1.

initialization.
    sscrfields-functxt_01 = 'COVID-19'.
    sscrfields-functxt_02 = 'Bird flu'.
    sscrfields-functxt_03 = 'Spanish flu'.

AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN'FC01'.
      p_matnr = 'SARS-COV-2'.
    WHEN 'FC02'.
      p_matnr = 'H5N1'.
    WHEN 'FC03'.
      p_matnr = 'H1N1'.
  ENDCASE.
</code></pre>
<p>E aqui está o resultado:<br />
<a href="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/pandemic_se38.png?ssl=1"><img loading="lazy" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/pandemic_se38.png?resize=300%2C140&#038;ssl=1" alt="" width="300" height="140" class="alignnone size-medium wp-image-4673" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/pandemic_se38.png?resize=300%2C140&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/pandemic_se38.png?resize=768%2C358&amp;ssl=1 768w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/06/pandemic_se38.png?w=806&amp;ssl=1 806w" sizes="(max-width: 300px) 100vw, 300px" data-recalc-dims="1" /></a></p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/06/selection-screen-function-key-n/">SELECTION-SCREEN FUNCTION KEY N</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/06/selection-screen-function-key-n/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4672</post-id>	</item>
		<item>
		<title>Envia emails para uma lista de distribuição</title>
		<link>https://abapinho.com/2021/05/lista-de-distribuicao/</link>
					<comments>https://abapinho.com/2021/05/lista-de-distribuicao/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 31 May 2021 08:00:56 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4663</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/caixasdecorreio.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/caixasdecorreio.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/caixasdecorreio.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/caixasdecorreio.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Quando tens de enviar o mesmo email para mais do que um endereço, o mais comum é guardar a lista de endereços numa tabela qualquer e depois adicionar todos os endereços como recipientes. Mas aprendi recentemente uma forma muito mais bonita para conseguir o mesmo resultado. O SAP tem uma funcionalidade standard que permite criar [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/05/lista-de-distribuicao/">Envia emails para uma lista de distribuição</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/caixasdecorreio.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/caixasdecorreio.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/caixasdecorreio.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/caixasdecorreio.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Quando tens de enviar o mesmo email para mais do que um endereço, o mais comum é guardar a lista de endereços numa tabela qualquer e depois adicionar todos os endereços como recipientes.</p>
<p>Mas aprendi recentemente uma forma muito mais bonita para conseguir o mesmo resultado.</p>
<p><span id="more-4663"></span></p>
<p>O SAP tem uma funcionalidade standard que permite criar listas de distribuição. Através da transacção SO23 crias uma lista de distribuição, dás-lhe um nome, escolhes uma pasta e depois adicionas-lhe tantos recipientes (endereços de email, usernames, etc) quantos quiseres.</p>
<p>Para enviar um email através do BCS para uma lista de distribuição a única diferença em relação ao normal é que para adicionares a lista como recipiente fazes isto:</p>
<pre><code>
recipient = cl_distributionlist_bcs=>getu_persistent(
  i_dliname = lv_mlrec
  i_private = space ).
request->add_recipient( recipient ).
</code></pre>
<p>O resto é tudo igual.</p>
<p>Foto de <a href="https://visualhunt.co/a6/904f753c">doug turetsky</a>.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/05/lista-de-distribuicao/">Envia emails para uma lista de distribuição</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/05/lista-de-distribuicao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4663</post-id>	</item>
		<item>
		<title>Manipula textos de selecção sem os fixar no programa</title>
		<link>https://abapinho.com/2021/05/manipula-textos-de-seleccao/</link>
					<comments>https://abapinho.com/2021/05/manipula-textos-de-seleccao/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 24 May 2021 08:00:11 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[DDIC]]></category>
		<category><![CDATA[i18n]]></category>
		<category><![CDATA[segredo]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4653</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/diccionario.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/diccionario.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/diccionario.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/diccionario.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Embora muitos ABAPers ainda se esqueçam disto, quanto menos textos forem fixados no programa mais fácil será traduzi-lo. Aqui está uma forma simples mas relativamente obscura de alterar os textos para, por exemplo, adicionar-lhes ícones, mantendo-os traduzíveis. A magia acontece no INITIALIZATION. PARAMETERS: p_erdat TYPE erdat. INITIALIZATION. %_P_ERDAT_%_APP_%-TEXT = icon_date &#038;& %_P_ERDAT_%_APP_%-TEXT. E aqui está [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/05/manipula-textos-de-seleccao/">Manipula textos de selecção sem os fixar no programa</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/diccionario.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/diccionario.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/diccionario.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/diccionario.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Embora muitos ABAPers ainda se esqueçam disto, quanto menos textos forem fixados no programa mais fácil será traduzi-lo.</p>
<p>Aqui está uma forma simples mas relativamente obscura de alterar os textos para, por exemplo, adicionar-lhes ícones, mantendo-os traduzíveis.</p>
<p><span id="more-4653"></span></p>
<p>A magia acontece no INITIALIZATION.</p>
<pre><code>
PARAMETERS: p_erdat TYPE erdat.

INITIALIZATION.
  %_P_ERDAT_%_APP_%-TEXT = icon_date && %_P_ERDAT_%_APP_%-TEXT.
</code></pre>
<p>E aqui está o resultado (nota o ícone do calendário à esquerda do texto):<br />
<a href="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/texto-seleccao-com-icon.png?ssl=1"><img loading="lazy" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/texto-seleccao-com-icon.png?resize=300%2C87&#038;ssl=1" alt="" width="300" height="87" class="alignnone size-medium wp-image-4657" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/texto-seleccao-com-icon.png?resize=300%2C87&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/texto-seleccao-com-icon.png?w=696&amp;ssl=1 696w" sizes="(max-width: 300px) 100vw, 300px" data-recalc-dims="1" /></a></p>
<p>O ABAP está cheio de truques bizarros como este.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/05/manipula-textos-de-seleccao/">Manipula textos de selecção sem os fixar no programa</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/05/manipula-textos-de-seleccao/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4653</post-id>	</item>
		<item>
		<title>Chama função remotas AS SEPARATE UNIT</title>
		<link>https://abapinho.com/2021/05/as-separate-unit/</link>
					<comments>https://abapinho.com/2021/05/as-separate-unit/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 17 May 2021 08:00:43 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4646</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/walkietalkies.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/walkietalkies.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/walkietalkies.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/walkietalkies.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Imagina que chamas um módulo de função por RFC várias vezes seguidas. Se calhar julgas que cada chamada é completamente independente. Mas não é. O grupo de funções fica carregado em memória no sistema remoto e os mesmos dados globais serão reutilizados em todas as chamadas. Isto não deverá constituir um problema na maior parte [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/05/as-separate-unit/">Chama função remotas AS SEPARATE UNIT</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/walkietalkies.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/walkietalkies.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/walkietalkies.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/walkietalkies.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Imagina que chamas um módulo de função por RFC várias vezes seguidas. Se calhar julgas que cada chamada é completamente independente. Mas não é. O grupo de funções fica carregado em memória no sistema remoto e os mesmos dados globais serão reutilizados em todas as chamadas.</p>
<p>Isto não deverá constituir um problema na maior parte dos casos. Mas haverá cenários em que, por uma razão ou outra, o módulo de funções chamado guarda dados em variáveis globais que podem interferir negativamente com as chamadas subsequentes.</p>
<p>Se quiseres garantir que isto não acontece e que tens dados fresquinhos de cada vez que a função é chamada, acrescenta AS SEPARATE UNIT à chamada. Simples.</p>
<pre><code>
CALL FUNCTION 'Z_FAZ_MAS_TEM_VARIAVEIS_GLOBAIS'
DESTINATION rfcdest
AS SEPARATE UNIT.
</code></pre>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/05/as-separate-unit/">Chama função remotas AS SEPARATE UNIT</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/05/as-separate-unit/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4646</post-id>	</item>
		<item>
		<title>Funções manequins</title>
		<link>https://abapinho.com/2021/05/funcoes-manequins/</link>
					<comments>https://abapinho.com/2021/05/funcoes-manequins/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 10 May 2021 08:00:54 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[estilo]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4640</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/dummy.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/dummy.jpg?w=400&amp;ssl=1 400w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/dummy.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/dummy.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />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 [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/05/funcoes-manequins/">Funções manequins</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/dummy.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/dummy.jpg?w=400&amp;ssl=1 400w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/dummy.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2021/05/dummy.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Como é que se há-de traduzir <em>dummy</em>? Fica manequim.</p>
<p>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.</p>
<p>A virtude disto é que assim pode usar-se a ferramenta <em>where-used</em> para descobrir todos os sítios onde é invocada. Só isso. E não é pouco!</p>
<p>Chamemos-lhes funções manequins.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2021/05/funcoes-manequins/">Funções manequins</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2021/05/funcoes-manequins/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4640</post-id>	</item>
		<item>
		<title>Adeus Evernote, olá Obsidian</title>
		<link>https://abapinho.com/2020/12/obsidian/</link>
					<comments>https://abapinho.com/2020/12/obsidian/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Thu, 17 Dec 2020 09:00:33 +0000</pubDate>
				<category><![CDATA[Artigos]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4600</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/12/obsidian_logo.png?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/12/obsidian_logo.png?w=666&amp;ssl=1 666w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/12/obsidian_logo.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/12/obsidian_logo.png?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Depois de 10 anos a usar o Evernote, este ano comecei a procurar alternativas. No início o Evernote era fantástico. Mas parou no tempo e deixou-se ultrapassar. Entretanto apareceram tantos conceitos novos: jardins digitais, backlinks, Zettelkasten, Evergreen notes, MOCs, etc. E o Evernote lá continua, igual ao que sempre foi, condicionando-nos a tirar notas em [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/12/obsidian/">Adeus Evernote, olá Obsidian</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/12/obsidian_logo.png?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/12/obsidian_logo.png?w=666&amp;ssl=1 666w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/12/obsidian_logo.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/12/obsidian_logo.png?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Depois de 10 anos a usar o Evernote, este ano comecei a procurar alternativas. No início o Evernote era fantástico. Mas parou no tempo e deixou-se ultrapassar. Entretanto apareceram tantos conceitos novos: <a href="https://joelhooks.com/digital-garden" rel="noopener" target="_blank">jardins digitais</a>, <em><a href="https://www.youtube.com/watch?v=n7xrHPpTWJ0" rel="noopener" target="_blank">backlinks</a></em>, <em><a href="https://en.wikipedia.org/wiki/Zettelkasten" rel="noopener" target="_blank">Zettelkasten</a></em>, <em><a href="https://notes.andymatuschak.org/Evergreen_notes" rel="noopener" target="_blank">Evergreen notes</a></em>, <a href="https://www.youtube.com/watch?v=WUq8Pun28FI" rel="noopener" target="_blank">MOCs</a>, etc. E o Evernote lá continua, igual ao que sempre foi, condicionando-nos a <a href="https://www.linkingyourthinking.com" rel="noopener" target="_blank">tirar notas em vez de criar notas</a>.<br />
<span id="more-4600"></span></p>
<p>Em Julho deste ano <a href="https://abapinho.com/2020/07/notion/">tentei migrar para o Notion mas não correu bem</a>. Não só não gostei da experiência como compreendi que, embora o Notion fosse uma evolução em relação ao Evernote (Markdown, backlinks, etc.), não preenchia alguns dos requisitos básicos para mim:</p>
<ul>
<li>Não usar a Cloud (ficheiros locais)</li>
<li>Fácil de fazer <em>copy &#038; paste</em> de outras fontes</li>
<li>Bom interface (práctico e rápido)</li>
<li>Não ficar preso a um programa</li>
<li>Gestão de versões (git)</li>
</ul>
<p>Então tergiversei. Abandonei o Notion e voltei para o Evernote. Felizmente ainda não tinham divergido muito. Decidi aguardar que aparecesse algo que respondesse a todos os pré-requisitos. Imaginei que o <a href="https://github.com/athensresearch/athens" rel="noopener" target="_blank">Athens</a> poderia ser uma hipótese.</p>
<p>Até que me cruzei (novamente) com o <a href="https://obsidian.md/" rel="noopener" target="_blank">Obsidian</a>. E foi amor à segunda vista! É que já tinha instalado o Obsidian há uns meses mas não o tinha explorado muito. Além disso ele tem evoluído muito nos últimos meses.</p>
<p>Depois de o explorar e experimentar bastante, compreendi que o Obsidian é fabuloso, responde a tudo o que eu preciso e ainda permite coisas que eu não tinha antecipado. Decidi adoptá-lo.</p>
<p>Mas desta vez não migrei tudo de uma vez do Evernote para o Obsidian. Estou a migrar por partes. E ainda bem, porque isso tem-me permitido ir compreendendo melhor como lidar com cada caso particular.</p>
<p>Estou a usá-lo diariamente há duas semanas e, ao contrário do Notion, o Obsidian é práctico, super rápido e dá muito prazer usar. Penso que é desta. E é grátis! Mas é tão bom que eu decidi pagar os $25. Eles merecem.</p>
<p>Dito isto, há alguns cenários que ainda não entendi como fazer funcionar bem no Obsidian. Esses continuam no Evernote, à espera que eu encontre uma solução ou que o Obsidian passe a permitir MOCs dinâmicos. Não tem mal. Esperarei tranquilamente.</p>
<p>Actualizarei este artigo quando tiver novidades. Até lá, vou continuando alegremente a podar o meu jardim digital no Obsidian.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/12/obsidian/">Adeus Evernote, olá Obsidian</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2020/12/obsidian/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4600</post-id>	</item>
		<item>
		<title>Desfazer implementação de nota SAP</title>
		<link>https://abapinho.com/2020/08/desfazer-implementacao-de-nota-sap/</link>
					<comments>https://abapinho.com/2020/08/desfazer-implementacao-de-nota-sap/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Thu, 13 Aug 2020 08:00:32 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4554</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/08/undo.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" />Sou do tempo em que as notas da SAP se introduziam à mão. Copy paste e rezar para não errar. Granda maluquice. Lembro-me de um projecto que, por alguma razão que nunca ficou clara, em vez de se fazer upgrade, decidiu-se implementar várias centenas de notas à mão. Imprimiram as notas todas, fizeram num monte [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/08/desfazer-implementacao-de-nota-sap/">Desfazer implementação de nota SAP</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/08/undo.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" /><p>Sou do tempo em que as notas da SAP se introduziam à mão. Copy paste e rezar para não errar. Granda maluquice.</p>
<p>Lembro-me de um projecto que, por alguma razão que nunca ficou clara, em vez de se fazer upgrade, decidiu-se implementar várias centenas de notas à mão. Imprimiram as notas todas, fizeram num monte gigante com elas e uns 10 consultores passaram um fim-de-semana inteiro a tentar acabar com o monte. Conseguímos. Não faço ideia do que aconteceu a seguir mas de certeza que criámos montes de bugs.</p>
<p><span id="more-4554"></span></p>
<p>Felizmente entretanto apareceu a transacção SNOTE que tornou o processo automático.</p>
<p>Mas&#8230; e se tiveres usado o SNOTE para implementar uma nota e depois te arrependeres?</p>
<p>Embora nem toda a gente o saiba, felizmente o SNOTE também ajuda nisso:</p>
<p>Menu <strong>SAP Note > Reset SAP Note Implementation</strong>.</p>
<p><a href="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/08/undo_sap_note.png?ssl=1"><img loading="lazy" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/08/undo_sap_note.png?resize=624%2C455&#038;ssl=1" alt="" width="624" height="455" class="alignnone size-full wp-image-4555" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/08/undo_sap_note.png?w=624&amp;ssl=1 624w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/08/undo_sap_note.png?resize=300%2C219&amp;ssl=1 300w" sizes="(max-width: 624px) 100vw, 624px" data-recalc-dims="1" /></a></p>
<p>Obrigado Sérgio Fraga pela dica.</p>
<p>Obrigado <a href="https://visualhunt.co/a5/a0b96f2b">dps</a> pela foto.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/08/desfazer-implementacao-de-nota-sap/">Desfazer implementação de nota SAP</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2020/08/desfazer-implementacao-de-nota-sap/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4554</post-id>	</item>
		<item>
		<title>Adeus Evernote, olá Notion</title>
		<link>https://abapinho.com/2020/07/notion/</link>
					<comments>https://abapinho.com/2020/07/notion/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Wed, 15 Jul 2020 10:20:11 +0000</pubDate>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[organization]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4535</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/07/use-case-note.png?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/07/use-case-note.png?w=350&amp;ssl=1 350w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/07/use-case-note.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/07/use-case-note.png?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Um dos primeiros artigos do Abapinho foi sobre o Evernote. Ou melhor, foi sobre a importância de tomar notas. Mas nele eu explicava como uso o Evernote para tirar essas notas. Parece mentira mas passaram 10 anos. 10 anos a tirar notas no Evernote. Infelizmente parece que quem faz o Evernote deve ter parado de [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/07/notion/">Adeus Evernote, olá Notion</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/07/use-case-note.png?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/07/use-case-note.png?w=350&amp;ssl=1 350w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/07/use-case-note.png?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/07/use-case-note.png?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p><a href="https://abapinho.com/en/2010/04/evernote/" rel="noopener noreferrer" target="_blank">Um dos primeiros artigos do Abapinho foi sobre o Evernote</a>. Ou melhor, foi sobre a importância de tomar notas. Mas nele eu explicava como uso o Evernote para tirar essas notas.</p>
<p>Parece mentira mas passaram 10 anos. 10 anos a tirar notas no Evernote. Infelizmente parece que quem faz o Evernote deve ter parado de tirar notas há muitos anos porque o Evernote pouco evoluiu desde que o adoptei. Aliás, na versão iOS, piorou. Já lá vão 10 anos e ainda não conseguiram sequer (tentar?) implementar uma forma decente para editar tabelas. Burros.</p>
<p><span id="more-4535"></span></p>
<p>Fiquem lá em 2010 que eu vou seguir em frente.</p>
<p>Já há uns tempos que andava a considerar migrar do Evernote para algo tipo Wiki, idealmente alojado por mim, pois gosto cada vez mais de ser dono dos meus conteúdos (este assunto dava pano para mangas mas como não tem nada a ver com ABAP, o assunto fica aqui de mangas curtas). Mas nunca encontrei nenhuma que fosse tão práctica como o Evernote. Portanto, no caso das minhas notas, o <em>self-hosted</em> vai ter de esperar mais uns tempos.</p>
<p>Principalmente porque entretanto conheci o <a href="https://www.notion.so/" rel="noopener noreferrer" target="_blank">Notion</a> e o <a href="https://roamresearch.com/" rel="noopener noreferrer" target="_blank">Roam</a>. Por muito interessante que o Roam seja, para já não é uma hipótese porque só tem versão browser e porque é mais caro do que eu estou disposto a pagar por um gestor de notas.</p>
<p>Portanto, adeus Evernote, olá Notion.</p>
<p>Não vou explicar aqui todas as virtudes do Notion porque são muitas. É mais fácil ires ver os vídeos que eles têm no site ou experimentares por ti próprio. Mas, assim em resumo, imagina uma extraordinária orgia entre o Evernote, o Trello, o Wunderlist, o Calendário, o Basecamp, o Google Docs e mais uns sujeitos que por ali iam a passar. Daquele extravagante acto sexual nasceu esta espécie de mutante que, além de te permitir tirar notas, permite-te apresentá-las das mais diversas formas, conforme te for mais conveniente naquele momento. Eu até estava disposto a pagar por isto mas eles têm um plano grátis que dá para partilhar notas com até 5 pessoas, podendo estas editar em simultâneo. Importa tudo automaticamente do Evernote sem espinhas e permite exportar em Mardown.</p>
<p>O Notion não é perfeito. O Notion tem bugs. O Notion é mais lento do que deveria ser. E o Notion ainda não tem pesquisa com OCR. Mas o Notion ainda é um bebé e, a julgar pelos emails que já troquei com o apoio técnico, não parece ter pais ausentes como o Evernote.</p>
<p>Procurei agora no YouTube e encontrei este senhor que também usava o Evernote há 10 anos. <a href="https://www.youtube.com/watch?v=ONv_4aR_7e0" rel="noopener noreferrer" target="_blank">Experimentou</a> e <a href="https://www.youtube.com/watch?v=yNq9rbVKBSQ" rel="noopener noreferrer" target="_blank">trocou</a> e já está <a href="https://www.youtube.com/watch?v=D1mLBbn7UpU" rel="noopener noreferrer" target="_blank">fã</a>. Este outro é um daqueles malucos que não consegue almoçar sem tirar uma fotografia à comida. Ficou tão fã que acha que <a href="https://youtu.be/zYxcrl-GeBU?t=327" rel="noopener noreferrer" target="_blank">this shit will change your life</a>. Um pouco exagerado, talvez. Mas ok. O que é facto é que o Notion não deixa ninguém indiferente.</p>
<p>Experimenta e partilha a tua experiência. Ah, e se conheceres alguma alternativa melhor, avisa, pois ainda estou a tempo de trocar.</p>
<p>2020-08-22: O Notion funciona bem no meu MacBook Pro de 2013 mas é muito lento no meu laptop de trabalho que é Windows. Está no limite de se tornar insuportável. Se não melhorar&#8230; vou ter de reconsiderar o Evernote, mesmo perdendo todas as funcionalidades do Notion. Isto enquanto não encontrar uma Wiki suficientemente decente que os substitua todos.</p>
<p>2020-10-02: Desisti do Notion não só porque é muito lento como porque não me adaptei a ter os parágrafos sempre separados, como se fossem bocados de informação independentes, e ter sempre as ferramentas a aparecerem mesmo quando apenas quero escrever texto corrido. Mas acima de tudo porque o copiar e colar texto e imagens a partir da Internet não funciona bem e imprimi-lo ainda menos. Vou continuar a minha quimera em busca de uma ferramenta que substitua o pré-histórico Evernote. O Roam é de todos o mais interessante mas desagrada-me não ser self-hosted. O Athens parece ser uma imitação do Roam que é open-source e que permite self-hosting mas ainda está em desenvolvimento. O Obsidian também é interessante e é totalmente offline. Claramente as coisas estão a evoluir muito rápido. Para já voltei ao Evernote e vou esperar mais uns tempos até encontrar algo que me satisfaça.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/07/notion/">Adeus Evernote, olá Notion</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2020/07/notion/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4535</post-id>	</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>
					<comments>https://abapinho.com/2020/06/lookup-em-tabela-sem-ter-de-lidar-com-a-excepcao-cx_sy_itab_line_not_found/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Mon, 15 Jun 2020 08:00:08 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[7.4]]></category>
		<category><![CDATA[estilo]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4501</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/agulha.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/agulha.jpg?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/agulha.jpg?zoom=2&amp;resize=150%2C150&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/agulha.jpg?zoom=3&amp;resize=150%2C150&amp;ssl=1 450w" sizes="(max-width: 150px) 100vw, 150px" />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. Temos a seguinte tabela interna: DATA(itbl) = VALUE t_t001( ( bukrs = 'COCA' butxt = 'Coca-cola' ) ( bukrs = 'PEPS' butxt = 'Pepsi' ) ). Antes da 7.40 [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/06/lookup-em-tabela-sem-ter-de-lidar-com-a-excepcao-cx_sy_itab_line_not_found/">Lookup em tabela sem ter de lidar com a excepção CX_SY_ITAB_LINE_NOT_FOUND</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/agulha.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/agulha.jpg?resize=150%2C150&amp;ssl=1 150w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/agulha.jpg?zoom=2&amp;resize=150%2C150&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/agulha.jpg?zoom=3&amp;resize=150%2C150&amp;ssl=1 450w" sizes="(max-width: 150px) 100vw, 150px" /><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.</p>
<p><span id="more-4501"></span></p>
<p>Temos a seguinte tabela interna:</p>
<pre><code>
DATA(itbl) = VALUE t_t001( ( bukrs = 'COCA' butxt = 'Coca-cola' )
                            ( bukrs = 'PEPS' butxt = 'Pepsi' ) ).
</code></pre>
<p>Antes da 7.40 tinha de ser assim:</p>
<pre><code>
DATA wa LIKE LINE OF itbl.
DATA butxt TYPE butxt.
READ TABLE itbl INTO wa WITH KEY bukrs = 'SPRI'.
IF SY-SUBRC = 0.
  butxt = wa-butxt.
ENDIF.
</code></pre>
<p>Com o 7.40 a coisa tornou-se muito mais elegante. Mas mesmo assim, se o lookup falhar salta a excepção CX_SY_ITAB_LINE_NOT_FOUND com a qual temos de lidar, o que torna o código feio:</p>
<pre><code>
TRY.
    DATA(butxt) = itbl[ bukrs = 'SPRI' ]-butxt.
  CATCH CX_SY_ITAB_LINE_NOT_FOUND.
    CLEAR butxt.
ENDTRY.
</code></pre>
<p>Mas agora descobri que podemos recorrer ao VALUE e à sua funcionalidade OPTIONAL para nos ajudar a tornar a coisa muito mais simples:</p>
<pre><code>
DATA(butxt) = VALUE #( itbl[ bukrs = 'SPRI' ]-butxt OPTIONAL ).
</code></pre>
<p>Mais legível e mais sintético e por isso muito mais bonito e elegante.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/06/lookup-em-tabela-sem-ter-de-lidar-com-a-excepcao-cx_sy_itab_line_not_found/">Lookup em tabela sem ter de lidar com a excepção CX_SY_ITAB_LINE_NOT_FOUND</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2020/06/lookup-em-tabela-sem-ter-de-lidar-com-a-excepcao-cx_sy_itab_line_not_found/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4501</post-id>	</item>
		<item>
		<title>Converter montante para formato externo numérico</title>
		<link>https://abapinho.com/2020/06/converter-montante-para-formato-externo-numerico/</link>
					<comments>https://abapinho.com/2020/06/converter-montante-para-formato-externo-numerico/?noamp=mobile#respond</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Tue, 02 Jun 2020 08:09:10 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4489</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/calculadora_e_caneta.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/calculadora_e_caneta.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/calculadora_e_caneta.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/calculadora_e_caneta.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Como é conhecido, o SAP guarda internamente os montantes e variáveis com 2 casas decimais. Quando queremos convertê-los no formato externo costumamos usar o WRITE com a opção CURRENCY. Mas o WRITE escreve numa variável alfa-numérica. E se quisermos escrever numa variável numérica? Nesse caso podemos usar esta bela função: DATA amount_internal TYPE wrbtr. DATA [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/06/converter-montante-para-formato-externo-numerico/">Converter montante para formato externo numérico</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/calculadora_e_caneta.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/calculadora_e_caneta.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/calculadora_e_caneta.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/06/calculadora_e_caneta.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Como é conhecido, o SAP guarda internamente os montantes e variáveis com 2 casas decimais. Quando queremos convertê-los no formato externo costumamos usar o WRITE com a opção CURRENCY. Mas o WRITE escreve numa variável alfa-numérica. E se quisermos escrever numa variável numérica?</p>
<p><span id="more-4489"></span></p>
<p>Nesse caso podemos usar esta bela função:</p>
<pre><code>
DATA amount_internal TYPE wrbtr.
DATA amount_external TYPE bapicurr_d.
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
  EXPORTING
    currency        = currency
    amount_internal = amount_internal
  IMPORTING
    amount_external = amount_external.
</code></pre>
<p>Pronto. Os coreanos e os japoneses já podem ficar descansados.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/06/converter-montante-para-formato-externo-numerico/">Converter montante para formato externo numérico</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2020/06/converter-montante-para-formato-externo-numerico/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4489</post-id>	</item>
		<item>
		<title>Cortar e inserir rapidamente</title>
		<link>https://abapinho.com/2020/05/cortar-e-inserir-rapidamente/</link>
					<comments>https://abapinho.com/2020/05/cortar-e-inserir-rapidamente/?noamp=mobile#comments</comments>
		
		<dc:creator><![CDATA[Nuno Godinho]]></dc:creator>
		<pubDate>Tue, 26 May 2020 08:00:36 +0000</pubDate>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[SAPgui]]></category>
		<guid isPermaLink="false">https://abapinho.com/?p=4482</guid>

					<description><![CDATA[<p><img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/luckyluke.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/luckyluke.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/luckyluke.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/luckyluke.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" />Lá aprendi mais uma pequena funcionalidade obscura do SAPGui. Como acelerar o corte e costura. No menu de configuração do SAPGui ligar a opção Cortar e Inserir Rapidamente. Com esta opção ligada, quando seleccionas algum texto, este é imediatamente copiado para o Clipboard. Depois é só usares CTRL-V para o inserires onde quiseres. É discutível [&#8230;]</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/05/cortar-e-inserir-rapidamente/">Cortar e inserir rapidamente</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></description>
										<content:encoded><![CDATA[<img width="150" height="150" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/luckyluke.jpg?resize=150%2C150&amp;ssl=1" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" loading="lazy" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/luckyluke.jpg?w=500&amp;ssl=1 500w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/luckyluke.jpg?resize=300%2C300&amp;ssl=1 300w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/luckyluke.jpg?resize=150%2C150&amp;ssl=1 150w" sizes="(max-width: 150px) 100vw, 150px" /><p>Lá aprendi mais uma pequena funcionalidade obscura do SAPGui. Como acelerar o corte e costura.</p>
<p><span id="more-4482"></span></p>
<p>No menu de configuração do SAPGui ligar a opção <em>Cortar e Inserir Rapidamente</em>. Com esta opção ligada, quando seleccionas algum texto, este é imediatamente copiado para o <em>Clipboard</em>. Depois é só usares CTRL-V para o inserires onde quiseres.</p>
<p><a href="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/quick_copy_paste.jpg?ssl=1"><img loading="lazy" src="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/quick_copy_paste.jpg?resize=484%2C516&#038;ssl=1" alt="" width="484" height="516" class="alignnone size-full wp-image-4483" srcset="https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/quick_copy_paste.jpg?w=484&amp;ssl=1 484w, https://i0.wp.com/abapinho.com/wp-content/uploads/2020/05/quick_copy_paste.jpg?resize=281%2C300&amp;ssl=1 281w" sizes="(max-width: 484px) 100vw, 484px" data-recalc-dims="1" /></a></p>
<p>É discutível se isto é assim tão útil. Eu não vou usar. Até porque a forma como o &#8220;corte e costura&#8221; funciona é, para mim, algo que deve ser definido ao nível do sistema operativo e funcionar uniformemente em todo o lado. Não entendo estas frescuras da SAP. Mas enfim. Fica a partilha para quem gostar.</p>
<p>O Abapinho saúda-vos.</p>
<p>O conteúdo <a rel="nofollow" href="https://abapinho.com/2020/05/cortar-e-inserir-rapidamente/">Cortar e inserir rapidamente</a> aparece primeiro em <a rel="nofollow" href="https://abapinho.com">Abapinho</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://abapinho.com/2020/05/cortar-e-inserir-rapidamente/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4482</post-id>	</item>
	</channel>
</rss>
