#HealthShare

0 Seguidores · 121 Postagens

O InterSystems HealthShare é uma plataforma de informática em saúde para hospitais, redes integradas de distribuição (IDNs) e intercâmbios regionais e nacionais de informações (HIE). O HealthShare inclui o intercâmbio de informações em saúde, agregação de dados, fluxo de trabalho, análise de texto e tecnologia analítica.

Saber mais

Anúncio Heloisa Paiva · Ago. 12, 2024

Os lançamentos de 2024.2 do InterSystems IRIS Data PlatformInterSystems IRIS for Health, e HealthShare Health Connect são agora Generally Available (GA), ou geralmente disponíveis.

DESTAQUES DO LANÇAMENTO

2024.2 é um lançamento de Continuous Delivery (CD), ou entrega contínua. Muitas atualizações e melhorias foram adicionadas a esse lançamento:

Melhorando a Experiência do Desenvolvedor

0
0 57
Artigo Heloisa Paiva · Jul. 30, 2024 3m read

Introdução

Talvez você já tenha reparado que a base HSAUDIT não tem uma tarefa de expurgo já configurada na maioria das versões do HealthShare, e isso pode ser um problema já que ela tem mapeamentos de globais em vários namespaces.

Se você notou que essa base está ocupando muito espaço em disco e está com dificuldades de limpá-la, esse artigo é para você.

Se você já tem uma ideia de como fazer isso, mas está utilizando uma versão mais antiga do HealthShare, onde a tarefa não existe pronta, ou o PurgeByDaysToKeep não existe, esse artigo também é para você.

Passo a passo

Criar a classe de tarefa

0
0 49
InterSystems Oficial Danusa Calixto · Maio 31, 2024

A partir do lançamento da plataforma de dados InterSystems IRIS® 2022.3, a InterSystems corrigiu o mecanismo de execução de licença para incluir solicitações REST e SOAP. Devido a essa alteração, ambientes com licenças não baseadas em núcleo que usam REST ou SOAP podem experimentar maior utilização de licença após a atualização. Para determinar se este aviso se aplica à sua licença InterSystems, siga as instruções nas perguntas frequentes vinculadas abaixo. 

Esta tabela resume a execução:

0
0 62
InterSystems Oficial Fabiano Sanches · Abr. 23, 2024

InterSystems encontrou um defeito que pode induzir falhas em alguns upgrades do HealthShare® Health Connect. O defeito afeta somente instâncias que não foram licenciadas para o uso do FHIR® e que tenham namespaces habilitados para interoperabilidade. Nestas condições, o upgrade irá falhar e mostrar a mensagem de erro <HSFHIRErr> .

Este defeito somente afeta upgrades para a versão 2024.1 do HealthShare Health Connect.

A versão afetada, 2024.1.0.263.0, foi removida da lista de distribuição.  Uma nova Point Release está disponível:

0
0 64
Artigo Danusa Calixto · Abr. 15, 2024 3m read

Visão geral

Muitas vezes enfrentamos problemas de conectividade com implantações do HealthShare (HS) no Microsoft Azure que possuem vários componentes do HealthShare (instâncias ou namespaces) instalados na mesma VM, principalmente quando precisamos nos comunicar com outros componentes do HS enquanto usamos o Azure Load Balancer (ILB) para fornecer a funcionalidade VIP de espelho.  Para detalhes sobre como e por que um balanceador de carga é usado com o espelhamento de banco de dados, confira este artigo da comunidade.

De acordo com a documentação do Azure Load Balancer, https://docs.microsoft.com/en-us/azure/load-balancer/load-balancer-overview#limitations, o comportamento padrão do Azure Internal Load Balancer é o seguinte:

...se um fluxo de saída de uma VM no pool de back-end tentar um fluxo para o front-end do Load Balancer interno no pool em que reside e for mapeado de volta para si mesmo, ambas as pernas do fluxo não corresponderão e o fluxo falhará.

Portanto, uma implantação do HealthShare com várias instâncias ou namespaces em uma determinada VM no pool de servidores do ILB que precisam se comunicar entre si falhará.  Por exemplo, aqui está um caso com a instância de espelho primário do Registro Unified Care Record (UCR) do HealthShare e a instância de espelho primário do HealthShare Patient Index, ambas na mesma VM do Azure.

   

No exemplo acima, o Registro UCR inicia uma conexão com 10.0.1.100 para que possa se comunicar com a instância do Patient Index. Há 50% de chance dessa conexão falhar, dependendo se os membros espelho primários de cada Patient Index e Registro UCR estão no mesmo host (10.0.1.10, nesse caso). 

Essa conexão falha porque o comportamento NAT padrão do ILB do Azure não executa o Source-NAT (SNAT) de entrada, e o IP de origem original é preservado. Os detalhes estão disponíveis no mesmo link da documentação da Microsoft acima:

Quando o fluxo é mapeado de volta para si mesmo, o fluxo de saída parece vir da VM para o front-end, e o fluxo de entrada correspondente parece vir da VM para si mesmo...  

Especificamente, o comportamento padrão do ILB do Azure é o seguinte:

  • O ILB do Azure não executa o Source-NAT de entrada e, portanto, o IP de origem original é preservado
  • Ao usar o conjunto de regras do balanceador de carga padrão para desabilitar o DSR (também conhecido como "IP flutuante"), ele executa o Destination-NAT (DNAT)

Isso resulta no seguinte (novamente, do link da documentação original acima):

Do ponto de vista do SO convidado, as partes de entrada e saída do mesmo fluxo não correspondem dentro da máquina virtual. A pilha TCP não reconhecerá essas metades do mesmo fluxo como parte do mesmo fluxo, já que a origem e o destino não correspondem.

Solução alternativa

Há várias opções disponíveis para solucionar esse problema do ILB do Azure, mas este artigo focará em apenas uma abordagem.

Adicionar um NIC secundário

São necessárias apenas duas etapas para fazer isso, da seguinte maneira:

  • Adicione um NIC secundário à VM com um endereço IP diferente (no diagrama a seguir, um NIC e endereço de .11 foram adicionados)
  • Configure o tráfego que força a rota estática (nível do SO) local destinado ao VIP do ILB (10.0.1.100) do NIC secundário

 

Isso permite que a comunicação seja bem-sucedida, agora que o back-end para o front-end tem endereços IP de origem (10.0.1.11) e destino diferentes (10.0.1.100 > DNAT > 10.0.1.10).

// exiba vários NIC
c:\pstools>ipconfig | findstr /i "ipv4"
   IPv4 Address. . . . . . . . . . . : 10.1.0.10
   IPv4 Address. . . . . . . . . . . : 10.1.0.11
 
// tráfego de rota estática destinado ao front-end do LB do NIC secundário
c:\pstools>route add 10.1.0.100 mask 255.255.255.255 10.1.0.1 if 18   ('if 18' indicates the interface to use for the outbound traffic)
 OK!

**Observação: a sintaxe do seu comando "route add" exato varia dependendo da sua rede exata e topologia de subnet.  Esse exemplo serve apenas para fins ilustrativos.  A documentação sobre o comando Route no Windows pode ser encontrada aqui e o Red Hat Enterprise Linux pode ser encontrado aqui.

0
0 86
Artigo Rochael Ribeiro · Abr. 12, 2024 1104m read

O Enterprise Monitor é um componente do Ensemble e pode ajudar as organizações a monitorar várias produções executadas em diferentes namespaces na mesma instância ou em namespaces executados em várias instâncias.

A documentação pode ser encontrada em:

http://docs.intersystems.com/ens20161/csp/docbook/DocBook.UI.Page.cls?KEY=EMONITOR_all#EMONITOR_enterprise

No Ensemble 2016.1, foram realizadas mudanças para esse utilitário funcionar com ambientes do HealthShare.

Este artigo mostrará o seguinte:

  • Como configurar o Enterprise Monitor para sites do HealthShare
  • Alguns recursos do Enterprise Monitor
  • Alguns recursos do Enterprise Message Viewer

Para este artigo, usei a seguinte versão do HealthShare:

Cache para Windows (x86-64) 2016.1 (Build 656U) Sex 11 Mar 2016 17:42:42 EST [Módulos do HealthShare:Core:14.02.2415 + Linkage Engine:14.02.2415 + Patient Index:14.02.2415 + Clinical Viewer:14.02.2415 + Active Analytics:14.02.2415] __

Configurar o Enterprise Monitor

Criar um novo namespace

O Enterprise Monitor é executado no seu próprio namespace e pode estar localizado em uma instância existente ou separada.  Neste artigo, ele será executado na mesma instância.

Para criar um namespace:

  • Acesse o Portal de Gerenciamento de Sistemas -> System Administration (Administração do sistema) -> Configuration (Configuração) -> System Configuration (Configuração do sistema) -> Namespaces
  • Clique no botão "Create New Namespace" (Criar novo namespace)

Neste exemplo, criei um namespace HSMONITOR.  Também criei um banco de dados chamado HSMONITOR

Captura de tela de como criar um namespace:

Editar o aplicativo da Web

Para instâncias do HealthShare, o aplicativo da Web define, por padrão, o "Session Cookie Path" (Caminho do cookie da sessão) como "/csp/healthshare/".   Se o namespace do Enterprise Monitor estiver em uma instância com outros namespaces do HealthShare, mude o "Session Cookie Path" do namespace do Enterprise Monitor para "/csp/healthshare/[namespace]/".

Para mudar o aplicativo da Web:

  • Acesse o Portal de Gerenciamento de Sistema -> System Administration -> Security (Segurança) -> Applications (Aplicativos) -> Web Applications (Aplicativos da Web)
  • Selecione o aplicativo da Web que foi criado para seu namespace do Enterprise Monitor. No meu caso, é "/csp/healthshare/hsmonitor".
  • Selecione o menu suspenso de "Session Cookie Path" e altere para "/csp/healthshare/[namespace]/". No meu caso, selecionei "/csp/healthshare/hsmonitor/".

Captura de tela de como alterar o aplicativo da Web:

Adicionar uma credencial

O Enterprise Monitor usa serviços da Web para se comunicar com diversos sistemas, então ele precisa de um nome de usuário/senha para validar a comunicação. O Ensemble consegue fazer isso usando credenciais. Todos os namespaces do HealthShare usam credenciais com o nome de usuário "HS_Services"

Vamos adicionar "HS_Services" às credenciais do namespace do Ensemble que criamos para o Enterprise Monitor.

Etapas para criar uma credencial:

  • Acesse o Portal de Gerenciamento de Sistemas ->  Ensemble
  • Selecione o namespace do Enterprise Monitor, se solicitado, ou mude o namespace usando o link "switch" (trocar) no topo do Portal de Gerenciamento de Sistemas.
  • Acesse Configure (Configurar) -> Credentials (Credenciais)
  • Clique no botão "New" (Novas)
  • Defina o ID como "HS_Services"
  • Defina "UserName" (Nome de usuário) como "HS_Services"
  • Defina "Password" como a senha que o "HS_Services" usa para os outros namespaces do HealthShare.

Captura de tela de como adicionar credenciais:

Criar uma produção

Em seguida, criamos uma produção que usa o serviço empresarial "Ens.Enterprise.MonitorService".  Essa é a produção que será executada no namespace do Enterprise Monitor que configuramos.

Confira a seguir a produção que criei.  Observe que ela estende "Ens.Enterprise.Production" e inclui um item de serviço empresarial, que foi adicionado (Ens.Enterprise.MonitorService).

Class HSMONITOR.MonitorProduction Extends Ens.Enterprise.Production
{
XData ProductionDefinition
{
&lt;Production Name="HSMONITOR.MonitorProduction">
    &lt;ActorPoolSize>2&lt;/ActorPoolSize>
    &lt;Item Name="Ens.Enterprise.MonitorService" ClassName="Ens.Enterprise.MonitorService" PoolSize="1" />
&lt;/Production>
}

}

Depois disso, você pode iniciar a produção no namespace do Enterprise Monitor que você criou.  Nesse exemplo, iniciei o HSMONITOR.MonitorProduction no meu namespace HSMONITOR.

Adicionar um sistema empresarial

Agora que a produção está sendo executada, podemos adicionar os sistemas empresariais que queremos monitorar.

Para criar um novo sistema empresarial:

  • Acesse o Portal de Gerenciamento de Sistemas -> Ensemble
  • Confira se você está no namespace do Enterprise Monitor
  • Acesse Configure -> Enterprise Systems (Sistemas empresariais)
  • Clique no novo botão "New Connection" (Nova conexão)

Captura de tela dos sistemas empresariais:

Para adicionar uma nova conexão:

  • Insira o nome
  • Insira o endereço IP da Web
  • Insira o namespace
  • Insira o caminho para o serviço de aplicativo da Web
  • Insira as credenciais Soap
  • Clique no botão "Save" (Salvar).

Captura de tela de como adicionar uma conexão a HSREGISTRY:

Você pode adicionar vários sistemas empresariais para refletir seus ambientes do HealthShare.  É possível adicionar gateways de borda, gateways de acesso, outros componentes do HealthShare, como Personal Community, Patient Index, Health Insight, etc.

A maioria das informações do HealthShare está localizada no registro de serviços.

Coloquei meu namespace do Enterprise Monitor na mesma instância que o HSREGISTRY.

Escrevi e executei o seguinte código no meu namespace HSMONITOR para criar sistemas empresariais de forma automática com base nas informações localizadas no registro de serviços.

Código de amostra:

ClassMethod BuildEM()
{
                set tSaveNamespace = $namespace
                zn "HSREGISTRY"             
           
                set sql="select EndPoint,Name,Info from HS_Registry_Service.SOAP"
                set statement = ##class(%SQL.Statement).%New()
                set tSC = statement.%Prepare(sql)
                quit:$$$ISERR(tSC)
                set result = statement.%Execute()
                while result.%Next() {
                                set tEndPoint = result.EndPoint
                                set tName = result.Name
                                set tInfo = result.Info
                                If tName = "HSREGISTRY" set tName = ":"_tName
                                If tName = "HSPI" set tName = ":"_tName
                                If $p(tName,":",2) = "WebServices" set tName = ":"_tName
                                If tName = "HSCommunity.PIXv3.Consumer" set tName = ":HSCOMMUNITY"
                                Continue:$p(tName,":",2)=""
                                set tMCName = $p(tName,":",2)
                                set tMCNamespace = $p(tEndPoint,"/",6)
                                set tMCWebIP = tInfo
                                set tMCHomePath = "/"_$p(tEndPoint,"/",4,6)_"/"
                                set tMCServicePath = "/"_$p(tEndPoint,"/",4,7)_"/"
                                set aMC(tMCName)=$lb(tMCNamespace,tMCWebIP,tMCHomePath,tMCServicePath)
                }
                zn tSaveNamespace
                ///Now we have an array of namespaces, create Monitor entries
                set tName = ""
                do {
                  set tName=$O(aMC(tName))
                  if tName '="" {
                                set tMonitorClient = ##class(Ens.Enterprise.MonitorClient).%New()
                                set tMonitorClient.Name=tName 
                                set tMonitorClient.WebIPAddress=$list(aMC(tName),2) ;IP/Port
                                set tMonitorClient.Namespace=$list(aMC(tName),1) ;NameSpace
                                set tMonitorClient.HomePage="%25CSP.Portal.Home.zen"
                                set tMonitorClient.HomePath=$list(aMC(tName),3) ;"/csp/healthshare/[namespace]/"
                                set tMonitorClient.QueueThreshold=""
                                set tMonitorClient.ServicePath=$list(aMC(tName),4) ;"/csp/healthshare/[namespace]/services/"
                                set tMonitorClient.SOAPCredentials="HS_Services"
                                set tMonitorClient.SSLCheckServerIdentity="1"
                                set tMonitorClient.SSLConfig=""
                                set tMonitorClient.Version="2016.1.1.108.1."
                                set tSC=tMonitorClient.%Save()
                                w !,tName,": ",$system.Status.DisplayError(tSC)
                  }
                } while tName '= ""
                quit
}

Enterprise Monitor

Agora que temos entradas no sistema empresarial, você verá uma nova opção de menu no namespace do Enterprise Monitor do Ensemble.  Essa nova opção de menu será "Enterprise Monitor".

Captura de tela da nova opção de menu:

Ao selecionar "Enterprise Monitor", vemos o seguinte:

Agora podemos ver em um único local quais produções do HealthShare estão "Running" (em execução) ou "Stopped" (interrompidas), com links para as configurações das que estiverem em execução.

Ao selecionar uma linha, é possível ver os detalhes de cada ambiente.  Confira este exemplo:

Essa tela mostra detalhes sobre:

  • Conexões de entrada
  • Conexões de saída
  • Filas
  • Registro de eventos
  • Gráfico de atividades
  • Lista de mensagens do Ensemble

Você também pode adicionar métricas personalizadas.

Confira mais informações sobre o monitor de produções:

http://docs.intersystems.com/ens20161/csp/docbook/DocBook.UI.Page.cls?KEY=EMONITOR_production

Enterprise Message Viewer

Com o Enterprise Monitor configurado, você também pode conferir o Enterprise Message Viewer.

Neste exemplo, acesse "Patient Search" (Pesquisa de pacientes) no HSACCESS, faça uma consulta, selecione um paciente e veja as informações mostradas no Clinical Viewer.

Ao acessar o Enterprise Message Viewer, é possível ver todos os sistemas chamados e as informações que foram usadas para realizar essa ação do Clinical Viewer.

Agora há um único lugar para ver como as mensagens estão fluindo em todos os sistemas/namespaces no ambiente do HealthShare.

OBSERVAÇÃO:  esse utilitário Enterprise Message Viewer contém somente informações básicas do cabeçalho de mensagens do Ensemble.  Ele fornece links para os detalhes específicos da sessão e direciona você aos detalhes e rastreamentos da mensagem do Ensemble.

Conclusão

O Enterprise Monitor e o Enterprise Message Viewer são ferramentas novas no Ensemble que ajudarão os clientes do HealthShare a gerenciar os ambientes e ver fluxos de trabalho no HealthShare.

Enterprise Monitor:

  • Local único para ver quais ambientes estão em execução e quais foram interrompidos
  • Links para todas as configurações de produção no ambiente do HealthShare
  • Consulta dos detalhes de cada produção, incluindo
    • Conexões de entrada
    • Conexões de saída
    • Filas
    • Registro de eventos
    • Gráfico de atividades
    • Mensagens

Enterprise Message Viewer:

  • Visualização única de todas as mensagens no ambiente do HealthShare
0
0 53
Artigo Rochael Ribeiro · Abr. 8, 2024 3m read

Rubrica de perguntas frequentes da InterSystems

As definições de classe criadas pelos usuários são armazenadas em classes de definição de classe. Elas podem ser usadas para obter uma lista de definições de classes a partir de um programa.

Observação: as classes de definição de classe se referem a todas as classes contidas no pacote %Dictionary.

Na amostra de código abaixo, uma lista de definições de classe é obtida usando o método query Summary da classe %Dictionary.ClassDefinitionQuery.

Class ISJ.Utils
{
ClassMethod ClassInfo()
{
    #dim ex As %Exception.AbstractException
    try {
        set currentNS=$NAMESPACE
        while (1) {
            read "Please specify namespace: ",x
            if x'=""  quit
        }
        set $NAMESPACE=x 
        write !!
        Set statement = ##class(%SQL.Statement).%New()
        Do statement.%PrepareClassQuery("%Dictionary.ClassDefinitionQuery","Summary")
        set rs = statement.%Execute()
        while rs.%Next() {
            set name=rs.%Get("Name")
            if name["%" continue            // Skip the class with % in the name
            if $extract(name,1,3)="csp" continue  // skip csp.*
            if $extract(name,1,3)="csr" continue  // skip csr.*
            write name,!
        }
        set $NAMESPACE=currentNS
    }
    catch ex {
        write "Error occured: ",ex.DisplayString(),!
        set $NAMESPACE=$get(currentNS)
    }
}
}

Veja um exemplo de execução a seguir.

Ao executar o método da classe, será preciso especificar um namespace, então especifique o nome do namespace que você deseja referenciar.

USER>do##class(ISJ.Utils).ClassInfo()
Please specify namespace : USER

CSPX.Dashboard.BarChart CSPX.Dashboard.Chart CSPX.Dashboard.ChartSeries CSPX.Dashboard.FuelGauge

<skip>

INFORMATION.SCHEMA.VIEWTABLEUSAGE ISJ.Utils Test.JSONTest Test.Person Test.REST Test.VSCode.REST

USER>

Artigo relacionado: Como obter a lista de rotinas programaticamente

0
0 95
Artigo Larissa Prussak · Mar. 18, 2024 4m read

Ao usar o InterSystems IRIS como mecanismo de interoperabilidade, todos sabemos e amamos como é fácil usar o Message Viewer para revisar rastreamentos de mensagens e ver exatamente o que está acontecendo em sua produção. Quando um sistema lida com milhões de mensagens por dia, você pode não saber exatamente por onde começar sua investigação.

Ao longo dos meus anos apoiando as produções da IRIS, muitas vezes me peguei investigando coisas como...

  • Que tipo de rendimento esse fluxo de trabalho tem?
  • Onde está o gargalo?
  • Quais são meus erros mais comuns?
0
0 76
Artigo Danusa Calixto · jan 26, 2024 3m read

De acordo com o Databricks, Apache Parquet é um formato de dados de código aberto orientado por colunas que é projetado para o armazenamento e recuperação de dados eficiente. Ele fornece esquemas eficientes de compactação e codificação de dados com um desempenho aprimorado para lidar com dados complexos em massa. O Apache Parquet foi criado para ser um formato de troca comum para ambas as cargas de trabalho em lote e interativas. É semelhante a outros formatos de arquivo de armazenamento colunar disponíveis no Hadoop, especificamente, RCFile e ORC. (fonte: https://www.databricks.com/glossary/what-is-parquet). Confira abaixo as características e os benefícios do Parquet de acordo com o Databricks:

Características do Parquet

  • Formato de arquivo gratuito e de código aberto.
  • Agnóstico a linguagens.
  • Formato baseado em colunas: os arquivos são organizados por coluna, e não por linha, o que economiza armazenamento e acelera as consultas de análise.
  • Usado para casos de uso de análise (OLAP), geralmente, em conjunto com bancos de dados OLTP tradicionais.
  • Compressão e descompressão de dados altamente eficiente.
  • É compatível com tipos de dados complexos e estruturas de dados aninhadas avançadas.

Benefícios do Parquet

  • É bom para armazenar big data de qualquer tipo (imagens, vídeos, documentos e tabelas de dados estruturados).
  • Economiza armazenamento na nuvem ao usar uma compressão de colunas altamente eficiente e esquemas de codificação flexíveis para colunas com diferentes tipos de dados.
  • Taxa de transferência de dados mais alta e melhor desempenho usando técnicas como data skipping, onde as consultas que buscam valores específicos de colunas não precisam ler toda a linha de dados.

Um padrão tão importante quanto esse não poderia ser deixado de fora do InterSystems IRIS, o melhor Data Fabric no mercado. Portanto, agora é possível usar o aplicativo iris parquet (https://openexchange.intersystems.com/package/iris-parquet) para ler e escrever dados parquet.

Procedimentos para instalação

Instalação com Docker

1. Faça o git pull/clone do repositório em qualquer diretório local:

$ git clone https://github.com/yurimarx/iris-parquet.git

2. Abra o terminal nesse diretório e chame o comando para compilar e executar o InterSystems IRIS no contêiner:

$ docker-compose build$ docker-compose up -d

Instalação com ZPM

1. Execute no terminal:

USER> zpm install iris-parquet

2. Instale os arquivos do hadoop e defina a variável ENV como HADOOP_HOME:

wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz && \
    tar -xzf hadoop-3.3.6.tar.gz && \
    echo "export HADOOP_HOME=//hadoop-3.3.6"

Escreva Parquet a partir do SQL

Há duas opções, a partir do ObjectScript ou da API REST:

1. Do ObjectScript (sample: mude pelos seus valores):

Set result = ##class(dc.irisparquet.IrisParquet).SQLToParquet(
        "personSchema",
        "persons",
        "jdbc:IRIS://localhost:1972/IRISAPP",
        "SELECT * FROM dc_irisparquet.SamplePerson",
        "/tmp/sample.parquet"
    )

2. Da API REST:

Ler Parquet para JSON

Há duas opções, a partir do ObjectScript ou da API REST:

1. Do ObjectScript (sample: mude pelos seus valores):

Set result = ##class(dc.irisparquet.IrisParquet).ParquetToJSON(
        "/tmp/"_source.FileName,
        "/tmp/content.json"
        )

2. Da API REST:

0
0 361
InterSystems Oficial Danusa Calixto · jan 19, 2024

InterSystems anuncia sua primeira prévia, como parte do programa de prévia para desenvolvedores da versão 2024.1. Esta versão incluirá InterSystems IRIS®,  InterSystems IRIS® for HealthTM, e HealthShare® Health Connect.

Destaques

0
0 59
Artigo Larissa Prussak · jan 3, 2024 1m read

Rubrica de perguntas frequentes da InterSystems

Se vários produtos InterSystems estiverem instalados no mesmo sistema, a versão mais recente do driver ODBC da InterSystems entre os produtos instalados permanecerá registrada no gerenciador de drivers.

Você pode mudar para qualquer driver alterando a entrada de registro abaixo.

 Observe que a execução de RegFiles.bat não altera o driver ODBC.

A entrada do registro é a seguinte.

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\InterSystems ODBC35 key Driver
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\InterSystems ODBC35 key Setup
0
1 113
Anúncio Danusa Calixto · Dez. 13, 2023
 

 

Últimas Noticias!

Você é um empreendedor de sucesso (não custa sonhar, certo?) e acaba de anunciar ao mundo que está pronto para fundar sua nova startup! Desta vez, você está armado com o poder da GenAI e da InterSystems.

Qual desafio sua nova startup enfrentará para alcançar o sucesso mais uma vez?  🌟🚀

Procuramos desafios importantes que precisam ser resolvidos, mas não há soluções. Quer se trate de transformar os cuidados de saúde, revolucionar a educação, inovar na agricultura ou em qualquer outro domínio – o céu é o limite!

0
0 74
Artigo Danusa Calixto · Dez. 12, 2023 1m read

Está se preparando para usar o VS Code pela primeira vez? Confira se você tem privilégios suficientes.

Você definiu seu servidor Iris nas configurações do VS Code e ainda recebe o erro a seguir?

O VS Code acessa o Iris/HealthConnect usando o web application /api/atelier.  Se você não tem a permissão (ou seja, estiver usando um usuário LDAP para a conexão, e o web application não estiver configurado para a compatibilidade com o LDAP), esse é o motivo pelo qual não é possível conectar.

você também perceberá uma entrada "Login Failure" (Falha no login) no banco de dados de auditoria, além do motivo dela. Peça para o gerente de sistema adicionar a permissão necessária ao web application para que você possa continuar.

Depois de conseguir conectar ao servidor, você talvez não consiga ver todas as classes/projetos no seu namespace. Você vê o erro a seguir?

Para permitir que o usuário 'keren' liste os projetos no namespace 'MAIN', execute esta instrução SQL nele usando uma conta com privilégio suficiente: GRANT SELECT ON %Studio.Project TO 'keren'

A lista de classes/projetos é recuperada ao consultar as tabelas do sistema SQL subjacentes.

Seu gerente de sistema deve executar a seguinte instrução SQL em cada um dos namespaces que você precisa acessar.

GRANT SELECT ON %Studio.Project TO 'keren'

Depois disso, você pode continuar sua jornada de desenvolvimento usando o VS Code.

Keren.

0
0 88
Artigo Danusa Calixto · Nov. 28, 2023 2m read

Neste artigo, demonstro como criar uma coluna de tabela (antes chamada de "propriedades") com suas classes datatype personalizadas ao usar a DDL definida pelo usuário. As propriedades são um membro fundamental da definição de classe persistente. Datatypes são essenciais para definir os tipos de valores armazenados em uma coluna da tabela. Em geral, os nomes de datatype do SQL diferem dos datatypes da InterSystems, como VARCHAR = %String. Você tem a capacidade de criar ou modificar uma tabela ao usar esses datatypes. De fato, você está criando tabelas pela DDL e já tem suas próprias classes de datatype definidas. Esses datatypes devem ser usados ao executar create/alter na sua definição de classe, em vez dos datatypes padrão da InterSystems. Eles são bastante fáceis de usar ao seguir os passos abaixo

Faça login no portal de gerenciamento. Acesse Sistema > Configuração > Mapeamentos de DDL definidos pelo usuário. Crie um novo mapeamento de DDL definido pelo usuário. Adicione o nome do datatype padrão do SQL que será usado nas consultas SQL. Incorpore sua própria classe datatype no Datatype. Pressione o botão Salvar. Tudo pronto para usar na DDL!

Crie/use sua classe datatype

Class Samples.DT.BoolYN [ ClassType = datatype ]
{
/// A implementação está pronta
}

Execute a consulta SQL. - O datatype de DDL definido pelo usuário está no campo IsActive

   CREATE TABLE Employees (
        FirstName VARCHAR(30),
        LastName VARCHAR(30),
        StartDate TIMESTAMP,
        IsActive BIT(%1)
    )

Depois que a consulta é executada. A definição da classe é criada com sua própria classe de datatype

/// Class Sample.Person Extends%Persistent [ ClassType = persistent, DdlAllowed, Final, Owner = {_SYSTEM}, ProcedureBlock, SqlRowIdPrivate, SqlTableName = Person ]
{

Property FirstName As%String(MAXLEN = 50) [ SqlColumnNumber = 2 ];Property LastName As%String(MAXLEN = 50) [ SqlColumnNumber = 3 ];Property StartDate As%Library.TimeStamp [ SqlColumnNumber = 4 ];Property IsActive As Samples.DT.BoolYN [ SqlColumnNumber = 5 ];Parameter USEEXTENTSET = 1;/// O Bitmap Extent Index é gerado automaticamente pela declaração CREATE TABLE da DDL. Não edite o SqlName desse índice. Index DDLBEIndex [ Extent, SqlName = "%%DDLBEIndex", Type = bitmap ]; }

 Você pode usar esses mesmos nomes da DDL definidos pelo usuário na execução da DDL de Datatype no InterSystems IRIS

CREATE TABLE Sample.Person (
            FirstName %String(MAXLEN=50),
            LastName %String(MAXLEN=50),
            StartDate %TimeStamp,
            IsActive BIT(%1)
        ) 
0
0 111
Artigo Danusa Calixto · Set. 1, 2023 12m read

Uma tarefa "grande" ou "pequena" para o ChatGPT?

Eu testei o modelo de programação do GPT da OpenAI há algumas semanas, para ver se ele consegue, por exemplo, fazer algumas transformações de mensagens entre protocolos de saúde. Ele "consegue", em um nível aparentemente razoável. 

Já faz quase 3 semanas, o que é um tempo bastante longo para o ChatGPT, então me pergunto com que rapidez ele cresce e se poderia fazer alguns jobs de engenharia de integração para nós. Por exemplo, ele consegue criar uma ferramenta DTL de COS da InterSystems para transformar o HL7 em uma mensagem FHIR? 

Imediatamente, obtive algumas respostas rápidas, em menos de um ou dois minutos.

##Teste

Primeiro, quero testar se estou falando com o "cara" certo.


Pergunta 1:  como converter mensagens HL7 V2.4 para FHIR STU3?


ChatGPT:

A conversão de mensagens HL7 V2.4 em FHIR STU3 envolve várias etapas, já que os dois padrões têm modelos e estruturas de dados diferentes. Aqui está uma visão geral de alto nível do processo:

  1. Identifique os elementos de dados relevantes na mensagem HL7 que precisam ser mapeados para os recursos FHIR. Isso dependerá do caso de uso específico e dos dados sendo trocados.
  2. Defina as regras de mapeamento para cada elemento de dados. Isso envolve identificar o recurso FHIR equivalente e o elemento que corresponde ao elemento de dados HL7 e qualquer transformação ou tradução necessária.
  3. Escreva um programa ou um script que consiga extrair os dados da mensagem HL7, aplicar as regras de mapeamento e criar recursos FHIR correspondentes. Isso talvez envolva usar uma combinação de expressões regulares, bibliotecas de análise sintática e bibliotecas de criação de recursos FHIR.
  4. Valide os recursos FHIR em relação à especificação STU3 para garantir que estejam em conformidade com o padrão e tenham todos os elementos necessários.

Aqui está um exemplo de como pode ser o processo de conversão de uma mensagem de observação HL7 V2.4 para um recurso FHIR STU3 Observation:

  1. Identifique os elementos de dados relevantes na mensagem HL7, como o código de observação, o valor e as unidades.
  2. Defina as regras de mapeamento para cada elemento de dados, como o mapeamento do código de observação HL7 para um CodeableConcept FHIR e o valor e as unidades para uma Quantity FHIR.
  3. Escreva um programa ou um script que consiga extrair dados da mensagem HL7, aplicar as regras de mapeamento e criar um recurso FHIR Observation com os elementos apropriados.
  4. Valide o recurso FHIR Observation em relação à especificação STU3 para garantir que tenha todos os elementos necessários e seja válido.

Os detalhes específicos da implementação dependerão da linguagem de programação e das bibliotecas usadas, além da mensagem HL7 específica e do recurso FHIR mapeado. É recomendável consultar as especificações HL7 e FHIR e buscar conselhos de especialistas, se necessário.


Além de estar correto, ele responde de maneira mais detalhada do que a maioria dos humanos. Isso chamou minha atenção, então vamos começar.   
 


Pergunta 2: Você pode criar uma amostra de transformação no Python para converter HL7 em FHIR?  


ChatGPT:

Claro! Aqui está uma amostra de snippet de código do Python que demonstra como converter uma mensagem HL7 em um recurso FHIR STU3 Observation:

fromhl7apyimportcorefromfhir.resources.observationimportObservation
# ParsetheHL7messagehl7_message = 'MSH|^~\&|SENDING_APP|SENDING_FACILITY|RECEIVING_APP|RECEIVING_FACILITY|20220527120512||ORU^R01|MSGID12345|P|2.4\r' \
              'OBX|1|NM|GLU^Glucose||100|mg/dL||N|||F|||20220527120512\r'
hl7_parsed = core.parse_message(hl7_message)

# MapHL7elementstoFHIRelementsobservation = Observation()

observation.code = {
    "coding": [{
        "system": "http://loinc.org",
        "code": hl7_parsed.obx[0].observation_id.value,
        "display": hl7_parsed.obx[0].observation_id.value
    }]
}

observation.valueQuantity = {
    "value": hl7_parsed.obx[0].value.value,
    "unit": hl7_parsed.obx[0].units.value,
    "system": "http://unitsofmeasure.org",
    "code": hl7_parsed.obx[0].units.value
}

# Serialize the FHIR resource as JSON
observation_json = observation.json()

# Print the serialized FHIR resource
print(observation_json)



Esse código usa a biblioteca hl7apy para analisar a mensagem HL7 e extrair os elementos de dados relevantes e a classe fhir.resources.observation do módulo fhir.resources pra criar um recurso FHIR Observation.

Nesse exemplo, o código mapeia o ID de observação HL7 para o elemento de código FHIR, e o valor e as unidades HL7 para o elemento FHIR valueQuantity. O recurso FHIR é depois serializado como JSON usando o método json().

Observe que esse é um exemplo simples e você talvez precise mapear mais elementos de dados dependendo do caso de uso específico. Além disso, você precisará instalar as bibliotecas hl7apy e fhir.resources para executar esse código.


Não é uma resposta nada ruim — fornece um código boilerplate decente. Vamos dar um desafio um pouco específico agora: 


Pergunta 3: Você pode fornecer uma amostra de transformação do HL7 V2 para FHIR Stu3 na DTL do COS da InterSystems?


ChatGPT:


Com certeza! Aqui está um exemplo de como transformar uma mensagem HL7 V2 em um recurso FHIR STU3 Observation na DTL (Linguagem de Transformação de Dados) do COS da InterSystems:

Class DTL.HL7toFHIR Extends%RegisteredObject
{

ClassMethod TransformHL7ToObservation(hl7Message As%String) As%String [ CodeMode = expression, DDLAllowed = 0 ]
{
    set src = ##class(EnsLib.HL7.Message).%New()
    set src.DocType = "2.4"
    set src.Parse(hl7Message)

    set obs = ##class(FHIR.Resource.Observation).%New()
    set obs.subject = { "reference": "Patient/"_src.MSH.GetSendingApplication() }
    set obs.status = "final"
    set loincCode = src.GetSegment("OBX", 1).GetField(3).GetField(1)
    set obs.code = { 
        "coding": [ 
            {
                "system": "http://loinc.org", 
                "code": loincCode, 
                "display": loincCode 
            }
        ]
    }

    set value = src.GetSegment("OBX", 1).GetField(5).GetField(1)
    set units = src.GetSegment("OBX", 1).GetField(6).GetField(1)
    set obs.valueQuantity = { 
        "value": value, 
        "unit": units, 
        "system": "http://unitsofmeasure.org", 
        "code": units 
    }

    quit obs.%ToJSON()
}

}

Esse código define um método de classe chamado TransformHL7ToObservation, que pega uma mensagem HL7 V2 como entrada e retorna um recurso FHIR STU3 Observation como uma string JSON.

O método primeiro cria um novo objeto EnsLib.HL7.Message e o usa para analisar a mensagem HL7 de entrada. Em seguida, ele cria um novo objeto FHIR.Resource.Observation e define os elementos subject e status.

Depois, o código extrai o LOINC, o valor e as unidades da mensagem HL7 e os mapeia para os elementos correspondentes no recurso FHIR.

Por fim, o método serializa o recurso FHIR como JSON e o retorna.

Para usar esse método de classe, você pode chamá-lo de outro método COS ou de um sistema externo usando a API REST da InterSystems. Aqui está um exemplo de como chamar o método de outro método COS:

set hl7Message = "MSH|^~\&|SENDING_APP|SENDING_FACILITY|RECEIVING_APP|RECEIVING_FACILITY|20220527120512||ORU^R01|MSGID12345|P|2.4\rOBX|1|NM|GLU^Glucose||100|mg/dL||N|||F|||20220527120512\r"set fhirObservation = ##class(DTL.HL7toFHIR).TransformHL7ToObservation(hl7Message)
write fhirObservation

Você precisará definir as classes EnsLib.HL7.Message e FHIR.Resource.Observation no seu ambiente da InterSystems e ter as permissões apropriadas para executar o código COS.


Essa é provavelmente a resposta mais eficaz e completa que poderíamos esperar em cerca de 25 segundos. Não é?

(Observação: a amostra COS acima não é perfeitamente precisa. É só uma estrutura boilerplate e precisa de mais ajustes para implementações reais. Como @Tete Zhang gentilmente indicou, a classe de mensagem HL7 do nível Ensemble usa ImportFromSting() em vez de Parse(); DocType deve ser mais específico etc. E, aparentemente, parece criar uma nova hierarquia de classe FHIR por conta própria do zero, em vez de usar a canalização FHIR STU3 integrada do HealthShare existente. Seu "raciocínio" parece seguir a resposta anterior da estrutura do Python. Ele não vai ganhar uma certificação Ensemble ou HealthShare por enquanto e tem muito a aprender com mais interações especializadas. No entanto, como uma desculpa, talvez tenhamos que perdoá-lo pelo seu primeiro teste em menos de 2 minutos até o momento.  )   
  

Agora que estamos aqui, precisamos ser justos com as outras opções amplamente usadas que também tenho gostado. Então, continuei com mais algumas perguntas e um pouco mais de fé:


Pergunta 4: Você pode fornecer uma amostra de transformação do HL7 V2 par FHIR Stu3 no Orion Rhapsody?


ChatGPT:

Com certeza! Aqui está um exemplo de como transformar uma mensagem HL7 V2 para um recurso FHIR STU3 Observation no Orion Rhapsody:

  1. Primeiro, crie um novo canal do Rhapsody e adicione um componente do Conector HL7 para receber a mensagem HL7 V2 de entrada.
  2. Adicione um novo componente de Transformação de Dados ao canal e o configure para usar um script personalizado.
  3. No componente de Transformação de Dados, adicione o seguinte script para transformar a mensagem HL7 V2 em um recurso FHIR STU3 Observation:
functiontransform(msg) {

    var hl7 = Packages.ca.uhn.hl7v2.model.v24.message.ORU_R01(msg.getRawData());

    var observation = new Packages.org.hl7.fhir.dstu3.model.Observation();
    observation.setStatus(Packages.org.hl7.fhir.dstu3.model.Observation.ObservationStatus.FINAL);

    var codeableConcept = new Packages.org.hl7.fhir.dstu3.model.CodeableConcept();
    var coding = new Packages.org.hl7.fhir.dstu3.model.Coding();
    coding.setSystem("http://loinc.org");
    coding.setCode(hl7.getRESPONSE().getORDER_OBSERVATION()[0].getOBR().getUniversalServiceIdentifier().getIdentifier().getValue());
    coding.setDisplay(hl7.getRESPONSE().getORDER_OBSERVATION()[0].getOBR().getUniversalServiceIdentifier().getText().getValue());
    codeableConcept.addCoding(coding);
    observation.setCode(codeableConcept);

    var quantity = new Packages.org.hl7.fhir.dstu3.model.Quantity();
    quantity.setValue(hl7.getRESPONSE().getORDER_OBSERVATION()[0].getOBSERVATION()[0].getOBX().getObservationValue()[0].getValue().getValue());
    quantity.setUnit(hl7.getRESPONSE().getORDER_OBSERVATION()[0].getOBSERVATION()[0].getOBX().getUnits().getText().getValue());
    observation.setValue(quantity);

    var reference = new Packages.org.hl7.fhir.dstu3.model.Reference();
    reference.setReference("Patient/" + hl7.getPATIENT_RESULT().getPATIENT().getPid3_PatientIdentifierList()[0].getID().getValue());
    observation.setSubject(reference);

    returnJSON.stringify(observation);
}
  1. Salve o script e teste a transformação enviando uma mensagem HL7 V2 para o canal. O recurso FHIR STU3 Observation transformado deve ser gerado pelo componente de Transformação de Dados no formato JSON.

Esse script usa as bibliotecas HAPI FHIR e HAPI HL7 v2, que estão incluídas no Orion Rhapsody. Ele começa analisando a mensagem HL7 V2 de entrada usando a biblioteca HAPI HL7.

Em seguida, o script cria um novo recurso FHIR STU3 Observation e define os elementos status, code, value e subject com base nos valores correspondentes na mensagem HL7.

Por fim, o script serializa o recurso FHIR como JSON e o retorna.

Esse é só um exemplo simples e talvez não funcione para todos os tipos de mensagem HL7 V2 ou recursos FHIR. Você pode precisar modificar o script para lidar com os diferentes tipos de mensagens ou mapear campos adicionais para o recurso FHIR.



**Pergunta 5 **Você pode criar uma amostra de transformação convertendo HL7 v2.4 em FHIR R4 no mecanismo de integração Mirth?


ChatGPT

Com certeza! Aqui está um exemplo de como transformar uma mensagem HL7 V2.4 para um recurso FHIR R4 Observation no Mirth:

  1. Primeiro, crie um novo canal do Mirth e adicione um conector de origem Listener HL7v2 para receber a mensagem HL7 V2 de entrada.
  2. Adicione um novo conector de destino do JavaScript Writer ao canal e o configure para usar um script personalizado.
  3. No conector JavaScript Writer, adicione o seguinte script para transformar a mensagem HL7 V2 em um recurso FHIR R4 Observation:
var hl7msg = msg['HL7v2 Message'].toString(); // get the HL7 V2 messagevar hl7data = Packages.ca.uhn.hl7v2.parser.Parser.parse(hl7msg); // parse the message with the HAPI HL7 parser// extract values from the HL7 message and create the FHIR resourcevar obs = new Packages.org.hl7.fhir.r4.model.Observation();
obs.setStatus(Packages.org.hl7.fhir.r4.model.Observation.ObservationStatus.FINAL);

var code = new Packages.org.hl7.fhir.r4.model.CodeableConcept();
code.addCoding()
  .setSystem("http://loinc.org")
  .setCode(hl7data.get("OBR-4-1").getValue())
  .setDisplay(hl7data.get("OBR-4-2").getValue());
obs.setCode(code);

var value = new Packages.org.hl7.fhir.r4.model.Quantity();
value.setValue(hl7data.get("OBX-5-1").getValue());
value.setUnit(hl7data.get("OBX-6").getValue());
obs.setValue(value);

var subject = new Packages.org.hl7.fhir.r4.model.Reference();
subject.setReference("Patient/" + hl7data.get("PID-3-1").getValue());
obs.setSubject(subject);

// output the FHIR resource as JSONvar json = org.hl7.fhir.r4.formats.JsonParser().setPrettyPrint(true).encodeResourceToString(obs);
return json;
  1. Salve o script e teste a transformação enviando uma mensagem HL7 V2 para o canal. O recurso FHIR R4 Observation transformado deve ser gerado pelo conector JavaScript Writer no formato JSON.

Esse script usa as bibliotecas HAPI FHIR e HAPI HL7 v2, que estão incluídas no Mirth. Ele começa extraindo a mensagem HL7 V2 do objeto de mensagem do Mirth e a analisando com o parser HAPI HL7.

Em seguida, o script cria um novo recurso FHIR R4 Observation e define os elementos status, code, value e subject com base nos valores correspondentes na mensagem HL7.

Por fim, o script serializa o recurso FHIR como JSON e o retorna.

Esse é só um exemplo simples e talvez não funcione para todos os tipos de mensagem HL7 V2 ou recursos FHIR. Você pode precisar modificar o script para lidar com os diferentes tipos de mensagens ou mapear campos adicionais para o recurso FHIR.


##Conclusões?

Não tenho mais nenhuma conclusão ou próximas etapas, já que até minha imaginação não consegue acompanhar seus saltos.  Parece que há poucas opções para mim agora: posso gastar tempo buscando os estilos de codificação imperfeitos ou repensar os problemas que eu ainda tiver em mais algumas semanas. Preciso pensar com mais cuidado do que nunca sobre o potencial disso. :)

Brincadeiras à parte, estou gostando de postar neste fórum (graças aos anfitriões), mas outro pensamento que me vem à mente é se isso poderia ser um facilitador importante para algum player de nicho competitivo entrar no mercado de consumo em massa, não é?   Por vários motivos, para se sentir realmente confortável com algumas linguagens de codificação e scripts, isso costumava levar anos, mas o cenário está mudando. O ChatGPT oferece documentação, instruções e amostras bem compostas e, nos próximos meses ou anos, talvez consiga também fabricar automaticamente as ferramentas de engenharia da sua escolha.  Ele parece ser capaz de nivelar o campo nas "linguagens" e, no final, o lado não funcional de recursos, como o desempenho, e as qualidades do serviço pareceriam mais  notáveis.  

0
0 105
Artigo Flávio Lúcio Naves Júnior · Ago. 23, 2023 1m read

Pergunta feita várias vezes para InterSystems 

Isso pode ser obtido usando a consulta AllFields query da classe %SYS.ProcessQuery.

Para obter mais detalhes, consulte o documento Process (Job)【IRIS】Process (Job).

Um exemplo de execução no terminal é o seguinte.

1
0 124
Artigo Danusa Calixto · Ago. 11, 2023 12m read

Divertido ou não — quão sério é isso?

Os modelos de linguagem grande estão causando alguns fenômenos nos últimos meses. É claro que eu também estava testando o ChatGPT no final de semana passado, para sondar se ele poderia ser um complemento para alguns chatbots de IA "tradicionais" baseados em BERT que eu estava inventando, ou simplesmente os eliminaria. 

Um pensamento me veio à mente enquanto eu fazia os testes. Sendo um pouco teórico ou filosófico, os padrões de interoperabilidade, como HL7 e FHIR, são uma espécie de "linguagem", certo? O HL7 tem sua própria gramática, regras, vocabulário e até mesmo dialetos — todo sistema fala no seu próprio tom. Por isso, quando uma máquina se comunica com outra, elas precisam de um tradutor (por exemplo, uma transformação de DTL) para alcançar a compreensão mútua. 

Então, olhando em volta, tudo parece ser uma linguagem: codificação, python, javascript e COS são linguagens também. HL7, FHIR e até XML ou JSON são todos linguagens, exceto que são mais estruturados do que linguagens naturais, então devem ser mais fáceis para o GPT aprender? 

Não podemos começar simplesmente reutilizando o modelo de linguagem de programação pré-treinado do GPT para emular uma DTL? Ainda sem nenhum ajuste. Confira abaixo os resultados iniciais:

##Teste 

Modo:   Completo
Modelo:  code-davinci-002
Temperatura: 0
Comprimentomáximo: 1989
Outros:  Padrão
Sequências de interrupção: ###

##1. Transforme o HL7 ADT A01 em A05? 

Entrada:  

##### Translate this function from HL7 V2.8 ADT_A01 to HL7 V2.4 ADT_A05
### HL7 V2.8 ADT_A01 

    MSH|^~\&|ADT1|GOOD HEALTH HOSPITAL|GHH LAB, INC.|GOOD HEALTH HOSPITAL|198808181126|SECURITY|ADT^A01^ADT_A01|MSG00001|P|2.8||
    EVN|A01|200708181123||
    PID|1||PATID1234^5^M11^ADT1^MR^GOOD HEALTH HOSPITAL~123456789^^^USSSA^SS||EVERYMAN^ADAM^A^III||19610615|M||C|2222 HOME STREET^^GREENSBORO^NC^27401-1020|GL|(555) 555-2004|(555)555-2004||S||PATID12345001^2^M10^ADT1^AN^A|444333333|987654^NC|
    NK1|1|NUCLEAR^NELDA^W|SPO^SPOUSE||||NK^NEXT OF KIN
    PV1|1|I|2000^2012^01||||004777^ATTEND^AARON^A|||SUR||||ADM|A0|

### HL7 V2.4 ADT_A05

Saída:

MSH|^~\&|ADT1|GOOD HEALTH HOSPITAL|GHH LAB, INC.|GOOD HEALTH HOSPITAL|198808181126|SECURITY|ADT^A05^ADT_A05|MSG00001|P|2.4||
    EVN|A05|200708181123||
    PID|1||PATID1234^5^M11^ADT1^MR^GOOD HEALTH HOSPITAL~123456789^^^USSSA^SS||EVERYMAN^ADAM^A^III||19610615|M||C|2222 HOME STREET^^GREENSBORO^NC^27401-1020|GL|(555) 555-2004|(555)555-2004||S||PATID12345001^2^M10^ADT1^AN^A|444333333|987654^NC|
    NK1|1|NUCLEAR^NELDA^W|SPO^SPOUSE||||NK^NEXT OF KIN
    PV1|1|I|2000^2012^01||||004777^ATTEND^AARON^A|||SUR||||ADM|A0|

Não está exatamente correto, mas não é nada mal. Ele consegue aprender o vocabulário por natureza, embora não consiga entender o tipo doc ainda.
 

###2. OK, e o pipe e hat HL7 para XML?

##### Translate this function from HL7 to XML
### HL7 
    
    MSH|^~\&|ADT1|GOOD HEALTH HOSPITAL|GHH LAB, INC.|GOOD HEALTH HOSPITAL|198808181126|SECURITY|ADT^A01^ADT_A01|MSG00001|P|2.8||
    EVN|A01|200708181123||
    PID|1||PATID1234^5^M11^ADT1^MR^GOOD HEALTH HOSPITAL~123456789^^^USSSA^SS||EVERYMAN^ADAM^A^III||19610615|M||C|2222 HOME STREET^^GREENSBORO^NC^27401-1020|GL|(555) 555-2004|(555)555-2004||S||PATID12345001^2^M10^ADT1^AN^A|444333333|987654^NC|
    NK1|1|NUCLEAR^NELDA^W|SPO^SPOUSE||||NK^NEXT OF KIN
    PV1|1|I|2000^2012^01||||004777^ATTEND^AARON^A|||SUR||||ADM|A0|
     
### XML

 

Saída

<?xml version="1.0" encoding="UTF-8"?>
    <hl7:ADT_A01 xmlns:hl7="urn:hl7-org:v2xml">
      <hl7:MSH>
        <hl7:MSH.1>|</hl7:MSH.1>
        <hl7:MSH.2>^~\&amp;</hl7:MSH.2>
        <hl7:MSH.3>
          <hl7:HD.1>ADT1</hl7:HD.1>
        </hl7:MSH.3>
        <hl7:MSH.4>
          <hl7:HD.1>GOOD HEALTH HOSPITAL</hl7:HD.1>
        </hl7:MSH.4>
        <hl7:MSH.5>
          <hl7:HD.1>GHH LAB, INC.</hl7:HD.1>
        </hl7:MSH.5>
        <hl7:MSH.6>
          <hl7:HD.1>GOOD HEALTH HOSPITAL</hl7:HD.1>
        </hl7:MSH.6>
        <hl7:MSH.7>
          <hl7:TS.1>198808181126</hl7:TS.1>
        </hl7:MSH.7>
        <hl7:MSH.9>
          <hl7:MSG.1>ADT</hl7:MSG.1>
          <hl7:MSG.2>A01</hl7:MSG.2>
          <hl7:MSG.3>ADT_A01</hl7:MSG.3>
        </hl7:MSH.9>
        <hl7:MSH.10>MSG00001</hl7:MSH.10>
        <hl7:MSH.11>
          <hl7:PT.1>P</hl7:PT.1>
        </hl7:MSH.11>
        <hl7:MSH.12>
          <hl7:VID.1>2.8</hl7:VID.1>
        </hl7:MSH.12>
      </hl7:MSH>
      <hl7:EVN>
        <hl7:EVN.1>
          <hl7:ID.1>A01</hl7:ID.1>
        </hl7:EVN.1>
        <hl7:EVN.2>
          <hl7:TS.1>200708181123</hl7:TS.1>
        </hl7:EVN.2>
      </hl7:EVN>
      <hl7:PID>
        <hl7:PID.1>1</hl7:PID.1>
        <hl7:PID.3>
          <hl7:CX.1>PATID1234</hl7:CX.1>
          <hl7:CX.4>
            <hl7:HD.1>GOOD HEALTH HOSPITAL</hl7:HD.1>
          </hl7:CX.4>
          <hl7:CX.5>
            <hl7:HD.1>ADT1</hl7:HD.1>
          </hl7:CX.5>
          <hl7:CX.6>MR</hl7:CX.6>
        </hl7:PID.3>
        <hl7:PID.5>
          <hl7:XPN.1>EVERYMAN</hl7:XPN.1>
          <hl7:XPN.2>ADAM</hl7:XPN.2>
          <hl7:XPN.3>A</hl7:XPN.3>
          <hl7:XPN.4>III</hl7:XPN.4>
        </hl7:PID.5>
        <hl7:PID.7>
          <hl7:TS.1>19610615</hl7:TS.1>
        </hl7:PID.7>
        <hl7:PID.8>M</hl7:PID.8>
        <hl7:PID.10>
          <hl7:CE.1>C</hl7:CE.1>
        </hl7:PID.10>
        <hl7:PID.11>
          <hl7:XAD.1>2222 HOME STREET</hl7:XAD.1>
          <hl7:XAD.3>GREENSBORO</hl7:XAD.3>
          <hl7:XAD.4>NC</hl7:XAD.4>
          <hl7:XAD.5>27401-1020</hl7:XAD.5>
        </hl7:PID.11>
        <hl7:PID.13>
          <hl7:XTN.1>(555) 555-2004</hl7:XTN.1>
        </hl7:PID.13>
        <hl7:PID.14>
          <hl7:XTN.1>(555)555-2004</hl7:XTN.1>
        </hl7:PID.14>
       ... ...

Agora fica um pouco sério. Aparentemente, já está preparado de alguma forma.   Parece que 1- Não há problema em analisar as mensagens HL7 (o que não era fácil para uma máquina — no passado, precisaria de algumas ferramentas poderosas, como o esquema de doc virtual do ISC bem definido) ; 2- Não há problema em aprender os tipos de dados. 

3. Pipe e hat HL7 para JSON?

Saída:

{
        "MSH": {
            "MSH.1": "|",
            "MSH.2": "^~\\&",
            "MSH.3": {
                "HD.1": "ADT1"
            },
            "MSH.4": {
                "HD.1": "GOOD HEALTH HOSPITAL"
            },
            "MSH.5": {
                "HD.1": "GHH LAB, INC."
            },
            "MSH.6": {
                "HD.1": "GOOD HEALTH HOSPITAL"
            },
            "MSH.7": {
                "TS.1": "198808181126"
            },
            "MSH.9": {
                "MSG.1": "ADT",
                "MSG.2": "A01",
                "MSG.3": "ADT_A01"
            },
            "MSH.10": "MSG00001",
            "MSH.11": {
                "PT.1": "P"
            },
            "MSH.12": {
                "VID.1": "2.8"
            }
        },
        "EVN": {
            "EVN.1": {
                "ID.1": "A01"
            },
            "EVN.2": {
                "TS.1": "200708181123"
            }
        },
        "PID": {
            "PID.1": "1",
            "PID.3": [
                {
                    "CX.1": "PATID1234",
                    "CX.2": "5",
                    "CX.3": "M11",
                    "CX.4": "ADT1",
                    "CX.5": "MR",
                    "CX.6": "GOOD HEALTH HOSPITAL"
                },
                {
                    "CX.1": "123456789"
                },
                {
                    "CX.4": "USSSA",
                    "CX.5": "SS"
                }
            ],
            "PID.5": [
                {
                    "XPN.1": [
                        {
                            "FN.1": "EVERYMAN"
                        },
                        {
                            "ST.1": "ADAM"
                        },
                        {
                            "ST.2": "A"
                        },
                        {
                            "ST.3": "III"
                        }
                    ]
                }
            ],
            "PID.7": {
                "TS.1": "19610615"
            },
            "PID.8": {
                "IS.1": "M"
            },
            "PID.10": {
                "CE.1": "C"
            },
            "PID.11": [
                {
                    "XAD.1": [
                        {
                            "SAD.1": "2222 HOME STREET"
                        },
                        {
                            "SAD.3": "GREENSBORO"
                        },
                        {
                            "SAD.4": "NC"
                        },
                        {
                            "SAD.5": "27401-1020"
                        }
                    ]
                },
                {
                    "CE.1": "GL"
                }
            ],
            "PID.13": [
                {
                    "XTN.1": "(555) 555-2004"
                },
                {
                    "XTN.1": "(555)555-2004"
                }
            ],
            "PID.16": {
                "IS.1": "S"
            },
            "PID.19": [
                {
                    "CX.1": "PATID12345001",
                    "CX.2": "2",
                    "CX.3": "M10",
                    "CX.4": "ADT1",
                    "CX.5": "AN",
                    "CX.6": "A"
                },
                {
                    "CX.1": "444333333"
                },
                {
                    "CX.1": "987654",
                    "CX.5": "NC"
                }
            ]
        },
        "NK1": [
            {
                "NK1.1": "1",
                "NK1.2": [
                    {
                        "XPN.1": [
                            {
                                "FN.1": "NUCLEAR"
                            },
                            {
                                "ST.1": "NELDA"
                            },
                            {
                                "ST.2": "W"
                            }
                        ]
                    },
                    {
                        "CE.1": "SPO",
                        "CE.2": "SPOUSE"
                    }
                ]
            }
        ],
        "PV1": {
            "PV1.1": "1",
            "PV1.2": {
                "IS.1": "I"
            },
            "PV1.3": [
                {
                    "PL.1": "2000"
                },
                {
                    "PL.2": "2012"
                },
                {
                    "PL.3": "01"
                }
            ],
            "PV1.7": [
                {
                    "XCN.1": "004777"
                },
                {
                    "XCN.2": [
                        {
                            "FN.1": "ATTEND"
                        },
                        {
                            "ST.1": "AARON"
                        },
                        {
                            "ST.2": "A"
                        }
                    ]
                }
            ],
            "PV1.10": {
                "IS.1": "SUR"
            },
            "PV1.19": {
                "IS.1": "ADM"
            },
            "PV1.44": {
                "IS.1": "A0"
            }
        }
    }

         Novamente, parece que a análise está boa — tem implicações significativas: se a análise for concluída, posso praticamente transformar todos os tipos de dialetos  HL7 de vários sistemas em JSON analisado e executar qualquer tradutor, como Python, sem um mecanismo entre eles?

#4. HL7 para FHIR
 

Saída: 

```json
{
  "resourceType": "Bundle",
  "type": "message",
  "entry": [
    {
      "resource": {
        "resourceType": "MessageHeader",
        "eventCoding": {
          "system": "http://hl7.org/fhir/message-events",
          "code": "ADT_A01"
        },
        "destination": [
          {
            "endpoint": "http://localhost:8080/fhir/baseDstu3"
          }
        ],
        "source": {
          "name": "ADT1",
          "software": "GOOD HEALTH HOSPITAL",
          "endpoint": "http://localhost:8080/fhir/baseDstu3"
        },
        "timestamp": "2018-08-18T11:26:00+00:00",
        "data": [
          {
            "reference": "#evn"
          },
          {
            "reference": "#pid"
          },
          {
            "reference": "#nk1"
          },
          {
            "reference": "#pv1"
          }
        ]
      },
      "request": {
        "method": "POST",
        "url": "Patient"
      }
    },
    {
      "resource": {
        "resourceType": "Patient",
        "id": "evn",
        "identifier": [
          {
            "system": "http://hl7.org/fhir/sid/us-ssn",
            "value": "123456789"
          }
        ],
        "name": [
          {
            "family": "EVERYMAN",
            "given": [
              "ADAM",
              "A",
              "III"
            ]
          }
        ],
        "gender": "male",
        "birthDate": "1961-06-15",
        "address": [
          {
            "line": [
              "2222 HOME STREET"
            ],
            "city": "GREENSBORO",
            "state": "NC",
            "postalCode": "27401-1020"
          }
        ],
        "maritalStatus": {
          "coding": [
            {
              "system": "http://hl7.org/fhir/v3/MaritalStatus",
              "code": "M"
            }
          ]
        },
        "telecom": [
          {
            "system": "phone",
            "value": "(555) 555-2004"
          },
          {
            "system": "phone",
            "value": "(555)555-2004"
          }
        ],
        "contact": [
          {
            "relationship": [
              {
                "coding": [
                  {
                    "system": "http://hl7.org/fhir/v2/0131",
                    "code": "NK"
                  }
                ]
              }
            ],
            "name": {
              "family": "NUCLEAR",
              "given": [
                "NEL ... ...  ... ...

 

Agora, isso é um pouco impressionante, considerando o esforço que fiz para o FHIR alguns anos atrás.  Mas não estou mais surpreso, não é? 

Alguma ideia... Talvez eu precise fazer uma pausa para repensar esse tipo de "modelo de linguagem", para que eu possa soltar um pouco mais minha imaginação.  :)

#Próximo passo

  1. OK, ele consegue desempenhar as funções de DTLs. Mas ele conseguiria gerar uma DTL no estilo COS do ISC, Python ou qualquer outra linguagem — quero dizer, o código real?  Não consigo ver por que não. 

  2. Certeza: a programação tradicional nos deu certeza e precisão - se alguma transformação funciona, ela continua funcionando com 100% de precisão e certeza para todos os casos testados. As abordagens de ciência de dados às vezes não têm essa certeza. Como podemos injetar a certeza necessária e a qualidade médica nessa "caixa preta"?    

0
0 110
InterSystems Oficial Danusa Calixto · Ago. 3, 2023

A InterSystems corrigiu 2 defeitos.

O primeiro defeito pode fazer com que um servidor de aplicativos ECP trave. Este defeito é relevante apenas para processadores ARM e IBM Power; está presente nas versões 2022.1.2 e 2022.1.3 do InterSystems IRIS®, InterSystems IRIS for Health™ e HealthShare® Health Connect. A correção é identificada como DP-423661. O defeito é corrigido em todas as versões futuras.
 

0
0 81
Artigo Cristiano Silva · Jul. 31, 2023 2m read

Ao criar Business Hosts personalizados, muitas vezes é necessário adicionar propriedades à classe para configurações adicionais que serão usadas na inicialização ou operação do host. O próprio nome da propriedade nem sempre é muito descritivo, por isso é uma vantagem ter uma exibição de legenda personalizada com o campo.

No Ensemble, era bastante simples:

TEST> Set^CacheMsg("EnsColumns","pt-br","<propriedade>") = "<legenda>"

Mas envolve um pouco mais de esforço no IRIS...

0
0 53
Artigo Cristiano Silva · Maio 26, 2023 6m read

Quantas vezes nos deparamos em reconstruir, copiar, colar adpatar, Businesss Operations que fazem chamadas para serviços REST, e apenas adaptamos uma ou outra parte do código final. Isso incomada e muito. Para resolver esse nosso incoveniente apresento para vocês Interopway REST, um conjunto de classes (um micro framework) que nos permite apenas adicionar o Business Operation à Production e  utilizar.

O projeto está hospedado no github, https://github.com/cristianojs/interopway_rest, é aberto e estamos aceitando colaborações.

Vamos entender como isso funciona.

Objetos de Transporte

2
1 171
Artigo Ana Dascenzio · Jun. 12, 2023 9m read

Escrito por: @Luana Machado e @Ana Dascenzio 
 

Cenário 

No cenário da saúde, seja em um laboratório ou hospital, uma falha de equipamento pode custar muito caro. O custo pode vir pelo tempo de conserto e inutilização da máquina, ou pior, pelo dano a um paciente ou cliente. Portanto, pode ser muito benéfico encontrar sinais antecipados para potenciais problemas, obter essa informação em tempo real e adequar as manutenções em momentos fora do fluxo diário de uso. Para isso, podemos utilizar a tecnologia da InterSystems IRIS em um modelo de manutenção preditiva notificada de equipamentos médicos.

 

12
7 464
Artigo Luana Machado · Jun. 12, 2023 6m read

Exemplo de uso do banco de dados FHIR InterSystems IRIS for Health para efetuar modelagem ML através do InterSystems IRIS IntegratedML

Descrição

IntegratedML é uma ótima funcionalidade para treino/teste e implantação de modelos ML. FHIR é um padrão poderoso para a interoperabilidade de informações da saúde. Esse projeto visa mostrar como utilizar as ferramentas IRIS/IRIS for Health. Por exemplo, as transformações DTL para preparar dados do FHIR para aplicação de modelos ML dentro do IntegratedML. Aqui estão algumas potenciais aplicações das ideias apresentadas nesse projeto:

0
1 133
Artigo Miqueias Santos · Jun. 7, 2023 4m read

Quando você compila rotinas ou classes no terminal, os resultados da compilação são exibidos na tela, portanto, mesmo que ocorra um erro, é fácil verificar.Se você deseja obter apenas informações de erro, precisa planejar um pouco.

O seguinte descreve como obter informações de erro do resultado da compilação em lote de rotinas/classes.

para rotinas

Para rotinas de compilação em massa em um namespace no Terminal, o método CompileAll() da classe %Library.Routine. use

0
0 108
Artigo Cristiano Silva · Jun. 7, 2023 5m read

Você já deve ter ouvido falar que, a partir das versões IRIS e HealthShare HealthConnect 2023.2, o Apache Server interno será removido da instalação padrão, então será necessário ter um servidor de aplicativos externo como Apache Server ou NGINX.

Neste artigo, procederei à instalação de um HealthShare HealthConnect 2023.1 para que funcione com um servidor Apache pré-instalado. Para isso usarei uma máquina virtual na qual instalei um Ubuntu 22.04.

Instalando Apache Server

0
0 167