1. Configura clases de mensaje de origen y destino
Puntos Clave
- Opciones de clase de mensaje: EnsLib.HL7.Message para mensajes completos, EnsLib.HL7.Segment para segmentos
- Selección de DocType: Elegir después de clase - Formato: Version:MessageType (ej., 2.5:ADT_A01)
- Mensajes completos: Usar EnsLib.HL7.Message para la mayoría de transformaciones DTL
- Transformaciones de segmento: Usar EnsLib.HL7.Segment para subtransformaciones de segmento reutilizables
Notas Detalladas
Resumen
El editor Data Transformation Language (DTL) en InterSystems HealthConnect proporciona una interfaz visual poderosa para crear transformaciones de mensaje. Antes de poder comenzar a mapear campos, debe configurar las clases de mensaje de origen y destino. Para transformaciones HL7, tiene dos opciones primarias de clase: EnsLib.HL7.Message para transformar mensajes HL7 completos, y EnsLib.HL7.Segment para transformar segmentos HL7 individuales.
Clase EnsLib.HL7.Message
EnsLib.HL7.Message es la clase más comúnmente usada para transformaciones DTL de HL7. Cuando selecciona esta clase para origen y destino, está creando una transformación que toma un mensaje HL7 completo como entrada y produce un mensaje HL7 completo como salida. Esto es apropiado para la mayoría de escenarios de integración donde necesita transformar mensajes entre diferentes versiones HL7, modificar contenido de mensaje, o reestructurar mensajes para cumplir requisitos del sistema destino.
Configuración de DocType
Después de seleccionar la clase de mensaje, el editor DTL le solicita elegir un DocType para origen y destino. El DocType especifica la estructura exacta de mensaje usando el formato Version:MessageType, con un separador de dos puntos y guión bajo en el tipo de mensaje. Por ejemplo, "2.5:ADT_A01" especifica un mensaje de admisión de paciente ADT usando estructura HL7 versión 2.5. La selección de DocType determina qué segmentos y campos están disponibles para mapeo en la transformación.
EnsLib.HL7.Segment para Subtransformaciones
EnsLib.HL7.Segment se usa menos frecuentemente pero es valiosa para crear transformaciones reutilizables a nivel de segmento. Cuando tiene lógica de transformación de segmento similar que necesita aplicarse en múltiples DTLs a nivel de mensaje, puede crear una subtransformación a nivel de segmento usando EnsLib.HL7.Segment. Esta subtransformación puede luego llamarse desde múltiples DTLs a nivel de mensaje, promoviendo reutilización de código y consistencia. Por ejemplo, podría crear una subtransformación de segmento para estandarizar contenido de segmento PID que se usa a través de múltiples transformaciones de tipo de mensaje.
Referencias de Documentación
2. Diferencia entre configuraciones Create=New y Create=Copy
Puntos Clave
- Create=New: Mensaje destino comienza vacío - debe copiar todos los segmentos necesitados
- Create=Copy: Destino comienza como copia completa de origen - modificar solo lo que cambia
- Cuándo usar New: Diferentes versiones, diferentes estructuras, copiado selectivo de segmento
- Cuándo usar Copy: Misma versión, misma estructura, cambios mínimos de campo
Notas Detalladas
Decisión de Configuración Clave
Una de las decisiones de configuración DTL más críticas es elegir entre modos Create=New y Create=Copy. Esta elección afecta fundamentalmente cómo se inicializa el mensaje destino y qué lógica de transformación necesita implementar. Comprender cuándo usar cada modo es esencial para crear transformaciones eficientes y es un tema frecuente de examen.
Modo Create=New
Create=New inicializa el mensaje destino como un objeto de mensaje vacío. Ningún segmento se copia automáticamente de origen a destino. Esto significa que debe copiar explícitamente cada segmento y campo que desea en el mensaje destino. Aunque esto requiere más lógica de transformación, proporciona máximo control y es apropiado cuando el origen y destino tienen diferentes estructuras. Por ejemplo, si está transformando de HL7 versión 2.3.1 a versión 2.5, las estructuras de mensaje difieren significativamente, y Create=New le permite mapear cuidadosamente cada segmento de acuerdo con las diferencias estructurales.
Create=New también es la elección correcta cuando no desea que todos los segmentos del origen aparezcan en el destino. Si el mensaje de origen contiene segmentos Z (segmentos personalizados) que no deben incluirse en el destino, o segmentos opcionales que no son necesitados, Create=New le permite copiar selectivamente solo los segmentos que desea. Aún puede copiar segmentos individualmente - Create=New no previene copiado, solo no copia automáticamente.
Modo Create=Copy
Create=Copy toma el enfoque opuesto - inicializa el mensaje destino como una copia completa del mensaje origen. Antes de que cualquier acción de transformación se ejecute, el destino ya contiene todos los segmentos y campos con valores idénticos al origen. Su lógica de transformación luego se enfoca solo en modificar los campos que necesitan cambiar. Esto es altamente eficiente al transformar mensajes de la misma versión y estructura donde solo unos pocos campos necesitan modificación.
Ejemplo Práctico
Por ejemplo, si está recibiendo mensajes ADT_A01 en versión 2.5 y necesita enviarlos a otro sistema también usando versión 2.5, pero necesita cambiar el código de facilidad receptora en MSH:6 y agregar un código de facilidad a PV1:3, Create=Copy es ideal. El DTL solo necesita dos asignaciones de campo simples - todo lo demás ya está correctamente copiado. Usar Create=New para este escenario requeriría docenas de acciones de copiado para reconstruir la estructura de mensaje entera.
Referencias de Documentación
3. Agrega funciones a expresiones DTL
Puntos Clave
- Acceso a funciones: Ícono de lupa abre selector de funciones
- Funciones comunes: Lookup, Strip, ToLower, ToUpper, Pad, Replace
- Lookup(): Buscar tablas de lookup - parámetros: nombre de tabla, valor de búsqueda, acciones predeterminadas
- Funciones de cadena: Quitar espacios en blanco, cambiar caso, pad strings, reemplazar texto
Notas Detalladas
Acceso a Funciones
Las transformaciones DTL frecuentemente necesitan manipular datos más allá del simple copiado de campo. El editor DTL proporciona una biblioteca comprehensiva de funciones para transformación de datos, validación y operaciones de lookup. Estas funciones se acceden a través del editor de expresiones haciendo clic en el ícono de lupa junto a cualquier mapeo de campo, que abre la interfaz de selector de funciones mostrando funciones disponibles organizadas por categoría.
La Función Lookup()
La función Lookup() es una de las funciones DTL más importantes para integraciones de salud. Habilita traducción de código buscando tablas de lookup para mapeos de valor. Por ejemplo, podría usar una tabla de lookup para mapear códigos de departamento internos a códigos de facilidad externos, o para traducir códigos de género entre las convenciones de diferentes sistemas. La función Lookup() toma varios parámetros: el nombre de tabla de lookup, el valor de búsqueda (típicamente un campo de origen), y configuración para qué hacer si el valor no se encuentra en la tabla (usar un valor predeterminado, generar un error, o pasar a través del valor original).
Funciones de Manipulación de Cadenas
Las funciones de manipulación de cadenas manejan requisitos comunes de limpieza y formateo de datos. Strip() remueve espacios en blanco iniciales y finales de cadenas, lo cual es valioso cuando sistemas de origen incluyen espacios extra que sistemas destino no esperan. ToLower() y ToUpper() proporcionan conversión de caso, útil cuando sistemas tienen diferentes requisitos de sensibilidad de caso. Estas funciones simples pueden prevenir problemas de integración causados por desajustes de formato de datos.
La función Pad() agrega caracteres de relleno a cadenas para alcanzar una longitud requerida, lo cual ocasionalmente es necesitado cuando sistemas destino esperan campos de longitud fija. La función Replace() realiza operaciones de reemplazo de cadena, permitiéndole reemplazar caracteres específicos o subcadenas con otros valores. Por ejemplo, podría reemplazar guiones con espacios en números de teléfono si el sistema destino usa un formato diferente.
Mejores Prácticas
Cada función tiene requisitos específicos de parámetro que debe comprender para usarlas correctamente. La interfaz de selector de funciones muestra descripciones de parámetros, pero comprender funciones comunes y sus patrones de uso es importante para preparación de examen. Practique usando estas funciones en el editor DTL para familiarizarse con sus parámetros y comportamiento.
Referencias de Documentación
4. Aplica acciones foreach en DTL
Puntos Clave
- Propósito de foreach: Iterar sobre segmentos o campos repetidos
- Variable de bucle: k1, k2, k3... para bucles anidados
- Casos de uso comunes: Resultados OBX, múltiples seguros, identificadores repetidos
- Bucles anidados: Bucle interno usa número k más alto (k2 dentro de k1)
Notas Detalladas
Propósito y Casos de Uso
La acción foreach en DTL proporciona capacidad de iteración para procesar segmentos repetidos y campos repetidos dentro de mensajes HL7. Los mensajes HL7 frecuentemente contienen elementos repetidos - un mensaje de resultado de laboratorio (ORU) puede tener docenas de segmentos de observación OBX, un paciente puede tener múltiples coberturas de seguro en múltiples segmentos IN1, o un solo campo como identificador de paciente podría contener múltiples valores. La acción foreach le permite procesar cada ocurrencia individualmente.
Variables de Bucle
La estructura foreach básica define un bucle sobre un elemento repetido y asigna cada iteración a una variable de bucle. El editor DTL sugiere nombres de variable de bucle comenzando con k1 para el primer foreach, k2 para foreachs anidados dentro de k1, k3 para foreachs dentro de k2, y así sucesivamente. Estas variables de bucle son números de índice que identifican qué ocurrencia está siendo procesada en la iteración actual.
Ejemplo Práctico
Un escenario común es transformar resultados de laboratorio donde necesita iterar sobre cada segmento OBX en el origen y crear segmentos OBX correspondientes en el destino. La acción foreach iteraría sobre source.OBXgrp(k1), y dentro del cuerpo del bucle, tendría acciones que copian o transforman campos de source.OBXgrp(k1).OBX a target.OBXgrp(k1).OBX. La variable k1 automáticamente se incrementa para cada ocurrencia de segmento, permitiéndole procesar todos los resultados independientemente de cuántos existan.
Bucles Anidados
Los bucles foreach anidados manejan estructuras repetidas multi-nivel. Por ejemplo, podría tener un foreach externo iterando sobre segmentos OBX (k1), y un foreach interno iterando sobre valores repetidos dentro de OBX-5 (k2). El bucle interno referenciaría source.OBXgrp(k1).OBX.5(k2), usando ambas variables de bucle para acceder la ocurrencia específica del campo repetido dentro de la ocurrencia específica del segmento repetido. Comprender el uso de variable de bucle anidada es importante para transformaciones complejas y preguntas de examen.
Referencias de Documentación
5. Aplica acciones if para lógica condicional
Puntos Clave
- Condición if: Aplicar transformación basada en criterios de campo de origen
- Condición en origen: Condiciones típicamente evalúan campos de mensaje de origen
- Acciones anidadas: Usar botón de flecha derecha para anidar acciones dentro de bloque if
- Lógica if/else: Agregar acciones else para rutas de transformación alternativas
Notas Detalladas
Propósito de Lógica Condicional
La lógica condicional es esencial en transformaciones DTL cuando diferentes datos de origen requieren diferente manejo de transformación. La acción if proporciona lógica condicional estándar, ejecutando acciones anidadas solo cuando la condición especificada se evalúa a verdadero. Esto le permite implementar reglas de negocio, manejar datos opcionales, o aplicar diferentes transformaciones basadas en contenido de mensaje.
Definición de Condiciones
Las condiciones if típicamente se definen en campos de mensaje de origen. Por ejemplo, podría verificar si source.PID:8 (género de paciente) es igual a "M" antes de aplicar transformaciones específicas de masculino, o verificar si source.PV1:2 (clase de paciente) es igual a "I" para identificar visitas de paciente interno requiriendo manejo especial. La sintaxis de condición soporta operadores de comparación estándar incluyendo equals (=), not equals (!=), greater than (>), less than (<), y el operador Contains para coincidencia de subcadena.
Anidación de Acciones
Para anidar acciones de transformación dentro de un bloque if, usa el botón de flecha derecha en el editor DTL. Cuando crea una acción if, aparece en la lista de acciones con una estructura expandible/colapsable. Luego crea las acciones que desea ejecutar condicionalmente (como asignaciones de campo u otras acciones if), las selecciona, y usa el botón de flecha derecha para indentarlas bajo la acción if. Esta anidación visual hace la lógica condicional clara y fácil de comprender.
Lógica If/Else
La acción if puede incluir una cláusula else para acciones alternativas cuando la condición es falsa. Esto proporciona lógica if/else completa similar a lenguajes de programación. Por ejemplo, si source.PID:8 = "M", copiar "Male" a target.PID:8, else copiar "Female" a target.PID:8. Las acciones else se anidan bajo la acción if justo como las acciones de condición verdadera, pero marcadas como perteneciendo a la ruta else. Comprender cómo implementar y leer estructuras if/else es importante para transformaciones complejas y escenarios de examen.
Referencias de Documentación
6. Aplica acciones group para organización
Puntos Clave
- Organización visual: Agrupar acciones relacionadas para claridad
- Sin lógica de procesamiento: Los grupos no afectan ejecución o condiciones
- Documentación: Agregar descripciones a grupos para mantenibilidad
- Colapsable: Los grupos pueden colapsarse para simplificar vista DTL compleja
Notas Detalladas
Propósito de Grupos
La acción group en DTL proporciona estructura organizacional para transformaciones complejas pero no agrega ninguna lógica de procesamiento o ejecución condicional. Los grupos son puramente para organización visual y documentación, permitiéndole agrupar acciones de transformación relacionadas juntas con etiquetas descriptivas. Esto hace DTLs grandes más fáciles de comprender, mantener y solucionar problemas.
Creación y Nombramiento de Grupos
Cuando crea una acción group, le da un nombre descriptivo o descripción que explica lo que las acciones agrupadas logran. Por ejemplo, podría crear un grupo llamado "Copy Demographics" conteniendo todas las acciones que transforman campos demográficos de paciente de segmentos PID y PD1, o un grupo llamado "Calculate Financial Class" conteniendo lógica que determina y establece códigos de clase financiera. Estas descripciones sirven como documentación en línea dentro del DTL.
Anidación y Colapsabilidad
Las acciones se anidan dentro de un grupo usando el mismo botón de flecha derecha usado para acciones if y bucles foreach. El grupo crea una sección colapsable en el editor DTL - puede expandir el grupo para ver todas las acciones anidadas, o colapsarlo para mostrar solo el encabezado del grupo. Esta colapsabilidad es valiosa en DTLs grandes con cientos de acciones, permitiéndole enfocarse en secciones específicas mientras oculta otras.
Comportamiento de Ejecución
Es importante comprender que los grupos no tienen efecto en la ejecución. A diferencia de acciones if que ejecutan acciones anidadas solo cuando las condiciones son verdaderas, o acciones foreach que ejecutan acciones anidadas repetidamente, los grupos siempre ejecutan sus acciones anidadas exactamente una vez en orden secuencial. Los grupos tampoco afectan alcance o visibilidad de variable - son puramente organizacionales. Si una pregunta de examen pregunta sobre flujo de ejecución o lógica condicional, los grupos no factorizan en la respuesta.
Referencias de Documentación
7. Aplica acciones switch para múltiples condiciones
Puntos Clave
- Bloque switch: Caso default automático creado
- Condiciones case: Agregar múltiples condiciones case para diferentes escenarios
- Primer match gana: Solo el primer caso coincidente se ejecuta
- Casos restantes se saltan: Casos subsiguientes no se evalúan después de match
- Caso default: Se ejecuta cuando ninguna condición case coincide
Notas Detalladas
Resumen de Switch
La acción switch proporciona lógica de ramificación multi-condición en transformaciones DTL, similar a declaraciones switch/case en lenguajes de programación. Cuando tiene múltiples condiciones posibles que requieren lógica de transformación diferente, switch es frecuentemente más claro y más eficiente que estructuras if/else anidadas. Un bloque switch automáticamente incluye un caso default que se ejecuta cuando ninguna de las condiciones case coincide.
Agregación de Condiciones Case
Después de crear el bloque switch, agrega condiciones case individuales. Cada case define una condición específica para probar (como source.PID:8 = "M" para pacientes masculinos, o source.PV1:2 = "I" para pacientes internos). Bajo cada case, anida las acciones de transformación que deben ejecutarse cuando esa condición es verdadera. Las acciones case pueden incluir cualquier acción DTL - asignaciones de campo, llamadas de función, declaraciones if anidadas, bucles foreach, o incluso otras declaraciones switch.
Comportamiento de Primer Match
Una característica crítica del comportamiento switch es que solo el primer caso coincidente se ejecuta. El motor DTL evalúa condiciones case en orden de arriba hacia abajo. Cuando encuentra el primer case cuya condición es verdadera, ejecuta las acciones anidadas para ese case y luego sale del switch completamente, saltando evaluación de todos los casos restantes. Incluso si múltiples condiciones case serían verdaderas, solo el primer match se ejecuta.
Por ejemplo, considere un switch con case1: source.PID:8 = "M", case2: source.PV1:2 = "I", case3: source.PID:8 = "M" AND source.PV1:2 = "I". Si el mensaje de origen tiene un paciente interno masculino (ambas condiciones verdaderas), solo case1 se ejecuta porque se evalúa primero y coincide. case2 y case3 nunca se evalúan. Este comportamiento de primer match es importante para comprender preguntas de examen sobre flujo de ejecución de switch.
El Caso Default
El caso default se ejecuta cuando ninguna de las condiciones case coincide. Esto proporciona una transformación de respaldo para escenarios inesperados o no manejados. Por ejemplo, si tiene casos para género "M" y "F" pero el mensaje de origen tiene género "U" (desconocido), el caso default se ejecutaría. Comprender cómo default interactúa con las condiciones case es importante para escenarios de examen sobre comportamiento de switch.
Referencias de Documentación
8. Prueba transformaciones DTL
Puntos Clave
- Compilación requerida: Debe compilar DTL antes de probar
- Botón Test: Abre interfaz de prueba con área de entrada de origen
- Segmentos cambiados: Marcados con asterisco (*) o mostrados en rojo
- Persistencia de contenido: Mensaje de origen persiste entre ejecuciones de prueba
- Recordatorio de compilación: Mensaje de error si DTL no compilado
Notas Detalladas
Resumen de Pruebas
El editor DTL incluye funcionalidad de prueba incorporada que le permite validar transformaciones sin desplegarlas a un entorno de producción. Esta capacidad de prueba es esencial para desarrollo y solución de problemas, habilitando iteración rápida en lógica de transformación. Sin embargo, hay requisitos y comportamientos importantes para comprender para prueba DTL efectiva.
Requisito de Compilación
Antes de poder probar un DTL, debe compilarse. Si ha creado un nuevo DTL o hecho cambios desde la última compilación, debe guardar y compilar el DTL antes de probar. Si intenta probar un DTL no compilado o modificado, la interfaz de prueba muestra un mensaje de error indicando que se requiere compilación. Esta es una fuente común de confusión durante desarrollo pero es esencial porque la función de prueba ejecuta la clase DTL compilada, no la definición DTL en el editor.
Uso de la Interfaz de Prueba
Para probar un DTL, haga clic en el botón Test en la barra de herramientas del editor. Esto abre una interfaz de prueba con dos paneles principales: un área de entrada de mensaje de origen arriba, y un área de resultado de mensaje destino abajo. Pega o escribe un mensaje HL7 en el área de origen y hace clic en el botón Transform. El DTL se ejecuta con su mensaje de prueba como entrada, y el mensaje transformado resultante aparece en el área destino.
Identificación de Cambios
La interfaz de prueba ayuda a identificar qué cambió en la transformación marcando segmentos modificados. Los segmentos que fueron agregados, removidos, o tuvieron campos cambiados se marcan con un asterisco (*) en algunas versiones del editor, o se muestran en texto rojo. Este resaltado visual le ayuda a verificar rápidamente que la transformación afectó los segmentos esperados. Sin embargo, la interfaz no resalta campos individuales dentro de segmentos - el marcado está al nivel de segmento.
Persistencia de Mensaje
Un comportamiento importante para comprender es que la interfaz de prueba persiste el mensaje de origen entre ejecuciones de prueba. Después de probar un DTL con un mensaje particular, si hace cambios al DTL y prueba nuevamente, el mismo mensaje de origen todavía está en el área de entrada. No necesita re-pegarlo. Esta persistencia es conveniente para desarrollo iterativo pero puede ser confusa si olvida qué mensaje de prueba está usando.
Referencias de Documentación
Resumen de Preparación para el Examen
Conceptos Críticos a Dominar:
- Clases de mensaje: EnsLib.HL7.Message (mensajes completos), EnsLib.HL7.Segment (subtransformaciones)
- Formato de DocType: Version:MessageType con separador de dos puntos (ej., 2.5:ADT_A01)
- Create=New vs Create=Copy: New=destino vacío, Copy=origen duplicado a destino
- Subtransformaciones: Transformaciones reutilizables a nivel de segmento llamadas desde DTLs de mensaje
- Tipos de acción: Set (copiar), Clear (remover), If (condicional), ForEach (bucles)
- Sintaxis de ruta de propiedad: Notación Segment:Field.Component.Subcomponent
- Funciones: Manipulación de cadenas, formateo de fecha, tablas de lookup
Escenarios Comunes de Examen:
- Seleccionar clase de mensaje apropiada para requisitos DTL
- Elegir Create=New vs Create=Copy para diferentes casos de uso
- Construir subtransformaciones para lógica de segmento reutilizable
- Usar acciones condicionales (If) para transformaciones dependientes de datos
- Aplicar funciones para formateo y conversión de datos
- Probar DTLs con mensajes de muestra
- Depurar errores de transformación
Recomendaciones de Práctica Práctica:
- Crear DTLs con configuraciones tanto Create=New como Create=Copy
- Construir subtransformaciones a nivel de segmento para reutilización
- Usar ForEach para segmentos y campos repetidos
- Aplicar funciones de cadena y fecha en transformaciones
- Configurar tablas de lookup para traducciones de código
- Probar transformaciones con varias muestras de mensaje
- Depurar problemas DTL usando la interfaz de prueba