La réponse originale de @Jeff Morgan  :

Ewan,

Voici un exemple simple de la façon de compter les DocType dans le tableau EnsLib_HL7.Message :

SELECT Count(*) 
  FROM EnsLib_HL7.Message
 WHERE Name = 'ADT_A12'

Si vous avez besoin de comparer également les propriétés de Ens.MessageHeader, vous pouvez faire une jointure sur les deux tableaux :

select Count(*) 
  from EnsLib_HL7.Message As Body
LEFT JOIN Ens.MessageHeader As Header
       ON Body.ID = Header.MessageBodyId
 WHERE Header.ID > 1 
   AND Body.Name = 'ADT_A12'

J'espère que cela vous aidera.

La réponse originale de @Marc Mundt  :

Si vous prévoyez d'effectuer des recherches fréquentes sur un segment/champ HL7 spécifique, vous pouvez accélérer considérablement les recherches en utilisant le mécanisme de "tableaux de recherche" d'Ensemble pour ajouter un index pour ce champ.

http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=...

Les champs indexés dans le tableau de recherche sont répertoriés dans la liste déroulante de la recherche du visualiseur de messages, ou peuvent être interrogés à l'aide de SQL en joignant EnsLib_HL7.SearchTable :

select msg.ID,msg.TimeCreated,
       msg.DocType,
       msgHdr.SourceConfigName,
       msgHdr.TargetConfigName,
       msg.RawContent 
from EnsLib_HL7.SearchTable srchTbl
join enslib_hl7.message msg on msg.id=srchTbl.docid 
join Ens.MessageHeader msgHdr on msgHdr.MessageBodyId=srchTbl.docid
where  (srchTbl.propid=(select propid from Ens_Config.SearchTableProp where classextent='EnsLib.HL7.SearchTable' and name='PatientSSN')
       and srchTbl.propvalue = '123-25-4612')
       and msgHdr.SourceConfigName='HL7.File.In'

La réponse originale de @Brendan Batchelder :

Pour ce faire, dans le visualiseur de messages, ajoutez un critère étendu à vos paramètres de recherche. Type de critère = VDoc Property Path. Classe = EnsLib.HL7.Message. DocType = Schema:Nom du type de documents que vous recherchez (par exemple 2.3.1:ADT_A01). Route de la propriété = la route VDoc du champ sur lequel vous recherchez (par exemple MSH:SendingApplication).
Il convient de noter que le visualisateur de messages utilise le langage SQL pour obtenir une liste de messages basée sur les "critères de base", puis il boucle sur les résultats en appliquant chacun des "critères étendus" comme filtre. Cette opération peut être très lente. Si cela prend plus de 2 minutes, le visualiseur de messages se bloque et soit les critères de base doivent être affinés afin de renvoyer moins de résultats, soit la recherche de messages doit être effectuée avec du code.
Pour ce faire avec un code, utilisez le SQL intégré pour effectuer une recherche sur les en-têtes de message en fonction de critères de base, puis bouclez sur les résultats en vérifiant les routes VDoc. Voici un exemple qui recherche les messages d'un jour particulier qui ont une valeur particulière dans MSH:3, le champ de l'Application expéditrice :

&SQL(DECLARE C1 CURSOR FOR
      SELECT MessageBodyId INTO :id
        FROM Ens.MessageHeader 
       WHERE MessageBodyClassName='EnsLib.HL7.Message'
         AND TimeCreated BETWEEN '2016-07-15'
         AND '2016-07-16')
&SQL(OPEN C1)
&SQL(FETCH C1)
while (SQLCODE = 0) {
   set msg = ##class(EnsLib.HL7.Message).%OpenId(id)
   if (msg.GetValueAt("MSH:SendingApplication") = "Ensemble") {
      //do something with this message
   }
   &SQL(FETCH C1)
}
&SQL(CLOSE C1)

La réponse originale de @Mike Moulckers:

Scott,
L'astuce consiste à utiliser la syntaxe appropriée pour accéder aux différents champs du message DICOM. Dans l'exemple ci-dessous, nous extrayons des données du message DICOM pour les insérer dans un message de demande de planification simple produit en XML. La même syntaxe peut être utilisée en sens inverse, en écrivant de HL7 vers DICOM. Comme le message DICOM n'est pas entièrement défini dans Ensemble/HealthShare, la vue graphique de l'éditeur DTL n'est pas très jolie...

Class Test.Transform.DICOMToPatientSchedule Extends Ens.DataTransformDTL [ DependsOn = (EnsLib.DICOM.Document, Test.Msg.PatientScheduleReq) ]
{ 
   Parameter IGNOREMISSINGSOURCE = 1; 
   Parameter REPORTERRORS = 1; 
   Parameter TREATEMPTYREPEATINGFIELDASNULL = 0; 
   XData DTL [ XMLNamespace = "http://www.intersystems.com/dtl" ]
   {
      <transform sourceClass='EnsLib.DICOM.Document' targetClass='Test.Msg.PatientScheduleReq' targetDocType='2.3.1:ADT_A01' create='new' language='objectscript' >
         <assign value='source.GetValueAt("DataSet.PatientID")' property='target.PID' action='set' />
         <assign value='"DICOM"' property='target.MessageSource' action='set' />
         <assign value='source.GetValueAt("DataSet.PatientName")' property='target.PatientName' action='set' />
         <assign value='source.GetValueAt("DataSet.ScheduledProcedureStepSequence[1].ScheduledProcedureStepStartDate")' property='target.ExamDateTime' action='set' />
         <assign value='source.GetValueAt("DataSet.ScheduledProcedureStepSequence[1].ScheduledProcedureStepStartDate")' property='target.FileDate' action='set' />
         <assign value='source.GetValueAt("DataSet.ScheduledProcedureStepSequence[1].ScheduledProcedureStepDescription")' property='target.ExamType' action='set' />
         <assign value='source.GetValueAt("DataSet.AccessionNumber")' property='target.AccessionNumber' action='set' />
         <assign value='source.GetValueAt("DataSet.StudyInstanceUID")' property='target.VisitId' action='set' />
         <assign value='source.GetValueAt("DataSet.ScheduledProcedureStepSequence[1].ScheduledPerformingPhysicianName")' property='target.AttendingPhysician' action='set' />
      </transform>
   }
}