Nueva publicación

查找

Pregunta
· 14 ene, 2025

Trakcare/Clinical Viewer, making chart changes when only have LDAP users

I am hoping for some guidance.

I am new to creating a new chart in Trakcare for use with Clinical Viewer.  My organization only has LDAP users, (we don't have the ability to use local users), that dictate what role/group a user is in, they are all the same across our Prod, Test, and Dev environments. 

I need to customize a chart for our end users.  BUT the how-to's all talk about creating a custom role for the new chart, which if I do this I would have to be added to this role/group which could cause issues with my ability to work in Prod and Test.  Does anyone have any guidance on how to do this - and be able to work on the custom chart in DEV while not limiting my ability to work in Prod and Test?

Comentarios (0)1
Inicie sesión o regístrese para continuar
Anuncio
· 14 ene, 2025

[Video] Healthcare Use-Case: Portal de Menssagens do Paciente

Olá Comunidade!

Confira o novo vídeo dedicado à Gen AI em nosso InterSystems Developers YouTube:

⏯ Healthcare Use-Case: Patient Portal Messages

Explore um caso de uso em mensagens paciente-provedor, inspirado por um estudo da Vanderbilt University. O estudo aborda o volume esmagador de mensagens de pacientes usando IA para ajudar os pacientes a elaborar melhores mensagens iniciais. Um LLM gera perguntas de acompanhamento com base na primeira mensagem do paciente, garantindo que o provedor obtenha os detalhes necessários antecipadamente e reduzindo atrasos no atendimento.

🗣  Apresentador@Don Woodlock, Vice President, Healthcare Solutions Development, InterSystems

Divirta-se assistindo e aguarde mais vídeos! 👍

Comentarios (0)1
Inicie sesión o regístrese para continuar
Artículo
· 14 ene, 2025 Lectura de 2 min

Find Values from Text and Display

The utility returns the desired values from the text and display the multiple values if exists based on starting and ending string.

Class Test.Utility.FunctionSet Extends %RegisteredObject
{

/// W !,##class(Test.Utility.FunctionSet).ExtractValues("Some random text VALUE=12345; some other VALUE=2345; more text VALUE=345678;","VALUE=",";")
 

ClassMethod ExtractValues(text As %String, startStr As %String, endStr As %String) As %String
{    //Initialize Valriables
   Set values = ""
   Set start = 1
   
   While start '= 0 {
 Set start = $FIND(text, startStr, start)
 IF start = 0 QUIT }
     Set end = $FIND(text, endStr, start)
     IF end = 0 QUIT }
    //S value = $E(text, start, end-2)
     value = $E(text, start, end-$L(endStr)-1)
     IF values '= "" {
  Set values = values _" "_value   
     }Else {
  values = value   
     }
     start = end
   }
    values
} }

Output:

W !,##class(Test.Utility.FunctionSet).ExtractValues("Some random text VALUE=12345; some other VALUE=2345; more text VALUE=345678;","VALUE=",";")

12345 2345 345678

2 comentarios
Comentarios (2)1
Inicie sesión o regístrese para continuar
Artículo
· 14 ene, 2025 Lectura de 6 min

The Power of Embedded Python in Interoperability - a mongoDB CDC Use-Case

Using embedded Python while building your InterSystems-based solution can add very powerful and deep capabilities to your toolbox.

I'd like to share one sample use-case I encountered - enabling a CDC (Change Data Capture) for a mongoDB Collection - capturing those changes, digesting them through an Interoperability flow, and eventually updating an EMR via a REST API.

The Core Functionality - "Change Watching" 👀

The basic idea is to use the PyMongo package, which, among other things, enables tracking changes within a mongo database via it's change_streams.

The important part is in the Inbound Adapter I created that has an OnInit() method that includes this line:

self.changeStream = client.get_database(...).get_collection(...).watch()

I'm using the watch() method here to monitor the changes. It watches a specific Database and a specific Collection.

I set these through the Business Service settings:

Then in the OnTask() method I'm using this to capture the changes:

while self.changeStream.alive:
    change = self.changeStream.try_next()
    if change is not None:

Here I'm using the alive property and try_next() method to get the change details that occurred.

For every change I'm creating an IRIS Stream object with the JSON content and sending that to the Business Service ProcessInput() method.

In the Business Service I create a Request imported from the JSON payload, and send that down to the Router.

The general flow can be illustrated like this -

Here's a video demonstration:

Some More Technical Details 👩‍💻

The Business Service needs to "massage" the JSON a little because it includes some "fuzzy" JSON, before I can allow it to be imported as valid JSON.

For example one can look like this:

 
Change JSON Sample

You can see for example the Timestamp and new UUID parts which are not valid JSON.

You can see that the actual "Document" is under the fullDocument part, and for this example I used a specific schema.

My document would look like this:

 
Sample JSON Document for this demo

In your case you can either change this to fit your schema, or even consider adapting my sample to use a more "dynamic" approach where you can define a setting that would be used to dynamically import the JSON to a variable class name (vs. my hard-coded one).

[In any case, to load your JSON schema and create a class from it, you may use the Sample.OpenAPIClassGenerator class I included in my sample (adapted from @Guillaume.Rongier7183's OpenAPI Definition Class Generator (and call the ProcessFile() method I added on your JSON schema file).]

In essence this is the main part of this functionality: Adapter + Business Service that send off messages with changes that were made on a mongo DB Collection.

Widening the Picture 👩‍⚕️

For demonstration purposes, and to make a full flow that "tells a story" (which was the actual use-case I had) I also added a target for this CDC, which is a REST API of a mock EMR, which takes patient data and inserts it into a Patient Table.

You'll find this part under the Demo.EMR package (Data.Patient for the Table, and Util.API for the REST API); and the Demo.Int package for the Business Operation part.

By the way you can reuse this part for any other needs you might find when you need some mock API to send Patient data for testing as a target destination.

[Note the "mock EMR" table and API include data elements which I didn't use in this demo, like email address and phone number]

A Sample Full Flow (with screenshots) 📷

So here is a sample flow of how this would work -

1. Add a document to your mongo Collection.

 
Shell commands (Docker exec to connect to mongo container, and mongosh commands, to initiate ReplicaSet, and a Document to a Collection)

2. Examine your "EMR" table and see the new data from Mongo inserted into it.

 
DBeaver viewing the data in the Patient table

3. Examine the "Behind the Scenes" inside InterSystems IRIS taking care of this flow.

 
Visual Trace of messages flow

Take it for a Ride 🏎

The Open Exchange app includes all the related code, and setup instructions for a full Docker Container based demo per above (with all the related parts, including mongo containers).

[Note Mongo has a notion of a ReplicaSet and only with this feature would change_streams work, for simplicity the demo above assumes mongo1 (there are also 2 and 3) is the "primary"].

 

Again - this is just one example of how Embedded Python can get you up and running with your interoperability challenges very quickly and easily.

1 Comentario
Comentarios (1)1
Inicie sesión o regístrese para continuar
Anuncio
· 14 ene, 2025

Open Exchange Annual 2024 Recap

Hello and welcome to the Open Exchange Annual 2024 Recap.
General Stats:
✓ 139 new apps in 2024
✓ 7,069 downloads in 2024
✓ 1,029 applications all time
✓ 38,243 downloads all time
✓ 2,981 developers joined

Top applications of the year
This rating includes only applications that have been published this year. The popularity of applications depends on various metrics such as views, bookmarks, ZPM installation rate, releases, reviews, and clicks on the Download button on the app page.
 
Top applications of all time
This rating includes applications that have been published since Open Exchange went online. The popularity of applications depends on various metrics such as views, bookmarks, ZPM installation rate, releases, reviews, and clicks on the Download button on the app page.
 
Top developers of all time
 
Different factors, such as publishing apps, entering contests, writing reviews, and releasing updates, affect a developer's rating. If you want to see the top developers based on the number of apps they've published, you can find the info here.
2024 at a GlanceInterSystems Open Exchange
1 Comentario
Comentarios (1)2
Inicie sesión o regístrese para continuar