Hola Yuri,

Una opción muy sencilla es utilizar $zdatetime, por ejemplo:

write $translate($zdatetime($horolog, 3, 1)," ","T")

En la documentación puedes ver distintos formatos disponibles para fecha y hora con los que puedes jugar con $zdatetime.

Hola Luis,

Parece que estás en una versión muy antigua (2012) y utilizando una tecnología (ZEN) también antigua. ZEN se soporta aún por compatibilidad, pero échale un vistazo al InterSystems IRIS Migration Guide en el WRC > Software Distribution > Docs.

Sobre tu cuestión, el error probablemente viene dado de que intentas establecer el value de algo nulo. No consigues referencia el parámetro. Prueba con el ejemplo que te ha pasado Mario, o incluso mejor añade un id al parámetro para que puedas referenciarlo directamente a través del identificador.

<tablePane id="table"
           queryClass="MyApp.Employee"
           queryName="ListEmployees">
    <parameter value="Sales" id="param1"/>
    <parameter value="NEW YORK"/>
</tablePane>

Mira por ejemplo en Query Parameters

Hola Yone,

En los adaptadores de interoperabilidad no hay directamente un adaptador STOW-RS pero puedes intentar implementar la parte de servicios REST en la plataforma y luego enviarlo utilizando los adaptadores DICOM TCP convencionales.

Los servicios y operaciones incluidos que utilizan adaptadores DICOM TCP emplean siempre como mensaje EnsLib.DICOM.Document. Y sí, puedes instanciar un documento DICOM desde un fichero (stream) con CreateFromDicomFileStream.

Comprueba siempre el resultado de CreateFromDicomFileStream por si devuelve algún error. Si todo va bien, debería ser 1 o lo que es lo mismo un $$$OK.

USER>set fileStream = ##class(%Stream.FileBinary).%New()

USER>set fileStream.Filename="/shared/dicom/d1I00001.dcm"                                     

USER>write fileStream.Size
262878
USER>set sc = ##class(EnsLib.DICOM.Document).CreateFromDicomFileStream(fileStream, .dicom)

USER>write sc
1
USER>zwrite dicom
dicom=13@EnsLib.DICOM.Document  ; <OREF>
+----------------- general information ---------------
|      oref value: 13
|      class name: EnsLib.DICOM.Document
| reference count: 2
+----------------- attribute values ------------------
|       %Concurrency = 1  <Set>
|     DestinationAET = ""
|           Modified = 1
|  OriginalSourceAET = ""
|          SourceAET = ""
|    SourceIPAddress = ""
+----------------- swizzled references ---------------
|       i%CommandSet = ""  <Set>
|       r%CommandSet = "7@EnsLib.DICOM.CommandSet"  <Set>
|     i%FixedDataSet = ""
|     r%FixedDataSet = "5@EnsLib.DICOM.FixedDataSet"
|   i%MutableDataSet = ""  <Set>
|   r%MutableDataSet = "4@EnsLib.DICOM.MutableDataSet"  <Set>
+--------------- calculated references ---------------
|        (i%DataSet)   <Get>
|        (r%DataSet)   <Get>
|            HasData   <Get>
+-----------------------------------------------------

USER>

Una vez tengas tu instancia de EnsLib.DICOM.Document ya puedes enviarlo por DICOM TCP convencional. En tu ejemplo, parece que lo has incluido en otro mensaje.

Quizá se haya construido con errores el EnsLib.DICOM.Document, o simplemente sea un tema de representación en el visor de mensajes. Siempre puedes instanciar el mensaje en concreto que quieras en el terminal y examinar su contenido para quedarte seguro.

Hola Yone,

Los Streams se utilizan para almacenar cadenas de datos sin límite de tamaño. Si en una clase persistente, incluyes propiedades de tipo Stream serán persistentes.

%Stream.GlobalCharacter, %Stream.GlobalBinary: persisten los datos en globals (en la base de datos).
%Stream.FileCharacter, %Stream.FileBinary: persisten los datos en ficheros (.stream).

Lo que te recomienda la documentación es que utilices estas clases en lugar de sus versiones antiguas, por ejemplo:

  • Utiliza %Stream.GlobalCharacter en lugar de la antigua %GlobalCharacterStream.
  • Utiliza %Stream.FileCharacter en lugar de la antigua %FileCharacterStream.

La gestión de los mensajes huérfanos es como siempre. Si tienes un árbol de clases persistente que cuelga de un mensaje de interoperabilidad (incluya o no Streams), recuerda siempre implementar el método %OnDelete para borrar su contenido adecuadamente.

Hola Yone,

Si el %Status (tSC) que te devuelve ##class(ITB.HL7.Util.Convert).ER7ToXML es 1 como muestras, entonces el error no lo tienes en la parte de la conversión de ER7 a XML en Healthcare-HL7-XML (ITB).

Tendrás que ir examinando el resto de partes que tengas en tu servicio web:

  • No sé si tienes más código antes o después de esa llamada, comprueba que no haya errores.
  • Comprobar logs del servidor web y del CSP Webgateway. Incluso puedes activar ISCLOG Documentación

Hola Yone,

Entiendo que estás comparando dos cosas diferentes:

Hay más factores que pueden intervenir: servidor web externo, configuración Web Gateway, configuración seguridad aplicación web.

Yo te recomendaría que lo primero de todo pongas algunas trazas en el código de tu WebService para comprobar si la llamada está llegando a donde crees.

Por ejemplo puedes utilizar una global:

set ^zdebug($i(^zdebug))="["_$zdt($zts,3,,2)_"] "_"before" 
set ackXML = ##class(ITB.HL7.Util.Convert).ER7ToXML(ackER7,.tSC,"2.5")
set ^zdebug($i(^zdebug))="["_$zdt($zts,3,,2)_"] "_"after. tSC="_tSC 

Y luego échale un vistazo:

USER>zw ^zdebug
^zdebug=3
^zdebug(2)="[2022-06-03 08:35:47.75] before"
^zdebug(3)="[2022-06-03 08:35:57.39] after. tSC=1"

Así de entrada estás seguro que está llegando hasta la llamada.
Si llega hasta la llamada, luego puedes investigar en particular la conversión para ese mensaje.

Hola,

Necesitas configurar el FHIR Server de IRIS como un OAuth Resource Server.

Ten en cuenta que se requiere que cuando envíes el access token al servidor lo hagas como una cabecera Bearer, no como un parámetro de la URL.

Hola Yone,

Los procesos de negocio para DICOM tienen que controlar y gestionar lo que sucede con las operaciones DICOM que usan debido a la propia naturaleza dúplex del protocolo.

https://docs.intersystems.com/irisforhealthlatest/csp/docbook/DocBook.UI...

Por ejemplo, en DICOM.BP.QueryProcess tiene que gestionar llamadas para establecer y liberar las asociaciones en la conexión.

Quizá te resulte más sencillo de implementar utilizar varios BP y BO en la producción, según los diferentes sistemas que tengas que integrar.

Hola Yone,

Disculpa, ¡no había visto que esta pregunta estaba sin responder!

No puedes exportar un documento DICOM a XML y después tratar de escribirlo directamente en la traza. Los documentos DICOM son complejos y la forma de acceder a sus propiedades es a través de los métodos de la clase EnsLib.DICOM.Document.

Por ejemplo:

pInput.GetValueAt("DataSet.PatientID",,.tSC)

Hola Yone,

Imagino que habrá diferencias entre el C-FIND que se envía en el primer caso y el segundo.

En el primer caso, el que retorna más resultados, entiendo que es el caso del ejemplo. Revisa cómo se está generando exactamente ese C-FIND:

https://github.com/intersystems-ib/iris-dicom-sample/blob/7bc3c00dfa1bbb...

En principio, se está haciendo un PatientRootQuery (tAffectedSOPClassUID).

No sé si puede servirte para algo, pero en el herramienta findscu creo que hay una opción para especificar el Information Model a utilizar:

https://github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool...

-M <name>                                specifies Information Model.
                                          Supported names: PatientRoot,
                                          StudyRoot, PatientStudyOnly,
                                          MWL, UPSPull, UPSWatch,
                                          UPSQuery, HangingProtocol or
                                          ColorPalette. If no Information
                                          Model is specified, StudyRoot
                                          will be used.