<?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>Fri, 17 Aug 2012 12:30:27 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>[Humor] Keep Calm and Call the ABAPer</title>
		<link>http://abap101.com/2012/08/17/humor-calm-and-call-the-abaper/</link>
		<comments>http://abap101.com/2012/08/17/humor-calm-and-call-the-abaper/#comments</comments>
		<pubDate>Fri, 17 Aug 2012 12:30:27 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[Offtopic]]></category>
		<category><![CDATA[humor keep calm abaper]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2592</guid>
		<description><![CDATA[Para mantermos a sanidade, um pouco de humor para o final de semana, com os créditos para o Custódio de Oliveira, obrigado @zcust01! &#160; &#160;]]></description>
				<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/08/17/humor-calm-and-call-the-abaper/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/08/17/humor-calm-and-call-the-abaper/" data-text="[Humor] Keep Calm and Call the ABAPer"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/08/17/humor-calm-and-call-the-abaper/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F08%2F17%2Fhumor-calm-and-call-the-abaper%2F&amp;linkname=%5BHumor%5D%20Keep%20Calm%20and%20Call%20the%20ABAPer" 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%2F08%2F17%2Fhumor-calm-and-call-the-abaper%2F&amp;linkname=%5BHumor%5D%20Keep%20Calm%20and%20Call%20the%20ABAPer" 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%2F08%2F17%2Fhumor-calm-and-call-the-abaper%2F&amp;linkname=%5BHumor%5D%20Keep%20Calm%20and%20Call%20the%20ABAPer" 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%2F08%2F17%2Fhumor-calm-and-call-the-abaper%2F&amp;title=%5BHumor%5D%20Keep%20Calm%20and%20Call%20the%20ABAPer" 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>Para mantermos a sanidade, um pouco de humor para o final de semana, com os créditos para o Custódio de Oliveira, obrigado <a href="https://twitter.com/zcust01">@zcust01</a>!</p>
<p><span id="more-2592"></span></p>
<div id="attachment_2594" class="wp-caption aligncenter" style="width: 610px"><a href="http://abap101.com/wp-content/uploads/2012/08/keep_calm_blue.png"><img class="size-full wp-image-2594" title="keep_calm_blue" src="http://abap101.com/wp-content/uploads/2012/08/keep_calm_blue.png" alt="" width="600" height="700" /></a><p class="wp-caption-text">Keep Calm and Call de ABAPer</p></div>
<p>&nbsp;</p>
<div id="attachment_2593" class="wp-caption aligncenter" style="width: 610px"><a href="http://abap101.com/wp-content/uploads/2012/08/keep_calm_white.jpeg"><img class="size-full wp-image-2593" title="keep_calm_white" src="http://abap101.com/wp-content/uploads/2012/08/keep_calm_white.jpeg" alt="" width="600" height="700" /></a><p class="wp-caption-text">Keep Calm and Call de ABAPer</p></div>
<div id="attachment_2595" class="wp-caption aligncenter" style="width: 618px"><a href="http://abap101.com/wp-content/uploads/2012/08/keep_calm_red.jpg"><img class="size-full wp-image-2595" title="keep_calm_red" src="http://abap101.com/wp-content/uploads/2012/08/keep_calm_red.jpg" alt="" width="608" height="870" /></a><p class="wp-caption-text">Keep Calm and /H na MIRO</p></div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/08/17/humor-calm-and-call-the-abaper/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[Vídeo] Introdução ao Agile Scrum</title>
		<link>http://abap101.com/2012/08/13/video-introducao-ao-agile-scrum/</link>
		<comments>http://abap101.com/2012/08/13/video-introducao-ao-agile-scrum/#comments</comments>
		<pubDate>Mon, 13 Aug 2012 13:23:21 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[Além de ABAP]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[ontime]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2573</guid>
		<description><![CDATA[Vídeo muito interessante sobre Scrum. Em inglês.]]></description>
				<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/08/13/video-introducao-ao-agile-scrum/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/08/13/video-introducao-ao-agile-scrum/" data-text="[Vídeo] Introdução ao Agile Scrum"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/08/13/video-introducao-ao-agile-scrum/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F08%2F13%2Fvideo-introducao-ao-agile-scrum%2F&amp;linkname=%5BV%C3%ADdeo%5D%20Introdu%C3%A7%C3%A3o%20ao%20Agile%20Scrum" 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%2F08%2F13%2Fvideo-introducao-ao-agile-scrum%2F&amp;linkname=%5BV%C3%ADdeo%5D%20Introdu%C3%A7%C3%A3o%20ao%20Agile%20Scrum" 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%2F08%2F13%2Fvideo-introducao-ao-agile-scrum%2F&amp;linkname=%5BV%C3%ADdeo%5D%20Introdu%C3%A7%C3%A3o%20ao%20Agile%20Scrum" 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%2F08%2F13%2Fvideo-introducao-ao-agile-scrum%2F&amp;title=%5BV%C3%ADdeo%5D%20Introdu%C3%A7%C3%A3o%20ao%20Agile%20Scrum" 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>Vídeo muito interessante sobre Scrum. Em inglês.<br />
<iframe src="http://www.youtube.com/embed/XU0llRltyFM" frameborder="0" width="640" height="360"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/08/13/video-introducao-ao-agile-scrum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Criando Objetos / Chamando Métodos Dinamicamente</title>
		<link>http://abap101.com/2012/07/20/criando-objetos-chamando-metodos-dinamicamente/</link>
		<comments>http://abap101.com/2012/07/20/criando-objetos-chamando-metodos-dinamicamente/#comments</comments>
		<pubDate>Fri, 20 Jul 2012 13:27:20 +0000</pubDate>
		<dc:creator>Claudia Andressa</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[ABAP Objects]]></category>
		<category><![CDATA[chamada dinâmica]]></category>
		<category><![CDATA[dinamico]]></category>
		<category><![CDATA[objetos]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2532</guid>
		<description><![CDATA[Na busca pela solução de um problema, debugando, debugando e debugando novamente, me deparei com a criação dinâmica de objetos. Estudando mais a fundo, eis que surge assunto para mais um post! Afinal, quanto mais dinâmicos forem os programas e API´s, melhor será sua performance e re-usabilidade. O que faz com que consigamos criar o [...]]]></description>
				<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/07/20/criando-objetos-chamando-metodos-dinamicamente/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/07/20/criando-objetos-chamando-metodos-dinamicamente/" data-text="Criando Objetos / Chamando Métodos Dinamicamente"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/07/20/criando-objetos-chamando-metodos-dinamicamente/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F07%2F20%2Fcriando-objetos-chamando-metodos-dinamicamente%2F&amp;linkname=Criando%20Objetos%20%2F%20Chamando%20M%C3%A9todos%20Dinamicamente" 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%2F07%2F20%2Fcriando-objetos-chamando-metodos-dinamicamente%2F&amp;linkname=Criando%20Objetos%20%2F%20Chamando%20M%C3%A9todos%20Dinamicamente" 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%2F07%2F20%2Fcriando-objetos-chamando-metodos-dinamicamente%2F&amp;linkname=Criando%20Objetos%20%2F%20Chamando%20M%C3%A9todos%20Dinamicamente" 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%2F07%2F20%2Fcriando-objetos-chamando-metodos-dinamicamente%2F&amp;title=Criando%20Objetos%20%2F%20Chamando%20M%C3%A9todos%20Dinamicamente" 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>Na busca pela solução de um problema, debugando, debugando e debugando novamente, me deparei com a criação dinâmica de objetos.</p>
<p>Estudando mais a fundo, eis que surge assunto para mais um post! Afinal, quanto mais dinâmicos forem os programas e API´s, melhor será sua performance e re-usabilidade.</p>
<p>O que faz com que consigamos criar o objeto / chamar o método dinamicamente, é a utilização de uma tabela, na qual informamos todos os parâmetros necessários (seja de <em>importing</em>, <em>exporting</em>, <em>changing</em>, etc), ou seja, podemos popular esta tabela de acordo com nossa necessidade em determinado ponto do programa.</p>
<p><span id="more-2532"></span></p>
<p>Utilizei como exemplo, a criação de um objeto com referência à classe ‘<strong>CL_GUI_ALV_GRID</strong>’, o qual chamei de<em><strong> r_grid</strong>.</em></p>
<p>Para facilitar o entendimento, segue abaixo o Pattern (modelo) da criação estática deste objeto:</p>
<p>&nbsp;</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;">CREATE OBJECT</span> r_grid
    <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">EXPORTING</span>
<span style="color: #339933;">*      i_shellstyle      = 0</span>
<span style="color: #339933;">*      i_lifetime        =</span>
      i_parent          <span style="color: #800080;">=</span> r_container
<span style="color: #339933;">*      i_appl_events     = space</span>
<span style="color: #339933;">*      i_parentdbg       =</span>
<span style="color: #339933;">*      i_applogparent    =</span>
<span style="color: #339933;">*      i_graphicsparent  =</span>
<span style="color: #339933;">*      i_name            =</span>
<span style="color: #339933;">*      i_fcat_complete   = space</span>
<span style="color: #339933;">*    EXCEPTIONS</span>
<span style="color: #339933;">*      error_cntl_create = 1</span>
<span style="color: #339933;">*      error_cntl_init   = 2</span>
<span style="color: #339933;">*      error_cntl_link   = 3</span>
<span style="color: #339933;">*      error_dp_create   = 4</span>
<span style="color: #339933;">*      others            = 5.</span></pre></div></div>

<p>OBS: o objeto <em><strong>r_container</strong> </em>é do ripo <strong>CL_GUI_CUSTOM_CONTAINER</strong> , criado estaticamente no código abaixo.</p>
<p>Vamos criar o objeto apenas informando o parâmetro obrigatório ‘I_PARENT’, e para isso, utilizaremos uma <em>workarea</em> do tipo <strong><em>abap</em>_<em>parmbind</em></strong>, e uma tabela tipo <strong><em>abap_parmbind_tab</em></strong>, denominadas <strong><em>lwa_param</em> </strong>e <strong><em>lt_param</em> </strong>respectivamente.</p>
<p>Na propriedade ‘Name’ sempre informaremos o parâmetro, neste caso ‘I_PARENT’.</p>
<p>Na propriedade ‘Kind’, o tipo (Exporting, conforme modelo estático).</p>
<p>Para informar o tipo, precisamos utilizar os atributos da classe ‘CL_ABAP_OBJECTDESCR’, com isso, teremos:</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;">lwa_param<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">kind</span> <span style="color: #800080;">=</span> cl_abap_objectdescr<span style="color: #808080;">=&gt;</span><span style="color: #202020;">exporting</span><span style="color: #808080;">.</span></pre></div></div>

<p>Por fim, necessitamos informar o valor atribuído a este parâmetro, e conforme podemos verificar no código abaixo, o valor é o objeto r_container (objeto de referência a classe CL_GUI_CUSTOM_CONTAINER).</p>
<p>Desta forma, necessitamos incluir a referência do objeto na tabela:</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;">GET</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">REFERENCE</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">OF</span> r_container <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">INTO</span> lwa_param<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">value</span><span style="color: #808080;">.</span></pre></div></div>

<p>Agora é só inserirmos nossa <em>workarea</em> na tabela e criarmos o objeto / chamarmos o método (não se esqueça de utilizar o try-catch, de forma a tratar possíveis exceções).</p>
<p>Obs: Verifique a sintax de chamada do método / criação do objeto. Observe que cria-se o objeto do tipo de uma classe (informada na variável lv_type) com os parâmetros inseridos na tabela.</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;">REPORT</span>  z_create_dinnam<span style="color: #808080;">.</span>
&nbsp;
  <span style="color: #cc4050; text-transform: uppercase; font-weight: bold; zzz:data;">TYPE-POOLS</span><span style="color: #808080;">:</span> abap<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> lt_param   <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">TYPE</span> abap_parmbind_tab<span style="color: #808080;">,</span>
        lwa_param  <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">TYPE</span> abap_parmbind<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> lv_type    <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;">string</span><span style="color: #808080;">,</span>
        lv_exc_txt <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;">string</span><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_except    <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> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">cx_root</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_container <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_custom_container<span style="color: #808080;">.</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">CLEAR</span><span style="color: #808080;">:</span>   lt_param<span style="color: #808080;">,</span> lwa_param<span style="color: #808080;">,</span> lv_type<span style="color: #808080;">,</span> lv_exc_txt<span style="color: #808080;">.</span>
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">REFRESH</span><span style="color: #808080;">:</span> lt_param<span style="color: #808080;">.</span>
&nbsp;
<span style="color: #339933;">*--------------------------------------------------------------------*</span>
<span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">START-OF-SELECTION</span><span style="color: #808080;">.</span>
&nbsp;
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">CREATE OBJECT</span> r_container
    <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">EXPORTING</span>
      container_name              <span style="color: #800080;">=</span> <span style="color: #4da619;">'CONTAINER_1'</span>
    <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">EXCEPTIONS</span>
      cntl_error                  <span style="color: #800080;">=</span> <span style="color: #3399ff;">1</span>
      cntl_system_error           <span style="color: #800080;">=</span> <span style="color: #3399ff;">2</span>
      create_error                <span style="color: #800080;">=</span> <span style="color: #3399ff;">3</span>
      lifetime_error              <span style="color: #800080;">=</span> <span style="color: #3399ff;">4</span>
      lifetime_dynpro_dynpro_link <span style="color: #800080;">=</span> <span style="color: #3399ff;">5</span>
      <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">OTHERS</span>                      <span style="color: #800080;">=</span> <span style="color: #3399ff;">6</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>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: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">CLASS</span> cl_abap_objectdescr <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">DEFINITION</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">LOAD</span><span style="color: #808080;">.</span>
&nbsp;
  lv_type <span style="color: #800080;">=</span> <span style="color: #4da619;">'CL_GUI_ALV_GRID'</span><span style="color: #808080;">.</span>
&nbsp;
  lwa_param<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">name</span> <span style="color: #800080;">=</span> <span style="color: #4da619;">'I_PARENT'</span><span style="color: #808080;">.</span>
  lwa_param<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">kind</span> <span style="color: #800080;">=</span> cl_abap_objectdescr<span style="color: #800080;">=</span><span style="color: #808080;">&amp;</span>gt;exporting<span style="color: #808080;">.</span>
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">GET REFERENCE</span> <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">OF</span> r_container <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">INTO</span> lwa_param<span style="color: #808080;">-</span><span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">value</span><span style="color: #808080;">.</span>
  <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">INSERT</span> lwa_param <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> lt_param<span style="color: #808080;">.</span>
&nbsp;
<span style="color: #339933;">*--------------------------------------------------------------------*</span>
&nbsp;
  <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">TRY</span> <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;">TYPE</span>
          <span style="color: #808080;">&#40;</span>lv_type<span style="color: #808080;">&#41;</span>
        <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">PARAMETER-TABLE</span>
          lt_param<span style="color: #808080;">.</span>
&nbsp;
    <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">CATCH</span> cx_sy_create_object_error <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">INTO</span> r_except<span style="color: #808080;">.</span>
      lv_exc_txt <span style="color: #800080;">=</span> r_except<span style="color: #808080;">-&amp;</span>gt;get_text<span style="color: #808080;">&#40;</span> <span style="color: #808080;">&#41;</span><span style="color: #808080;">.</span>
      <span style="color: #005066; text-transform: uppercase; font-weight: bold; zzz:statement;">MESSAGE</span> lv_exc_txt <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>
&nbsp;
  <span style="color: #000066; text-transform: uppercase; font-weight: bold; zzz:control;">ENDTRY</span><span style="color: #808080;">.</span></pre></div></div>

<p>Fica o desafio: que tal chamar um método dinamicamente e utilizar uma tabela de excessão? Ela funciona da mesma maneira para recuperar as exceções lançadas pelos métodos. Pesquise, tente fazer e em caso de dúvidas, entre em contato!</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/07/20/criando-objetos-chamando-metodos-dinamicamente/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recursividade em ABAP</title>
		<link>http://abap101.com/2012/06/25/recursividade-em-abap/</link>
		<comments>http://abap101.com/2012/06/25/recursividade-em-abap/#comments</comments>
		<pubDate>Mon, 25 Jun 2012 11:30:58 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[Tecnica de Programação]]></category>
		<category><![CDATA[exponenciação]]></category>
		<category><![CDATA[lista técnica]]></category>
		<category><![CDATA[recursão]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2514</guid>
		<description><![CDATA[Uma das técnicas de programação mais incompreendida e evitada, também é umas das mais poderosas, a Recursividade. Eu precisei usar a recursividade apenas uma única vez na vida com ABAPer e o resultado foi muito interessante. Nesse texto eu vou resolver um problema muito simples usando recursividade, exponenciação. Exponenciação De acordo com  a Wikipédia: Exponenciação [...]]]></description>
				<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/06/25/recursividade-em-abap/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/06/25/recursividade-em-abap/" data-text="Recursividade em ABAP"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/06/25/recursividade-em-abap/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F06%2F25%2Frecursividade-em-abap%2F&amp;linkname=Recursividade%20em%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%2F06%2F25%2Frecursividade-em-abap%2F&amp;linkname=Recursividade%20em%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%2F06%2F25%2Frecursividade-em-abap%2F&amp;linkname=Recursividade%20em%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%2F06%2F25%2Frecursividade-em-abap%2F&amp;title=Recursividade%20em%20ABAP" 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>Uma das técnicas de programação mais incompreendida e evitada, também é umas das mais poderosas, a Recursividade. Eu precisei usar a recursividade apenas uma única vez na vida com ABAPer e o resultado foi muito interessante.</p>
<p>Nesse texto eu vou resolver um problema muito simples usando recursividade, exponenciação.</p>
<h3><span id="more-2514"></span>Exponenciação</h3>
<p>De acordo com  a <a href="http://pt.wikipedia.org/wiki/Exponencia%C3%A7%C3%A3o">Wikipédia</a>:</p>
<blockquote><p>Exponenciação ou potenciação é uma operação matemática, escrita como <em>An</em>, envolvendo dois números: a <strong>base</strong> a e o <strong>expoente</strong> n. Quando n é um número natural maior do que 1, a potência an indica a multiplicação da base a por ela mesma tantas vezes quanto indicar o expoente n.</p></blockquote>
<p><img class="aligncenter" title="Fórmula para exponenciação" src="http://upload.wikimedia.org/wikipedia/pt/math/6/0/9/6097db666f2825c4eb94ecb7d6300078.png" alt="" width="143" height="40" /></p>
<p>A fórmula da exponenciação é simples e por isso considero um exemplo legal para mostrar a recursividade em prática.</p>
<h3>Exponenciação Usando Recursividade</h3>
<p>No ABAP você pode usar o operador ** para fazer a exponenciação e resolver todo o problema em uma linha (veja no programa abaixo), mas esse post não é sobre exponenciação, mas recursividade.</p>
<p>Novamente da <a href="http://pt.wikipedia.org/wiki/Recursividade">Wikipédia</a>:</p>
<blockquote><p> A recursão é o processo pelo qual passa um certo procedimento quando um dos passos do procedimento em questão envolve a repetição completa deste mesmo procedimento. Um procedimento que se utiliza da recursão é dito recursivo. Também é dito recursivo qualquer objeto que seja resultado de um procedimento recursivo.</p></blockquote>
<p>Em ABAP claro significa uma subrotina (form, módulo de função ou método) que efetua uma chamada dela mesmo.</p>
<p>Por exemplo, usando a recursão para resolver um problema de potência, farei com que o método EXECUTE_EXPONENTIATION( ) seja chamado inúmeras vezes por ele mesmo, de acordo com o expoente passado para ele como parâmetro.</p>
<p>Também poderíamos usar a estrutura de loop DO n TIMES &#8230; ENDDO, mas aí não seria recursão.</p>
<p>Veja o programa abaixo:</p>
<p><a href="https://gist.github.com/2983347">ZABAP101_RECURSION</a><br />
<script type="text/javascript" src="https://gist.github.com/2983347.js?file=gistfile1.txt"></script></p>
<p>Execute esse programa no modo debug e veja a pilha de chamada. Veja que o método se repete várias vezes indicando que ele fora chamado de dentro dele mesmo, caracterizando uma recursividade:</p>
<div id="attachment_2516" class="wp-caption aligncenter" style="width: 736px"><a href="http://abap101.com/wp-content/uploads/2012/06/recursividade1.jpg"><img class=" wp-image-2516 " title="recursividade1" src="http://abap101.com/wp-content/uploads/2012/06/recursividade1.jpg" alt="" width="726" height="354" /></a><p class="wp-caption-text">Pilha de chamadas do método EXECUTE_EXPONENTIATION( ) &#8211; Recursividade</p></div>
<p>A primeira linha do método incrementa o atributo INTERECTION, daí o método chama ele mesmo se a interação for menor ou igual ao expoente. Com isso a pilha (stack) vai sendo adicionada a cada nova chamada até que o número máximo de iterações (expoente) seja alcançado.</p>
<p>A pilha pára de ser incrementada e o restante do método começa a ser chamado, a partir do item da pilha mais novo (LIFO, Last In First Out), onde finalmente a multiplicação é feita e sendo acumulada no atributo POWER.</p>
<h3>Explosão de Lista Técnica</h3>
<p>Existem problemas em que a recursividade é quase que obrigatória, no caso da chamada explosão de lista técnica.</p>
<p>Imagine que você precise saber o custo de algum material que é composto por outros materiais, como por exemplo um notebook.</p>
<div id="attachment_2519" class="wp-caption aligncenter" style="width: 622px"><a href="http://abap101.com/wp-content/uploads/2012/06/recursividade2.jpg"><img class=" wp-image-2519   " title="recursividade2" src="http://abap101.com/wp-content/uploads/2012/06/recursividade2.jpg" alt="" width="612" height="760" /></a><p class="wp-caption-text">Partes de notebook &#8211; <a href="http://www.laptoppartsexpert.com/c-91554-gateway-laptop-parts-gateway-nv-parts-gateway-nv52.html">fonte imagem</a></p></div>
<p>Um notebook pode ser um materia formado por teclado, display LCD, HD, placa-mãe, memórias, carcaça etc.</p>
<p>O teclado é formado por uma base, uma tecla Q, outra W, outra E, outra R, outra T etc.</p>
<p>Um HD é formado por um conjundo de discos magnéticos, placa de controle e sistema de leitura,</p>
<p>Um sistema de leitura é formado por um braço de leitura, cabeçote de leitura e placa de leitura.</p>
<p>E assim por diante.</p>
<p>Se eu tivesse uma rotina que dado um material ele me retornasse uma lista de materais que formam esse material, eu precisaria chamar essa rotina n vezes, conforme eu fosse &#8220;desmontando&#8221; ou &#8220;explodindo&#8221; meu material.</p>
<p>Dessa maneira a haveria a recursividade como exemplificado no exemplo do notebook, resolvendo o problema muito rapidamente.</p>
<p>Claro que nem tudo são flores. Depurar um programa que usa recursividade é muito trabalhoso, bem como entender a recursividade que outra pessoa desenvolveu. Isso faz com que a recursão seja evitada, mas em alguns casos é a melhor forma de resolver um problema.</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/06/25/recursividade-em-abap/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Aplicação do Design Pattern: Factory</title>
		<link>http://abap101.com/2012/06/06/aplicacao-design-pattern-factory/</link>
		<comments>http://abap101.com/2012/06/06/aplicacao-design-pattern-factory/#comments</comments>
		<pubDate>Wed, 06 Jun 2012 11:00:08 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[Tecnica de Programação]]></category>
		<category><![CDATA[code coaching]]></category>
		<category><![CDATA[design pattern]]></category>
		<category><![CDATA[factory]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[padrão de projetos]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2478</guid>
		<description><![CDATA[Depois de falarmos do Singleton, está na hora de falarmos de outro padrão de projeto, o Factory. O Factory é mais difícil de entender do que o Singleton. Mais do que isso, mais difícil de mostrar alguma aplicação prática. Nesse post eu mostrarei as duas coisas, explicar o funcionamento do Factory, bem como sua aplicação. [...]]]></description>
				<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/06/06/aplicacao-design-pattern-factory/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/06/06/aplicacao-design-pattern-factory/" data-text="Aplicação do Design Pattern: Factory"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/06/06/aplicacao-design-pattern-factory/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F06%2F06%2Faplicacao-design-pattern-factory%2F&amp;linkname=Aplica%C3%A7%C3%A3o%20do%20Design%20Pattern%3A%20Factory" 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%2F06%2F06%2Faplicacao-design-pattern-factory%2F&amp;linkname=Aplica%C3%A7%C3%A3o%20do%20Design%20Pattern%3A%20Factory" 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%2F06%2F06%2Faplicacao-design-pattern-factory%2F&amp;linkname=Aplica%C3%A7%C3%A3o%20do%20Design%20Pattern%3A%20Factory" 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%2F06%2F06%2Faplicacao-design-pattern-factory%2F&amp;title=Aplica%C3%A7%C3%A3o%20do%20Design%20Pattern%3A%20Factory" 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>Depois de falarmos do <a href="http://abap101.com/2012/03/26/design-patern-singleton/">Singleton</a>, está na hora de falarmos de outro <a href="http://pt.wikipedia.org/wiki/Padr%C3%A3o_de_projeto_de_software">padrão de projeto</a>, o Factory. O Factory é mais difícil de entender do que o Singleton. Mais do que isso, mais difícil de mostrar alguma aplicação prática.</p>
<p>Nesse post eu mostrarei as duas coisas, explicar o funcionamento do Factory, bem como sua aplicação.</p>
<p><span id="more-2478"></span></p>
<h3>Rápida Explicação &#8230;</h3>
<p>De uma maneira bem simples, o Factory é um padrão que nada mais é do que uma classe geradora de objetos, onde a decisão de qual classe o objeto será é feita pela classe &#8220;geradora&#8221;.</p>
<p>Onde eu apliquei o Factory em ABAP?</p>
<h3>Projeto Code Coaching</h3>
<p>Estamos trabalhando num projeto open source chamado <a href="https://cw.sdn.sap.com/cw/groups/code-coaching">Code Coaching</a> que está sendo desenvolvido sob a iniciativa do ABAP101 Open Source.</p>
<p>O objetivo do projeto é construir uma aplicação ABAP onde o Programador e Coordenador possam se comunicar pelo próprio programa ABAP.</p>
<p>Veja esse exemplo. Esse trecho de código faz parte de outro projeto em que estávamos envolvidos. Eu queria passar instruções para a implementação de uma classe interface específica. Então ao invés de passar instruções por e-mail, eu resolvi colocar alguns comentários dentro do próprio código. Daí para evoluir para uma <em>proto-markup-language</em> foi um pulo (lembre-se, meu sangue é de programador, minha tendência é resolver tudo com um programa de computador).</p>
<p><a href="https://gist.github.com/2872323">Fonte</a></p>
<p>&nbsp;</p>
<p>Existem algumas linhas de comentários que são iniciadas por <em>*@</em>. Essas linhas contêm uma espécie de código que dá um significado especial às linhas comentadas logo na sequência. Continuando na linha do <em>*@</em> encontramos a seguinte instrução: &#8220;jack:task&#8221;. Isso significa que os comentários logo abaixo dessa linha, trata-se de uma tarefa designada para o programador chamado Jack.</p>
<p>Sendo assim, o programador pode facilmente fazer uma busca no programa pelo seu nome e descobrir todos os pontos que possuam algum comentário para ele. Para facilitar eu automatizei essa busca em um programa que lê o programa e extrai todos os pontos onde a linha começa com <em>*@</em> e gera um relatório, como o mostrado abaixo.</p>
<div id="attachment_2484" class="wp-caption aligncenter" style="width: 700px"><a href="http://abap101.com/wp-content/uploads/2012/06/factory1.jpg"><img class="size-full wp-image-2484" title="factory1" src="http://abap101.com/wp-content/uploads/2012/06/factory1.jpg" alt="Protótipo do relatório para o Code Coaching" width="690" height="285" /></a><p class="wp-caption-text">Protótipo do relatório para o Code Coaching</p></div>
<p>Esse programa é apenas um protótipo e como tal serve apenas para apresentar e testar a ideia central do projeto. O projeto final contemplará muitas outras funcionalidades bem como outros comandos, muito além do <em>task</em>. É nesse ponto que o factory será usado.</p>
<h3>O que o Factory Significa para o Code Coaching?</h3>
<p>No protótipo do programa Code Coaching, ele consegue interpretar apenas o comando <em>task</em>, mas já no primeiro release, estamos planejando expandir para pelo menos três outros comandos além do <em>task</em>,  <em>question</em>, <em>answer</em> e <em>comment</em>.</p>
<p>Para fazer a interpretação desses comandos, o programa relatório contará com um diagrama de classes semelhante ao apresentado abaixo:</p>
<div id="attachment_2491" class="wp-caption aligncenter" style="width: 475px"><a href="http://abap101.com/wp-content/uploads/2012/06/factory8.jpg"><img class="size-full wp-image-2491" title="factory8" src="http://abap101.com/wp-content/uploads/2012/06/factory8.jpg" alt="Teste de Conceito do modelo do Code Coaching" width="465" height="199" /></a><p class="wp-caption-text">Teste de Conceito do modelo do Code Coaching</p></div>
<p>Cada comando é representado por uma classe. Abaixo você verá mais um programa de teste de conceito, este usando o factory para interpretar um comando entrado pelo usuário.</p>
<h3>Implementando o Factory em ABAP</h3>
<p>Vamos para mais um programa que simula o interpretador que usaremos no Code Coaching. Trata-se de um programa bem simples, com um parâmetro que é o nome do comando. Se o comando existe, ele mostra o texto que está na classe correspondente ao comando, caso contrário mostra uma mensagem de erro.</p>
<div id="attachment_2486" class="wp-caption aligncenter" style="width: 612px"><a href="http://abap101.com/wp-content/uploads/2012/06/factory3.jpg"><img class="size-full wp-image-2486" title="factory3" src="http://abap101.com/wp-content/uploads/2012/06/factory3.jpg" alt="" width="602" height="122" /></a><p class="wp-caption-text">Tela de seleção - Comando TASK </p></div>
<div id="attachment_2487" class="wp-caption aligncenter" style="width: 572px"><a href="http://abap101.com/wp-content/uploads/2012/06/factory4.jpg"><img class="size-full wp-image-2487  " title="factory4" src="http://abap101.com/wp-content/uploads/2012/06/factory4.jpg" alt="" width="562" height="141" /></a><p class="wp-caption-text">Explicação para o comando TASK - Classe LCL_TASK</p></div>
<div id="attachment_2489" class="wp-caption aligncenter" style="width: 607px"><a href="http://abap101.com/wp-content/uploads/2012/06/factory6.jpg"><img class="size-full wp-image-2489 " title="factory6" src="http://abap101.com/wp-content/uploads/2012/06/factory6.jpg" alt="" width="597" height="115" /></a><p class="wp-caption-text">Comando JUMP não existe</p></div>
<div id="attachment_2490" class="wp-caption aligncenter" style="width: 531px"><a href="http://abap101.com/wp-content/uploads/2012/06/factory7.jpg"><img class="size-full wp-image-2490" title="factory7" src="http://abap101.com/wp-content/uploads/2012/06/factory7.jpg" alt="" width="521" height="139" /></a><p class="wp-caption-text">Resultado do comando JUMP</p></div>
<p>Programa <a href="https://gist.github.com/2872468">ZABAP101_FACTORY_PATTERN</a> completo.</p>
<p>&nbsp;</p>
<p>A classe LCL_COMMAND é responsável por decidir de qual classe o objeto deve ser criado. Se ocorrer um erro na criação, ou seja, se a classe que estamos querendo criar o objeto não exista, uma exceção é lançada e tratada como um erro de sintaxe.</p>
<p>Repare que eu monto o nome da classe de acordo com o nome do comando entrado pelo usuário no parâmetro do programa. Ou seja, para esse caso, a classe do comando precisa seguir a seguinte nomenclatura: LCL_&lt;comando&gt;, caso contrário haverá um erro na criação do objeto daquela classe, pois a classe não existirá.</p>
<p>Os objetos dos comandos são criados no método FACTORY( ), com o seguinte comando:</p>
<blockquote><p>CREATE OBJECT re_instance TYPE (lv_command).</p></blockquote>
<p>O tipo do objeto é definido em tempo de execução, de acordo com o valor da variável <em>lv_command</em>. Colocando a variável entre parênteses, o interpretador ABAP entende que o tipo do objeto a ser criado não é <em>lv_command</em>, mas sim o que está no conteúdo da variável entre os parênteses.</p>
<h3>Qual a Vantagem?</h3>
<p>Por que criei uma classe para cada comando? Porque dessa forma, pode-se adicionar um novo comando de maneira MUITO fácil, apenas criando uma nova classe para o novo comando e herdando da classe LCL_COMMAND.</p>
<p>Todo o resto não será afetado.</p>
<p>(sim, isso cheira polimorfismo).</p>
<p>(sim, isso é genial!!!)</p>
<p>O padrão de projeto Factory pode ser implementado de várias maneiras, essa foi apenas uma delas. Acho sim interessante estudá-lo para ter mais essa ferramenta em sua workbench.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/06/06/aplicacao-design-pattern-factory/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Importanto e Exportanto Uma Tabela Interna &#8211; Módulo de Função</title>
		<link>http://abap101.com/2012/05/31/importanto-exportanto-uma-tabela-interna-modulo-funcao/</link>
		<comments>http://abap101.com/2012/05/31/importanto-exportanto-uma-tabela-interna-modulo-funcao/#comments</comments>
		<pubDate>Thu, 31 May 2012 12:00:44 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[Receita ABAP]]></category>
		<category><![CDATA[Tecnica de Programação]]></category>
		<category><![CDATA[function module]]></category>
		<category><![CDATA[modulo de função]]></category>
		<category><![CDATA[table type]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=2453</guid>
		<description><![CDATA[Estava procurando algum assunto para escrever, e uma luz do céu e-mail chegou com uma dúvida e que em todas as turmas da Academia ABAP tem, como importar ou exportar uma tabela interna para um módulo de função ou método. A solução pode ser respondida com uma simples frase: &#8220;Use um Table Type (Categoria de Tipos)&#8221;. [...]]]></description>
				<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2012/05/31/importanto-exportanto-uma-tabela-interna-modulo-funcao/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2012/05/31/importanto-exportanto-uma-tabela-interna-modulo-funcao/" data-text="Importanto e Exportanto Uma Tabela Interna &#8211; Módulo de Função"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2012/05/31/importanto-exportanto-uma-tabela-interna-modulo-funcao/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F05%2F31%2Fimportanto-exportanto-uma-tabela-interna-modulo-funcao%2F&amp;linkname=Importanto%20e%20Exportanto%20Uma%20Tabela%20Interna%20%E2%80%93%20M%C3%B3dulo%20de%20Fun%C3%A7%C3%A3o" title="Google Gmail" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/gmail.png" width="16" height="16" alt="Google Gmail"/></a><a class="a2a_button_wordpress" href="http://www.addtoany.com/add_to/wordpress?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F05%2F31%2Fimportanto-exportanto-uma-tabela-interna-modulo-funcao%2F&amp;linkname=Importanto%20e%20Exportanto%20Uma%20Tabela%20Interna%20%E2%80%93%20M%C3%B3dulo%20de%20Fun%C3%A7%C3%A3o" title="WordPress" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/wordpress.png" width="16" height="16" alt="WordPress"/></a><a class="a2a_button_blogger_post" href="http://www.addtoany.com/add_to/blogger_post?linkurl=http%3A%2F%2Fabap101.com%2F2012%2F05%2F31%2Fimportanto-exportanto-uma-tabela-interna-modulo-funcao%2F&amp;linkname=Importanto%20e%20Exportanto%20Uma%20Tabela%20Interna%20%E2%80%93%20M%C3%B3dulo%20de%20Fun%C3%A7%C3%A3o" title="Blogger Post" rel="nofollow" target="_blank"><img src="http://abap101.com/wp-content/plugins/add-to-any/icons/blogger.png" width="16" height="16" alt="Blogger Post"/></a><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fabap101.com%2F2012%2F05%2F31%2Fimportanto-exportanto-uma-tabela-interna-modulo-funcao%2F&amp;title=Importanto%20e%20Exportanto%20Uma%20Tabela%20Interna%20%E2%80%93%20M%C3%B3dulo%20de%20Fun%C3%A7%C3%A3o" 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>Estava procurando algum assunto para escrever, e uma <del>luz do céu</del> e-mail chegou com uma dúvida e que em todas as turmas da Academia ABAP tem, como importar ou exportar uma tabela interna para um módulo de função ou método.</p>
<p>A solução pode ser respondida com uma simples frase: &#8220;Use um Table Type (Categoria de Tipos)&#8221;. Só com isso já seria suficiente para você sair do outro lado, mas fazendo jus ao &#8220;101&#8243; do nome do site, vou explicar passo a passo como fazer em um módulo de função. No próximo post, eu explicarei como fazer em um método.</p>
<p><span id="more-2453"></span></p>
<h3>Problema</h3>
<p>Precisamos criar um módulo de função para retornar dados dos vôos (tabela SPFLI), dado uma empresa aérea.</p>
<h3>Solução</h3>
<p>A primeira coisa a fazer é criar um tipo tabela (table type) no dicionário, que define uma tabela interna do tipo standard. Vá na transação SE11 e escolha Data Type:</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.1.jpg"><img class="aligncenter size-full wp-image-2456" title="screenshot.1" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.1.jpg" alt="" width="511" height="386" /></a></p>
<p>Clique em &#8220;Create&#8221; e escolha Table Type:</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.2.jpg"><img class="aligncenter size-full wp-image-2457" title="screenshot.2" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.2.jpg" alt="" width="253" height="147" /></a></p>
<p>Entre com uma breve descrição e o Line Type, que define a as colunas na tabela interna. Nesse caso queremos todas as colunas da tabela SPFLI.</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.3.jpg"><img class="aligncenter size-full wp-image-2458" title="screenshot.3" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.3.jpg" alt="" width="601" height="320" /></a></p>
<p>Certifique-se o tipo de tabela seja Standard Table.</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.4.jpg"><img class="aligncenter size-full wp-image-2459" title="screenshot.4" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.4.jpg" alt="" width="580" height="269" /></a></p>
<p>Com o tipo global criado e ativo, vamos a criação ao módulo de função. Primeiro, é necessário criar uma Grupo de Função na transação SE80. Escolha &#8220;Function Group&#8221; e defina um nome. Pressione ENTER e confirme a criação do novo objeto.</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.5.jpg"><img class="aligncenter size-full wp-image-2461" title="screenshot.5" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.5.jpg" alt="" width="435" height="257" /></a></p>
<p>Depois de criar o grupo, crie o módulo de função. Pressione o botão direito do mouse sobre o grupo de função, escolha Create -&gt; Function Module.</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.6.jpg"><img class="aligncenter size-full wp-image-2462" title="screenshot.6" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.6.jpg" alt="" width="453" height="206" /></a></p>
<p>Defina o nome a descrição para o módulo de função. O nome precisa necessariamente &#8220;Z_&#8221;.</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.7.jpg"><img class="aligncenter size-full wp-image-2463" title="screenshot.7" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.7.jpg" alt="" width="492" height="147" /></a></p>
<p>Agora vamos definir o parâmetro de Import, IM_CARRID, com o mesmo tipo do campos CARRID da tabela SPFLI.</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.8.jpg"><img class="aligncenter size-full wp-image-2464" title="screenshot.8" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.8.jpg" alt="" width="600" height="152" /></a></p>
<p>Para o parâmetro de EXPORT use o Table Type definido anteriormente.</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.9.jpg"><img class="aligncenter size-full wp-image-2465" title="screenshot.9" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.9.jpg" alt="" width="595" height="149" /></a></p>
<p>Não vamos nos esquecer de definir as exceções, no nosso caso, defina apenas uma única exceção.</p>
<p><a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.10.jpg"><img class="aligncenter size-full wp-image-2466" title="screenshot.10" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.10.jpg" alt="" width="623" height="142" /></a></p>
<p>E para finalizar, entre o código abaixo:</p>
<p><a href="https://gist.github.com/2839921"> Z_FM_GET_CONNECTIONS</a><br />
<script type="text/javascript" src="https://gist.github.com/2839921.js?file=gistfile1.txt"></script></p>
<h3>Execução e Teste</h3>
<p>Depois de ativar o módulo de função, você pode executar um teste unitário pressionando o F8. Entre a empresa aérea &#8220;AA&#8221;. <a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.11.jpg"><img class="aligncenter size-full wp-image-2467" title="screenshot.11" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.11.jpg" alt="" width="581" height="222" /></a> Pressione F8 novamente para executar o módulo de função, retornando duas entradas da tabela SPFLI.   <a href="http://abap101.com/wp-content/uploads/2012/05/screenshot.13.jpg"><img class="aligncenter size-full wp-image-2469" title="screenshot.13" src="http://abap101.com/wp-content/uploads/2012/05/screenshot.13.jpg" alt="" width="841" height="142" /></a> Agora usando efetivamente o módulo de função, crie um programa que chama a função e imprima o resultado na tela. <a href="https://gist.github.com/2840290">ZABAP101_REPORT_CONNECTIONS</a><script type="text/javascript" src="https://gist.github.com/2840290.js?file=gistfile1.txt"></script></p>
<h3>Discussão</h3>
<p>O principal ponto a destacar aqui é o tipo criado na SE11, ZTT_SPFLI. Antigamente usava a pasta Tables do módulo de função, onde era somente preciso especificar a estrutura que o próprio sistema entendia que deveria ser criado uma tabela interna em tempo de execução. Não usamos essa técnica pois já está obsoleto e por regra não devemos criar novos programas com instruções ou técnicas definidas pela SAP como obsoletas.</p>
<p>É interessante o uso do módulo de função para seleção de dados, pois assim podemos reutilizar em outros programas. Esse módulo de função serve como Model (do nosso conhecido MVC). Podemos incluir ali outras regras de negócio que poderão ser facilmente reutilizadas em outros programas. Além disso, se essa regra mudar por qualquer motivo, não é necessário alterar vários programas, mas apenas dentro do módulo de função.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/05/31/importanto-exportanto-uma-tabela-interna-modulo-funcao/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<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_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>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_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>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_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>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>9</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_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>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>
	</channel>
</rss>
