Limpiar filtro
Artículo
Mathew Lambert · 14 oct, 2020
Esto lo escribo más para ayudar a mi memoria que para otra cosa. Pensé en compartirlo, porque a menudo aparece en los comentarios, pero no está en la documentación de InterSystems.
Hay una utilidad increíble que se llama ^REDEBUG, que aumenta el nivel de información que se registra en mgr\cconsole.log.
Para activarla:
a) inicia el terminal/login
b) zn "%SYS"
c) do ^REDEBUG
d) cambia el nivel de registro a FFFFFFFF
Si estás en un sistema de producción (con mucho tráfico), sugiero que reproduzcas rápidamente el error, renombres el archivo cconsole.log y repitas los pasos anteriores para configurar el nivel de registro de log en FF. Esto es principalmente porque configurar el nivel de registro de log en FFFFFFFF hará que cconsole.log crezca de forma explosiva en un sistema con alto tráfico.
A veces las entradas en cconsole.log son crípticas - pero a veces pueden ser útiles.
Espero que os resulte útil.
P.D.: si tenéis ejemplos de errores de SSL crípticos y sus significados, por favor publcadlos como un comentario. Si conocéis su significado, sería genial. Si no lo conocéis, podemos pedir ayuda a la comunidad.
Comentarios
Yuri Marx Pereira Gomes · 11 ene, 2022
Para mí, los mejores momentos han sido:
1 - Global Masters, GANADOR de los premios Influitive BAMMIE 2021 en la categoría "Most Passionate Community"
2 - Los concursos de artículos técnicos
3 - Los concursos de programación
4 - Más de 10 000 miembros en la Comunidad de Desarrolladores
5 - El Directorio de Partners y los Servicios gratuitos para Partners
6 - Más de 500 aplicaciones en Open Exchange
7 - Las ponencias del "Virtual Summit"
8 - Los premios obtenidos por los puntos en Global Masters
9 - Los cursos de formación online gratuitos
10 - Los canales de la Comunidad en Discord
11 - Las innovaciones en IRIS
12 - Las comunidades en otros idiomas, como portugués y español
13 - El "Advent of Code" de InterSystems - el reto de programación durante el tiempo de Adviento
¿Y para vosotros?
Me decanto por los webbinar, sobretodo los que tenían quiz al final con grandes premios. Gracias por el comentario, Dani! Nos alegramos de que te gustaran los webinars con gynkana final! Intentaremos seguir haciéndolos durante 2022
Artículo
Muhammad Waseem · 9 jun, 2022

¡Hola a todos!
Solo quería compartir aquí una publicación rápida sobre mi proyecto para el Gran Premio :D
FHIR Patient Viewer es una herramienta de renderizado de una sola página, basada en Vue.js, que muestra de forma sencilla los datos devueltos de una llamada /Patient/{id}/$everything realizada a un servidor FHIR de InterSystems.
En el archivo Readme he incluido 3 cosas principales:
1. Una demostración en video que conecta FHIR Patient Viewer a un servidor sandbox IRIS FHIR (la forma más rápida de probarlo);
2. Un segundo video que muestra cómo usaría yo FHIR Patient Viewer en un entorno de producción (usando un backend personalizado para manejar las llamadas a la API, escrito en PHP/Laravel en mi ejemplo, pero transferible a otros lenguajes/frameworks);
3. Instrucciones para modificar los componentes, crear tu propia versión de la herramienta y crear tus propios archivos dist.
¡Gracias a todos! ¡Ha habido una calidad extraordinaria en los proyectos presentados al Gran Premio!
Anuncio
Esther Sanchez · 19 jul, 2022
¡Hola Comunidad!
Estamos encantados de anunciar los ganadores del último Concurso de Programación de InterSystems: Full Stack 2022
Muchas gracias a todos los que habéis participado en la competición.
Y los ganadores son...
Nominación de los expertos
🥇 1er premio y $4,000 a la app Kozo, de @Sean.Connelly
🥈 2º premio y $2,000 a la app iris-climate-change, de @Muhammad.Waseem
🥉 3er premio y $1,000 a la app Carbon Footprint Counter, de @Yuri.Gomes
Más ganadores:
🏅 $100 para la app interoperability-manager, de @Oliver.Wilms
🏅 $100 para la app Arctic sea ice viewer, de @Oleh.Dontsov
🏅 $100 para la app iris-for-money, de @Oliver.Wilms
Nominación de la Comunidad
🥇 1er premio y $1,000 a la app Kozo, de @Sean.Connelly
🥈 2º premio y $750 a la app iris-climate-change, de @Muhammad.Waseem
🥉 3er premio y $500 a la app Carbon Footprint Counter, de @Yuri.Gomes
¡Enhorabuena a todos los ganadores!
Nos vemos en el próximo concurso. 😎
Anuncio
Esther Sanchez · 19 ago, 2022
¡Hola a todos los miembros de la Comunidad!
Estamos muy orgullosos de anunciar que la Comunidad de Desarrolladores de InterSystems ha logrado tres nuevos récords:
📝 10 000 publicaciones
👥 11 000 usuarios registrados
👁 5 000 000 de visualizaciones (¡cinco millones!)
Nos gustaría daros las gracias a vosotros, usuarios, y también a todos los que están "detrás" de la Comunidad (administradores, gestores de contenido, moderadores...) por todos estos hitos. Estamos orgullosos de ser parte de este éxito, que es posible solo gracias a vosotros!
Gracias a todos por formar parte de este grupo. Por vuestras preguntas y vuestros comentarios. Por compartir vuestro conocimiento. Por vuestras sugerencias para hacer que la Comunidad sea aún mejor y más útil para todos. Vosotros sois los que mantenéis vivo este espacio y estamos encantados de que así lo hagáis. ❤️
Y para hacer que este momento sea aún mejor...
El canal de la Comunidad de Desarrolladores en Discord ha alcanzado los 500 miembros! 🎉 Aún nos queda mucho trabajo por hacer en este canal, pero trabajamos encantados. Y esperamos veros a todos por allí. Podéis uniros aquí >>
¡Muchas gracias a todos! ¡Sigamos creciento juntos!
Anuncio
Esther Sanchez · 27 ene, 2023
Hola a todos:
¡Muchas gracias por seguir con nosotros un año más en la Comunidad de Desarrolladores en español!
Todos los días nos esforzamos por hacer que sea mejor y más útil para todos los miembros que la componen.
Por ello, hemos preparado una breve encuesta para saber qué pensáis de la Comunidad en español, si os resulta útil y qué podríamos mejorar. Y entre todas las personas que respondan, ¡sortearemos dos polos de InterSystems!
👉🏼 Encuesta sobre la Comunidad de Desarrolladores en español (2022) 👈🏼Nota: Os llevará menos de 5 minutos responderla.
También podéis dejar vuestra opinión en los comentarios de esta publicación.
¡Estamos deseando leer vuestras respuestas!
¡Muchas gracias a todos! Ya hemos recibido varias respuestas a la encuesta sobre la Comunidad de Desarrolladores en español. ¡Pero nos gustaría recibir más! 😄 ¡Animaos a responder! No os llevará ni cinco minutos...
¡Muchas gracias! Tenéis hasta este viernes 17 para responder a la encuesta sobre la Comunidad de Desarrolladores en español. ¿La habéis respondido ya? No os llevará ni cinco minutos...
¡Muchas gracias!
Artículo
Luis Angel Pérez Ramos · 7 abr, 2025
Preguntas frecuentes de InterSystems
La configuración predeterminada para Stay Connected y Pool Size para los hosts de negocio (antiguamente, business service) que utilizan el adaptador TCP es la siguiente:
StayConnected = -1(no timeout)PoolSize = 1
Si un problema de red causa que se pierda la conexión con un host de negocio, el lado de la producción no podrá detectar esto y no aceptará nuevas conexiones. En esta situación, no se registrará ningún evento en el registro de eventos. Si StayConnected está configurado con su valor predeterminado (-1), las conexiones no se cerrarán por tiempo de espera, y será necesario reiniciar el host de negocios antes de que pueda aceptar nuevas conexiones. Recomendamos configurar StayConnected a un valor mayor o igual a 0 para evitar esta situación.
Por ejemplo, si lo configuráis a 300 (segundos), un host de negocios TCP podrá desconectarse y reconectarse automáticamente si no recibe nuevos mensajes durante 300 segundos o más.
Para sistemas con mucho tráfico, normalmente configuraríais el valor de StayConnected a un valor más pequeño, como 5 segundos.
Artículo
Ricardo Paiva · 4 jun, 2021
Durante las últimas semanas, el equipo de *Solution Architecture* (Soluciones de Arquitectura) ha estado trabajando para terminar la carga de trabajo de 2019: esto incluyó la creación del código abierto de la Demostración de Readmisiones que llevó a cabo HIMSS el año pasado, para poder ponerla a disposición de cualquiera que busque una forma interactiva de explorar las herramientas proporcionadas por IRIS.
Durante el proceso de creación del código abierto de la demostración, nos encontramos de inmediato con un error crítico. Los datos subyacentes de los pacientes que se utilizaron para crear la demo no podían utilizarse como parte de un proyecto de código abierto porque no eran propiedad de InterSystems, eran propiedad de nuestro socio Baystate Health.
Nuestro equipo estaba en un pequeño aprieto y tenía que encontrar una forma de sustituir los datos originales por datos sintéticos que pudieran utilizarse, pero manteniendo la "historia" de las demos, o su funcionalidad subyacente, consistente. Dado que la demo muestra cómo IRIS admite el *workflow* de *machine learning* de un científico de datos, había un nivel de complejidad añadido porque cualquier dato que utilizáramos tenía que ser lo suficientemente realista como para poder apoyar nuestro modelo de investigación. Después de una breve investigación, Synthea vino a nuestro rescate.
Synthea es un generador de pacientes sintéticos, que modela sus historiales médicos. Es de código abierto. Synthea proporciona datos de alta calidad, realistas, pero no reales, de pacientes; en una variedad de formatos (incluido FHIR), con diferentes niveles de complejidad, cubriendo todos los aspectos de la atención médica. Los datos obtenidos no tienen coste, ni privacidad ni restricciones de seguridad, lo que permite investigar con datos de salud que de otra manera no estarían disponibles, de forma legal o práctica.
Después de una investigación inicial, se eligió Synthea como la herramienta para solucionar nuestro problema de datos. Synthea es una herramienta increíble; sin embargo, un problema que encontramos fue que, para ejecutar el software y obtener los pacientes, teníamos que instalar varias dependencias en nuestros equipos.
* Java JDK 1.8
* Gradle Build Tool
Cuando trabajas por tu cuenta, esto generalmente no es un problema, pero como nuestro equipo está formado por varias personas, es importante que todos puedan actualizarse con un nuevo software rápidamente; y la instalación de dependencias puede ser una pesadilla. Tenemos el propósito de que el menor número de personas posible sufra durante los procesos de instalación al integrar un nuevo software en nuestro flujo de trabajo.
Como necesitábamos que cualquier persona de nuestro equipo pudiera realizar actualizaciones en la Demo de readmisiones para poder generar pacientes fácilmente, y no queríamos que todos tuvieran que instalar Gradle en sus equipos, nos apoyamos en Docker e introdujimos el software de Synthea dentro de una imagen de Docker, permitiendo que la imagen se ocupe de las dependencias ambientales subyacentes.
Esto terminó funcionando muy bien para nuestro equipo, ya que nos dimos cuenta de que ser capaz de generar datos de pacientes sintéticos sobre la marcha es probablemente un caso de uso muy común al que se enfrentan nuestros compañeros Ingenieros de ventas, por lo que nuestro equipo quería compartirlo con la Comunidad de Desarrolladores.
Cualquiera puede utilizar la siguiente línea de código para generar rápidamente 5 historiales médicos de pacientes sintéticos en formato FHIR, y dejar los pacientes resultantes en una carpeta de salida en el directorio donde está trabajando actualmente.
docker run --rm -v $PWD/output:/output --name synthea-docker intersystemsdc/irisdemo-base-synthea:version-1.3.4 -p 5
El código de esta imagen Docker tiene su propio repositorio en Github y se puede encontrar aquí para cualquier persona que quiera echar un vistazo, hacer cambios personalizados, o contribuir: https://github.com/intersystems-community/irisdemo-base-synthea
Ahora estamos realizando actualizaciones para que el proyecto sea compatible con módulos personalizados, de modo que cualquiera que desee agregar una enfermedad a sus pacientes generados pueda hacerlo, si Synthea no la proporciona de forma predeterminada, y se incorporará automáticamente a su imagen.
¿Dónde se usa actualmente?
El proceso actual de creación de la Demo de readmisiones utiliza la imagen irisdemo-base-synthea para generar 5 000 pacientes sintéticos sobre la marcha y cargarlos en nuestro repositorio de datos IRIS relacional, normalizado. Cualquier persona que esté interesada en verificar cómo analizar estos datos de pacientes generados de forma sintética (en formato FHIR), puede consultar la Demo de readmisiones creada recientemente con código abierto. La clase que hay que buscar es: IRISDemo.DataLake.Utils. a partir de la línea 613.
La Demo de readmisiones se puede encontrar aquí: https://github.com/intersystems-community/irisdemo-demo-readmission
Este artículo ha sido etiquetado como "Mejores prácticas" ("Best practices").
Los artículos con la etiqueta "Mejores prácticas" incluyen recomendaciones sobre cómo desarrollar, probar, implementar y administrar mejor las soluciones de InterSystems.
Artículo
Ricardo Paiva · 14 jul, 2022
A veces es necesario transferir o migrar datos y esquemas de datos de Postgres a IRIS. Actualmente hay varias opciones para hacerlo, pero las dos más populares son [DBeaver](https://openexchange.intersystems.com/package/DBeaver) y SQLGateway. Ésta última es descrita por Robert Cemper en este excelente artículo: [DB Migration using SQLgateway](https://es.community.intersystems.com/post/migración-de-base-de-datos-usando-sqlgateway) (Migración de base de datos usando SQLgateway).
Yo describiré en este artículo cómo realizar la migración utilizando DBeaver:
## Obtener los datos de muestra para realizar el proceso de migración
En GitHub es posible descargar un proyecto de Docker Compose para crear y ejecutar 2 bases de datos:
* **Base de datos de origen**: Instancia Docker para la base de datos PostgreSQL con una base de datos de muestra.
* **Base de datos objetivo**: Instancia Docker para InterSystems IRIS con un esquema preparado para recibir la base de datos de origen.
Sigue estos pasos para obtener el ejemplo y ejecutarlo:
1. Ve a https://github.com/yurimarx/migration-pg-iris y haz clic en *Download* para ir al repositorio de git.
2. Clona el proyecto: git clone https://github.com/yurimarx/migration-pg-iris.git.
3. Ve a la carpeta del proyecto migration-pg-iris.
4. Realiza la compilación: docker-compose build.
5. Ejecuta los contenedores: docker-compose up -d.
6. Consulta en tu escritorio Docker si las instancias están bien:
.png)
## Sobre los datos que se van a migrar
Los datos que se van a migrar se representan aquí:
.png)
Así que el proceso de migración de PostgreSQL a IRIS migrará:
* 08 tablas.
* 1 000 000 de filas de "sale".
* 250 000 filas de "users".
* 300 filas de "product".
* 500 filas de "store".
* 100 filas de "country".
* 30 filas de "city".
* 5 filas de "status_name".
El destino de la migración será el esquema dc_test que se encuentra dentro del *namespace* USER en la base de datos de InterSystems IRIS.
## Herramienta de código abierto para migrar de PostgreSQL a IRIS: DBeaver
DBeaver es una herramienta de gestión de base de datos para conectar, crear, seleccionar, actualizar y eliminar objetos de datos de las principales bases de datos del mercado. Descárgala en: [https://openexchange.intersystems.com/package/DBeaver]. Ahora, sigue las instrucciones de instalación para tener este magnífico producto en tu equipo.
DBeaver puede utilizarse para migrar datos entre conexiones de bases de datos, incluso si son de diferentes fabricantes y versiones.
## Conectar las bases de datos de origen y destino mediante DBeaver
Ahora vamos a establecer las conexiones de las bases de datos que se van a migrar.
**Para establecer la conexión de PostgreSQL con DBeaver:**
1. En DBeaver ve a File > New.
2. Selecciona Database Connection y haz clic en Next:
.png)
3. Selecciona la pestaña SQL > PostgreSQL y haz clic en Next:
.png)
4. Completa los campos de conexión de PostgreSQL como se muestra en esta imagen:
Host: localhost Port: 5438 Database: postgres Username: postgres Password: postgres Haga clic en Finish.
**Para establecer la conexión de InterSystems IRIS con DBeaver:**
1. En DBeaver ve a File > New.
2. Selecciona Database Connection y haz clic en Next:
.png)
3. Selecciona la pestaña SQL > InterSystems IRIS y haz clic en Next:
.png)
4. Si DBeaver solicita que se descargue el controlador de InterSystems IRIS, pulse Sí u Ok.
5. Completa los campos de conexión de InterSystems IRIS como se muestra en esta imagen:
Host: localhost
Database/Schema: user
Username: _SYSTEM
Password: SYS
Click Text Connection and Finish.
6. Las conexiones (postgres y user) están disponibles en Database Navigator:
.png)
## Realizar la migración
**Sigue estos pasos para realizar la migración:**
1. Expande la conexión de postgres > public y selecciona todas las tablas. Con las tablas seleccionadas, haz clic con el botón derecho del ratón y elige Export Data, como se ve en esta imagen:
.png)
2. Selecciona Database, como en esta imagen y haz clic en Next
.png)
3. Haz clic en el botón Choose:
.png)
4. Selecciona dc_test y haz clic en Ok.
.png)
5. Ahora será necesario cambiar algunas configuraciones de tipos de datos para la base de datos de destino, ya que IRIS y PostgreSQL utilizan diferentes tipos de datos para valores enteros y decimales.
6. Expande la tabla public.country, selecciona el primer campo (country_id) y haz clic en Columns…
.png)
7. Cambia el Target Type de int4 a integer y haz clic en Ok.
.png)
8. Repite el proceso con las tablas
a. public.product.b. public.status_name.c. public.users.d. public.city (cambia el tipo a integer para city_id y country_id).e. public.store (cambia el tipo a integer para store_id y city_id).f. public.sale (cambia el type a double para amount e integer para product_id, user_id y store_id)
.png)
g. public.order_status (cambia status_name_id a integer).
9. Ahora, con los Target Data Types cambiados, haz clic en Next.
.png)
10. Establece el Fetch size en 1000000 y haz clic en Next.
.png)
11. Acepta los valores predeterminados de Data load settings y haz clic en Next.
.png)
12. En Confirm haz clic en Proceed.
.png)
13. Ahora podrás ver en el Navegador de bases de datos todas las tablas PostgreSQL que se encuentran dentro del esquema de InterSystems IRIS dc_test.
.png)
El proceso de migración es muy sencillo en el caso de las tablas, pero en el caso de las vistas, funciones, triggers y procedimientos almacenados, será necesario reescribir el código fuente SQL utilizando ObjectScript o SQL.
¿Qué se obtiene al migrar a IRIS?
Esta lista resume lo que se obtiene en IRIS:
* Gestión de API.
* Informes visuales (IRIS Reports).
* AutoML (IntegratedML).
* Desarrollo de aplicación/datos multilenguaje (Python, Java, .NET, JavaScript).
* ESB.
* Inteligencia empresarial (BI)/Analíticas.
* PLN.
* Desarrollo de microservicios.
* Base de datos multimodelo (SQL, JSON, cubos analíticos, orientada a objetos).
* Sharding.
En resumen, al migrar a IRIS se obtiene una plataforma de datos, cuando antes solo se tiene una base de datos.
[https://openexchange.intersystems.com/package/DBeaver]: https://openexchange.intersystems.com/package/DBeaver
Artículo
Jose-Tomas Salvador · 6 oct, 2022
Python se ha convertido en el lenguaje de programación más utilizado del mundo (fuente: https://www.tiobe.com/tiobe-index/) y SQL sigue siendo el líder como lenguaje para las bases de datos. ¿No sería genial que Python y SQL trabajaran juntos para ofrecer nuevas funcionalidades que SQL por sí mismo no puede? Después de todo, Python tiene más de 380.000 librerías publicadas (fuente: https://pypi.org/) con funciones muy interesantes para ampliar las consultas SQL dentro de Python.
En este artículo detallo cómo crear nuevos Procedimientos Almacenados de SQL en la base de datos de InterSystems IRIS usando Embedded Python.
## Librerías de Python utilizadas como muestras
En este artículo utilizaré dos librerías muy útiles para cualquiera que trabaje con SQL en IRIS: Geopy y Chronyk.
**Geopy** es una librería utilizada para aplicar la geocodificación (asignación de coordenadas geográficas a direcciones) a los datos de direcciones. Con ella es posible, a partir del nombre de la calle, obtener el código postal y la dirección completa, en el formato de la oficina de correos. Es muy útil, ya que muchos registros tienen una dirección.
**Chronyk** se utiliza para procesar fechas y horas mediante el lenguaje humano. Esto es muy útil, porque internamente, tanto para IRIS como para Python, una fecha es un número que representa la cantidad de tiempo que ha transcurrido desde una fecha inicial. Para los humanos, una fecha es el 20 de julio, o ayer, o mañana, o hace dos horas. Chronyk acepta recibir la fecha así y luego la convierte al formato de fecha universal.
## Soporte de Python en InterSystems IRIS
Desde la versión 2021.2 es posible utilizar Python para crear métodos de clase, procedimientos almacenados, producciones de interoperabilidad y llamadas nativas entre Python e IRIS (ObjectScript) de forma bidireccional. No conozco ninguna otra plataforma de datos que trabaje tan estrechamente con Python. El requisito para que esto funcione es que Python se instale en la misma máquina física o virtual o contenedor que IRIS. Consulta más detalles en: https://docs.intersystems.com/iris20221/csp/docbook/DocBook.UI.Page.cls?KEY=AFL_epython.
Para instalar Python ejecuta:
# install libraries required for python and pip
RUN apt-get -y update \
&& apt-get -y install apt-utils \
&& apt-get install -y build-essential unzip pkg-config wget \
&& apt-get install -y python3-pip
## Soporte de librerías de Python en InterSystems IRIS
Para que InterSystems IRIS pueda utilizar una librería de Python es obligatorio que esté instalada dentro de <installdir>/mgr/python. installdir es la carpeta en la que está instalado IRIS. Para instalar nuevos paquetes ejecuta:
# use pip3 (the python zpm) to install geopy and chronyk packages
RUN pip3 install --upgrade pip setuptools wheel
RUN pip3 install --target /usr/irissys/mgr/python geopy chronyk
Pip3 es el administrador e instalador de paquetes más popular de Python, Pip.
## Cómo crear Procedimientos Almacenados en lenguaje de Python
Una de las posibilidades de utilizar Python en InterSystems IRIS es crear Procedimientos Almacenados usando Python.
Hay dos posibilidades:
1. Crear un Procedimiento Almacenado en Python utilizando la sentencia SQL de crear función o procedimiento
2. Crear un Método de clase dentro de la clase ObjectScript con las etiquetas sqlProc y language=Python.
### Cómo crear un Procedimiento Almacenado en Python utilizando la sentencia SQL de Crear Procedimiento
Según la documentación de InterSystems, también se puede escribir una función SQL o un Procedimiento Almacenado utilizando Python Embebido si se especifica el argumento LANGUAGE PYTHON en la sentencia CREATE, como se muestra a continuación (fuente: https://docs.intersystems.com/iris20221/csp/docbook/DocBook.UI.Page.cls?KEY=AEPYTHON#AEPYTHON\_runpython\_sql):
CREATE FUNCTION tzconvert(dt TIMESTAMP, tzfrom VARCHAR, tzto VARCHAR)
RETURNS TIMESTAMP
LANGUAGE PYTHON
{
from datetime import datetime
from dateutil import parser, tz
d = parser.parse(dt)
if (tzfrom is not None):
tzf = tz.gettz(tzfrom)
d = d.replace(tzinfo = tzf)
return d.astimezone(tz.gettz(tzto)).strftime("%Y-%m-%d %H:%M:%S")
}
Cuando se ejecuta esta nueva función SQL:
SELECT tzconvert(now(), 'US/Eastern', 'UTC')
La función devuelve algo como:
2022-07-20 15:10:05
### Cómo crear el Método de clase dentro de la clase ObjectScript con las etiquetas sqlProc y language=Python
Confieso que este enfoque es mi favorito: crear un método de clase con las etiquetas sqlProc y language=Python.
En mi opinión es más fácil de mantener, está mejor documentado y con una mejor administración de las versiones del código fuente. Para este enfoque he publicado una aplicación de muestra: https://openexchange.intersystems.com/package/Python-IRIS-SQL-Procedures-Sample. La utilizaré para mostrar este segundo enfoque con detalle.
## Instalación de la aplicación de muestra
Para instalar la aplicación de muestra, sigue estos pasos:
1. Clonar/git pull el repositorio en cualquier directorio local: ``$ git clone https://github.com/yurimarx/iris-sql-python-sample.git``
2. Abrir un terminal de Docker en este directorio y ejecutar: ``$ docker-compose build``
3. Ejecutar el contenedor de IRIS: ``$ docker-compose up -d``
Otra posibilidad para instalar es utilizar el ZPM:
zpm "install iris-sql-python-sample"
## Ejemplos de Procedimientos Almacenamiento usando Python
El primer ejemplo es un Procedimiento Almacenado para administrar la geocodificación de direcciones, consulta el código fuente:
ClassMethod GetFullAddress(Street As %String, City As %String, State As %String)
As %String [ Language = python, SqlName = GetFullAddress, SqlProc ]
{
import geopy.geocoders
from geopy.geocoders import Nominatim
geopy.geocoders.options.default_timeout = 7
geolocator = Nominatim(user_agent="intersystems_iris")
location = geolocator.geocode(Street + ", " + City + ", " + State, country_codes="US")
return location.address
}
Fíjate que se declaró un Método de clase (dentro de la clase dc.pythonsql.Company) con las etiquetas [ Language = python, SqlProc]. La etiqueta SqlName permite establecer un nombre para el nuevo Procedimiento Almacenado en sentencias SQL. Ve al Portal de administración, Sistema > SQL y ejecuta el siguiente código:
SELECT ID, City, Name, State, Street, Zip, dc_pythonsql.GetFullAddress(Street, City, State) As FullAddress
FROM dc_pythonsql.Company
Verás estos resultados:

Ahora las direcciones incompletas regresan como direcciones "completas" (completas y calificadas).
_Nota: Si no devuelve nada, ejecuta ``#class(dc.pythonsql.Company).CreateFiveCompanies()``. Creará cinco empresas para utilizar en las pruebas._
Este paquete puede funcionar con los principales servicios de geocodificación abiertos y comerciales. En este ejemplo utilizamos el servicio abierto **Nominatim**, pero es posible utilizar Bing, Google, ArcGIS y otros. Consulta las posibilidades en https://geopy.readthedocs.io/en/stable/#module-geopy.geocoders.
El segundo ejemplo es un paquete de fecha y hora en formato humanizado, Chronyk. Permite enviar frases como "mañana", "ayer", "dentro de 4 horas", "4 de julio del 2022" y obtener el resultado en formato de fecha universal. Mira la creación del Procedimiento Almacenado:
ClassMethod GetHumanDate(Sentence As %String) As %String [ Language = python, SqlName = GetHumanDate, SqlProc ]
{
from chronyk import Chronyk
t = Chronyk(Sentence)
return t.ctime()
}
Realiza la siguiente llamada en el Portal de administración > Sistema > SQL:
SELECT ID, City, Name, State, Street, Zip, dc_pythonsql.GetHumanDate('yesterday') As Datetime FROM dc_pythonsql.Company
Verás resultados como este:
Si quieres simplemente llamar al Procedimiento Almacenado, puedes usar esta sentencia SQL:
select dc_pythonsql.GetHumanDate('yesterday') as Datetime
Esta librería tiene varias posibilidades de fechas y horas humanizadas, consulta https://github.com/KoffeinFlummi/Chronyk.
Así que es fácil crear Procedimientos Almacenados en Python. ¡Disfrútalo! Este artículo ha sido etiquetado como "Mejores prácticas" ("Best practices").
Los artículos con la etiqueta "Mejores prácticas" incluyen recomendaciones sobre cómo desarrollar, probar, implementar y administrar mejor las soluciones de InterSystems.
Artículo
Mathew Lambert · 24 jul, 2020
¡Hola desarrolladores!
Estoy seguro de que la mayoría de vosotros ya conoceis la posibilidad de usar GZIP en los productos de InterSystems. Pero el problema es que GZIP trabaja con un único archivo o flujo de datos, y no admite carpetas. Al trabajar con sistemas Unix, es posible solucionarlo con la herramienta de compresión tar, incluida en cada sistema Linux de forma predeterminada. Pero ¿qué hacer si debemos trabajar también en Windows, que no lo incluye?
Me alegra poder enseñaros el nuevo proyecto, isc-tar, que os ayudará a no preocuparos del sistema operativo y os permitirá gestionar los archivos tar en cualquier sitio.
Instalación
Ve a la página releases (versiones), descarga la última versión de zUtils.FileBinaryTar.xml.
Importa y compila de tu forma preferida en cualquier namespace.
%SYS>Do $system.OBJ.Load("zUtils.FileBinaryTar.xml", "c")
Ahora estará disponible desde cualquier sitio por el nombre de clase %zUtils.FileBinaryTar
Requirimientos y limitaciones
Ha sido probado en InterSystems IRIS Community Edition 2019.1, pero debería funcionar en casi cualquier otra versión. La excepción es la clase %Stream.FileBinaryGzip, que antes se encargaba de los gzip, y apareció en 2015.1.
En este momento, la herramienta no se preocupa de los permisos guardados en el tar, únicamente de la estructura de carpetas y el contenido de los archivos
Uso
Puedes comprimir cualquier carpeta o un solo archivo, cuando no se requiere el nombre del archivo, aún devuelve el stream comprimido.
Set gzip = 1
Set archive = ##class(%zUtils.FileBinaryTar).Compact("/tmp/some/place", gzip, "/tmp/some.tgz")
Puedes extraer el archivo a alguna estructura temporal extendida desde %ArrayOfDatatypes y así podrás encontrar cualquier archivo si conoces el nombre exacto
Set gzip = 1
Set extracted = ##class(%zUtils.FileBinaryTar).ExtractFile("/tmp/some.tgz", gzip)
Set tSC = extracted.FindPath("folder/subfolder/test.txt", .file)
Set fileContent = file.fileData
While 'fileContent.AtEnd {
/// read file from archive
}
Puedes guardar lo extraído en una carpeta
Set tSC = extracted.ExtractTo("/tmp/some/place")
O extraer únicamente un stream
Set extracted = ##class(%zUtils.FileBinaryTar).ExtractStream(stream)
Nota: el segundo parámetro gzip está activado de forma predeterminada.
Cualquier notificación de problema o "pull-request" siempre es bienvenida en el repositorio.
Anuncio
Esther Sanchez · 1 abr, 2022
¡Hola desarrolladores!
Hemos hecho algunos cambios en los sitios web de las Comunidades de Desarrolladores de InterSystems:
Nueva función de búsqueda
Estadísticas generales de la Comunidad
Conexión con el perfil de Facebook
Cambios en las páginas de las publicaciones: etiquetas, información del autor, resaltado del borrador
Vamos a explicar en detalle cada uno de ellos.
Búsqueda en la Comunidad
Hemos implementado un nuevo motor de búsqueda en los sitios web de la Comunidad. Ahora hay dos opciones de búsqueda:
Búsqueda rápida
Búsqueda avanzada
Con la Búsqueda rápida, se puede encontrar fácilmente una publicación/etiqueta/persona e ir directamente a esa página.
Escribe lo que quieras buscar y aparecerá un listado con varias opciones propuestas. ¿No encuentras nada que encaje con lo que buscas?
Prueba a usar la Búsqueda Avanzada haciendo clic en el botón con la lupa 🔍:
Te llevará a una página en la que puedes añadir fácilmente otros parámetros a tu búsqudeda:
buscar las publicaciones de una persona en concreto
buscar por publicaciones que incluyan una etiqueta específica
buscar por tipo de publicación (preguntas, anuncios, artículos, debates)
buscar solo tus publicaciones
También se pueden ordenar los resultados por relevancia, por cercanía en el tiempo o durante un tiempo determinado (últimos 7/30/365 días):
Estadísticas generales de la Comunidad
Ahora se pueden ver los datos de la Comunidad de Desarrolladores de InterSystems en su conjunto:
Conexión con el perfil de Facebook
Se puede añadir el enlace a un perfil de Facebook en tu perfil de la Comunidad.
Haz clic en tu foto de perfil arriba a la derecha y después en "Mi cuenta". Ve a la opción "Editar" en la columna de opciones a la izquierda y en el apartado "Información adicional" podrás añadir tu enlace a Facebook en "Facebook profile". No te olvides de hacer clic en "Guardar" al final de la página :D
Cambios en las páginas de publicaciones: etiquetas, información del autor, resaltado del borrador
Lo habéis pedido... ¡y lo hemos hecho! Ahora las Etiquetas de las publicaciones aparecen en la publicación, debajo del título.
También en la página de cada publicación se puede ver toda la información de contacto del autor, en el bloque a la derecha:
Los borradores de las publicaciones ahora aparecen resaltados en azul:
¡Esperamos que os resulten útiles estos cambios!
Podéis solicitar mejoras o reportar errores en el GitHub de la Comunidad. O en los comentarios de esta publicación, claro.
¡Muchas gracias!
Artículo
Pierre-Yves Duquesnoy · 16 jun, 2020
Introducción
InterSystems IRIS 2020.1 incluye PEX (Production EXtension Framework), para facilitar el desarrollo de producciones de Interoperabilidad de IRIS con componentes escritos en Java o .NET.
Gracias a PEX, un desarrollador de integraciones con conocimientos Java o .NET puede beneficiarse de la potencia, escalabilidad y robustez del framework de Interoperabilidad de InterSystems IRIS, y ser productivo en muy poco tiempo.
Para un experto en el framework de Interoperabilidad IRIS, PEX aporta facilidad para enriquecer las integraciones con componentes externos pre-existentes en lenguajes Java o .NET.
Este tutorial propone explorar PEX y guiar el desarrollador .NET en sus primeros pasos con PEX. El código esta disponible en https://github.com/es-comunidad-intersystems/webinar-PE
El tutorial complementa la documentación de PEX disponible en linea en https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=EPEX
Arquitectura de Interoperabilidad InterSystems IRIS
PEX permite escoger el lenguaje de programación (actualmente Java o .NET, más adelante también python) para implementar cualquier de los distintos componentes (Business Service, Business Process, Business Operation, InboundAdapter, OutboundAdapter, Mensajes) que forman una producción de Interoperabilidad de IRIS.
Los 3 componentes principales de interoperabilidad de IRIS son:
Business Services: Componentes que ofrecen un servicio que se puede invocar desde fuera. Ejemplo de Business Services son un Servicio REST, un servicio SOAP Web Service, pero también un Service que lee y procesa los nuevos ficheros que han sido escritos en un directorio, un servicio que lee y procesa filas de una tabla de BBDD, un servicio que lee ficheros por FTP, etc. El Business Service puede tener un Inbound Adapter asociado, que se encarga de los detalles de implementación de un protocolo especifico (SQLInboundAdapter para leer tablas SQL, FileInboundAdapter para leer ficheros, etc. El Business Service se encarga de procesar la información, copiarla a un mensaje de Interoperabilidad de IRIS, y enviar el mensaje a un Business Process o Business Operations y posiblemente esperar una respuesta si hay.
Business Operation: Componente que recibiendo un mensaje de interoperabilidad de IRIS, actúa sobre un sistema externo, posiblemente con la ayuda de un OutboundAdapter que se encarga de los detalles de implementación de protocolos (TCP, REST, SOAP,Ficheros, SQL, etc). El Business Operation puede o no devolver una respuesta a quien le haya llamado.
Business Process: proceso de orquestación, que, recibiendo un mensaje de Interoperabilidad de IRIS, puede hacer procesamientos y llamadas a uno o varios otros business processes o business operations para realizar operaciones complejas y/o devolver un mensaje con información agregada al Business Service que le he enviado el mensaje.
Toda la configuración de los componentes se agrupa en una "Producción"; la producción es una clase de InterSystems IRIS que contiene la definición de todas las integraciones que se arrancan juntas al iniciar IRIS, y la configuración de cada componente de estas integraciones. Se puede editar como una clase de IRIS, o modificar desde el portal de gestión.
Arquitectura de PEX
Para ejecutar el código .NET o Java, InterSystems IRIS usa el Object Gateway correspondiente. Este Gateway se puede instanciar localmente o en un servidor remoto.
Los Java y .Net Gateways
El Gateway es un componente nativo de .NET o Java, que escucha en un puerto TCP/IP concreto y recibe peticiones desde el proceso IRIS, las ejecuta y devuelve los resultados.
Los Componentes PEX pre-construidos
Para usar PEX en una producción de IRIS, es necesario añadir a la Producción un componente pre-construido para cada componente desarrollado en Java o .NET. El componente pre-construido sirve de envoltorio (wrapper) al elemento externo que referencia, y permite definir sus propiedades y configuración dentro de la producción.
Los componentes Java o .NET que se ejecutan desde el Gateway correspondiente deben heredar (ser subclase) de un componente de PEX pre-existente. A continuación se ofrece una recopilación de estos elementos:
Componentes de IRIS
Para .NET y para Java
Función
Clase
Comentario
Business Service
EnsLib.PEX.BusinessService
Adaptador configurado: Ens.InboundAdapter
Business Process
EnsLib.PEX.BusinessProcess.
Business Operation
EnsLib.PEX.BusinessOperation
Inbound Adapter
EnsLib.PEX.InboundAdapter
Outbound Adapter
EnsLib.PEX.OutboundAdapter
PEX Message
EnsLib.PEX.Message
Mensaje para enviar a un componente PEX
IRIS Message
Se Mapea al Mensaje IRIS
Mensaje de componente PEX a componente IRIS
Componentes Java o .NET
Estos componentes están disponibles en librerías que hay que añadir al proyecto java o .NET. La librería mínima a referenciar en un proyecto PEX es la del Gateway. Adicionalmente, si se quiere usar mensajes IRISObject para llamar a componentes IRIS desde PEX, es necesario referenciar la librería IRISClient:
Lenguaje
Librerías
.NET
<installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.Gateway64.exe
<installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.IRISClient.dll
Java
<installdir>\dev\java\lib\JDK18\intersystems-gateway-3.1.0.jar
<installdir>\dev\java\lib\JDK18\intersystems-jdbc-3.1.0.jar
<installdir>\dev\java\lib\gson\gson-2.8.5.jar
SuperClase a usar para componentes .NET
Función
Clase .NET
Business Service
InterSystems.EnsLib.PEX.BusinessService
Business Process
InterSystems.EnsLib.PEX.BusinessProcess
Business Operation
InterSystems.EnsLib.PEX.BusinessOperation
Inbound Adapter
InterSystems.EnsLib.PEX.InboundAdapter
Outbound Adapter
InterSystems.EnsLib.PEX.OutboundAdapter
Mensaje PEX
InterSystems.EnsLib.PEX.Message
Mensaje IRIS
InterSystems.Data.IRISClient.ADO.IRISObject
Superclase a usar para componentes en Java
Función
Clase Java
Business Service
com.intersystems.enslib.BusinessService
Business Process
com.intersystems.enslib.BusinessProcess
Business Operation
com.intersystems.enslib.BusinessOperation.
Inbound Adapter
com.intersystems.enslib.pex.InboundAdapter
Outbound Adapter
com.intersystems.enslib.pex.OutboundAdapter
Mensaje PEX
com.intersystems.enslib.pex.Message
Mensaje IRIS
<...>.IRISObject
Funciones de Utilidades
En los componentes implementados en ObjectScript, InterSystems IRIS ofrece unos comandos en forma de MACRO para añadir información al log de Eventos de IRIS. Estos métodos están disponibles en JAVA y .NET en la forma siguiente:
Método
Descripción
LOGINFO(mensaje)
Añadir mensaje al Log de Eventos con estado "info"
LOGALERT(mensaje)
Añadir mensaje al Log de Eventos con estado "alert"
LOGWARNING(mensaje)
Añadir mensaje al Log de Eventos con estado "warning"
LOGERROR(mensaje)
Añadir mensaje al Log de Eventos con estado "error"
LOGASSERT(mensaje)
Añadir mensaje al log de Eventos con estado "assert"
Interoperabilidad entre componentes nativos y componentes PEX
Es posible combinar componentes en lenguaje nativo ObjectScript de InterSystems IRIS con componentes PEX desarrollados en Java o .NET.
Cuando los 2 componentes son de tipo BusinessService - InboundAdapter o BusinessOperation - OutboundAdapter el desarrollador puede escoger el tipo de datos/tipo de objeto a usar en las llamadas: La llamadas se realizan entre IRIS y el Java/.NET gateway siguiendo las reglas de conversión de tipos de datos que determina el Gateway.
Cuando los 2 componentes que intercambian información son Business Hosts (BS,BP, BO), el componente que debe recibir el mensaje (de petición o de respuesta) impone el tipo de objetos a usar para el mensaje:
Un Componente PEX siempre recibe un mensaje EnsLib.PEX.Message
Un Componente IRIS recibe un mensaje IRISObject
EnsLib.PEX.Message
El EnsLib.PEX.Message permite una representación en IRIS ObjectScript de un mensaje cuya estructura has sido definida en .NET o en Java. IRIS usa la funcionalidad de DynamicObject para manipular las propiedades. Internamente, IRIS usa JSON como medio de transporte entre IRIS y .NET/Java. Al crear un mensaje PEX en IRIS, es necesario informar en %classname el nombre de la clase de NET/Java que se debe instanciar para usar el mensaje.
IRISObject
Para poder llamar a un componente pre-construido de InterSystems IRIS desde un componente PEX, es necesario definir un mensaje que sea de tipo IRISObject (en .NET la clase completa es InterSystems.Data.IRISClient.ADO.IRISObject).
Primeros Pasos con PEX y .NET
En estos primeros pasos se procede a:
crear un proyecto .NET con las librerias PEX necesarias, de la version 4.5 de .NET framework
Añadir un BusinessOperation y un mensaje Simple al proyecto .NET
Configurar el .NET Gateway de Intersystems IRIS
Crear una Producción de Interoperabilidad
Añadir un BO preconstruido
Creación de un Proyecto .NET con Visual Studio 2019
En Visual Studio, se crea un nuevo proyecto de tipo "Class Library .Net Standard in C#". Se escoge el nombre "PEX.Webinar.FirstDemo":
Para poder trabajar con PEX, se añaden las dependencias necesarias, desde el "Solution Explorer", menú contextual "Add Reference":
y con el botón "Browse", se añaden las 2 librerías (compatibles con .NET Framework 4.5!) ubicadas en un subdirectorio de la instalación de InterSystems IRIS:
<installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.Gateway64.exe
<installdir>\dev\dotnet\bin\v4.5\InterSystems.Data.IRISClient.dll
A continuación, se renombra desde el solution Explorer Class1.cs para llamarlo "FirstOperation.cs", y se modifica la clase para que herede de la clase PEX de BusinessOperation (InterSystems.EnsLib.PEX.BusinessOperation). Se sobrescriben los 3 métodos de PEX.BusinessOperation:
Metodo
Descripción
OnInit
Se ejecuta 1 vez cuando se arranca este componente en la producción. Permite inicializar librerías, conexiones, variables...
OnTearDown
Se ejecuta 1 vez cuando se para este componente o la producción. Permite liberar recursos que se hayan usado en el ciclo de vida del componente
OnMessage
Se ejecuta para cada Mensaje recibido. Permite tratar el mensaje y devolver respuesta
De momento, no se ha definido ningún mensaje, y ninguna tarea que realizar. Por lo cual, se añade simplemente funciones LOGINFO en los 3 métodos. Por otra parte, no hace falta llamar al método de la superclase , por lo cual se puede eliminar las llamadas a la clase base (base.OnInit(), base.OnTearDown(), base.OnMessage). Dejamos la implementación como sigue:
Metodo
Implementación Inicial
OnInit
OnInit
public override void OnInit()
{
LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnInit()");
}
OnTearDown
OnTearDown
public override void OnTearDown()
{
LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnTearDown()");
}
OnMessage
OnMessage
public override object OnMessage(object request)
{
LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnMessage()");
return request;
}
Con esto, se puede compilar esta versión Inicial del proyecto .NET, con el Menú "Build Solution". Esto genera el fichero siguiente, que se utiliza a continuación desde IRIS:
1>------ Build started: Project: PEX.Webinar.FirstDemo, Configuration: Debug Any CPU ------1>PEX.Webinar.FirstDemo -> C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\netstandard2.0\PEX.Webinar.FirstDemo.dll========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Creación de una Producción de Interoperabilidad InterSystems IRIS
Ahora, desde el Portal de Gestión de IRIS, se puede escoger el menú "Interoperability", el namespace "Ensemble", y los menus "Configure", "Production". La pestaña "Actions", y el botón "New" permiten definir una nueva producción de Integración de IRIS.
Para activar el Servicio de Pruebas, se selecciona la pestaña "Settings" y en el último apartado de la lista ("Development and Debugging") se habilita "Testing Enabled" y se hace click sobre el botón Apply:
Añadir el NET Gateway a la Producción
Para poder trabajar con PEX, se debe arrancar el Gateway de Java o .NET correspondiente. InterSystems recomienda configurar y arrancar estos gateway desde el menú "System Administration / Configuration / Connectivity / Object Gateways" par entornos de producción (live). Para este entorno de desarrollo, se puede añadir directamente un componente a la producción para arrancar el Gateway. Esto permite arrancar y parar el gateway al mismo tiempo que la producción en un solo click, y así liberar el acceso a la .DLL de proyecto de .NET cuando se quiere re- compilarla (Visual Studio no la puede recompilar si el .NET gateway está arrancado).
Para añadir el componente ".Net Gateway", se añade un Business Service a la producción con el botón "+" al lado de "Services". El nombre de clase del componente (Service Class) a añadir es "EnsLib.DotNetGateway.Service", y se selecciona "Enable now" para habilitar el componente.
Se editan los parámetros de configuración del componente añadido, haciendo click sobre este, y rellenando a continuación los valores en la pestaña "Settings", seleccionado finalmente el botón "Apply":
Parametro
Valor
Descripción
Port
44444
Se puede cambiar al puerto si el puerto 55000 por defecto ya esta ocupado por otro proceso
FilePath
<installdir>\dev\dotnet\bin\v4.5\
Indica la ubicación donde encontrar el ejecutable del Gateway (InterSystems.Data.Gateway64.exe)
<InstallDir> es el directorio de instalación de IRIS: Por ejemplo:
C:\InterSystems\IRIS20201\dev\dotnet\bin\v4.5\
Exec64
true
Seleccionar la version 64Bits del gateway
.NET Version
4.5
La versión de .Net debe ser 4.5
Añadir el Business Operation creado en .NET
Se añade ahora un Business Operation de PEX para referenciar el código .NET creado anteriormente, con el botón "+" al lado de "Operations". El tipo de clase es "EnsLib.PEX.BusinessOperation", se nombra el componente (opcional) "PEX.Webinar.FirstOperation", se habilita con "Enable Now".
A continuación, se configura el componente (haciendo click sobre el componente añadido) y seleccionando la pestaña "Settings" a la derecha:
Parámetro
Valor
Descripción
Remote Classname
PEX.Webinar.FirstDemo.FirstOperation
El Nombre de la clase .NET generada
Gateway Port
44444
El puerto TCP en el cual esta configurado el .NET Gateway
Gateway Extra CLASSPATH
C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\
netstandard2.0\PEX.Webinar.FirstDemo.dll
Ubicación de las .DLL a incluir. Es la ubicación donde la compilación de Visual Studio ha generado la DLL
Para aplicar los cambio, se hace click sobre el botón "Apply":
Arrancar la Producción y Probar
El botón "Start" permite arrancar la producción y todos sus componentes:
InterSystems IRIS permite probar de manera simple y aislada un componente. Se hace click para seleccionar el "Business Operation" llamado "PEX.Webinar.FirstOperation", y se selecciona el botón "Test" de la pestaña Actions:
En la pantalla siguiente, se rellenan los datos como sigue:
Parámetro
Valor
Descripción
Request Type
EnsLib.PEX.Message
El tipo de mensaje de IRIS que se envía. Siempre es un EnsLib.PEX.Message. Permite añadir propiedades dinámicas para traspasar valores al componente PEX Java o .NET
%classname
InterSystems.EnsLib.PEX.Message
Es el Nombre de la clase del mensaje definido en Java o .NET como petición (request) del componente. Para .NET tiene que ser InterSystems.EnsLib.PEX.Message o una subclase
Cuando se hace click en "Invoke Testing Service", el framework de Interoperabilidad de IRIS envía el mensaje al componente y el código .NET se ejecuta.
Haciendo click sobre el "Visual Trace", se pueden ver los detalles. El punto blanco numerado "3" muestra la traza "LOGINFO" implementada en .NET.
El Log de Eventos de IRIS contiene un recopilatorio de todos los mensajes LOGINFO() generados, incluidos en OnInit() y OnTearDown().
Siguientes Pasos con PEX: Completando la producción
A continuación se crean componentes de otros tipos en .NET:
Mensajes .NET
Business Services .NET
Business Process .NET
Creación y uso de un mensaje PEX con datos
Para pasar información desde Ensemble a componentes PEX, se define una clase en .NET como subclase de InterSystems.EnsLib.PEX.Message, con las propiedades para la información que se quiere pasar. Siguiendo con un ejemplo simplificado, añadimos una propiedad "value" de tipo string al mensaje. El Business Operation PEX devolverá el mismo tipo de mensaje, con el contenido transformado a majusculas.
Clase de mensaje en .NET
Se añade un nuevo fichero "FirstMessage.cs" as proyecto .NET, con la siguiente definición:
FirstMessage
using System;
using System.Collections.Generic;
using System.Text;
namespace PEX.Webinar.FirstDemo
{
class FirstMessage : InterSystems.EnsLib.PEX.Message
{
public string value;
}
}
Uso del mensaje desde .NET
En el Business Operation FirstOperation, el tipo de Datos de OnMessage está definido como Object. Se tiene que hacer el cast a la clase "FirstMesssage" para usarlo:
OnMessageV2
public override object OnMessage(object request)
{
LOGINFO("PEX.Webinar.FirstDemo.FirstOperation:OnMessage()");
///se Instancia el mensaje de respuesta
FirstMessage response = new FirstMessage();
//Se copia el value en "uppercase" de la peticion
response.value = ((FirstMessage)request).value.ToUpper();
//Se devuelve la respuesta
return response;
}
Es necesario parar la producción de IRIS (con el botón "Stop"), o como mínimo deshabilitar el .NET Gateway (doble-click sobre el componente), y recompilar el proyecto .NET
Uso de la clase desde InterSystems IRIS
El botón "Test" (Testing Service) no permite rellenar las propiedades dinámicas de la clase EnsLib.PEX.Message. Sin embargo, se puede usar el Testing Service con un mensaje de tipo "Ens.StringRequest" nativo de IRIS, y transformar (Con una Transformación de Datos) este mensaje en un mensaje PEX desde una transformaciçon de datos. La transformación se invocar desde un Business Process de tipo Enrutador ya pre-construido.
Transformación de Datos
Se crea una Transformación de Datos para copiar los datos del mensaje nativo ensemble:
source
target
Comentario
Clase
EnsLib.StringRequest
EnsLib.PEX.Message
Las clases de origen y de destino de la transformación
%classname
n/a
PEX.Webinar.FirstDemo.FirstMessage
Para un mensaje PEX (target), el %classname define el nombre de la clase .NET/Java a usar.
property
source.StringValue
target.%jsonObject.value
El en mensaje PEX de destino, las propiedades dinámicas esta ubicadas dentro del %jsonObject.
La Transformación de Datos se puede crear desde el portal de gestión "Interoperability" / "Build" / "Data Transformations", con el botón "New":
A continuación se definen las transformaciones del mensaje "source" al "target" como descrito en la tabla anterior, usando la herramienta gráfica y completando el texto en la pestaña "Action" a la derecha, para obtener las 2 líneas de texto mostradas abajo. Después, se puede guardar (botón "Save"), Compilar (botó "Compile") y probar con la pestaña "Tools".
Ahora, abriendo la pestaña tools, se puede probar esta Transformación de Datos:
Se abre la Ventana de Pruebas, donde se puede especificar valores para el mensaje de origen (en StringValue) y verificar el resultado:
Como se puede ver, el mensaje PEX usa una representación interna en json para traspasar los valores entre IRIS y Java o .NET.
Creación de un Business Process de tipo Enrutador
Ahora es posible añadir un Business Process de tipo Enrutador a la Producción, y definir una regla de Enrutamiento que llame a la Transformación de Datos creada e envie en mensaje al Business Operation existente.
En el portal de getión, se vuelve a la pantalla de Configuración de Producción ( "Interoperability" / "Configure" / "Production"), y se añade el Business Process de tipo "EnsLib.Message.Router", haciendo "click" sobre el "+" al lado de "Processes", y rellenando como sigue:
Parametro
valor
descripcio
Business Process Class
EnsLib.MsgRouter.RoutingEngine
Un Business Process para enrutamiento de mensajes basado en reglas
Auto-Create Rule
SI
Definir el esqueleto de una regla de Enrutamiento
Business Process Name
MessageRouter
Una nombre para nombrar este componente en la producción
Enable Now
SI
Activar este componente de inmediato
Pool Size
1
Escalabilidad. Permite definir el número de procesos activos en parallelo.
Queda por Editar la Regla de Enrutamiento de este Componente. Par esto se selecciona el componente "MessageRouter" en la producción, y se hace "click" sobre la lupa al lado de la Regla de Enrutamiento (Business Rule Name):
El editor de Reglas permite editar la Regla para enviar todos los mensajes de tipo "Ens.StringRequest" al Business Operation llamado "PEX.Webinar.FirstOperation" después de aplicarles la transformación. El botón "+" permite añadir elementos a las reglas, y se puede editar un elemento seleccionando-lo previamente. La regla a guardar debe estar como sigue:
Por defecto este componente no espera respuesta. Se cambia su configuración en la pestaña "Settings" del componente, para recibir la respuesta del Business Operation:
Prueba del Enrutador con el Servicio de Pruebas
De vuelta a la página de la producción, se puede usar el botón "Start" para arrancar la producción, seleccionar el componente "MessageRouter", y con la pestaña "Actions", hacer click sobre el botón "Test", para enviar un mensaje de tipo "Ens.StringRequest":
El mensaje de Respuesta de la prueba se puede ver en "Test Results", y la traza de mensaje completa muestra todos los detalles de la ejecución en los distintos componentes de la producción de Interoperabilidad de IRIS:
Respuesta:
Traza de los mensajes:
Business Service en .NET
Implementación en .NET
Se vuelve a Visual Studio para crear un Business Service en .NET. En este ejemplo Inicial, este Business Service no tiene "Inbound Adapter" especifico asociado; Se usa el "EnsLib.InboundAdapter", un componente que se ejecuta a intervalos regulares (según el valor de CallInterval) y hace una llamada al Business Service cada CallInterval.
En Visual Studio, se genera un nuevo fichero "FirstService.cs", para la clase "FirstService". El procesamiento de cada evento detectado por el Inbound Adapter se hace en el método "OnProcessInput". El objeto pasado en parámetro depende de la implementación del InboundAdapter, es este caso no se usa:
FirstService:OnProcessInput
public override object OnProcessInput(object messageInput)
{
//crear un nuevo Objeto de Petición
FirstMessage myRequest = new FirstMessage();
myRequest.value = "La Hora de envio es: " + System.DateTime.Now.ToString();
//Para Enviar Sin esperar una respuesta:
//SendRequestAsync("PEX.Webinar.FirstOperation", myRequest);
//Para Enviar y Esperar la respuesta con un timeout de 20 segundos:
FirstMessage myResponse=(FirstMessage) SendRequestSync("PEX.Webinar.FirstOperation", myRequest, 20);
return null;
}
FirstService:OnProcessInput
public override object OnProcessInput(object messageInput)
{
//crear un nuevo Objeto de Petición
FirstMessage myRequest = new FirstMessage();
myRequest.value = "La Hora de envio es: " + System.DateTime.Now.ToString();
//Para Enviar Sin esperar una respuesta:
//SendRequestAsync("PEX.Webinar.FirstOperation", myRequest);
//Para Enviar y Esperar la respuesta con un timeout de 20 segundos:
FirstMessage myResponse=(FirstMessage) SendRequestSync("PEX.Webinar.FirstOperation", myRequest, 20);
return null;
}
Para poder enviar el mensaje a cualquier componente de la producción si tener que recompilar, se puede usar un parámetro que se configure desde el portal de gestión; los valores se especifican en formato de una cadena json dentro del parámetro de configuración "RemoteSettings".
Parameters
class FirstService : InterSystems.EnsLib.PEX.BusinessService
{
/// <summary>
/// Un parametro que se puede cambiar desde el Portal
/// </summary>
public string TargetConfigName;
(...)
Si el valor especificado parar "TargetConfigName" esta a null, el Business Service no podrá enviar el mensaje a ningún destino. Para detectar este problema lo antes posible, una opción es validar el valor de TargetConfigName cuando se inicia el componente, en la llamada a OnInit():
FirstService:OnInit
public override void OnInit()
{
//Verificar que las propiedades esten correctamente informadas
if (TargetConfigName==null )
{
LOGWARNING("Falta valor para TargetConfigName; es necsario asignarle un valor en RemoteSettings");
}else
{
LOGINFO("TargetConfigname=" + TargetConfigName);
}
}
Ahora, se puede Cambiar el OnProcessInput para usar el valor de TargetConfigName:
OnProcessInput
//Para Enviar y Esperar la respuesta con un timeout de 20 segundos:
FirstMessage myResponse=(FirstMessage) SendRequestSync(TargetConfigName, myRequest, 20);
Business Service PEX en InterSystems IRIS
En el portal de Gestión, en la definición de la Producción se añade un componente de tipo Business Service, haciendo click sobre el "+" al lado de
A continuación, se configura el componente (haciendo click sobre el componente añadido) y seleccionando la pestaña "Settings" a la derecha:
Parámetro
Valor
Descripción
CallInterval
20
El tiempo entre cada ejecución del OnTask() del Adaptador Associado, y de cada llamada a OnProcessInput()
Remote Classname
PEX.Webinar.FirstDemo.FirstService
El Nombre de la clase .NET generada
Remote Settings
TargetConfigName=PEX.Webinar.FirstOperation
Una Lista de parametros en formato param=value, separados por <newline>
Gateway Port
44444
El puerto TCP en el cual esta configurado el .NET Gateway
Gateway Extra CLASSPATH
C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\
netstandard2.0\PEX.Webinar.FirstDemo.dll
Ubicación de las .DLL a incluir. Es la ubicación donde la compilación de Visual Studio ha generado la DLL
Al Activar este Business Service, cada CallIntervall el OnTask() del adaptador asociado (Ens.InboundAdapter) se ejecuta. Aquí, el OnTask simplemente llama FirstService.OnProcessInput(). Es Decir, cada callInterval, FirstService.OnProcessInput() genera un mensaje que envia al componente definido en "TargetConfigName". La Traza de Mensajes (Message Viewer) permite verificar esto:
Con los detalles de una llamada:
Business Process .NET
Implementación .NET
Como Cada Business Host, el Business Process tiene los Metodos de CallBack OnInit() y OnTearDown(). Los Metodos especificos de un Business Process son los siguientes:
Metodo
Descripción
OnRequest(mensaje)
Se ejecuta para cada mensaje que se envía al Business Process. Es el sitio donde implementar las acciones iniciales del Proceso, y realizar envíos asíncronos a otros componentes (Procesos o Operaciones)
OnResponse
Se ejecuta 1 vez para cada respuesta de las llamadas asíncronas realizadas. Permite gestionar las respuestas y guardar los resultados
OnComplete
Se ejecuta 1 vez al final de la ejecución del Business Process. Permite construir el mensaje de respuesta final del Proceso.
Es importante notar que un Business Process puede tener una ejecución que se alarga en el tiempo (horas o días, esperando una respuesta asíncrona). Para permitir esto, el Framework de IRIS puede interrumpir y reanudar la ejecución de un proceso. Todos los valores que se quieren mantener durante un proceso se tienen que poner en propiedades de la clase que IRIS guarda de manera persistente. Para esto, es necesario indicarlo con la anotación "[persistent]".
En este Ejemplo, se realiza una implementación minimalista, donde el Business Process enruta a un destino el mensaje PEX que recibe:
Se usan 2 variables que se pueden modificar desde el portal de Gestión:
FirstProcess
class FirstProcess: InterSystems.EnsLib.PEX.BusinessProcess
{
//Timeout para las Llamadas
public string Timeout = "PT10S";
public string TargetConfigName;
public override void OnInit()
{
//Verificar que las propiedades esten correctamente informadas
if (TargetConfigName == null)
{
LOGWARNING("Falta valor para TargetConfigName; es necesario asignarle un valor en RemoteSettings");
}
else
{
LOGINFO("TargetConfigname=" + TargetConfigName);
}
}
Cuando recibe un mensaje se envia de manera asincrona al TargetConfigName:
FirstProces:OnRequest
public override object OnRequest(object request)
{
LOGINFO("OnRequest");
SendRequestAsync(TargetConfigName, (InterSystems.EnsLib.PEX.Message)request, true); //ResponseRequired=true
SetTimer(Timeout, "HasTimedOut");
return null;
}
En OnResponse permite gestionar las respuestas de las llamadas:
FirstProcess:OnResponse
public override object OnResponse(object request, object response, object callRequest,
object callResponse, string completionKey)
{
LOGINFO("OnResponse, CompletionKey=" + completionKey);
if (completionKey!= "HasTimedOut")
{
response = (FirstMessage)callResponse;
}
LOGINFO("Response:" + response.ToString());
return response;
}
Y al finalizar el proceso, se devuelve la respuesta:
FirstProcess:OnComplete
public override object OnComplete(object request, object response)
{
LOGINFO("OnComplete");
return response;
}
Business Process PEX en Intersystems IRIS
Se añade un Business Process de tipo EnsLib.PEX.BusinessProcess, se configura como sigue, y se cambia el TargetConfigName del Business Service "PEX.Webinar.FirstProcess" para enviar los mensajes al nuevo Processo en vez de enviarlos dicectamente al BO.
Los "Settings" del componente se definen así:
Parametro
valor
Remote Classname
PEX.Webinar.FirstDemo.FirstProcess
Remote Settings
Timeout=PT20STargetConfigName=PEX.Webinar.FirstOperation
Gateway Port
44444
Gateway Extra Classpath
C:\Dev\PEX\PEX.Webinar.FirstDemo\bin\Debug\netstandard2.0\PEX.Webinar.FirstDemo.dll
El Resultado en la traza es este:
Conclusión
PEX permite implementar integraciones en .NET o Java de manera muy fluida y ofrece toda la potencia y robustez de la capa de interoperabilidad de InterSystems IRIS para desarrolladores con experiencia en estos lenguajes.
Este artículo ha sido etiquetado como "Mejores prácticas" ("Best practices").
Los artículos con la etiqueta "Mejores prácticas" incluyen recomendaciones sobre cómo desarrollar, probar, implementar y administrar mejor las soluciones de InterSystems.
Anuncio
Esther Sanchez · 1 jul, 2019
a {color:#2a2e78;}
Lo más vistoYa está disponible IRIS Studio 2019.2by David Reche 33El Arte del Mapeo de Globales para Clases (1 de 3)by Milo Martinez 26Cómo hacer preguntas de calidad como entradas de la Comunidadby David Reche 20Funciones del lenguaje que deberías conocer desde el día 1by Jose-Tomas Salvador 17Cómo publicar un artículo desde Word o Google Docsby David Reche 17Enviar alertas desde Ensemble mediante Telegramby Francisco López 16Crear un servicio SOAP Pass-throughby Francisco López 16Ensemble y los adaptadores para la salida de archivos, un pequeño trucoby Francisco López 16La aplicación IRIS API Explorerby David Reche 15API RESTfulby Francisco López 15"Mejores Prácticas" de InterSystemsby David Reche 15¿Cómo probar automáticamente los cuadros de mando dinámicos y los paneles de DeepSee?by Evgeny Shvarov 15El Arte del Mapeo de Globales para Clases (2 de 3)by Milo Martinez 15GitHub ahora soporta ObjectScriptby Dmitry Maslennikov 14Nuevo Vídeo: Productividad para Ingenieros de Interfazby Esther Sanchez 13Nueva versión de VSCode-ObjectScript (0.7.11)by Nancy Martinez 12Ya está disponible IRIS for Health 2019.2by David Reche 11Cómo evitar el truncamiento en mensajes HL7 con campos muy grandes (más de 32K)by Nancy Martinez 11Administración de la fecha y hora durante las operaciones en Cachéby Nancy Martinez 10Nuevo vídeo: InterSystems IRIS en un contenedorby Esther Sanchez 9Lo más votadoCómo hacer preguntas de calidad como entradas de la Comunidadby David Reche 1Administración de la fecha y hora durante las operaciones en Cachéby Nancy Martinez 1Lo más comentadoYa está disponible IRIS Studio 2019.2by David Reche 310 autores a los que seguirDavid Reche 49Francisco López 47Milo Martinez 41Nancy Martinez 21Jose-Tomas Salvador 17Dmitry Maslennikov 14AnunciosInterSystems IRISYa está disponible InterSystems IRIS 2019.2 by David RecheYa está disponible IRIS Studio 2019.2by David RecheNuevo vídeo: InterSystems IRIS en un contenedorby Esther SanchezInterSystems IRIS for HealthYa está disponible IRIS for Health 2019.2by David RecheHealthShareNuevo Vídeo: Productividad para Ingenieros de Interfazby Esther SanchezOtroNueva versión de VSCode-ObjectScript (0.7.11)by Nancy Martinez"Mejores Prácticas" de InterSystemsby David RecheArtículosOtroCómo hacer preguntas de calidad como entradas de la Comunidadby David RecheGitHub ahora soporta ObjectScriptby Dmitry MaslennikovCómo publicar un artículo desde Word o Google Docsby David RecheInterSystems IRISEnviar alertas desde Ensemble mediante Telegramby Francisco LópezLa aplicación IRIS API Explorerby David RecheFunciones del lenguaje que deberías conocer desde el día 1by Jose-Tomas SalvadorCachéEl Arte del Mapeo de Globales para Clases (1 de 3)by Milo MartinezAdministración de la fecha y hora durante las operaciones en Cachéby Nancy MartinezAPI RESTfulby Francisco LópezEl Arte del Mapeo de Globales para Clases (2 de 3)by Milo MartinezEnsembleCómo evitar el truncamiento en mensajes HL7 con campos muy grandes (más de 32K)by Nancy MartinezEnsemble y los adaptadores para la salida de archivos, un pequeño trucoby Francisco LópezPreguntasInterSystems IRIS¿Cómo probar automáticamente los cuadros de mando dinámicos y los paneles de DeepSee?by Evgeny ShvarovObtener el valor de la propiedad de la instancia o obtener el valor de la columna del registroby Evgeny ShvarovEnsembleCrear un servicio SOAP Pass-throughby Francisco López
Artículo
Ricardo Paiva · 15 mar, 2023
El [SDK nativo para Python](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=BPYNAT_about) de InterSystems es una interfaz ligera para las APIs de InterSystems IRIS, que anteriormente solo estaba disponible mediante ObjectScript.
Estoy especialmente interesado en la capacidad de llamar a los métodos de ObjectScript, a los métodos de clase, para ser más preciso. Esto funciona, y funciona muy bien, pero de manera predeterminada, las llamadas únicamente admiten argumentos escalares: strings, booleanos, enteros y flotantes.
Pero si lo que quieres es:
- Pasar o devolver estructuras, como diccionarios (dicts) o listas
- Pasar o devolver *streams*
Necesitarás escribir algún código adhesivo (*glue code*) o aprovechar este [proyecto](https://github.com/eduard93/edpy) (se instala mediante `pip install edpy`). El paquete `edpy` te da una estructura sencilla:
```python
call(iris, class_name, method_name, args)
```
que te permite llamar a cualquier método de ObjectScript y obtener los resultados.
Se importa así:
```python
from edpy import iris
```
`call` acepta 4 argumentos necesarios:
- `iris` - hace referencia a un [objeto de IRIS](https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=BPYNAT_refapi#BPYNAT_refapi_class-iris) establecido
- `class_name` - la clase de IRIS que debe llamarse
- `method_name` - el método de IRIS que debe llamarse
- `args` - lista con 0 o más argumentos
## Argumentos
Cada argumento puede ser alguno de los siguientes:
- *string* (de cualquier longitud, si es mayor que `$$$MaxStringLength` o 3641144 símbolos, se convertirá automáticamente en un *stream*)
- booleano
- entero
- flotante
- dict (se convierte en un objeto dinámico)
- lista o tupla (se convierte en una matriz dinámica)
Los argumentos de dict, lista y tupla pueden contener otros dicts, listas y tuplas de forma recurrente (mientras dure la memoria).
## Valor devuelto
A cambio, esperamos o un objeto/matriz dinámico o una string/stream JSON. En ese caso, edpy primero lo convertiría en un string Python y, si fuera posible, lo interpretaría como un dict o lista Python. De lo contrario, el resultado sería devuelto tal cual.
Eso es todo lo que debemos saber por el momento, pero permíteme dar algunos ejemplos de métodos ObjectScript y cómo llamarlos usando esta función de Python.
## Ejemplo 1: Pong
```objectscript
ClassMethod Test(arg1, arg2, arg3) As %DynamicArray
{
return [(arg1), (arg2), (arg3)]
}
```
Se llama con:
```
>>> iris.call(iris_native, "User.Py", "Test", [1, 1.2, "ABC"])
[1, 1.2, 'ABC']
```
El resultado no es ninguna sorpresa. Los argumentos se vuelven a empaquetar en una matriz y se devuelven.
## Ejemplo 2: Propiedades
```objectscript
ClassMethod Test2(arg As %DynamicObject) As %String
{
return arg.Prop
}
```
Se llama así:
```
>>> iris.call(iris_native, "User.Py", "Test2", [{"Prop":123}])
123
```
Para una invocación más embebida:
```
>>> iris.call(iris_native, "User.Py", "Test2", [{"Prop":{"Prop2":123}}])
{'Prop2': 123}
```
No hay ningún problema si una propiedad es demasiado larga: se utilizarán *streams* para enviarla y/o devolverla a IRIS:
```
ret = iris.call(iris_native, "User.Py", "Test2", [{"Prop":"A" * 10000000}])
>>> len(ret)
10000000
```
Si necesitas streams garantizados en el lado de InterSystems IRIS, puedes usar [%Get](https://docs.intersystems.com/irislatest/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=%25SYS&CLASSNAME=%25Library.DynamicObject#%25Get):
```objectscript
set stream = arg.%Get("Prop",,"stream")
```
Si el stream está codificado en base64, puedes descodificarlo automáticamente mediante:
```objectscript
set stream = arg.%Get("Prop",,"stream