<?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/"
	>

<channel>
	<title>ABAP101 &#187; ABAP</title>
	<atom:link href="http://abap101.com/category/abap/feed/" rel="self" type="application/rss+xml" />
	<link>http://abap101.com</link>
	<description>ABAP &#124; Open Source &#124; Agile &#124; Programação</description>
	<lastBuildDate>Wed, 02 May 2012 22:30:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Tratamento de Exceção &#8211; Propagação e CLEANUP</title>
		<link>http://abap101.com/2012/05/02/tratamento-de-excecao-propagacao-cleanup/</link>
		<comments>http://abap101.com/2012/05/02/tratamento-de-excecao-propagacao-cleanup/#comments</comments>
		<pubDate>Wed, 02 May 2012 21:51:48 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[catch]]></category>
		<category><![CDATA[exceções]]></category>
		<category><![CDATA[exception class]]></category>
		<category><![CDATA[try]]></category>
		<category><![CDATA[try-catch]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2405</guid>
		<description><![CDATA[Quando eu explico tratamento de exceção na academia ABAP, o pessoal não dá muita bola, até porque os alunos ainda estão tentando se recuperar das aulas de polimorfismo e interface, mas entender o funcionamento dela é vital para desenvolver boas soluções usando orientação a objetos (não somente para aprender a escrever a palavra exceção). Nesse [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/05/02/tratamento-de-excecao-propagacao-cleanup/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/05/02/tratamento-de-excecao-propagacao-cleanup/" data-text="Tratamento de Exceção &#8211; Propagação e CLEANUP"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/05/02/tratamento-de-excecao-propagacao-cleanup/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F05%2F02%2Ftratamento-de-excecao-propagacao-cleanup%2F&amp;linkname=Tratamento%20de%20Exce%C3%A7%C3%A3o%20%E2%80%93%20Propaga%C3%A7%C3%A3o%20e%20CLEANUP" title="Google Gmail" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/gmail.png" width="16" height="16" alt="Google Gmail"/></a><a class="a2a_button_wordpress" href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F05%2F02%2Ftratamento-de-excecao-propagacao-cleanup%2F&amp;linkname=Tratamento%20de%20Exce%C3%A7%C3%A3o%20%E2%80%93%20Propaga%C3%A7%C3%A3o%20e%20CLEANUP" title="WordPress" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F05%2F02%2Ftratamento-de-excecao-propagacao-cleanup%2F&amp;linkname=Tratamento%20de%20Exce%C3%A7%C3%A3o%20%E2%80%93%20Propaga%C3%A7%C3%A3o%20e%20CLEANUP" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fabap101.com%2F2012%2F05%2F02%2Ftratamento-de-excecao-propagacao-cleanup%2F&amp;title=Tratamento%20de%20Exce%C3%A7%C3%A3o%20%E2%80%93%20Propaga%C3%A7%C3%A3o%20e%20CLEANUP" id="wpa2a_2"><img src="http://abap101.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p><p>Quando eu explico tratamento de exceção na academia ABAP, o pessoal não dá muita bola, até porque os alunos ainda estão tentando se recuperar das aulas de polimorfismo e interface, mas entender o funcionamento dela é vital para desenvolver boas soluções usando orientação a objetos (não somente para aprender a escrever a palavra exceção).</p>
<p>Nesse post, vou explicar dois conceitos ligado ao tratamento de exceções baseado em classes, propagação e comando CLEANUP.</p>
<h3><span id="more-2405"></span>Começando Pelo Básico</h3>
<p>Vamos entender primeiro o funcionamento básico do tratamento de exceções baseado em classes. Quando usamos as classes de exceção, devemos usar a estrutura de comandos TRY-CATCH-CLEANUP.</p>
<p>Usarei a classe LCL_EXCEPTION_DEMO que está no include ZABAP101_EXCEPTION_CLASSES nos programas de exemplo.</p>
<p><script type="text/javascript" src="https://gist.github.com/2580773.js?file=ZABAP101_EXCEPTION_CLASSES"></script>O primeiro programa que mostrarei é um programa cuja saída é &#8230; um DUMP!? Sim, quando o sistema chega a alguma situação onde ele não consegue seguir com o programa, como por exemplo uma divisão por zero.<script type="text/javascript" src="https://gist.github.com/2291819.js?file=ZABAP101_EXCEPTION_DUMP"></script></p>
<p>Quando o programa tenta fazer uma divisão por zero a seguinte tela é mostrada. Toda a pilha de execução é eliminada e toda a memória usada pelo programa é apagada.</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/04/wd555.jpg"><img class="aligncenter size-full wp-image-2411" title="wd555" src="http://abap101.com/wp-content/uploads/2012/04/wd555.jpg" alt="" width="708" height="601" /></a></p>
<p>Mas graças ao tratamento de exceção por classes, você pode dizer para o sistema &#8220;tente executar essa operação, e se caso aconteça divisão por zero, execute isso&#8221;.</p>
<p>Nesse primeiro programa onde o DUMP é evitado, o método SIMPLE_CATCH( ) é chamado. Na implementação do método, ele tenta (TRY) executar uma divisão por zero, que é tratada (CATCH) dentro do próprio método.</p>
<p><script type="text/javascript" src="https://gist.github.com/2291831.js?file=ZABAP101_EXCEPTION_BASIC"></script>Repare que a a exceção é tratada dentro do próprio método, portanto a mensagem &#8220;Executou o CATCH do método SIMPLE_CATCH.&#8221; é impressa no lugar do DUMP. A saída do programa acima é mostrada abaixo: <a href="http://abap101.com/wp-content/uploads/2012/04/wd489.jpg"><img class="aligncenter size-full wp-image-2406" title="wd489" src="http://abap101.com/wp-content/uploads/2012/04/wd489.jpg" alt="" width="441" height="172" /></a> </p>
<h3>Propagação de Exceção</h3>
<p>Conheço muitas equipes onde esse conceito é muito bem difundido, ou seja, uma pessoa decide não ser responsável pelo erro que cometeu e decide passar o erro para outra pessoa corrigir. Pois é, no ABAP temos algo parecido. Veja esse programa:<script type="text/javascript" src="https://gist.github.com/2350991.js?file=ZABAP101_EXCEPTION_PROP"></script></p>
<p>Quando o método PROPAGATING( ) é chamado, uma divisão por zero é executada. Observe que esta divisão não está sendo tratada com o TRY-CATCH e veja a saída do programa:</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/04/wd490.jpg"><img class="aligncenter size-full wp-image-2407" title="wd490" src="http://abap101.com/wp-content/uploads/2012/04/wd490.jpg" alt="" width="406" height="142" /></a></p>
<p>O segredo está na declaração do método: &#8220;METHODS propagating RAISING cx_sy_zerodivide.&#8221; Existe uma instrução RAISING que diz exatamente o que algumas pessoas que conheço fazem, &#8220;olha, pode ser que uma divisão por zero aconteça e se isso acontecer você [quem está chamando o método] deverá tratar essa exceção&#8221;.</p>
<p>Sendo assim, a exceção precisou ser tratada na chamada do método e não mais dentro do método.</p>
<p>Qual forma usar, a do primeiro programa ou essa? Depende. Se você quer passar a responsabilidade do tratamento para quem chama o método então o segundo programa deve ser usado. Mas se o erro é algo interno do método e precisa ser tratado de maneira transparente do usuário, então você deverá tratar a exceção dentro do próprio método, assim como fora feito no primeiro programa.</p>
<p>O que acontece se não tratarmos a exceção na chamada do método? Experimente&#8230;</p>
<h3>CLEANUP não é WHEN OTHERS do Tratamento de Exceções</h3>
<p>Essa é a primeira conclusão que os meus alunos chegam quando olham para definição do comando no Help do ABAP.</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/04/wd491.jpg"><img class="aligncenter size-full wp-image-2408" title="wd491" src="http://abap101.com/wp-content/uploads/2012/04/wd491.jpg" alt="" width="504" height="251" /></a></p>
<p>Não, o CLEANUP não é uma espécie de WHEN OTHERS do TRY-CATCH. Para ilustrar o uso do CLEANUP, veja o programa abaixo:</p>
<p><script type="text/javascript" src="https://gist.github.com/2351235.js?file=ZABAP101_EXCEPTION_CLEAN"></script>O objetivo do CLEANUP é para a limpeza de variáveis (memória) quando acontece uma exceção que será propagada. Seria o equivalente ao &#8220;quero limpar a bagunça antes de passar a exceção para ser tratada por quem chamou o método&#8221;. <a href="http://abap101.com/wp-content/uploads/2012/04/wd492.jpg"><img class="aligncenter size-full wp-image-2409" title="wd492" src="http://abap101.com/wp-content/uploads/2012/04/wd492.jpg" alt="" width="408" height="158" /></a> Pela saída do programa, você consegue entender a sequência de execução do programa. Ocorre a exceção, o CLEANUP é executado e então o CATCH no programa principal. </p>
<h3>CLEANUP Morto</h3>
<p>O CLEANUP somente é usado para &#8220;limpar a bagunça&#8221; quando a exceção está sendo propagada. No programa abaixo, o CLEANUP nunca será chamado.<script type="text/javascript" src="https://gist.github.com/2351278.js?file=ZABAP101_EXCEPTION_FAKE_CLEAN"></script></p>
<p>Na saída do programa vemos claramente que o sistema não executou o CLEANUP, pois a divisão por zero é tratada dentro do próprio método.</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/04/wd494.jpg"><img class="aligncenter size-full wp-image-2410" title="wd494" src="http://abap101.com/wp-content/uploads/2012/04/wd494.jpg" alt="" width="459" height="146" /></a></p>
<h3>Conclusão</h3>
<p>Os conceitos de tratamento de exceção por classes não fica somente nisso, mas nesse post quis apenas expor os conceitos de propagação e CLEANUP. Para o uso correto de classes de exceções, é necessário entender encadeamento de exceções, hierarquia de exceções e textos da exceção. Isso será explorado em futuros posts.</p>
<p>Aprenda a usar corretamente as classes de exceções e você entregará programas muito elegantes e de fácil manutenção.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/05/02/tratamento-de-excecao-propagacao-cleanup/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Falsa Programação Orientada a Objetos</title>
		<link>http://abap101.com/2012/04/01/falsa-programacao-orientada-objetos/</link>
		<comments>http://abap101.com/2012/04/01/falsa-programacao-orientada-objetos/#comments</comments>
		<pubDate>Mon, 02 Apr 2012 01:38:57 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ABAP Objects]]></category>
		<category><![CDATA[Tecnica de Programação]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[orientação a objetos]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2369</guid>
		<description><![CDATA[O que é um programa ABAP orientado a objetos? Se um programa usa somente CALL METHOD e nenhum PERFORM, então trata-se de um programa orientado a objetos? Acredito que não. O uso de sintaxe de orientação a objetos não é evidência suficiente de que o programa foi pensado na forma de objetos trocando mensagens entre [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/04/01/falsa-programacao-orientada-objetos/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/04/01/falsa-programacao-orientada-objetos/" data-text="Falsa Programação Orientada a Objetos"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/04/01/falsa-programacao-orientada-objetos/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F04%2F01%2Ffalsa-programacao-orientada-objetos%2F&amp;linkname=Falsa%20Programa%C3%A7%C3%A3o%20Orientada%20a%20Objetos" title="Google Gmail" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/gmail.png" width="16" height="16" alt="Google Gmail"/></a><a class="a2a_button_wordpress" href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F04%2F01%2Ffalsa-programacao-orientada-objetos%2F&amp;linkname=Falsa%20Programa%C3%A7%C3%A3o%20Orientada%20a%20Objetos" title="WordPress" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F04%2F01%2Ffalsa-programacao-orientada-objetos%2F&amp;linkname=Falsa%20Programa%C3%A7%C3%A3o%20Orientada%20a%20Objetos" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fabap101.com%2F2012%2F04%2F01%2Ffalsa-programacao-orientada-objetos%2F&amp;title=Falsa%20Programa%C3%A7%C3%A3o%20Orientada%20a%20Objetos" id="wpa2a_4"><img src="http://abap101.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p><p>O que é um programa ABAP orientado a objetos? Se um programa usa somente CALL METHOD e nenhum PERFORM, então trata-se de um programa orientado a objetos? Acredito que não.</p>
<p>O uso de sintaxe de orientação a objetos não é evidência suficiente de que o programa foi pensado na forma de objetos trocando mensagens entre si.</p>
<p>Trago para vocês dois pogramas com saídas idênticas, mas um usando uma &#8220;orientação a objetos&#8221; capenga e outro que considero uma melhor forma de resolver o problema pensando em objetos.</p>
<h3><strong><span id="more-2369"></span>O Requisito</strong></h3>
<p>Relatório de impressão de pedidos, com um total e a porcentagem de cada item em relação ao total do pedido. Os itens do pedido foram criados no próprio programa por uma questão prática e didática. No mundo real esses dados estariam armazenados numa tabela no banco de dados.</p>
<h3><strong>Orientação a Objetos &#8220;para inglês ver&#8221;</strong></h3>
<p>A listagem abaixo é a solução usando orientação a objetos incompleta, ou seja, o programa tem uma classe para os objetos que representam itens do pedido. Cada objeto é um item do pedido, mas ainda tem alguns problemas.</p>
<p><a href="https://gist.github.com/2188612">ZFAKE_OO</a></p>
<p><a href="https://gist.github.com/2188612"></a><br />
<script src="https://gist.github.com/2188612.js?file=gistfile1.txt"></script> Qual o problema com esse programa? Minha crítica a esse programa é a presença de regras de negócio no programa principal. É no programa principal que o cálculo do total do pedido é feito bem como o cálculo do percentual de cada item em relação ao pedido total.  Se seguirmos o padrão <a href="http://pt.wikipedia.org/wiki/MVC">MVC</a>, esses cálculos deveriam estar encapsulados em alguma classe, fazendo o papel do Modelo. É exatamente isso que o próxima solução leva em conta na hora de refatorar o código.  <a href="http://abap101.com/wp-content/uploads/2011/08/mvc.png"><img class="aligncenter size-full wp-image-1399" title="MVC" src="http://abap101.com/wp-content/uploads/2011/08/mvc.png" alt="MVC - Fonte: http://www.fernandovalente.com.br/wordpress/2011/01/11/mvc-model-view-controller/" width="500" height="400" /></a></p>
<h3><strong>Refatorando Para Melhorar o Código</strong></h3>
<p><a href="http://pt.wikipedia.org/wiki/Refatora%C3%A7%C3%A3o">Refatoração</a> é um conceito no desenvolvimento de software onde melhoramos o projeto de software sem alterar os requistos do mesmo. Ou seja, vou alterar o programa para que a solução fique mais robusta, elegante, melhorando a legibilidade e possibilitando o reuso.  Nessa primeira rodada de refatoração, eu procurei encapsular todos os cálculos em classes, para que possam ser reutilizadas em futuros desenvolvimentos. Repare que eu criei uma nova classe onde os cálculos são executados e o próprio relatório é impresso.</p>
<p><a href="https://gist.github.com/2188865">ZBETTER_OO</a> <script src="https://gist.github.com/2188865.js?file=gistfile1.txt"></script></p>
<p>&nbsp;</p>
<h3><strong>Próximos Passos</strong></h3>
<p>Esse é a melhor implementação? Com certeza não. Escolhi não aplicar o MVC de maneira forte para dar chances para vocês pensarem em outras melhorias possíveis nesse programa.</p>
<p>O que vocês fariam? Deixem nos comentários quais melhorias vocês fariam nos dois programas.</p>
<p>Boa diversão!</p>
<h3><strong>Saídas dos Dois Programas Acima</strong></h3>
<p><a href="http://abap101.com/wp-content/uploads/2012/03/ZFAKE_OO.jpeg"><img class="aligncenter size-full wp-image-2375" title="ZFAKE_OO" src="http://abap101.com/wp-content/uploads/2012/03/ZFAKE_OO.jpeg" alt="" width="643" height="214" /></a></p>
<p><a href="http://abap101.com/wp-content/uploads/2012/03/ZBETTER_OO.jpg"><img class="aligncenter size-full wp-image-2374" title="ZBETTER_OO" src="http://abap101.com/wp-content/uploads/2012/03/ZBETTER_OO.jpg" alt="" width="635" height="215" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/04/01/falsa-programacao-orientada-objetos/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Design Patern &#8211; Singleton</title>
		<link>http://abap101.com/2012/03/26/design-patern-singleton/</link>
		<comments>http://abap101.com/2012/03/26/design-patern-singleton/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 20:05:20 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ABAP Objects]]></category>
		<category><![CDATA[Tecnica de Programação]]></category>
		<category><![CDATA[orientação a objetos]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2360</guid>
		<description><![CDATA[Então você já aprendeu como declarar uma classe, chamar um método e aplicar os conceitos de herança e polimorfismo (já né?). Parabéns você completou a primeira parte do aprendizado em programação orientada a objetos. Agora só falta mais uns 95% para poder ser considerado um Mestre Jedi em Orientação a Objetos. Vamos ganhar mais um [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/03/26/design-patern-singleton/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/03/26/design-patern-singleton/" data-text="Design Patern &#8211; Singleton"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/03/26/design-patern-singleton/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F03%2F26%2Fdesign-patern-singleton%2F&amp;linkname=Design%20Patern%20%E2%80%93%20Singleton" title="Google Gmail" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/gmail.png" width="16" height="16" alt="Google Gmail"/></a><a class="a2a_button_wordpress" href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F03%2F26%2Fdesign-patern-singleton%2F&amp;linkname=Design%20Patern%20%E2%80%93%20Singleton" title="WordPress" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F03%2F26%2Fdesign-patern-singleton%2F&amp;linkname=Design%20Patern%20%E2%80%93%20Singleton" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fabap101.com%2F2012%2F03%2F26%2Fdesign-patern-singleton%2F&amp;title=Design%20Patern%20%E2%80%93%20Singleton" id="wpa2a_6"><img src="http://abap101.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p><p>Então você já aprendeu como declarar uma classe, chamar um método e aplicar os conceitos de herança e polimorfismo (já né?). Parabéns você completou a primeira parte do aprendizado em programação orientada a objetos. Agora só falta mais uns 95% para poder ser considerado um Mestre Jedi em Orientação a Objetos.</p>
<p>Vamos ganhar mais um ponto porcentual e falarmos de Singleton.</p>
<p><span id="more-2360"></span>Singleton é um <a href="http://pt.wikipedia.org/wiki/Padr%C3%A3o_de_projeto_de_software">Padrão de Projeto</a> (ou do inglês Design Patern). Os padrões de projetos tem como objetivo o reuso do projeto (não de código). É o reuso de uma solução para um problema simples e comum dentro da programação orientada a objetos.</p>
<p>O problema do Singleton resolve é muito simples: criar uma classe que permita uma e somente uma instância da classe em questão.</p>
<p>Vamos discutir abaixo a solução clássica em ABAP.</p>
<p>Gist: <a href="https://gist.github.com/2174007">https://gist.github.com/2174007</a></p>
<p><script src="https://gist.github.com/2174007.js?file=gistfile1.txt"></script></p>
<p>&nbsp;</p>
<h3><strong>Descrevendo a Classe</strong></h3>
<p>A classe em que será aplicada o Singleton é a LCL_HELLO_SINGLETON. Vamos começar com a declaração dela pois ela já nos trás algumas novidades:</p>
<blockquote><p>CLASS lcl_hello_singleton DEFINITION FINAL CREATE PRIVATE.</p></blockquote>
<p>A classe precisa necessariamente ser final, ou seja, ela não aceitará que nenhuma outra classe herde dela. Não é possível criar uma subclass da LCL_HELLO_SINGLETON, pois isso seria uma brecha onde o usuário criaria uma subclasse e que não respeitaria a regra de não permitir mais de uma instância dela.</p>
<p>A classe LCL_HELLO_SINGLETON também deve ter a sua regra de instanciação como privada. Isso significa que um objeto dessa classe somente pode ser criado dentro dela mesma. Isso garante o controle da criação dos objetos seja somente dela mesma. Nossa pequena classe é dona de seu próprio destino.</p>
<p>A segunda característica dessa classe é a presença de um construtor estático (método CLASS_CONSTRUCTOR). Um construtor estático é chamado apenas uma única vez durante toda a vida da classe. Ele difere do construtor da instância (método CONSTRUCTOR &#8211; não usado nesse exemplo) por ser chamado apenas uma única vez quando a classe é usada pela primeira vez (seja na criação de um objeto ou na chamada de um método estático &#8211; usado no exemplo). Um construtor de instância é chamado no momento da criação do objeto com o comando CREATE OBJECT.</p>
<p>O método estático GET_INSTANCE( ) é usado para retornar o valor que está no atributo estático R_INSTANCE, que é a referência do único objeto criado para essa classe.</p>
<p>O único objeto a existir para a classe LCL_HELLO_SINGLETON é criado no construtor estático e a sua referência é o R_INSTANCE.</p>
<p>Os métodos SET( ) e GET( ) são os chamados métodos de acessores, que servem para definir e retornar os atributos da classe, respectivamente.</p>
<h3><strong>Executando o Programa</strong></h3>
<p>Ao executar o programa, precisamos chamar o método estático GET_INSTANCE( ) para que a classe nos retorne a referência do objeto que ela mesma criou e está gerenciando. Mas nesse instante o objeto ainda não fora criado?! Erro na implementação do Padrão de Projeto!!! Calma&#8230;</p>
<p>A criação do objeto está no construtor estático que será chamado apenas uma única vez, quando a classe for usada. Sendo assim, quando chamarmos o método GET_INSTANCE( ) o construtor estático é chamado primeiro criando o objeto a ser retornado pelo parâmetro RE_INSTANCE( ). Genial? Não, programação orientada a objetos.</p>
<p>Agora todas as vezes que o programa precisar usar recuperar a referência do objeto filho único, ele deve chamar o método GET_INSTANCE( ).</p>
<h3><strong>Conclusão</strong></h3>
<p>Quando devemos usar um Singleton? A resposta é simples, economia de memória. Fato que um mesmo volume de dados representado em objetos pode consumir mais memória do que o seu equivalente em procedural, para uma boa ilustração disso, veja o <a href="http://abap101.com/2011/04/18/bomba-relogio-memoria-abap-procedural-x-oo/">post</a> onde o Fábio fez uma comparação de consumo de memória entre uma tabela interna e os mesmos dados dessa tabela interna usando um objeto para cada linha da tabela.</p>
<p>Em geral, um programa ABAP manipulará os dados de duas maneiras, um <a href="http://abap101.com/2011/09/08/classes-de-negocio-em-abap-orientado-a-objeto/">Objeto de Negócio</a> por vez, ou um conjunto de objetos por vez.</p>
<p>Em nossa vida de programador ABAP não é lá muito comum trabalharmos um objeto de negócio por vez, pois os programas standard já fazem isso. Geralmente trabalhamos um registro por vez quando estamos desenvolvendo algum module pool e os modules pools mais legais já foram feitos pela SAP.</p>
<p>A Claudia já comentou isso e é verdade, a maioria dos nossos programas são <a href="http://abap101.com/2012/03/01/abap-objects-alv/">relatórios</a>. E quando trabalharmos com relatórios invariavelmente seguimos a sequência, tela de seleção &#8211; seleção de dados &#8211; tratamento dos dados &#8211; apresentação dos dados. Então, quando estamos tratando os dados fazemos um LOOP AT na tabela interna e para cada registro a ser tratado usamos as regras de negócio encapsuladas nos métodos dessa classe. Portanto, não precisamos de todos os objetos criados ao mesmo tempo, apenas uma instância de nossa classe, sendo atualizada para cada registro a ser tratado.</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/03/26/design-patern-singleton/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ALV OO &#8211; Trabalhando com botões e eventos</title>
		<link>http://abap101.com/2012/03/01/abap-objects-alv/</link>
		<comments>http://abap101.com/2012/03/01/abap-objects-alv/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 11:00:19 +0000</pubDate>
		<dc:creator>Claudia Andressa</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[ABAP Objects]]></category>
		<category><![CDATA[ALV]]></category>
		<category><![CDATA[Tecnica de Programação]]></category>
		<category><![CDATA[abap objects]]></category>
		<category><![CDATA[ALV Exemplo]]></category>
		<category><![CDATA[ALV OO]]></category>
		<category><![CDATA[ALV passo a passo]]></category>
		<category><![CDATA[Botões]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Ícones]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2116</guid>
		<description><![CDATA[Sem dúvida, uma das atividades mais realizadas por um programador ABAP é a emissão de relatórios. Como não estamos na era dos dinossauros, &#8220;não conhecemos&#8221; o relatório &#8220;write&#8221; e vamos direto aos &#8220;ALV&#8217;s&#8221;. Este post tem como objetivo exemplificar algumas funcionalidades de um ALV OO (Orientado a Objetos),  são elas: Exclusão de botões do toolbar de um ALV [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/03/01/abap-objects-alv/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/03/01/abap-objects-alv/" data-text="ALV OO &#8211; Trabalhando com botões e eventos"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/03/01/abap-objects-alv/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F03%2F01%2Fabap-objects-alv%2F&amp;linkname=ALV%20OO%20%E2%80%93%20Trabalhando%20com%20bot%C3%B5es%20e%20eventos" title="Google Gmail" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/gmail.png" width="16" height="16" alt="Google Gmail"/></a><a class="a2a_button_wordpress" href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F03%2F01%2Fabap-objects-alv%2F&amp;linkname=ALV%20OO%20%E2%80%93%20Trabalhando%20com%20bot%C3%B5es%20e%20eventos" title="WordPress" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F03%2F01%2Fabap-objects-alv%2F&amp;linkname=ALV%20OO%20%E2%80%93%20Trabalhando%20com%20bot%C3%B5es%20e%20eventos" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fabap101.com%2F2012%2F03%2F01%2Fabap-objects-alv%2F&amp;title=ALV%20OO%20%E2%80%93%20Trabalhando%20com%20bot%C3%B5es%20e%20eventos" id="wpa2a_8"><img src="http://abap101.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p><p>Sem dúvida, uma das atividades mais realizadas por um programador ABAP é a emissão de relatórios.</p>
<p>Como não estamos na era dos dinossauros, &#8220;não conhecemos&#8221; o relatório &#8220;write&#8221; e vamos direto aos &#8220;ALV&#8217;s&#8221;.</p>
<p>Este post tem como objetivo exemplificar algumas funcionalidades de um ALV OO (Orientado a Objetos),  são elas:</p>
<ul>
<li>Exclusão de botões do toolbar de um ALV OO</li>
<li>Inclusão de botões no toolbar do ALV</li>
<li>Utilização de eventos</li>
<li>Como desabilitar um botão (ele aparece, mas não é possível clicar)</li>
<li>Geração de um ALV sem necessidade de criação de um container</li>
</ul>
<p>Veja também:</p>
<ul>
<li>Como encontrar ícones</li>
<li>Utilização de interfaces</li>
</ul>
<p><span id="more-2116"></span></p>
<ul>A modelagem utilizada, foi construída de forma a permitir a utilização dos pontos acima citados.</ul>
<h3>Especificação</h3>
<p>Na tela de seleção, o usuário poderá determinar uma ou mais cias aéreas.  Deve ser gerado um relatório ALV com os dados desta(s) cia(s), a serem extraídos da tabela SCARR.</p>
<p>Neste relatório, ao selecionar uma determinada cia, deve haver um botão que gere um segundo ALV, desta vez exibindo as informações dos vôos (conexões) referentes à seleção realizada (dados a serem extraídos da tabela SPFLI).</p>
<p>E então, vamos ao que interessa!?</p>
<p>No programa principal, devemos criar a tela de seleção e um include, onde codificaremos nossas classes.</p>
<p>Tela de seleção:</p>
<p>Declara-se o select-options para possibilitar a determinação do range das cias aéreas:</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">include</span><span style="color: #808080;">:</span> z_classes<span style="color: #808080;">.</span>
&nbsp;
<span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">tables</span><span style="color: #808080;">:</span> scarr<span style="color: #808080;">,</span>
        spfli<span style="color: #808080;">.</span>
&nbsp;
<span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">data</span><span style="color: #808080;">:</span> wa_scarr <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> scarr<span style="color: #808080;">.</span>
&nbsp;
<span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">data</span><span style="color: #808080;">:</span> r_companies <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">ref to</span> lcl_companies<span style="color: #808080;">.</span>
&nbsp;
<span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">selection-screen</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">begin <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">of</span> block</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">filter</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">with frame</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">title</span> text<span style="color: #808080;">-</span>001<span style="color: #808080;">.</span>
select<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">options</span> s_carrid <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">for</span> wa_scarr<span style="color: #808080;">-</span>carrid<span style="color: #808080;">.</span>
<span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">selection-screen</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">end <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">of</span> block</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">filter</span><span style="color: #808080;">.</span></pre></div></div>

<p>&nbsp;</p>
<div class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2012/02/023.jpg"><img title="Tela de Seleção" src="http://abap101.com/wp-content/uploads/2012/02/023-300x59.jpg" alt="" width="300" height="59" /></a><p class="wp-caption-text">Selection Screen</p></div>
<p>Vamos criar também, duas telas (as quais nomeei de &#8220;0100&#8243; e &#8220;0200&#8243;, que serão utilizadas na exibição dos ALV&#8217;s.</p>
<div class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2012/02/161.jpg"><img title="Telas" src="http://abap101.com/wp-content/uploads/2012/02/161-300x61.jpg" alt="" width="300" height="61" /></a><p class="wp-caption-text">Screens</p></div>
<p>No include criado, segue declaração da interface:</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">interface</span><span style="color: #808080;">:</span> zif_data_reader<span style="color: #808080;">.</span>
  <span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">types</span><span style="color: #808080;">:</span> ty_scarr <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">range of</span> scarr<span style="color: #808080;">-</span>carrid<span style="color: #808080;">.</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">methods</span><span style="color: #808080;">:</span> read_data
              <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">importing</span>
                im_scarr <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> ty_scarr<span style="color: #808080;">,</span>
&nbsp;
           generate_alv
              <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">importing</span>
                im_structure  <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> char30<span style="color: #808080;">.</span>
&nbsp;
<span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endinterface</span><span style="color: #808080;">.</span>             <span style="color: #808080; font-style: italic;">&quot;zif_data_reader</span></pre></div></div>

<p>&nbsp;</p>
<p>Observe que temos os métodos read_data e generate_alv, que foram declarados na interface, porque serão utilizados em ambos os relatórios.</p>
<p>Agora vamos à definição da classe lcl_companies, que será responsável pela leitura dos dados das cias aéreas.</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #339933;">*----------------------------------------------------------------------*</span>
<span style="color: #339933;">*       CLASS lcl_companies DEFINITION</span>
<span style="color: #339933;">*----------------------------------------------------------------------*</span>
<span style="color: #339933;">*</span>
<span style="color: #339933;">*----------------------------------------------------------------------*</span>
<span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">class</span> lcl_companies <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">definition</span><span style="color: #808080;">.</span>
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">public section</span><span style="color: #808080;">.</span>
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">interfaces</span> zif_data_reader<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">methods</span><span style="color: #808080;">:</span> constructor<span style="color: #808080;">,</span>
&nbsp;
             set_toolbar
                <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">for</span> event toolbar <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">of</span> cl_gui_alv_grid
                <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">importing</span> e_object<span style="color: #808080;">,</span>
&nbsp;
             get_ucomm
                <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">for</span> event user_command <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">of</span> cl_gui_alv_grid
                <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">importing</span> e_ucomm<span style="color: #808080;">,</span>
&nbsp;
             refresh_table
                <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">for</span> event after_user_command
                <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">of</span> cl_gui_alv_grid<span style="color: #808080;">.</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">private section</span><span style="color: #808080;">.</span>
    <span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">data</span><span style="color: #808080;">:</span> r_grid        <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">ref to</span> cl_gui_alv_grid<span style="color: #808080;">,</span>
          r_connections <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">ref to</span> lcl_connections<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">data</span><span style="color: #808080;">:</span> gt_scarr      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">table of</span> scarr<span style="color: #808080;">,</span>
          gt_exc_button <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> ui_functions<span style="color: #808080;">.</span>
&nbsp;
<span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endclass</span><span style="color: #808080;">.</span>                                <span style="color: #808080; font-style: italic;">&quot;lcl_companies DEFINITION</span></pre></div></div>

<p>Observe que a classe tem como atributos privados:</p>
<ul>
<li>Objeto r_grid (para criação do grid do alv)</li>
<li>Objeto r_connections para referência e criação dos objetos referentes aos vôos (conexões)</li>
<li>Tabela gt_scarr, contendo as informações da(s) cia(s) aérea;</li>
<li>Tabela de botões a serem excluídos</li>
</ul>
<p>Através da keyword &#8220;INTERFACES&#8221;, declaramos a utilização da interface zif_data_reader, com isso, na classe lcl_companies <em><span style="text-decoration: underline;">devemos</span></em> implementar todos os métodos contemplados na interface.</p>
<p>Seguem Implementações:</p>
<ul>
<li>Constructor: será responsável pela criação do grid do alv, registrar os eventos a serem utilizados e determinar os botões a serem excluídos.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">method</span><span style="color: #808080;">:</span> constructor<span style="color: #808080;">.</span>
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">create object</span> r_grid
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">exporting</span>
        i_parent          <span style="color: #800080;">=</span> cl_gui_container<span style="color: #800080;">=</span><span style="color: #808080;">&amp;</span>gt;screen0
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">exceptions</span>
        error_cntl_create <span style="color: #800080;">=</span> <span style="color: #3399ff;">1</span>
        error_cntl_init   <span style="color: #800080;">=</span> <span style="color: #3399ff;">2</span>
        error_cntl_link   <span style="color: #800080;">=</span> <span style="color: #3399ff;">3</span>
        error_dp_create   <span style="color: #800080;">=</span> <span style="color: #3399ff;">4</span>
        <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">others</span>            <span style="color: #800080;">=</span> <span style="color: #3399ff;">5</span><span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">if</span> sy<span style="color: #808080;">-</span>subrc <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">ne</span> <span style="color: #3399ff;">0</span><span style="color: #808080;">.</span>
      <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">message</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">id</span> sy<span style="color: #808080;">-</span>msgid <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> sy<span style="color: #808080;">-</span>msgty <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">number</span> sy<span style="color: #808080;">-</span>msgno
                 <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">with</span> sy<span style="color: #808080;">-</span>msgv1 sy<span style="color: #808080;">-</span>msgv2 sy<span style="color: #808080;">-</span>msgv3 sy<span style="color: #808080;">-</span>msgv4<span style="color: #808080;">.</span>
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">endif</span><span style="color: #808080;">.</span>
&nbsp;
<span style="color: #339933;">*--------------------------------------------------------------------*</span>
<span style="color: #339933;">* Registra os eventos a serem utilizados</span>
<span style="color: #339933;">*--------------------------------------------------------------------*</span>
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">set handler</span> get_ucomm     <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">for</span> r_grid<span style="color: #808080;">.</span>
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">set handler</span> set_toolbar   <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">for</span> r_grid<span style="color: #808080;">.</span>
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">set handler</span> refresh_table <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">for</span> r_grid<span style="color: #808080;">.</span>
<span style="color: #339933;">*--------------------------------------------------------------------*</span>
<span style="color: #339933;">* Informa os botões a serem excluídos</span>
<span style="color: #339933;">*--------------------------------------------------------------------*</span>
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">append</span> cl_gui_alv_grid<span style="color: #800080;">=</span><span style="color: #808080;">&amp;</span>gt;mc_fc_graph <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">to</span> gt_exc_button<span style="color: #808080;">.</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endmethod</span><span style="color: #808080;">.</span>                              <span style="color: #808080; font-style: italic;">&quot;constructor</span></pre></div></div>

<p>Nota: quando informamos &#8220;cl_gui_container=&gt;screen0&#8243; no parâmetro &#8220;i_parent&#8221; não temos a necessidade de declarar um container (recomenda-se gerar o ALV sem container apenas em casos de real necessidade, pois esteticamente o programa será prejudicado, visto que o ALV ocupará a tela inteira).</p>
<p>Para entender melhor, vá até a transação SE24, na classe CL_GUI_ALV_GRID.</p>
<p>Na aba &#8220;métodos&#8221; você encontrará o &#8220;constructor&#8221;, clique em &#8220;Parâmetros&#8221; e verá que o parâmetro &#8220;i_parent&#8221; é do tipo &#8220;CL_GUI_CONTAINER&#8221;.</p>
<div class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2012/02/22.jpg"><img title="Parâmetro i_parent" src="http://abap101.com/wp-content/uploads/2012/02/22-300x103.jpg" alt="" width="300" height="103" /></a><p class="wp-caption-text">Parameter - &quot;I_PARENT&quot;</p></div>
<p>Clicando em CL_GUI_CONTAINER, na aba atributos, você encontrará &#8220;Screen0&#8243;.</p>
<div class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2012/02/23.jpg"><img title="Atributo Screen 0" src="http://abap101.com/wp-content/uploads/2012/02/23-300x123.jpg" alt="" width="300" height="123" /></a><p class="wp-caption-text">Attribute - Screen0</p></div>
<p>Ou seja, o atributo &#8220;Screen0&#8243; utiliza a tela como nosso container.</p>
<h3>Entendendo a exclusão de botões</h3>
<p>Novamente na transação SE24, consulte o método &#8220;SET_TABLE_FOR_FIRST_DISPLAY&#8221;.</p>
<p>Ao clicar em &#8220;parâmetros&#8221; você encontrará o &#8220;IT_TOOLBAR_EXCLUDING&#8221;, de tipo &#8220;UI_FUNCTIONS&#8221;.</p>
<div id="attachment_2185" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2012/02/toolbar_excluding.jpg"><img class="size-medium wp-image-2185" title="toolbar_excluding" src="http://abap101.com/wp-content/uploads/2012/02/toolbar_excluding-300x203.jpg" alt="" width="300" height="203" /></a><p class="wp-caption-text">Parameter - toolbar_excluding</p></div>
<p>Vamos agora para a aba de atributos da classe, onde encontraremos os botões.</p>
<div id="attachment_2188" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2012/02/Botões1.jpg"><img class="size-medium wp-image-2188" title="Botões" src="http://abap101.com/wp-content/uploads/2012/02/Botões1-300x213.jpg" alt="" width="300" height="213" /></a><p class="wp-caption-text">CL_GUI_ALV_GRID - Botões</p></div>
<p>Desta forma, basta inserirmos os botões a serem excluídos na tabela declarada, e informá-la no momento em que chamarmos o método &#8220;SET_TABLE_FOR_FIRST_DISPLAY&#8221; (neste exercício, excluí apenas o botão utilizado para geração de gráficos).</p>
<p>O próximo passo é selecionarmos os dados da tabela SCARR conforme dados da tela de seleção.</p>
<ul>
<li>zif_data_reader~read_data</li>
</ul>
<p>Observe que quando implementamos um método de uma interface, este é denominado: nome_da_interface<span style="color: #0000ff;"><strong>~</strong></span>nome_ do_ método.</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">method</span><span style="color: #808080;">:</span> zif_data_reader~read_data<span style="color: #808080;">.</span>
&nbsp;
      <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">clear</span> gt_scarr<span style="color: #808080;">.</span>
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">refresh</span> gt_scarr<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">select</span> <span style="color: #808080;">*</span>
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">from</span> scarr
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">into</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">table</span> gt_scarr
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">where</span> carrid <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">in</span> im_scarr<span style="color: #808080;">&#91;</span><span style="color: #808080;">&#93;</span><span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">if</span> sy<span style="color: #808080;">-</span>subrc <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">ne</span> <span style="color: #3399ff;">0</span><span style="color: #808080;">.</span>
      <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">message</span><span style="color: #808080;">:</span> text<span style="color: #808080;">-</span>002 <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #4da619;">'E'</span><span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">else</span><span style="color: #808080;">.</span>
      <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">call method</span> me<span style="color: #808080;">-&amp;</span>gt;zif_data_reader~generate_alv
        <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">exporting</span>
          im_structure <span style="color: #800080;">=</span> <span style="color: #4da619;">'SCARR'</span><span style="color: #808080;">.</span>
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">endif</span><span style="color: #808080;">.</span>
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endmethod</span><span style="color: #808080;">.</span>                               <span style="color: #808080; font-style: italic;">&quot;zif_data_reader~read_data</span></pre></div></div>

<p>Neste método, selecionamos os dados conforme critérios informados na tela de seleção.</p>
<p>Quando sy-subrc não é &#8220;0&#8243; (valores não encontrados), exibimos uma mensagem de erro, caso contrário, chamamos o  método &#8220;zif_data_reader~generate_alv&#8221;, vide implementação abaixo:</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">method</span><span style="color: #808080;">:</span> zif_data_reader~generate_alv<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">call method</span> r_grid<span style="color: #808080;">-&amp;</span>gt;set_table_for_first_display
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">exporting</span>
        i_structure_name              <span style="color: #800080;">=</span> im_structure
        it_toolbar_excluding          <span style="color: #800080;">=</span> gt_exc_button
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">changing</span>
        it_outtab                     <span style="color: #800080;">=</span> gt_scarr
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">exceptions</span>
        invalid_parameter_combination <span style="color: #800080;">=</span> <span style="color: #3399ff;">1</span>
        program_error                 <span style="color: #800080;">=</span> <span style="color: #3399ff;">2</span>
        too_many_lines                <span style="color: #800080;">=</span> <span style="color: #3399ff;">3</span>
        <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">others</span>                        <span style="color: #800080;">=</span> <span style="color: #3399ff;">4</span><span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">if</span> sy<span style="color: #808080;">-</span>subrc <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">NE</span> <span style="color: #3399ff;">0</span><span style="color: #808080;">.</span>
      <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">message</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">id</span> sy<span style="color: #808080;">-</span>msgid <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> sy<span style="color: #808080;">-</span>msgty <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">number</span> sy<span style="color: #808080;">-</span>msgno
                 <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">with</span> sy<span style="color: #808080;">-</span>msgv1 sy<span style="color: #808080;">-</span>msgv2 sy<span style="color: #808080;">-</span>msgv3 sy<span style="color: #808080;">-</span>msgv4<span style="color: #808080;">.</span>
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">endif</span><span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">call screen</span> <span style="color: #3399ff;">100</span><span style="color: #808080;">.</span>
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endmethod</span><span style="color: #808080;">.</span>                               <span style="color: #808080; font-style: italic;">&quot;zif_data_reader~generate_alv</span></pre></div></div>

<p>Com os dados selecionados e exibidos na tela, precisamos incluir o botão para visualizarmos as conexões das cias aéreas.</p>
<ul>
<li>set_toolbar - será chamado cada vez que o evento &#8220;TOOLBAR&#8221; (registrado no constructor!) for disparado pela classe CL_GUI_ALV_GRID.</li>
</ul>
<p>Consultando os parâmetros deste evento, na transação SE24, podemos verificar que ele exporta o parâmetro &#8220;E_OBJECT&#8221;, de tipo  &#8220;CL_ALV_EVENT_TOOLBAR_SET&#8221;.</p>
<p>Nos atributos desta classe, encontraremos o &#8220;MT_TOOLBAR&#8221;, de tipo &#8220;TTB_BUTTON&#8221;, finalmente tipo &#8220;STB_BUTTON&#8221;, onde estão as informações que precisamos.</p>
<p>Veja a implementação do método &#8220;set_toolbar&#8221;:</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">method</span><span style="color: #808080;">:</span> set_toolbar<span style="color: #808080;">.</span>
    <span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">data</span><span style="color: #808080;">:</span> wa_toolbar <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> stb_button<span style="color: #808080;">.</span>
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">case</span> sy<span style="color: #808080;">-</span>dynnr<span style="color: #808080;">.</span>
      <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">when</span> <span style="color: #4da619;">'1000'</span><span style="color: #808080;">.</span>
&nbsp;
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">clear</span> wa_toolbar<span style="color: #808080;">.</span>
        wa_toolbar<span style="color: #808080;">-</span>butn_type <span style="color: #800080;">=</span> <span style="color: #3399ff;">3</span><span style="color: #808080;">.</span>               <span style="color: #808080; font-style: italic;">&quot;Separador</span>
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">append</span> wa_toolbar <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">to</span> e_object<span style="color: #808080;">-&amp;</span>gt;mt_toolbar<span style="color: #808080;">.</span>
&nbsp;
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">clear</span> wa_toolbar<span style="color: #808080;">.</span>
        wa_toolbar<span style="color: #808080;">-</span><span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">function</span>  <span style="color: #800080;">=</span> <span style="color: #4da619;">'100_CONN'</span><span style="color: #808080;">.</span>
        wa_toolbar<span style="color: #808080;">-</span>icon      <span style="color: #800080;">=</span> icon_object_folder<span style="color: #808080;">.</span>
        wa_toolbar<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">quickinfo</span> <span style="color: #800080;">=</span> <span style="color: #4da619;">'Visualiza Conexões'</span><span style="color: #808080;">.</span>
        wa_toolbar<span style="color: #808080;">-</span>butn_type <span style="color: #800080;">=</span> <span style="color: #3399ff;">0</span><span style="color: #808080;">.</span>              <span style="color: #808080; font-style: italic;">&quot;Botão Normal</span>
        wa_toolbar<span style="color: #808080;">-</span>text      <span style="color: #800080;">=</span> <span style="color: #4da619;">'Visualizar Conexões'</span><span style="color: #808080;">.</span>
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">append</span> wa_toolbar <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">to</span> e_object<span style="color: #808080;">-&amp;</span>gt;mt_toolbar<span style="color: #808080;">.</span>
&nbsp;
      <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">when</span> <span style="color: #4da619;">'0100'</span><span style="color: #808080;">.</span>
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">clear</span> wa_toolbar<span style="color: #808080;">.</span>
        wa_toolbar<span style="color: #808080;">-</span>butn_type <span style="color: #800080;">=</span> <span style="color: #3399ff;">3</span><span style="color: #808080;">.</span>              <span style="color: #808080; font-style: italic;">&quot;Separador</span>
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">append</span> wa_toolbar <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">to</span> e_object<span style="color: #808080;">-&amp;</span>gt;mt_toolbar<span style="color: #808080;">.</span>
&nbsp;
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">clear</span> wa_toolbar<span style="color: #808080;">.</span>
        wa_toolbar<span style="color: #808080;">-</span><span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">function</span>    <span style="color: #800080;">=</span> <span style="color: #4da619;">'100_CONN'</span><span style="color: #808080;">.</span>
        wa_toolbar<span style="color: #808080;">-</span>icon        <span style="color: #800080;">=</span> icon_object_folder<span style="color: #808080;">.</span>
        wa_toolbar<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">quickinfo</span>   <span style="color: #800080;">=</span> <span style="color: #4da619;">'Visualiza Conexões'</span><span style="color: #808080;">.</span>
        wa_toolbar<span style="color: #808080;">-</span>butn_type   <span style="color: #800080;">=</span> <span style="color: #3399ff;">0</span><span style="color: #808080;">.</span>              <span style="color: #808080; font-style: italic;">&quot;Botão normal</span>
        wa_toolbar<span style="color: #808080;">-</span>text        <span style="color: #800080;">=</span> <span style="color: #4da619;">'Visualizar Conexões'</span><span style="color: #808080;">.</span>
        <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">if</span> sy<span style="color: #808080;">-</span>ucomm            <span style="color: #800080;">=</span> <span style="color: #4da619;">'BACK'</span><span style="color: #808080;">.</span>
          wa_toolbar<span style="color: #808080;">-</span>disabled  <span style="color: #800080;">=</span> <span style="color: #4da619;">' '</span><span style="color: #808080;">.</span>
        <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">else</span><span style="color: #808080;">.</span>
          wa_toolbar<span style="color: #808080;">-</span>disabled  <span style="color: #800080;">=</span> <span style="color: #4da619;">'X'</span><span style="color: #808080;">.</span>
        <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">endif</span><span style="color: #808080;">.</span>
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">append</span> wa_toolbar <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">to</span> e_object<span style="color: #808080;">-&amp;</span>gt;mt_toolbar<span style="color: #808080;">.</span>
      <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">when</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">others</span><span style="color: #808080;">.</span>
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">endcase</span><span style="color: #808080;">.</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endmethod</span><span style="color: #808080;">.</span>                                 <span style="color: #808080; font-style: italic;">&quot;set_toolbar</span></pre></div></div>

<p>Observe que temos duas tratativa diferentes para o botão: quando estamos na tela 1000 (chamando a tela 0100, que contém os dados das cias aéreas), quando deve estar habilitado, e quando estamos na tela 0100 (chamando a tela 0200, que conterá os dados das conexões), quando o botão deve estar desabilitado.</p>
<p>Para melhor compreensão, faça este exercício, coloque um BREAK-POINT no método e debugue! Assim você entenderá os momentos em que ele é chamado e sua tratativa!</p>
<p>Dica: lembre-se de utilizar text-symbols. Na implementação acima, escrevi as informações diretamente no código para facilitar o entendimento!</p>
<p>Nota: informamos o ícone: icon_object_folder, este nome é encontrado na tabela &#8220;ICON&#8221;, porém, algumas vezes precisamos do parâmetro &#8220;internal&#8221; quando trabalhamos com ícones. Este pode ser encontrado no programa &#8220;SHOWICON&#8221;.</p>
<ul>
<li>get_ucomm &#8211; é através deste que nosso botão funcionará:</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">method</span><span style="color: #808080;">:</span> get_ucomm<span style="color: #808080;">.</span>
    <span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">data</span><span style="color: #808080;">:</span> lv_row   <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> lvc_s_row<span style="color: #808080;">,</span>
          wa_scarr <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">like</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">line of</span> gt_scarr<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">data</span><span style="color: #808080;">:</span> r_cias  <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">range of</span> scarr<span style="color: #808080;">-</span>carrid<span style="color: #808080;">,</span>
          wa_cias <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">like</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">line of</span> r_cias<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">if</span> e_ucomm <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">eq</span> <span style="color: #4da619;">'100_CONN'</span><span style="color: #808080;">.</span>
      <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">call method</span> r_grid<span style="color: #808080;">-&amp;</span>gt;get_current_cell
        <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">importing</span>
          es_row_id <span style="color: #800080;">=</span> lv_row<span style="color: #808080;">.</span>
&nbsp;
<span style="color: #339933;">*--------------------------------------------------------------------*</span>
      <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">if</span> lv_row <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">is</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">initial</span><span style="color: #808080;">.</span>
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">message</span><span style="color: #808080;">:</span> text<span style="color: #808080;">-</span>003 <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #4da619;">'I'</span><span style="color: #808080;">.</span>
<span style="color: #339933;">*--------------------------------------------------------------------*</span>
      <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">else</span><span style="color: #808080;">.</span>
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">read table</span> gt_scarr <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">into</span> wa_scarr <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">index</span> lv_row<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">index</span><span style="color: #808080;">.</span>
&nbsp;
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">clear</span> wa_cias<span style="color: #808080;">.</span>
        wa_cias<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">sign</span>    <span style="color: #800080;">=</span> <span style="color: #4da619;">'I'</span><span style="color: #808080;">.</span>
        wa_cias<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">option</span>  <span style="color: #800080;">=</span> <span style="color: #4da619;">'EQ'</span><span style="color: #808080;">.</span>
        wa_cias<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">low</span>     <span style="color: #800080;">=</span> wa_scarr<span style="color: #808080;">-</span>carrid<span style="color: #808080;">.</span>
<span style="color: #339933;">*        wa_cias-high   = ' ' .</span>
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">append</span> wa_cias <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">to</span> r_cias<span style="color: #808080;">.</span>
&nbsp;
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">create object</span> r_connections
          <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">exporting</span>
            im_grid <span style="color: #800080;">=</span> r_grid<span style="color: #808080;">.</span>
&nbsp;
        <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">call method</span> r_connections<span style="color: #808080;">-&amp;</span>gt;zif_data_reader~read_data
          <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">exporting</span>
            im_scarr <span style="color: #800080;">=</span> r_cias<span style="color: #808080;">.</span>
<span style="color: #339933;">*--------------------------------------------------------------------*</span>
      <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">endif</span><span style="color: #808080;">.</span>
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">endif</span><span style="color: #808080;">.</span>
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endmethod</span><span style="color: #808080;">.</span>                             <span style="color: #808080; font-style: italic;">&quot;get_ucomm</span></pre></div></div>

<p>Lembrando que este método será chamado cada vez que o evento &#8220;user_command&#8221; for disparado (conforme sua declaração), devemos verificar se o &#8220;sy-ucomm&#8221; é &#8220;100_CONN&#8221;, ou seja, se nosso botão foi &#8220;clicado&#8221;.</p>
<p>Com isso, chamamos o método get_current_cel para verificarmos qual foi a linha selecionada.</p>
<p>Verificamos em nossa tabela qual é  cia aérea referente a linha selecionada, para então criarmos o objeto referente à classe das conexões e ler seus dados.</p>
<p>Observe que utilizamos o range r_cias para informar a cia aérea. O range é como se fosse o select-options, por isso precisamos informar:</p>
<ul>
<li>sign      = &#8220;I&#8221; (Include)</li>
<li>Option  = &#8220;EQ&#8221; (Equal, porque informaremos uma única cia aérea.</li>
<li>Low      = wa_scarr-carrid (cia aérea da linha selecionada).</li>
<li>High     = Não precisamos informar, pois utilizamos &#8220;option = EQ&#8221;.</li>
</ul>
<p>Para a classe lcl_companies, ainda precisamos implementar o método:</p>
<ul>
<li>refresh_table:</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">method</span> refresh_table<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">check</span> sy<span style="color: #808080;">-</span>dynnr <span style="color: #800080;">=</span> <span style="color: #3399ff;">100</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">and</span>
          sy<span style="color: #808080;">-</span>ucomm <span style="color: #800080;">=</span> <span style="color: #4da619;">'BACK'</span><span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">call method</span> me<span style="color: #808080;">-&amp;</span>gt;zif_data_reader~generate_alv
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">exporting</span>
        im_structure <span style="color: #800080;">=</span> <span style="color: #4da619;">'SCARR'</span><span style="color: #808080;">.</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endmethod</span><span style="color: #808080;">.</span>                              <span style="color: #808080; font-style: italic;">&quot;refresh_table</span></pre></div></div>

<p>Este método será chamado após o user_command.</p>
<p>É necessário para atualizar as informações do grid quando voltamos da tela 200 para a tela 100. Sem ele, os dados das conexões permanecem na tela.</p>
<p>Para melhor compreensão, debugue!</p>
<p>Finalmente, vamos à declaração da classe &#8220;lcl_connections&#8221;.</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #339933;">*----------------------------------------------------------------------*</span>
<span style="color: #339933;">*       CLASS lcl_connections DEFINITION</span>
<span style="color: #339933;">*----------------------------------------------------------------------*</span>
<span style="color: #339933;">*</span>
<span style="color: #339933;">*----------------------------------------------------------------------*</span>
<span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">class</span> lcl_connections <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">definition</span><span style="color: #808080;">.</span>
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">public section</span><span style="color: #808080;">.</span>
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">interfaces</span><span style="color: #808080;">:</span> zif_data_reader<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">methods</span><span style="color: #808080;">:</span> constructor
                <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">importing</span>
                  im_grid <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">ref to</span> cl_gui_alv_grid<span style="color: #808080;">.</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">private section</span><span style="color: #808080;">.</span>
    <span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">data</span><span style="color: #808080;">:</span> gt_spfli       <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">standard <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">table</span> of</span> spfli<span style="color: #808080;">,</span>
          gt_exc_button  <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> ui_functions<span style="color: #808080;">,</span>
          gv_carrid      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> scarr<span style="color: #808080;">-</span>carrid<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">data</span><span style="color: #808080;">:</span> r_grid_conn <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">ref to</span> cl_gui_alv_grid<span style="color: #808080;">.</span>
&nbsp;
<span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endclass</span><span style="color: #808080;">.</span>                              <span style="color: #808080; font-style: italic;">&quot;lcl_connections DEFINITION</span></pre></div></div>

<p>Como podem ver, esta é uma classe bem simples. Verifiquem sua implementação:</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">class</span> lcl_connections <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">implementation</span><span style="color: #808080;">.</span>
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">method</span><span style="color: #808080;">:</span> constructor<span style="color: #808080;">.</span>
    r_grid_conn <span style="color: #800080;">=</span> im_grid<span style="color: #808080;">.</span>
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endmethod</span><span style="color: #808080;">.</span>                              <span style="color: #808080; font-style: italic;">&quot;constructor</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">method</span><span style="color: #808080;">:</span> zif_data_reader~read_data<span style="color: #808080;">.</span>
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">clear</span>   gt_spfli<span style="color: #808080;">.</span>
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">refresh</span> gt_spfli<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">select</span> <span style="color: #808080;">*</span>
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">from</span> spfli
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">into</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">table</span> gt_spfli
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">where</span> carrid <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">in</span> im_scarr<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">if</span> sy<span style="color: #808080;">-</span>subrc <span style="color: #800080;">=</span> <span style="color: #3399ff;">0</span><span style="color: #808080;">.</span>
      <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">call method</span> me<span style="color: #808080;">-&amp;</span>gt;zif_data_reader~generate_alv
        <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">exporting</span>
          im_structure <span style="color: #800080;">=</span> <span style="color: #4da619;">'SPFLI'</span><span style="color: #808080;">.</span>
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">else</span><span style="color: #808080;">.</span>
      <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">message</span><span style="color: #808080;">:</span> text<span style="color: #808080;">-</span>004 <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">type</span> <span style="color: #4da619;">'I'</span><span style="color: #808080;">.</span>
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">endif</span><span style="color: #808080;">.</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endmethod</span><span style="color: #808080;">.</span>                    <span style="color: #808080; font-style: italic;">&quot;zif_data_reader~read_data</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">method</span><span style="color: #808080;">:</span> zif_data_reader~generate_alv<span style="color: #808080;">.</span>
    <span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">data</span><span style="color: #808080;">:</span> wa_exclude <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">like</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">line of</span> gt_exc_button<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">call method</span> r_grid_conn<span style="color: #808080;">-&amp;</span>gt;set_table_for_first_display
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">exporting</span>
        i_structure_name              <span style="color: #800080;">=</span> im_structure
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">changing</span>
        it_outtab                     <span style="color: #800080;">=</span> gt_spfli
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">exceptions</span>
        invalid_parameter_combination <span style="color: #800080;">=</span> <span style="color: #3399ff;">1</span>
        program_error                 <span style="color: #800080;">=</span> <span style="color: #3399ff;">2</span>
        too_many_lines                <span style="color: #800080;">=</span> <span style="color: #3399ff;">3</span>
        <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">others</span>                        <span style="color: #800080;">=</span> <span style="color: #3399ff;">4</span><span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">call screen</span> <span style="color: #3399ff;">200</span><span style="color: #808080;">.</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endmethod</span><span style="color: #808080;">.</span>                    <span style="color: #808080; font-style: italic;">&quot;zif_data_reader~generate_alv</span>
&nbsp;
<span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">endclass</span><span style="color: #808080;">.</span></pre></div></div>

<p>Observe que o constructor é responsável apenas por &#8220;importar&#8221; o grid gerado na classe lcl_companies.</p>
<p>Vejam abaixo o resultado do nosso exercício:</p>
<div id="attachment_2234" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2012/02/tela-100.jpg"><img class="size-medium wp-image-2234" title="tela 100" src="http://abap101.com/wp-content/uploads/2012/02/tela-100-300x116.jpg" alt="" width="300" height="116" /></a><p class="wp-caption-text">Tela 0100 - Cias aéreas</p></div>
<p>Tela 0100, com os as informações das cias aéreas e botão habilitado.</p>
<p>Observe que não há o botão responsável pela geração de gráficos.</p>
<div id="attachment_2235" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2012/02/tela-200.jpg"><img class="size-medium wp-image-2235" title="tela 200" src="http://abap101.com/wp-content/uploads/2012/02/tela-200-300x40.jpg" alt="" width="300" height="40" /></a><p class="wp-caption-text">Tela 0200 - Conexões</p></div>
<p>Tela 0200, com informações das conexões e botão desabilitado.</p>
<p>E então, gostaram? baixe o código (<a title="Z_ALV_OO_2" href="http://abap101.com/wp-content/uploads/2012/03/Z_ALV_OO_2.zip">Z_ALV_OO</a> ), estude e nos envie suas dúvidas e sugestões!</p>
<p>Veja <a href="http://abap101.com/2011/01/22/introducao-ao-saplink/" target="_blank">neste post</a> como utilizar o arquivo.</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/03/01/abap-objects-alv/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Os 5 P&#8217;s do ABAP</title>
		<link>http://abap101.com/2012/02/28/os-5-ps-abap/</link>
		<comments>http://abap101.com/2012/02/28/os-5-ps-abap/#comments</comments>
		<pubDate>Tue, 28 Feb 2012 11:00:40 +0000</pubDate>
		<dc:creator>Fábio Pagoti</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[Conceitos]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Opinião]]></category>
		<category><![CDATA[5 p's]]></category>
		<category><![CDATA[prazo]]></category>
		<category><![CDATA[pressão]]></category>
		<category><![CDATA[processo]]></category>
		<category><![CDATA[profissionalismo]]></category>
		<category><![CDATA[programação]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=1619</guid>
		<description><![CDATA[Se você já conhece o ABAP101.com, sabe que uma das nossas principais iniciativas é a inserção de iniciantes no mundo ABAP através de projetos Open Source. Fazemos isso sem custo nenhum e por puro prazer de deixar nosso legado adiante. Se você é novo por aqui, é fácil de entender: temos um processo parecido com [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/02/28/os-5-ps-abap/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/02/28/os-5-ps-abap/" data-text="Os 5 P&#8217;s do ABAP"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/02/28/os-5-ps-abap/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F28%2Fos-5-ps-abap%2F&amp;linkname=Os%205%20P%E2%80%99s%20do%20ABAP" title="Google Gmail" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/gmail.png" width="16" height="16" alt="Google Gmail"/></a><a class="a2a_button_wordpress" href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F28%2Fos-5-ps-abap%2F&amp;linkname=Os%205%20P%E2%80%99s%20do%20ABAP" title="WordPress" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F28%2Fos-5-ps-abap%2F&amp;linkname=Os%205%20P%E2%80%99s%20do%20ABAP" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fabap101.com%2F2012%2F02%2F28%2Fos-5-ps-abap%2F&amp;title=Os%205%20P%E2%80%99s%20do%20ABAP" id="wpa2a_10"><img src="http://abap101.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p><p>Se você já conhece o ABAP101.com, sabe que uma das nossas principais iniciativas é a inserção de iniciantes no mundo ABAP através de projetos Open Source. Fazemos isso sem custo nenhum e por puro prazer de deixar nosso legado adiante. Se você é novo por aqui, é fácil de entender: temos um processo parecido com uma empresa que procura um profissional de ABAP. Temos um critério de decisão que decidirá quem trabalhará conosco em um dos nossos projetos open source. A partir do momento que a escolha é feita, começamos a trabalhar desde a definição do escopo do projeto até a submissão de uma versão estável do projeto na plataforma Code Exchange <span style="color: #000000;">da SAP. <a title="Projetos Open Source" href="http://abap101.com/open-source/" target="_blank">Saiba mais sobre nossa iniciativa de projetos open source ABAP</a>.</span></p>
<p>Quando o Furlan e eu estávamos conversando sobre os projetos e seus objetivos ficou claro que nosso objetivo, veja só você, <strong>não </strong>era apenas ensinar ABAP. Queríamos aproximar o que é ensinado nas academias da KA Solution com o que é vivenciado no dia-a-dia de um ABAPer. Foi então que definimos o conceito dos 5 P&#8217;s do ABAP, baseado no <em>Marketing Mix. </em>Continue lendo para entender a definição de cada um dos P&#8217;s e entender no que cada um influencia na sua entrada ou na sua boa permanência no mercado de ABAP.</p>
<p><span id="more-1619"></span></p>
<p>O 5 P&#8217;s do ABAP regem a forma de trabalharmos e nos guiam em relação ao que deve ser deixado como legado. Vamos a cada um deles.</p>
<h3>1º P &#8211; Programação</h3>
<p><strong> </strong>Este com certeza é o que mais se relaciona com ABAP. Se você quer trabalhar com ABAP, você <strong>tem que</strong> programar. Se você não sabe programar, entenda o primeiro P como &#8220;Prática&#8221;. Temos um conjunto de exercícios para quem está começando e já tivemos um campeonato de ABAP que intrigou até os mais experientes. Um bom programador tem que sonhar com código, tem que pensar em código no ônibus e traduzir bem a língua do funcional para a lingua do aplication server. Antes de querer entender o que é um cabeçalho, deve saber usar uma work area e antes de querer entender o que são itens deve saber usar uma tabela interna. Deve gostar de programar a ponto de baixar a versão trial do SAP para instalar e praticar em casa depois de um dia cansativo. Um bom ABAPer deve sempre evitar de fazer um trabalho repetitivo por horas/dias que possa ser substituído por um programa Z. Um bom ABAPer não constrói tudo do zero. Ao invés disso ele sempre que possível usa orientação a objetos de forma a facilitar a reusabilidade do seu código e reutiliza APIs prontas criadas por terceiros. Para aumentar a manutenabilidade de um programa, um bom ABAP vai muito além de simplesmente usar o Pretty Printer e comentar no código a descrição dos componentes de uma estrutura. Um bom ABAPer documenta e evita ao máximo gambiarras. Um bom programador entende e que há vida fora do mundo ABAP. Um bom ABAPer tem a tecla F1 gasta. Um bom ABAPers não somente tem cadastro mas é colaborativo na SDN: não faz perguntas vagas em fóruns, fecha as questões que abriu no fórum e dá a opinião sobre aquilo que lê.</p>
<p>O primeiro P pode parecer trivial a primeira vista, mas não é fácil levá-lo a risca. Além de tudo isso um bom ABAPer gostará de saber os outros 4 P&#8217;s.</p>
<h3>2º P &#8211; Processo</h3>
<p><strong> </strong>Se você não trabalha com ABAP, você provavelmente não conhece um exemplo de 2º P. Se você já trabalha com ABAP, provavelmente você gostaria de não ter conhecido alguns deles. Processo são as regras que você como ABAPer é pago para seguí-las e não questioná-las ou burlá-las (algo que será discutido no 5º P). Pode parecer cruel ou duro demais, mas é a verdade. Qualquer empresa que tem poder aquisitivo para implementar o SAP deve ter maturidade suficiente para entender a importância de se ter um bom processo. Se as pessoas não seguem um processo, nenhum ERP resolverá os problemas da empresa. Por isso, se no processo da sua empresa a <a title="Documentação, uma “opção” (necessidade!) para o bom andamento do projeto" href="http://abap101.com/2012/02/13/documentacao-uma-opcao-necessidade-para-bom-andamento-projeto/" target="_blank">documentação é exigida</a>, você deve fazer a documentação. Se você precisa pedir permissão para realizar algum tipo de atividade, você deve fazê-lo. Processos são tão bons para as empresas que os tem quanto bons para proteger aqueles que evitam &#8220;camaradagens e pequenos favores&#8221;.</p>
<p>Se você quer participar de um projeto conosco, saiba que temos processos desde como definir o escopo, passando por regras de convenção de código até de submissão de releases. Hoje este tipo de experiência não é vivenciado em faculdades ou academias e queremos trazer isso para fora do ambiente empresarial também pois faz parte da nossa profissão, gostemos ou não.</p>
<h3><strong>3º P &#8211; Prazo</strong></h3>
<p><strong> </strong>Se você já trabalhou com SD, pode pular este P. &#8211; você entende o que digo. Infelizmente o prazo é geralmente o último dos vértices do triângulo de ferro a ser reajustado. O go/no go geralmente tem uma possibilidade de resposta unária quando se trata de um requesito legal <del>que o governo resolveu pedir para ontem.</del> O prazo pode sim estar contido dentro de um requesito e se você não atender o prazo significa que você não atendeu o cliente. Se você não faz ideia do quanto tempo leva para desenvolver uma solução, codificar um método ou corrigir um dump, não se preocupe desde que você alerte as partes envolvidas  uma melhor estimativa após um tempo de melhor compreensão do problema. Reportar problemas no final do prazo que lhe deram somente gera mais um problema. O prazo faz parte da vida de um ABAPer seja ele júnior ou sênior. Se quem demorou foi o funcional e não você pergunte ao usuário o que ele acha e ele te responderá que a culpa é do pessoal de TI como um todo.</p>
<p>No caso dos nossos projetos open source, sempre existirá prazos previamente negociados. Se você não é capaz de cumprí-los, não se inscreva neles pois outros podem estar dispostos a abdicar mais do que você.</p>
<h3>4º P &#8211; Pressão</h3>
<p><strong> </strong>3 da manhã de um sábado. Você chega em casa depois de um bom Happy Hour e recebe uma ligação. Por algum motivo desconhecido um transporte desconhecido subiu até produção e sua empresa parou (parcialmente ou não de funcionar). Como você se sente para debugar um código comentado em alemão? E se disser que não importa se foi sua culpa ou não? A pressão não estará presente só nesses casos extremos (que por sinal o 2º P pode proteger você e sua empresa) mas também em cada objeto customizado que você cria. Se você lida bem com pressão saiba que sempre há uma expectativa em relação a algo que você constrói. E essa expectativa se não atendida pode gerar inúmeros problemas.</p>
<p>Como dito anteriormente, funcionamos de maneira similar a uma empresa. Como qualquer empresa, há um critério de captura de novos integrantes bem como há um critério para  a substituição dos mesmos que não rendem o que é esperado.</p>
<h3>5º P &#8211; Profissionalismo</h3>
<p>Voltando a falar de camaradagem, para que se preocupar com processos chatos, lentos e burros? Afinal, o ABAPer tem alguns jeitos de resolver um problema. &#8220;Faz um programinha&#8221;, &#8220;aproveita essa request aberta&#8221;, &#8220;ajusta a lógica que depois eu documento&#8221;, &#8220;inclui um IF aí&#8221;, &#8220;marreta a tabela&#8221; são frases que você provavelmente já ouviu e que as respostas &#8220;Sim&#8221; medem o quanto o 5º P é valorizado por você.  Pensamentos/argumentos do tipo &#8220;isso não foi pedido, então não vou fazer&#8221;, &#8220;está especificado errado, por isso o programa está errado&#8221;, &#8220;no cenário sem erros funciona então isso é o que interessa&#8221; e &#8220;rodei o programa para um registro e funcionou, vamos transportar!&#8221; também interferem no resultado do seu 5° P. Guardar informações com você por qualquer forma de receio também contam negativamente neste item. Você compraria um carro que quebrasse no primeiro buraco que passar? Por que fazer gambiarras no código então? O SAP é bem mais caro que muito carro por aí.</p>
<p>Cuidado com sua imagem pois ela pode ser superior a todas as suas habilidades de trabalhar com os outros 4 P&#8217;s.</p>
<h3>Conclusão</h3>
<p>Participando nos projetos open source do ABAP101.com, você tem a oportunidade de trabalhar em cima de cada um destes conceitos, algo que ajuda muito quem está apenas iniciando.</p>
<p><span style="color: #ff0000;"><strong>Importante</strong></span>: já recebemos uma boa quantidade de exercícios de leitores que se mostraram interessados e que com certeza irão receber preferência na hora da escolha dos participantes. No momento estamos atualizando nossos projetos existentes no Code Exchange e testando ferramentas que nos ajudarão na hora de submeter e recuperar código da plataforma.</p>
<p>Mais uma vez, queremos ouvir sua opinião: o que você achou dos 5 P&#8217;s do ABAP? Qual o mais importante em sua opinião e por quê? Você acha que a participação em projetos open source podem contribuir para a formação de cada um destes conceitos? Contamos com sua resposta!</p>
<p>Abraço5!</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/02/28/os-5-ps-abap/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Projetos Open Source &#8211; Primeira Newsletter</title>
		<link>http://abap101.com/2012/02/17/projetos-open-source-primeira-newsletter/</link>
		<comments>http://abap101.com/2012/02/17/projetos-open-source-primeira-newsletter/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 22:03:14 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[candidatos]]></category>
		<category><![CDATA[newsletter]]></category>
		<category><![CDATA[projetos open source]]></category>
		<category><![CDATA[seleção]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2166</guid>
		<description><![CDATA[Hoje mandamos a primeira newsletter para as pessoas que fizeram sua inscrição para nossos projetos open source em nossa página sobre o assunto. Todas as novidades relativas aos projetos, seleção dos candidados, situação de cada projeto e muitas outras informações que serão divulgadas apenas pela newsletter. Caso você tenha interesse em participar de nossos projetos, [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/02/17/projetos-open-source-primeira-newsletter/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/02/17/projetos-open-source-primeira-newsletter/" data-text="Projetos Open Source &#8211; Primeira Newsletter"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/02/17/projetos-open-source-primeira-newsletter/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F17%2Fprojetos-open-source-primeira-newsletter%2F&amp;linkname=Projetos%20Open%20Source%20%E2%80%93%20Primeira%20Newsletter" title="Google Gmail" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/gmail.png" width="16" height="16" alt="Google Gmail"/></a><a class="a2a_button_wordpress" href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F17%2Fprojetos-open-source-primeira-newsletter%2F&amp;linkname=Projetos%20Open%20Source%20%E2%80%93%20Primeira%20Newsletter" title="WordPress" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F17%2Fprojetos-open-source-primeira-newsletter%2F&amp;linkname=Projetos%20Open%20Source%20%E2%80%93%20Primeira%20Newsletter" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fabap101.com%2F2012%2F02%2F17%2Fprojetos-open-source-primeira-newsletter%2F&amp;title=Projetos%20Open%20Source%20%E2%80%93%20Primeira%20Newsletter" id="wpa2a_12"><img src="http://abap101.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p><p>Hoje mandamos a primeira newsletter para as pessoas que fizeram sua inscrição para nossos projetos open source em nossa <a href="http://abap101.com/open-source/" target="_blank">página sobre o assunto</a>.</p>
<p>Todas as novidades relativas aos projetos, seleção dos candidados, situação de cada projeto e muitas outras informações que serão divulgadas apenas pela newsletter.</p>
<p>Caso você tenha interesse em participar de nossos projetos, faça a sua inscrição hoje mesmo. A nova edição será enviada daqui duas semanas, já com a seleção dos participantes dos próximos projetos.</p>
<div><span id="more-2166"></span></div>
<p><a href="http://abap101.com/wp-content/uploads/2012/02/nl_proj_01.png"><img class="aligncenter size-full wp-image-2167" title="nl_proj_01" src="http://abap101.com/wp-content/uploads/2012/02/nl_proj_01.png" alt="" width="609" height="500" /></a><br />
Leia o texto na íntegra nesse link abaixo:<br />
<a href="http://eepurl.com/jiIsP" target="_blank">ABAP101 Open Source Projects &#8211; Edição 1 &#8211; Apresentação dos Projetos</a></p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/02/17/projetos-open-source-primeira-newsletter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Documentação, uma &#8220;opção&#8221; (necessidade!) para o bom andamento do projeto</title>
		<link>http://abap101.com/2012/02/13/documentacao-uma-opcao-necessidade-para-bom-andamento-projeto/</link>
		<comments>http://abap101.com/2012/02/13/documentacao-uma-opcao-necessidade-para-bom-andamento-projeto/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 11:30:14 +0000</pubDate>
		<dc:creator>Claudia Andressa</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[ABAPDoc2]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[abapdoc2]]></category>
		<category><![CDATA[Documentação]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=1907</guid>
		<description><![CDATA[Uma das etapas mais importantes de um projeto, porém muitas vezes ignorada, é a de documentação do mesmo. Muitas empresas,  desenvolvedores e analistas não tem o hábito de gerar documentação, porém, se forem definidos alguns detalhes (modo de atualização, nível de detalhamento, complexidade) o custo-benefício e tempo investido serão vantajosos. Podemos considerar a documentação sob [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/02/13/documentacao-uma-opcao-necessidade-para-bom-andamento-projeto/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/02/13/documentacao-uma-opcao-necessidade-para-bom-andamento-projeto/" data-text="Documentação, uma &#8220;opção&#8221; (necessidade!) para o bom andamento do projeto"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/02/13/documentacao-uma-opcao-necessidade-para-bom-andamento-projeto/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F13%2Fdocumentacao-uma-opcao-necessidade-para-bom-andamento-projeto%2F&amp;linkname=Documenta%C3%A7%C3%A3o%2C%20uma%20%E2%80%9Cop%C3%A7%C3%A3o%E2%80%9D%20%28necessidade%21%29%20para%20o%20bom%20andamento%20do%20projeto" title="Google Gmail" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/gmail.png" width="16" height="16" alt="Google Gmail"/></a><a class="a2a_button_wordpress" href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F13%2Fdocumentacao-uma-opcao-necessidade-para-bom-andamento-projeto%2F&amp;linkname=Documenta%C3%A7%C3%A3o%2C%20uma%20%E2%80%9Cop%C3%A7%C3%A3o%E2%80%9D%20%28necessidade%21%29%20para%20o%20bom%20andamento%20do%20projeto" title="WordPress" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F13%2Fdocumentacao-uma-opcao-necessidade-para-bom-andamento-projeto%2F&amp;linkname=Documenta%C3%A7%C3%A3o%2C%20uma%20%E2%80%9Cop%C3%A7%C3%A3o%E2%80%9D%20%28necessidade%21%29%20para%20o%20bom%20andamento%20do%20projeto" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fabap101.com%2F2012%2F02%2F13%2Fdocumentacao-uma-opcao-necessidade-para-bom-andamento-projeto%2F&amp;title=Documenta%C3%A7%C3%A3o%2C%20uma%20%E2%80%9Cop%C3%A7%C3%A3o%E2%80%9D%20%28necessidade%21%29%20para%20o%20bom%20andamento%20do%20projeto" id="wpa2a_14"><img src="http://abap101.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p><p>Uma das etapas mais importantes de um projeto, porém muitas vezes ignorada, é a de documentação do mesmo.</p>
<p>Muitas empresas,  desenvolvedores e analistas não tem o hábito de gerar documentação, porém, se forem definidos alguns detalhes (modo de atualização, nível de detalhamento, complexidade) o custo-benefício e tempo investido serão vantajosos.</p>
<p>Podemos considerar a documentação sob duas vertentes: &#8220;Documentação de Requisitos&#8221; e &#8220;Documentação do Programa&#8221;. Neste post, vamos analisar a documentação do Programa.</p>
<p><span id="more-1907"></span></p>
<p>Por exemplo: quantos de vocês já necessitaram refazer / alterar por diversas vezes um programa que no início do projeto não teve seus requisitos bem compreendidos? O fato é que se este levantamento for bem feito e documentado, os riscos de <em>rework</em>, falhas, não atendimento aos prazos propostos, dentre outros, certamente serão minimizados, além de permitir uma visualização global do projeto, facilitando o seu gerenciamento e identificação de melhorias.</p>
<p>Considerando a documentação de programas, podemos citar alguns benefícios, tais como:</p>
<p><strong>Facilidade de manutenção:</strong> todos nós sabemos que comumente um programa é desenvolvido por uma pessoa e recebe manutenção por outra (ou outras). Já pararam para pensar em quanto tempo de análise de código e qualidade podemos ganhar caso haja uma documentação bem feita e atualizada?</p>
<p><strong>Transmissão de conhecimentos:</strong> muitos não costumam pensar sob a perspectiva que vou expor agora, mas independentemente de sermos contratados direta ou indiretamente por uma empresa, como CLT ou como PJ, somos contratados para gerar lucros e <span style="text-decoration: underline;"><em>DEVEMOS</em></span> pensar como empresa. Desta forma, é através da documentação que transmitimos nossos conhecimentos, seja de negócios, seja da parte técnica, a continuidade do projeto não deve depender dos conhecimentos de uma só pessoa.</p>
<p><strong>Re-utilização de API´s: </strong> quando bem documentadas podem facilitar muito a rotina de um programador, que pode reutilizar de maneira fácil e rápida trechos de códigos já existentes (como classes e function modules, por exemplo), ganhando em tempo de desenvolvimento, qualidade e padronização de código.</p>
<p>Existem algumas ferramentas para auxiliar na geração de tais documentos, dentre elas, recomendamos o projeto open source <a href="http://abap101.com/category/opensource/abapdoc2/" target="_blank">ABAPDoc2</a>, que gera as doumentações em HTML (o que possibilita sua análise sem a necessidade de acessar o SAP) e fornece informações sobre a composição de classes e seus métodos, function groups e seus function modules (parâmetros de importação / exportação, tabelas, dentre outros), assim como possibilita a exibição de comentários inseridos no header dos códigos, facilitando o entendimento técnico  e suas funcionalidades.</p>
<p>Este projeto é bastante indicado para documentar outros projetos open source, porém não é aplicável nos casos de documentação de requisitos, pois a necessidade é outra.</p>
<p>E então, prontos para colocar a  mão na massa? <a title="ABAPDoc2" href="https://cw.sdn.sap.com/cw/groups/abap101-projects-abapdoc2" target="_blank">Baixe</a> já e conheça o ABAPDoc2.</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/02/13/documentacao-uma-opcao-necessidade-para-bom-andamento-projeto/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Hello World Orientado a Objetos</title>
		<link>http://abap101.com/2012/02/07/world-orientado-objetos/</link>
		<comments>http://abap101.com/2012/02/07/world-orientado-objetos/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 13:00:56 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[ABAP Objects]]></category>
		<category><![CDATA[Tecnica de Programação]]></category>
		<category><![CDATA[hello world]]></category>
		<category><![CDATA[objetos]]></category>
		<category><![CDATA[oop]]></category>
		<category><![CDATA[orientação]]></category>
		<category><![CDATA[POO]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2051</guid>
		<description><![CDATA[Uma coisa que não mais iremos discutir aqui no ABAP101 é usar ou não programação orientada a objetos, por isso estamos abolindo procedural do ABAP101, caso você veja alguma coisa procedural aqui no site, por favor avise-me! Programação procedural pode parecer mais fácil, mas é porque estamos mais acostumados com esse tipo de programação do [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/02/07/world-orientado-objetos/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/02/07/world-orientado-objetos/" data-text="Hello World Orientado a Objetos"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/02/07/world-orientado-objetos/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F07%2Fworld-orientado-objetos%2F&amp;linkname=Hello%20World%20Orientado%20a%20Objetos" title="Google Gmail" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/gmail.png" width="16" height="16" alt="Google Gmail"/></a><a class="a2a_button_wordpress" href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F07%2Fworld-orientado-objetos%2F&amp;linkname=Hello%20World%20Orientado%20a%20Objetos" title="WordPress" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F02%2F07%2Fworld-orientado-objetos%2F&amp;linkname=Hello%20World%20Orientado%20a%20Objetos" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fabap101.com%2F2012%2F02%2F07%2Fworld-orientado-objetos%2F&amp;title=Hello%20World%20Orientado%20a%20Objetos" id="wpa2a_16"><img src="http://abap101.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p><p>Uma coisa que não mais iremos discutir aqui no ABAP101 é usar ou não programação orientada a objetos, por isso estamos abolindo procedural do ABAP101, caso você veja alguma coisa procedural aqui no site, por favor avise-me!</p>
<p>Programação procedural pode parecer mais fácil, mas é porque estamos mais acostumados com esse tipo de programação do que orientada a objetos. Tome uma resolução em sua vida ABAPer, faça tudo em ABAP OO, mesmo um simples relatório. Comece com uma simples classe e daí vá evoluindo, mas fuja da &#8220;primeira dose&#8221; do procedural. Acredite a vida é bem melhor sem procedural!</p>
<p>A orientação a objetos nos permite abstrações muito mais elegantes do que a procedural sendo os programas orientados a objetos muito mais fáceis de fazer manutenção, permitindo reuso real e muitas outras coisas que somente usando no dia-a-dia podemos perceber.</p>
<p>Pensando nisso, criei esse post onde mostro uma série de versões do famoso programa Hello World orientados a objetos. A primeira vez que o programa Hello World em ABAP apareceu por aqui foi em 2007, nesse post <a href="http://abap101.com/2007/08/30/criando-o-programa-abap-hello-world/" target="_blank">aqui</a>. A solução vai crescendo mostrando algumas formas de abstração resolvendo o mesmo problema de várias maneiras possíveis.</p>
<p><span id="more-2051"></span></p>
<h3>Primeira Versão</h3>
<p>Nessa versão temos uma classe chamada LCL_HELLO com apenas um único método DISPLAY_MESSAGE( ).</p>
<p><script src="https://gist.github.com/1700603.js?file=ZP_HELLO_OO"></script> <a href="https://gist.github.com/1700603" target="_blank">ZP_HELLO_OO</a></p>
<p>Nessa versão contém apenas uma única classe com um único método. Não temos muito de programação orientada a objetos aqui, mas já estamos deixando a sementinha do OO entrar em nossos programas.</p>
<h3>Procedural Orientado a Objetos</h3>
<p>Vamos adicionar um parameter em nosso programa e começar a discutir algumas opções de abstração.  A primeira opção eu chamo de &#8220;Procedural Orientado a Objetos&#8221;. Aqui não estamos pensando numa solução orientada a objetos, mas pensando em procedural.</p>
<p><script src="https://gist.github.com/1700605.js?file=ZP_HELLO_OO_2"></script> <a href="https://gist.github.com/1700605" target="_blank">ZP_HELLO_OO_2</a></p>
<p>Veja que poderíamos substituir perfeitamente por um FORM/PERFORM sem grandes mudanças na abstração, mas lembre-se que queremos evitá-los de qualquer maneira, mesmo assim essa versão é muito melhor que qualquer outra versão procedural.</p>
<h3>Melhorando a Impressão da Mensagem</h3>
<p>Uma verão mais interessante que eu proporia seria a mostrada abaixo:</p>
<p><script src="https://gist.github.com/1700606.js?file=ZP_HELLO_OO_3"></script> <a href="https://gist.github.com/1700606" target="_blank">ZP_HELLO_OO_3</a></p>
<p>O resultado é o mesmo, mas agora temos um objeto LCL_HELLO que recebe um nome para saudação na sua construção e daí mostra a mensagem pelo método DISPLAY_MESSAGE( ). Já conseguiu imaginar um objeto que tem a responsabilidade de mostrar uma mensagem na tela?</p>
<h3>Permitindo Operações No Objeto LCL_HELLO</h3>
<p>Ainda sim não estou contente com a solução. E se quisermos alterar o atributo NAME antes de mostrarmos a mensagem? E se quisermos saber o atributo NAME antes de mostrar para o usuário? Por isso é aconselhável criamos os <strong>métodos de acesso</strong>, os famosos SET e GET. Veja como ficaria nosso programa:</p>
<p><script src="https://gist.github.com/1700607.js?file=ZP_HELLO_OO_4"></script> <a href="https://gist.github.com/1700607" target="_blank">ZP_HELLO_OO_4</a></p>
<p>Pense que agora temos um objeto HELLO no qual podemos alterar seu estado (SET e GET) quantas vezes quisermos. A abstração está muito melhor agora, mas dá para melhorar ainda mais!</p>
<h3>MVC no Hello World, Pode?</h3>
<p>Que história é essa do programa principal verificar se a mensagem é correta ou não!? Esse programa deveria cuidar apenas em receber a entrada do usuário e chamar o objeto para mostrar a mensagem. Não deveria ter nenhuma regra (de negócio). Essa verificação deveria estar no modelo, ou seja, classe LCL_HELLO.  Então, vamos melhorar ainda mais o nossa classe:</p>
<p><script src="https://gist.github.com/1700615.js?file=ZP_HELLO_OO_5"></script> <a href="https://gist.github.com/1700615" target="_blank">ZP_HELLO_OO_5</a></p>
<p>Mesmo que algum <a href="http://www.abapzombie.com/revolucao/2011/10/25/revolucao-o-terror-dos-nao-preguicosos/" target="_blank">Perform Fanboy</a> invada seu programa na calada da noite, você já contará com uma certa proteção dentro do seu programa contra maus programadores terá protegido seu programa (já que ele não saberia alterar a classe :-p ).  Além do mais, você também terá o conceito de <strong>encapsulamento</strong> aplicado aqui. Repare que a regra de não permitir o parâmetro NAME como &#8220;procedural !!&#8221; está agora embutido no método SET( ). Isso impede que o atributo seja alterado indevidamente por qualquer outro programador mal comportado que venha dar manutenção em seu código. Ou seja, podemos alterar quantas vezes quisermos o atributo NAME, mas seguindo a regra definida no método SET( ).  Mas será que daria para melhorar ainda ainda mais? Resposta é sim!</p>
<h3>Versão Final! (Será?)</h3>
<p><script src="https://gist.github.com/1700617.js?file=ZP_HELLO_OO_6"></script><br />
<a href="https://gist.github.com/1700617" target="_blank">ZP_HELLO_OO_6</a></p>
<p>Agora sim, temos uma separação bem definida entre quem é responsável por tratar com o usuário (programa principal, com PARAMETERS e WRITE) e quem cuidará das regras do texto (classe LCL_HELLO). Ainda sim, estaremos protegidos do Performa Fanboy e deixamos nosso programa reutilizável.</p>
<p>Quando você começa a usar programação orientada a objetos você naturalmente começa a pensar nesses conceitos, como robustes, facilidade de manutenção, encapsulamento</p>
<p>Como regra prática, procure deixa comandos WRITEs fora das classes de negócio (<a href="http://pt.wikipedia.org/wiki/MVC" target="_blank">Model</a>).</p>
<h3>Conclusão</h3>
<p>Podemos ver que um simples problema de impressão do Hello World!! pode ganhar diversas soluções. Enquanto estou escrevendo esse parágrafo, já pensei mais outras duas. Isso prova que em programação orientada a objetos não existe certo ou errado, existe sim um equilíbrio, um balanço de quanto de reuso, abstração ou encapsulamento você quer aplicar ao seu problema. Isso dependerá muito de caso para caso. Mesmo assim não importa, continue programando somente em OO, acredite, um dia você irá me agradecer por isso.</p>
<p>Será que essa é a versão final? Será que você ficou contente com apenas 6 versões? E aquelas duas que eu pensei, como seriam? Deixe sua versão do Hello World OO nos comentários. Estou muito curioso em saber como você resolveria o Hello World!! além do</p>
<blockquote><p>WRITE: &#8216;Hello World!!&#8217;.</p></blockquote>
<p>Arquivo <a href="http://abap101.com/wp-content/uploads/2012/01/NUGG_ZP_HELLO_OO.nugg_.zip">Nugget</a>. (<a href="http://abap101.com/2011/01/22/introducao-ao-saplink/" target="_blank">SAPLink</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/02/07/world-orientado-objetos/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Mudando a vida de um iniciante em ABAP em 6 passos</title>
		<link>http://abap101.com/2012/01/26/mudando-vida-de-um-iniciante-em-abap-em-6-passos/</link>
		<comments>http://abap101.com/2012/01/26/mudando-vida-de-um-iniciante-em-abap-em-6-passos/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 12:00:41 +0000</pubDate>
		<dc:creator>Claudia Andressa</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[Opinião]]></category>
		<category><![CDATA[Dicas ABAP]]></category>
		<category><![CDATA[Iniciantes em ABAP]]></category>
		<category><![CDATA[SAP Iniciante]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2013</guid>
		<description><![CDATA[Ok, ok, muita pretensão achar que mudarei a sua vida, mas como também sou uma &#8220;SAP iniciante&#8221;, recebi algumas dicas, observei alguns pontos e gostariade compartilhá-los com vocês, pois podem não mudar a vida de um ABAP, mas certamente ajudarão muito aos que estão começando sua carreira agora! Pergunte: É comum sentirmos receio em perguntar [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/01/26/mudando-vida-de-um-iniciante-em-abap-em-6-passos/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/01/26/mudando-vida-de-um-iniciante-em-abap-em-6-passos/" data-text="Mudando a vida de um iniciante em ABAP em 6 passos"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/01/26/mudando-vida-de-um-iniciante-em-abap-em-6-passos/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F01%2F26%2Fmudando-vida-de-um-iniciante-em-abap-em-6-passos%2F&amp;linkname=Mudando%20a%20vida%20de%20um%20iniciante%20em%20ABAP%20em%206%20passos" title="Google Gmail" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/gmail.png" width="16" height="16" alt="Google Gmail"/></a><a class="a2a_button_wordpress" href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F01%2F26%2Fmudando-vida-de-um-iniciante-em-abap-em-6-passos%2F&amp;linkname=Mudando%20a%20vida%20de%20um%20iniciante%20em%20ABAP%20em%206%20passos" title="WordPress" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F01%2F26%2Fmudando-vida-de-um-iniciante-em-abap-em-6-passos%2F&amp;linkname=Mudando%20a%20vida%20de%20um%20iniciante%20em%20ABAP%20em%206%20passos" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fabap101.com%2F2012%2F01%2F26%2Fmudando-vida-de-um-iniciante-em-abap-em-6-passos%2F&amp;title=Mudando%20a%20vida%20de%20um%20iniciante%20em%20ABAP%20em%206%20passos" id="wpa2a_18"><img src="http://abap101.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p><p>Ok, ok, muita pretensão achar que mudarei a sua vida, mas como também sou uma &#8220;SAP iniciante&#8221;, recebi algumas dicas, observei alguns pontos e gostariade compartilhá-los com vocês, pois podem não mudar a vida de um ABAP, mas certamente ajudarão muito aos que estão começando sua carreira agora!</p>
<p><strong><span id="more-2013"></span></strong></p>
<p><strong>Pergunte: </strong>É comum sentirmos receio em perguntar quando estamos iniciando em uma empresa e principalmente na área. Não estou dizendo para fazer perguntas do tipo: “<em>O que faz o ‘CONCATENATE?</em>’ (tente ao menos ler o help F1, ou joga no Google!), mas acredite, é muito melhor pedir ajuda para alguém mais experiente do que esperar o dia da entrega de sua OS e ter o programa pela metade porque você não entendeu como codificar o fieldcat do seu ALV, por exemplo. Se a empresa te contratou como <em>trainee </em>/ júnior, ela “sabe que você não sabe” e não espera que você desenvolva um programa super complexo, com milhões de linhas de código que revolucionará o mundo. Questionando, você demonstrará interesse, aprenderá muito mais rápido e principalmente, não sairá quebrando tudo.</p>
<p><strong>Tenha um caderno:</strong> Você deve estar pensando: “<em>Que absurdo, sou da área de TI e com toda a tecnologia disponível vou utilizar o velho caderno?”. </em>Sim! Eu, por exemplo, estou alocada em um cliente onde não tenho acesso ao meu e-mail pessoal, não posso utilizar <em>pendrive </em>e tampouco levar o notebook. O “X” daquestão, é ter um caderno onde você escreva as coisas que aprendeu de modo que consiga entendê-las e reproduzí-las novamente, independentemente do cliente em que esteja, da disponibilidade de internet, etc. Se você tiver disposição e tempo para digitar depois, ótimo! Fixará melhor e terá facilidade no momento da busca, mas não se esqueça que nem sempre poderá utilizar estes recursos.</p>
<p><strong>Não tenha medo do <em>DUMP</em></strong><em>: </em>Antes que você fique com “cara de <em>Dump</em>”, leia-o, tente entendê-lo. O <em>Dump </em>não é um bicho de sete cabeças, se você não fala inglês, joga no Google (olha ele aqui novamente, o Google pode ser um ABAP exemplar!). Não se apavore, é mais simples do que parece.</p>
<p><strong>Faça as coisas com calma: </strong>Haverá o dia em que você terá que fazer o trabalho de uma semana em um dia, mas conseguirá fazê-lo, pois seus conhecimentos estarão maduros o suficiente. Por enquanto, não queira dar passos maiores do que as pernas, faça seu trabalho com calma para minimizar a probabilidade de erros. No começo, é comum deixarmos escapar alguns detalhes, seja por falta de conhecimento ou experiência. Desta forma, não adianta pensar: “vou fazer correndo para mostrar eficiência”, pois a pessoa que estimou seu prazo, certamente conhece suas limitações e preferirá que você utilize o tempo que lhe foi dado a ter que fazer re-trabalhos.</p>
<p><strong>Tente entender os processos: </strong>Sei o quanto isso pode parecer difícil no começo. Mal entendemos de ABAP, como podemos entender os processos? Não tenha vergonha, pergunte para o funcional, se você entende o que e para que está programando, poderá propor melhorias, evitará re-trabalhos e amadurecerá profissionalmente.</p>
<p><strong>Seja curioso: </strong>Está ocioso? Estude programas existentes, entenda as sintaxes, debugue! Entender a solução de uma pessoa mais experiente, com certeza te ajudará a desenvolver a sua solução.</p>
<p>Bom, as dicas acima não foram técnicas e tampouco apresentaram conceitos de ABAP, mas certamente ajudarão aos que estão começando agora / recém formados em ABAP!</p>
<p>Se você tem mais dicas ou experiências como estas, deixe seus comentários!</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/01/26/mudando-vida-de-um-iniciante-em-abap-em-6-passos/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Desafios e Campeonatos de Programação</title>
		<link>http://abap101.com/2012/01/20/desafios-e-campeonatos-de-programacao/</link>
		<comments>http://abap101.com/2012/01/20/desafios-e-campeonatos-de-programacao/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 21:00:49 +0000</pubDate>
		<dc:creator>Fábio Pagoti</dc:creator>
				<category><![CDATA[Mercado]]></category>
		<category><![CDATA[Offtopic]]></category>
		<category><![CDATA[Opinião]]></category>
		<category><![CDATA[Tecnica de Programação]]></category>
		<category><![CDATA[acm icpm]]></category>
		<category><![CDATA[campeonato de programação]]></category>
		<category><![CDATA[code jam]]></category>
		<category><![CDATA[codechef]]></category>
		<category><![CDATA[coderchart]]></category>
		<category><![CDATA[codesprint]]></category>
		<category><![CDATA[complexidade de algoritmos]]></category>
		<category><![CDATA[cook up]]></category>
		<category><![CDATA[dementia]]></category>
		<category><![CDATA[desafios de programação]]></category>
		<category><![CDATA[facebook hacker cup]]></category>
		<category><![CDATA[imagine cup]]></category>
		<category><![CDATA[interviewstreet]]></category>
		<category><![CDATA[lógica de programação]]></category>
		<category><![CDATA[spoj]]></category>
		<category><![CDATA[timus]]></category>
		<category><![CDATA[top coder]]></category>
		<category><![CDATA[uva]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=1528</guid>
		<description><![CDATA[&#160; &#160; Você sabia que além do campeonato de ABAP inaugurado pelo ABAP101 um tempo atrás existem muitos campeonatos de programação mundo afora? Os organizadores vão desde universidades passando pelas gigantes Google e Microsoft até empresas especializadas. Além das competições, existem vários sites com desafios de programação &#8211; geralmente usados como preparação para os campeonatos ou [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/01/20/desafios-e-campeonatos-de-programacao/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/01/20/desafios-e-campeonatos-de-programacao/" data-text="Desafios e Campeonatos de Programação"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/01/20/desafios-e-campeonatos-de-programacao/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F01%2F20%2Fdesafios-e-campeonatos-de-programacao%2F&amp;linkname=Desafios%20e%20Campeonatos%20de%20Programa%C3%A7%C3%A3o" title="Google Gmail" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/gmail.png" width="16" height="16" alt="Google Gmail"/></a><a class="a2a_button_wordpress" href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F01%2F20%2Fdesafios-e-campeonatos-de-programacao%2F&amp;linkname=Desafios%20e%20Campeonatos%20de%20Programa%C3%A7%C3%A3o" title="WordPress" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F01%2F20%2Fdesafios-e-campeonatos-de-programacao%2F&amp;linkname=Desafios%20e%20Campeonatos%20de%20Programa%C3%A7%C3%A3o" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fabap101.com%2F2012%2F01%2F20%2Fdesafios-e-campeonatos-de-programacao%2F&amp;title=Desafios%20e%20Campeonatos%20de%20Programa%C3%A7%C3%A3o" id="wpa2a_20"><img src="http://abap101.com/wp-content/plugins/add-to-any/share_save_120_16.png" width="120" height="16" alt="Share"/></a></p><p>&nbsp;</p>
<div class="mceTemp mceIEcenter">
<dl id="attachment_1983">
<dt><img class="aligncenter" title="programador_abap_desafios_de_programacao" src="http://abap101.com/wp-content/uploads/2012/01/programador_abap_desafios_de_programacao.gif" alt="Programador ABAP" width="150" height="107" /></dt>
</dl>
</div>
<p>&nbsp;</p>
<p style="text-align: justify;">Você sabia que além do <a title="1º Campeonato de ABAP – Participe!" href="http://abap101.com/2011/10/02/1%c2%ba-campeonato-de-abap-participe/" target="_blank">campeonato de ABAP inaugurado pelo ABAP101 um tempo atrás </a>existem muitos campeonatos de programação mundo afora? Os organizadores vão desde universidades passando pelas gigantes Google e Microsoft até empresas especializadas. Além das competições, existem vários sites com desafios de programação &#8211; geralmente usados como preparação para os campeonatos ou como critério de seleção de candidatos.</p>
<p style="text-align: justify;">Este post além de citar as vantagens de participar em tais competiçōes, cita alguns campeonatos de programação bem como sites com desafios para preparação.</p>
<p style="text-align: justify;"><span id="more-1528"></span>Para muitos programar não é apenas uma ocupação mas sim um hobby ou até um vício. Aposto que muitos que estão lendo este post já ficaram ansiosos no trabalho enquanto programavam por quererem ir para casa programar algo mais interessante/divertido.</p>
<p style="text-align: justify;">Muitas faculdades participam de campeonatos de programação como forma de promover seus cursos e seus estudantes, ao passo que estes ganham visibilidade e experiência na área. A grande maioria dos campeonatos envolvem a solução de uma quantidade de desafios no menor tempo possível (na grande maioria das vezes os desafios tem um estilo acadêmico e voltado para matemática). O nível de complexidade dos exercícios pode variar absurdamente assim como o critério de avaliação para cada uma das soluçōes.</p>
<p style="text-align: justify;">Existem campeonatos nos quais a participação é individual e outros que você codifica em grupo (todos no mesmo computador). Um fato interessante é que programar em grupo pode muitas vezes não ser mais produtivo que programar sozinho, por isso é importantíssimo ter uma equipe bem preparada e entrosada. Vale lembrar que o algumas metodologias ágeis, como no caso da eXtreme Programming, a codificação é feita em pares. A grande maioria dos campeonatos é realizado com equipes de aproximadamente quatro pessoas. Campeonatos cuja participação é individual tendem a ter o propósito de recrutamento. A(s) linguagem de programação permitidas variam de campeonato para campeonato, todavia C, C++ e/ou Java são aceitos quase na totalidade dos casos.</p>
<p style="text-align: justify;">O que particularmente acho mais interessante nos desafios propostos é o critério de avaliação utilizado. Geralmente é necessário submeter seu código fonte para uma ferramenta que avaliará a sua solução. Essas ferramentas basicamente executam o programa criado para uma série de entradas (muitas vezes desconhecidas) e comparam com saídas desejadas. Além de comparar se as respostas fornecidas são corretas, as ferramentas de avaliação sempre analisam sua solução em termos de desempenho e consumo de memória. Caso durante a execução dos testes seu programa demore mais que um tempo limite ou utilize mais memória que o estabelecido, sua solução simplesmente é classificada como errada e você só é informado o porquê desta classificação, ou seja, o tempo limite para cada teste e o limite de memória muitas vezes não é fornecido.</p>
<p style="text-align: justify;">Dado a complexidade dos desafios, existem muitos sites que funcionam como repositórios de desafios de programação. Você encontra uma série de desafios, escolhe os quais deseja resolver e submete sua solução fazendo uploads dos arquivos criados. Em poucos instantes você recebe a resposta se sua solução foi bem sucedida ou não. Estes sites também possuem rankings como forma de avaliar quem está mais <del>viciado</del> bem preparado para os desafios.</p>
<p style="text-align: justify;">Garanto que participar de campeonatos é muito desafiador, divertido e recompensador, arrependo-me de não ter aproveitado esta experiência durante a universidade. O conhecimento de lógica de programação e complexidade de algoritmos evolui drasticamente, além de ser uma excelente forma de aprender uma nova linguagem (utilizada por muitos diga-se de passagem). Não obstante, você é submetido a trabalhar sob pressão por conta do tempo limite para solução dos desafios. Enfim, recomendo e muito. Caso você não esteja na faculdade ou simplesmente não tem interesse em participar de competiçōes, considere se cadastrar em algum(ns) dos repositórios de desafios. Eles são gratuitos e o trabalho não machuca nenhum pouco. <img src='http://abap101.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Confira abaixo os principais campeonatos e repositórios de desafios.</p>
<h2 style="text-align: justify;">Campeonatos de Programação</h2>
<ul>
<li><strong><a title="Google Code Jam" href="http://code.google.com/codejam/" target="_blank">Code Jam (Google)</a></strong> e a <strong><a title="Microsoft Imagine Cup" href="http://www.imaginecup.com/" target="_blank">Imagine Cup (Microsoft)</a></strong>: são sem dúvida os campeonatos de maior destaque mundial. Os prêmios são excelentes e a concorrência muito forte.</li>
</ul>
<ul>
<li><a title="Facebook Hacker Cup" href="http://www.facebook.com/hackercup" target="_blank">Facebook Hacker Cup</a>: Por ser realizado pela maior rede social do mundo, este campeonato tem tudo para estar entre os mais conhecidos mundialmente. A competição ocorre anualmente e amanhã (21 de Janeiro) começa sua segunda. edição.</li>
</ul>
<ul>
<li><a title="Maratona de Programação - IME/USP" href="http://maratona.ime.usp.br/" target="_blank">Matarona de Programação</a>: Realizada pelo IME/USP, esta é uma das principais competiçōes entre universidades. Este campeonato pode ser comparado como um &#8220;pré-olímpico&#8221; pois os vencedores vão para torneios mundiais de alto renome.</li>
</ul>
<ul>
<li><a title="ACM ICPM" href="http://cm.baylor.edu/welcome.icpc" target="_blank">ACM-ICPM</a>: A maior &#8220;olimpíadas&#8221; de programação entre universidades. Simplesmente o campeonato mais antigo e prestigiado de todos os tempos.</li>
</ul>
<ul>
<li><a title="TopCoder Open" href="http://community.topcoder.com/tco12/" target="_blank">TopCoder Open</a>: realizado pela comunidade TopCoder (veja mais detalhes abaixo), um campeonato completo de programação que não se limita a avaliar o melhor algoritmo.</li>
</ul>
<ul>
<li><a title="InterviewStreet CodeSprint" href="http://codesprint.interviewstreet.com/" target="_blank">InterviewStreet CodeSprint</a>: A start-up InterviewStreet ajuda outras start-ups e algumas modestas empresas como Apple, Facebook, Microsoft, Skype, Dropbox e Grupon a recrutar desenvolvedores e engenheiros de software. Ela promove um campeonato de programação chamado CodeSprint de tempos em tempos no qual você tem um final de semana inteiro para resolver uma série de desafios. Além da parceria com empresas que querem contratar, o interessante deste campeonato é a existência de desafios baseados em problemas reais de empresas e não apenas desafios acadêmicos sem muita utilização prática.</li>
</ul>
<ul>
<li><a title="Demantia - Survive the Coding Madness" href="http://www.codechef.com/DMNT2012" target="_blank">Dementia &#8211; Survive the Coding Madness</a>: Muito popular na Índia, China e outros países asiáticos, este campeonato é apoiado pela comunidade CodeChef e pela IBM e disponível apenas para estudantes.</li>
</ul>
<ul>
<li><a title="Cook-Of" href="http://www.codechef.com/COOK18" target="_blank">CodeChef Cook-Of</a>: competição mensal aberta a todos também realizada pela comunidade CodeChef.</li>
</ul>
<ul>
<li><a title="AI Challenge" href="http://aichallenge.org/" target="_blank">AI Challenge</a>: esta é uma competição focada em Inteligência Artificial apoiada pelo Google.</li>
</ul>
<ul>
<li><a title="Russian Code Cup" href="http://russiancodecup.ru/" target="_blank">Russian Code Cup</a>: Os russos são excelentes desenvolvedores. Se você consegue entender o site deste campeonato, por favor nos dê mais detalhes sobre o mesmo.</li>
</ul>
<h2 style="text-align: justify;">Repositórios de desafios de programação</h2>
<ul>
<li><a title="UVa Online Judge" href="http://uva.onlinejudge.org/" target="_blank">UVa (UVa Online Judge)</a>: utilizei este repositório durante minhas aulas de &#8220;Desafios de Programação&#8221; na universidade. Há uma infinidade de problemas nos mais diversos níveis de dificuldade. Você pode ver quantas vezes cada problema foi resolvido, quantas tentativas em média são necessárias para chegar na solução correta e quantas pessoas resolveram cada desafio. Além disso você encontra muita informação de livros sobre o assunto.</li>
</ul>
<ul>
<li><a title="ACM-ICPC Live Archive" href="http://livearchive.onlinejudge.org/index.php" target="_blank">ACM-ICPC Live Archive</a>: Muito parecido com o UVa, possui uma grande quantidade de problemas coletados desde 1988.</li>
</ul>
<ul>
<li><a title="TopCoder" href="http://www.topcoder.com/" target="_blank">TopCoder</a>: é covardia chamar este site de um simples repositório de desafios. O TopCoder é uma comunidade enorme com a nata de programadores de todo mundo e você é capaz de praticar muito mais do que programação incluindo arquitetura, <em>design</em>, testes, UI etc.</li>
</ul>
<ul>
<li><a title="CodeChef" href="http://www.codechef.com/" target="_blank">CodeChef</a>: uma grande comunidade assim como o TopCoder, muito famosa no oriente. Possui seus próprios campeonatos e é pouco conhecida por brasileiros. No momento, menos de 15 brasileiros cadastrados que resolveram no mínimo um desafio. Eles tem até uma badge com o programador do mês.</li>
</ul>
<ul>
<li><a title="CoderChart" href="http://codercharts.com/" target="_blank">CoderChart</a>: Com parceirias como o Google, este repositório lhe dá visibilidade para conseguir um emprego. Eles também tem prêmios especiais para participantes para que se destacam em uma dada linguagem.</li>
</ul>
<ul>
<li><a title="SPOJ" href="http://www.spoj.pl/" target="_blank">SPOJ (Sphere Online Judge)</a> e<a title="SPOJ Brasil" href="http://br.spoj.pl/" target="_blank"> SPOJ Brasil</a>: este repositório é bem conhecido e também tem uma grande variedade de desafios. A <del>comodidade</del> vantagem é sua versão em português, indiscutivelmente muito mais limitada. A desvantagem deste repositório fica por conta da cor pastel do background. Com toda certeza não há desafios envolvendo ergonomia nele.</li>
</ul>
<ul>
<li><a title="InterviewStreet Challenges" href="http://www.interviewstreet.com/recruit/challenges/" target="_blank">InterviewStreet Challenges</a>: O InterviewStreet (mencionados nos campeonatos) também possui um pequeno repositório de desafios. Há apenas alguns mas de boa complexidade. Aconselho caso deseje participar do campeonato da empresa.</li>
</ul>
<ul>
<li><a title="Timus Online Judge" href="http://acm.timus.ru/" target="_blank">Timus Online Judge</a>: O maior repositório de problemas da Rússia, mas que o ranking está repleto de chineses.</li>
</ul>
<ul>
<li><a title="PKU Online Judge" href="http://poj.org/" target="_blank" class="broken_link">PKU Online Judge</a>: Repositório da Universidade de Pequim, também está repleto de chineses.</li>
</ul>
<p style="text-align: justify;">Finalmente, se você ainda não foi convencido da utilidade destes desafios e competiçōes, leia o post &#8220;<a title="Onde Estará o Seu Currículo?" href="http://abap101.com/2011/07/23/onde-estara-o-seu-curriculo/" target="_blank">Onde Estará Seu Currículo</a>&#8220;, que discute sobre a tendência cada vez mais forte de desenvolvedores serem avaliados pelas linhas de código que já produziram do que pelas linhas de cursos e empresas que já passaram nos seus currículos. Garanto: isso vai chegar ao mundo ABAP mais cedo ou mais tarde (ou bem mais tarde mesmo) mas para mim e para outros entrevistadores que lêem este post, a tendência já chegou.</p>
<p style="text-align: justify;">Caso você conheça mais algum campeonato ou repositório por favor inclua ele nos comentários. Conte para nós se você já participou de algum campeonato e como foi a experiência. Caso utilize algum repositório de desafios, diga o que aprendeu com eles.</p>
<p style="text-align: justify;"><em>* Obrigado ao Prof. Luciano Digiampietri, Caio Santiago,@abhi9u, @shrivastavasitz, @mastersobg, @dmlicht e @codechef por me ajudarem a formar esta excelente lista de campeonatos e repositórios.</em></p>
<p style="text-align: justify;">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/01/20/desafios-e-campeonatos-de-programacao/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

