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

<channel>
	<title>ABAP101 &#187; ALV</title>
	<atom:link href="http://abap101.com/category/alv/feed/" rel="self" type="application/rss+xml" />
	<link>http://abap101.com</link>
	<description>ABAP &#124; Open Source &#124; Agile &#124; Programação</description>
	<lastBuildDate>Wed, 02 May 2012 22:30:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>ALV OO &#8211; Trabalhando com botões e eventos</title>
		<link>http://abap101.com/2012/03/01/abap-objects-alv/</link>
		<comments>http://abap101.com/2012/03/01/abap-objects-alv/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 11:00:19 +0000</pubDate>
		<dc:creator>Claudia Andressa</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[ABAP Objects]]></category>
		<category><![CDATA[ALV]]></category>
		<category><![CDATA[Tecnica de Programação]]></category>
		<category><![CDATA[abap objects]]></category>
		<category><![CDATA[ALV Exemplo]]></category>
		<category><![CDATA[ALV OO]]></category>
		<category><![CDATA[ALV passo a passo]]></category>
		<category><![CDATA[Botões]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[Ícones]]></category>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<p>Observe que o constructor é responsável apenas por &#8220;importar&#8221; o grid gerado na classe lcl_companies.</p>
<p>Vejam abaixo o resultado do nosso exercício:</p>
<div id="attachment_2234" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2012/02/tela-100.jpg"><img class="size-medium wp-image-2234" title="tela 100" src="http://abap101.com/wp-content/uploads/2012/02/tela-100-300x116.jpg" alt="" width="300" height="116" /></a><p class="wp-caption-text">Tela 0100 - Cias aéreas</p></div>
<p>Tela 0100, com os as informações das cias aéreas e botão habilitado.</p>
<p>Observe que não há o botão responsável pela geração de gráficos.</p>
<div id="attachment_2235" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2012/02/tela-200.jpg"><img class="size-medium wp-image-2235" title="tela 200" src="http://abap101.com/wp-content/uploads/2012/02/tela-200-300x40.jpg" alt="" width="300" height="40" /></a><p class="wp-caption-text">Tela 0200 - Conexões</p></div>
<p>Tela 0200, com informações das conexões e botão desabilitado.</p>
<p>E então, gostaram? baixe o código (<a title="Z_ALV_OO_2" href="http://abap101.com/wp-content/uploads/2012/03/Z_ALV_OO_2.zip">Z_ALV_OO</a> ), estude e nos envie suas dúvidas e sugestões!</p>
<p>Veja <a href="http://abap101.com/2011/01/22/introducao-ao-saplink/" target="_blank">neste post</a> como utilizar o arquivo.</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2012/03/01/abap-objects-alv/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Desafio ALV, Difícil ou Trabalhoso?</title>
		<link>http://abap101.com/2011/08/15/desafio-alv-dificil-ou-trabalhoso/</link>
		<comments>http://abap101.com/2011/08/15/desafio-alv-dificil-ou-trabalhoso/#comments</comments>
		<pubDate>Mon, 15 Aug 2011 12:45:44 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[ABAP Objects]]></category>
		<category><![CDATA[ALV]]></category>
		<category><![CDATA[Tecnica de Programação]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=1349</guid>
		<description><![CDATA[É com grande prazer que trago para vocês o post de nossa aluna da Academia ABAP, Claudia Andressa Inacio Estevão. Esse foi um dos exercícios propostos como desafio para a sala e a Claudia conseguiu fazer e fez bonito. Vendo a solução dela propomos que ela escrevesse um post explicando a sua solução. Abaixo o que [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2011/08/15/desafio-alv-dificil-ou-trabalhoso/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2011/08/15/desafio-alv-dificil-ou-trabalhoso/" data-text="Desafio ALV, Difícil ou Trabalhoso?"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2011/08/15/desafio-alv-dificil-ou-trabalhoso/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2011%2F08%2F15%2Fdesafio-alv-dificil-ou-trabalhoso%2F&amp;linkname=Desafio%20ALV%2C%20Dif%C3%ADcil%20ou%20Trabalhoso%3F" 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%2F2011%2F08%2F15%2Fdesafio-alv-dificil-ou-trabalhoso%2F&amp;linkname=Desafio%20ALV%2C%20Dif%C3%ADcil%20ou%20Trabalhoso%3F" 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%2F2011%2F08%2F15%2Fdesafio-alv-dificil-ou-trabalhoso%2F&amp;linkname=Desafio%20ALV%2C%20Dif%C3%ADcil%20ou%20Trabalhoso%3F" 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%2F2011%2F08%2F15%2Fdesafio-alv-dificil-ou-trabalhoso%2F&amp;title=Desafio%20ALV%2C%20Dif%C3%ADcil%20ou%20Trabalhoso%3F" 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><blockquote><p>É com grande prazer que trago para vocês o post de nossa aluna da Academia ABAP, Claudia Andressa Inacio Estevão. Esse foi um dos exercícios propostos como desafio para a sala e a Claudia conseguiu fazer e fez bonito.</p>
<p>Vendo a solução dela propomos que ela escrevesse um post explicando a sua solução. Abaixo o que vocês lerão é o texto enviado por ela. Tenham uma ótima leitura, pois a vale a pena entender como ela resolver o problema.</p>
<p>Aproveito para estender o convite a outros leitores, caso queiram submeter algum texto, entrem em contato conosco.</p>
<p>Parabéns a Claudia que batalhou, sofreu e suou a camisa para conseguir fazer todo esse trabalho.  Tenho certeza que ela aprendeu muito com a experiência, inclusive descrevendo a sua solução para um post do nosso site.</p>
<p>Ainda em tempo, tudo dentro do prazo proposto!</p>
<p>Abraços e bons estudos!</p></blockquote>
<p><span id="more-1349"></span></p>
<p>Quem acompanha este blog e conhece um pouco sobre os autores sabe que ambos são instrutores de uma academia de ABAP. Pois bem, meu nome é Claudia e estou entre seus alunos das aulas aos SÁBADOS (afinal, se queremos conseguir algo na vida, fazer um “sacrifício” é “quase” importante, não é?). E foi durante o curso que recebemos um desafio: Criar um programa que leia os dados das tabelas SCARR, SPFLI, SFLIGHT e SBOOK e mostre seus dados em um ALV na tela inteira.</p>
<p>O programa deve mostrar os dados da tabela escolhida na tela de seleção (SCARR, SPFLI, SFLIGHT e SBOOK).</p>
<p>Os campos da tela devem estar habilitados somente quando fizerem parte da chave da tabela selecionada.</p>
<div id="attachment_1352" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2011/08/screenshot.1.jpg"><img class="size-medium wp-image-1352" title="screenshot.1" src="http://abap101.com/wp-content/uploads/2011/08/screenshot.1-300x216.jpg" alt="" width="300" height="216" /></a><p class="wp-caption-text">Tela de Seleção</p></div>
<p>Parece simples, para você? Não se for um “quase júnior”!</p>
<p>O Flávio e o Fábio me convidaram para explicar a minha solução para este programa, e obviamente aceitei. Desta forma, vou tentar mostrá-lo de modo simples e espero poder ajudar os novatos na área, como eu!</p>
<p>Primeiramente, criei a tela de seleção, conforme o código abaixo:</p>
<p><a href="http://abap101.com/wp-content/uploads/2011/08/selection_screen.jpg"><img class="aligncenter size-medium wp-image-1360" title="selection_screen" src="http://abap101.com/wp-content/uploads/2011/08/selection_screen-300x297.jpg" alt="" width="300" height="297" /></a></p>
<p>No Block “Filter” ao invés de utilizarmos select options com as funções “NO-EXTENSION NO INTERVALS” é mais indicado utilizarmos um parameter (utilizei o select options para entender seu comportamento no debug).</p>
<p>Seguem os valores inseridos nos text-symbols:</p>
<blockquote><p>text-f01: Filter</p>
<p>text-f02: Display data from table</p>
<p>text-c01 (02, 03 e 04) Os nomes das respectivas tabelas.</p></blockquote>
<p>Para alterar os nomes exibidos na tela clique no menu: Goto-&gt;Text Elements-&gt;Selection Texts e insira o texto desejado.</p>
<div id="attachment_1350" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2011/08/text_elements.jpg"><img class="size-medium wp-image-1350" title="text_elements" src="http://abap101.com/wp-content/uploads/2011/08/text_elements-300x276.jpg" alt="" width="300" height="276" /></a><p class="wp-caption-text">Como criar os textos para a tela de seleção.</p></div>
<p>Com a tela de seleção finalizada, vamos criar a segunda tela, onde o ALV será exibido.</p>
<p>No Screen Painter da nova tela, insira um objeto Custom Control e atribua um nome. No meu caso ‘CONTAINER1’, conforme figura abaixo:</p>
<div id="attachment_1353" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2011/08/screenshot.2.jpg"><img class="size-medium wp-image-1353" title="screenshot.2" src="http://abap101.com/wp-content/uploads/2011/08/screenshot.2-300x226.jpg" alt="" width="300" height="226" /></a><p class="wp-caption-text">Screen Painter</p></div>
<p>&nbsp;</p>
<p>Não devemos nos esquecer de programar os botões ‘Back’ e ‘Cancel’, que não colocarei os códigos aqui por serem simples e não serem nosso objetivo.</p>
<p>Para gerar o ALV, precisamos criar os objetos: Container (associado ao container que geramos no Screen Painter) e Grid, vide códigos abaixo.</p>
<div id="attachment_1354" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2011/08/screenshot.3.jpg"><img class="size-medium wp-image-1354" title="screenshot.3" src="http://abap101.com/wp-content/uploads/2011/08/screenshot.3-300x72.jpg" alt="" width="300" height="72" /></a><p class="wp-caption-text">Declaração das referências aos objetos.</p></div>
<p>Como aprendemos que devemos usar orientação a objetos sempre que possível (e confesso que preciso estudar isso um “pouco” mais), em um novo include, criei classes para popular o grid do ALV de acordo com as tabelas selecionadas na tela.</p>
<p>Abaixo, a classe que popula o grid quando a tabela SCARR é selecionada.</p>
<div id="attachment_1355" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2011/08/screenshot.4.jpg"><img class="size-medium wp-image-1355" title="screenshot.4" src="http://abap101.com/wp-content/uploads/2011/08/screenshot.4-300x177.jpg" alt="" width="300" height="177" /></a><p class="wp-caption-text">Classe LCL_ALV_SCARR - Definition</p></div>
<p>O Tipo so_car_ty  foi criado porque precisamos receber da tela de seleção o que foi inserido no select options (scarr-carrid). Como sabemos, o select options é uma tabela com header line, e a estrutura acima simula tal tabela.</p>
<p>No método constructor, apenas receberemos a referência ao objeto grid, que criamos no programa principal, e o atribuiremos à variável privada r_grid para utilizarmos na implementação do método popula_alv_scarr.</p>
<p>O método popula_alv_scarr, por sua vez, realizará o select conforme parâmetros recebidos e populará a tabela do objeto grid. Segue implementação:</p>
<div id="attachment_1356" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2011/08/screenshot.5.jpg"><img class="size-medium wp-image-1356" title="screenshot.5" src="http://abap101.com/wp-content/uploads/2011/08/screenshot.5-300x144.jpg" alt="" width="300" height="144" /></a><p class="wp-caption-text">Classe LCL_ALV_SCARR - Implementation</p></div>
<p>Outras três classes devem ser criadas, para cada uma das tabelas.</p>
<p>Todas elas são semelhantes, alterando apenas os parâmetros recebidos. Veja a classe referente à tabela SBOOK, a mais complexa (que recebe parâmetros de todos os select options).</p>
<div id="attachment_1351" class="wp-caption aligncenter" style="width: 249px"><a href="http://abap101.com/wp-content/uploads/2011/08/class_alv_sbook.jpg"><img class="size-medium wp-image-1351 " title="class_alv_sbook" src="http://abap101.com/wp-content/uploads/2011/08/class_alv_sbook-239x300.jpg" alt="" width="239" height="300" /></a><p class="wp-caption-text">Classe LCL_ALV_SBOOK - Definition</p></div>
<div id="attachment_1357" class="wp-caption aligncenter" style="width: 310px"><a href="http://abap101.com/wp-content/uploads/2011/08/screenshot.6.jpg"><img class="size-medium wp-image-1357 " title="screenshot.6" src="http://abap101.com/wp-content/uploads/2011/08/screenshot.6-300x156.jpg" alt="" width="300" height="156" /></a><p class="wp-caption-text">Classe LCL_ALV_SBOOK - Implementation</p></div>
<p>&nbsp;</p>
<p>De volta ao programa principal, vamos criar os objetos com referência às classes codificadas (no “INITIALIZATION”, assim como os objetos grid e container).</p>
<p style="text-align: center;"><a href="http://abap101.com/wp-content/uploads/2011/08/screenshot.7.jpg"><img class="aligncenter size-full wp-image-1358" title="screenshot.7" src="http://abap101.com/wp-content/uploads/2011/08/screenshot.7.jpg" alt="" width="668" height="262" /></a></p>
<p>Observe que passamos a mesma referência do objeto grid para todas as classes codificadas, visto que só temos um objeto container na tela criada.</p>
<p>Agora, precisamos chamar os métodos popula_alv das classes criadas (o que deve ser feito no PAI da tela de seleção, ou seja, em “AT SELECTION-SCREEN”).</p>
<p><a href="http://abap101.com/wp-content/uploads/2011/08/screenshot.8.jpg"><img class="aligncenter size-medium wp-image-1359" title="screenshot.8" src="http://abap101.com/wp-content/uploads/2011/08/screenshot.8-300x144.jpg" alt="" width="300" height="144" /></a></p>
<p>Relembro que os parâmetros exportados são os select-options. Caso não recebam nenhum valor, o select será realizado em toda a tabela.</p>
<p>Para habilitar / desabilitar os campos da tela, utilizei os métodos set_input e commit_screen da classe lcl_dynpro_handler, sujerida <a href="http://abap101.com/2010/07/28/classe-para-tratamento-de-tela-de-selecao-loop-at-screen-nunca-mais/" target="_blank">aqui</a> mesmo no blog:</p>
<h4>Conclusões</h4>
<p>Bom, esta é a minha solução. Espero ter contribuído de alguma forma!</p>
<p>Abaixo, seguem algumas melhorias sugeridas pelo Fábio e Flávio:</p>
<ul>
<li>Da forma como foram implementadas as classes, poderíamos utilizar Interfaces, com os conceitos de herança e polimorfismo;</li>
<li>Poderíamos utilizar “RANGE OF” ou “ rseloption” para importar os valores dos select-options nas classes (ao invés de criar o tipo so_car_ty).</li>
</ul>
<p>Seguem alguns links sobre tratamento de tela:</p>
<p><a href="http://abap101.com/2010/07/28/classe-para-tratamento-de-tela-de-selecao-loop-at-screen-nunca-mais/" target="_blank">Classe Para Tratamento de Tela de Seleção</a></p>
<p><a href="http://abap101.com/2010/08/29/voce-sabe-o-que-e-screenbreaker/" target="_blank">ScreenBreaker</a></p>
<p><a href="https://cw.sdn.sap.com/cw/groups/screen-breaker" target="_blank">ScreenBreaker no Code Exchange</a></p>
<p>Para quem quiser praticar mais, fica a sugestão de estudar as dicas acima e melhorar o código!</p>
<p>Segue o NUGG file com toda a solução: <a href="http://abap101.com/wp-content/uploads/2011/08/NUGG_Z_ALV_BLOG.nugg_.txt">NUGG_Z_ALV_BLOG.nugg</a>. Veja <a href="http://abap101.com/2011/01/22/introducao-ao-saplink/" target="_blank">aqui</a> como abrir esse arquivo.</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2011/08/15/desafio-alv-dificil-ou-trabalhoso/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>CL_SALV_TABLE Editável &#8211; Faça parte desta corrente!</title>
		<link>http://abap101.com/2011/01/31/cl_salv_table-editavel-faca-parte-desta-corrente/</link>
		<comments>http://abap101.com/2011/01/31/cl_salv_table-editavel-faca-parte-desta-corrente/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 12:30:37 +0000</pubDate>
		<dc:creator>Fábio Pagoti</dc:creator>
				<category><![CDATA[ABAP Objects]]></category>
		<category><![CDATA[ALV]]></category>
		<category><![CDATA[Opinião]]></category>
		<category><![CDATA[ALV editável]]></category>
		<category><![CDATA[cl_salv_table]]></category>
		<category><![CDATA[sdn]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=383</guid>
		<description><![CDATA[Olá caros! No post &#8220;Faça parte da SDN&#8220;, tratamos brevemento sobre o que é a SDN e qual o seu intuito. Outro dia ao necessitar fazer um ALV editável, descobri através do help e da comunidade que esta &#8220;simples&#8221; funcionalidade não é atendida pela classe de ALV mais moderna, a CL_SALV_TABLE. No entanto, achei um [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2011/01/31/cl_salv_table-editavel-faca-parte-desta-corrente/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2011/01/31/cl_salv_table-editavel-faca-parte-desta-corrente/" data-text="CL_SALV_TABLE Editável &#8211; Faça parte desta corrente!"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2011/01/31/cl_salv_table-editavel-faca-parte-desta-corrente/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2011%2F01%2F31%2Fcl_salv_table-editavel-faca-parte-desta-corrente%2F&amp;linkname=CL_SALV_TABLE%20Edit%C3%A1vel%20%E2%80%93%20Fa%C3%A7a%20parte%20desta%20corrente%21" 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%2F2011%2F01%2F31%2Fcl_salv_table-editavel-faca-parte-desta-corrente%2F&amp;linkname=CL_SALV_TABLE%20Edit%C3%A1vel%20%E2%80%93%20Fa%C3%A7a%20parte%20desta%20corrente%21" 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%2F2011%2F01%2F31%2Fcl_salv_table-editavel-faca-parte-desta-corrente%2F&amp;linkname=CL_SALV_TABLE%20Edit%C3%A1vel%20%E2%80%93%20Fa%C3%A7a%20parte%20desta%20corrente%21" 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%2F2011%2F01%2F31%2Fcl_salv_table-editavel-faca-parte-desta-corrente%2F&amp;title=CL_SALV_TABLE%20Edit%C3%A1vel%20%E2%80%93%20Fa%C3%A7a%20parte%20desta%20corrente%21" 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 style="text-align: justify;">Olá caros!</p>
<p style="text-align: justify;">No post &#8220;<a href="http://abap101.com/2011/01/07/faca-parte-da-sdn/" target="_blank">Faça parte da SDN</a>&#8220;, tratamos brevemento sobre o que é a SDN e qual o seu intuito.</p>
<p style="text-align: justify;">Outro dia ao necessitar fazer um ALV editável, descobri através do help e da comunidade que esta &#8220;simples&#8221; funcionalidade não é atendida pela classe de ALV mais moderna, a CL_SALV_TABLE.</p>
<p style="text-align: justify;">No entanto, achei um post no fórum nomeado &#8220;<a href="http://forums.sdn.sap.com/thread.jspa?threadID=733872&amp;start=0&amp;tstart=0" target="_blank">cl_salv_table &#8211; needs editable functionality &#8211; SAP please provide this</a>&#8221; que tem a intenção de servir como um abaixo-assinado pedindo que a SAP incorpore essa funcionalidade o mais breve possível nas classes CL_SALV_*.</p>
<p style="text-align: justify;">E essa requisição da comunidade tem fundamento. Ora, quantos programas não possuem ao menos um ALV? Quantos desenvolvedores concordam que as classes CL_SALV_* facilitam o desenvolvimento e ajudam a garantir um programa entregue mais rapidamente? E quais são as chances de um programa com ALV utilizando tais classes precisar ser alterado para incorportar a funcionalidade de edição?</p>
<p style="text-align: justify;">Para todas essas perguntas há uma única resposta: &#8220;O suficiente&#8221;. O suficiente para saber que o retrabalho necessário caso haja uma simples mudança de requisito é considerável.</p>
<p style="text-align: justify;">Por isso, divulgo esse abaixo-assinado para todos aqueles que já precisaram e precisarão criar um ALV com tal característica. Basta responder o <a title="fórum na SDN" href="http://forums.sdn.sap.com/thread.jspa?threadID=733872&amp;start=0&amp;tstart=0" target="_blank">fórum na SDN</a> com um &#8220;agree&#8221;.</p>
<p style="text-align: justify;">Abraços!</p>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2011/01/31/cl_salv_table-editavel-faca-parte-desta-corrente/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ALV com Evento &#8211; Usando a classe CL_SALV_TABLE</title>
		<link>http://abap101.com/2010/02/18/alv-com-evento-usando-a-classe-cl_salv_table/</link>
		<comments>http://abap101.com/2010/02/18/alv-com-evento-usando-a-classe-cl_salv_table/#comments</comments>
		<pubDate>Thu, 18 Feb 2010 11:28:00 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ALV]]></category>
		<category><![CDATA[Receita ABAP]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[handler]]></category>
		<category><![CDATA[salv]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=249</guid>
		<description><![CDATA[Problema Criar uma cópia do relatório ZSALV_ALV_FIELDCAT implementado nesse post, para que seja monstrado uma mensagem quando o usuário der um duplo clique. Nessa mensagem, deve ser apresentado &#8220;Você deu duplo clique na coluna &#38; e linha &#38;.&#8221;, onde &#38; deverá ser substituído pelo nome da coluna e linha onde ocorreu o duplo clique. Solução [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2010/02/18/alv-com-evento-usando-a-classe-cl_salv_table/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2010/02/18/alv-com-evento-usando-a-classe-cl_salv_table/" data-text="ALV com Evento &#8211; Usando a classe CL_SALV_TABLE"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2010/02/18/alv-com-evento-usando-a-classe-cl_salv_table/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2010%2F02%2F18%2Falv-com-evento-usando-a-classe-cl_salv_table%2F&amp;linkname=ALV%20com%20Evento%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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%2F2010%2F02%2F18%2Falv-com-evento-usando-a-classe-cl_salv_table%2F&amp;linkname=ALV%20com%20Evento%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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%2F2010%2F02%2F18%2Falv-com-evento-usando-a-classe-cl_salv_table%2F&amp;linkname=ALV%20com%20Evento%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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%2F2010%2F02%2F18%2Falv-com-evento-usando-a-classe-cl_salv_table%2F&amp;title=ALV%20com%20Evento%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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><h3><span style="color: #0000ff;">Problema</span></h3>
<p>Criar uma cópia do relatório ZSALV_ALV_FIELDCAT implementado nesse <a href="http://abap101.com/2010/02/16/alv-com-field-catalog-usando-a-classe-cl_salv_table/">post</a>, para que seja monstrado uma mensagem quando o usuário der um duplo clique. Nessa mensagem, deve ser apresentado &#8220;Você deu duplo clique na coluna &amp; e linha &amp;.&#8221;, onde &amp; deverá ser substituído pelo nome da coluna e linha onde ocorreu o duplo clique.</p>
<h3><span style="color: #0000ff;"><span id="more-249"></span></p>
<p>Solução</p>
<p></span></h3>
<p><strong>Passo 1:</strong> Criar um novo include no programa principal. Para isso, colocar a instrução INCLUDE na seguinte posição:</p>
<blockquote><p><span style="font-family: Courier New;">&#8230;<br />
DATA: it_sflight TYPE TABLE OF ty_flight,<br />
wa_sflight LIKE LINE OF it_sflight.</span></p>
<p><span style="font-family: Courier New;"><strong>INCLUDE zsalv_alv_event_incl.</strong></span></p>
<p><span style="font-family: Courier New;">DATA: r_event_handler TYPE REF TO lcl_event_handler.<br />
START-OF-SELECTION.<br />
&#8230;</span></p></blockquote>
<p>Dar um duplo clique no nome do include e confirmar a criação do novo objeto. Garanta que o novo objeto seja do tipo include:</p>
<div><a href="http://wp3.abap101.com/wp-content/uploads/2010/02/event1.jpg"><img class="aligncenter size-full wp-image-251" title="SALV Event include" src="http://wp3.abap101.com/wp-content/uploads/2010/02/event1.jpg" alt="" width="500" height="331" /></a></div>
<p><strong>Passo 2:</strong> Criar uma classe local para receber e manipular o evento double_click do ALV:</p>
<blockquote>
<pre>*----------------------------------------------------------------------*
*       CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
  PUBLIC SECTION.
    METHODS: on_user_command FOR EVENT double_click
             OF cl_salv_events_table
              IMPORTING row column.
ENDCLASS.                    "lcl_event_handler DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
  METHOD on_user_command.
    MESSAGE i001(00) WITH
                'Você deu duplo clique na coluna' column 'e linha ' row.
  ENDMETHOD.                    "on_user_command
ENDCLASS.                    "lcl_event_handler IMPLEMENTATION&lt;/font&gt;</pre>
</blockquote>
<p><strong>Passo 3:</strong> Criar um objeto e registrar o evento:</p>
<blockquote><p><span style="font-family: Courier New;">&#8230;<br />
*  Set event handling<br />
</span><span style="font-family: Courier New;"> r_events = r_table-&gt;get_event( ).<br />
</span><span style="font-family: Courier New;"> CREATE OBJECT r_event_handler.<br />
</span><span style="font-family: Courier New;"> SET HANDLER</span><span style="font-family: Courier New;"> r_event_handler-&gt;on_user_command FOR r_events.<br />
&#8230;</span></p></blockquote>
<p>Agora você pode ativar o seu programa e testar.</p>
<h3><span style="color: #0000ff;">Execução e Teste</span></h3>
<p>Para executar e testar o programa, apenas pressione F8 ou <img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv2.jpg" alt="" width="25" height="27" />:</p>
<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv6.jpg" alt="" width="699" height="362" /></p>
<div>Dar um duplo clique em qualque linha e aí uma mensagem deverá ser apresentada:</p>
<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv8.jpg" alt="" width="432" height="130" /></div>
</div>
</div>
<h3><span style="color: #0000ff;"><strong>Discussão</strong></span></h3>
<p><strong><strong></strong><strong></strong></strong>Os eventos para a CL_SALV_TABLE são um puco diferentes da CL_GUI_ALV_GRID. Já comentei que a classe CL_SALV_TABLE encapsula as funcionalidades do CL_GUI_ALV_GRID, incluindo os eventos.</p>
<p>Quando trabalhamos com <a href="http://abap101.com/2009/08/26/alv-com-evento-usando-a-tecnica-pura/">eventos com a técnica &#8220;pura&#8221;</a>, temos que registrar os eventos e implementar os métodos para tratar esses eventos diretamente da CL_GUI_ALV_GRID. Com as classes &#8220;salv&#8221; temos uma classe que encapsula os eventos do grid, chamada CL_SALV_EVENTS_TABLE.</p>
<p>O evento que uso nesse problema é o DOUBLE_CLICK que é disparado da classe CL_SALV_EVENTS_TABLE. Veja que no evento DOUBLE_CLICK temos os parâmetros COLUMN, nome da coluna onde ocorreu o evento e ROW, que é o número da linha onde ocorreu o evento evento. Com esses dois parêmetros conseguimos identificar a coluna e a linha em que o usuário deu o duplo clique (usando o READ TABLE &#8230; index ROW na tabela de dados do ALV).</p>
<h3><span style="color: #0000ff;">Anexos</span></h3>
<p><a href="http://abap101.furlanserver.com/files/ZSALV_ALV_EVENT.txt" class="broken_link">ZSALV_ALV_EVENT.txt</a><br />
<a href="http://abap101.furlanserver.com/files/ZSALV_ALV_EVENT_INCL.txt" class="broken_link">ZSALV_ALV_EVENT_INCL.txt</a></p>
<h3><span style="color: #0000ff;">Veja Também</span></h3>
<p><span><a href="http://abap101.com/2008/10/20/exemplos-alv">ABAP Control Exemples</a></span><br />
<a href="http://help.sap.com/saphelp_nw2004s/helpdata/en/bf/3bd1369f2d280ee10000009b38f889/frameset.htm">ALV at SAP Help</a><br />
<a href="http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/">Introdução ao ALV &#8211; Série Especial</a><br />
<a href="http://abap101.com/2009/08/26/alv-com-evento-usando-a-tecnica-pura/">ALV com Evento &#8211; Usando a Técnica “Pura”</a><br />
<a href="http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/"></a></p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=28f57b61-fe33-8f61-8fdb-d7ecc09d244b" alt="" /></div>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2010/02/18/alv-com-evento-usando-a-classe-cl_salv_table/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ALV com Field Catalog &#8211; Usando a classe CL_SALV_TABLE</title>
		<link>http://abap101.com/2010/02/16/alv-com-field-catalog-usando-a-classe-cl_salv_table/</link>
		<comments>http://abap101.com/2010/02/16/alv-com-field-catalog-usando-a-classe-cl_salv_table/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 10:00:53 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ALV]]></category>
		<category><![CDATA[Receita ABAP]]></category>
		<category><![CDATA[catalog]]></category>
		<category><![CDATA[field]]></category>
		<category><![CDATA[salv]]></category>
		<category><![CDATA[sap]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=246</guid>
		<description><![CDATA[Problema Implementar um relatório ALV, para mostrar todos os dados e todos os campos da tabela SFLIGHT. Também é requerido um novo campo chamado Taxa de Ocupação, onde é mostrado a relação entre capacidade máxima de  passageiros e ocupação atual do vôo. Solução Passo 1: Criar um programa executável, sem TOP include, ZSALV_ALV_FIELDCAT. Passo 2: [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2010/02/16/alv-com-field-catalog-usando-a-classe-cl_salv_table/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2010/02/16/alv-com-field-catalog-usando-a-classe-cl_salv_table/" data-text="ALV com Field Catalog &#8211; Usando a classe CL_SALV_TABLE"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2010/02/16/alv-com-field-catalog-usando-a-classe-cl_salv_table/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2010%2F02%2F16%2Falv-com-field-catalog-usando-a-classe-cl_salv_table%2F&amp;linkname=ALV%20com%20Field%20Catalog%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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%2F2010%2F02%2F16%2Falv-com-field-catalog-usando-a-classe-cl_salv_table%2F&amp;linkname=ALV%20com%20Field%20Catalog%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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%2F2010%2F02%2F16%2Falv-com-field-catalog-usando-a-classe-cl_salv_table%2F&amp;linkname=ALV%20com%20Field%20Catalog%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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%2F2010%2F02%2F16%2Falv-com-field-catalog-usando-a-classe-cl_salv_table%2F&amp;title=ALV%20com%20Field%20Catalog%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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><h3><span style="color: #0000ff;">Problema</span></h3>
<p>Implementar um relatório ALV, para mostrar todos os dados e todos os campos da tabela SFLIGHT. Também é requerido um novo campo chamado Taxa de Ocupação, onde é mostrado a relação entre capacidade máxima de  passageiros e ocupação atual do vôo.</p>
<h3><span style="color: #0000ff;"><span id="more-246"></span></p>
<p>Solução</p>
<p></span></h3>
<p><strong>Passo 1:</strong> Criar um programa executável, sem TOP include, ZSALV_ALV_FIELDCAT.</p>
<p><strong>Passo 2:</strong> Criar as referências para os objetos do grid:</p>
<blockquote><p><span style="font-family: 'Courier New';">DATA: r_table     TYPE REF TO cl_salv_table,</span><br />
<span style="font-family: 'Courier New';"> r_columns   TYPE REF TO cl_salv_columns_table,</span><br />
<span style="font-family: 'Courier New';"> r_column    TYPE REF TO cl_salv_column,</span><br />
<span style="font-family: 'Courier New';"> r_functions    TYPE REF TO cl_salv_functions.</span></p></blockquote>
<p><strong>Passo 3:</strong> Criar uma tabela interna sem header line, fazer a seleção de todos os dados da tablea SFLIGHT e fazer o cálculo da taxa de ocupação.</p>
<blockquote><p><span style="font-family: 'Courier New';">TYPES: BEGIN OF ty_flight.</span><br />
<span style="font-family: 'Courier New';"> INCLUDE TYPE sflight.</span><br />
<span style="font-family: 'Courier New';">TYPES: txocc TYPE p DECIMALS 2,</span><br />
<span style="font-family: 'Courier New';"> END OF ty_flight.</span></p>
<p><span style="font-family: 'Courier New';">DATA: r_table     TYPE REF TO cl_salv_table,</span><br />
<span style="font-family: 'Courier New';"> r_columns   TYPE REF TO cl_salv_columns_table,</span><br />
<span style="font-family: 'Courier New';"> r_column    TYPE REF TO cl_salv_column,</span><br />
<span style="font-family: 'Courier New';"> r_functions TYPE REF TO cl_salv_functions.</span></p>
<p><span style="font-family: 'Courier New';">DATA: it_sflight TYPE TABLE OF ty_flight,</span><br />
<span style="font-family: 'Courier New';"> wa_sflight LIKE LINE OF it_sflight.</span></p>
<p>&#8230;.</p>
<p><span style="font-family: 'Courier New';"> SELECT * FROM sflight INTO TABLE it_sflight.</span></p>
<p><span style="font-family: 'Courier New';"> </span><span style="font-family: 'Courier New';"> LOOP AT it_sflight INTO wa_sflight.<br />
wa_sflight-txocc =<br />
( wa_sflight-seatsocc / wa_sflight-seatsmax ) * 100.<br />
MODIFY it_sflight FROM wa_sflight.<br />
ENDLOOP.</span></p></blockquote>
<p><strong>Passo 4:</strong> Criar a referência com o método FACTORY para o objeto ALV:</p>
<blockquote><p><span style="font-family: 'Courier New';">TRY.</span><br />
<span style="font-family: 'Courier New';"> cl_salv_table=&gt;factory(</span><br />
<span style="font-family: 'Courier New';"> IMPORTING</span><br />
<span style="font-family: 'Courier New';"> r_salv_table = r_table</span><br />
<span style="font-family: 'Courier New';"> CHANGING</span><br />
<span style="font-family: 'Courier New';"> t_table      = it_sflight ).</span><br />
<span style="font-family: 'Courier New';">CATCH cx_salv_msg .</span><br />
<span style="font-family: 'Courier New';">ENDTRY.</span></p></blockquote>
<p><strong>Passo 5:</strong> Ajustar os dados para a nova coluna:</p>
<blockquote><p><span style="font-family: 'Courier New';"> r_columns = r_table-&gt;get_columns( ).<br />
r_columns-&gt;set_optimize( abap_true ).</span></p>
<p><span style="font-family: 'Courier New';"> </span><span style="font-family: 'Courier New';"> r_column = r_columns-&gt;get_column( &#8216;TXOCC&#8217; ).<br />
r_column-&gt;set_short_text( &#8216;Tx. Occ.&#8217; ).<br />
r_columns-&gt;set_column_position( columnname = &#8216;TXOCC&#8217; position = 10 ).</span></p></blockquote>
<p><strong><br />
Passo 5:</strong> Chamar o método DISPLAY para mostrar os grid:</p>
<blockquote><p><span style="font-family: 'Courier New';">r_table-&gt;display( ).</span></p></blockquote>
<p>Agora você pode ativar o seu programa e testar.</p>
<h3><span style="color: #0000ff;">Execução e Teste</span></h3>
<p>Para executar e testar o programa, apenas pressione F8 ou <img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv2.jpg" alt="" />:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2010/02/zsalv-alv-fieldcat.jpg" alt="" width="699" height="476" /></p>
<h3><span style="color: #0000ff;"><strong>Discussão</strong></span></h3>
<p>Na versão Netweaver 04, a SAP introduziu a família de classes CL_SALV*, que basicamente encapsula as operações que fizemos no post <a href="http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/">ALV Simples &#8211; Usando a Técnica “Pura”</a>. Podemos dizer que essa família de classes veio para substituir as técnicas baseadas nas Function Modules da família REUSE*.</p>
<p>As classes SALV tornam a manipulação do ALV extremamente simples. No exemplo de ALV simples não fica tão claro, mas nesse exemplo vemos claramente que o ALV com as classes SALV ficam muito mais &#8220;orientado a objetos&#8221;.</p>
<p>Quando estiver trabalhando com elas, você deve pensar o ALV como um objeto, mas composto por diversos outros objetos, como por exemplo, colunas.</p>
<div><a href="http://wp3.abap101.com/wp-content/uploads/2010/02/cl_salv_table.jpg"><img class="aligncenter size-full wp-image-250" title="cl_salv_table" src="http://wp3.abap101.com/wp-content/uploads/2010/02/cl_salv_table.jpg" alt="" width="500" height="290" /></a></div>
<p>Ou seja, após criar o objeto CL_SALV_TABLE com o método FACTORY, você só precisa usar métodos GET&#8230; para obter as referências aos objetos agregados, como colunas, coluna individual e funções do grid.</p>
<p><strong>Adicionando Nova Coluna ao Grid</strong></p>
<p>Diferentemente do método &#8220;puro&#8221;, você não precisa criar uma tabela interna para ajustar o field catalog, mas apenas trabalhar com os atributos do objeto CL_SALV_COLUMN. Muito mais simples e intuitivo.</p>
<blockquote><p><span style="font-family: 'Courier New';"> r_columns = r_table-&gt;get_columns( ).</span></p></blockquote>
<p>Com o método get_columns( ), você obtém a referência para o objeto CL_SALV_COLUMNS_TABLE, que são as colunas do grid. Lembre-se que ela não contém os valores das colunas, apenas metadados (informações das colunas em si).</p>
<blockquote><p><span style="font-family: 'Courier New';"> r_columns-&gt;set_optimize( abap_true ).</span></p></blockquote>
<p>O método set_optimize( ) você pode definir que a largura das colunas serão otimizadas de acordo com o contéudo da coluna.</p>
<blockquote><p><span style="font-family: 'Courier New';"> r_column = r_columns-&gt;get_column( &#8216;TXOCC&#8217; ).</span></p></blockquote>
<p>Com o método get_column( ) você retorna a referência a uma data coluna, de acordo com o nome técnico do campo que você passou no parâmetro. No caso acima, o nome do nosso campo que queremos alterar as características é o TXOCC.</p>
<blockquote><p><span style="font-family: 'Courier New';"> r_column-&gt;set_short_text( &#8216;Tx. Occ.&#8217; ).</span></p></blockquote>
<p>Esse método, set_short_text( ) define o texto curto para a coluna.</p>
<blockquote><p><span style="font-family: 'Courier New';"> r_columns-&gt;set_column_position( columnname = &#8216;TXOCC&#8217; position = 10 ).</span></p></blockquote>
<p>Finalmente, com o método set_column_position( ), você define a posição de uma coluna.</p>
<h3><span style="color: #0000ff;">Anexos</span></h3>
<p><a href="http://abap101.furlanserver.com/files/ZSALV_ALV_FIELDCAT.txt" class="broken_link">ZSALV_ALV_FIELDCAT.txt</a></p>
<h3><span style="color: #0000ff;">Veja Também</span></h3>
<p><a href="http://help.sap.com/saphelp_nw2004s/helpdata/en/bf/3bd1369f2d280ee10000009b38f889/frameset.htm">ALV Output Display</a><a href="http://help.sap.com/saphelp_nw04/helpdata/EN/8d/e994374c9cd355e10000009b38f8cf/frameset.htm"></a><br />
<a href="http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/">Introdução ao ALV &#8211; Série Especial</a><br />
<a href="http://abap101.com/2009/08/23/alv-com-field-catalog-usando-a-tecnica-pura-2/">ALV com Field Catalog &#8211; Usando a Técnica “Pura”</a></p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=8458ac7a-81e7-8cdc-beb7-e66e7cb20844" alt="" /></div>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2010/02/16/alv-com-field-catalog-usando-a-classe-cl_salv_table/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ALV Simples &#8211; Usando a classe CL_SALV_TABLE</title>
		<link>http://abap101.com/2010/02/12/alv-simples-usando-a-classe-cl_salv_table/</link>
		<comments>http://abap101.com/2010/02/12/alv-simples-usando-a-classe-cl_salv_table/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 11:13:32 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ABAP]]></category>
		<category><![CDATA[ABAP Objects]]></category>
		<category><![CDATA[ALV]]></category>
		<category><![CDATA[Receita ABAP]]></category>
		<category><![CDATA[salv]]></category>
		<category><![CDATA[sap]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=232</guid>
		<description><![CDATA[Problema Implementar um relatório ALV, para mostrar todos os dados e todos os campos da tabela SFLIGHT. Solução Passo 1: Criar um programa executável, sem TOP include, ZSALV_ALV_SIMPLE. Passo 2: Criar as referências para os objetos do grid: DATA: r_table &#160; &#160; TYPE REF TO cl_salv_table, r_functions TYPE REF TO cl_salv_functions. Passo 3: Criar uma [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2010/02/12/alv-simples-usando-a-classe-cl_salv_table/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2010/02/12/alv-simples-usando-a-classe-cl_salv_table/" data-text="ALV Simples &#8211; Usando a classe CL_SALV_TABLE"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2010/02/12/alv-simples-usando-a-classe-cl_salv_table/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2010%2F02%2F12%2Falv-simples-usando-a-classe-cl_salv_table%2F&amp;linkname=ALV%20Simples%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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%2F2010%2F02%2F12%2Falv-simples-usando-a-classe-cl_salv_table%2F&amp;linkname=ALV%20Simples%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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%2F2010%2F02%2F12%2Falv-simples-usando-a-classe-cl_salv_table%2F&amp;linkname=ALV%20Simples%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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%2F2010%2F02%2F12%2Falv-simples-usando-a-classe-cl_salv_table%2F&amp;title=ALV%20Simples%20%E2%80%93%20Usando%20a%20classe%20CL_SALV_TABLE" 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><h3><span style="color: rgb(0, 0, 255);">Problema</span></h3>
<p>Implementar um relatório ALV, para mostrar todos os dados e todos os campos da tabela SFLIGHT.<br />
<h3><span style="color: rgb(0, 0, 255);"><span id="more-232"></span></p>
<p>Solução</p>
<p></span></h3>
<p><strong>Passo 1:</strong> Criar um programa executável, sem TOP include, ZSALV_ALV_SIMPLE.</p>
<p><strong>Passo 2:</strong> Criar as referências para os objetos do grid:<br />
<blockquote><span style="font-family: 'Courier New';">DATA: r_table &nbsp; &nbsp; TYPE REF TO cl_salv_table,</span><br /><span style="font-family: 'Courier New';"> r_functions    TYPE REF TO cl_salv_functions.</span></p></blockquote>
<p><strong>Passo 3:</strong> Criar uma tabela interna sem header line e fazer a seleção de todos os dados da tablea SFLIGHT.<br />
<blockquote>DATA: it_sflight TYPE TABLE OF sflight.</p>
<p>START-OF-SELECTION.</p>
<p>&nbsp; SELECT * FROM sflight INTO TABLE it_sflight.</p></blockquote>
<p><strong>Passo 4:</strong> Criar a referência com o método FACTORY para o objeto ALV:<br />
<blockquote><span style="font-family: 'Courier New';">CALL METHOD cl_salv_table=&gt;factory<br />IMPORTING<br />r_salv_table = r_table<br />CHANGING<br />t_table      = it_sflight.</span></p></blockquote>
<p><strong>Passo 5:</strong> Chamar o método DISPLAY para mostrar os grid:<br />
<blockquote><span style="font-family: 'Courier New';">CALL METHOD r_table-&gt;display.</span></p></blockquote>
<p>Agora você pode ativar o seu programa e testar.<br />
<h3><span style="color: rgb(0, 0, 255);">Execução e Teste</span></h3>
<p>Para executar e testar o programa, apenas pressione F8 ou <img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv2.jpg" alt="" />:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2010/02/zsalv-alv-simple.jpg" alt="" height="350" width="699" /><br />
<h3><span style="color: rgb(0, 0, 255);"><strong>Discussão</strong></span></h3>
<p>Na versão Netweaver 04, a SAP introduziu a família de classes CL_SALV*, que basicamente encapsula as operações que fizemos no post <a href="http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/">ALV Simples &#8211; Usando a Técnica “Pura”</a>. Podemos dizer que essa família de classes veio para substituir as técnicas baseadas nas Function Modules da família REUSE*.</p>
<p>Esse exemplo que usei é muito simples. Apenas criei a referência do grida (classe CL_SALV_TABLE) e chamei o método DISPLAY para mostrar o grid. Hoje, é a maneira mais fácil de se criar um ALV Grid.<br />
<h3><span style="color: rgb(0, 0, 255);">Anexos</span></h3>
<p><a href="http://abap101.furlanserver.com/files/ZSALV_ALV_SIMPLE.txt" class="broken_link">ZSALV_ALV_SIMPLE</a><br />
<h3><span style="color: rgb(0, 0, 255);">Veja Também</span></h3>
<p><a href="http://help.sap.com/saphelp_nw2004s/helpdata/en/bf/3bd1369f2d280ee10000009b38f889/frameset.htm">ALV Output Display</a><a href="http://help.sap.com/saphelp_nw04/helpdata/EN/8d/e994374c9cd355e10000009b38f8cf/frameset.htm"></a><br /><a href="http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/">Introdução ao ALV &#8211; Série Especial</a></p>
<p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=4a61ed66-e924-8ebc-b744-948e420043ea" /></div>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2010/02/12/alv-simples-usando-a-classe-cl_salv_table/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ALV com Evento &#8211; Usando a Técnica &#8220;Pura&#8221;</title>
		<link>http://abap101.com/2009/08/26/alv-com-evento-usando-a-tecnica-pura/</link>
		<comments>http://abap101.com/2009/08/26/alv-com-evento-usando-a-tecnica-pura/#comments</comments>
		<pubDate>Wed, 26 Aug 2009 11:38:51 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ALV]]></category>
		<category><![CDATA[Receita ABAP]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=225</guid>
		<description><![CDATA[Problema Alterar o relatório ZPURE_ALV_FIELDCAT implementado nesse post, para que seja monstrado uma mensagem quando o usuário der um duplo clique. Nessa mensagem, deve ser apresentado &#8220;Você deu duplo clique na coluna &#38; e linha &#38;.&#8221;, onde &#38; deverá ser substituído pelo nome da coluna e linha onde ocorreu o duplo clique. Solução Passo 1: [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2009/08/26/alv-com-evento-usando-a-tecnica-pura/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2009/08/26/alv-com-evento-usando-a-tecnica-pura/" data-text="ALV com Evento &#8211; Usando a Técnica &#8220;Pura&#8221;"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2009/08/26/alv-com-evento-usando-a-tecnica-pura/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2009%2F08%2F26%2Falv-com-evento-usando-a-tecnica-pura%2F&amp;linkname=ALV%20com%20Evento%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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%2F2009%2F08%2F26%2Falv-com-evento-usando-a-tecnica-pura%2F&amp;linkname=ALV%20com%20Evento%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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%2F2009%2F08%2F26%2Falv-com-evento-usando-a-tecnica-pura%2F&amp;linkname=ALV%20com%20Evento%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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%2F2009%2F08%2F26%2Falv-com-evento-usando-a-tecnica-pura%2F&amp;title=ALV%20com%20Evento%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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><h3><span style="color: #0000ff;">Problema</span></h3>
<p>Alterar o relatório ZPURE_ALV_FIELDCAT implementado nesse <a href="http://abap101.com/2009/08/23/alv-com-field-catalog-usando-a-tecnica-pura-2/">post</a>, para que seja monstrado uma mensagem quando o usuário der um duplo clique.</p>
<p>Nessa mensagem, deve ser apresentado &#8220;Você deu duplo clique na coluna &amp; e linha &amp;.&#8221;, onde &amp; deverá ser substituído pelo nome da coluna e linha onde ocorreu o duplo clique.</p>
<h3><span style="color: #0000ff;"><span id="more-225"></span> Solução</span></h3>
<h3><span style="font-size: 13px; color: #000000; font-weight: normal;"><strong>Passo 1: </strong>Criar um novo include no programa principal. Para isso, colocar a instrução INCLUDE na seguinte posição:</span></h3>
<h3><span style="color: #0000ff;">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p></span></h3>
<p><script src="https://gist.github.com/1052986.js?file=gistfile1.txt"></script> Dar um duplo clique no nome do include e confirmar a criação do novo objeto. Garanta que o novo objeto seja to tipo include:</p>
<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv7.jpg" alt="" /></div>
<p><strong>Passo 2:</strong> Criar uma classe local para receber e manipular o evento double_click do ALV: <script src="https://gist.github.com/1052990.js?file=ZPURE_ALV_EVENT_HANDLE"></script></p>
<p><strong>Passo 3:</strong> Criar um objeto e registrar o evento no module PBO:</p>
<p><script src="https://gist.github.com/1052998.js?file=gistfile1.txt"></script><br />
Agora você pode ativar o seu programa e testar.</p>
<h3><span style="color: #0000ff;">Execução e Teste</span></h3>
<p>Para executar e testar o programa, apenas pressione F8 ou <img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv2.jpg" alt="" />:</p>
<div>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv6.jpg" alt="" width="699" height="362" /></p>
<div>
<p>Dar um duplo clique em qualque linha e aí uma mensagem deverá ser apresentada:</p>
<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv8.jpg" alt="" /></div>
</div>
</div>
<p>&nbsp;</p>
<h3><span style="color: #0000ff;"><strong>Discussão</strong></span></h3>
<p><strong>Introdução a Eventos</strong></p>
<p>Para eventos sempre temos dois objetos envolvidos, um <em>sender</em> e outro <em>handler</em>. Ou seja, um objeto que dispara o evento e outro que recebe o evento.</p>
<p><strong><em>A principal característica é que o objeto que envia/dispara o evento não sabe quem é que receberá esse evento</em></strong>. Essa é a grande diferênça entre eventos e chamada de métodos. Quando chamamos um método temos que necessariamente saber de qual objeto estamos invocando aquele método.</p>
<p>Um bom exemplo do conceito de eventos é o caso dos passageiros no avião. No avião temos um botão em nossa poltrona que chama o comissário ou comissária para nos atender em alguma solicitação.</p>
<p>Quando apertamos o botão (disparamos um evento) um aviso é dado na &#8220;sala de comissários&#8221;, e um dos deles virá lhe atender. Repare que você não sabe qual comissário (classe) irá lhe atender, até que o comissário apareça (objeto).</p>
<p><strong>Implementando Eventos</strong></p>
<p>Para implementar um evento, precisamos de 4 passos:</p>
<p>Na classe Sender:</p>
<p>i &#8211; Declarar o nome do evento, usando a declaração EVENTS na DEFINITION da classe sender.<br />
ii &#8211; Disparar o evento no método onde o evento deve ser disparado, usando o comando RAISE EVENT .</p>
<p>Na classe Handler:</p>
<p>iii &#8211; Definir qual método irá responder ao evento, adicionando a cláusula &#8230; FOR EVENT  FOR .<br />
iv &#8211; Registrar o evento, com o comando SET HANDLER.</p>
<p>O registro do evento é responsável por ativar e desativar o evento em tempo de execução (run time).</p>
<p>Voltando ao nosso exemplo do avião, há determinados momentos que os comissários não atenderão a nenhuma solicitação, como por exemplo nas decolagens e aterrisagens. Ou seja, o evento continua sendo disparado (passageiro apertando o botão de chamado) e o sinal continua sendo tocado na &#8220;sala de comissários&#8221;. No entanto, os comissários não lhe atenderão.</p>
<p>O registro de um evento também pode ser seletivo quando a qual objeto o evento será registrado. Por isso temos FOR ALL INSTANCES no comando SET HANDLER. Nesse ponto, podemos definir para qual objeto queremos registrar o evento.</p>
<p>Isso é vital para os casos que temos <a href="http://abap101.com/2009/02/25/como-seria-a-minha-solucao-para-o-desavio-do-alv-duplo/">mais de um grid na tela</a> e queremos responder ao evento de apenas um deles.</p>
<p><strong>Implementando o Evento no ALV</strong></p>
<p>No programa implementado acima, os passos i e ii já foram implementados pela classe standard CL_GUI_ALV_GRID e não precisamos nos preocupar com isso.</p>
<p>Precisamos apenas definir qual classe e método irá responder ao evento. Além disso devemos registrar o evento.</p>
<p>Para isso, devemos identificar o evento e parâmetros que esse evento usará:</p>
<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv9.jpg" alt="" width="700" height="335" /></div>
<p>Com o evento selecionado, clicar em <img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv10.jpg" alt="" /> para acessar os parâmetros do evento:</p>
<div>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv11.jpg" alt="" /></p>
<div>Veja que no evento DOUBLE_CLICK temos alguns parâmetros, dentre eles o campo E_COLUMN, nome da coluna onde ocorreu o evento e a estrutura ES_ROW_NO, que contém o campo ROW_ID que é o número da linha onde ocorreu o evento evento.</div>
</div>
<p>&nbsp;</p>
<h3><span style="color: #0000ff;">Anexos</span></h3>
<p><a href="http://abap101.com/wp-content/uploads/2009/08/NUGG_ZPURE_ALV_EVENT.nugg_1.txt">NUGG_ZPURE_ALV_EVENT.nugg</a></p>
<h3><span style="color: #0000ff;">Veja Também</span></h3>
<p><a href="http://help.sap.com/saphelp_nw2004s/helpdata/en/bf/3bd1369f2d280ee10000009b38f889/frameset.htm">ALV at SAP Help</a><br />
<a href="http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/">Introdução ao ALV &#8211; Série Especial</a><br />
<a href="http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/">ALV Simples &#8211; Usando a Técnica “Pura”</a><br />
<a href="http://abap101.com/2009/08/23/alv-com-field-catalog-usando-a-tecnica-pura-2/">ALV com Field Catalog &#8211; Usando a Técnica “Pura”</a></p>
<p>&nbsp;</p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=de150699-d5eb-8c5a-ba71-49ee5d02b072" alt="" /></div>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2009/08/26/alv-com-evento-usando-a-tecnica-pura/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ALV com Field Catalog &#8211; Usando a Técnica &#8220;Pura&#8221;</title>
		<link>http://abap101.com/2009/08/23/alv-com-field-catalog-usando-a-tecnica-pura-2/</link>
		<comments>http://abap101.com/2009/08/23/alv-com-field-catalog-usando-a-tecnica-pura-2/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 03:28:23 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ALV]]></category>
		<category><![CDATA[Receita ABAP]]></category>

		<guid isPermaLink="false">http://abap101.com/2009/08/23/alv-com-field-catalog-usando-a-tecnica-pura-2/</guid>
		<description><![CDATA[Problema Implementar um relatório ALV, para mostrar todos os dados e todos os campos da tabela SFLIGHT. Também é requerido um novo campo chamado Taxa de Ocupação, onde é mostrado a relação entre capacidade máxima de passageiros e ocupação atual do vôo. Solução Passo 1: Criar um programa executável, sem TOP include, ZPURE_ALV_FIELDCAT. Passo 2: [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2009/08/23/alv-com-field-catalog-usando-a-tecnica-pura-2/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2009/08/23/alv-com-field-catalog-usando-a-tecnica-pura-2/" data-text="ALV com Field Catalog &#8211; Usando a Técnica &#8220;Pura&#8221;"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2009/08/23/alv-com-field-catalog-usando-a-tecnica-pura-2/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2009%2F08%2F23%2Falv-com-field-catalog-usando-a-tecnica-pura-2%2F&amp;linkname=ALV%20com%20Field%20Catalog%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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%2F2009%2F08%2F23%2Falv-com-field-catalog-usando-a-tecnica-pura-2%2F&amp;linkname=ALV%20com%20Field%20Catalog%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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%2F2009%2F08%2F23%2Falv-com-field-catalog-usando-a-tecnica-pura-2%2F&amp;linkname=ALV%20com%20Field%20Catalog%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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%2F2009%2F08%2F23%2Falv-com-field-catalog-usando-a-tecnica-pura-2%2F&amp;title=ALV%20com%20Field%20Catalog%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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><h3><span style="color: #0000ff;">Problema</span></h3>
<p>Implementar um relatório ALV, para mostrar todos os dados e todos os campos da tabela SFLIGHT. Também é requerido um novo campo chamado Taxa de Ocupação, onde é mostrado a relação entre capacidade máxima de passageiros e ocupação atual do vôo.</p>
<h3><span style="color: #0000ff;"><span id="more-216"></span><br />
Solução</span></h3>
<p><strong>Passo 1:</strong> Criar um programa executável, sem TOP include, ZPURE_ALV_FIELDCAT.<br />
<strong>Passo 2:</strong> Criar as referências para os objetos do grid:</p>
<p><strong>Passo 3:</strong> Criar uma tabela interna com todos os campos da tabela transparente SFLIGHT e mais um campo do tipo package, com 2 casas decimais, para guardar o valor calculado da taxa de ocupação.</p>
<p>Criar um tipo local para a nova estrutura contendo o cálculo da taxa de ocupação.</p>
<p>Com o tipo criado, criar os data objects (tabela interna e work area).</p>
<p>Fazer a seleção dos dados da SFLIGHT, logo no início do evento START-OF-SELECTION:</p>
<p>Após fazer a seleção dos dados é necessário efetuar o cálculo da taxa de ocupação e atualizar a tabela interna com esse valor:</p>
<p><strong>Passo 4:</strong> Criar uma tabela interna e work area para a tabela de field catalog:</p>
<p><strong>Passo 5</strong>: Criar e chamar uma tela onde o ALV será apresentado. Para criar a tela, dar um duplo clique no número da tela, confirmar a criação do objeto e entrar com uma descrição:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-23.jpg" alt="" /></p>
<p>Importante: a tela precisa ser classificada como &#8220;Normal&#8221;</p>
<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-1.jpg" alt="" /></div>
<p>Nessa nova tela, é necessário criar um componente chamado &#8220;Custom Control&#8221; <img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-3.jpg" alt="" />, pelo screen painter <img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-5.jpg" alt="" /> onde ALV será apresentado, ou seja, o ALV ficará limitado a essa área. Além disso, atentar para o nome desse componente, pois será utilizado nos próximos passos.</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv02.jpg" alt="" /></p>
<p>Terminado de desenhar onde o ALV será mostrado, é necessário programar o PBO e PAI da screen. Para isso entre na tab Flow Logic, descomente a linha MODULE STATUS_0100, dê um duplo clique na palavra STATUS_0100 e confirme a criação do novo includ. É importante escolher um bom nome para o include, pois todos os MODULES serão escritos nele:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv.jpg" alt="" /></p>
<p>Confirme a inclusão da instrução INCLUDE no programa princial.</p>
<p>No MODULE STATUS_0100, criar o comando SET PF-STATUS &#8216;PF0100&#8242;.</p>
<p>Dar um duplo clique no &#8216;PF0100&#8242; para criar o GUI STATUS. Definir a descrição para o STATUS GUI como Normal Screen:</p>
<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-8.jpg" alt="" /></div>
<p>Na criação do Status Gui, definir uma Function Key para o botão BACK:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv3.jpg" alt="" /></p>
<p>Também precisamos programar o PAI para o botão BACK. Para isso, descomentar  MODULE USER_COMMAND_0100 no flow logic da screen. Dar um duplo clique nesse comando, confirmar a criação de um novo MODULE no mesmo include criado para o module PBO:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv4.jpg" alt="" /></p>
<p>Inserir o seguinte código no MODULE USER_COMMAND_0100.</p>
<p>Ao final do passo 5, já podemos fazer a primeira ativação do nosso programa para verificar se tudo está correto.</p>
<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv5.jpg" alt="" /></div>
<p><strong>Passo 6:</strong> Criar os objetos para o ALV:</p>
<p>No PBO, criar a linha MODULE CREATE_ALV e dar um duplo clique para criar o MODULE. Escolher o mesmo include que já estamos usando para colocar os outros modules:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv.jpg" alt="" /></p>
<p>Nesse module, será colocado os comandos para criação dos objetos para o grid.</p>
<p>Também precisamos montar a tabela interna com o field catalog.</p>
<p>Por último, chamar o método para mostrar o grid:</p>
<p>Agora você pode ativar o seu programa e testar.</p>
<h3><span style="color: #0000ff;">Execução e Teste</span></h3>
<p>Para executar e testar o programa, apenas pressione F8 ou <img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv2.jpg" alt="" />:</p>
<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv6.jpg" alt="" /></div>
<h3><span style="color: #0000ff;"><strong>Discussão</strong></span></h3>
<p>Esse programa é muito parecido com o desse <a href="http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/">post</a>. Mas para esse programa precisamo criar um field catalog para definir as características do novo campo.</p>
<p><strong>Conceituando o Field Catalog do ALV</strong></p>
<p>De uma maneira bem sumarizada podemos dizer que o field catalog é o que define as características das colunas do ALV. Para cada campo do ALV, temos uma linha no field catalog. O field catalog é uma tabela interna, do tipo LVC_T_FCAT (ou também LVC_S_FCAT para estruturas), onde definimos uma séria de características para cada coluna.</p>
<p>Nesse tipo LVC_T_FCAT, temos um campo chamado FIELDNAME, onde é feito o link com a it_outtab, veja novamente como a tabela it_fcat foi preenchida:</p>
<blockquote><p><span style="font-family: 'Courier New';">CLEAR wa_fcat.</span><br />
<span style="font-family: 'Courier New';"> wa_fcat-fieldname = &#8216;TXOCC&#8217;.</span><br />
<span style="font-family: 'Courier New';"> wa_fcat-col_pos = 10.</span><br />
<span style="font-family: 'Courier New';"> wa_fcat-coltext = &#8216;Tx. Occ.&#8217;.</span><br />
<span style="font-family: 'Courier New';"> APPEND wa_fcat TO it_fcat.</span></p></blockquote>
<p>Ou seja, o campo FIELDNAME precisa ser o mesmo nome técnico que está na it_outtab. Veja o detalhe que está em maísculo &#8216;TXOCC&#8217;, caso contrário a classe grid não reconhecerá o campo.</p>
<p><strong>Campos de Referência no Field Catalog</strong></p>
<p>Quando chamamos o método SET_TABLE_FOR_FIRST_DISPLAY passamos o parâmetro I_STRUCTURE_NAME = &#8216;SFLIGHT&#8217;, onde usamos as informações semânticas (labels, documentação etc.) que estão no dicionário. Mas se o campo extra não está presente na SFLIGHT, mas está em outra tabela do dicionário (não é o caso da taxa de ocupação)?</p>
<p>Temos dois campos no field catalog que podemos indicar referência a outro campo e tabela do dicionário, REF_FIELD e REF_TABLE. Se o nosso campo tem a mesma referência técnia e semântica de algúm campo de outra tabela, podemos usar REF_FIELD para indicar o campo e REF_TABLE para indicar a tabela.</p>
<p>Lembrando que podemos sobrescrever qualquer característica usando os outros campos da tabela do field catalog.</p>
<p>Vamos supor que queremos incluir um campo para o telefone no nosso field catalog. O campo da it_outtab é TELEPHONE, e o campo PHONE da tabela SCUSTOM possui as mesmas características e queremos usá-la. A entrada na IT_FCAT ficaria assim:</p>
<blockquote><p><span style="font-family: 'Courier New';">CLEAR wa_fcat.</span><br />
<span style="font-family: 'Courier New';"> wa_fcat-fieldname = &#8216;TELEPHONE&#8217;.</span><br />
<span style="font-family: 'Courier New';"> wa_fcat-ref_table = &#8216;SCUSTOM&#8217;.</span><br />
<span style="font-family: 'Courier New';"> wa_fcat-ref_field = &#8216;PHONE&#8217;.</span><br />
<span style="font-family: 'Courier New';"> APPEND wa_fcat TO it_fcat.</span></p></blockquote>
<p>Outro detalhe interessante seria se no exemplo acima o campo na it_outtab fosse PHONE ao invés de TELEPHONE, como na tabela SCUSTOM, eu não precisaria preencher o campo REF_FIELD no field catalog. Veja como ficaria:</p>
<blockquote><p><span style="font-family: 'Courier New';">CLEAR wa_fcat.</span><br />
<span style="font-family: 'Courier New';"> wa_fcat-fieldname = &#8216;PHONE&#8217;.</span><br />
<span style="font-family: 'Courier New';"> wa_fcat-ref_table = &#8216;SCUSTOM&#8217;.</span><br />
<span style="font-family: 'Courier New';"> APPEND wa_fcat TO it_fcat.</span></p></blockquote>
<p><strong>Detalhes na Chamada do Método SET_TABLE_FOR_FIRST_DISPLAY</strong></p>
<p>Preenchido o field catalog, precisamos passá-lo na chamada do método SET_TABLE_FOR_FIRST_DISPLAY:</p>
<blockquote><p><span style="font-family: 'Courier New';">CALL METHOD r_grid-&gt;set_table_for_first_display</span><br />
<span style="font-family: 'Courier New';"> EXPORTING</span><br />
<span style="font-family: 'Courier New';"> i_structure_name              = &#8216;SFLIGHT&#8217;</span><br />
<span style="font-family: 'Courier New';"> CHANGING</span><br />
<span style="font-family: 'Courier New';"> it_outtab                     = it_sflight</span><br />
<span style="font-family: 'Courier New';"> it_fieldcatalog               = it_fcat.</span></p></blockquote>
<p>Repare que foi usado tanto o it_outtab quanto o i_structure_name. Isso porque parte das refências vêm da definição da tabela transparente SFLIGHT e parte da tabela interna do field catalog.</p>
<p>Ou seja, não precisamos preencher todos os campos do field catalog, mas somente os novos campos e os campos que queremos sobre escrever as características que foram referenciadas do dicionário (i_structure_name).</p>
<h3><span style="color: #0000ff;">Anexos</span></h3>
<p><a href="http://abap101.com/wp-content/uploads/2009/08/NUGG_ZPURE_ALV_FIELDCAT.nugg_.txt">NUGG_ZPURE_ALV_FIELDCAT.nugg</a></p>
<h3><span style="color: #0000ff;">Veja Também</span></h3>
<p><span><a href="http://abap101.com/2008/10/20/exemplos-alv">ABAP Control Exemples</a></span></p>
<p><a href="http://help.sap.com/saphelp_nw2004s/helpdata/en/bf/3bd1369f2d280ee10000009b38f889/frameset.htm">ALV at SAP Help</a></p>
<p>&nbsp;</p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=3de1eb6c-0c2b-8d36-82fe-6c48dbcd050a" alt="" /></div>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2009/08/23/alv-com-field-catalog-usando-a-tecnica-pura-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ALV Simples &#8211; Usando a Técnica &#8220;Pura&#8221;</title>
		<link>http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/</link>
		<comments>http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 05:17:37 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ALV]]></category>
		<category><![CDATA[Receita ABAP]]></category>

		<guid isPermaLink="false">http://abap101.com/?p=198</guid>
		<description><![CDATA[Problema Implementar um relatório ALV, para mostrar todos os dados e todos os campos da tabela SFLIGHT. &#160; Solução Passo 1: Criar um programa executável, sem TOP include, ZPURE_ALV_SIMPLE. &#160; Passo 2: Criar as referências para os objetos do grid. Passo 3: Criar uma tabela interna sem header line e fazer a seleção de todos [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/" data-text="ALV Simples &#8211; Usando a Técnica &#8220;Pura&#8221;"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2009%2F08%2F21%2Falv-simples-usando-a-tecnica-pura%2F&amp;linkname=ALV%20Simples%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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%2F2009%2F08%2F21%2Falv-simples-usando-a-tecnica-pura%2F&amp;linkname=ALV%20Simples%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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%2F2009%2F08%2F21%2Falv-simples-usando-a-tecnica-pura%2F&amp;linkname=ALV%20Simples%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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%2F2009%2F08%2F21%2Falv-simples-usando-a-tecnica-pura%2F&amp;title=ALV%20Simples%20%E2%80%93%20Usando%20a%20T%C3%A9cnica%20%E2%80%9CPura%E2%80%9D" 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><h3><span style="color: #0000ff;">Problema</span></h3>
<p>Implementar um relatório ALV, para mostrar todos os dados e todos os campos da tabela SFLIGHT.</p>
<h3><span style="color: #0000ff;"><span id="more-198"></span>&nbsp;</p>
<p>Solução</p>
<p><span style="font-size: 13px; color: #000000; font-weight: normal;"><strong>Passo 1:</strong> Criar um programa executável, sem TOP include, ZPURE_ALV_SIMPLE.</span></p>
<p>&nbsp;</p>
<p></span></h3>
<p><strong>Passo 2:</strong> Criar as referências para os objetos do grid.</p>
<p><strong>Passo 3:</strong> Criar uma tabela interna sem header line e fazer a seleção de todos os dados da tablea SFLIGHT.</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #800080;">&lt;</span>span <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">style</span><span style="color: #800080;">=</span><span style="color: #808080; font-style: italic;">&quot;font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;&quot;&gt;&lt;strong&gt;Passo 4&lt;/strong&gt;: Criar e chamar uma tela onde o ALV será apresentado. Para criar a tela, dar um duplo clique no número da tela, confirmar a criação do objeto e entrar com uma descrição. Importante: a tela precisa ser classificada como &quot;Normal&quot;:&lt;/span&gt;</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #800080;">&lt;</span>span <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">style</span><span style="color: #800080;">=</span><span style="color: #808080; font-style: italic;">&quot;font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;&quot;&gt;&lt;img style=&quot;max-width: 800px;&quot; src=&quot;http://wp3.abap101.com/wp-content/uploads/2009/08/screen-23.jpg&quot; alt=&quot;&quot; /&gt;&lt;/span&gt;</span></pre></div></div>

<p>&nbsp;</p>
<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-1.jpg" alt="" /></div>
<p>Nessa nova tela, é necessário criar um componente chamado &#8220;Custom Control&#8221; <img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-3.jpg" alt="" />, pelo screen painter <img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-5.jpg" alt="" /> onde ALV será apresentado, ou seja, o ALV ficará limitado a essa área. Além disso, atentar para o nome desse componente, pois será utilizado nos próximos passos.</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-4.jpg" alt="" width="665" height="608" /></p>
<p>Terminado de desenhar onde o ALV será mostrado, é necessário programar o PBO e PAI da screen. Para isso entre na tab Flow Logic, descomente a linha MODULE STATUS_0100, dê um duplo clique na palavra STATUS_0100 e confirme a criação do novo includ. É importante escolher um bom nome para o include, pois todos os MODULES serão escritos nele.</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-6.jpg" alt="" /></p>
<p>Confirme a inclusão da instrução INCLUDE no programa princial:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-7.jpg" alt="" /></p>
<p>No MODULE STATUS_0100, criar o comando SET PF-STATUS &#8216;PF0100&#8242;.</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #800080;">&lt;</span>span <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">style</span><span style="color: #800080;">=</span><span style="color: #808080; font-style: italic;">&quot;font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;&quot;&gt;Dar um duplo clique no 'PF0100' para criar o GUI STATUS. Definir a descrição para o STATUS GUI como Normal Screen:&lt;/span&gt;</span></pre></div></div>

<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-8.jpg" alt="" /></div>
<p>Na criação do Status Gui, definir uma Function Key para o botão BACK:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-9.jpg" alt="" /></p>
<p>Também precisamo programas o PAI para o botão BACK. Para isso, descomentar  MODULE USER_COMMAND_0100 no flow logic da screen. Dar um duplo clique nesse comando, confirmar a criação de um novo MODULE no mesmo include criado para o module PBO:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-10.jpg" alt="" /></p>
<p>Inserir o seguinte código no MODULE USER_COMMAND_0100.</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #800080;">&lt;</span>span <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">style</span><span style="color: #800080;">=</span><span style="color: #808080; font-style: italic;">&quot;font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;&quot;&gt;Ao final do passo 4, já podemos fazer a primeira ativação do nosso programa para verificar se tudo está correto.&lt;/span&gt;</span></pre></div></div>

<div><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/screen-11.jpg" alt="" /></div>
<p><strong>Passo 5:</strong> Criar os objetos para o ALV:</p>
<p>No PBO, criar a linha MODULE CREATE_ALV e dar um duplo clique para criar o MODULE. Escolher o mesmo include que já estamos usando para colocar os outros modules:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv1.jpg" alt="" /></p>
<p>Nesse module, será colocado os comandos para criação dos objetos para o grid:</p>

<div class="wp_syntax"><div class="code"><pre class="abap" style="font-family:monospace;"><span style="color: #800080;">&lt;</span>span <span style="color: #500066; text-transform: uppercase; font-weight: bold; zzz:keyword;">style</span><span style="color: #800080;">=</span><span style="color: #808080; font-style: italic;">&quot;font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;&quot;&gt;Agora você pode ativar o seu programa e testar.&lt;/span&gt;</span></pre></div></div>

<h3><span style="color: #0000ff;">Execução e Teste</span></h3>
<p>Para executar e testar o programa, apenas pressione F8 ou <img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv2.jpg" alt="" />:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2009/08/alv-grid1.jpg" alt="" /></p>
<h3><span style="color: #0000ff;"><strong>Discussão</strong></span></h3>
<p>A vantagem de se usar as classes dos Controls diretamente é que é possível total liberdade para contruir o seu programa da forma que você desejar. Certo que você também precisa se preocupar com todos os detalhes das telas, respostas do usuário etc., mas para atender a solicitações complexas dos usuários é sempre uma boa idéia saber &#8220;escovar um pouco de bits&#8221;.</p>
<p><strong>Control Frameworks</strong></p>
<p>As classes CL_GUI_CUSTOM_CONTAINER e CL_GUI_ALV_GRID fazem parte do Controls Frameworks. Esse framework fornece um conjunto de classes que são utilizados para mostrar dados para o usuário. Temos vários outros Controls, como Tree, HTML, Text Edit etc.</p>
<p>Todos esses controles possuem comportamentos e interações comuns, daí a classe CL_GUI_CUSTOM_CONTAINER. Essa classe fornece a base dos principais recursos para duplo clique, drag-drop etc.</p>
<p>Então temos uma tela e nessa tela definimo o tamanho do nosso grid, usando o screen painter. Nesse espaço será onde o grid será renderizado. Para isso, devemos criar o objeto container e associá-lo a essa área. É esse o papel do parâmetro &#8220;container_name&#8221;, onde associamos o nome &#8220;CONTAINER1&#8243;, definido no screen painter.</p>
<p>Após isso, associamos o objeto grid ao container, usando o parâmetro &#8220;i_parent&#8221; passando a referência do objeto grid. Com isso, temos toda a estrutura montada para o nosso ALV.</p>
<p><strong>Mostrando o ALV </strong></p>
<p>Após toda a estrutura montada, precisamos chamar o método responsável<br />
por apresentar o ALV na tela, SET_TABLE_FOR_FIRST_DISPLAY. É nesse<br />
método que passamos os principais componentes que impactarão a<br />
renderização do grid na tela.</p>
<p>Nesse exemplo muito simples, somente utilizamos o básico, &#8220;i_structure_name&#8221;, para passar a estrutura do grid e &#8220;it_outtab&#8221; que contém os dados do grid.</p>
<p>Em exemplos futuros vou mostrar os outros parâmetros e como eles impactam no grid.</p>
<h3><span style="color: #0000ff;">Anexos</span></h3>
<p><a href="http://abap101.com/wp-content/uploads/2009/08/NUGG_ZPURE_ALV_SIMPLE.nugg_.txt">NUGG_ZPURE_ALV_SIMPLE.nugg</a></p>
<h3><span style="color: #0000ff;">Veja Também</span></h3>
<p><span><a href="http://abap101.com/2008/10/20/exemplos-alv">ABAP Control Exemples</a></span><br />
<a href="http://help.sap.com/saphelp_nw2004s/helpdata/en/bf/3bd1369f2d280ee10000009b38f889/frameset.htm">ALV at SAP Help</a><br />
<a href="http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/">Introdução ao ALV &#8211; Série Especial</a></p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=fb47bac6-1e5a-88a0-8f8e-a13c06401a4d" alt="" /></div>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Introdução ao ALV &#8211; Série Especial</title>
		<link>http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/</link>
		<comments>http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 01:53:00 +0000</pubDate>
		<dc:creator>Flávio Furlan</dc:creator>
				<category><![CDATA[ALV]]></category>
		<category><![CDATA[Receita ABAP]]></category>
		<category><![CDATA[cl_gui_alv_grid]]></category>
		<category><![CDATA[cl_salv_table]]></category>
		<category><![CDATA[reuse]]></category>
		<category><![CDATA[salv]]></category>

		<guid isPermaLink="false">http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/</guid>
		<description><![CDATA[No decorrer dos anos a SAP vem evoluindo em vários sentidos. Vem aumentando a sua experiência na área de negócios, application server e também na parte visual. Nesse sentido, ela evoluiu da tela verde dos terminais mainframe do R/2 para as listas (usando comandos WRITE), passando pelo ALV e agora pelo WebDynpro (WD). O WebDynpro [...]]]></description>
			<content:encoded><![CDATA[<p><a class="a2a_button_facebook_like addtoany_special_service" data-href="http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/"></a><a class="a2a_button_twitter_tweet addtoany_special_service" data-count="horizontal" data-url="http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/" data-text="Introdução ao ALV &#8211; Série Especial"></a><a class="a2a_button_google_plusone addtoany_special_service" data-href="http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/"></a><a class="a2a_button_google_gmail" href="http://www.addtoany.com/add_to/google_gmail?linkurl=http%3A%2F%2Fabap101.com%2F2009%2F08%2F19%2Fintroducao-ao-alv-serie-especial-2%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20ao%20ALV%20%E2%80%93%20S%C3%A9rie%20Especial" 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%2F2009%2F08%2F19%2Fintroducao-ao-alv-serie-especial-2%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20ao%20ALV%20%E2%80%93%20S%C3%A9rie%20Especial" 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%2F2009%2F08%2F19%2Fintroducao-ao-alv-serie-especial-2%2F&amp;linkname=Introdu%C3%A7%C3%A3o%20ao%20ALV%20%E2%80%93%20S%C3%A9rie%20Especial" 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%2F2009%2F08%2F19%2Fintroducao-ao-alv-serie-especial-2%2F&amp;title=Introdu%C3%A7%C3%A3o%20ao%20ALV%20%E2%80%93%20S%C3%A9rie%20Especial" 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>No decorrer dos anos a SAP vem evoluindo em vários sentidos. Vem aumentando a sua experiência na área de negócios, application server e também na parte visual.</p>
<p>Nesse sentido, ela evoluiu da tela verde dos terminais mainframe do R/2 para as listas (usando comandos WRITE), passando pelo ALV e agora pelo WebDynpro (WD).</p>
<p>O WebDynpro é a evolução natural para os browsers, levando a camada de apresentação para os browsers, saindo de cena o famoso Sapgui.</p>
<p>No entando, WD ainda tem muito chão para substituir por completo o Sapgui. Ainda há uma infinidade de programas que precisam ser migrados e isso levará muito tempo.</p>
<p>Enquanto isso, os programas baseados em dynpros (telas) tradicionais ainda ocuparão boa parte do seu tempo programando em ABAP. Por isso, apresento uma série de posts sobre ALV e como programar usando essa tecnologia.<br /><span id="more-244"></span></p>
<p>ALV significa ABAP List Viewer. Como o próprio nome diz, é um gerado de listas, onde os dados são apresentados na seguinte forma:</p>
<p><img style="max-width: 800px;" src="http://wp3.abap101.com/wp-content/uploads/2010/02/zsalv-alv-simple.jpg" height="350" width="699" /></p>
<p>Os dados são apresentados de forma tabular, como uma planilha Excel.</p>
<p>O ALV faz parte de um framework da SAP chamado Control Framework. Nele encontramos uma série de elementos visuais que podemos usar em nossos programas. A idéia aqui é ter uma clara separação da parte visual da parte de negócio. Ou seja, o programador precisa se preocupar com as regras de negócio, como seleção de dados, tratamento de dados etc., e o Control Framework é responsável pela apresentação dos dados.</p>
<p>Perceba que nesse ALV acima temos uma série de botões que já vieram pré-definidos. Nesses botões encontramos funções como ordenação, sumarização, busca, exportação etc. Tudo já está pronto, testado e aprovado. É só saber usar.</p>
<p>A mesma coisa para as colunas com os dados. Somente precisamos informar o conteúdo. O ALV faz o resto, como controlar layout, largura de colunas, ordem das colunas etc. É realmente muito interessante, tanto do ponto de vista de programação quanto para o usuário, que recebe um produto final com ótima usabilidade (já que seu funcionamento é muito parecido com o Excel) e muito bonito.</p>
<p>Podemos encontrar vários outros tipos de Controls. Para uma boa lista, você pode acessar vários exemplos da própria SE80 (ABAP Workbench).</p>
<p><b>Formas de Implementar ALV</b></p>
<p>O ALV é entregue pela SAP através de uma classe global, chamada CL_GUI_ALV_GRID e basicamente temos 3 formas de se implementar essa classe.</p>
<p>A primeira e mais conhecida é usando a function module REUSE_ALV_LIST_DISPLAY e seus vários outros serviços do package SLIS. A SAP encapsulou a implementação da classe CL_GUI_ALV_GRID nessa FM, tornando o trabalho do programador muito simples.</p>
<p>Atualmente, a SAP entrega uma série de outras classes, que fazem parte do pacote SALV, que fazem um serviço similar ao feito pela FM, mas usando chamadas de métodos.</p>
<p>E por último, vem a forma que eu chamo de “pura”, pois não usamos nenhuma classe ou FM para chamar a classe do ALV, mas sim a chamamos diretamente. A princípio dá mais trabalho, mas isso nos dá total controle sobre a nossa aplicação.</p>
<p><b>Quando Usar Cada Implementação</b></p>
<p>Depende. Se for necessário fazer uma aplicação com varios controles na tela, interagindo entre si, com drag-drop, eventos etc., sugiro usar a forma pura.</p>
<p>Agora, se a intenção é apenas um relatório simples a FM e principalmente as classes SALV são as mais aconselhadas, pois você não precisa se preocupar com uma série de coisas que a forma pura precisa fazer.<br /><b><br />Próximos Capítulos</b></p>
<p>Nos próximos posts, vou mostrar várias formas de implementar programas usando ALV. Vou começar pela forma pura, depois passo para o uso das classes SALV e por último exemplos usando as FM REUSE.</p>
<p>Usarei o formato de receita de Receita ABAP, onde mostrarei 3 tipos de problemas, usando as 3 diferentes técnias.</p>
<p>Após essa série de posts, posso afirmar que teremos um conjunto de receitas ABAP, que cubrirão cerca de 70-80% dos problemas de ALV.</p>
<p><b>Progresso</b></p>
<p>Você pode seguir o progresso dos posts, acompanhando os links abaixo, onde eu coloquei as técnicas e os três tipos de problemas.</p>
<p><b>ALV Puro:</b></p>
<ul>
<li><a href="http://abap101.com/2009/08/21/alv-simples-usando-a-tecnica-pura/">Programa simples usando ALV</a></li>
<li><a href="http://abap101.com/2009/08/23/alv-com-field-catalog-usando-a-tecnica-pura-2/">Uso do field catalog</a></li>
<li><a href="http://abap101.com/2009/08/26/alv-com-evento-usando-a-tecnica-pura/">Uso de eventos</a></li>
</ul>
<p><b>SALV</b></p>
<ul>
<li><a href="http://abap101.com/2010/02/12/alv-simples-usando-a-classe-cl_salv_table/">Programa simples usando SALV</a></li>
<li>Uso do field catalog</li>
<li>Uso de eventos</li>
</ul>
<p><b>REUSE</b></p>
<ul>
<li>Programa simples usando ALV</li>
<li>Uso do field catalog</li>
<li>Uso de eventos</li>
</ul>
<p><i><br />UPDATE: Por alguma razão, eu apaguei esse post e perdi os comentários. Esse texto foi recuperado do cache do Google.</i></p>
<p>
<div class="zemanta-pixie"><img class="zemanta-pixie-img" alt="" src="http://img.zemanta.com/pixy.gif?x-id=8b9e91df-791e-8069-ab17-fe23ab589769" /></div>
]]></content:encoded>
			<wfw:commentRss>http://abap101.com/2009/08/19/introducao-ao-alv-serie-especial-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

