3 Seguidores · 236 Postagens

  

InterSystems Caché é um sistema de gerenciamento de banco de dados (DBMS) multimodelo e servidor de aplicações. Veja mais detalhes aqui.

Documentação.

Novo
Artigo Heloisa Paiva · Jun. 26 5m read

Estamos analisando o que precisamos fazer para migrar do uso atual de relatórios Zen para o InterSystems Reports. Um dos desafios para nós é descobrir maneiras de interagir programaticamente com os relatórios do InterSystems Reports a partir de rotinas ObjectScript. Existe uma API Java para isso, mas também é possível gerar um relatório do InterSystems Reports para um objeto stream em ObjectScript sem recorrer ao Java, utilizando um %Net.HttpRequest.

0
0 8
Novo
Artigo Gabriela Paliuco · Jun. 25 4m read
  1. As regras que a linguagem impõe (não são opcionais) 

    Nomes de rotinas, variáveis, classes, propriedades e métodos diferenciam maiúsculas de minúsculas. Mas comandos, funções e variáveis especiais do sistema não diferenciam: WRITE, Write, write e são todas formas válidas do mesmo comando. Isso significa que e são duas classes completamente distintas para o compilador , uma fonte clássica de bugs sutis quando a convenção de capitalização não é seguida com disciplina.

    O símbolo tem significado especial.

0
0 5
Novo
Artigo Gabriela Paliuco · Jun. 25 3m read

Quando alguém abre um código em ObjectScript pela primeira vez, depois de anos trabalhando com Java, C# ou Python, a reação costuma ser de estranhamento. Não há declaração de tipos, não há import de bibliotecas de coleções, e os arrays parecem nascer do nada, sem tamanho definido, sem inicialização. Essa estranheza inicial esconde, na verdade, duas das maiores forças do ObjectScript: sua manipulação de strings extremamente direta e seus arrays multidimensionais, os famosos globals, que funcionam simultaneamente como estrutura de dados em memória e como mecanismo de persistência em disco.

0
0 6
Artigo Vitor Leal da Silva · Jun. 12 2m read

Para desmontar/montar um banco de dados, use os métodos Dismount() e Mount() na classe SYS.Database, disponível no namespace . 

Nota: o ID do banco de dados é o seu diretório (Directory). 

Você encontrará alguns exemplos de como desmontar/montar e verificar se um banco de dados está montado () ou não (), além de visualizar rapidamente todos os atributos de um banco de dados (via zwrite).


%SYS>set db="/opt/irisapp/data" 

%SYS>w ##class(SYS.Database).%OpenId(db).Mounted                     
1
%SYS>w ##class(SYS.Database).%OpenId(db).Dismount()
1
%SYS>w ##class(SYS.Database).%OpenId(db).Mounted   
0
%SYS>w ##class(SYS.Database).%OpenId(db).Mount()   
1
%SYS>w ##class(SYS.Database).%OpenId(db).Mounted
1
%SYS>zw ##class(SYS.Database).%OpenId(db)
+----------------- general information ---------------
|      oref value: 3
|      class name: SYS.Database
|           %%OID: $lb("/opt/irisapp/data","SYS.Database")
| reference count: 2
+----------------- attribute values ------------------
|       %Concurrency = 0  <Set>
|        BlockFormat = 2
|          BlockSize = 8192  <Set>
|             Blocks = 780288
|       BlocksPerMap = 62464
|   ClusterMountMode = 0  <Set>
|     ClusterMounted = 0  <Set>
|        CurrentMaps = 13
|          Directory = "/opt/irisapp/data/"  <Set>
|     DirectoryBlock = 3
|        EncryptedDB = 0  <Set>
|    EncryptionKeyID = ""
|          Expanding = 0
|      ExpansionSize = 0  <Set>
|               Full = 0
| GlobalJournalState = 3  <Get,Set>
|     InActiveMirror = 0
|  LastExpansionTime = "09/06/2023 20:00:01"
|            MaxSize = 0  <Set>
|MirrorActivationRequired = 0
|    MirrorDBCatchup = 0
| MirrorDBCreatedNew = 0
|       MirrorDBName = ""
|     MirrorDBPaused = 0
|   MirrorFailoverDB = 0
|      MirrorNoWrite = 0
|     MirrorObsolete = 0
|      MirrorSetName = ""
|           Mirrored = 0
|            Mounted = 1
| NewGlobalCollation = 5  <Set>
|NewGlobalGrowthBlock = 50  <Set>
|    NewGlobalIsKeep = 0  <Set>
|NewGlobalPointerBlock = 16  <Set>
|   NumberOfConfigDB = 0
|       ROReasonCode = 0
|       ROReasonText = ""
|           ReCreate = 0
|           ReadOnly = 0  <Set>
|    ReadOnlyMounted = 0
|       Reinitialize = 0
|        RequestSize = 0
|       ResourceName = "%DB_IRISAPP-DATA"
|RunCatchupDBOnCreate = 1
|                SFN = 6
|               Size = 6096  <Set>
|           Skeleton = 0
|           SparseDB = 0
+----------------------------------------------------- 
%SYS>
2
0 16
Artigo Evandro Wendt · Maio 3 3m read

Recentemente, substituí meu laptop antigo por um novo e tive que migrar todos os meus dados. Procurei um guia, mas não consegui encontrar nada que explicasse em detalhes como migrar conexões de servidor do InterSystems Studio e do Visual Studio Code de um PC para outro. Simplesmente reinstalar as ferramentas não é suficiente, e migrar todas as conexões manualmente parecia uma perda de tempo. No final, consegui resolver o problema, e este artigo explica como.

InterSystems Studio

Exportando conexões de servidor

Migrar as conexões do Studio foi a parte mais desafiadora.

0
0 23
Artigo Evandro Wendt · Abr. 3 2m read

Motivação

Por que precisamos disso?

  1. Falta de Contexto Compilado: As ferramentas de IA veem apenas o código-fonte; elas não sabem como a rotina compilada final realmente é.

  2. Alucinação de Macros: Como a IA não vê nossos arquivos#includeou macros do sistema, ela frequentemente os “inventa”, desperdiçando tempo durante a depuração.

  3. Lacuna na Documentação: A otimização de lógica mais profunda frequentemente exige compreender macros internas que não estão totalmente documentadas publicamente.

0
0 21
Artigo Evandro Wendt · Abr. 2 2m read

Trabalhar com arquivos geralmente começa de forma simples: abrir o arquivo, ler e processar. Essa abordagem funciona perfeitamente, até que o arquivo seja um Excel.

Uma Suposição Comum

À primeira vista, um arquivo Excel (.xlsx) parece apenas mais um arquivo de dados, linhas, colunas e valores. Nada incomum. Portanto, é natural assumir que ele pode ser lido da mesma forma que um arquivo .txt ou .csv. Mas é aí que as coisas começam a dar errado.

Por que arquivos Excel se comportam de forma diferente

A principal diferença está em como os dados são armazenados:

-> .txt / .

0
0 25
Artigo Evandro Wendt · Mar. 26 2m read

Trabalhando em TI na área da saúde como um desenvolvedor iniciante, especialmente com o InterSystems TrakCare, você rapidamente percebe uma coisa: não se trata apenas de mensagens HL7 ou integrações de backend. Uma grande parte de fazer o TrakCare funcionar bem nos hospitais depende de como ele é configurado, customizado e suportado no lado da aplicação.

É aí que entram pessoas como eu — desenvolvedores tecno-funcionais que entendem tanto a parte técnica quanto o impacto nos fluxos reais de trabalho hospitalares.

Não somos apenas técnicos (ou consultores funcionais)

Nosso papel fica bem no meio.

0
0 19
Artigo Evandro Wendt · Mar. 23 1m read

Rubrica de FAQ da InterSystems

Se você quiser gerar um erro personalizado arbitrário dentro de um bloco TRY, pode passar uma exceção com um throw, da seguinte forma. No exemplo abaixo, um erro personalizado é gerado se Stcount for menor que 1.

ClassClassMethodtry

No exemplo acima, se for menor que 1, um erro como o seguinte será exibido:

USER>

Para mais informações, consulte a seguinte documentação:
ObjectScript command _THROW

Se você quiser criar um código de status arbitrário, faça o seguinte:

0
0 16
Artigo Bruno Santos · Mar. 19 8m read

O problema

Quantas vezes migramos uma instância do IRIS para outra máquina, talvez até para outra versão, e depois de alguns dias percebemos que esquecemos aquela configuração de SSL essencial para que um Business Operation funcione? Ou talvez uma credencial, ou até uma classe solitária em um pacote isolado?

A solução

A solução simples é fazer um checklist¹. Um checklist das entidades que precisamos mover. Porém, checklists simples em documentos do Word muitas vezes são esquecidos ou simplesmente ignorados.

0
1 35
Discussão Heloisa Paiva · Mar. 6

Alguém a fim de uma rodada de golfe?

Você está cansado de fazer uma máquina escrever código para você? Sente falta de resolver problemas por conta própria? Então você está com sorte: nesta rodada, proponho adicionar a regra de não usar IA. Obviamente, é um jogo de honra sem prêmios, então não poderei fiscalizar, mas você saberá... 

Desafio:

Crie uma função que receba uma string como parâmetro e retorne o comprimento da maior sequência de vogais e consoantes alternadas

0
0 35
Artigo Evandro Wendt · Mar. 5 1m read

Olá a todos,

Criei um método para calcular a idade de uma pessoa, ou a idade de um processo, contrato ou qualquer outra coisa que você quiser.

/// Calculate the age from date of birth and other date (by default shoud be today).
/// <b>dateOfBird</b> Date of birth in cache format. ie. $ZDH("1972-01-01",3)
/// <b>day</b> Date to calculate to. ie: $H
ClassMethod AgeAt(dateOfBirth, day) As %Integer{
    quit:dateOfBirth=""
    quit:day=""
    
    set yeardob=$SYSTEM.SQL.DATEPART("year",dateOfBirth)
    set yearday=$SYSTEM.SQL.DATEPART("year",day)
    
    set years=yearday-yeardob
    kill yeardob, yearday
    
    set monthdob=$SYSTEM.SQL.DATEPART("month",dateOfBirth)
    set monthday=$SYSTEM.SQL.DATEPART("month",day)
    if (monthday-monthdob)<0 set years=years-1
    if (monthdob-monthday)=0
    {
        if ($SYSTEM.SQL.DATEPART("day",day) - $SYSTEM.SQL.DATEPART("day",dateOfBirth)) < 0
        {
            set years=years-1
        }
    }
    
    kill monthdob, monthday
    quit years
}
0
0 25
Artigo Evandro Wendt · Fev. 17 6m read

O APM normalmente se concentra na atividade da aplicação, mas coletar informações sobre o uso do sistema fornece dados de contexto importantes que ajudam a entender e gerenciar o desempenho da sua aplicação, portanto estou incluindo o Monitor de Histórico do IRIS nesta série.

Neste artigo, descreverei brevemente como iniciar o Monitor de Histórico do IRIS ou Caché para criar um registro da atividade em nível de sistema, complementando as informações de atividade e desempenho da aplicação que você coleta. Também apresentarei exemplos de SQL para acessar as informações.

0
0 42
Artigo Edilson Eberle Carvalho · jan 29 3m read

Pessoal, a quem interessar possa.....

Desenvolvi uma Classe utilizando o python para ler um arquivo excel e gravar o conteúdo em global. Vejam como ficou: (fiquem a vontade para melhorias ou ajustes)

Class Utils.Importador Extends %RegisteredObject
{ /// Importa uma planilha Excel para a global ^ExcelData
/// Parâmetro: caminhoArquivo (Ex: "C:\Temp\dados.xlsx")
/// Exemplo de uso: Do ##class(Utils.Importador).

1
0 32
Artigo Evandro Wendt · jan 19 1m read

Aqui está um exemplo prático de como importar dados de um arquivo CSV para o Intersystems CACHÉ usando ObjectScript. Supondo que seu arquivo CSV seja simples (por exemplo, separado por vírgulas e com cabeçalhos), você pode usar %Stream.FileCharacter para lê-lo linha por linha e analisar os dados.

ClassMethod ImportCSV(filePath As %String) As %Status {
    Set stream = ##class(%Stream.FileCharacter).%New()
    Set sc = stream.LinkToFile(filePath)
    If 'sc Quit sc

    While 'stream.AtEnd {
        Set line = stream.

0
0 36
Artigo Evandro Wendt · jan 16 3m read

Olá comunidade,

Quero compartilhar minha experiência trabalhando em projetos que lidam com um volume masivo de dados. Ao longo dos anos, tive a oportunidade de lidar com enormes volumes de dados de pacientes, dados de pagadores e logs transacionais enquanto trabalhava na indústria hospitalar. Tive a chance de criar relatórios enormes, que precisavam ser escritos usando lógicas avançadas para buscar dados em múltiplas tabelas, cujos índices não ajudavam a escrever código eficiente.

Aqui está o que aprendi sobre como gerenciar grandes volumes de dados de forma eficiente.

Escolhendo o melhor método de acesso aos dados

Como todos nós da comunidade sabemos, o IRIS oferece múltiplas maneiras de acessar dados. A escolha do método correto depende do requisito.

  • Acesso direto a global: o mais rápido para operações de leitura/gravação em massa. Por exemplo, se eu precisar percorrer índices e buscar dados de pacientes, posso percorrer as globais para processar milhões de registros. Isso economiza muito tempo.
Set ToDate=+H
Set FromDate=+$H-1 For  Set FromDate=$O(^PatientD("Date",FromDate)) Quit:FromDate>ToDate  Do
. Set PatId="" For  Set PatId=$Order(^PatientD("Date",FromDate,PatID)) Quit:PatId=""  Do
. . Write $Get(^PatientD("Date",FromDate,PatID)),!
  • Usando SQL: Útil para relatórios ou necessidades analíticas, embora seja mais lento para conjuntos de dados muito grandes.
0
0 35
Artigo Heloisa Paiva · jan 12 5m read

Motivação

Eu não conhecia ObjectScript até começar meu novo emprego. Objectscript não é exatamente uma linguagem de programação jovem. Comparada a C++, Java e Python, a comunidade não é tão ativa, mas estamos empenhados em tornar este lugar mais vibrante, não estamos?

Notei que alguns dos meus colegas acham complicado entender as relações de classes nesses projetos enormes. Não existe nenhuma ferramenta moderna de diagrama de classes fácil de usar para ObjectScript.

Trabalhos Relacionados

Eu testei trabalhos relevantes:

- InterSystems class view: 1. https://github.

0
0 35
Artigo Evandro Wendt · jan 6 2m read

Rubrica de FAQ da InterSystems

Se você tentar eliminar uma global que está mapeada no nível de subscrito a partir do nó raiz, você receberá um erro e ela não será excluída. Isso ocorre porque o comando kill para globais mapeadas no nível de subscrito não pode ser usado atravessando mapeamentos.

// Suppose subscript-mapped globals exist in different databases, as shown below:^TESTK

Para excluir apenas a global no namespace (banco de dados) atual, use o seguinte:

NAMESPACE>
0
0 42
Artigo Evandro Wendt · jan 5 1m read

Olá a todos,

Como parte do desenvolvimento de uma API para saber a qual instância do IRIS está conectada, encontrei alguns métodos para obter informações sobre o servidor que podem ser úteis.

Obter o nome do servidor: $SYSTEM.INetInfo.LocalHostName()

Obter o IP do servidor: $SYSTEM.INetInfo.HostNameToAddr($SYSTEM.INetInfo.LocalHostName())

Obter o nome da instância: $PIECE($SYSTEM,":",2)

Assim, criei o seguinte código como uma classe BS:

ClassExtends%CSP.REST

Chamando o método:

localhost:52773/common/api/check

{
  "ServerName": "LAPTOP-KURRO-3",
  "ServerIP": "11.52.197.99",
  "Instance": "HEALTHCONNECT"
}
0
0 45
Artigo Evandro Wendt · jan 4 2m read

Rubrica de FAQ do InterSystems

O utilitário ^%GCMP pode ser usado para comparar o conteúdo de dois globals.

Por exemplo, para comparar ^test e ^test nos namespaces USER e SAMPLES, ficaria assim:

No exemplo abaixo, 700 globais idênticas são criadas nos dois namespaces, e o conteúdo de uma delas é alterado para torná-lo o alvo de detecção.

0
0 45
Artigo Evandro Wendt · jan 4 1m read

Este código fornece os itens de produção configurados com status habilitado ou desabilitado.

Include (Ensemble, EnsUI, EnsUtil)

Class Test.ProductionConfig
{

ClassMethod GetConfigItems() As %Status
{
Set tStatement = ##class(%SQL.Statement).%New()
Set tSC = tStatement.%PrepareClassQuery("Ens.Config.Production","EnumerateConfigItems")
Write tSC,!
Write "ConfigItemName"," ","Enabled",!
#Dim exp As %Exception.SystemException
#Dim rset As %SQL.StatementResult
Set rset = tStatement.%Execute()
Write rset,!
Write rset.%SQLCODE,!
While rset.%Next() {
Try {
Set tConfigName = rset.%GetData(1)
Set tEnabled = rset.

0
0 39
Artigo Evandro Wendt · jan 4 1m read

gj :: configExplorer é uma nova extensão do VS Code que se integra ao Server Manager e utiliza o Structurizr para gerar diagramas de configuração dos seus servidores.

Aqui está um curto vídeo introdutório.

Ao usar a API Nativa do Intersystems IRIS para Node.js, não é necessário instalar nenhum código de suporte nos servidores. Essa escolha de tecnologia também permite que ele participe do atual concurso da Developer Community.

0
0 48
Artigo Evandro Wendt · jan 2 3m read

Você provavelmente conhece essa situação:

Algum tempo atrás, você encontrou uma função $ZU muito especial para um tipo de problema bem específico. Uma espécie de fórmula mística. Ela se tornou popular e foi usada por muitos desenvolvedores em todo o seu código e em todas as suas instalações.

Depois de várias versões e atualizações, você é informado pela ISC de que seu $ZU místico está obsoleto (deprecated) e não é mais suportado. Você é aconselhado a substituí-lo por um novo $something().

Então, como encontrar e documentar o uso desse código misterioso?

0
0 44
Artigo Evandro Wendt · Dez. 31, 2025 1m read

SET atribui um valor à variável em tempo de execução.

#DIM declara a variável e o seu tipo de dado em tempo de compilação.


SET #DIM
Torna a variável dinâmica. Melhora a legibilidade.
Sem tipagem. Habilita IDE auto-completion.
Tempo de execução Util para referência a objetos.

#DIMAs%String

SET ou #DIM? Seu design, suas regras.

0
0 41
Artigo Heloisa Paiva · Dez. 27, 2025 2m read

Você envia uma requisição HTTP e recebe de volta um erro HTTP, mas com uma página de erro HTML que você não esperava... o que está acontecendo? 🤔

Especificamente, por exemplo: talvez você tenha tentado ler um recurso FHIR (ex: /Patient/123) e recebeu uma página de erro 404, embora com outros IDs de pacientes você receba o payload do recurso normalmente — então "a página" definitivamente existe... por que você estaria recebendo uma página de erro 404? 🙄

1
0 54
Artigo Heloisa Paiva · Dez. 22, 2025 2m read

O Poder da Indexação em Tabelas de Banco de Dados

Ao trabalhar com bancos de dados, a maioria dos desenvolvedores entende o conceito de um índice e por que ele é usado: para acelerar a recuperação de dados. Mas o real impacto da indexação muitas vezes só fica claro quando comparamos cenários com e sem ela.

Você sabe o que acontece sem um índice?
Imagine uma tabela com três colunas: Name, Age, e MobileNumber.


Considere esta consulta:

Se a coluna Idade (Age) não tiver um índice, o motor do banco de dados irá:

  • Verificar se o campo da condição WHERE possui um índice.
0
0 48