<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Abapinho</title>
	
	<link>http://abapinho.com</link>
	<description>ABAP em português</description>
	<lastBuildDate>Tue, 07 Feb 2012 10:53:33 +0000</lastBuildDate>
	<language>pt</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/blogabapinho" /><feedburner:info uri="blogabapinho" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>O histórico do SAPGui não funciona ainda que activo?</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/2HiHRQ3mhg4/</link>
		<comments>http://abapinho.com/2012/02/sapgui-historico/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 10:00:01 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[SAPgui]]></category>
		<category><![CDATA[segredo]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1325</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/torre-belem.png" class="attachment-thumbnail wp-post-image" alt="torre-belem" title="torre-belem" />Já te aconteceu o SAPGui não guardar um histórico dos valores que vais introduzindo nos vários campos ainda que, nas configurações, a opção de Histórico esteja activa? Este aparente paradoxo pode dever-se ao facto de, no SAP Logon, a tua ligação a este servidor SAP estar configurada como &#8220;conexão lenta (tráfego de rede reduzido)&#8221; em [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/torre-belem.png" class="attachment-thumbnail wp-post-image" alt="torre-belem" title="torre-belem" /><p>Já te aconteceu o SAPGui não guardar um histórico dos valores que vais introduzindo nos vários campos ainda que, nas configurações, a opção de Histórico esteja activa?<br />
<span id="more-1325"></span></p>
<p><img src="http://abapinho.com/wp-content/uploads/2011/12/sapgui-opcoes-historico.png" alt="SAPGui - Opções - Histórico" title="SAPGui - Opções - Histórico" width="451" height="363" class="alignnone size-full wp-image-1328" /></p>
<p>Este aparente paradoxo pode dever-se ao facto de, no <i>SAP Logon</i>, a tua ligação a este servidor SAP estar configurada como &#8220;conexão lenta (tráfego de rede reduzido)&#8221; em vez de &#8220;conexão rápida (LAN)&#8221;. Nesse caso o histórico é automaticamente desactivado.</p>
<p><img src="http://abapinho.com/wp-content/uploads/2011/12/saplogon-coneccao-rede.png" alt="SAP Logon - Conexão - Rede" title="SAP Logon - Conexão - Rede" width="530" height="546" class="alignnone size-full wp-image-1329" /></p>
<p>Obscuro.</p>
<p>(Obrigado a <a href="http://www.flickr.com/photos/unaluzazul/2484113976/">unaluzazul</a> pela foto)</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/2HiHRQ3mhg4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2012/02/sapgui-historico/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://abapinho.com/2012/02/sapgui-historico/</feedburner:origLink></item>
		<item>
		<title>A SE80 tem favoritos</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/bgd-7eCj5Kc/</link>
		<comments>http://abapinho.com/2012/01/favoritos-se80/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 10:00:39 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[SAPgui]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1420</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2012/01/marcador.png" class="attachment-thumbnail wp-post-image" alt="Marcador" title="Marcador" />Na transacção SE80 há de tudo. Parece aquelas mercearias de aldeia atafulhadas de tralha onde se compra pasta de dentes, pão, sandálias, perfume e arroz a granel. Eu gosto dessas mercearias. Mas para lá ir é preciso saber ao que se vai, senão anda-se ao tio ao tio. Mas isso é nesses mercearias, porque na [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2012/01/marcador.png" class="attachment-thumbnail wp-post-image" alt="Marcador" title="Marcador" /><p>Na transacção SE80 há de tudo. Parece aquelas mercearias de aldeia atafulhadas de tralha onde se compra pasta de dentes, pão, sandálias, perfume e arroz a granel. Eu gosto dessas mercearias. Mas para lá ir é preciso saber ao que se vai, senão anda-se ao tio ao tio.</p>
<p>Mas isso é nesses mercearias, porque na SE80&#8230; há favoritos.</p>
<p>Pois é. Só soube há uns dias que a transacção SE80 tem a capacidade de guardar favoritos. É um botãozinho logo ali à mão. Vejam a foto:</p>
<p><img src="http://abapinho.com/wp-content/uploads/2012/01/se80-favoritos.png" alt="Favoritos na SE80" title="se80-favoritos" width="488" height="493" class="alignnone size-full wp-image-1422" /></p>
<p>De cada vez que se visita um objecto que se acredita vir a visitar mais vezes no futuro, é só inseri-lo na lista de favoritos e assim nunca mais se tem de andar à procura dele.</p>
<p>Obrigado Nuno Morais pela dica.</p>
<p><i>E obrigado a <a href="http://www.flickr.com/photos/chitrasudar/2756691008/">~suchitra~</a> pela foto.</i></p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/bgd-7eCj5Kc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2012/01/favoritos-se80/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://abapinho.com/2012/01/favoritos-se80/</feedburner:origLink></item>
		<item>
		<title>Se um desconhecido te oferecer valores, isso é Input</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/dBgTP4Ze6k4/</link>
		<comments>http://abapinho.com/2012/01/call-selection-screen/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 10:00:08 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1356</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2012/01/interrogacao.png" class="attachment-thumbnail wp-post-image" alt="Interrogação" title="Interrogação" />Num relatório, os valores são normalmente pedidos ao utilizador no ecrã de selecção inicial, antes da execução do programa. Mas e se quiseres pedir-lhe mais alguns valores, interactivamente, a meio da execução do programa? Uma forma de o fazer é criar um ecrã com os campos desejados e depois invocá-lo com CALL SCREEN. Mas desenhar [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2012/01/interrogacao.png" class="attachment-thumbnail wp-post-image" alt="Interrogação" title="Interrogação" /><p>Num relatório, os valores são normalmente pedidos ao utilizador no ecrã de selecção inicial, antes da execução do programa. Mas e se quiseres pedir-lhe mais alguns valores, interactivamente, a meio da execução do programa?</p>
<p>Uma forma de o fazer é criar um ecrã com os campos desejados e depois invocá-lo com CALL SCREEN. Mas desenhar o ecrã e definir o PAI e o PBO é uma valente maçada. </p>
<p>Outra solução é recorrer às funções POPUP_GET_VALUES ou POPUP_GET_VALUES_DB_CHECKED. São bastante versáteis mas ainda assim algo chatas de utilizar e com algumas limitações. </p>
<p>Mas há uma forma mais simples de o fazer. É através do CALL SELECTION-SCREEN. Passo a explicar:</p>
<p>Primeiro há que definir o ecrã de selecção. A sua definição é praticamente igual à do ecrã de selecção inicial de um relatório:</p>
<pre><code>
TABLES: t001.

SELECTION-SCREEN BEGIN OF <b>SCREEN 3000</b>.
PARAMETERS: p_uname TYPE syuname.
SELECT-OPTIONS: p_bukrs FOR t001-bukrs.
SELECTION-SCREEN END OF <b>SCREEN 3000</b>.
</code></pre>
<p>Depois, onde quer que te apeteça invocar o ecrã é só&#8230; invocares o ecrã:</p>
<pre><code>
START-OF-SELECTION.

* faz não sei quê antes

  <b>CALL SELECTION-SCREEN 3000 STARTING AT 5 5.</b>

* e mais não sei quê depois
</code></pre>
<p>E dá nisto:</p>
<p><img src="http://abapinho.com/wp-content/uploads/2012/01/call-selection-screen.png" alt="CALL SELECTION-SCREEN" title="CALL SELECTION-SCREEN" width="493" height="116" class="alignnone size-full wp-image-1373" /></p>
<p>Se meteres o STARTING AT ele vai criar uma janela de diálogo modal. Se não meteres nada, o ecrã ocupará a janela toda. O ecrã de selecção pode ser tão complicado quanto quiseres, podendo incluir abas e tudo o mais. Além disso, porque para o SAP ele não passa de um ecrã de selecção como os outros, poderás gravar variantes e tudo.</p>
<p>Nota que esta abordagem pode também ser usada em transacções, sendo a única desvantagem o facto de exigir F8 em vez de ENTER para submeter os valores.</p>
<p><i>Obrigado a <a href="http://www.flickr.com/photos/cristinacosta/4304968451/">cristinacosta</a> pela foto.</i></p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/dBgTP4Ze6k4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2012/01/call-selection-screen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://abapinho.com/2012/01/call-selection-screen/</feedburner:origLink></item>
		<item>
		<title>Ecrãs de selecção com abas</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/WUtfZ5eM4lw/</link>
		<comments>http://abapinho.com/2012/01/ecra-seleccao-abas/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 10:00:23 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1335</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/abas.png" class="attachment-thumbnail wp-post-image" alt="abas" title="abas" />Os ecrãs de selecção dos programas ABAP têm várias funcionalidades que, embora sofisticadas e simples de usar, são geralmente ignoradas. Aqui mostrar-te-ei quão simples é criar abas para melhor organizar os parâmetros de um programa. Desta vez, excepcionalmente, vou poupar-te à verborreia. É uma aula prática. Vamos lá. O nosso ecrã de selecção terá 3 [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/abas.png" class="attachment-thumbnail wp-post-image" alt="abas" title="abas" /><p>Os ecrãs de selecção dos programas ABAP têm várias funcionalidades que, embora sofisticadas e simples de usar, são geralmente ignoradas. Aqui mostrar-te-ei quão simples é criar abas para melhor organizar os parâmetros de um programa. Desta vez, excepcionalmente, vou poupar-te à verborreia. É uma aula prática.<br />
<span id="more-1335"></span></p>
<p>Vamos lá. O nosso ecrã de selecção terá 3 abas que representam 3 grupos distintos de parâmetros. </p>
<p>Como o que tem que ser tem muita força, comecemos pela declaração de dados:</p>
<pre><code>
REPORT  zzz_nfg_selscreen_tabs2.

TABLES: kna1.

DATA: ucomm1 LIKE sy-ucomm,
      ucomm2 LIKE sy-ucomm,
      ucomm3 LIKE sy-ucomm.
</code></pre>
<p>A tabela KNA1 é declarada porque vai ser usada em SELECT-OPTIONS e as outras 3 variáveis são declaradas porque, embora como irão constatar, não sejam usadas para nada, é preciso declará-las senão o programa não compila.</p>
<p>Agora declaramos os 3 sub-ecrãs:</p>
<pre><code>
* Sub-ecrã: Filtros KNA1
SELECTION-SCREEN BEGIN OF SCREEN 3010 AS SUBSCREEN.
SELECT-OPTIONS: s_kunnr FOR kna1-kunnr,
                s_land1 FOR kna1-land1,
                s_ktokd FOR kna1-ktokd.
SELECTION-SCREEN END OF SCREEN 3010.

* Sub-ecrã: Opções
SELECTION-SCREEN BEGIN OF SCREEN 3020 AS SUBSCREEN.
PARAMETERS: p_opt1 AS CHECKBOX,
            p_opt2 AS CHECKBOX,
            p_opt3 AS CHECKBOX.
SELECTION-SCREEN END OF SCREEN 3020.

* Sub-ecrã: Ficheiro
SELECTION-SCREEN BEGIN OF SCREEN 3030 AS SUBSCREEN.
PARAMETERS: p_file TYPE rlgrap-filename DEFAULT '/ficheiro.txt'.
SELECTION-SCREEN END OF SCREEN 3030.
</code></pre>
<p>Agora que temos os sub-ecrãs definidos é só aplicá-los num TABBED BLOCK:</p>
<pre><code>
* Bloco normalíssimo só porque sim
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-b01.
PARAMETERS: p_uname TYPE uname OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.

* Tabbed strip
SELECTION-SCREEN BEGIN OF TABBED BLOCK tabs FOR 3 LINES.
SELECTION-SCREEN TAB (15) tab1 USER-COMMAND ucomm1 DEFAULT SCREEN 3010.
SELECTION-SCREEN TAB (30) tab2 USER-COMMAND ucomm2 DEFAULT SCREEN 3020.
SELECTION-SCREEN TAB (15) tab3 USER-COMMAND ucomm3 DEFAULT SCREEN 3030.
SELECTION-SCREEN END OF BLOCK tabs.
</code></pre>
<p>Como vês, é simples. As variáveis TAB1, TAB2 e TAB3 são declaradas implicitamente e deverão conter os títulos das abas. Já as variáveis UCOMM1, UCOMM2 e UCOMM3 têm de ser declaradas explicitamente e definem o comando que poderá ser usado no SELECTION-SCREEN OUTPUT (equivalente ao PAI dos ecrãs) para controlar qualquer coisa adicional, mas neste caso não as vamos usar para mais nada.</p>
<p>O primeiro bloco com o P_UNAME está ali só para mostrar que os TABBED BLOCKS podem conviver com outros blocos normais.</p>
<p>Só falta definirmos os títulos das abas:</p>
<pre><code>
INITIALIZATION.
  tab1 = 'Filtros KNA1'(t01).
  tab2 = 'Opções'(t02).
  tab3 = 'Ficheiro'(t03).
</code></pre>
<p>Já está. E o resultado é este:</p>
<p><img src="http://abapinho.com/wp-content/uploads/2012/01/ecra-seleccao-abas.png" alt="Ecrã de selecção com abas" title="Ecrã de selecção com abas" width="503" height="401" class="alignnone size-full wp-image-1351" /></p>
<p>A partir daqui é o START-OF-SELECTION e o resto do programa é igual ao que seria sem as abas. </p>
<p>Ainda está a milhas do Adobe Flex, mas é melhor do que nada.</p>
<p><i>Obrigado a <a href="http://www.flickr.com/photos/ensee/3092607303/">ensee_89</a> pela foto.</i></p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/WUtfZ5eM4lw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2012/01/ecra-seleccao-abas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://abapinho.com/2012/01/ecra-seleccao-abas/</feedburner:origLink></item>
		<item>
		<title>Debug em janelas de diálogo modais</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/LNW3kwhsKWQ/</link>
		<comments>http://abapinho.com/2012/01/debug-em-popups/#comments</comments>
		<pubDate>Mon, 09 Jan 2012 10:00:29 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[segredo]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1307</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/atirar-para-cima.png" class="attachment-thumbnail wp-post-image" alt="atirar-para-cima" title="atirar-para-cima" />Há determinados momentos em que não é possível fazer /H para iniciar o debugger. O caso mais comum é durante uma janela de diálogo modal (aquilo que os estrangeiros chamam de popup). Mas há uma forma simples, ainda que rocambolesca, para o conseguires: 1. Cria um ficheiro de texto com o seguinte conteúdo: [FUNCTION] Command=/H [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/atirar-para-cima.png" class="attachment-thumbnail wp-post-image" alt="atirar-para-cima" title="atirar-para-cima" /><p>Há determinados momentos em que não é possível fazer /H para iniciar o <i>debugger</i>. O caso mais comum é durante uma janela de diálogo modal (aquilo que os estrangeiros chamam de <i>popup</i>). Mas há uma forma simples, ainda que rocambolesca, para o conseguires:</p>
<p><span id="more-1307"></span></p>
<p>1. Cria um ficheiro de texto com o seguinte conteúdo:<br />
[FUNCTION]<br />
Command=/H<br />
Title=Debugger<br />
Type=SystemCommand</p>
<p>2. Grava o ficheiro numa pasta ou no ambiente de trabalho;</p>
<p>3. Arrasta (aquilo que os estrangeiros chamam de <i>drag and drop</i>) o ficheiro de onde o gravaste para cima da janela de diálogo ao mesmo tempo que gritas ABRACADABRA.</p>
<p>E assim, desta forma estrambólica, como que por magia, se tiveres gritado, o modo de <i>debug</i> será activado para teu regozijo.</p>
<p>É verdade que provavelmente já toda a gente conhece esta dica, mas é tão fundamental que me pareceu ser obrigação do Abapinho ensiná-la.</p>
<p>(Obrigado a <a href="http://www.flickr.com/photos/14617207@N00/4609793276/">alandberning</a> pela foto)</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/LNW3kwhsKWQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2012/01/debug-em-popups/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://abapinho.com/2012/01/debug-em-popups/</feedburner:origLink></item>
		<item>
		<title>O que diz uma mensagem?</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/RR_Uwufrnww/</link>
		<comments>http://abapinho.com/2012/01/texto-mensagem/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 10:00:15 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[estilo]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1298</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/postit.png" class="attachment-thumbnail wp-post-image" alt="postit" title="postit" />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 '00' TYPE 'E' NUMBER '163' WITH '123' INTO texto. É só isto. Agora do lado de dentro da variável texto encontras o seguinte texto: &#8220;O mandante 123 [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/postit.png" class="attachment-thumbnail wp-post-image" alt="postit" title="postit" /><p>Queres obter o texto de uma mensagem da qual só sabes o ID e o número e não sabes como? Aprende aqui:</p>
<pre><code>
DATA texto TYPE string.
MESSAGE ID '00' TYPE 'E' NUMBER '163' WITH '123' INTO texto.
</code></pre>
<p>É só isto. Agora do lado de dentro da variável <i>texto</i> encontras o seguinte texto:</p>
<p>&#8220;O mandante 123 não existe no sistema&#8221;</p>
<p>Obrigado a <a href="http://www.flickr.com/photos/flatcat/3555774083/">Peteris B</a> pela foto.</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/RR_Uwufrnww" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2012/01/texto-mensagem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://abapinho.com/2012/01/texto-mensagem/</feedburner:origLink></item>
		<item>
		<title>Sê preguiçoso quando escreves em ABAPês</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/TxguqyN-Sbo/</link>
		<comments>http://abapinho.com/2011/12/modelos-de-codigo/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 00:11:42 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[SAPgui]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1262</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/praia_bali.png" class="attachment-thumbnail wp-post-image" alt="praia_bali" title="praia_bali" />Para tentar determinar quais as profissões com gente mais preguiçosa fiz as seguintes pesquisas no Google: Profissão Resultados &#8220;médico preguiçoso&#8221; 2.140.000 &#8220;advogado preguiçoso&#8221; 1.430.000 &#8220;gestor preguiçoso&#8221; 1.020.000 &#8220;engenheiro preguiçoso&#8221; 647.000 &#8220;político preguiçoso&#8221; 602.000 &#8220;economista preguiçoso&#8221; 284.000 &#8220;pedreiro preguiçoso&#8221; 91.200 Como se pode concluir inequivocamente, os engenheiros não são suficientemente preguiçosos pois são ultrapassados pelos advogados [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/praia_bali.png" class="attachment-thumbnail wp-post-image" alt="praia_bali" title="praia_bali" /><p>Para tentar determinar quais as profissões com gente mais preguiçosa fiz as seguintes pesquisas no Google:</p>
<table>
<tr>
<th>Profissão</th>
<th>Resultados</th>
</tr>
<tr>
<td>&#8220;médico preguiçoso&#8221;</td>
<td>2.140.000</td>
</tr>
<tr>
<td>&#8220;advogado preguiçoso&#8221;</td>
<td>1.430.000</td>
</tr>
<tr>
<td>&#8220;gestor preguiçoso&#8221;</td>
<td>1.020.000</td>
</tr>
<tr>
<td><i>&#8220;engenheiro preguiçoso&#8221;</i></td>
<td><i>647.000</i></td>
</tr>
<tr>
<td>&#8220;político preguiçoso&#8221;</td>
<td>602.000</td>
</tr>
<tr>
<td>&#8220;economista preguiçoso&#8221;</td>
<td>284.000</td>
</tr>
<tr>
<td>&#8220;pedreiro preguiçoso&#8221;</td>
<td>91.200</td>
</tr>
</table>
<p>Como se pode concluir inequivocamente, os engenheiros não são suficientemente preguiçosos pois são ultrapassados pelos advogados e pelos médicos. Isto tem de mudar. E esta dica vai ajudar. Mas não sem deixar clara a seguinte diferença: preguiça não é ergasiofobia. Falo aqui da preguiça nobre, a de quem gosta de fazer as coisas mas procura fazê-las com o mínimo esforço possível. Já os preguiçosos mandriões, esses não são para aqui chamados.</p>
<p>O SAP, que lá vai evoluindo lentamente, lançou já há uns anos um editor novo que vem cheio de <a href="http://wiki.sdn.sap.com/wiki/display/ABAP/New+ABAP+Editor" target="_blank">capacidades</a> muitas das quais, ainda que convenientes, são pouco aproveitadas. Uma delas chama-se &#8220;Modelos de código&#8221; que passo a apresentar:</p>
<p><span id="more-1262"></span></p>
<ol>
<li>Vai à SE38 ou à SE24 ou à SE37 ou qualquer outra transacção que apresente o editor de ABAP;</li>
<li>No canto inferior direito há um ícone com ar de <i>clipboard</i>. Clica nele;</li>
<li>Aparecem-te as opções do editor;</li>
<li>Nas opções à esquerda escolhe &#8220;Modelos de código&#8221;;</li>
<li>Aí encontras vários modelos já pré-definidos (ex: TRY) e podes definir outros só teus.</li>
</ol>
<p>Aqui a definição dos modelos de código:<br />
<img src="http://abapinho.com/wp-content/uploads/2011/12/modelo_codigo_abap.png" alt="" title="modelo_codigo_abap" width="599" height="348" class="alignnone size-full wp-image-1267" /></p>
<p>Enquanto escreves código basta que em qualquer sítio escrevas o nome de um dos modelos e carregues em TAB para que esse nome seja substituído pelo seu modelo.</p>
<p>Dica dentro da dica: ideal para aquelas linhas &#8220;eu estive aqui!&#8221; que são apanágio de qualquer martelada em código alheio.</p>
<p>Toca a ser preguiçoso!</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/TxguqyN-Sbo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/12/modelos-de-codigo/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/12/modelos-de-codigo/</feedburner:origLink></item>
		<item>
		<title>ALV com múltipla escolha num ecrã de diálogo modal</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/i5IlRdIKXMs/</link>
		<comments>http://abapinho.com/2011/12/alv-popup/#comments</comments>
		<pubDate>Mon, 19 Dec 2011 10:00:31 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[alv]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1249</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/pipocas.png" class="attachment-thumbnail wp-post-image" alt="pipocas" title="pipocas" />Sabes apresentar, numa janela de diálogo, uma ALV com uma lista de registos permitindo escolha múltipla? Eu não sabia e agora já sei. Vou explicar como é. Faz de conta que queres escolher uns clientes: DATA: t_kna1 TYPE STANDARD TABLE OF kna1. SELECT * FROM kna1 INTO TABLE t_kna1. Pronto, agora já enchemos à bruta [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/12/pipocas.png" class="attachment-thumbnail wp-post-image" alt="pipocas" title="pipocas" /><p>Sabes apresentar, numa janela de diálogo, uma ALV com uma lista de registos permitindo escolha múltipla? Eu não sabia e agora já sei. Vou explicar como é.<br />
<span id="more-1249"></span><br />
Faz de conta que queres escolher uns clientes:</p>
<pre><code>
DATA: t_kna1 TYPE STANDARD TABLE OF kna1.

SELECT * FROM kna1 INTO TABLE t_kna1.
</pre>
<p></code></p>
<p>Pronto, agora já enchemos à bruta uma tabela interna com os clientes todos. O próximo passo é criar o catálogo de campos:</p>
<pre><code>
  DATA: ls_fieldcat TYPE slis_fieldcat_alv,
        lt_fieldcat TYPE slis_t_fieldcat_alv.

  CLEAR ls_fieldcat.
  ls_fieldcat-row_pos   = '1'.
  ls_fieldcat-tabname   = 'T_KNA1'.

  ls_fieldcat-col_pos   = '1'.
  ls_fieldcat-fieldname = 'CHECKBOX'.
  ls_fieldcat-seltext_m = 'SELECT'.
  APPEND ls_fieldcat TO lt_fieldcat.

  ls_fieldcat-col_pos   = '2'.
  ls_fieldcat-fieldname = 'KUNNR'.
  ls_fieldcat-seltext_m = 'Nº cliente'.
  ls_fieldcat-outputlen = 10.
  APPEND ls_fieldcat TO lt_fieldcat.

  ls_fieldcat-col_pos   = '3'.
  ls_fieldcat-fieldname = 'NAME1'.
  ls_fieldcat-seltext_m = 'Nome'.
  ls_fieldcat-outputlen = 35.
  APPEND ls_fieldcat TO lt_fieldcat.

</code></pre>
<p>Claro que o catálogo pode ser criado automaticamente recorrendo à FM REUSE_ALV_FIELDCATALOG_MERGE se for caso disso. Mas nota que, para poder fazer a selecção múltipla, terás de adicionar uma coluna chamada CHECKBOX (ou com o nome que bem entenderes).</p>
<p>A seguir vamos criar uma tabela com as funções a excluir da ALV (para que em vez de aparecerem todos os comandos apareçam apenas o OK e o CANCEL:</p>
<pre><code>
  DATA: lt_excl     TYPE slis_t_extab,
        ls_excl     TYPE slis_extab.

  ls_excl-fcode = '&#038;ETA'. APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '%SC'.  APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '%SC+'. APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '&#038;OUP'. APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '&#038;ODN'. APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '&#038;ILT'. APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '&#038;OL0'. APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '&#038;CRB'. APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '&#038;CRL'. APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '&#038;CRR'. APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '&#038;CRE'. APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '&#038;ALL'. APPEND ls_excl TO lt_excl.
  ls_excl-fcode = '&#038;SAL'. APPEND ls_excl TO lt_excl.
</pre>
<p></code></p>
<p>Depois chamamos a função mágica que faz aparecer o popup com a ALV:</p>
<pre><code>
  CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'
    EXPORTING
      i_zebra              = 'X'
      it_fieldcat          = lt_fiedcat
      i_tabname            = 'T_KNA1'
      i_screen_start_column = 1
      i_screen_start_line   = 1
      i_screen_end_column   = 100
      i_screen_end_line     = 25
      i_checkbox_fieldname = 'CHECKBOX'
    TABLES
      t_outtab             = t_kna1.
</code></pre>
<p>Esta função mostra o popup que permite ao utilizador seleccionar um ou mais registos. Quando o utilizador carrega em OK ou CANCEL, o programa continua e podemos utilizar o campo CHECKBOX para determinar quais as linhas por ele seleccionadas:</p>
<pre><code>
  LOOP AT it_output INTO wa_output WHERE checkbox = 'X'.
"  Faz aqui o que te apeteceer
  ENDLOOP.
</code></pre>
<p>E já está.</p>
<p>Obrigado a <a href="http://www.flickr.com/photos/ayelie/441107616/">Ayelie</a> pela foto.</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/i5IlRdIKXMs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/12/alv-popup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/12/alv-popup/</feedburner:origLink></item>
		<item>
		<title>Automatizar catálogo de campos de ALV</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/2-kvl-I6BLQ/</link>
		<comments>http://abapinho.com/2011/12/automatizar-catalogo-alv/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 10:00:00 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[alv]]></category>
		<category><![CDATA[estilo]]></category>
		<category><![CDATA[i18n]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1187</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/11/lixo.png" class="attachment-thumbnail wp-post-image" alt="lixo" title="lixo" />À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. Cenário típico: define-se uma tabela interna preenche-se [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/11/lixo.png" class="attachment-thumbnail wp-post-image" alt="lixo" title="lixo" /><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.</p>
<p><span id="more-1187"></span><br />
Cenário típico:</p>
<ol>
<li>define-se uma tabela interna</li>
<li>preenche-se essa tabela com dados</li>
<li>constrói-se o catálogo de campos da ALV</li>
<li>apresenta-se a ALV</li>
</ol>
<p>Não é incomum a definição do catálogo de campos extender-se por centenas de linhas, as quais se limitam a definir a ordem, o tipo de dados ou as descrições de cada um dos campos. </p>
<p>O problema começa logo no passo 1, a definição dos dados:</p>
<pre><code>
TYPES: BEGIN OF ty_data,
             campo1 TYPE char10,
             campo2 TYPE char15,
             campo3 TYPE char10,
             campo4 TYPE i,
          END OF ty_data.
DATA: t_data TYPE STANDARD TABLE OF ty_data.
</pre>
<p></code></p>
<p>E continua no passo 3 porque, como esta definição de dados não explicita um contexto semântico para cada campo, depois, claro está, há que construir à mão o catálogo de campos da ALV:</p>
<pre><code>
DATA: o_table TYPE REF TO cl_salv_table,
          o_columns       TYPE REF TO cl_salv_columns.

cl_salv_table=>factory(
  IMPORTING
    r_salv_table = o_table
  CHANGING
    t_table      = t_data ).

o_columns = o_table->get_columns( ).

o_column = in_columns->get_column( 'CAMPO1' ).
o_column->set_short_text(  'Textito1' ).
o_column->set_medium_text( 'Texto 1' ).
o_column->set_long_text(   'Textão 1' ).

o_column = in_columns->get_column( 'CAMPO2' ).
o_column->set_short_text(  'Textito2' ).
o_column->set_medium_text( 'Texto 2' ).
o_column->set_long_text(   'Textão 2' ).

o_column = in_columns->get_column( 'CAMPO3' ).
o_column->set_short_text(  'Textito3' ).
o_column->set_medium_text( 'Texto 3' ).
o_column->set_long_text(   'Textão 3' ).

(etc... )

o_table->display( ).

</code></pre>
<p>Ora uma solução muito simples para evitar estar a espalhar descrições dos campos pelo código é, em vez de definir a estrutura de dados directamente no código, usar uma estrutura do DDIC em que cada campo tem o seu contexto semântico devidamente definido através de um elemento de dados que contém já as descrições que se pretende ver aparecer no ALV. Assim, já não é preciso definir programaticamente nem as descrições nem a ordem nem o tipo dos campos pois tudo isto será deduzido automaticamente pelas classes/funções das ALV:</p>
<pre><code>
DATA: t_data TYPE STANDARD TABLE OF zxxxxx_alv,
          o_table TYPE REF TO cl_salv_table.

cl_salv_table=>factory(
  IMPORTING
    r_salv_table = o_table
  CHANGING
    t_table      = t_data ).

o_table->display( ).
</code></pre>
<p>Poupam-se dezenas ou centenas de linhas no programa e além disso, desta forma os campos podem ser traduzidos, o que não é de pouca monta (cristalizar descrições no código é sempre de evitar). E se no futuro for necessário alterar a descrição de um campo basta modificar o elemento de dados a ele associado na estrutura. Cada coisa em seu lugar.</p>
<p>Como exemplo, um cenário real com que me deparei há uns dias: num relatório que apresentava os dados numa ALV foi-me pedido para adicionar a possibilidade de, ao invés, gravar os dados num Excel. Implementei esta opção (recorrendo ao fantástico ABAP2XLSX do qual falarei em breve) e depois constatei que os nomes das colunas no Excel eram todos feios tipo "CHAR10" ou descontextualizados tipo "Description" e "Text". Constatei que o programa até usava uma estrutura, mas os seus campos estavam definidos com elementos de dados genéricos. O catálogo de campos era modificado à mão sendo todas as descrições introduzidas programaticamente. Ora como o ABAP2XLSX também tem um catálogo de campos a solução mais simples e parva seria adicionar também as descrições ao catálogo de campos do ABAP2XLSX. Mas a solução melhor e mais saudável foi definir correctamente os elementos de dados da estrutura. Depois os campos passaram a aparecer automaticamente bem tanto no ALV como no Excel. E ainda pude apagar do programa todas as descrições directamente programadas.</p>
<p>(Obrigado <a href="http://www.flickr.com/photos/editor/172690560/">Editor B</a> pela imagem.)</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/2-kvl-I6BLQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/12/automatizar-catalogo-alv/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/12/automatizar-catalogo-alv/</feedburner:origLink></item>
		<item>
		<title>Pasta temporária do SAP Gui</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/CkTtkO4tL-U/</link>
		<comments>http://abapinho.com/2011/12/pasta-temporaria-sap-gui/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 10:00:09 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1161</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/11/pasta.png" class="attachment-thumbnail wp-post-image" alt="pasta" title="pasta" />Por vezes um programa quer gravar um ficheiro localmente, no computador do utilizador através do SAP Gui. Nesses casos é comum que um dos campos do ecrã de selecção seja a localização da pasta no disco local. Eis uma forma de inicializar esse campo com a pasta temporária do SAP Gui: PARAMETERS: p_path TYPE string. [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/11/pasta.png" class="attachment-thumbnail wp-post-image" alt="pasta" title="pasta" /><p>Por vezes um programa quer gravar um ficheiro localmente, no computador do utilizador através do SAP Gui. Nesses casos é comum que um dos campos do ecrã de selecção seja a localização da pasta no disco local. </p>
<p>Eis uma forma de inicializar esse campo com a pasta temporária do SAP Gui:</p>
<pre><code>
PARAMETERS: p_path TYPE string.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
  CALL METHOD cl_gui_frontend_services=>directory_browse
    EXPORTING
      initial_folder  = p_path
    CHANGING
      selected_folder = p_path.

INITIALIZATION.
  CALL METHOD cl_gui_frontend_services=>get_sapgui_workdir
    CHANGING
      sapworkdir = p_path.
  CALL METHOD cl_gui_cfw=>flush.
</code></pre>
<p>Obrigado Sérgio Fraga pela dica.</p>
<p>E obrigado <a href="http://www.flickr.com/photos/hatm/4549870013/in/photostream/">HatM</a> pela foto.</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/CkTtkO4tL-U" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/12/pasta-temporaria-sap-gui/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/12/pasta-temporaria-sap-gui/</feedburner:origLink></item>
		<item>
		<title>Análises parciais na SE30</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/-ykc1v5a3lg/</link>
		<comments>http://abapinho.com/2011/11/se30-parciais/#comments</comments>
		<pubDate>Mon, 28 Nov 2011 11:37:25 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1153</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/11/regua.png" class="attachment-thumbnail wp-post-image" alt="regua" title="regua" />Claro que já conheces a transacção SE30 (Análise de tempo de execução) e claro que a usas amiúde para analisar programas standard e descobrir nele tabelas, funções, BADIs e quejandos. Ora se fores como eu, manténs uma relação de amor-ódio com esta transacção: se por um lado a amas por graças a ela consegues ver [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/11/regua.png" class="attachment-thumbnail wp-post-image" alt="regua" title="regua" /><p>Claro que já conheces a transacção SE30 (Análise de tempo de execução) e claro que a usas amiúde para analisar programas standard e descobrir nele tabelas, funções, BADIs e quejandos.</p>
<p>Ora se fores como eu, manténs uma relação de amor-ódio com esta transacção: se por um lado a amas por graças a ela consegues ver as entranhas de um programa sem ter de fazer debug, por outro lado odeia-la porque normalmente a lista de entranhas costuma ter milhares de linhas e tornar-se ingerível.</p>
<p>Mas eu já não sou como eu porque, desde que descobri que a SE30 permite fazer análises parciais, a minha relação com ela passou a ser de puro amor. E a partir de agora também tu poderás amá-la na sua totalidade porque vou ensinar-te este segredo.</p>
<ol>
<li>Transacção SE30;</li>
<li>No bloco &#8220;Restrições de medição&#8221; cria uma variante com um nome qualquer diferente do DEFAULT;</li>
<li>Na variante activa o pisco &#8220;Unidades determinadas&#8221;;</li>
<li>Insere a transacção ou programa ou módulo de função a analisar;</li>
<li>Carrega em &#8220;Executar&#8221; (normalmente agora a análise começaria mas, como escolhemos &#8220;unidades determinadas&#8221;, começa desligada e é preciso ligá-la explicitamente);</li>
<li>Navega dentro do programa que estás a analisar até chegares ao ponto que queres analisar;</li>
<li>Activa a análise escrevendo <strong>/ron</strong> lá em cima no campo de comandos;</li>
<li>Faz o que tens a fazer;</li>
<li>Desactiva a análise escrevendo lá em cima <strong>/roff</strong>;</li>
<li>Sai do programa, voltando ao ecrã da SE30.</li>
</ol>
<p>Acabaste de fazer uma análise parcial que, em vez dos típicos milhares de linhas, tem apenas as dezenas ou centenas de linhas que ocorreram entre os comandos <strong>/ron</strong> e <strong>/roff</strong>. Mais útil, não?</p>
<p>Aproveita o balanço e explora as outras possibilidades disponibilizadas pelas variantes de &#8220;restrição de medição&#8221;.</p>
<p>Obrigado a Michael Opoczynski pelo ensinamento.</p>
<p>E obrigado a <a href="http://www.flickr.com/photos/catikaoe/3234711319/in/photostream/">* Cati Kaoe *</a> pela foto.</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/-ykc1v5a3lg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/11/se30-parciais/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/11/se30-parciais/</feedburner:origLink></item>
		<item>
		<title>Programas poliglotas que sabem o que dizem</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/U_c0xWVHxCs/</link>
		<comments>http://abapinho.com/2011/11/programas-poliglotas/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 10:00:20 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[i18n]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1140</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/11/papagaio.png" class="attachment-thumbnail wp-post-image" alt="papagaio" title="papagaio" />O SAP é um grande poliglota. Mas o ABAP nem sempre. O ABAP até tem muita facilidade em aprender e falar várias línguas, mas às vezes os programadores não o deixam. Muitos programadores cinzelam os textos literais directamente no programa, deixando-o irremediavelmente incapaz de comunicar em vários idiomas. Imagino duas razões para se agrilhoar um [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/11/papagaio.png" class="attachment-thumbnail wp-post-image" alt="papagaio" title="papagaio" /><p>O SAP é um grande poliglota. Mas o ABAP nem sempre. O ABAP até tem muita facilidade em aprender e falar várias línguas, mas às vezes os programadores não o deixam.</p>
<p>Muitos programadores cinzelam os textos literais directamente no programa, deixando-o irremediavelmente incapaz de comunicar em vários idiomas. Imagino duas razões para se agrilhoar um programa a uma única língua:</p>
<ul>
<li>A preguiça, que é a principal razão para se fazerem as coisas mal feitas;</li>
<li>A legibilidade. Realmente a forma de tornar um programa ABAP localizável é pejá-lo com referências a textos, tipo TEXT-001, o que pode torná-lo bastante ilegível.</li>
</ul>
<p>Então aqui fica uma dica para ter o melhor dos dois mundos: um programa localizável que não perca a legibilidade:</p>
<p>Em vez de seres preguiçoso e fazeres:</p>
<pre><code>
WRITE: 'Eu quero ver auroras boreais'.
</code></pre>
<p>E em vez de seres obscuro e fazeres:</p>
<pre><code>
WRITE: TEXT-001.
</code></pre>
<p>Sê esperto e faz:</p>
<pre><code>
WRITE: 'Eu quero ver auroras boreais'(001).
</code></pre>
<p>E já está.</p>
<p>Se o text TEXT-001 estiver definido na língua em que o programa estiver a correr este TEXT-001 será usado. Caso contrário, o texto literal escrito directamente no programa será usado. Assim mantém-se a legibilidade do código, pode traduzir-se os textos à vontade e ainda por cima temos a certeza de que, mesmo quando faltar traduzir algum texto, mesmo assim aparecerá o texto que está no programa.</p>
<p>Obrigado Sérgio Lopes pela dica.</p>
<p>(E obrigado <a href="http://www.flickr.com/photos/doug88888/4131175353/">doug88888</a> pela foto)</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/U_c0xWVHxCs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/11/programas-poliglotas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/11/programas-poliglotas/</feedburner:origLink></item>
		<item>
		<title>Adeus DESCRIBE TABLE. Já vais tarde.</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/CHNV63PpwhE/</link>
		<comments>http://abapinho.com/2011/11/lines/#comments</comments>
		<pubDate>Mon, 07 Nov 2011 10:20:18 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[estilo]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1122</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/quatroemlinha.png" class="attachment-thumbnail wp-post-image" alt="quatroemlinha" title="quatroemlinha" />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 [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/quatroemlinha.png" class="attachment-thumbnail wp-post-image" alt="quatroemlinha" title="quatroemlinha" /><p>Durante doze anos<br />
Quando quis contar<br />
As linhas de uma itab<br />
Fazia o que todos fazem:<br />
<code>DESCRIBE TABLE itab LINES linhas.</code></p>
<p>Até que outro dia<br />
Vi uma coisa que,<br />
Parece mentira,<br />
Nunca antes vira:<br />
<code>LINES( itab ).</code></p>
<p>Dá no mesmo<br />
E sem ter de declarar<br />
O raio da variável.</p>
<p>Assim, em vez de:</p>
<pre><code>
DATA: linhas TYPE i.
DESCRIBE TABLE itabl LINES linhas.
IF linhas = 42.
  WRITE 'A tua tabela é a verdade'.
ENDIF.
</code></pre>
<p>Basta fazer:</p>
<pre><code>
IF LINES( itbl ) = 42.
  WRITE 'A tua tabela é a verdade'.
ENDIF.
</code></pre>
<p>É a prova de que<br />
Se a SAP quisesse<br />
Fazia um esforço<br />
E o ABAP seria<br />
Uma coisa fixe.</p>
<p>Mas parece que não quer<br />
E o ABAP que se lixe.</p>
<p>Merda de poema. Foi o que se arranjou.</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/CHNV63PpwhE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/11/lines/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/11/lines/</feedburner:origLink></item>
		<item>
		<title>A mensagem travesti</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/z_7vhQxSBQA/</link>
		<comments>http://abapinho.com/2011/10/mensagem-travesti/#comments</comments>
		<pubDate>Mon, 31 Oct 2011 10:00:55 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[estilo]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1091</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/travesti.png" class="attachment-thumbnail wp-post-image" alt="Travesti" title="Travesti" />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 [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/travesti.png" class="attachment-thumbnail wp-post-image" alt="Travesti" title="Travesti" /><p>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:</p>
<pre><code>
START-OF-SELECTION.
  IF condicao_desejada.
    MESSAGE S001(00) with 'Erro!' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.
  WRITE 'Olá, eu sou o resto do programa'.
</code></pre>
<p>A mensagem do tipo S mascarou-se de E. Parece que É, mas não É.</p>
<p>Se experimentares vais ver que o sistema dá erro mas não sai completamente do programa; Volta ao ecrã de selecção e não corre o resto do programa (por causa do EXIT).</p>
<p>Obrigado Sérgio Lopes pela dica.</p>
<p>(E obrigado <a href="http://www.flickr.com/photos/tcelestino/2858606793/in/photostream/" target="_blank">Tiago Celestino</a> pela foto)</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/z_7vhQxSBQA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/10/mensagem-travesti/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/10/mensagem-travesti/</feedburner:origLink></item>
		<item>
		<title>O circunlóquio do VALUE CHECK</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/h1ktn0-GtoM/</link>
		<comments>http://abapinho.com/2011/10/value-check/#comments</comments>
		<pubDate>Mon, 24 Oct 2011 09:00:24 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[estilo]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1048</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/rodeios.png" class="attachment-thumbnail wp-post-image" alt="rodeios" title="rodeios" />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 [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/rodeios.png" class="attachment-thumbnail wp-post-image" alt="rodeios" title="rodeios" /><p>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 é.</p>
<p>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 <em>VALUE CHECK</em>. Parece simples. Por exemplo, presumia-se que isto funcionasse:</p>
<pre><code>
PARAMETERS: P_BUKRS LIKE T001-BUKRS OBLIGATORY VALUE CHECK.
</code></pre>
<p>Vais a ver e não funciona.</p>
<p>O campo <em>T001-BUKRS</em> é do tipo <em>BUKRS</em> que é do domínio <em>BUKRS</em> que por sua vez tem definida a tabela de valores <em>T001</em> para a qual <em>BUKRS</em> é a única chave primária. Mesmo assim, pateticamente, isto não funciona. Não funciona porque, por alguma razão lamentável, ao contrário do que faria sentido e se subentende na documentação, o <em>VALUE CHECK</em> não tem em conta o domínio do campo que valida. Pelo contrário, para este funcionar é preciso que o campo referido tenha uma chave externa para a tabela de valores.</p>
<p>Portanto, no nosso caso, embora a tabela que contém a lista de valores possíveis do <em>BUKRS</em> seja a <em>T001</em>, para o <em>VALUE CHECK</em> funcionar temos antes de fazer referência a uma outra tabela qualquer que tenha a <em>T001</em> definida como chave externa. Como por exemplo, a <em>T001K</em>:</p>
<pre><code>
PARAMETERS: P_BUKRS LIKE <strong>T001K</strong>-BUKRS OBLIGATORY VALUE CHECK.
</code></pre>
<p>E assim já funciona.</p>
<p>Em resumo: conhecendo já tu a tabela com os valores possíveis, em vez de a poderes usar, tens de ir procurar outra que a defina como chave externa. É complicar o simples com rodeios. Um retórico chamar-lhe-ia circunlóquio. Eu chamo-lhe estupidez. Aposto que é um bug que a SAP decidiu orgulhosamente ignorar para sempre.</p>
<p>Obrigado Luís Rocha pela dica.</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/h1ktn0-GtoM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/10/value-check/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/10/value-check/</feedburner:origLink></item>
		<item>
		<title>Variantes automáticas em reports</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/eMLhc6ku4U0/</link>
		<comments>http://abapinho.com/2011/10/variantes-automaticas/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 09:00:57 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1071</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/push.png" class="attachment-thumbnail wp-post-image" alt="push" title="push" />Quando se está a desenvolver um relatório com um ecrã de selecção, é muito chato de cada vez que o testamos ter de preencher o ecrã de selecção com os dados de teste. Normalmente acabamos por criar uma variante de teste para nos poupar a esse chatice. Mas mesmo assim, de cada vez que corremos [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/push.png" class="attachment-thumbnail wp-post-image" alt="push" title="push" /><p>Quando se está a desenvolver um relatório com um ecrã de selecção, é muito chato de cada vez que o testamos ter de preencher o ecrã de selecção com os dados de teste. Normalmente acabamos por criar uma variante de teste para nos poupar a esse chatice. Mas mesmo assim, de cada vez que corremos o relatório, temos de invocar manualmente esta variante.</p>
<p>Aqui está uma forma simples de invocar automaticamente uma variante. Este código pode ser inserido no evento INITIALIZATION durante o desenvolvimento do programa:</p>
<pre><code>
INITIALIZATION.

  CALL FUNCTION 'RS_SUPPORT_SELECTIONS'
    EXPORTING
      report                     = sy-repid
      variant                    = 'TESTE'
 EXCEPTIONS
   VARIANT_NOT_EXISTENT       = 1
   VARIANT_OBSOLETE           = 2
   OTHERS                     = 3.
</code></pre>
<p>Obrigado Sérgio Fraga pela dica.</p>
<p>(E obrigado a <a href="http://www.flickr.com/photos/telstar/3339736213/" target="_blank">Telstar Logistics</a> pela foto)</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/eMLhc6ku4U0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/10/variantes-automaticas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/10/variantes-automaticas/</feedburner:origLink></item>
		<item>
		<title>De pé ó vítimas da fome</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/Y4Qa47QN7DE/</link>
		<comments>http://abapinho.com/2011/10/importar-classes-locais/#comments</comments>
		<pubDate>Tue, 11 Oct 2011 09:55:54 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[estilo]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1038</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/lili.png" class="attachment-thumbnail wp-post-image" alt="lili" title="lili" />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. [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/lili.png" class="attachment-thumbnail wp-post-image" alt="lili" title="lili" /><p>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.</p>
<p>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. Se soubermos que a nossa classe vai ser usada amiúde, faz sentido criá-la global. Se, pelo contrário, a classe for particular a um programa, não há porque fazer dela um objecto autónomo, bastando assim criá-la local ao programa que a vai usar.</p>
<p>Não é impossível que uma classe local se venha mais tarde a revelar útil noutro sítio. A hipótese mais estúpida, ainda que não inédita, é copiar o código de um programa para outro. Outra hipótese é colocá-la num &#8220;include&#8221; partilhado pelos vários programas que a usem. Mas mesmo isto também foleiro. Se é usada em mais que um sítio, ficará sempre mellhor como objecto global da SE24.</p>
<p>Os senhores da SAP, pensando já na possibilidade de uma classe local se emancipar, criaram uma ferramenta para isto. Funciona assim:</p>
<ol>
<li>Vai à SE24</li>
<li>No menu &#8220;Tipo de objecto&#8221; escolhe a opção &#8220;Importar&#8221; e depois &#8220;classe local de programa&#8221;</li>
<li>Escolhe o programa</li>
<li>Aparece uma lista das classes locais desse programa</li>
<li>scolhe as classes locais que queres tornar globais</li>
<li>Dá-lhes um nome</li>
<li>E pimbas</li>
</ol>
<p>Se esta ferramenta não te parecer útil, vai comprar o livro ABAP para totós.</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/Y4Qa47QN7DE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/10/importar-classes-locais/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/10/importar-classes-locais/</feedburner:origLink></item>
		<item>
		<title>Esquece!</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/yi1Y4RnSj5Y/</link>
		<comments>http://abapinho.com/2011/10/esquece/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 09:00:49 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[SAPgui]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1106</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/cerebro.png" class="attachment-thumbnail wp-post-image" alt="Cérebro" title="Cérebro" />O SAP GUI tem boa memória. Vai decorando os valores que lhe vamos metendo nos campos e depois sugere-os quando, mais tarde, voltamos a esses campos. Mas às vezes decora coisas que mais valia esquecer. Como por exemplo quando introduzimos um valor errado e a seguir ele insiste em sugerir-nos esse valor errado. Há uns [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/10/cerebro.png" class="attachment-thumbnail wp-post-image" alt="Cérebro" title="Cérebro" /><p>O SAP GUI tem boa memória. Vai decorando os valores que lhe vamos metendo nos campos e depois sugere-os quando, mais tarde, voltamos a esses campos. Mas às vezes decora coisas que mais valia esquecer. Como por exemplo quando introduzimos um valor errado e a seguir ele insiste em sugerir-nos esse valor errado.</p>
<p>Há uns tempos descobri que este pequeno drama tem solução. Quando, no campo, aparece a <em>combo box</em> com as várias hipóteses, usa as setas do teclado para te posicionares no valor que queres esquecer e depois carrega na tecla DELETE. E assim se faz o SAP GUI esquecer um valor.</p>
<p><em>(Obrigado a <a href="http://www.flickr.com/photos/cloois/86999278/">cloois</a> pela foto)</em></p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/yi1Y4RnSj5Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/10/esquece/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/10/esquece/</feedburner:origLink></item>
		<item>
		<title>SPLIT INTO TABLE</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/LIjGVIUGFRM/</link>
		<comments>http://abapinho.com/2011/10/split-into-table/#comments</comments>
		<pubDate>Mon, 03 Oct 2011 09:00:13 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[estilo]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1014</guid>
		<description><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/09/corta_fiambre.png" class="attachment-thumbnail wp-post-image" alt="corta_fiambre" title="corta_fiambre" />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 [...]]]></description>
			<content:encoded><![CDATA[<img width="150" height="150" src="http://abapinho.com/wp-content/uploads/2011/09/corta_fiambre.png" class="attachment-thumbnail wp-post-image" alt="corta_fiambre" title="corta_fiambre" /><p>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:</p>
<p>AB<br />
AF<br />
CH<br />
DG<br />
DZ<br />
EX<br />
F3<br />
F4.</p>
<p>A forma mais convencional seria assim:</p>
<pre><code>
DATA: t_blart TYPE STANDARD TABLE OF blart,
      wa_blart LIKE LINE OF t_blart.

wa_blart = 'AB'.
APPEND wa_blart TO t_blart.
wa_blart = 'AF'.
APPEND wa_blart TO t_blart.
wa_blart = 'CH'.
APPEND wa_blart TO t_blart.
wa_blart = 'DG'.
APPEND wa_blart TO t_blart.
wa_blart = 'DZ'.
APPEND wa_blart TO t_blart.
wa_blart = 'EX'.
APPEND wa_blart TO t_blart.
wa_blart = 'F3'.
APPEND wa_blart TO t_blart.
wa_blart = 'F4'.
APPEND wa_blart TO t_blart.
</code></pre>
<p>Mas há uma forma muito mais sintética e curiosa:</p>
<pre><code>
DATA: lv_blart_list TYPE string,
      t_blart TYPE STANDARD TABLE OF blart,
      wa_blart LIKE LINE OF t_blart.

lv_blart_list = 'AB AF CH DG DZ EX F3 F4'.
SPLIT lv_blart_list AT space INTO TABLE t_blart.
</code></pre>
<p>O preenchimento da tabela é feito em apenas 2 linhas, bem menos que as 16 da forma convencional.</p>
<p>Fica aqui mais um exemplo copiado do standard que é interessante por ter dois níveis:</p>
<pre><code>
l_action_list = 'A01 A02 A03 A04'.
SPLIT l_action_list AT ' ' INTO TABLE lt_action.
LOOP AT lt_action INTO l_action.
  CASE l_action.
    WHEN 'A01'. l_refdoc_list = 'R01 R02 R03 R04 R05 R06 R14'.
    WHEN 'A02'. l_refdoc_list = 'R07 R08 R10 R12'.
    WHEN 'A03'. l_refdoc_list = 'R07 R08 R10 R11 R12 R13'.
    WHEN 'A04'. l_refdoc_list = 'R09'.
  ENDCASE.
  SPLIT l_refdoc_list AT ' ' INTO TABLE lt_refdoc.
  LOOP AT lt_refdoc INTO l_refdoc.
    ls_cust-action = l_action.
    ls_cust-refdoc = l_refdoc.
    APPEND ls_cust TO t_cust.
  ENDLOOP.
ENDLOOP.
</code></pre>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/LIjGVIUGFRM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/10/split-into-table/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/10/split-into-table/</feedburner:origLink></item>
		<item>
		<title>Selecção vertical de texto no editor ABAP não dá? Dá!</title>
		<link>http://feedproxy.google.com/~r/blogabapinho/~3/6krH_M3SdkI/</link>
		<comments>http://abapinho.com/2011/09/seleccao-vertical-de-texto/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 09:00:06 +0000</pubDate>
		<dc:creator>Nuno Godinho</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[SAPgui]]></category>

		<guid isPermaLink="false">http://abapinho.com/?p=1027</guid>
		<description><![CDATA[<img width="149" height="150" src="http://abapinho.com/wp-content/uploads/2011/09/ctrl-y.png" class="attachment-thumbnail wp-post-image" alt="ctrl-y" title="ctrl-y" />Como todos sabem, pode fazer-se selecções de blocos de texto verticais e horizontais em quase todo o lado do SAPGUI carregando em CTRL-Y e depois arrastando o rato para fazer a selecção. Como todos também sabem, isto não funciona no editor de ABAP. Mas o que provavelmente nem todos sabem é que há uma forma [...]]]></description>
			<content:encoded><![CDATA[<img width="149" height="150" src="http://abapinho.com/wp-content/uploads/2011/09/ctrl-y.png" class="attachment-thumbnail wp-post-image" alt="ctrl-y" title="ctrl-y" /><p>Como todos sabem, pode fazer-se selecções de blocos de texto verticais e horizontais em quase todo o lado do SAPGUI carregando em CTRL-Y e depois arrastando o rato para fazer a selecção. Como todos também sabem, isto não funciona no editor de ABAP. Mas o que provavelmente nem todos sabem é que há uma forma de fazer este tipo de selecções no editor de ABAP: primir e manter o ALT. Assim já podes seleccionar blocos de texto. Bom, não?</p>
<p>Obrigado Sérgio Fraga pela dica.</p>
<p>O Abapinho saúda-vos.</p>
<img src="http://feeds.feedburner.com/~r/blogabapinho/~4/6krH_M3SdkI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://abapinho.com/2011/09/seleccao-vertical-de-texto/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://abapinho.com/2011/09/seleccao-vertical-de-texto/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 4.913 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-02-09 08:26:16 -->

