25 de junho de 2014

Relatório de request

Fala pessoas.

Nada melhor do que a necessidade (ou a falta de paciência para atividades repetitivas) para nos forçar a achar outras soluções.

Atualmente estou em um projeto onde há várias frentes de trabalho distintas (que não se comunicam, diga-se de passagem) atuando em um mesmo processo ao mesmo tempo, ou seja, vários e vários ABAPs atualizando o mesmo código durante um determinado tempo. Com isso, é comum que esse processo ora tenha a regra que A + B = 10, ora A + B = 17 ou ainda A + B = (12 * 3,14) + √42.

Isso acaba gerando uma situação onde um processo, validado em ambiente QAS há dois dias, não apresente o resultado esperado e validado, e a primeira necessidade é realizar uma verificação de versão de objetos, para verificar quem foi o último ABAP que alterou a regra, para depois disso descobrir o porquê (viu como uma boa comunicação e um processo de documentação centralizado são úteis?!).

Bom, mas você pode dizer que realizar uma verificação de versão de objetos é simples, e eu concordo com isso, mas com uma ressalva: verificar a versão de um objeto é simples, verificar a versão de 5 objetos é simples, mas verificar a versão de mais de 40 objetos distintos espalhados entre mais de 15 requests (e o cenário pode piorar cada vez mais) é um trabalho oneroso (para não dizer um puta saco).

Pensando que isso tem se tornado uma constante no meu dia-a-dia, fui forçado a desenvolver uma solução inteligente (mas não tão quanto eu gostaria por falta de tempo) para esse problema: um relatório de requests, contendo objetos e comparação de transporte, onde eu possa obter de forma simples qual a última request transportada para determinado objeto. Simples não?



Como vou postar o fonte para quem tenha interesse, vou analisar os pontos interessantes desse processo:

Para iniciar o processo, me baseei em duas premissas: 1 - preciso obter essa informação de transporte partindo de DEV e sem me conectar a outros ambientes; 2 - preciso me basear na request (ou requests) para pontos inicial da minha busca.

Logo no início, me vi com algumas dúvidas quanto aos ambientes: quantos são os ambientes (nesse cliente eu sei quantidade, mas e em um próximo), qual a rota de transporte? 
Para isso utilizei uma function muito útil: TMW_GET_TARGET_SYSTEMS. Essa function fornece uma lista de ambiente, numerando a rota de transporte. As descrições dos ambientes, que não são fornecidas por essa função, consegui obter na tabela TMSCSYS. Esse é o ponto onde o processo não ficou interessante, pois, por questões de tempo, acabei restringindo o número máximo de ambiente (feio, eu sei), mas logo vou atualizar o fonte. 

Após resolver as informações sobre ambientes e rotas, utilizei as tabelas E070, E07T e E071 para obter as informações de objetos de cada request. Para evitar informações não necessárias nesse momento, acabei excluindo as informações de objetos CORR (textos) e TABU (TVDIR e TDDAT).

Bom, já tinha as informações dos ambientes e dos objetos das request, hora de obter os dados cruzados. Obtendo as mesmas tabelas acima, fiz uma busca inversa verificando quais outras request possuem os mesmo objetos. De posso de todos os dados, usei a function STRF_READ_COFILE para me fornecer o log de transporte de cada request e usando para comparação de datas de transporte as seguintes regras:
Para ambiente 0 (DEV comumente) obtive a data da função E (Criação de versões após exportação)
Para demais ambientes obtive a data da função G (Geração Abaps e telas) ou A (Ativação de objetos de data dictionary).

Com todas as informações foi somente realizar o cruzamento de informações, verificando se determinado objeto possui uma data de transporte posterior à data presente na minha request e pronto. Para facilitar a visualização coloquei alguns ícones. Acabei realizando todo o desenvolvimento sem objetos, para permitir uma fácil migração entre ambiente.

Às vezes a sua necessidade mais banal pode gerar alguns resultados interessantes. Ainda pretendo atualizar o relatório para conter mais algumas informações, mas por enquanto está me atendendo e espero que possa auxilia-los. 

Caso queiram baixar o fonte (e atualizar para inserir maiores informações - me mandem a versão atualizada depois), vou deixar o link aqui: fontes.

Até mais e obrigado pelos peixes.