Find

Announcement
· Aug 15

[Demo Video] MyVitals: Connecting Wearable Health Data to EHRs with InterSystems

#InterSystems Demo Games entry


⏯️ MyVitals: Connecting Wearable Health Data to EHRs with InterSystems

MyVitals is a Personal Health Device Hub that bridges the gap between wearable health devices and clinical workflows. In this demo, we show how healthcare organizations can enroll patients, collect real-time data from personal devices via mobile apps, and seamlessly integrate that information into EHR systems using FHIR, HL7, and InterSystems technology. Built on IRIS for Health and FHIR repositories, MyVitals turns disconnected wearable data into actionable clinical insights—securely, efficiently, and at scale.

Presenters:
🗣 @Alberto Fuentes, Sales Engineer, InterSystems
🗣 @Pierre-Yves Duquesnoy, Senior Sales Engineer, InterSystems
🗣 @Luis Angel Pérez Ramos, Sales Engineer, InterSystems

🗳 If you like this video, don't forget to vote for it in the Demo Games!

Discussion (0)1
Log in or sign up to continue
Article
· Aug 15 4m read

Por que precisamos de regras ou convenções de codificação, afinal?

Este ótimo artigo despertou recentemente algumas discussões privadas, e eu gostaria de compartilhar algumas reflexões próprias a partir dele.

A preocupação central se resume a: Por que precisamos de regras ou convenções de codificação, afinal? O que aconteceu com a maravilhosa era do programador-artista renascentista, trilhando seu próprio caminho, antes de ser substituído pelo artesão e agora (ainda pior) pela IA?
Resumindo, há alguns motivos pelos quais padrões e diretrizes de codificação são úteis — e o programador-artista renascentista não desapareceu totalmente.

Motivo 1: Hoje em dia, quando você está treinando um verdadeiro artista iniciante, começa pedindo para ele tentar colorir dentro das linhas.
Esse artista pode ser brilhante um dia — mas ainda não é.
Se você quer aprender a produzir arte, faz isso primeiro; depois, gradualmente, aprende técnicas e conceitos com os mestres; e então, se for realmente bom (ou com um pouco de sorte), estabelece seu próprio estilo e cria algo novo que o resto do mundo vai querer seguir.
Mas, para começar, é preciso seguir as regras.

 

(Obs.: encontrei isso na internet; nenhum dos meus filhos ainda possui tal habilidade.)

Razão 2: Se você está operando em uma área onde seu nicho de criatividade deve se encaixar ao lado de outros – algo como uma colcha de retalhos – então você precisa de algumas regras para seguir, ou a arte não funcionará porque as peças não se encaixam. Você pode concordar com a convenção de “todos fazemos quadrados de 40cm” ou então ter que trabalhar de forma ainda mais próxima e colaborativa com um monte de outras pessoas, o que o artista solitário que passa 4 anos pintando um teto pode não ser o melhor em fazer. (Especialmente se a gerência decidir que alguns outros artistas solitários precisam ser chamados para “ajudar”).

(O ChatGPT me deu isso. Desculpas a todos os artistas de verdade.)

Razão3: Se você está trabalhando em uma peça de arte de programação existente, particularmente antiga ou particularmente brilhante, você frequentemente enfrenta o desafio entre entender e abraçar a intenção original do autor e a elegância do design e da execução, ou simplesmente dizer “agora eu estou no comando, vamos jogar fora e fazer do meu jeito”. Vou dar um exemplo aqui: uma aplicação web em que trabalhei faz uso intenso de “páginas XML” onde você tem um trio de (pageName.xml, pageName.js, pageName.mac) que constituem uma página. O pageName.xml foi, até mais recentemente do que eu gostaria de admitir, provavelmente escrito neste estranho dialeto "WD-xsl" que se assemelha muito ao XSLT padrão, mas só funciona no Internet Explorer Microsoft Edge se ele estiver fingindo ser o IE5. O pageName.js provavelmente contém a palavra "frame" cerca de 40 vezes mais do que seria confortável. O pageName.mac provavelmente está cheio de sintaxe de ponto, formas curtas de comandos e macros incoerentes. Se você é um desenvolvedor novo, você apenas chora e foge porque não faz sentido. Se você é um desenvolvedor sênior, você lê e entende um pouco, então decide “isso é nojento; vou fazer melhor de outra forma” – mas então a próxima pessoa a trabalhar na aplicação precisa aprender o paradigma original e o seu novo paradigma inteligente. Estenda isso por 20 anos e você terá um verdadeiro pesadelo. Mas se você é realmente um artista especialista, você pode fazer restauração de arte – ver a elegância na estrutura original e trabalhar dentro dela, consertando gentilmente as coisas arquitetonicamente inconsequentes que fazem o novo desenvolvedor chorar e o desenvolvedor sênior apertar "delete", sem criar uma bagunça fragmentada ou levar anos de trabalho repintando a coisa toda. Talvez você até produza seu próprio trabalho no estilo do velho mestre. A lição mais importante desta história é que, como um artista de verdade, você tem um interesse genuíno em produzir um trabalho de tal qualidade que alguém que o herde sem seus anos de experiência não decida jogar tudo fora – e as “pequenas coisas” como estilo de código, legibilidade e endereçamento de dívida técnica ajudam muito, preservando a arquitetura, se não cada linha de código

Em resumo:

  • Regras e convenções permitem treinar novos artistas brilhantes antes que eles sejam brilhantes.
  • Regras e convenções dão a você uma tela fixa para exercitar a criatividade sem precisar perder tempo tentando se dar bem com as pessoas.
  • Regras e convenções permitem que você faça algo bonito que não será jogado fora pela primeira pessoa a herdá-lo.
Discussion (0)1
Log in or sign up to continue
Article
· Aug 15 3m read

A beginner's guide to creating SQL tables and seeing them as classes

The August Article Bounty on the Global Masters article caught my attention, and one of the proposed topics sounded quite interesting in regard to its future use in my teaching. So, here's what I'd like to tell my students about tables in IRIS and how they correlate with the object model. 

First of all, InterSystems IRIS boasts a unified data model. This means that when you work with data, you are not locked into a single paradigm. The same data can be accessed and manipulated as a traditional SQL table, as a native object, or even as a multidimensional array (a global). It means that when you create an SQL table, IRIS automatically creates a corresponding object class. When you define an object class, IRIS automatically makes it available as an SQL table. The data itself is stored only once in IRIS's efficient multidimensional storage engine. The SQL engine and the object engine are simply different "lenses" to view and work with the same data.

First, let's look at the correlation between the relational model and the object model:

Relational Object
Table Class
Column Property
Row Object
Primary key Object Identifier

It's not always a 1:1 correlation, as you may have several tables represent one class, for example. But it's a general rule of thumb. 

In this article, I will discuss creating a table by listing its columns. 

The most basic approach:

CREATE TABLE [IF NOT EXISTS] table (
   column1 type1 [NOT NULL], 
   column2 type2 [UNIQUE], 
   column3 type3 [PRIMARY KEY]
   ...
   [CONSTRAINT fKeyName FOREIGN KEY (column) REFERENCES refTable (refColumn)]
)

[ ] designate the optional parts.

Let's create a table DC.PostType, which consists of three columns: TypeID(primary key), Name, and Description:

CREATE TABLE DC.PostType (
  TypeID        INT NOT NULL,
  Name          VARCHAR(20), 
  Description   VARCHAR(500),
  CONSTRAINT Type_PK PRIMARY KEY (TypeID)
)

As a result, we will get the following class after executing the SQL statement above:

/// 
Class DC.PostType Extends %Persistent [ ClassType = persistent, DdlAllowed, Final, Owner = {UnknownUser}, ProcedureBlock, SqlRowIdPrivate, SqlTableName = PostType ]
{

Property TypeID As %Library.Integer(MAXVAL = 2147483647, MINVAL = -2147483648) [ Required, SqlColumnNumber = 2 ];
Property Name As %Library.String(MAXLEN = 20) [ SqlColumnNumber = 3 ];
Property Description As %Library.String(MAXLEN = 500) [ SqlColumnNumber = 4 ];
Parameter USEEXTENTSET = 1;
/// Bitmap Extent Index auto-generated by DDL CREATE TABLE statement.  Do not edit the SqlName of this index.
Index DDLBEIndex [ Extent, SqlName = "%%DDLBEIndex", Type = bitmap ];
/// DDL Primary Key Specification
Index TypePK On TypeID [ PrimaryKey, SqlName = Type_PK, Type = index, Unique ];
Storage Default
{
<Data name="PostTypeDefaultData">
<Value name="1">
<Value>TypeID</Value>
</Value>
<Value name="2">
<Value>Name</Value>
</Value>
<Value name="3">
<Value>Description</Value>
</Value>
</Data>
<DataLocation>^B3xx.DXwO.1</DataLocation>
<DefaultData>PostTypeDefaultData</DefaultData>
<ExtentLocation>^B3xx.DXwO</ExtentLocation>
<IdFunction>sequence</IdFunction>
<IdLocation>^B3xx.DXwO.1</IdLocation>
<Index name="DDLBEIndex">
<Location>^B3xx.DXwO.2</Location>
</Index>
<Index name="IDKEY">
<Location>^B3xx.DXwO.1</Location>
</Index>
<Index name="TypePK">
<Location>^B3xx.DXwO.3</Location>
</Index>
<IndexLocation>^B3xx.DXwO.I</IndexLocation>
<StreamLocation>^B3xx.DXwO.S</StreamLocation>
<Type>%Storage.Persistent</Type>
}

}

Key Observations:

  • TABLE DC.PostType became Class DC.PostType.
  • The class Extends %Persistent, which is what tells IRIS to store its data in the database.
  • VARCHAR became %String.
  • INT became %Integer.
  • The PRIMARY KEY constraint created an Index with the PrimaryKey keyword.

You can now use this table/class from either side, for example, using SQL:

INSERT INTO DC.PostType (TypeID, Name, Description) VALUES (1, 'Question', 'Ask a question from the Community')

There's a lot more to creating tables using SQL, please read the documentation provided below.

7 Comments
Discussion (7)3
Log in or sign up to continue
Announcement
· Aug 15

[Vidéo] HL7 FHIR et l’Espace Européen des Données de Santé, accélérateurs d’innovation au CHU de Toulouse

Salut la Communauté!

Profitez de regarder la nouvelle vidéo sur la chaîne Youtube d'InterSystems France :

📺 HL7 FHIR et l’Espace Européen des Données de Santé, accélérateurs d’innovation au CHU de Toulouse

Découvrez le retour d’expérience sur l’implémentation d’une plateforme FHIR au CHU de Toulouse :

  • Facilitation et accélération de l’intégration d’applications innovantes au service de la prise en charge des patients en mutualisant les interfaces
  • Réflexion et collaboration avec la communauté européenne Hospitals On FHIR pour implémenter l’EEDS/EHDS

Intervenants : 
🗣 Paul Ortega, Ingénieur Hospitalier FHIR, CHU Toulouse
🗣  Luc Chatty, Expert FHIR, Fondateur CEO de Fyrstain et Ambassadeur de la Communauté européenne Hospitals On FHIR en France
🗣  @Guillaume Rongier, Expert en plateforme de données, InterSystems France

Abonnez-vous à notre chaîne youtube pour plus de vidéos !

Discussion (0)0
Log in or sign up to continue
Question
· Aug 14

Any Better Way to Strip the Fractions of Seconds from a Posix Time?

Is there a better way (i.e., without string commands) to remove the fractions of seconds from a %Library.PosixTime value?

This works, but seems inefficient:

set posix = 1154669852181849976
w ##class(%Library.PosixTime).LogicalToTimeStamp(posix)
2025-05-27 12:06:15.003
set str = ##class(%Library.PosixTime).LogicalToTimeStamp(posix)
set stripped = $P(str,".",1)
w ##class(%Library.PosixTime).TimeStampToLogical(stripped)
1154669852181846976
set newposix = ##class(%Library.PosixTime).TimeStampToLogical(stripped)
w ##class(%Library.PosixTime).LogicalToTimeStamp(newposix)
2025-05-27 12:06:15

Note that I don't need the last string output; the value stored in "newposix" is what I want to retain.

Thanks in advance

9 Comments
Discussion (9)3
Log in or sign up to continue