Limpiar filtro
Artículo
Eduardo Anglada · 23 mar, 2022
¡Hola desarrolladores!
A veces necesitamos publicar la imagen Docker de la solución InterSystems IRIS en la que estamos trabajando. Existen diferentes posibilidades, por ejemplo:
Usar la imagen en un cluster de Kubernetes.
Que un compañero ejecute la imagen desde un repositorio público sin tener que generarla.
La mejor solución es subir la imagen al Registro Hub de Docker o al Registro de Github.
En este breve artículo, propongo una forma de hacerlo automáticamente cada vez que subas (usando git push) cambios a tu repositorio GitHub.
Simplemente añade el siguiente fichero a la carpeta .github/workflows de tu repositorio:
Spoiler
name: Build and publish a Docker image to ghcr.io
on:
# publish on pushes to the main branch (image tagged as "latest")
# image name: will be: ghcr.io/${{ github.repository }}:latest
# e.g.: ghcr.io/intersystems-community/intersystems-iris-dev-template:latest
push:
branches:
- master
jobs:
docker_publish:
runs-on: "ubuntu-20.04"
steps:
- uses: actions/checkout@v2
# https://github.com/marketplace/actions/push-to-ghcr
- name: Build and publish a Docker image for ${{ github.repository }}
uses: macbre/push-to-ghcr@master
with:
image_name: ${{ github.repository }}
github_token: ${{ secrets.GITHUB_TOKEN }}
# optionally push to the Docker Hub (docker.io)
# docker_io_token: ${{ secrets.DOCKER_IO_ACCESS_TOKEN }} # see https://hub.docker.com/settings/security
Podemos usar cualquier nombre de archivo. Mira el ejemplo en iris-dev-template.
Cada vez que subas cambios al repositorio, Github ejecutará este workflow para crear y publicar la imagen en el registro de imágenes de Github.
Cualquiera puede puede obtener y ejecutar la imagen publicada, por ejemplo, como este iris-dev-template:
# docker run --rm --name my-iris -d --publish 9091:1972 --publish 9092:52773 ghcr.io/intersystems-community/intersystems-iris-dev-template:latest
El fichero puede funcionar en cualquier repositorio sin ningún cambio. Las imágenes tendrán diferentes URLS: ghcr.io/repositorio/imagen:latest
Tomé la idea de este enfoque a partir de la documentación de GitHub
¡Espero que os resulte útil!
Anuncio
David Reche · 26 ene, 2022
El equipo de Plataformas de Datos está encantado de anunciar el lanzamiento de la versión 2021.2 de InterSystems IRIS, InterSystems IRIS for Health y HealthShare Health Connect, ya disponible (GA) para clientes y partners.
Novedades de la versión
InterSystems IRIS Data Platform 2021.2 hace aún más sencillo desarrollar, desplegar y gestionar aplicaciones aumentadas y procesos de negocio que canalizan silos de datos y aplicaciones aisladas. Ofrece muchas funcionalidades nuevas, como:
Mejoras para desarrolladores de aplicaciones y de interfaces, incluyendo:
Python embebido
Producciones de interoperabilidad en Python
Actualizaciones en el paquete de extensiones Visual Studio Code ObjectScript
Nuevos Business Services y operaciones, que permiten a los usuarios configurar y ejecutar SQL query con mínimo código personalizado
Mejoras en Analytics e Inteligencia Artificial, incluyendo:
Nuevo comando SQL LOAD, que carga de forma eficiente datos desde CSV y JDBC en tablas
Mejoras en Adaptive Analytics
Mejoras en tareas de Cloud y Operations tasks, incluyendo:
Nuevos Conectores Cloud, que facilitan el acceso y uso de los servicios cloud en las aplicaciones de InterSystems IRIS
Mejoras en el Operador InterSystems Kubernetes (IKO) para mejorar la gestión de los recursos Kubernetes
Mejoras para administradores de sistemas y de bases de datos, incluyendo:
Online Shard Rebalancing que automatiza la distribución de datos a través de nodos sin interrumpir la operación
Adaptive SQL engine usa un sampleado rápido y automatizado para recolectar estadísticas avanzadas de tablas mejorando así la información disponible del runtime y la ejecución del planificador de queries
Se ha reducido el almacenamiento necesario para el sistema de InterSystems IRIS mediante compresión de streams y journals
Soporte para TLS 1.3 y OpenSSL 1.1.1, usando librerías incluidas en el sistema
Nueva utilidad de reporte detallado de estadísticas de procesamiento ^TRACE
Todas estas mejoras se detallan en la documentación de producto:
Documentación y notas de la versión de InterSystems IRIS 2021.2
Documentación y notas de la versión de InterSystems IRIS for Health 2021.2
Documentación y notas de la versión de HealthShare Health Connect 2021.2
Cómo obtener el software
InterSystems IRIS 2021.2 es una versión CD (Continuous Delivery, entrega continua), que ahora viene con los paquetes de instalación clásicos para todas las plataformas soportadas, así como con las imágenes del contenedor en OCI (Open Container Initiative), es decir, en formato Docker. Las imágenes para contenedor están disponibles para motores del run-time compatibles con Linux x86-64 y Linux ARM64, como se detalla en el documento de plataformas soportadas.
Los paquetes de instalación completos para cada producto están disponibles en la página de descargas del Centro de Soporte Internacional (WRC). La opción de instalación "Custom" permite a los usuarios escoger las opciones que necesitan, como InterSystems Studio e IntegratedML, para ajustar el footprint adecuado para la instalación.
Las imágenes del contenedor para la Enterprise Edition, Community Edition y todos sus componentes correspondientes están disponibles desde el Registro de Contenedores de InterSystems usando los siguientes comandos:
docker pull containers.intersystems.com/intersystems/iris:2021.2.0.649.0
docker pull containers.intersystems.com/intersystems/iris-ml:2021.2.0.649.0
docker pull containers.intersystems.com/intersystems/irishealth:2021.2.0.649.0
docker pull containers.intersystems.com/intersystems/irishealth-ml:2021.2.0.649.0
Para una lista completa de las imágenes disponibles, se puede consultar esta documentación.
También, las versiones en formato tarball de todas las imágenes de contenedores están disponibles en la página de descargas del Centro de Soporte Internacional (WRC).
Nuestros listados correspondientes en los principales marketplaces en la nube serán actualizados durante los próximos días.
Comparte tu experiencia
Estamos ansiosos de ver esta versión cubriendo los objetivos del hito de la Disponibilidad General y estamos deseando conocer vuestras experiencias con el nuevo software. Poneos en contacto con vuestro equipo de InterSystems habitual o aquí en la Comunidad de Desarrolladores si tenéis cualquier comentario sobre la tecnología o los casos concretos que estáis tratando.
Para algunas funcionalidades y productos específicos, hemos puesto en marcha Early Access Programs (Programas de Acceso Preferente), para permitir a nuestros usuarios evaluar el software antes de su lanzamiento. A través de estas iniciativas de sondeo, podemos aprender de nuestra audiencia objetivo y asegurarnos de que los nuevos productos satisfacen sus necesidades cuando son lanzados. Si estáis interesados en participar en estos programas, contactad por favor con vuestro equipo de InterSystems habitual o a través de la Comunidad de Desarrolladores.
Artículo
Ricardo Paiva · 24 mar, 2022
**Este artículo es una continuación de esta publicación.**
En ese artículo, analizamos el desarrollo de *business processes*, que forman parte de los componentes necesarios para la integración del sistema y sirven como coordinadores de la producción.
En este artículo mostraremos la creación de un *business service*, que es la ventana de entrada de información para la producción.
* Producción
* Mensaje
* **Componentes**
* **Business Services**
* Business Processes (publicación anterior)
* Business Operation
Y, finalmente, llegamos al último artículo de "¡Utilicemos la interoperabilidad!"
El *business service* proporciona una ventana de entrada para la información enviada desde fuera de IRIS, con o sin utilizar el adaptador para I/F externo.
Hay tres tipos de business services en la muestra (los enlaces entre paréntesis son enlaces al código de la muestra):
1. [*Business services* para archivos que utilizan adaptadores de entrada](#fileinboundadapter)(Start.FileBS)
2. [*Business services* para servicios web que utilizan el adaptador de entrada SOAP](#soapinboundadapter)(Start.WS.WebServiceBS)
3. [*Business services* llamados por procedimientos almacenados o REST sin utilizar adaptadores](#nonadapter)(Start.NonAdapterBS)
Los diferentes métodos de conexión que se utilizan para introducir la información solo aumentarán el número de *business services*; sin embargo, el procesamiento realizado dentro de un *business service* es
Crear un mensaje de solicitud que se enviaráusando información introducida externamente y simplemente llamar al business component
Sin ningún esfuerzo.
Ahora, describiremos cómo crear componentes que utilizan adaptadores de entrada de archivos.
Los business services se escriben en *scripts*, que pueden crearse en VSCode o Studio.
### 1. Business services para archivos que utilizan adaptadores de entrada(Start.FileBS)
Si creas una clase en VSCode, deberías crear una clase que hereda de Ens.BusinessService. Para los adaptadores, puedes utilizar el parámetro **ADAPTER** como nombre de la clase ADAPTER (por ejemplo, especificar una clase de adaptador de entrada de archivos).
Si no utilizas el adaptador, no será necesaria ninguna configuración.
```objectscript
Class Start.FileBS Extends Ens.BusinessService
{
Parameter ADAPTER = "EnsLib.File.InboundAdapter";
```
En el adaptador de entrada de archivos, puedes especificar el directorio que se supervisará en Settings→File Path para el *business service* de la producción.

Si el archivo localizado en "File Path" coincide con la información especificada en "File Spec", este abre el archivo como un objeto de flujo. Lo define como la primera variable cuando se llama al business service **ProcessInput()**.
Cuando se inicia **ProcessInput()**, se llama automáticamente a **OnProcessInput()**. OnProcessInput() se transmite directamente a **OnProcessInput()** con los parámetros transmitidos a ProcessInput().

En **OnProcessInput()** la sentencia inicial recibe la información del objeto *file stream*, que se transmite como primer parámetro, después crea un mensaje que se dará al siguiente componente, escribe el proceso de llamada al siguiente componente y completa la lógica básica.
* * *
【Memo】En el caso de Studio, inicia el Asistente (Wizard) de Business Services en el menú de New Creation, selecciona el adaptador y haz clic en el botón Finalizar.
* * *
La definición del método **OnProcessInput()** es la siguiente:
```objectscript
Method OnProcessInput(pInput As %Stream.Object, Output pOutput As %RegisteredObject) As %Status
```
**pInput** es proporcionado con una instancia de la clase **%Stream.FileCharacter** para archivos de texto o de la clase **%Stream.FileBinary** para archivos binarios.
En el ejemplo, se introducirá un archivo en formato texto, y lo hemos escrito para aceptar solicitudes de varias líneas y una solicitud por línea.
**La propiedad AtEnd** se establece en 1 cuando se detecta EndOfFile. Puedes utilizar esta propiedad para detener el bucle.
En un bucle, leemos las líneas utilizando el método **ReadLine()**, que nos permite obtener información sobre los contenidos del archivo una línea cada vez ( consulta la documentación para más información sobre el adaptador de archivos).
Escribe el mensaje, recuperando información línea a línea. Después, ejecutamos el método ..SendRequestAsync() , que llama al resto de los componentes.
Cuando se ejecute el método, el primer parámetro debería ser el nombre del componente al que quieres llamar en forma de *string*, y el segundo parámetro debería ser el mensaje de solicitud que hayas creado.
Ten en cuenta que ..SendRequestAsync() es una llamada asincrónica y no espera recibir una respuesta.
Nota: También existe SendRequestSync() para las llamadas sincronizadas.。
El código de ejemplo es el siguiente:

Referencia: explicación del uso de la función $piece() en el texto de ejemplo anterior
$piece(“string”, ”delimiter mark”, ”position number”)
La función para establecer/obtener una string con un delimitador, en el ejemplo, para obtener el primer y segundo valor de datos separados por comas, se escribe con la siguiente sintaxis:
```objectscript
set request.Product=$piece(record,",",1)
set request.Area=$piece(record,",",2)
```
Ahora, revisemos la función de Start.FileBS tal y como aparecía en la descripción anterior.
En la producción del ejemplo, el "File Path" se estableció en **/irisdev/src**, y el "File Spec" se estableció en **check.txt**. Prepara el mismo directorio o cámbialo a otro y registra los datos de la muestra en el archivo check.txt con el siguiente formato: nombre del producto adquirido, nombre de la ciudad.
※Si estás utilizando el contenedor de muestra, cambia el nombre de [Test-check.txt] en el directorio src en el directorio que se creó con el clon de git.


### 2. Business services para servicios web que utilizan el adaptador de entrada SOAP (Start.WS.WebServiceBS)
Posteriormente, describiremos la creación de business services para los servicios web.
La clase de Business Service para servicios web actúa como proveedor de servicios web = servidor de servicios web.
En el ejemplo, tenemos dos parámetros en el método del servicio web para esta producción de ejemplo, para tener información que se envía desde el cliente del servicio web. El método web utiliza los datos introducidos en los parámetros para crear una clase de mensaje y llamar a otros componentes.

Cuando se define una clase de servicio web, se crea una pantalla de prueba. Sin embargo, no se muestra de forma predeterminada.
Inicia sesión en IRIS (o inicia un terminal), ve al *namespace* donde se encuentra la producción y haz lo siguiente:
Para tu referencia:Acceso al catálogo y a las páginas de prueba
Esta es una configuración de código de ejemplo en el ajuste, donde el contenedor se inició con docker-compose up -d (ejecutar en el namespace %SYS)
set $namespace="%SYS"
set ^SYS("Security","CSP","AllowClass","/csp/user/","%SOAP.WebServiceInfo")=1
set ^SYS("Security","CSP","AllowClass","/csp/user/","%SOAP.WebServiceInvoke")=1
【Atención】Ten en cuenta que la frase distingue entre mayúsculas y minúsculas y debe escribirse con cuidado. Además, según el namespace en el que se utilice el producto, cambia el script especificado. La oración del ejemplo fue escrita considerando que el ejemplo se importa en el namespace USER.Si importas el código del ejemplo en el namespace ABC, el cuarto subíndice debería ser "/csp/abc/".
Cuando se haya completado la configuración, ve a la siguiente URL:
http://localhost:52773/csp/user/Start.WS.WebServiceBS.cls

Si quieres ofrecer el WSDL a tu cliente de servicios web, especifica WSDL=1 al final de la siguiente URL
http://localhost:52773/csp/user/Start.WS.WebServiceBS.cls?WSDL
### 3. Business services llamados por procedimientos almacenados o REST sin utilizar adaptadores(Start.NonAdapterBS)
A continuación, introduciremos el *Business Service* sin adaptadores (Start.NonAdapterBS).

Para los *business services* que utilizan adaptadores, el adaptador llama al método ProcessInput() del business service para detectar la información.
Si no utilizas adaptadores, puedes seguir llamando al método ProcessInput(), pero este método no es público. Por lo tanto, si implementas un business service que no utiliza adaptadores, tendrás que considerar ProcessInput().
La muestra utiliza los dos métodos siguientes:
* Procedimientos almacenados(Start.Utils)
* Clase dispatch para REST(Start.REST)→Este es el servicio que ejecutamos en este artículo.
Este es un ejemplo del procedimiento almacenado.

Después de añadir un business service (Start.NonAdapterBS) que no utiliza adaptadores a la producción (estado incorporado en la muestra), ejecuta el siguiente procedimiento almacenado
call Start.Utils_CallProduction('piroshki','Russia')

Un rastreo de los resultados de la ejecución es el siguiente:

A continuación, se muestra un ejemplo de creación de una clase dispatch para REST:

El XML descrito en el mapa de la URL de XData define qué métodos se llaman como respuesta a la URL en el momento que se realiza la llamada de REST.
En el ejemplo se describe una definición que llama al método **WeatherCheck()** cuando se proporcionan las URL's del **/weather/first parameter (purchased product name)/ second parameter (name of the city)** en la **solicitud GET**.
```objectscript
```
A continuación, define la URL base para la URL anterior en la pantalla de Configuración de la ruta de acceso a la aplicación web del Portal de administración, y estará completo.
Consulta este artículo para más detalles sobre la configuración.
Cuando esté listo, intenta ejecutar la información usando un *business service* que te permita enviar la información REST.
Ejemplo)http://localhost:52773/start/weather/Takoyaki/Osaka


Si no utilizas un adaptador, como ProcessInput() no se puede llamar directamente desde fuera, hemos creado un objeto para el business service en la lógica que se ejecuta por medio de REST o procedimientos almacenados (utilizando el método CreateBusinessService() de la clase Ens.Director) y llamado a ProcessInput()
Si utilizas un adaptador, este detecta la entrada y almacena la información en un objeto único y la transmite al business service. En cambio, si no utilizas un adaptador, el resto es prácticamente igual, la diferencia solo se encuentra en la parte del proceso mencionada anteriormente.
El business service está diseñado simplemente para utilizar la información que se introduce fuera de IRIS para crear mensajes de solicitud y llamar a los business components.
Durante la producción de la muestra, pudimos ver lo siguiente:
Los distintos componentes desempeñan diferentes funciones en la ejecución de una producción (business services, business processes, business operations).
Para transmitir información entre componentes, utiliza el mensaje.
Los mensajes se almacenan en la base de datos a menos que se borren y, por ello, se pueden rastrear en cualquier momento.
Algunos adaptadores facilitan el proceso que rodea a la conexión.
Estas son las operaciones básicas sobre cómo utilizar la interoperabilidad en IRIS.
También hay mapas de registros y herramientas de conversión de datos que son útiles para la entrada y salida de archivos CSV y otros archivos con formato específico.
Además, IRIS for Health también es compatible con las transmisiones FHIR y HL7 (incluyendo SS-MIX2).
Estaré encantado de explicarlo en otra publicación. Si tienes algo interesante que compartir, ¡deja un comentario!
Por último, también hay cursos de formación para aprender a utilizar la Interoperabilidad.
Artículo
Ricardo Paiva · 4 mar, 2022
**Este artículo es una continuación de esta publicación.**
En ese artículo revisamos cómo crear y definir mensajes que se utilizan para enviar y recibir datos entre componentes.
En este artículo, explicaré cómo crear una *business operation* a partir de los métodos para crear componentes.
* Producción
* Mensaje(artículo anterior)
* **Componentes**
* Business Services
* Business Processes
* **Business Operations**
Revisaremos rápidamente el código al referirnos a la muestra.。

| Nombre del componente | Función |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Start.FileBS | Un servicio (BS) que utiliza el adaptador para la entrada de archivos para leer los archivos ubicados en un directorio específico a intervalos regulares. |
| Start.NonAdapterBS | Servicios (BS) que permiten a las aplicaciones y a los usuarios introducir información directamente sin utilizar un adaptador. |
| Start.WS.WebServiceBS | Servicios (BS) que permiten introducir información mediante servicios web. |
| Start.WeatherCheckProcess | Un proceso (BP) que controla el procedimiento para adquirir información meteorológica y después registrarla en una base de datos. |
| Start.GetKionOperation | La operación (BO) para transmitir del nombre de la ciudad al servicio web que proporciona la información meteorológica y la devuelve. |
| Start.SQLInsertOperation | Operaciones (BO) que utilizan adaptadores de salida SQL para solicitar el registro de la información meteorológica y de la compra en la base de datos. |
| Start.InsertOperation | Operaciones (BO) que realizan actualizaciones en las tablas de InterSystems IRIS sin utilizar adaptadores. |
Nota: BS significa "*Business Service*", BP significa "*Business Process*" y BO significa "*Business Operation*".
Hay que escribir ObjectScript en *Business Services* y *Business Operations* y se pueden crear en VSCode o en Studio. Los *Business Processes* también se pueden llevar a cabo en el Portal de Administración.
No hay un orden particular para crearlos, pero el sitio externo al que se conectará es un sitio público y puede utilizarse inmediatamente en este ejemplo. En este caso, es conveniente comenzar con la *business operation* para que las pruebas sean más fáciles.
Después de crear los componentes, hay una página de prueba en la producción para los *business processes* y las *business operations*. Sin embargo, las pruebas están desactivadas de forma predeterminada en la definición de la producción, para evitar pruebas aleatorias en el entorno de producción.
Para saber más sobre cómo permitir las "Pruebas activadas" en la producción, utiliza la siguiente configuración (la producción de muestra se ha configurado como "Pruebas activadas" de forma anticipada):

### 1) Business Operations
En el ejemplo, aparecen dos tipos de *business operations*.
Una de las operaciones consiste en transmitir el nombre de la ciudad a una API web externa mediante REST y solicitar que se obtenga la información meteorológica. La otra operación consiste en dar la información meteorológica y el nombre del producto comprado a la base de datos de InterSystems IRIS y solicitar el proceso actualizado.
#### **1)-1 Business Operations de REST**
Comencemos creando una operación que llame a una API web externa por medio de REST.
Esta operación inicia el método GetKion() cuando se introduce un mensaje Start.Request, consulta a un sitio externo y devuelve la información meteorológica en un mensaje Start.Response.
Consulta aquí los detalles del código.
Para crear una *business operation* para REST, deberá heredarla de **EnsLib.REST.Operation**.
```objectscript
Class Start.GetKionOperation Extends EnsLib.REST.Operation
```
La herencia de esta clase ofrece los siguientes métodos en IRIS que coinciden con los métodos de HTTP. Consulta la documentación para obtener más información.
GetURL(): se utiliza para las operaciones GET de HTTP.
PostURL(): se utiliza en las operaciones POST de HTTP.
PutURL(): se utiliza en las operaciones PUT de HTTP.
DeleteURL(): se utiliza en las operaciones DELETE de HTTP.
Para REST, utiliza el adaptador **EnsLib.HTTP.OutboundAdapter**. Establece el nombre del adaptador en el parámetro **ADAPTER** y la propiedad Adapter, como se muestra en el ejemplo.
El parámetro INVOCATION configura la **Fila**.
```objectscript
Parameter ADAPTER = "EnsLib.HTTP.OutboundAdapter";
Property Adapter As EnsLib.HTTP.OutboundAdapter;
Parameter INVOCATION = "Queue";
```
Es necesario especificar la clave de la API OpenWeather que se obtendrá en el momento de la ejecución. Hay una forma de mostrar la configuración que varía según el entorno en la configuración de la producción.
El procedimiento es el siguiente:
1. Define las propiedades
2. Especifica el nombre de la propiedad que se creó en el parámetro SETTINGS (si hay varias propiedades, sepáralas con comas). De manera opcional, también se puede especificar una categoría (utilizando “property name: category name”).
A continuación se muestra un código de ejemplo.
```objectscript
/// APIキーを指定します
Property appid As %String;
/// specify lang option for OpenWeather API (default = ja = japanese)
Property lang As %String [ InitialExpression = "ja" ];
Parameter SETTINGS = "lang:OpenWeatherMap,appid:OpenWeatherMap";
```
La página de Configuración de la producción se muestra lo siguiente. La descripción que aparece en la línea inmediatamente anterior a la definición de la propiedad también se muestra en la página de configuración de la producción, como se muestra en la figura.
Después, revisaremos el mapa de mensajes, que es un escenario esencial para business operations.
.png)
La definición anterior permite que el método GetKion() funcione cuando se envíe el mensaje **Start.Request**.
En el método GetKion(), **el nombre de la ciudad** puede obtenerse a partir de la propiedad Area para solicitar mensajes transmitidos como información de entrada.
Estableciendo el **nombre de la ciudad** como parámetro de la URL publicada por la API web externa y llamándolo, se puede obtener la información meteorológica.
La configuración del servidor HTTP y de la URL se realiza en la página de Producción del Portal de Administración. Para obtener la configuración, utiliza la propiedad del **Adapter** que le proporciona el adaptador de salida de HTTP.
Ejemplo) para especificar una URL, utiliza ..Adapter.URL
Utiliza el método GetURL() que proporcionan las business operations de REST para llamar a un sitio externo. El primer parámetro es la URL que se ejecutará (es decir, la URL que se especifica en los parámetros requeridos como el **nombre de la ciudad**). El segundo parámetro es la respuesta de HTTP con parámetros transmitidos como referencia.
Como la información meteorológica se almacena en formato JSON en la respuesta HTTP, la operación se completa cuando los datos se registran en el mensaje de respuesta (=pResponse).
El nombre de la clase de los mensajes de respuesta se especifica en el segundo parámetro del método creado cuando se transmite la referencia.
```objectscript
Method GetKion(pRequest As Start.Request, Output pResponse As Start.Response) As %Status
```
Para devolver un mensaje de respuesta a la persona que lo llama, crea una instancia del mensaje de respuesta, almacénalo en la segunda variable del parámetro (_**pResponse**_), y establece la información necesaria en las propiedades.
```objectscript
set pResponse.AreaDescription=weatherinfo.weather.%Get(0).description
set pResponse.KionMax=weatherinfo.main."temp_max"
set pResponse.KionMin=weatherinfo.main."temp_min"
set pResponse.Area=weatherinfo.name
// this code is fit to Japan time because weatherinfo.dt is UTC
set unixEpochFormat=weatherinfo.dt+32400
set dt=$system.SQL.Functions.DATEADD("s",unixEpochFormat,"1970-01-01 00:00:00")
set pResponse.AreaPublicTime=dt
```
Como las respuestas HTTP de los sitios externos se devuelven en formato JSON, el flujo que podría obtenerse de la respuesta HTTP se utiliza para convertirla en un objeto dinámico que sea cómodo para llevar a cabo operaciones JSON dentro de IRIS.
```objectscript
set weatherinfo={}.%FromJSON(tHttpResponse.Data)
```
El siguiente es un ejemplo de una cadena JSON de respuesta:
```json
{
"coord": {
"lon": 135.5022,
"lat": 34.6937
},
"weather": [
{
"id": 803,
"main": "Clouds",
"description": "broken clouds",
"icon": "04d"
}
],
"base": "stations",
"main": {
"temp": 11.38,
"feels_like": 8.33,
"temp_min": 11,
"temp_max": 12.22,
"pressure": 1007,
"humidity": 62
},
"visibility": 10000,
"wind": {
"speed": 2.57,
"deg": 220
},
"clouds": {
"all": 75
},
"dt": 1611820991,
"sys": {
"type": 1,
"id": 8032,
"country": "JP",
"sunrise": 1611784750,
"sunset": 1611822143
},
"timezone": 32400,
"id": 1853909,
"name": "Osaka",
"cod": 200
}
```
La temperatura máxima, mínima y el tiempo se pueden obtener de la siguiente manera:
```objectscript
set pResponse.AreaDescription=weatherinfo.weather.%Get(0).description
set pResponse.KionMax=weatherinfo.main."temp_max"
set pResponse.KionMin=weatherinfo.main."temp_min"
```
Si quieres saber más sobre la manipulación de JSON en IRIS, consulta la [documentación](https://docs.intersystems.com/).
Ahora, utilizaremos la herramienta para realizar pruebas de producción para ver si podemos obtener la información meteorológica de forma correcta.
Abre la página de Producción (Management Portal> Interoperability> Configuration> Production), haz clic en Start.GetKionOperation y, a continuación, haga clic en el **botón "Test"** en la pestaña "**Action**".
Especifica un **nombre de ciudad** (Naha, Sapporo, Nagano, Shinjuku, etc.) en **Area**, y haz clic en el botón “**Run Test Service**”.
Aquí puedes ver los resultados de la prueba, con las temperaturas máximas y mínimas y el tiempo registrado.
Continúa para saber cómo utilizar la página Trace.
Al seleccionar un rectángulo horizontal como  en la pantalla izquierda hace que la información en la pantalla derecha, se modifique.
Los mensajes que se envían y reciben durante el proceso de integración del sistema se guardan automáticamente en la base de datos. Mediante la página de mensajes de Visual Trace, se puede ver en detalle qué mensajes se enviaron a qué componentes en orden cronológico y si hubo respuesta o no.
Además, si se produce un error
"Se produjo un error al enviar/recibir/recibir □ mensaje al componente de ○ a △".
aparecerá una marca roja donde se produjo el error para que se pueda ver. Por supuesto, además del seguimiento, también tenemos una página para registrar eventos. **(Management Portal > [Interoperability] > [View] > [Event Log])**
Seguimos. Vamos a revisar la operación para solicitar una actualización a la base de datos.
#### **1)-2 Business Operations que solicitan actualizaciones a la base de datos**
La muestra ofrece dos tipos de operaciones: Start.SQLInsertOperation y Start.InsertOperation.
Cada una de ellas es una operación para solicitar una actualización de la base de datos, pero Start.SQLInsertOperation utiliza el adaptador de salida de SQL, mientras que Start.InsertOperation no tiene ningún adaptador.
La diferencia entre ambos es
se asume que se accede mediante conexiones ODBC/JDBC a la operación que utiliza el adaptador de salida SQL, por lo que el destino de la conexión a la base de datos puede cambiarse en la configuración de la producción.
Para las operaciones que no utilizan adaptadores, se asume que el destino de la actualización de la BD es una base de datos dentro del rango de visibilidad de la configuración de producción y que no se produce ningún cambio en el destino de la conexión.
La base de datos IRIS puede utilizarse para almacenar datos arbitrarios durante la integración del sistema. Sin embargo, supongamos que la configuración del sistema cambia por cualquier razón unos años más tarde, y surge la necesidad de conectarse a una base de datos ubicada en un servidor diferente. En ese caso, la operación sin el adaptador no podrá continuar .
En cambio, las operaciones que utilizan el adaptador de salida SQL pueden funcionar si no hay cambios que procesen el contenido de las especificaciones del destino (si no hay ningún problema con la sentencia SQL que se ejecutará, puede conectarse con bases de datos de diferentes productos).
Durante la integración del sistema, puede haber casos en los que la información de la conexión cambia debido a razones externas al sistema. Por ello, es vital poseer un diseño que pueda responder con flexibilidad a los cambios. Por esta razón, se recomienda crear componentes que soporten conexiones externas de una forma libre de acoplamientos.
Sin embargo, supongamos que no hay ningún cambio en la configuración en el futuro. En ese caso, se podrá acceder a la base de datos en IRIS sin utilizar la conexión ODBC/JDBC, por lo que se podrá optar por utilizar el adaptador o no, dependiendo del tipo de uso.
Vamos a ver el código Start.SQLInsertOperation que utiliza el adaptador.
El adaptador que se utiliza en el ejemplo es un adaptador de salida SQL, que permite solicitar a la base de datos que ejecute sentencias SQL. Distintos adaptadores ofrecen diferentes métodos. Consulta la documentación para más detalles sobre los métodos que proporcionan los adaptadores.
Después, revisa el código de Start.InsertOperation, sin utilizar el adaptador.
Tanto si se utiliza un adaptador como si no, se requiere el mapa de mensajes y las definiciones de los métodos de la operación. Si no se utiliza un adaptador, no se necesita definir “Paramter” y “Property” para el adaptador.
.png)
Business Operations sin adaptadores: En Start.InsertOperation, SQL se ejecuta usando ObjectScript (el comentario de la afirmación es el proceso de actualización en las operaciones de objetos).
La implementación es satisfactoria si la base de datos que se actualiza no se separa de IRIS.
Descubrimos que las operaciones que utilizan adaptadores ofrecen un método fiable para solicitar el procesamiento desde el destino. También confirmamos que es posible crear operaciones sin utilizar adaptadores y escribir código de forma libre para ellas.
En el siguiente artículo, me gustaría explicar cómo crear un *business process* que llame a las operaciones para obtener información meteorológica y actualizar la base de datos en el orden correcto.
Artículo
Ricardo Paiva · 11 mar, 2022
**Este artículo es una continuación de esta publicación.**
En ese artículo, analizamos la creación de *business operations* a partir de los componentes necesarios para la integración del sistema.
En este artículo, mostraré cómo crear un *business process* que llama a las dos *business operations* definidas en el orden de la secuencia.
* Producción
* Mensaje
* **Componentes**
* Business Services
* **Business Processes**
* Business Operations (publicación anterior)
El *business process* actúa como coordinador (centro de mando) del proceso.
Los ajustes en el proceso que se pueden implementar en la muestra son los siguientes:
Paso 1: Proporcionar el nombre de la ciudad a una API web externa y solicitar información meteorológica.
Paso 2: Registrar el resultado de la consulta (información meteorológica) del paso 1 y el nombre del producto comprado que se recibió al inicio de la producción.
En el *business process* de muestra, esperaremos la respuesta al paso 1 y ajustaremos el paso 2 para que funcione.
En el proceso de espera de una respuesta (es decir, de sincronización), por ejemplo, ¿qué ocurre si el paso 1) no responde durante unos días?
Si se entregan nuevos mensajes al *business process* mientras se espera una respuesta durante unos días, los mensajes no serán descartados ya que se almacenan en una cola. Sin embargo, el *business process* no procesará nuevos mensajes y habrá un retraso en la operación.
Nota: Los business processes y las business operations tienen colas.
Por lo tanto, en producción, cuando hay una llamada sincronizada, hay dos maneras de que el *business process* pueda moverse: **A) Hacer una sincronización perfecta**, y B) Guardar el estado del propio *business process* en la base de datos y transferir el entorno de ejecución para que otros procesos puedan ejecutarse mientras esperan una respuesta.
**A) Cómo hacer una sincronización perfecta:**
Mientras se realiza una llamada sincronizada, el procesamiento del business process está en marcha, y esperando a que se procese el siguiente mensaje hasta que se complete todo el procesamiento.➡Esta función se utiliza cuando se necesita garantizar el orden del procesamiento en el método "primero en entrar, primero en salir".
B) El método para guardar el estado del propio *business process* en la base de datos y transferir el entorno de ejecución para que otros procesos puedan ejecutarse mientras esperan una respuesta es
Cuando se realiza una llamada sincronizada, el proceso guarda su estado en la base de datos. Cuando se recibe un mensaje de respuesta, y es el momento de procesar el mensaje, se abre la base de datos y se ejecuta el siguiente proceso. (IRIS gestionará el almacenamiento y la reapertura de los business processes en la base de datos). ➡ Se utiliza cuando es aceptable cambiar el orden para procesar los mensajes (es decir, cuando se permiten procesar más y más mensajes diferentes recibidos mientras se espera una respuesta).
En la muestra, se utiliza **B)**.
Hay dos tipos de editores para crear business processes: un Editor de Business Processes que permite colocar cuadros de procesamiento (actividades) e implementarlos mientras se define su ejecución, y un método para crearlos mediante ObjectScript en Studio o VSCode.
Si utilizas el Editor de Business Processes, utilizarás la actividad de llamada para invocar al componente, pero esta actividad está **implementada** de la forma **B)**. **Por supuesto, también puedes implementar el método** **A)** en el Editor de Business Processes, excepto que en ese caso no utilizará la actividad de llamada (utilizará la actividad del código).
En esta sección, explicaré cómo crearla.
Si se utiliza el Editor de *Business Processes*, deben escribirse en el Portal de Administración.
También puedes abrir el *business process* desde la página de configuración de la producción. La siguiente imagen muestra el procedimiento.

Iconos como .png) en este editor se llaman actividades, y las que están marcadas como son actividades que pueden invocar otros componentes.
Este símbolo.png) indica que se devolverá un mensaje de respuesta (es decir, se realizará una llamada sincronizada). La actividad se ajusta de forma predeterminada a la configuración de la llamada no sincronizada, que puede cambiarse según sea necesario.
Ahora observemos los *business processes*, que son componentes que se invocan al recibir un mensaje de solicitud, así como las *business operations*.
En la muestra, el mensaje de solicitud: Se pone en marcha cuando recibe un Start.Request y no devuelve un mensaje de respuesta.

En el *business process*, los mensajes aparecen en varias situaciones.
Mensajes de solicitud que se envían a los business processes.
Mensaje de solicitud (más un mensaje de respuesta) que se envía cuando se llama a otro componente usando la actividad.
En el Editor de Business Processes, los nombres de los objetos que almacenan mensajes están claramente separados para poder ver qué mensaje se envió desde qué destino.

* solicitud(requisitos básicos)
El mensaje que activó el inicio del business process, en nuestro ejemplo, es Start.Request (el mensaje que se debe especificar en la configuración de la Solicitud en la pestaña Contexto dentro del Editor de Business Processes)
* respuesta(respuesta básica)
Mensaje de respuesta para devolver a la persona que llama al business process (no se utiliza en el ejemplo) (mensaje que se debe especificar en la configuración de la respuesta que aparece en la pestaña Contexto en el Editor de Business Processes)
* callrequest(mensaje de solicitud)
Mensaje de solicitud que se envía al llamar al componente determinado por la actividad.
* callresponse(mensaje de respuesta)
Mensaje de respuesta devuelto desde el componente especificado por la actividad.
**callrequest y callresponse son objetos que se eliminarán cuando se complete el procesamiento de llamada de la actividad.** Todos los demás objetos no desaparecerán hasta que finalice el *business process*.
Ahora se presenta el problema cuando desaparece callresponse.
Esto es porque, como se puede ver en este ejemplo, **Cuando se llama a un componente, si se quiere utilizar el resultado de la respuesta de un componente llamado previamente, se perderá el mensaje de respuesta, y se borrará la información que se iba a utilizar en el siguiente componente.**
Es un problema 😓
¿Qué deberíamos hacer?・・・・・
En este caso, se puede utilizar el objeto de contexto.
El objeto de contexto, al igual que la solicitud/respuesta, es un objeto que sobrevive hasta el final del business process.
Además, como el contexto es un objeto genérico, se puede definir en el editor de proceso.
Además del contexto, también se puede utilizar el objeto de respuesta si tiene una propiedad que coincida con lo que guarda la información heredada.
Ahora, vamos a repasar los pasos de nuevo.

El mensaje de respuesta en el globo azul claro: Start.Response es un objeto que se eliminará cuando termine el proceso.
Como queremos utilizar el mensaje de respuesta (Start.Response) que contiene la información meteorológica como el mensaje que se enviará a la siguiente [Business Operation para la actualización de la base de datos], tenemos que implementar el objeto de contexto de tal forma que todos los valores de la propiedad del mensaje de respuesta (Start.Response) se puedan asignar a él.
Entonces, ¿cuál es la configuración para la propiedad de contexto?
Las propiedades se definen en "Context Properties" en la pestaña Context del Editor de business processes.
En este caso, nos gustaría guardar todas las propiedades del mensaje de respuesta (Start.Response) en el objeto de contexto. Por lo tanto, la especificación del tipo de propiedad se establece en Start.Response.

A continuación, consulta la configuración en la actividad.

Los mensajes de solicitud y de respuesta tienen un botón llamado ○○ Builder.
Al hacer clic en este botón se iniciará un editor de líneas que permite especificar lo que se quiere registrar en las propiedades de cada mensaje.

Después de esto, la *business operation* para solicitar una actualización de la base de datos (Start.SQLInsertOperation o Start.InsertOperation) se llama de la misma manera con la actividad, y todo estará listo.
(Para más información, consulta Configuring .png) para Business Processes).
Cuando se haya completado la verificación, se podrá probar. El método de prueba es el mismo que se utiliza para probar las business operations (consulta este artículo).
El seguimiento después de la prueba es el siguiente:

Como el business process es el coordinador, pudimos ver que invocaba de forma secuencial los componentes definidos, lo que mantiene la ejecución sincronizada.
Nota 1: Este ejemplo solo se refiere a la actividad sobre las llamadas, pero hay otras actividades, como la transformación de datos.
Nota 2: Los business processes creados únicamente por ObjectScript, distintos al Editor de Business Processes, se heredan de la clase Ens.BusinessProcess. Si se crea en el Editor de Business Processes, se hereda de la clase Ens.BusinessProcessBPL.
El business process es el coordinador del proceso de integración del sistema.El Editor de Business Processes ofrece los siguientes tipos de variables para los mensajes (request/response/callrequest/callreponse/context).Un business process creado con el Editor de Business Processes puede funcionar de forma que no retrase otros mensajes, incluso si hay sincronización en la llamada del componente.
En el próximo artículo, mostraré finalmente cómo desarrollar el último componente: los *business services*.
Anuncio
Esther Sanchez · 17 ene, 2023
¡Hola desarrolladores!
Os invitamos a un nuevo webinar en español: "Validación de perfiles FHIR con InterSystems IRIS for Health", el jueves 2 de febrero, a las 3:00 PM (CET).
El webinar está dirigido a desarrolladores y emprendedores.
Durante el webinar, vamos a armar un servidor FHIR y repositorio. Además, vamos a añadir un perfil local con sus extensiones para validar recursos sobre esta guía. Lo vamos a realizar utilizando InterSystems IRIS, el validador de FHIR (Java) y SUSHI.
Con estas herramientas, podemos contar con lo necesario para que puedas validar tus perfiles antes de enviarlos a un repositorio central y además probar tus aplicaciones FHIR consumiendo estos recursos que quedan almacenados en el Repositorio FHIR de InterSystems IRIS for Health.
¡Os esperamos!
🗣 Ponente: @Ariel.Arias , Sales Engineer en InterSystems Chile.
➡️ Podéis registraros aquí >> Este jueves es el webinar. ¿Os habéis registrado ya? ✍️ Dentro de poco es el webinar... ¡Ya hay más de 50 personas inscritas! Y hay hueco para más, así que animaos lo que faltáis por inscribiros.
Os recuerdo que durante el webinar podéis hacer preguntas en el chat disponible para ello. Y al terminar el webinar, Ariel responderá a todas las preguntas.
¡Nos vemos pronto!
Anuncio
Esther Sanchez · 19 ene, 2023
¡Hola Comunidad!
Os presentamos la primera mesa redonda del año - 60 minutos de animada charla (en inglés) en el que se comentarán las mejores prácticas para desarrollar en VS Code/Studio, casos reales...
📅 Fecha: Jueves 26 de enero🕑 Hora: 3:00 PM (CET)
➡️ Podéis registraros aquí >>
Si tenéis alguna pregunta sobre el tema, podéis escribirla en los comentarios de esta publicación o enviar un Mensaje Directo a @Olga.Zavrazhnova2637. Y la pregunta se responderá durante la mesa redonda.Si alguno de vosotros no pertenecéis a Global Masters, el Programa de Fidelización de la Comunidad de Desarrolladores, podéis daros de alta usando vuestras credenciales SSO de InterSystems.
Anuncio
Esther Sanchez · 30 mar, 2023
¡Hola desarrolladores!
Nos gustaría invitaros a un nuevo concurso de programación, dedicado a crear soluciones de Inteligencia Artificial (IA)/Machine Learning (ML) que utilicen Cloud SQL para trabajar con los datos:
🏆 Concurso de Programación: InterSystems IRIS Cloud SQL con IntegratedML 🏆
Duración: del 3 al 23 de abril, 2023
Total en premios: $13,500
Tema
💡 InterSystems IRIS Cloud SQL con IntegratedML 💡
En este concurso, esperamos ver aplicaciones full-stack, frontend o backend que utilicen InterSystems IRIS Cloud SQL para trabajar con datos y, opcionalmente, que utilicen su opción IntegratedML para crear soluciones de IA/ML. Las aplicaciones pueden ser una librería, paquete, herramienta o cualquier solución SQL y/o IA/ML que utilice InterSystems IRIS SQL Cloud como backend.
Básicamente, en este concurso os invitamos a usar InterSystems IRIS como un motor 100% SQL con una opción AutoML a través de la funcionalidad IntegratedML.
Aquí podéis consultar más información sobre InterSystems IRIS Cloud SQL junto con la funcionalidad IntegratedML.
Requisitos generales:
Aplicaciones aceptadas: aplicaciones nuevas en Open Exchange, o existentes pero con una mejora significativa. Nuestro equipo revisará todas las aplicaciones antes de aprobarlas para el concurso.
La aplicación debería funcionar en IRIS Community Edition o IRIS for Health Community Edition o IRIS Advanced Analytics Community Edition.
Tipos de aplicación: UI frameworks, IDE (Entornos de Desarrollo), gestión de base de datos, monitorización, herramientas de despliegue, etc.
La aplicación debe ser de Código Abierto y publicarse en GitHub.
El fichero README de la aplicación debe estar en inglés, contener los pasos de instalación y contener un video con una demostración y/o una descripción de cómo funciona la aplicación.
Un desarrollador puede participar con un máximo de 3 aplicaciones.
Premios
1. Nominación de los Expertos - los ganadores serán elegidos por un equipo de expertos de InterSystems:
🥇 1er puesto - $5,000
🥈 2º puesto - $3,000
🥉 3er puesto - $1,500
🏅 4º puesto - $750
🏅 5º puesto - $500
🌟 Puestos 6-10 - $100
2. Ganadores de la Comunidad – las aplicaciones que reciban el mayor número de votos en total:
🥇 1er puesto - $750
🥈 2º puesto - $500
🥉 3er puesto - $250
Nota: Si dos o más participantes obtienen la misma cantidad de votos, todos serán considerados ganadores y el importe del premio se repartirá entre todos.
Fechas importantes:
🛠 Fase de registro y desarrollo de aplicaciones:
3 de abril de 2023 (00:00 EST): Comienza el concurso.
16 de abril de 2023 (23:59 EST): Fecha límite para enviar las propuestas.
✅ Fase de votación:
17 de abril de 2023 (00:00 EST): Comienza la votación.
April 23, 2023 (23:59 EST): Termina la votación.
Nota: Los desarrolladores pueden mejorar sus aplicaciones hasta el fin de la votación.
¿Quién puede participar?
Cualquier miembro registrado en la Comunidad de Desarrolladores de cualquier país puede participar en el concurso, excepto los empleados de InterSystems. Regístrate aquí en la Comunidad si aún no tienes una cuenta
👥 Los desarrolladores pueden formar equipos para crear una aplicación colaborativa. Se permiten de 2 a 5 desarrolladores por equipo.
No os olvidéis de nombrar a todos los miembros del equipo en el README de vuestra aplicación – los perfiles de usuario de la DC.
Recursos útiles
✓ Documentación:
InterSystems IRIS Cloud SQL
InterSystems IRIS Cloud IntegratedML
✓ Herramientas:
irissqlcli - python SQL terminal para InterSystems IRIS
Conexión a IRIS Cloud SQL:
irissqlcli -h your-iris-cloud-sql-server -p 1972 -u SQLAdmin -n USER -W
DBeaver - SQL-driven database tool. DBeaver e IRIS.
✓ Aplicaciones ejemplo:
iris-cloud-sql-demo
✓ Formación online:
Connect to InterSystems IRIS Cloud SQL via Python, C++, Java, .NET.
✓ Cómo enviar tu aplicación al concurso:
How to publish an application on Open Exchange
How to submit an application for the contest
¿Dudas, preguntas?
Uníos al canal del concurso en el servidor de Discord de InterSystems o escribidnos en los comentarios de esta publicación.
¡Estamos deseando ver vuestros proyectos! Buena suerte a todos 👍
Participar en este concurso implica aceptar los Términos oficiales de la competición. Por favor, leedlos con atención antes de participar.
Anuncio
Esther Sanchez · 10 mayo, 2023
¡Hola Comunidad!
Todos los equipos ya están concentrados en sus proyectos durante el hackathon de InterSystems en la Conferencia "J On The Beach" en Málaga. Ganará el equipo cuyo modelo predictivo sea el más innovador. Así que... ¡mucha suerte a todos!
¡Y muchas gracias a @Thomas.Dyar, @Anastasia.Dyubaylo y @Dmitry.Maslennikov por su soporte!
Pronto anunciaremos los ganadores.
Stay tuned! 😉
Artículo
Luis Angel Pérez Ramos · 19 mayo, 2023
¡Hola Comunidad!
Me gustaría presentaros una nueva utilidad para importar CSV a IRIS - ¡csvgenpy!
Instalación
USER>zpm "install csvgenpy"
Uso:
do ##class(shvarov.csvgenpy.csv).Generate("file or url","table","schema")
Ejemplo:
USER>do ##class(shvarov.csvgenpy.csv).Generate("https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv","titanic","data")
Esto creará la tabla y la clase data.titanic en IRIS y a continuación cargará los datos. Podéis probarlo con:
USER>:sql
[SQL]USER>>select * from data.titanic
[SQL]USER>>select * from data.titanic
1. select * from data.titanic
passengerid survived pclass name sex age sibsp parch ticket fare cabin embarked
1 0 3 Braund, Mr. Owen Harris male 22 1 0 A/5 21171 7.25 S
2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Thayer) female 38 1 0 PC 17599 71.283299999999996998 C85 C
3 1 3 Heikkinen, Miss. Laina female 26 0 0 STON/O2. 3101282 7.9249999999999998223 S
...
¡Y eso es todo!
Básicamente, hace lo mismo que csvgen, pero usa la librería de python SQLAlchemy que funciona con Python Embebido y sqlalchemy-iris, de @Dmitry.Maslennikov
P.D. csvgenpy puede importar algunos csv "complicados" para csvgen como este. Básicamente, puede importar cualquier tipo de csv.
Todos los comentarios y preguntas son bienvenidos!
Artículo
Alberto Fuentes · 22 mayo, 2023
¡Hola Comunidad!
A menudo, las soluciones con InterSystems IRIS BI pueden convertirse en soluciones bastante grandes con docenas de tablas dinámicas y cuadros de mando.
Con cada nueva versión de IRIS BI podemos añadir cambios que pueden influir en el comportamiento de las tablas dinámicas y cuadros de mando existentes y que dejen de funcionar. Por ejemplo, si cambiamos el nombre de una medida o dimensión, olvidamos desplegar cubos o realizamos reestructuraciones con cambios masivos del nombre de los cubos y sus elementos, algunos widgets podrían dejar de funcionar.
La solución es probar (¿manualmente?) cada widget en cada cuadro de mando para asegurarnos de que las consultas MDX están funcionando.
Hoy quiero presentaros una herramienta para probar automáticamente todas las tablas dinámicas y los cuadros de mando.
Instala el módudlo isc-dev IPM creado por @Gevorg.Arutiunian9096 como:
USER>zpm "install isc-dev"
o programáticamente:
set sc=$zpm("isc-dev")
Nota: Necesitaréis tener el cliente IPM instalado. Si no lo tenéis, podéis usar la siguiente línea para instalarlo:
s r=##class(%Net.HttpRequest).%New(),r.Server="pm.community.intersystems.com",r.SSLConfiguration="ISC.FeatureTracker.SSL.Config" d r.Get("/packages/zpm/latest/installer"),$system.OBJ.LoadStream(r.HttpResponse.Data,"c")
El módulo instalado isc-dev tiene dos métodos que pueden ayudar en pruebas automáticas. Este sirve para probar todas la tablas dinámicas:
set sc=##class(dev.bi).checkPivots()
Si hay problemas, el sc contendrá errores.
También tiene la opción de parar en el primer error:
set sc=##class(dev.bi).checkPivots(1)
En este caso se os presentará la primera tabla dinámica que no funciona, que se muestra a través del log en el terminal.
Otra utilidad ayudará a comprobar todos los cuadros de mando:
set sc=##class(dev.bi).checkDashboards()
Controlará todos los widgets y la configuración de sus filtros.
Estas dos utilidades son muy prácticas para utilizarlas en pruebas unitarias. Este es un ejemplo de clase de prueba unitaria universal que recomiendo utilizar en cualquier solución IRIS BI:
Class dc.irisbi.unittests.TestBI Extends %UnitTest.TestCase
{
Method TestPivots()
{
Do $$$AssertStatusOK(##class(dev.bi).checkPivots(),"Test Pivots")
}
/// Test dashboards in BI package
Method TestDashboards()
{
Do $$$AssertStatusOK(##class(dev.bi).checkDashboards(),"Test Dashboards")
}
}
Y esta es la plantilla de proyecto que utiliza.
Espero que este artículo os resulte útil y os ahorre mucho tiempo!
¡Feliz desarrollo!
Anuncio
Esther Sanchez · 3 feb, 2023
¡Hola Comunidad!
Hemos grabado el webinar que hicimos ayer y lo hemos subido al canal de YouTube de la Comunidad de Desarrolladores en español. Si os perdisteis el webinar o lo queréis volver a ver con más detalle, ya está disponible la grabación!
⏯ Validación de perfiles FHIR con InterSystems IRIS for Health
Además de este webinar, en el canal de YouTube de la Comunidad podéis ver otros webinars sobre FHIR.
Por cierto, en las listas de reproducción que tenemos en el canal de YouTube hay una que recoge todos los webinars que hemos realizado (¡ya llevamos veintiuno!). Y hay otras listas para tutoriales, trucos y demos...
¡Echadle un ojo y dadle al play! ▶️
Artículo
Jose-Tomas Salvador · 29 jun, 2023
¡Hola Comunidad!
Me gustaría compartir con vosotros un ejercicio que he hecho para crear "mi propio" chat con ChatGPT en Telegram.
Ha sido posible gracias a dos componentes de Open Exchange: Telegram Adapter, de @Nikolay.Soloviev e IRIS Open-AI, de @Francisco.López1549
Así que con este ejemplo podréis configurar vuestro propio chat con ChatGPT en Telegram.
¡Veamos cómo hacerlo funcionar!
Prerrequisitos
Crear un bot usando una cuenta de @BotFather y obtener el Token del Bot. Después, añadir el bot en un chat o un canal de Telegram y darle permisos de administrador. Más información en: https://core.telegram.org/bots/api
Abrir (o crear si no tenéis) una cuenta en https://platform.openai.com/ y obtener vuestro Open AI API Key y Organization id.
Aseguraos de tener IPM instalado en vuestro InterSystems IRIS. Si no, lo podéis instalar con este comando de una sola línea:
USER> set r=##class(%Net.HttpRequest).%New(),r.Server="pm.community.intersystems.com",r.SSLConfiguration="ISC.FeatureTracker.SSL.Config" do r.Get("/packages/zpm/latest/installer"),$system.OBJ.LoadStream(r.HttpResponse.Data,"c")
O podéis utilizar una imagen de docker de la Community Edition con IPM ya precargado, como esta:
$ docker run --rm --name iris-demo -d -p 9092:52797 -e IRIS_USERNAME=demo -e IRIS_PASSWORD=demo intersystemsdc/iris-community:latest
$ docker exec -it iris-demo iris session iris -U USER
USER>
Instalación
Instalad el paquete IPM telegram-gpt en un namespace con interoperabilidad habilitada.
USER> zpm "install telegram-gpt"
Uso
Abrid la producción.
Poned vuestro Token del bot de Telegram tanto en el Servicio como en la Operación de Negocio de Telegram:
También, iniciad la operación St.OpenAi.BO.Api.Connect con vuestra ChatGPT API key y Organization id:
Iniciad la producción.
Haced cualquier pregunta en el chat de Telegram. Obtendréis una respuesta a través de Chat GPT. ¡Que lo disfrutéis!
Y en Visual Trace:
Detalles
Este ejemplo usa la versión 3.5 de ChatGPT, desarrollado por OpenAI. Se puede modificar cambiando el parámetro Model en la clase de transformación de datos.
Anuncio
Sergio Farago · 10 abr, 2025
Hola!
¿Os perdisteis el webinar de Jairo? ¡No pasa nada, podéis verlo en nuestro canal de YouTube o en la plataforma original donde se emitió.
Link YouTube: https://youtu.be/Tv5UpDAYxFQ?feature=shared
Link Plataforma: https://event.on24.com/wcc/r/4903467/717E138C41E142AEC2D1CB487D8FAA76
En este webinar veremos cómo capturar información de sensores hacia InterSystems IRIS. Gracias a esta recolección de datos se abren numerosas posibilidades que exploraremos de la mano de Jairo Ruiz, uno de nuestros expertos Sales Engineer de Colombia.
¡Disfrutadlo mucho!
Artículo
Alberto Fuentes · 11 jun, 2025
Si estáis migrando de Oracle a InterSystems IRIS, como muchos de mis clientes, podríais encontraros con patrones SQL específicos de Oracle que necesitan ser traducidos.
Tomad este ejemplo:
SELECT (TO_DATE('2023-05-12','YYYY-MM-DD') - LEVEL + 1) AS gap_date
FROM dual
CONNECT BY LEVEL <= (TO_DATE('2023-05-12','YYYY-MM-DD') - TO_DATE('2023-05-02','YYYY-MM-DD') + 1);
En Oracle:
LEVEL es una pseudocolumna usada en consultas jerárquicas (CONNECT BY). Comienza en 1 y se incrementa de 1 en 1.
CONNECT BY LEVEL <= (...) determina cuántas filas se van a generar.
La diferencia entre las dos fechas más uno da 11, así que la consulta produce 11 filas, contando hacia atrás desde el 12 de mayo de 2023 hasta el 2 de mayo de 2023.
Desglose del resultado:
LEVEL = 1 → 2023-05-12
LEVEL = 2 → 2023-05-11
...
LEVEL = 11 → 2023-05-02
Ahora la pregunta es: ¿Cómo conseguís esto en InterSystems IRIS, que no admite CONNECT BY?
Una solución es implementar una consulta al estilo SQL usando ObjectScript que imite este comportamiento. A continuación se muestra un ejemplo de definición CREATE QUERY que acepta una STARTDATE y un número de DAYS, y devuelve la lista descendente de fechas.
✅ InterSystems IRIS: Implementación de una consulta de intervalo de fechas
CREATE QUERY GET_GAP_DATE(IN STARTDATE DATE, IN DAYS INT)
RESULTS (GAP_DATE DATE)
PROCEDURE
LANGUAGE OBJECTSCRIPT
Execute(INOUT QHandle BINARY(255), IN STARTDATE DATE, IN DAYS INT)
{
SET QHandle("start") = STARTDATE
SET QHandle("days") = DAYS
SET QHandle("level") = 1
RETURN $$$OK
}
Fetch(INOUT QHandle BINARY(255), INOUT Row %List, INOUT AtEnd INT)
{
IF (QHandle("level") > QHandle("days")) {
SET Row = ""
SET AtEnd = 1
} ELSE {
SET Row = $ListBuild(QHandle("start") - QHandle("level") + 1)
SET QHandle("level") = QHandle("level") + 1
}
RETURN $$$OK
}
Close(INOUT QHandle BINARY(255))
{
KILL QHandle
QUIT $$$OK
}
Podéis ejecutar la instrucción CREATE QUERY anterior en el Portal de Gestión del Sistema de IRIS, o mediante una herramienta como DBeaver o un notebook de Python/Jupyter usando JDBC/ODBC.
🧪 Ejemplo de uso:
Para generar el mismo resultado que la consulta de Oracle anterior, usad:
SELECT * FROM GET_GAP_DATE(
TO_DATE('2023-05-12', 'YYYY-MM-DD'),
TO_DATE('2023-05-12', 'YYYY-MM-DD') - TO_DATE('2023-05-02', 'YYYY-MM-DD') + 1
);
Esto generará:
GAP_DATE
----------
2023-05-12
2023-05-11
...
2023-05-02
(11 rows)
🔁 Uso avanzado: Unir con otras tablas
También podéis usar esta consulta como subconsulta o en joins:
SELECT *
FROM GET_GAP_DATE(TO_DATE('2023-05-12', 'YYYY-MM-DD'), 11)
CROSS JOIN dual;
Esto os permite integrar rangos de fechas en flujos de trabajo SQL más amplios.
¡Espero que esto ayude a quien esté enfrentando escenarios de migración de Oracle a IRIS! Si habéis creado soluciones alternativas o tenéis mejoras, me encantaría conocer vuestras opiniones.