Desafio ALV, Difícil ou Trabalhoso?

É 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 vocês lerão é o texto enviado por ela. Tenham uma ótima leitura, pois a vale a pena entender como ela resolver o problema.

Aproveito para estender o convite a outros leitores, caso queiram submeter algum texto, entrem em contato conosco.

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.

Ainda em tempo, tudo dentro do prazo proposto!

Abraços e bons estudos!

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.

O programa deve mostrar os dados da tabela escolhida na tela de seleção (SCARR, SPFLI, SFLIGHT e SBOOK).

Os campos da tela devem estar habilitados somente quando fizerem parte da chave da tabela selecionada.

Tela de Seleção

Parece simples, para você? Não se for um “quase júnior”!

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!

Primeiramente, criei a tela de seleção, conforme o código abaixo:

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

Seguem os valores inseridos nos text-symbols:

text-f01: Filter

text-f02: Display data from table

text-c01 (02, 03 e 04) Os nomes das respectivas tabelas.

Para alterar os nomes exibidos na tela clique no menu: Goto->Text Elements->Selection Texts e insira o texto desejado.

Como criar os textos para a tela de seleção.

Com a tela de seleção finalizada, vamos criar a segunda tela, onde o ALV será exibido.

No Screen Painter da nova tela, insira um objeto Custom Control e atribua um nome. No meu caso ‘CONTAINER1’, conforme figura abaixo:

Screen Painter

 

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.

Para gerar o ALV, precisamos criar os objetos: Container (associado ao container que geramos no Screen Painter) e Grid, vide códigos abaixo.

Declaração das referências aos objetos.

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.

Abaixo, a classe que popula o grid quando a tabela SCARR é selecionada.

Classe LCL_ALV_SCARR - Definition

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.

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.

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:

Classe LCL_ALV_SCARR - Implementation

Outras três classes devem ser criadas, para cada uma das tabelas.

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

Classe LCL_ALV_SBOOK - Definition

Classe LCL_ALV_SBOOK - Implementation

 

De volta ao programa principal, vamos criar os objetos com referência às classes codificadas (no “INITIALIZATION”, assim como os objetos grid e container).

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.

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

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.

Para habilitar / desabilitar os campos da tela, utilizei os métodos set_input e commit_screen da classe lcl_dynpro_handler, sujerida aqui mesmo no blog:

Conclusões

Bom, esta é a minha solução. Espero ter contribuído de alguma forma!

Abaixo, seguem algumas melhorias sugeridas pelo Fábio e Flávio:

  • Da forma como foram implementadas as classes, poderíamos utilizar Interfaces, com os conceitos de herança e polimorfismo;
  • 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).

Seguem alguns links sobre tratamento de tela:

Classe Para Tratamento de Tela de Seleção

ScreenBreaker

ScreenBreaker no Code Exchange

Para quem quiser praticar mais, fica a sugestão de estudar as dicas acima e melhorar o código!

Segue o NUGG file com toda a solução: NUGG_Z_ALV_BLOG.nugg. Veja aqui como abrir esse arquivo.

19 Resultados

  1. Gisele Simonato disse:

    Parabéns Claudia!!! Desejo que vc tenha um futuro brilhante..Bjs

  2. Claudia Estevão disse:

    Obirgada Gi! Que tenhamos um futuro brilhante né kkk Bjs

  3. Lucas Venancio disse:

    Parabéns Claúdia, fui aluno do Flávio e sei que ele pega pesado com os alunos… ahuuahhuahauahuhuauhaau!!! Vou até tentar fazer esse exercício aqui no Minisap. Abratzzz

  4. Renato disse:

    Parabéns ficou muito bom. Estou iniciando e esse site é 10 D+.

    • Fábio Pagoti disse:

      Eu também achei muito legal este post. Em pouco tempo, ele é um dos mais acessados no blog em 2011. O interessante é que a Cláudia explica do início ao fim com o nível de detalhe perfeito para quem está iniciando.

  5. Miguel disse:

    Parabéns Cláudia! Excelente post!
    Código muito bem organizado e explicado.
    Parabéns também ao Furlan por estar sempre propondo novos desafios aos seus alunos. Desafios que são importantes para o crescimento profissional e que exigem a busca por conhecimento além do transmitido em suas aulas.
    Um grande abraço!

  6. Claudia Estevão disse:

    Obrigada a todos! Fico feliz que tenham gostado!

  7. Otimo trabalho Claudia, sucesso pra vc!

  8. Amanda PF disse:

    Boa tarde Cláudia!!!

    Parabéns!!! Muito boa a sua solução!
    Sou iniciante em abap tb, mas iniciantes mesmo rsrs ainda não fiz uma academia, mas estou pensando no assunto… Vou tentar fazer esse exercício no meu minisap tb, só que acho que vou ter dificuldades em algumas etapas… vi que vc criou algumas classes e métodos, ainda não aprende muito bem como criar tudo isso em abap…
    Você teria algum e-mail , pra caso eu tiver dúvidas poder entrar em contato, mais “fácil” com vc???

    Obrigadooo!!!

  9. Amanda PF disse:

    Parabéns Cláudia!!!! Muito boa a sua solução!!!
    Acredito que terá um futuro brilhante! 🙂

    Tb sou iniciante em abap, mas iniciante mesmo, ainda não tive a oportunidade de fazer uma academia, mas estou pensando no assunto….
    Vou baixar o arquivo .nugg e também tentar refazer sua solução aqui para fixar melhor… mas acredito que vou ter dificuldade em criar classes e métodos…
    Você poderia me passar algum e-mail para que eu pudesse entrar em contato com vc mais “fácil” e assim tirar as dúvidas que com certeza terei? rsrs

    Obrigadaaa!!!! e boa sorte!!!

  10. Claudia Estevão disse:

    Olá Amanda!

    Meu e-mail é clauandressa@hotmail.com, também estou começando agora, então podemos nos ajudar!

    Fique avontade para mandar e-mails, e se eu puder ajudar, certamente o farei!

    Boa sorte para você também!

  11. Vagnão disse:

    Isso aí Furlan e Fabio! Sempre aparecem feras nos cursos de ABAP e a Claudia parece ter um grande potencial.
    Falando nisso… manda o CV para eu distribuir aqui pros meus contatos.

    Gostei da solução. Poucas correções, como as já citadas por vocês. Mas a experiência pela melhor técnica vem com o tempo. Não pensei em interfaces, e sim em tabelas internas montadas dinamicamente por field-symbols. Eu acho que iria por esse caminho.

    Abraço
    Vagnão

    • Fábio Pagoti disse:

      Com certeza Vagnão. A Claudia está trabalhando no nosso projeto Open Source “ABAPDoc_v2” e tem demonstrado bastante potencial. Enviei o contato dela pra ti via twitter.

      Abraços!

    • furlan disse:

      Olá Vagnão, a Claudia tem um grande potencial mesmo. Em alguns dias publicaremos a primeira do versão do nosso projeto ABAPDoc2 e você poderá ver o código produzido por ela.

      Esta também já foi convidada para se tornar editora permanente do blog.

  12. João Américo Martins disse:

    Muito bom Claudia, parabéns!!

  13. Claudia Estevão disse:

    Obrigada João!

  14. Paolo disse:

    Meus Parabéns mesmo, muito bem explicado este post.
    Não entendi perfeitamente porque sou iniciante, e também não tenho academia.
    Me perco bastante na orientação à objetos em ABAP.

    • Fábio Pagoti disse:

      Concordo com você Paolo! O post da Claudia ficou muito bem detalhado.
      ALV é um assunto importantíssimo em ABAP mas que muitos ainda patinam. Estude bastante e não deixe de consultar a Wiki e o fórum da SDN para maiores detalhes.
      Quanto ao conhecimento em ABAP Objects, aconselho a se cadastrar nos nossos projetos open source para adquirir este conhecimento.

      Abraços!

  1. janeiro 3, 2012

    […] Desafio ALV, Difícil ou Trabalhoso? […]