ALV OO – Trabalhando com botões e eventos

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, “não conhecemos” o relatório “write” e vamos direto aos “ALV’s”.

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 OO
  • Inclusão de botões no toolbar do ALV
  • Utilização de eventos
  • Como desabilitar um botão (ele aparece, mas não é possível clicar)
  • Geração de um ALV sem necessidade de criação de um container

Veja também:

  • Como encontrar ícones
  • Utilização de interfaces

    A modelagem utilizada, foi construída de forma a permitir a utilização dos pontos acima citados.

Especificação

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.

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).

E então, vamos ao que interessa!?

No programa principal, devemos criar a tela de seleção e um include, onde codificaremos nossas classes.

Tela de seleção:

Declara-se o select-options para possibilitar a determinação do range das cias aéreas:

 

Selection Screen

Vamos criar também, duas telas (as quais nomeei de “0100” e “0200”, que serão utilizadas na exibição dos ALV’s.

Screens

No include criado, segue declaração da interface:

 

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.

Agora vamos à definição da classe lcl_companies, que será responsável pela leitura dos dados das cias aéreas.

Observe que a classe tem como atributos privados:

  • Objeto r_grid (para criação do grid do alv)
  • Objeto r_connections para referência e criação dos objetos referentes aos vôos (conexões)
  • Tabela gt_scarr, contendo as informações da(s) cia(s) aérea;
  • Tabela de botões a serem excluídos

Através da keyword “INTERFACES”, declaramos a utilização da interface zif_data_reader, com isso, na classe lcl_companies devemos implementar todos os métodos contemplados na interface.

Seguem Implementações:

  • 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.

Nota: quando informamos “cl_gui_container=>screen0” no parâmetro “i_parent” 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).

Para entender melhor, vá até a transação SE24, na classe CL_GUI_ALV_GRID.

Na aba “métodos” você encontrará o “constructor”, clique em “Parâmetros” e verá que o parâmetro “i_parent” é do tipo “CL_GUI_CONTAINER”.

Parameter - "I_PARENT"

Clicando em CL_GUI_CONTAINER, na aba atributos, você encontrará “Screen0”.

Attribute - Screen0

Ou seja, o atributo “Screen0” utiliza a tela como nosso container.

Entendendo a exclusão de botões

Novamente na transação SE24, consulte o método “SET_TABLE_FOR_FIRST_DISPLAY”.

Ao clicar em “parâmetros” você encontrará o “IT_TOOLBAR_EXCLUDING”, de tipo “UI_FUNCTIONS”.

Parameter - toolbar_excluding

Vamos agora para a aba de atributos da classe, onde encontraremos os botões.

CL_GUI_ALV_GRID - Botões

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 “SET_TABLE_FOR_FIRST_DISPLAY” (neste exercício, excluí apenas o botão utilizado para geração de gráficos).

O próximo passo é selecionarmos os dados da tabela SCARR conforme dados da tela de seleção.

  • zif_data_reader~read_data

Observe que quando implementamos um método de uma interface, este é denominado: nome_da_interface~nome_ do_ método.

Neste método, selecionamos os dados conforme critérios informados na tela de seleção.

Quando sy-subrc não é “0” (valores não encontrados), exibimos uma mensagem de erro, caso contrário, chamamos o  método “zif_data_reader~generate_alv”, vide implementação abaixo:

Com os dados selecionados e exibidos na tela, precisamos incluir o botão para visualizarmos as conexões das cias aéreas.

  • set_toolbar – será chamado cada vez que o evento “TOOLBAR” (registrado no constructor!) for disparado pela classe CL_GUI_ALV_GRID.

Consultando os parâmetros deste evento, na transação SE24, podemos verificar que ele exporta o parâmetro “E_OBJECT”, de tipo  “CL_ALV_EVENT_TOOLBAR_SET”.

Nos atributos desta classe, encontraremos o “MT_TOOLBAR”, de tipo “TTB_BUTTON”, finalmente tipo “STB_BUTTON”, onde estão as informações que precisamos.

Veja a implementação do método “set_toolbar”:

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.

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!

Dica: lembre-se de utilizar text-symbols. Na implementação acima, escrevi as informações diretamente no código para facilitar o entendimento!

Nota: informamos o ícone: icon_object_folder, este nome é encontrado na tabela “ICON”, porém, algumas vezes precisamos do parâmetro “internal” quando trabalhamos com ícones. Este pode ser encontrado no programa “SHOWICON”.

  • get_ucomm – é através deste que nosso botão funcionará:

Lembrando que este método será chamado cada vez que o evento “user_command” for disparado (conforme sua declaração), devemos verificar se o “sy-ucomm” é “100_CONN”, ou seja, se nosso botão foi “clicado”.

Com isso, chamamos o método get_current_cel para verificarmos qual foi a linha selecionada.

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.

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:

  • sign      = “I” (Include)
  • Option = “EQ” (Equal, porque informaremos uma única cia aérea.
  • Low      = wa_scarr-carrid (cia aérea da linha selecionada).
  • High    = Não precisamos informar, pois utilizamos “option = EQ”.

Para a classe lcl_companies, ainda precisamos implementar o método:

  • refresh_table:

Este método será chamado após o user_command.

É 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.

Para melhor compreensão, debugue!

Finalmente, vamos à declaração da classe “lcl_connections”.

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

Observe que o constructor é responsável apenas por “importar” o grid gerado na classe lcl_companies.

Vejam abaixo o resultado do nosso exercício:

Tela 0100 - Cias aéreas

Tela 0100, com os as informações das cias aéreas e botão habilitado.

Observe que não há o botão responsável pela geração de gráficos.

Tela 0200 - Conexões

Tela 0200, com informações das conexões e botão desabilitado.

E então, gostaram? baixe o código (Z_ALV_OO ), estude e nos envie suas dúvidas e sugestões!

Veja neste post como utilizar o arquivo.

You may also like...

11 Responses

  1. Edson says:

    Olá, baixei o código mas qnd uso o SAP LINK para importar, não vem o Z_CLASSES. Poderia conferir? Obrigado

  2. Vagnão says:

    Oi Claudia. Gostei do seu exercício. Muito bem elaborado e bem explicado.
    Eu tiraria a declaração do Tables… não faz sentido.

    Outra coisa: cuidado com a informação de que report com Write é “dinossáurico”… Ok, é ultrapassado, mas muita coisa em um sistema SAP ainda depende dele. Sem esse tipo de report, como gerar Livros Fiscais?

    Abraço
    Vagnão

    • Claudia Andressa says:

      Olá Vagnão!

      Obrigada pelos elogios e pelas dicas. Realmente “bobeei” declarando o “tables”. Eu deveria ter criado uma estrutura e declarado o Select-Options para esta estrutura, de forma a não precisar utilizar o “tables”.

      Quanto aos relatórios write, trabalhei com uma transação que imprimia relatórios de balancete. Meu Deus….quanto trabalho! :/

      Obrigada,

      Claudia.

  3. Vagnão says:

    Alguém ainda vai me dizer… livros fiscais? SPED?
    ok!

  4. Mauro Luiz Junior says:

    Parabéns, Excelênte Post.

  5. Miguel Motta says:

    Parabéns, tenho certeza que ainda vou procurar esse post várias vezes para consulta!

  6. Humberto says:

    Estou implementando um ALV orientado a objeto. Gostaria de capturar o evento de um clique na linha, porém não consigo capturar esse evento ( já tentei pelo LEFT_CLICK_DESIGN, LEFT_CLICK_RUN) só que não dispara. Desde já obrigado

  7. Claudia Andressa says:

    Bom dia Humberto!

    Para registrar um único click em uma célula de um resultado do ALV, geralmente utilizamoso hotspot (no field cat e o evento “HOTSPOT_CLICK”), ou então, utilizamos o duplo clique na linha ou célula do ALV, através do evento “DOUBLE_CLICK”.

    Dê uma olhada nestes eventos, e qualquer dúvida, entre em contato novamente!

    Boa sorte!

    Claudia.