Globais de uma rotina
Existe uma forma de saber quais as globais que são acessadas, gravadas, excluídas por uma rotina?
Através do studio sei que é possível trocar a cor das globais.
Gostaria de saber se temos um método ou global onde elas ficam gravadas.
Comments
Bom dia, Jennifer! Acredito que a melhor solução seja destacar por cores mesmo. Lembrando que se a rotina acessa alguma classe persistente, ela também pode estar modificando globais que não são vistas diretamente no seu código, ou seja, as registradas no storage da classe persistente referenciada.
Oi Heloisa, esse caso não atende minha necessidade, pois preciso acessar essa informação via banco de dados
Olá Jenifer,
Montei o código a seguir para verificar a existência de globais em uma rotina.
A principio ele avalia uma rotina .MAC que fica com seu código na global ^rMAC mas você pode adapta-lo para verificar qualquer uma, inclusive métodos de classes ou qualquer outra estrutura com algum ajuste.
Pseudo ;Pseudo Interpretador
Set debug=1
Write !,"Rotina: " Read nome
If nome="" Quit
Kill ^dicionario(nome)
If '$Data(^rMAC(nome)) Write !,"Rotina não existe" Quit
Set nlin=+$Get(^rMAC(nome,0,0)) If nlin<1 Write !,"Não existem linhas na rotina" Quit
Set clin=0
Do
{
Set clin=clin+1
If clin'>nlin
{
Set txt=^rMAC(nome,0,clin)
Set tam=$Length(txt)
Set pos=0
Set esc=0
Do
{
Set pos=pos+1
If pos'>tam
{
Set car=$Extract(txt,pos)
If car=""""
{
Set esc=$Select(esc=1:0,1:1)
If debug
{
If esc=0 Write !,">>>Fecha aspa"
Else Write !,"<<<Abre aspa"
}} Else {
If 'esc
{
If car="^"
{
If debug Write " <- Achou circunflexo: Vem uma global: "
Set gpos=pos
For Set gpos=gpos+1,cpos=$Extract(txt,gpos) If cpos'?1A&(cpos'?1N) Quit
Set global=$Extract(txt,pos,gpos-1)
If debug Write global
Set ^dicionario(nome,global)=$Piece($Get(^dicionario(nome,global)),"|",1)+1_"|"_$Piece($Get(^dicionario(nome,global)),"|",2,9999)_"|"_clin_","_pos
}
} Else {
If debug
{
Write !," >>>Texto dentro de aspa: ",car
}
}
}
}
} While (pos<tam)}
} While (clin<nlin)
Quit
Fiz um teste básico aqui e funcionou em teste para algumas rotinas minhas.
A global criada ^dicionario, vai trazer a global na chave e como conteúdo o número de vezes que aparece no código seguido das posições onde aparece (linha e posição).
A variavel debug ativa/desativa um debug para ver o que está ocorrendo no código.
O código somente vai avaliar a rotina corrente. Se ele fizer chamadas a métodos ou outros códigos que manipulem globais ele não pegará.
Espero que ajude.