#Interoperabilidad

0 Seguidores · 127 Publicaciones

En los servicios médicos, la compatibilidad  operativa es la capacidad que tienen los diferentes sistemas en tecnología de la información y aplicaciones de software para comunicarse, intercambiar datos y utilizar la información que se intercambió.

Pregunta Kurro Lopez · mar 10, 2021

Hola a todos,

Tengo un error muy extraño cuando llamo a un servicio web SOAP como cliente.

He creado todos los objetos para invocar a este SOAP usando el complemento "Asistente SOAP" en Eclipse, ha creado todos los objetos (Response, Request, Clase WS de Business Operation, etc.).

Cuando llamo a este servicio, devuelve el siguiente mensaje de error:

ERROR #6243: La solicitud HTTP a SOAP WebService ha devuelto una respuesta con CONTENT-TYPE inesperado: text/html.

2
0 2671
Artículo Pierre-Yves Duquesnoy · mar 10, 2021 5m read

Con el lanzamiento de PEX en InterSystems IRIS 2020.1 e InterSystems IRIS for Health 2020.1, los clientes tienen una mejor forma de incorporar Java en las producciones que con el Java Business Host. PEX proporciona un completo conjunto de APIs para construir la interoperabilidad de los componentes y está disponible tanto en Java como en .NET. Java Business Host ha sido discontinuado y se retirará en una versión futura.

Ventajas de PEX

  • Permite que los desarrolladores creen cualquier componente de producción tanto en Java como en .NET
  • Se pueden transferir estructuras de mensajes más complejas entre los componentes
  • Configuración simplificada
  • Workflow de desarrollo simplificado, sin necesidad de ObjectScript.

El resto de este artículo se centra en cómo migrar el código existente de Java Business Host a PEX.

Resumen

Las clases y las interfaces que utiliza PEX son diferentes a las de Java Business Host (JBH). Aquí ofrecemos un resumen de las diferencias, pero la documentación recoge toda la información necesaria.

Cómo cambiar un Business Service desde Java Business Host a PEX

Para crear un PEX Business Service, debes implementar com.intersystems.enslib.pex.BusinessService en vez de com.intersystems.gateway.bh.BusinessService.

El patrón de diseño utilizado por PEX para el Business Service ha cambiado de uno en el que se espera que el servicio inicie un subproceso para producir mensajes, a otro en el que el servicio implementa una función que es llamada periódicamente para producir mensajes.

En JBH, tu código se parecería a esto:

  @Override
  public boolean OnInit(Production p) throws Exception {
    production = p;

    if (messageThread == null) {
      Messager messager = new Messager();
      messageThread = new Thread(messager);
      messageThread.start();
    }

    return true;
  }

En PEX, solo necesitas implementar tres funciones:

  public void OnInit() throws Exception {
    // Initialization
    return;
  }

  public Object OnProcessInput(Object messageInput) throws Exception {
    // Here is where you call SendMessage() or SendMessageAsync()

    return null;
  }

  public void OnTearDown() throws Exception {
    // Shut down
    return;
  }

También deberás cambiar la forma en que se utiliza la configuración, se entregan los mensajes y se hace logging. Hablaremos de eso más adelante.

Cómo cambiar una Business Operation desde Java Business Host a PEX

Para crear una PEX Business Operation, debes implementar com.intersystems.enslib.pex.BusinessOperation en vez de com.intersystems.gateway.bh.BusinessOperation.

El patrón de diseño para Business Operations es estructuralmente el mismo entre JBH y PEX, pero han cambiado los parámetros a dos puntos de acceso principales.

Cambios en OnInit()

En PEX, OnInit() no requiere de ningún parámetro.

Cambios en OnMessage()

En PEX, OnMessage() recibe un Object genérico en vez del String usado en JBH. Esto permite al autor de la producción transmitir cualquier tipo de mensaje que desee.

En JBH, tu aplicación pudo haber tenido este aspecto:

  public boolean OnMessage(String message) throws Exception {
    // Business logic here
    return true;
  }

En PEX, el parámetro es un Java Objetct genérico, que se debe lanzar de forma adecuada, lo que permite transmitir mensajes más complejos que únicamente cadenas. Este es un ejemplo de cómo extraer una solicitud que es una secuencia de archivos:

  public Object OnMessage(Object request) throws Exception {
    com.intersystems.jdbc.IRISObject streamContainer = (com.intersystems.jdbc.IRISObject)request;
    com.intersystems.jdbc.IRISObject str = (com.intersystems.jdbc.IRISObject)streamContainer.get("Stream");
    String originalFilename = (String)streamContainer.get("OriginalFilename");

    Long contentSize = (Long)str.get("Size");
    String content = (String)str.invoke("Read", contentSize);

    // Business logic here

    return null;
  }

También deberás cambiar la forma en que se utiliza la configuración, se entregan los mensajes y se hace logging. Hablaremos de eso más adelante.

Configuración

Se ha simplificado la declaración de la configuración.

La configuración en JBH se declaraba mediante una cadena SETTINGS y se obtenía a través de un código que se parece a algo como esto:

  String setting = production.GetSetting("Min");
  if (!setting.isEmpty()) {
    min = Integer.parseInt(setting);
  }

En PEX, la configuración son solo campos para miembros públicos. Estos se completan automáticamente cuando la clase crea una instancia.

  public int Min = 0;

Cualquier campo de un miembro público está disponible para que se establezca en una producción, en la medida en que el campo del miembro sea de un tipo básico de Java (String, int, etc.).

Mensajes

El envío de mensajes es más potente. En JBH, los mensajes se envían como cadenas. En PEX, los mensajes se envían como objetos- IRISObject, para objetos definidos en ObjectScript, o una subclase de com.intersystems.enslib.pex.Message, para clases definidas en Java.

En JBH, tu código se parecería a esto:

  production.SendRequest(value.toString());

En PEX, sería algo como esto:

  MyExampleMessageClass req = new MyExampleMessageClass("message to send"); 
  SendRequestAsync(Target, req);

Logging

Todas las funciones de logging son similares, solo que se nombran de manera diferente.

En PEX, se registraría un mensaje informativo a través de LOGINFO()

  LOGINFO("Received message");

Object Gateway

JBH necesitaba su propio portal. Con PEX, puedes utilizar un único portal de Java para todas tus necesidades de Java. O puedes utilizar varios portales. Depende de ti. Aquí encontrarás una buena introducción al portal de Java.

Conclusión y comentarios

Si aún no has probado PEX, ¿a qué está esperando? PEX permite resolver un conjunto mucho más amplio de problemas empresariales con menos código, además de que ahora también puedes hacer cualquier cosa en .NET.

Si tienes salguna pregunta o problema para migrar tu aplicación de JBH a PEX, puedes contactar conmigo o con el Centro de Soporte Internacional (WRC).

1
0 137
Artículo Ricardo Paiva · mar 4, 2021 8m read

¡Hola Comunidad!

  Se acaba de lanzar OpenAPI-Client Gen, una aplicación para crear una producción cliente de interoperabilidad de IRIS a partir de la especificación Swagger 2.0.

  En vez de la herramienta existente ^%REST que crea una aplicación REST del lado del servidor, OpenAPI-Client Gen crea una plantilla completa de producción cliente de interoperabilidad REST.

La instalación se realiza por ZPM:

zpm "install openapi-client-gen"

  ¿Cómo generar la producción a partir de un documento Swagger?  

Hacerlo es muy sencillo.

Abre un terminal y ejecuta:

Set sc = ##class(dc.openapi.client.Spec).generateApp(<applicationName>, <Your Swagger 2.0 document>>)

  El primer argumento es el paquete objetivo donde se generarán las clases de la producción. El nombre del paquete debe ser un nombre válido e inexistente.
El segundo es el documento Swagger. Estos son los valores que se aceptan:

  1. Ruta del archivo.
  2. %DynamicObject.
  3. URL.
      La especificación debe estar en formato JSON.
      Si tu especificación utiliza el formato YAML puede convertirse fácilmente a JSON con algunas herramientas online, como onlineyamltools.com
      Ejemplo:
Set sc = ##class(dc.openapi.client.Spec).generateApp("petshop", "https://petstore.swagger.io:443/v2/swagger.json")
Write "Status : ", $SYSTEM.Status.GetOneErrorText(sc)

  Echa un vistazo al código generado, podemos ver muchas clases divididas en muchos subpaquetes:  

  • Business Service: petshop.bs
  • Business Operation: petshop.bo
  • Business Process: petshop.bp
  • REST Proxy application: petshop.rest
  • Ens.Request y Ens.Response: petshop.msg
  • Parsed input o Output object: petshop.model.Definition
  • Production configuration class: petshop.Production    

Business Operation class

Para cada servicio definido en el documento Swagger, hay un método relacionado llamado por <VERB><ServiceId>.

Análisis detallado de un método GETgetPetById simple generado  

/// Returns a single pet
Method GETgetPetById(pRequest As petshop.msg.getPetByIdRequest, pResponse As petshop.msg.GenericResponse) As %Status
{
    Set sc = $$$OK, pURL = "/v2/pet/{petId}"
    Set pHttpRequestIn = ..GetRequest(pRequest)
    Set pHttpRequestIn.ContentType = pRequest.consume
    Set pURL = $Replace(pURL, "{petId}", pRequest.pathpetId)
    $$$QuitOnError(..Adapter.SendFormDataArray(.pHttpResponse, "get", pHttpRequestIn , , , pURL))
    Set pResponse = ##class(petshop.msg.GenericResponse).%New()
    Set sc = ..genericProcessResponse(pRequest, pResponse, "GETgetPetById", sc, $Get(pHttpResponse),"petshop.msg.getPetByIdResponse")
    Return sc
}

 

  • En primer lugar, el objeto %Net.HttpRequest se crea por el método GetRequest. Si es necesario, no dudes en editarlo para agregar algunos encabezados.
  • En segundo lugar, el objeto HttpRequest se completa utilizando pRequest `petshop.msg.getPetByIdRequest' (subclase Ens.Request).
  • En tercer lugar, EnsLib.HTTP.OutboundAdapter se utiliza para enviar una solicitud http.
  • Y finalmente hay un proceso donde se origina una respuesta genérica por el método genericProcessResponse:
Method genericProcessResponse(pRequest As Ens.Request, pResponse As petshop.msg.GenericResponse, caller As %String, status As %Status, pHttpResponse As %Net.HttpResponse, parsedResponseClassName As %String) As %Status
{
    Set sc = $$$OK
    Set pResponse.operation = caller
    Set pResponse.operationStatusText = $SYSTEM.Status.GetOneErrorText(status)
    If $Isobject(pHttpResponse) {
        Set pResponse.httpStatusCode = pHttpResponse.StatusCode
        Do pResponse.body.CopyFrom(pHttpResponse.Data)
        Set key = ""
        For  {
            Set key = $Order(pHttpResponse.Headers(key),1 , headerValue)
            Quit:key=""
            Do pResponse.headers.SetAt(headerValue, key)
        }
        Set sc = ##class(petshop.Utils).processParsedResponse(pHttpResponse, parsedResponseClassName, caller, pRequest, pResponse)
    }
    Return sc
}

  Entonces, podemos analizar un método un poco más complejo POSTuploadFile

Method POSTuploadFile(pRequest As petshop.msg.uploadFileRequest, pResponse As petshop.msg.GenericResponse) As %Status
{
    Set sc = $$$OK, pURL = "/v2/pet/{petId}/uploadImage"
    Set pHttpRequestIn = ..GetRequest(pRequest)
    Set pHttpRequestIn.ContentType = pRequest.consume
    Set pURL = $Replace(pURL, "{petId}", pRequest.pathpetId)
    If pHttpRequestIn.ContentType = "multipart/form-data" {
        Set valueStream = ##class(%Stream.GlobalBinary).%New()
        Do:$Isobject(pRequest.formDataadditionalMetadata) valueStream.CopyFrom(pRequest.formDataadditionalMetadata)
        Do:'$Isobject(pRequest.formDataadditionalMetadata) valueStream.Write($Zcvt(pRequest.formDataadditionalMetadata,"I","UTF8"))
        Set:'$ISOBJECT($Get(mParts)) mParts = ##class(%Net.MIMEPart).%New()
        Set mimePart = ##class(%Net.MIMEPart).%New(valueStream)
        Do mimePart.SetHeader("Content-Disposition", "form-data; name=""additionalMetadata""; filename=""additionalMetadata""")
        Do mParts.Parts.Insert(mimePart)
    } Else { 
        Do pHttpRequestIn.InsertFormData("additionalMetadata", pRequest.formDataadditionalMetadata)
    }
    If pHttpRequestIn.ContentType = "multipart/form-data" {
        Set valueStream = ##class(%Stream.GlobalBinary).%New()
        Do:$Isobject(pRequest.formDatafile) valueStream.CopyFrom(pRequest.formDatafile)
        Do:'$Isobject(pRequest.formDatafile) valueStream.Write($Zcvt(pRequest.formDatafile,"I","UTF8"))
        Set:'$ISOBJECT($Get(mParts)) mParts = ##class(%Net.MIMEPart).%New()
        Set mimePart = ##class(%Net.MIMEPart).%New(valueStream)
        Do mimePart.SetHeader("Content-Disposition", "form-data; name=""file""; filename=""file""")
        Do mParts.Parts.Insert(mimePart)
    } Else { 
        Do pHttpRequestIn.InsertFormData("file", pRequest.formDatafile)
    }
    If $ISOBJECT($Get(mParts)) {
        Set mimeWriter = ##class(%Net.MIMEWriter).%New()
        Do mimeWriter.OutputToStream(.stream)
        Do mimeWriter.WriteMIMEBody(mParts)
        Set pHttpRequestIn.EntityBody = stream
        Set pHttpRequestIn.ContentType = "multipart/form-data; boundary=" _ mParts.Boundary
    }
    $$$QuitOnError(..Adapter.SendFormDataArray(.pHttpResponse, "post", pHttpRequestIn , , , pURL))
    Set pResponse = ##class(petshop.msg.GenericResponse).%New()
    Set sc = ..genericProcessResponse(pRequest, pResponse, "POSTuploadFile", sc, $Get(pHttpResponse),"petshop.msg.uploadFileResponse")
    Return sc
}

  Como puedes ver, es exactamente la misma lógica: GetRequest, completar %Net.HttpRequest, enviar solicitudes, procesar respuestas genéricas.
 

Proxy REST class

También se genera una Proxy REST application.
Esta clase REST utiliza un Projection para crear automáticamente la aplicación web relacionada (por ejemplo: "/petshoprest", consulta petshop.rest.REST y petshop.rest.Projection).   Este proxy REST crea el mensaje Ens.Request y lo envía hacia Business.Process.

Class petshop.rest.REST Extends %CSP.REST [ ProcedureBlock ]
{

Projection WebApp As petshop.rest.Projection;

...

ClassMethod POSTaddPet() As %Status
{
    Set ensRequest = ##class(petshop.msg.addPetRequest).%New()
    Set ensRequest.consume = %request.ContentType
    Set ensRequest.accept = $Get(%request.CgiEnvs("HTTP_ACCEPT"),"*/*")
    Set ensRequest.bodybody = ##class(petshop.model.Definition.Pet).%New()
    Do ensRequest.bodybody.%JSONImport(%request.Content)
    Return ##class(petshop.Utils).invokeHostAsync("petshop.bp.Process", ensRequest, "petshop.bs.ProxyService")
}

ClassMethod GETgetPetById(petId As %String) As %Status
{
    Set ensRequest = ##class(petshop.msg.getPetByIdRequest).%New()
    Set ensRequest.consume = %request.ContentType
    Set ensRequest.accept = $Get(%request.CgiEnvs("HTTP_ACCEPT"),"*/*")
    Set ensRequest.pathpetId = petId
    Return ##class(petshop.Utils).invokeHostAsync("petshop.bp.Process", ensRequest, "petshop.bs.ProxyService")
}
...
ClassMethod POSTuploadFile(petId As %String) As %Status
{
    Set ensRequest = ##class(petshop.msg.uploadFileRequest).%New()
    Set ensRequest.consume = %request.ContentType
    Set ensRequest.accept = $Get(%request.CgiEnvs("HTTP_ACCEPT"),"*/*")
    Set ensRequest.pathpetId = petId
    Set ensRequest.formDataadditionalMetadata = $Get(%request.Data("additionalMetadata",1))
    set mime = %request.GetMimeData("file")
    Do:$Isobject(mime) ensRequest.formDatafile.CopyFrom(mime)
    Return ##class(petshop.Utils).invokeHostAsync("petshop.bp.Process", ensRequest, "petshop.bs.ProxyService")
}
...
}

  Así que vamos a probar la producción con este REST proxy.

Abrir e iniciar petshop.Production

Cómo crear una tienda de mascotas

  Modifícalo con tu número de puerto, si es necesario:

curl --location --request POST 'http://localhost:52795/petshoprest/pet' \
--header 'Content-Type: application/json' \
--data-raw '{
  "category": {
    "id": 0,
    "name": "string"
  },
  "id" : 456789,
  "name": "Kitty_Galore",
  "photoUrls": [
    "string"
  ],
  "tags": [
    {
      "id": 0,
      "name": "string"
    }
  ],
  "status": "available"
}'

  La producción se ejecuta en modo asíncrono, así que la rest proxy application no espera la respuesta. Este comportamiento podría editarse, pero generalmente, la producción de interoperabilidad utiliza el modo asíncrono.   Puedes ver el resultado en Message Viewer y en Visual Trace.

Corrección: desde la versión 1.1.0, REST proxy application funciona en el modo de sincronización

  Si todo funciona bien, podremos observar un código de estado http 200. Como puedes ver, recibimos una respuesta del cuerpo y esta no se analizó.

¿Qué quiere decir eso?
Esto ocurre cuando no es respuesta de la aplicación/json o la respuesta 200 de la especificación Swagger no está completa.
En este caso, la respuesta 200 no está completa.  

Consigue una mascota

  Ahora, intenta obtener la mascota que se creó:

curl --location --request GET 'http://localhost:52795/petshoprest/pet/456789'

  Comprueba Visual Trace:

  Esta vez, es una respuesta de la aplicación/json (la respuesta 200 se completó en la especificación de Swagger). Podemos ver el análisis de un objeto de respuesta.   ### API REST - Generar y descargar

Además, esta herramienta puede alojarse en un servidor para permitir que los usuarios generen y descarguen el código.   La API REST y un formulario básico están disponibles:  

En este caso, el código simplemente se genera sin compilar o exportar, y después se elimina por completo.
Esta función puede ser útil para la centralización de herramientas.
  Consulta el archivo README.md para obtener información actualizada.     Gracias por leer el artículo.  

0
0 398
Anuncio Esther Sanchez · feb 25, 2021

¡Hola desarroladores!

Os traemos el noveno episodio de Data Points, el podcast de InterSystems en inglés.

Es la segunda parte de la entrevista con @Russell.Leftwich. En ella, @Adam.Coppola6950charla con Russ sobre algunas de las tecnologías de InterSystems que desempeñan un papel en los conceptos comentados en la parte 1 y también comentan las aplicaciones más modernas de FHIR.

Tras la entrevista con Russ, se une a la charla @Jenny Ames, para hablar sobre los FHIR Dev Days, el evento sobre FHIR más importante del mundo. ¡Dadle al play!

0
0 104
Artículo Eduardo Anglada · ene 22, 2021 3m read

Actualización: se añadió soporte para el modelo de regresión ¡Hola a todos!

En este breve artículo, os mostraré cómo escribir un adaptador para utilizar la interoperabilidad de IRIS con los modelos de Machine Learning (ML) administrados por IntegratedML de IRIS.

El adaptador

El adaptador solo utiliza las funciones SQL PREDICT y PROBABILITY de IntegratedML. Es solo una sencilla consulta SQL:
code1
Tened en cuenta que el nombre del modelo se obtiene a partir de la propiedad denominada "Model". Dicha propiedad debe estar definida en la clase host que utiliza el adaptador, de lo contrario se producirá una excepción. Por ejemplo:


La lista de los modelos en la configuración del adaptador se realiza en dos pasos:
  1. Creación de un método en una clase que sea hija de %ZEN.Portal.ContextSearch para tener todos los modelos de clasificación y que los devuelva (dc.Ens.Adapter.ClassficationMLContextSearch)
    code2
  2. Configuración de dicha clase y método como un alimentador para la propiedad Model que se encuentra en el parámetro SETTINGS en la clase del adaptador (dc.Ens.Adapter.ClassificationMLAdapter)
    code3
    Para los modelos de regresión, existe la clase dc.Ens.Adapter.RegressionMLContextSearch, que carga todos los modelos de regresión.

En este caso, el filtro MODE_TYPE se configuró como 'regression' en vez de 'classfication':

### Cómo utilizar el adaptador

Para la demostración, simulé un sencillo sistema de pago para las transacciones con tarjeta de crédito, con capacidad de detectar fraudes mediante un modelo de clasificación con ML. Cuando detecta una transacción sospechosa, emite una alerta.

Para utilizar el adaptador, cread una clase host (una clase Business Process o Business Operation) que utiliza como adaptador la clase dc.ENS.Adapter.ClassificationMLAdapter.
code4
Ahora, podéis utilizar el método del adaptador Classify(), y proporcionar una muestra de las características esperadas por el modelo:
Para utilizarlo, cread una clase host (una clase Business Process o Business Operation) que utilice como adaptador la clase dc.ENS.Adapter.ClassificationMLAdapter
code5
Podéis usarlos según vuestras necesidades. En el ejemplo, solo era necesario el resultado para la predicción de fraudes, por lo que la clase Business Operation solo utiliza el valor devuelto en la propiedad Predicted:
code6
Para los modelos de regresión, los resultados se modelan mediante la clase dc.Ens.Adapter.RegressionResult. Esta clase tiene una propiedad llamada Estimated.

Para obtener un valor estimado a partir de una muestra, la clase adaptador para el modelo de regresión tiene el método Estimate.

El resultado final se muestra a continuación:
code7
El código completo está disponible en OpenExchange. Espero que os resulte útil. José

0
0 149
Anuncio Esther Sanchez · nov 17, 2020

¡Hola Comunidad!

El plazo para participar en el Séptimo concurso para desarrolladores de InterSystems ya ha terminado y empieza la fase de votación.

Hemos recibido 9 aplicaciones, así que ya puedes elegir la mejor solución de Interoperabilidad desarrollada con InterSystems IRIS!

 
¿Cómo se vota?

0
0 92
InterSystems Official David Reche · oct 23, 2020

Ya está liberada la versión 2020.3 de InterSystems IRIS e IRIS for Health, con IntegratedML.

Esta es la primera versión de InterSystems IRIS que incluye IntegratedML, una nueva funcionalidad de la plataforma de datos que ofrece a analistas y desarrolladores el mejor "machine learning" del mercado, con una sencilla e intuitiva sintaxis SQL. Ahora, los desarrolladores pueden crear, probar e implementar potentes modelos desde IRIS, justo donde se encuentran sus datos.

0
0 125
Anuncio David Reche · ago 25, 2020

¡Hola desarrolladores!

Estamos en la semana de votar en el InterSystems IRIS for Health FHIR Contest!

Así que es hora de votar a la mejor solución FHIR construida con InterSystems IRIS for Health.

🔥 Tú decides: VOTA AQUÍ 🔥

¿Cómo se vota?

 Es muy fácil: tienes un voto, y tu voto irá en la Nominación de los Expertos o en la Nominación de la Comunidad.

0
0 108
Artículo Daniel Franco · ago 19, 2020 2m read

Ejecutar modelos predictivos de forma nativa en un "Business Process" ("Proceso Empresarial") de InterSystems IRIS siempre ha sido, por supuesto, el objetivo de nuestro soporte para PMML, pero de alguna forma nunca formó parte del paquete porque había algunas dependencias y elecciones que era necesario analizar y decidir. En cualquier caso, gracias a algunas presiones y al código ofrecido amablemente por  @Amir Samary (¡gracias de nuevo, Amir!), finalmente conseguimos empaquetarlo en un repositorio de GitHub para que lo disfruteis, lo valoreis y hagáis sugerencias.

0
0 187
Anuncio Esther Sanchez · jul 24, 2020

¡Hola desarrolladores!

Os traemos el octavo episodio de Data Points, el podcast de InterSystems en inglés.

En esta ocasión, charlamos con @Russ Leftwich (Senior Clinical Advisor for Interoperability en InterSystems) sobre estándares de interoperabilidad en el sector salud. En esta primera parte de la entrevista, Russ nos comenta la historia de los estándares de salud y del registro electrónico, los retos más importantes del sector y cómo el software ha evolucionado para ir cumpliendo esos retos cada vez mayores. ¡Dadle al play!

0
0 143
Anuncio Esther Sanchez · abr 29, 2020

¡Hola Comunidad!

Os invitamos a un nuevo webinar "Tech Talk": Desarrollo API-First. Será el martes 5 de mayo, a las 16:00 CEST (10:00 AM ET).

En este nuevo webinar "Tech Talk" en inglés, los tres ponentes analizarán el Desarrollo API-first y cómo InterSystems está adoptando esta tendencia de la industria con API Manager, y específicamente con FHIR.

Primero, hablarán de InterSystems API Manager - esta herramienta permite controlar el tráfico hacia y desde las API's en un portal centralizado. Por su parte, FHIR (Fast Healthcare Interoperability Resources), en su versión 4 (R4), lleva el estándar HL7 a un nuevo nivel, y el soporte de FHIR R4 en InterSystems IRIS for Health es grande. Mostrarán cómo trabajar con los datos FHIR en InterSystems IRIS, y también mostrarán el portal del desarrollador, donde se puede acceder a los recursos FHIR usando la especificación OpenAPI.

   

2
0 187
Artículo Dani Fibla · jun 26, 2020 6m read

Introducción: nuestra pequeña pero muy ambiciosa empresa llamada “Black Mushroom Studio” tuvo una idea para desarrollar un proyecto de comercio electrónico, y una aplicación móvil que permitiría a los usuarios pagar por ciertos bienes/servicios mediante un agregador de pagos.

Lo que teníamos inicialmente: un esqueleto para la aplicación en Android que, por supuesto, prefería la comunicación mediante HTTP y JSON, y un sistema de pago con una API, es decir, servicios web con contenido SOAP.

Objetivo: hacer que todo funcionara de manera conjunta.

0
0 179
Anuncio Esther Sanchez · jun 24, 2020

¡Hola Comunidad!

Por si os lo perdisteis o queréis volver a verlo, ya está disponible la grabación del webinar "Comienza a trabajar con FHIR" que realizamos el pasado miércoles 17 de junio.

Comienza a trabajar con FHIR

¿Habéis entrado al Canal de YouTube de la Comunidad de Desarrolladores en español? En él podéis ver todos los webinars que estamos realizando, varios tutoriales y más vídeos. Y si os suscribís al canal, podréis ver nuestros vídeos directamente en vuestro muro de "Suscripciones" cuando entréis en YouTube yes

¡Esperamos que os resulte útil!

0
0 107
InterSystems Official David Reche · jun 10, 2020

Ya están disponibles las versiones de prueba de InterSystems IRIS Advanced Analytics y de InterSystems IRIS for Health Advanced Analytics. El add-on Advanced Analytics para InterSystems IRIS introduce IntegratedML como una nueva funcionalidad.

El número de compilación de estas versiones es el: 2020.3.0AA.331.0

Los kits para la instalación, las imágenes del contenedor y las licencias de evaluación están disponibles en la página de descargas para pruebas del Centro de Soporte Internacional (WRC).

0
0 150
Artículo Federico Coda Zabetta · jun 10, 2020 2m read

¡Hola Comunidad!

Para la sincronización de datos dentro de Caché/IRIS, existen varias formas de sincronizar objetos y tablas. A nivel de la base de datos se puede usar Shadowing o Mirroring 

Esto funciona perfectamente, y si solo necesitas sincronizar una parte de tus datos, puedes partir tus datos en conjuntos más pequeños usando Global mapping. O, si necesitas sincronización bidireccional a nivel de clase/tabla, puedes usar la herramienta Object Synchronization.

El único límite de todos estos métodos es que sólo funcionan desde Caché/IRIS hacia Caché/IRIS. Si quieres sincronizar tus datos a alguna base de datos externa, necesitas alguna otra solución.

0
0 219
Artículo Mathew Lambert · mayo 19, 2020 2m read

Los WebSockets, como tecnología de comunicación, están ganando una importancia cada vez mayor.
En el namespace SAMPLES puedes encontrar un buen ejemplo para ejecutar un WebSocket Server.
También hay un útil ejemplo para un Browser Client, pero sigue estando en el navegador.

La cuestión es:
¿Cómo consumir la salida de un WebSocket Server en tu aplicación?

0
0 147
Artículo Mathew Lambert · mayo 18, 2020 2m read

Los WebSockets, como tecnología de comunicación, están ganando una importancia cada vez mayor.
En el namespace SAMPLES puedes encontrar un buen ejemplo para ejecutar un WebSocket Server.
También hay un ejemplo útil para un Browser Client en el cual JavaScript hace la mayor parte del trabajo. 

La cuestión es:
¿Cómo consumir la salida de un WebSocket Server en tu aplicación?

0
0 177
Anuncio Esther Sanchez · mayo 4, 2020

¡Hola Comunidad!

Por si te lo perdiste... o quieres volver a verlo, ya está disponible la grabación del webinar "Interoperabilidad: Herramientas de productividad HL7" que realizamos el pasado 29 de abril.

Podéis verlo completo aquí: Grabación webinar Interoperabilidad >>

Esperamos que os resulte útil yes

0
0 113
Pregunta Kurro Lopez · abr 17, 2020

Hola a todos,

Tengo una clase que ha estado funcionando hasta ahora :(

La clase extiende la clase EnsLib.RecordMap.Service.FTPService y agrega información para cada fila.

Ahora, cuando guarda el objeto, genera el siguiente error

ERROR #5803: Error al asignar un bloqueo exclusivo

He visto la otra pregunta en la comunidad y he tratado de desbloquear

do## clase (mi.clase).% UnlockExtent(0,1)
pero no funciona
 
¿Alguna idea?
 
Un saludo
3
0 232
InterSystems Official David Reche · abr 1, 2020

La versión 2020.1 de HealthShare Health Connect ya ha sido lanzada.

Los kits para la instalación y las imágenes del contenedor están disponibles en la página de distribución de software del Centro de Soporte Internacional (WRC).

El número de compilación de estas versiones es 2020.1.0.215.0.

0
0 113
Anuncio Esther Sanchez · feb 26, 2020

¡Hola Comunidad!

Os traemos el primer episodio de nuestro nuevo podcast (Data Points), que trata sobre lo que es InterSystems IRIS en conjunto. Fue un placer charlar 15 minutos con @Jenny Ames sobre lo que hace diferente a IRIS. Y también nos contó los mejores usos de la tecnología de InterSystems que ella ha visto en todos sus años trabajando como formadora primero y como desarrolladora de contenido online después.

Puedes escuchar el podcast dandole a Play o entrando en la web de Data Points: datapoints.intersystems.com

0
0 147
InterSystems Official David Reche · ene 30, 2020

¡Hola a tod@s!

Ya está disponible la versión de prueba 2020.1 de HealthShare Health Connect.

Los kits para la instalación, las imágenes del contenedor y las licencias de evaluación están disponibles en la página de descargas para pruebas del Centro de Soporte Internacional (WRC).

El número de compilación de estas versiones es 2020.1.0.199.0. (Nota: número actualizado de 197 a 199 el 12/2/20)

HealthShare Health Connect 2020.1  incluye muchas funcionalidades nuevas:

0
0 202
Anuncio David Reche · nov 7, 2019

La versión 2019.3 de InterSystems IRIS, IRIS for Health e IRIS Studio ya está disponible.

Está disponible a través del Centro de Soporte Internacional,  con número de compilación 2019.3.0.311.0.

InterSystems IRIS Data Platform 2019.3 incluye muchas funcionalidades nuevas:

0
0 147