Dicas ABAP

Published on May 7th, 2014 | by Mauricio Cruz

3

RTTS, RTTI, RTTC e você: tudo a ver – Parte 3

Este é o post que vai agregar valor no seu camarote: você aprenderá como criar “qualquer parada” em tempo de execução com o RTTS. Começamos fazendo criações simples, evoluimos para estruturas e terminamos com a criação de tabelas internas.

Para quem chegou de paraquedas na sequência de posts: na Parte 1 você aprende o que esse monte de sigla quer dizer e na Parte 2 aprende a identificar os tipos das variáveis em tempo de execução.  Recomendo a leitura desses dois posts antes de fuçar na criação, pois desta vez não vou entrar em detalhes básicos.

Pronto para virar um mestre do RTTS?

 

Criação de variáveis simples

Para inspecionar uma variável, buscamos a referência no método estático das classes do RTTS utilizando os métodos que começam com “describe_*”.  Para criar uma variável pelo RTTS, podemos utilizar os métodos “getters”. Criamos uma variável referenciando o objeto que recebemos do método “getter”, e utilizamos field-symbols para acessar seu conteúdo.

Imagine que queremos criar uma variável CHAR de exatamente 18 posições, nem mais, nem menos (nem STRING, para dar “aquele” gato e não se preocupar com tamanho). Utilizando a classe CL_ABAP_ELEMDESCR, conseguimos criar qualquer variável com tipo elementar ( integer, string, char, numchar, etc..), do tamanho que quisermos.

Não se assuste com esse papo técnico: analise e entenda o exemplo abaixo. Preste bastante atenção no comando CREATE DATA, pois ele tem uma extensão nova específica do RTTS:

Conceito importante: somente instanciar a classe RTTS não cria, de fato, a variável. Quem aloca a memória e cria variável é o comando CREATE DATA… TYPE HANDLE . O escopo da variável (global/local) segue a declaração do “<nome> TYPE REF TO data”. Se você declarar isso como global, a variável será global, se declarar como local, ela será local. Entenda isto e evite confusões!

Mas e aí, o código acima pareceu muito trabalhoso?

Para o exemplo de uma só variável, fazer todo esse rolê maluco para criar um CHAR de 18 parece insano. Mas não subestime a flexibilidade do RTTS! Modificando um pouco o exemplo acima, podemos criar uma máquina de gerar variáveis. Veja só:

Viu só? Eu fiz um mini-form para reutilizar o código com o CREATE DATA, ASSIGN e o WRITE. Isso aumentou a flexibilidade do meu código, pois o meu form não faz a menor idéia de que tipo de variável ele vai escrever. Mas isso não importa, afinal, qualquer variável criada pela classe CL_ABAP_ELEMDESR pode ser escrita na tela por ele.

Notem que no exemplo eu não estou guardando as variáveis criadas em lugar nenhum, só estou gerando uma variável, escrevendo o seu valor e esquecendo que ela existe.  Na sua implementação você pode guardar os valores declarando variáveis “TYPE REF TO data” diferentes para cada uma das variáveis que você quiser guardar, com o escopo que preferir (global/local).

Outro ponto importante, é notar que a classe CL_ABAP_ELEMDESCR possui um método “getter” específico para cada tipo elementar. Se eu quero um integer, utilizo o GET_I, se quero uma string, o GET_STRING, e assim por diante. Mas como fica quando eu quiser criar algo com base no DDIC, onde uma hora a variável vai ser char, outra hora int, outra hora numchar…?

 

Criação de variáveis com base no DDIC

Deixa eu te contar uma coisa sobre o método “describe_by_name“: sabia que ele é o suficiente para você ter uma referência real de uma variável do DDIC? Ele não serve só para inspeção não! (os exemplos da parte 2 ficaram muito mais interessantes agora, certo? 🙂 )

No caso da criação com base no DDIC, precisamos primeiro descrever um elemento de dados numa das classes do RTTS. Por este motivo, utilizamos a class CL_ABAP_DATADESCR e o método “describe_by_name” para referenciar um elemento de dados do DDIC. Depois é só fazer o CREATE DATA..TYPE HANDLE e o ASSIGN para utilizar a variável.

Simples assim!

Agora, pegue o exemplo da máquina de criar variáveis e aplique no exemplo do DDIC. Será que é possível? Será que dá para fazer outras coisas doidas aliando o RTTS e métodos/form ? 😉

Mas Mauricio, eu só tenho o nome “tabela-campo”, como que eu vou fazer para criar uma variável com base no DDIC só com o campo da tabelaaaaaaaa??????

Peraí… você tem a TABELA e o CAMPO? Então é só descobrir se ele faz referência ao DDIC ou a um tipo pŕe-definido (quando você coloca o tipo direto na SE11), e criar o campo utilizando as classes RTTS que já estudamos. O que?  Você quer saber como descobrir essas coisas?

Pô zumbi, usa o google, tá achando que a vida é fácil? 🙄 😈 Zueira, está aqui o link.

 

Criação de Estruturas

Já vimos anteriormente que as classes do RTTS possuem uma sinergia que atinge mais de 9000. Então, não é surpresa nenhuma descobrir que para criar uma estrutura com RTTS, você primeiro precisa criar os campos indivudalmente, para só então organizá-los em uma estrutura com a classe CL_ABAP_STRUCTDESCR.

No exemplo abaixo criamos uma estrutura com dois campos, um inteiro e um campo do DDIC:

E está pronta a nossa estrutura criada dinamicamente. Se você não conhecia o ASSIGN COMPONENT, leia este post aqui do blog onde dissecamos o comando ASSIGN.

Vamos em frente: primeiro você cria alguns campos, depois cria a estrutura utilizando os campos, e depois…

 

Criação de Tabelas Internas

Agora é só pegar a estrutura do exemplo acima e utilizá-la para criar uma tabela interna! Este exemplo serve também como uma sumarização de tudo que aprendemos sobre criação de variáveis neste post.

Se você só sabia criar tabela interna com aquele método do ALV, saiba que é muito mais legal quando a gente entende o que acontece lá dentro.

Este exemplo também cobre o preenchimento da tabela criada dinâmicamente, afinal, para que serve uma tabela interna se eu não souber como preenchê-la? 🙂

Divirta-se!

Você ainda pode utilizar a tabela interna criada para jogar os dados de um SELECT. É uma tabela interna e você pode fazer o que quiser com ela!

Muita gente procura na internet como criar tabelas dinâmicas, caem nos exemplos do RTTS e ficam sem entender absolutamente nada. Mas falaí: quando você entende a sequência de criação e a lógica da hierarquia de classes, fica bem mais fácil.

 

E aí, tem mais?

Sim, tem muito mais. Minha intenção é que esta sequência de posts consiga lhe mostrar a importância de compreender o RTTS para ser capaz de criar aplicações que fazem coisas malucas. (Ou, pelo menos, deixar aquele dev com cara de WTF quando olhar o seu programa 😀 ).

O RTTS pode criar outras coisas além destas explicadas (como instâncias de classes!). Pesquise na hierarquia RTTS, que descrevemos na primeira parte.

Como sugestão de estudo para aprimorar os conhecimentos, tente aliar o que aprendeu na parte 2 com a parte 3 para criar uma estrutura a partir de um TYPES declarado no seu programa.

Eu também cobri a criação utilizando os getters e com base no describe_by_name,  mas você irá notar que as classes RTTS possuem métodos com o prefixo create. Descubra lendo o help das classes porque eu ignorei a criação com os creates .

Se você tiver alguma experiência legal com RTTS e quiser compartilhar, comente! Aproveite este espaço deixar registrado a sua sugestão de uso para os seus camaradas zumbis.

 

Baixe todos os exemplos

Acesse a página do ABAPZombie no Github para baixar todos os exemplos desta sequencia de posts.

Sempre que você precisar de um código aqui do site, acesse o link “Códigos ABAPZombie” no menu lateral. Fique a vontade para nos enviar correções direto no repositório do Github!

 

Acaboooooou!

Foram 3 semanas, muito código, muitas siglas e muitas piadas idiotas… mas chegamos ao fim! Se você gostou, compartilhe via facebook, twitter, google plus, telefone, sms, sinal de fumaça, grite para o amigo do lado, pombo correio – qualquer jeito ajuda.

Abraços a todos aqueles que gostaram de sequência mas não entenderam a piada do título 🙁


About the Author

é pasteleiro há alguns anos e criou o ABAPZombie junto com o Mauro em 2010. Gosta de filosofar sobre fundamentos básicos da programação e assuntos polêmicos. Músicas estranhas, artes marciais e games indies são legais. Zumbis não. Converse comigo no twitter e conheça o meu livro de ABAP!



3 Responses to RTTS, RTTI, RTTC e você: tudo a ver – Parte 3

  1. Muito boa a série.

    Por acaso eu fiz uma classe louca que da um submit num programa que gera um alv que busca as informações desse alv com uma classe maluca que retorna uma tabela dinamica que tem que ser identificada usando essas classes doidonas para transformar isso em alguma coisa que a classe inicial pudesse usar.

    Quem sabe um dia eu transformo isso num exemplo bacana pra postar.

    Abraços a todos que não entenderam nada na frase sem pontuação

    • Valeu manolo que bom que voce gostou espero que voce possa ajustar essa parada ae que voce criou para compartilhar com os seus amiguinhos eu acho que entendi o que voce fez mas talvez nao tenha entendido danem se os pontos virgulas e etcs abs

  2. Daniel Jesus says:

    RTTS é mara!
    Dá um trabalhinho pra pensar e organizar no inicio ( assim como qq coisa com OO ), mas depois fica supimpa.
    Precisei uma vez criar relatorios dinamicos para calculo de depreciação….o funcional até hoje me ama ! ( coisa rara no mundo ABAP )

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to Top ↑