<?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</title>
	<atom:link href="http://abap101.com/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>SAP Inside Track Vancouver 2012 &#8211; Como foi e como é</title>
		<link>http://abap101.com/2012/04/18/sap-track-vancouver-2012-como-foi-como-e/</link>
		<comments>http://abap101.com/2012/04/18/sap-track-vancouver-2012-como-foi-como-e/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 12:30:10 +0000</pubDate>
		<dc:creator>Fábio Pagoti</dc:creator>
				<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Livro]]></category>
		<category><![CDATA[demo jam]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[qr code]]></category>
		<category><![CDATA[sap inside track]]></category>
		<category><![CDATA[sdn]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2392</guid>
		<description><![CDATA[Semana passada, mais especificamento no dia 12 de Abril tive a oportunidade de participar do SAP Inside Track Vancouver 2012. Gostaria de compartilhar detalhes do evento já que este evento também ocorre no Brasil. Para quem não sabe o SAP Inside Track é um evento aberto a comunidade e gratuito. Ano passado, participamos do evento [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/04/18/sap-track-vancouver-2012-como-foi-como-e/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/04/18/sap-track-vancouver-2012-como-foi-como-e/" data-text="SAP Inside Track Vancouver 2012 &#8211; Como foi e como é"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/04/18/sap-track-vancouver-2012-como-foi-como-e/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F04%2F18%2Fsap-track-vancouver-2012-como-foi-como-e%2F&amp;linkname=SAP%20Inside%20Track%20Vancouver%202012%20%E2%80%93%20Como%20foi%20e%20como%20%C3%A9" 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%2F18%2Fsap-track-vancouver-2012-como-foi-como-e%2F&amp;linkname=SAP%20Inside%20Track%20Vancouver%202012%20%E2%80%93%20Como%20foi%20e%20como%20%C3%A9" 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%2F18%2Fsap-track-vancouver-2012-como-foi-como-e%2F&amp;linkname=SAP%20Inside%20Track%20Vancouver%202012%20%E2%80%93%20Como%20foi%20e%20como%20%C3%A9" 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%2F18%2Fsap-track-vancouver-2012-como-foi-como-e%2F&amp;title=SAP%20Inside%20Track%20Vancouver%202012%20%E2%80%93%20Como%20foi%20e%20como%20%C3%A9" 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>Semana passada, mais especificamento no dia 12 de Abril tive a oportunidade de participar do <a title="SAP Inside Track Vancouver 2012" href="http://wiki.sdn.sap.com/wiki/display/events/SAP+Inside+Track+Vancouver+2012" target="_blank">SAP Inside Track Vancouver 2012</a>. Gostaria de compartilhar detalhes do evento já que este evento também ocorre no Brasil.</p>
<p>Para quem não sabe o SAP Inside Track é um evento aberto a comunidade e gratuito. Ano passado, participamos do evento realizado em São Paulo e em <a title="SAP Inside Track São Leopoldo 2011 – De Volta Para Casa" href="http://abap101.com/2011/12/03/sitsl2011_de_volta_para_casa/" target="_blank">São Leopoldo</a>. Nele são apresentados novas tecnologias, tendências de mercado, demonstrações de produtos e outras atividades bem interessantes. No caso do evento em Vancouver, o tema foi mobilidade. Como o número de vagas é limitado, não hesitei quando li na SDN o anúncio do evento, 2 meses antes do mesmo. Sugiro o mesmo caso queira participar do evento no Brasil. Por isso, <a title="Faça parte da SDN!" href="http://abap101.com/2011/01/07/faca-parte-da-sdn/" target="_blank">fique sempre ligado na SDN</a> e leia os newsletters.</p>
<p><span id="more-2392"></span></p>
<h3>Registro</h3>
<p>Ao fazer o registro, recebi um ticket virtual no EventBrite em forma de <a title="QR Code" href="http://en.wikipedia.org/wiki/QR_code" target="_blank">QR Code</a>. Para entrar no evento, bastei apenas mostrá-lo a partir do meu celular. A questão da mobilidade já estava presente antes de entrar no prédio da SAP, mostrado na imagem abaixo. Ainda na entrada foram distribuídas senhas para usar a rede wireless durante o evento, algo que seria muito importante.</p>
<p><img class="aligncenter size-large wp-image-2397" title="p_1329259537" src="http://abap101.com/wp-content/uploads/2012/04/p_1329259537-1024x768.jpg" alt="" width="1024" height="768" /></p>
<h3>Abertura e Quebra-Gelo</h3>
<p>Como de praxe, durante a abertura do evento foi mencionada a nova SCN e a importância da mesma. Alguns números bem surpreendentes quanto a comunidade foram mostrados para demonstrar sua importância. Após isso houve uma atividade quebra-gelo que foi uma excelente oportunidade para fazer networking com os demais participantes. Foi nos dado uma espécie de cartela de bingo e canetas. Em cada quadrado da cartela havia uma afirmação referente a diversos assuntos (estilo de vida, esportes, vida profissional, hobbies, gostos etc). A atividade consistia em colecionar assinaturas dos participantes que tinham alguma das afirmações na cartela como verdade. Por exemplo, um dos quadrados continha a frase &#8220;Prefiro Pepsi a Coca-Cola&#8221;. Os primeiros a completar a cartela ganhariam algumas camisas, os primeiros prêmios dos muitos que foram distruibuídos. Após 30 minutos eu estava carregado de cartões de contato e tinha conversado não só com pessoas que trabalham na SAP, mas também com consultores, responsáveis em empresas sem fins lucrativos, estudantes etc. Esta com certeza uma das grandes vantagens de participar de qualquer tipo de evento: conhecer pessoas.</p>
<h3>Palestras</h3>
<p>As palestras (veja a lista na página da SCN sobre o SAP Inside Track Vancouver) foram bem voltadas ao mercado. Nada muito técnico foi abordado e siglas diversas foram distribuídas, algo que para alguém que não trabalha com mobile como eu, faz você se perder sobre o assunto. De toda maneira, as palestras foram dadas por pessoas que encabeçam assuntos relacionados com mobile dentro da SAP. Algo que merece destaque foi uma demonstração ao vivo do Afaria durante uma das palestras usando celulares dos participantes.</p>
<h3>Demo Jam</h3>
<p>O que para muitos é o ápice do evento, o Demo Jam foi marcado por muitos risos e descontração. Nele participantes (a maioria funcionário da SAP &#8211; apesar de ser aberto para qualquer um no evento) demonstraram seu trabalho usando tecnologias relacionadas com mobile. Foi interessante ver que um dos participantes que não tem formação em TI e não trabalha em um departamento técnico apresentou um trabalho bem interessante para localizar bebedouros em Vancouver usando o GPS. Cada um teve 5 minutos para apresentar seu trabalho e no final a votação para decidir o vencedor foi realizada pelo público, para variar, usando celulares e smartphones. O vencedor tinha que escolher seu prêmio entre um blackberry ou um playbook.</p>
<h3>Prêmios e Brindes</h3>
<p>No fim, uma grande quantidade de brindes foi sorteada. Todos os brindes tinham uma relação com mobile indo desde a ipod nanos e shuffes até luvas especiais para usar telas touch screen. Fui sorteado e acabei ganhando um case para playbook.</p>
<h3>Patrocínio + Desconto</h3>
<p>O evento foi patrocinado pela SAP Press. Foram distribuídos panfletos que continham <strong>cupons de 10% desconto para livros na SAP Press</strong> validos até o dia 30 de Abril. Você também pode utilizar o cupon para a compra de qualquer livro na SAP Press. Para isso basta apenas usar o código <strong>SITVAN12</strong> ao fazer checkout da sua compra.</p>
<h3>Participe!</h3>
<p>Reforço a importância e os benefícios do evento. Se você tiver a oportunidade de participar de um evento como o SAP Inside Track, não fique de fora.</p>
<p>Veja algumas fotos do evento <a title="Fotos SAP Inside Track Vancouver 2012" href="https://plus.google.com/photos/116809984973126677878/albums/5731792310137143425" target="_blank">aqui</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/04/18/sap-track-vancouver-2012-como-foi-como-e/feed/</wfw:commentRss>
		<slash:comments>0</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_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>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_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>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_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>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_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>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_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>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_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 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_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>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>Jornais Eletrônicos de SAP &#8211; SAP Daily &#8211; SAP Affinity Group</title>
		<link>http://abap101.com/2012/01/30/jornais-eletronicos-de-sap-sap-daily-sap-affinity-group/</link>
		<comments>http://abap101.com/2012/01/30/jornais-eletronicos-de-sap-sap-daily-sap-affinity-group/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 11:30:59 +0000</pubDate>
		<dc:creator>Fábio Pagoti</dc:creator>
				<category><![CDATA[Newsletter]]></category>
		<category><![CDATA[Offtopic]]></category>
		<category><![CDATA[jornal eletrônico]]></category>
		<category><![CDATA[newsletter]]></category>
		<category><![CDATA[notícia]]></category>
		<category><![CDATA[sap]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=1530</guid>
		<description><![CDATA[Já ouviu falar de um jornal de SAP? Pois é&#8230; não só existe um como vários. Você conhece algum? Leia o post por completo caso queira saber mais a respeito. &#160; &#160; Outro dia achei pelo twitter um jornal eletrônico no paper.li que fala sobre SAP. É o SAP Affinity Group Daily, ele contém informações sobre [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/01/30/jornais-eletronicos-de-sap-sap-daily-sap-affinity-group/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/01/30/jornais-eletronicos-de-sap-sap-daily-sap-affinity-group/" data-text="Jornais Eletrônicos de SAP &#8211; SAP Daily &#8211; SAP Affinity Group"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/01/30/jornais-eletronicos-de-sap-sap-daily-sap-affinity-group/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F01%2F30%2Fjornais-eletronicos-de-sap-sap-daily-sap-affinity-group%2F&amp;linkname=Jornais%20Eletr%C3%B4nicos%20de%20SAP%20%E2%80%93%20SAP%20Daily%20%E2%80%93%20SAP%20Affinity%20Group" 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%2F30%2Fjornais-eletronicos-de-sap-sap-daily-sap-affinity-group%2F&amp;linkname=Jornais%20Eletr%C3%B4nicos%20de%20SAP%20%E2%80%93%20SAP%20Daily%20%E2%80%93%20SAP%20Affinity%20Group" 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%2F30%2Fjornais-eletronicos-de-sap-sap-daily-sap-affinity-group%2F&amp;linkname=Jornais%20Eletr%C3%B4nicos%20de%20SAP%20%E2%80%93%20SAP%20Daily%20%E2%80%93%20SAP%20Affinity%20Group" 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%2F30%2Fjornais-eletronicos-de-sap-sap-daily-sap-affinity-group%2F&amp;title=Jornais%20Eletr%C3%B4nicos%20de%20SAP%20%E2%80%93%20SAP%20Daily%20%E2%80%93%20SAP%20Affinity%20Group" 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>Já ouviu falar de um jornal de SAP? Pois é&#8230; não só existe um como vários. Você conhece algum? Leia o post por completo caso queira saber mais a respeito.</p>
<p style="text-align: center;">&nbsp;</p>
<p style="text-align: center;"><img class="size-full wp-image-1584" title="paper_li" src="http://abap101.com/wp-content/uploads/2011/10/paper_li.jpg" alt="" width="431" height="378" /></p>
<p style="text-align: center;">&nbsp;</p>
<p style="text-align: center;"><span id="more-1530"></span></p>
<p>Outro dia achei pelo twitter um jornal eletrônico no <a title="Paper.li" href="http://paper.li/" target="_blank">paper.li</a> que fala sobre SAP. É o <a title="SAP Affinity Group" href="http://paper.li/SAPAffinityGrp" target="_blank">SAP Affinity Group Daily</a>, ele contém informações sobre SAP dos mais diversos assuntos: Negócio, tecnologia, educação etc.. como qualquer outro jornal. Outro jornal com bastante conteúdo no paper.li de SAP é o <a title="The #SAP Daily" href="http://paper.li/tag/SAP" target="_blank">The #SAP Daily</a>.</p>
<p>O mais legal dos jornais no paper.li é que você consegue facilmente assinar o seu newsletter. Este é uma das poucas fontes de informação fora SCN que considero boa. Vale a pena conferir.</p>
<p>Você também consegue acompanhar o SAP Affinity Group <a title="SAP Affinity Group Twitter" href="http://twitter.com/#!/SAPAffinityGrp" target="_blank">via twitter</a>.</p>
<p>Para comentar: quais outras fontes além da SCN você considera relevante no mundo SAP/ABAP?</p>
<p>Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/01/30/jornais-eletronicos-de-sap-sap-daily-sap-affinity-group/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

