ir ao artigo Julio Esquerdo · Jun. 9 Graciano, Uma dica: Verifique na classe que você está querendo consultar, dentro de storage, a tag <DataLocation> que informa a global associada a persistência da sua classe. Essa tag sozinha não define o acesso aos dados, mas é um começo. Uma vez que você confirmou que a sua classe está associada a global que você certificou que tem os dados, será necessário confirmar se o mecanismo de acesso está coerente (chaves, níveis, delimitadores, pieces, etc) isso se estivermos falando de um mapeamento feito manualmente. Se tudo estiver OK pode ser um problema de configuração da conexão ODBC que você está utilizando. Um teste útil seria você fazer uma consulta SQL via Portal de Administração->Explorer do Sistema->SQL e então vá para o namespace onde você tem suas tabelas. Faça então uma consulta SQL e veja o resultado. Uma vez feita a consulta você pode consultar o plano de execução que dá detalhes de como foi o acesso aos dados. Isso pode trazer alguma informação adicional.
ir ao artigo Julio Esquerdo · Fev. 27 @Juliano Assis Segue um código bem básico e genérico para exportar dados para um arquivo CSV: ClassMethod exportar(arquivo As %String) As %String{Open arquivo:"WN" // Abre o arquivo para escrita (W) e caso ele não exista cria o arquivo (N)Set next=""Do{Set next=$Order(^Global(next))If next'=""{ Set reg=$Get(^Global(next))If $Piece(reg,"^",3)'=1{Set reg=next_","_$Piece(reg,"|",1)_","_$Piece(reg,"^",2)Use arquivo Write reg,!Set $Piece(^Global(next),"^",3)=1}}} While next'=""Close arquivoQuit "OK"} O código pega os registros da global que ainda não foram marcados como lido e exporta. Então marca o arquivo como lido. Uma próxima leitura pula este registro. Pode substituir o uso do $Order por um SELECT recuperando os registros de uma tabela também. Abraços,
ir ao artigo Julio Esquerdo · Fev. 27 Olá @Juliano Assis Dê uma olhada no post a seguir: https://pt.community.intersystems.com/post/usando-o-python-no-intersyste... O artigo mostra como gerar arquivos excel a partir de classes do InterSystems Iris usando Python. É bem simples e intuitivo. Depois de gerada a rotina é coloca-la no Task Manager conforme a documentação disponível: https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls... Basicamente é usar a opção RunLegacyTask, informar a rotina e definir a periodicidade de execução. Abraços
ir ao artigo Julio Esquerdo · Fev. 20 Olá, Acredito que você possa utilizar o Task manager @Juliano Assis: https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls... A geração do CVS pode ser a rotina que você já tem desenvolvida.
ir ao artigo Julio Esquerdo · jan 19 Olá Gabriel, Entendi que ao acionar a trigger o processo atualiza o banco externo. Talvez a carga de realizar as atualizações de maneira imediata esteja causando os problemas que você mencionou. Uma possível abordagem é manter as triggers, mas não mais atualizar o banco externo, e sim gerar um log das atualizações a serem realizadas dentro do próprio Caché. E ter um processo apartado que faça as atualizações no banco externo a partir deste log. Seria como se fosse uma fila, ou seja, as triggers colocam as informações no log de atualização, e o processo consome este log atualizando o banco externo. Existe neste modelo a vantagem de a qualquer momento você poder reprocessar as atualizações, visto que os dados estarão no log. A desvantagem é um breve delay entre a execução no Caché e a replicação no PostGre, mas acredito por experiências passadas que este delay não será alto, pelo contrário, será bem baixo. A inclusão dos dados no log não devem te gerar nenhum tipo de gargalo pois será uma estrutura do próprio Caché. E a atualização do banco externo será registro a registro, o que não deve gerar nenhum tipo de problema para sua infra pois terá um peso bem baixo de processamento. Espero ter ajudado, e estou à sua disposição para conversarmos. Um abraço!!
ir ao artigo Julio Esquerdo · jan 9 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 InterpretadorSet debug=1Write !,"Rotina: " Read nomeIf nome="" QuitKill ^dicionario(nome)If '$Data(^rMAC(nome)) Write !,"Rotina não existe" QuitSet nlin=+$Get(^rMAC(nome,0,0)) If nlin<1 Write !,"Não existem linhas na rotina" QuitSet clin=0Do {Set clin=clin+1If clin'>nlin{Set txt=^rMAC(nome,0,clin)Set tam=$Length(txt)Set pos=0Set esc=0Do{Set pos=pos+1If 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=posFor Set gpos=gpos+1,cpos=$Extract(txt,gpos) If cpos'?1A&(cpos'?1N) QuitSet global=$Extract(txt,pos,gpos-1)If debug Write globalSet ^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.
ir ao artigo Julio Esquerdo · Dez. 2, 2024 Parabéns a todos que participaram deste concurso. Os artigos publicados foram todos excelentes. E parabéns a InterSystems por organizar o concurso, que estimula a criação de material pela comunidade, compartilhando assim informação. Obrigado pela premiação.