Pergunta
· jan 7

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.

Product version: IRIS 2023.1
$ZV: IRIS for Windows (x86-64) 2023.1.2 (Build 450U) Mon Oct 16 2023 10:17:46 EDT
Discussão (4)2
Entre ou crie uma conta para continuar

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.