Artículo Ricardo Paiva · nov 10, 2025 3m read

Seguramente queríais usar la especificación OpenAPI (OAS) en formato JSON que utilizasteis para vuestra clase spec en el paquete iris-web-swagger-ui de IRIS.
La OAS generada por el método ##class(%REST.API).GetWebRESTApplication(...) es muy básica, sin descripciones de los parámetros ni de la estructura esperada de las respuestas.

Así que, después de crear vuestra aplicación REST a partir de una OAS, deberíais tener:

0
0 7
Artículo Ricardo Paiva · oct 30, 2025 4m read

Complemento de InterSystems IRIS Community Edition para HAOS

Ejecutad InterSystems IRIS dentro de Home Assistant, como un complemento. Antes de que descartéis este artículo pensando que se trata solo de una curiosidad, os invito a deteneros un momento y ver lo fácil que es lanzar aplicaciones basadas en IRIS usando esta plataforma. Si echáis un vistazo a Open Exchange, veréis decenas y decenas de aplicaciones que merecen ser utilizadas, pero que en la práctica quedan abandonadas como simples proyectos en Git, y que solo pueden ejecutarse si estáis dispuestos a enfrascaros en una batalla con containerd o Docker. Con un simple repositorio de Git y una especificación, ahora podéis construir vuestra aplicación en IRIS y hacer que se ejecute a través de un marketplace, reduciendo al mínimo las complicaciones para vuestros usuarios finales. Ejecutadla junto a Ollama y las implementaciones de LLM/LAM, exponed cualquier elemento de IRIS como un sensor o cread un endpoint para que vuestra aplicación en IRIS interactúe con cualquier cosa que tengáis conectada a HAOS. ¿Queréis reiniciar una producción de IRIS con solo accionar un interruptor físico o mediante una IA asistida? Podéis hacerlo con este complemento, o con uno propio, justo al lado de los entusiastas de la automatización del hogar.

0
0 15
Artículo Ricardo Paiva · oct 8, 2025 1m read

gj :: configExplorer es una nueva extensión de VS Code que se integra con Server Manager y aprovecha Structurizr para generar diagramas de configuración de vuestros servidores.

Aquí tenéis un breve video introductorio.

0
0 22
Artículo Ricardo Paiva · sep 29, 2025 3m read

Todavía recuerdo el primer código que escribí en Object Script

Viniendo de Python, al principio me resultó muy extraño, pero con el tiempo empecé a ver por qué el lenguaje está construido de esa manera.

Si estáis empezando, tened en cuenta que ObjectScript puede parecer un poco de nicho y ligado sobre todo a los productos IRIS, pero la forma de trabajar con él realmente compensa: desarrollo rápido, una base de datos potente y una plataforma sólida para aprender.

A veces se siente como si hubierais entrado en un mundo que es a la vez familiar y diferente.

0
0 20
Artículo Ricardo Paiva · sep 22, 2025 6m read

Contexto

Por una variedad de razones, los usuarios pueden desear montar un volumen persistente en dos o más pods que abarquen varias zonas de disponibilidad. Un caso de uso de este tipo es poner a disposición de ambos miembros del espejo los datos almacenados fuera de IRIS en caso de una conmutación por error.

Desafortunadamente, las clases de almacenamiento integradas en la mayoría de las implementaciones de Kubernetes (ya sea en la nube o en las instalaciones) no ofrecen esta capacidad:

0
0 22
Artículo Ricardo Paiva · sep 15, 2025 3m read

Algo que he aprendido a lo largo de los años es que, por muy pulida que esté vuestra lógica de aplicación, el rendimiento de la base de datos acabará haciendo o deshaciendo la experiencia de usuario. Trabajando con InterSystems IRIS, recientemente me topé con esto de primera mano. Un cliente nuestro estaba construyendo un panel de informes que funcionaba a la perfección en las pruebas, pero cuando el conjunto de datos de producción creció hasta millones de registros, los tiempos de respuesta se arrastraban.

0
0 30
Artículo Ricardo Paiva · sep 8, 2025 1m read

Muchas veces, al trabajar con datos FHIR, por ejemplo con IRIS For Health, resulta útil crear una operación FHIR personalizada. El estándar FHIR incluye un conjunto de operaciones definidas (como $everything), pero una operación personalizada es práctica cuando necesitáis añadir funcionalidades adicionales que van más allá del conjunto de operaciones estándar de FHIR. La documentación lo explica paso a paso (aunque este comentario puede resultar útil para quienes estáis empezando).

0
0 20
Artículo Ricardo Paiva · sep 1, 2025 3m read

Al comenzar con InterSystems IRIS o Caché, los desarrolladores a menudo se encuentran con tres conceptos fundamentales: Dynamic Objects, Globals y Relational Table. Cada uno tiene su papel en la construcción de soluciones escalables y mantenibles. En este artículo recorreremos ejemplos prácticos de código, destacaremos buenas prácticas y mostraremos cómo estos conceptos se relacionan entre sí.

1. Trabajando con Dynamic Objects:

0
0 37
Artículo Ricardo Paiva · ago 11, 2025 6m read

Resumen

El proyecto typeorm-iris ofrece soporte experimental para integrar TypeORM con InterSystems IRIS, permitiendo a los desarrolladores interactuar con IRIS usando los conocidos decoradores y abstracciones de repositorio de TypeORM. Esto ofrece una experiencia de desarrollo más familiar para los desarrolladores de JavaScript y TypeScript que crean aplicaciones Node.js con IRIS como base de datos backend.

TypeORM MongoDB Review. I recently started using TypeORM in a… | by Eliezer  Steinbock | Medium

Aunque el proyecto implementa los puntos clave de integración con TypeORM y soporta operaciones básicas con entidades, aún no está probado a fondo ni es adecuado para entornos de producción.

0
0 34
Artículo Ricardo Paiva · ago 7, 2025 1m read

Aquí tenéis un ejemplo práctico de cómo importar datos desde un archivo CSV a InterSystems CACHÉ utilizando ObjectScript.
Suponiendo que vuestro archivo CSV sea simple (por ejemplo, separado por comas y con encabezados), podéis usar `%Stream.FileCharacter` para leerlo línea por línea y analizar los datos.
 

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

0
0 21
Artículo Ricardo Paiva · ago 1, 2025 3m read

La inyección SQL sigue siendo una de las vulnerabilidades más críticas en las aplicaciones basadas en bases de datos, ya que permite a los atacantes manipular consultas y, potencialmente, acceder o comprometer datos sensibles. En InterSystems IRIS, los desarrolladores tienen acceso tanto a SQL Dinámico como a SQL Embebido, cada uno con características distintas. Comprender cómo usarlos de forma segura es esencial para prevenir la inyección SQL.

El problema: SQL Dinámico y la inyección SQL

0
0 27
Artículo Ricardo Paiva · jul 21, 2025 4m read

☤Brújula 🧭 de Cuidados 🩺 - Prueba de concepto - Participación para el Concurso

Presentación de Brújula de Cuidados: Priorización de casos impulsada por IA para Servicios Humanos

En el panorama actual de la atención sanitaria y los servicios sociales, los trabajadores sociales se enfrentan a desafíos abrumadores. Altas cargas de trabajo, sistemas fragmentados y datos desconectados suelen dar lugar a oportunidades perdidas para intervenir de forma temprana y eficaz. Esto provoca agotamiento en el personal y visitas evitables a urgencias, lo que genera costes elevados y podría haberse prevenido.

Brújula de Cuidados fue creada para cambiar esa realidad.

Aviso legal: El proyecto Brújula de Cuidados es una demostración técnica desarrollada por ingenieros de ventas y de soluciones. Está destinado únicamente a fines educativos y de creación de prototipos. No somos profesionales médicos, y ninguna parte de este proyecto debe interpretarse como asesoramiento clínico ni utilizarse para la atención real de pacientes sin la validación adecuada y la consulta con expertos sanitarios cualificados.

El problema

El doce por ciento de los beneficiarios de Medicaid representa el 38 por ciento de todas las visitas a urgencias (ED) cubiertas por Medicaid. Estas visitas suelen estar motivadas por necesidades no cubiertas relacionadas con la inestabilidad habitacional, las enfermedades mentales y el consumo de sustancias. Las herramientas tradicionales de gestión de casos rara vez tienen en cuenta estos factores de riesgo estructurales, lo que dificulta que los trabajadores sociales identifiquen quién necesita ayuda con mayor urgencia.

Estos datos provienen de un estudio de 2013 publicado en The American Journal of Emergency Medicine, que destaca cómo una pequeña parte de la población cubierta por Medicaid contribuye de forma desproporcionada a los costes generales del sistema (Capp et al., 2013, PMID: 23850143).

Demasiado a menudo, las decisiones son reactivas y se basan en información incompleta.

Nuestra solución

Brújula de Cuidados es un asistente impulsado por IA que os ayuda a tomar mejores decisiones basándoos en una visión completa de las necesidades médicas y sociales de cada persona. Combina Generación Aumentada por Recuperación (RAG) y modelos de lenguaje avanzados para interpretar datos y generar recomendaciones útiles.

El asistente evalúa información en tiempo real, resume los factores clave de riesgo, calcula puntuaciones dinámicas de riesgo y sugiere posibles próximos pasos y recursos. En lugar de revisar registros desconectados, obtenéis una vista unificada de vuestra carga de casos, priorizada por urgencia y contexto.

Cómo Funciona

La plataforma integra un modelo de lenguaje de gran escala (LLM), recuperación de datos en tiempo real y lógica de razonamiento personalizada. La información de fuentes estructuradas y no estructuradas se sintetiza en resúmenes comprensibles que explican no solo el nivel de riesgo, sino también por qué una persona se considera de alto riesgo.

Una interfaz de usuario intuitiva facilita que interactuéis con el asistente, reviséis los análisis y toméis medidas adecuadas. El énfasis está en la transparencia y la confianza. El sistema no solo asigna una puntuación de riesgo, sino que explica su razonamiento en un lenguaje claro.

Lecciones aprendidas

Crear Brújula de Cuidados nos ha enseñado que la precisión bruta del modelo es solo una parte de la ecuación. Hemos aprendido que:

  • Los conjuntos de datos pequeños limitan la efectividad de los métodos basados en recuperación
  • Los datos estructurados suelen ser inconsistentes o incompletos
  • Ajustar finamente los modelos no siempre mejora su rendimiento
  • La interpretabilidad es esencial, especialmente en sistemas que orientan decisiones sobre el cuidado
  • El cumplimiento de HIPAA y la privacidad de los datos deben integrarse en el sistema desde el principio

Mirando al futuro

Nuestros próximos pasos incluyen ampliar nuestro conjunto de datos con casos más diversos y representativos, experimentar con distintos modelos de incrustación e incorporar métricas de evaluación que reflejen cuán útiles y comprensibles son realmente las respuestas del asistente en la práctica.

También estamos explorando cómo comunicar mejor la incertidumbre y reforzar las bases éticas del sistema, especialmente al trabajar con poblaciones vulnerables.

Brújula de Cuidados es nuestra respuesta a una necesidad generalizada en salud y servicios sociales: priorizar lo que importa antes de que se convierta en una crisis. Os da a los trabajadores sociales la claridad y las herramientas que necesitáis para actuar antes, intervenir con mayor eficacia y lograr resultados más equitativos.

Para ver más sobre cómo implementamos la solución, podéis ver nuestro video en YouTube:https://youtu.be/hjCKJxhckbs

0
0 27
Artículo Ricardo Paiva · jun 4, 2025 3m read

IRIS admite transformaciones CCDA y FHIR de forma nativa, pero acceder y visualizar estas funcionalidades requiere tiempo de configuración y conocimiento del producto. La aplicación IRIS Interop DevTools fue diseñada para cerrar esa brecha, permitiendo a los implementadores comenzar de inmediato y explorar las capacidades de transformación integradas del producto.

Además del entorno de transformación IRIS XML, XPath y CCDA, el paquete Interop DevTools ahora proporciona:

0
0 41
Artículo Ricardo Paiva · mayo 28, 2025 2m read

Después de que desplegáramos un nuevo contenedor basado en containers.intersystems.com/intersystems/irishealth:2023.1 esta semana, notasteis de repente que el Repositorio FHIR empezó a responder con un Error 500. Esto se debe a violaciones de PROTECT en el nuevo espacio de nombres y base de datos HSSYSLOCALTEMP, utilizado por esta versión de los componentes FHIR de IRIS for Health.

La solución consiste en añadir "%DB_HSSYSLOCALTEMP" a las Aplicaciones Web que gestionan las solicitudes FHIR. Podéis automatizar esto ejecutando el siguiente método de clase en los espacios de nombres que definen estas Aplicaciones Web.

do ##class(HS.HealthConnect.FHIRServer.Upgrade.MethodsV6).AddLOCALTEMPRoleToCSP()

En nuestro caso, eso no fue suficiente. En parte de nuestro código personalizado necesitamos acceder al token Bearer JWT tal como lo envía el cliente, y antes podíamos obtenerlo desde el elemento AdditionalInfo "USER:OAuthToken", que ya no está presente en la versión 2023.6.1.809, como se describe en la siguiente documentación: https://docs.intersystems.com/upgrade/results?product=ifh&versionFrom=2023.1.0&versionTo=2023.1.6&categories=Business%20Intelligence,Cloud,Core,Development%20Tools,Driver%20Technologies,Embedded%20Python,External%20Languages,FHIR,Healthcare%20Interoperability,Interoperability,Machine%20Learning,Mirroring,Monitoring,Natural%20Language%20Processing,SQL,Security,Sharding,Web%20Applications&audience=All&changes=121

Resolvimos este problema añadiendo la siguiente lógica para obtener el token desde la caché de tokens.

	$$$ThrowOnError(##class(HS.HC.Util.InfoCache).GetTokenInfo(pInteropRequest.Request.AdditionalInfo.GetAt("USER:TokenId"), .pTokenInfo))
	set OAuthToken = pTokenInfo("token_string")
0
0 23
Artículo Ricardo Paiva · mayo 20, 2025 6m read

Hace trece años, obtuve una doble titulación de grado en ingeniería eléctrica y matemáticas, y enseguida empecé a trabajar a tiempo completo en InterSystems sin utilizar ninguna de las dos. Una de mis experiencias académicas más memorables —y que más me revolvió el estómago— fue en Estadística II. En un examen, estaba resolviendo un problema de intervalo de confianza de dificultad moderada. Se me acababa el tiempo, así que (como buen ingeniero) escribí la integral definida en el examen, la introduje en mi calculadora gráfica, dibujé una flecha con la palabra “calculadora” encima y escribí el

0
0 41
Artículo Ricardo Paiva · mayo 19, 2025 2m read

Estoy seguro de que la mayoría de vosotros estáis familiarizados con la utilidad %SYS.MONLBL, que es crucial cuando se analizan los cuellos de botella de rendimiento del código. Permite seleccionar un número de rutinas que queréis monitorizar en tiempo de ejecución y también especificar qué proceso(s) queréis observar. PERO, ¿qué pasa si no sabéis exactamente qué proceso ejecutará vuestro código? Esto es común en muchas aplicaciones basadas en la web (CSP/REST) hoy en día. Queréis minimizar la utilización de recursos en vuestro sistema de producción que necesita análisis. Entonces, ¿qué tal si

0
0 29
Artículo Ricardo Paiva · mayo 12, 2025 2m read

¡Hola, desarrolladores!

Este será un artículo muy corto ya que en abril de 2025, con Lovable y otras herramientas de Prompt-to-UI, se vuelve posible crear el frontend mediante indicaciones. Incluso para vosotros, que como yo, no estáis familiarizados en absoluto con las técnicas modernas de UI.

Bueno, al menos conozco las palabras javascript, typescript y ReactJS, así que en este artículo muy corto construiremos la interfaz de usuario en ReactJS para un servidor InterSystems FHIR con Lovable.ai.

¡Vamos con ello!

0
0 37
Artículo Ricardo Paiva · abr 29, 2025 4m read

Cuando trabajáis con InterSystems IRIS, los desarrolladores y arquitectos de bases de datos a menudo se enfrentan a una decisión crítica: si usar SQL Dinámico o SQL Embebido para consultar y actualizar datos. Ambos métodos tienen sus propias fortalezas y casos de uso, pero comprender sus implicaciones en el rendimiento es esencial para tomar la decisión correcta. El tiempo de respuesta, una métrica clave en la evaluación del rendimiento de las aplicaciones, puede variar significativamente dependiendo del enfoque de SQL que utilicéis. El SQL Dinámico ofrece flexibilidad, ya que las consultas pueden construirse y ejecutarse en tiempo de ejecución, lo que lo hace ideal para escenarios con necesidades de consulta impredecibles o altamente variables. Por el contrario, el SQL Embebido enfatiza la estabilidad y eficiencia al integrar el código SQL directamente en la lógica de la aplicación, ofreciendo tiempos de respuesta optimizados para patrones de consulta predefinidos.

En este artículo, exploraré los tiempos de respuesta al usar estos dos tipos de SQL y cómo dependen de las diferentes estructuras de clases y del uso de parámetros. Para ello, voy a utilizar las siguientes clases del diagrama:

0
0 49
Artículo Ricardo Paiva · abr 22, 2025 4m read

Migrar desde Oracle, MSSQL u otros sistemas de bases de datos puramente relacionales a un sistema multimodelo como InterSystems IRIS es una decisión estratégica que requiere una planificación y ejecución cuidadosas. Aunque esta transición ofrece beneficios significativos, como un mejor rendimiento, escalabilidad y soporte para arquitecturas modernas, también conlleva desafíos. En este artículo destacaré algunas de las consideraciones relacionadas con la codificación para asegurar una migración exitosa. Dejaré fuera del alcance de este artículo todo lo relacionado con la migración real de estructuras y datos.

Primero, cuando estáis considerando migrar a un sistema de base de datos diferente, necesitáis comprender vuestra lógica de negocio, ya sea del lado de la aplicación (servidor de aplicaciones) o del servidor de bases de datos. Básicamente, ¿dónde tenéis vuestras sentencias SQL que potencialmente tendréis que reescribir?

0
0 54
Artículo Ricardo Paiva · abr 14, 2025 3m read

Lo que encuentro realmente útil de IRIS al enseñar mi asignatura de bases de datos post-relacionales es el hecho de que es una base de datos multimodelo. Lo que significa que podéis abordar la arquitectura y la estructura una sola vez y, después, mostrar el uso de diferentes modelos (como el objeto, documento, jerárquico) utilizando el mismo lenguaje y enfoque. Y no es un gran salto pasar de un lenguaje de programación orientado a objetos (como C#, Java, etc.) a una base de datos orientada a objetos.

Sin embargo, junto con las ventajas (que son muchas), vienen algunos inconvenientes cuando pasamos del modelo orientado a objetos al relacional. Cuando digo que podéis acceder a los mismos datos utilizando diferentes modelos, también necesito explicar cómo es posible trabajar con listas y arrays del modelo objeto en una tabla relacional. Con los arrays es muy sencillo: por defecto se representan como tablas separadas y eso es todo. Con las listas es más complicado, porque por defecto son cadenas de texto. Pero uno sigue queriendo hacer algo con ellas sin dañar la estructura ni volver esta lista ilegible en el modelo objeto.

Así que en este artículo os mostraré un par de predicados y una función que son útiles al trabajar con listas, y no solo como campos.

0
0 40
Artículo Ricardo Paiva · abr 7, 2025 2m read

¿Qué pasaría si pudierais hablar en un chat para comprobar qué sucede en Interoperabilidad, ver si hay errores e incluso resolver algunos tipos de problemas?

Con el servidor MCP, podéis conectar cualquiera de vuestros clientes MCP, por ejemplo, Claude, a IRIS y pedirle que revise la Interoperabilidad.

0
0 70
Artículo Ricardo Paiva · mar 17, 2025 6m read

InterSystems ha estado a la vanguardia de la tecnología de bases de datos desde su creación, siendo pionera en innovaciones que superan constantemente a competidores como Oracle, IBM y Microsoft. Al centrarse en un diseño eficiente del núcleo y adoptar un enfoque sin concesiones en el rendimiento de los datos, InterSystems se ha hecho un hueco en las aplicaciones de misión crítica, garantizando fiabilidad, velocidad y escalabilidad.

Una historia de excelencia técnica

0
0 62
Artículo Ricardo Paiva · mar 6, 2025 1m read

Hola,

como me tomó algún tiempo para averiguar lo que está mal, me gustaría compartir esta experiencia, para que no caigáis en la misma trampa.

Acabo de darme cuenta de que si nombráis a vuestro paquete «code» (todo en minúsculas), en una clase que usa algo de python embebido usando [Language = python], os encontraréis con la <THROW> *%Exception.PythonException <PYTHON EXCEPTION> 246 <class 'ModuleNotFoundError'>: No module named 'code.basics'; 'code' is not a package

0
0 43
Artículo Ricardo Paiva · mar 3, 2025 1m read

Los usuarios de CCR ahora pueden aprovechar una sintaxis mejorada para sustituir tokens predefinidos por enlaces URL en vivo dentro de los campos de texto relacionados con fases. Además del token existente <env> , que se actualiza automáticamente para reflejar el entorno del registro CCR correspondiente, CCR introduce ahora dos nuevas palabras clave: <smp> y <homepage>.

0
0 42
Artículo Ricardo Paiva · feb 10, 2025 1m read

En un entorno con contenedores, podéis gestionar la hora de vuestro contenedor mediante la variable TZ o a través de los directorios /etc/timezone y /etc/localtime.

environment:
      - TZ=Europe/Paris
volumes:
    - "/etc/timezone:/etc/timezone:ro"
    - "/etc/localtime:/etc/localtime:ro"

Podéis encontrar ejemplos completos aquí:

IRIS Community

IRISHealth_Community

IRIS production

IRISHealth production

0
0 52
Artículo Ricardo Paiva · ene 29, 2025 4m read

No estoy seguro de que haya muchos que se conecten a MS SQL para ejecutar consultas, procedimientos almacenados, etc., pero nuestro sistema de salud tiene muchas bases de datos diferentes basadas en MS SQL que usamos en el entorno de interoperabilidad por diversas razones.

Con el impulso de movernos de on-premises a la nube, nos encontramos con algunas dificultades con nuestras conexiones SQL Gateway y cómo configurarlas para usar Microsoft Entra para la autenticación de Active Directory.

0
0 77
Artículo Ricardo Paiva · ene 8, 2025 4m read

Link de Git: https://github.com/ecelg/InterSystems-IRIS-as-a-Spotify-REST-client

Recientemente se me ocurrió una idea: ¿cómo puedo poner mi lista de reproducción en IRIS? 🧐

Al mismo tiempo, me dijeron que debía pagar mi suscripción de Spotify 💸💸... oooh... ¿y si obtengo algunos datos de la API de Spotify? Así que empecé a investigar sobre eso.

Como en la mayoría de los desarrollos, comencemos con la documentación de la API: https://developer.spotify.com/documentation/web-api

Para obtener los datos, se requiere solicitar un token de acceso en la URL del endpoint de token. 🧐

0
0 89
Artículo Ricardo Paiva · dic 23, 2024 2m read

Monitoread los cambios incrementales en la base de datos mediante tareas programadas, mostrad las tendencias de cambio a través de gráficos, estableced umbrales de alarma y escribid la información en el archivo messages.log.

Cómo usarlo

Podéis instalarlo a través de Docker o ZPM.

Despliegue con Docker: Requisitos previos.

Aseguraos de tener instalados git y Docker Desktop.

Instalación

1. Clonad o haced git pull del repositorio en cualquier directorio local.

git clone https://github.com/Sara771dev/Database-Size-Monitoring.git

Abrid la terminal en este directorio y ejecutad:

docker-compose build

Iniciad el contenedor de IRIS

docker-compose up -d

Despliegue de paquetes ZPM

Abrid la terminal para ejecutar:

zpm "install databasesizemonitoring"

Crear tareas programadas

TipoDescripción
AlarmSizeAlarma de tamaño de la base de datos
DayActualSizeAumento diario del tamaño del volumen de alarma
IncrementalSizeAumento total actual del tamaño del volumen de alarma

image

Si el tamaño de la base de datos cambia por más del valor especificado, se escribirá información adicional en messages.log.

Al mismo tiempo, podéis contar las tendencias incrementales de la base de datos. Podéis visitar la siguiente página:

http://127.0.0.1:52773/csp/user/DataBases.Page.Chart.cls

imagetip: Si no podéis acceder a la página, es posible que tengáis que ajustar la aplicación web y cambiar el archivo del servidor de /csp/user a always y cache.

0
0 81