Algunos ejemplos de Interoperabilidad Programática
Acceso a Producción Programática
Para editar producciones programáticamente (interfaces) puedes usar una combinación de APIs de Interoperabilidad y consultas SQL.
Namespace actual
Es importante conocer el namespace y la producción en la que estás trabajando.
// Object script
// El namespace activo se guarda en esta variable
$$$NAMESPACE
// Imprimir el namespace
Write $$$NAMESPACE
# Python
import iris
# Este método retorna el namespace activo
iris.utils._OriginalNamespace()
# Imprimir el namespace
print(iris.utils._OriginalNamespace())
>>> DEMONSTRACIÓN
Producción activa
También, es importante conocer el nombre de tu producción. Puedes recuperar la producción activa en un namespace usando las siguientes APIs
// ObjectScript
USER>ZN "DEMONSTRATION"
// Obtener la última producción en ejecución
DEMONSTRATION>W ##class(Ens.Director).GetActiveProductionName()
>>> Hospital.HospitalProduction
# Python
import os
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'
import iris
active_production = iris.cls('Ens.Director').GetActiveProductionName()
print(active_production)
>>> Hospital.HospitalProduction
Cómo encontrar elementos en una producción
Puedes usar Objectscript o Python para encontrar elementos activos en la producción
1. Consulta SQL para obtener elementos en producción
SELECT Name FROM Ens_Config.Item Where Production = 'Hospital.HospitalProduction'
--
['From_Athena_Multi']
['From_Athena_Multi_Router']
['From_Cerner_ADT']
['From_Cerner_ADT_Router']
['From_Cerner_Orders']
['From_Cerner_Orders_Router']
['From_Dictaphone_Results']
['From_Dictaphone_Results_Router']
['From_Lab_Results']
['From_Lab_Results_Router']
['From_Radiology_Results']
['From_Radiology_Results_Router']
['HS.IHE.XDSb.DocumentSource.Operations']
['HS.IHE.XDSb.Repository.Operations']
['To_Cerner_Results']
['To_Dictaphone']
['To_Intellilab']
['To_Lab']
['To_Radiology']
--
2. Consulta SQL para obtener elementos activos en producción
SELECT Name, ClassName
FROM Ens_Config.Item
WHERE Production = 'Hospital.HospitalProduction'
AND Enabled = 1
--
Name ClassName
To_Radiology EnsLib.HL7.Operation.FileOperation
To_Lab EnsLib.HL7.Operation.FileOperation
To_Dictaphone EnsLib.HL7.Operation.FileOperation
From_Cerner_ADT EnsLib.HL7.Service.FileService
From_Cerner_ADT_Router EnsLib.HL7.MsgRouter.RoutingEngine
From_Radiology_Results_Router EnsLib.HL7.MsgRouter.RoutingEngine
From_Lab_Results_Router EnsLib.HL7.MsgRouter.RoutingEngine
From_Dictaphone_Results_Router EnsLib.HL7.MsgRouter.RoutingEngine
To_Intellilab EnsLib.HL7.Operation.FileOperation
To_Cerner_Results EnsLib.HL7.Operation.FileOperation
From_Cerner_Orders_Router EnsLib.HL7.MsgRouter.RoutingEngine
From_Athena_Multi_Router EnsLib.HL7.MsgRouter.RoutingEngine
HS.IHE.XDSb.DocumentSource.Operations HS.IHE.XDSb.DocumentSource.Operations
--
3. Acceso por ObjectScript a elementos de la Producción
// ObjectScript
// Acceso para obtener todos los elementos de una producción activa
// Devuelve la lista de elementos
ClassMethod ListItemsInProduction()
{
Set productionName = ##class(Ens.Director).GetActiveProductionName()
Set items = []
&sql(Declare curr cursor FOR Select Name into :newId from Ens_Config.Item Where Production = :productionName)
&sql(OPEN curr)
For {
&sql(FETCH curr)
Quit:SQLCODE
Do items.%Push(newId)
}
&sql(CLOSE curr)
quit items
}
>>> zw ##class(ISC.SE.ProductionTools).ListItemsInProduction()
["From_Athena_Multi","From_Athena_Multi_Router","From_Cerner_ADT","From_Cerner_ADT_Router","From_Cerner_Orders","From_Cerner_Orders_Router","From_Dictaphone_Results","From_Dictaphone_Results_Router"
,"From_Lab_Results","From_Lab_Results_Router","From_Radiology_Results","From_Radiology_Results_Router","HS.IHE.XDSb.DocumentSource.Operations","HS.IHE.XDSb.Repository.Operations","To_Cerner_Results"
,"To_Dictaphone","To_Intellilab","To_Lab","To_Radiology"] ; <DYNAMIC ARRAY>
# Python
# Obtención del entorno de datos de los elementos activos de la producción
import os
# Definición de variables de entorno
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'
import iris
def getActiveProductionItems():
productionName = iris.cls('Ens.Director').GetActiveProductionName()
df = iris.sql.exec("SELECT Name FROM Ens_Config.Item Where Production = '{}'".format(productionName))
return df
production_items_df = getActiveProductionItems().dataframe()
# name
# 0 From_Athena_Multi
# 1 From_Athena_Multi_Router
# 2 From_Cerner_ADT
# 3 From_Cerner_ADT_Router
# 4 From_Cerner_Orders
# 5 From_Cerner_Orders_Router
# 6 From_Dictaphone_Results
# 7 From_Dictaphone_Results_Router
# 8 From_Lab_Results
# 9 From_Lab_Results_Router
# 10 From_Radiology_Results
# 11 From_Radiology_Results_Router
# 12 HS.IHE.XDSb.DocumentSource.Operations
# 13 HS.IHE.XDSb.Repository.Operations
# 14 To_Cerner_Results
# 15 To_Dictaphone
# 16 To_Intellilab
# 17 To_Lab
# 18 To_Radiology
Cómo manipular producciones vía API
1. Añadir componentes
// ObjectScript
set productionName = ##class(Ens.Director).GetActiveProductionName()
//crear un nuevo servicio de archivos xml
set classname="EnsLib.XML.FileService" //clase de este elemento
set name="NewService" //nombre de la configuración
set item=##class(Ens.Config.Item).%New(classname)
set item.Name=name
set item.Comment = "Test Service"
set item.PoolSize = "1"
set item.Enabled = 1
do item.%Save()
//
// Abrir la clase de la producción
// set prod="Test.configtest" //el nombre de la producción se define manualmente
// O
set prod = productionName
set prodObj=##class(Ens.Config.Production).%OpenId(prod)
//se graba el nuevo elemento
set tSC=prodObj.Items.Insert(item)
set tSC=prodObj.SaveToClass(item)
set tSC=prodObj.%Save()
// ELIMINACIÓN del elemento anterior
set tSC = prodObj.RemoveItem(item)
set tSC = prodObj.SaveToClass()
set tSC=prodObj.%Save()
# Python
import os
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'
import iris
active_production = iris.cls('Ens.Director').GetActiveProductionName()
print("Current Production {}".format(active_production))
# Metadata sobre el componente
classname="EnsLib.XML.FileService" # clase de esta elemento
name="NewService" # nombre de la configuración
item=iris.cls('Ens.Config.Item')._New(classname) # Creación del nuevo componente
item.Name=name
item.Comment = "Test Service"
item.PoolSize = "1"
item.Enabled = 1
item._Save()
# Se carga la clase de la producción
# prod="Test.configtest" # el nombre de la producción se define manualmente
# O se usa la producción activa anterior
prod = active_production
prodObj=iris.cls('Ens.Config.Production')._OpenId(prod)
# grabamos la producción después de insertar el elemento en ella
tSC=prodObj.Items.Insert(item)
tSC=prodObj.SaveToClass(item)
tSC=prodObj._Save()
# ELIMINAMOS el elemento anterior
tSC = prodObj.RemoveItem(item)
tSC = prodObj.SaveToClass()
tSC=prodObj._Save()
2. Deshabilitar / Habilitar Componentes
// ObjectScript
set productionName = ##class(Ens.Director).GetActiveProductionName()
set itemName = "My.Inbound.HL7"
// Obligatorio para habilitar el elemento
Set componentName = productionName _ "||" _ itemName _ "|"
// Habilitar or deshabilitar
Set enable = 1 // or 0
Do ##class(Ens.Director).EnableConfigItem(componentName, enable, 1)
/// Habilitar o deshabilitar un ConfigItem en una producción. La producción puede estar activa o no.
/// El argumento pConfigItemName proporciona el nombre del elemento de configuración para habilitar o deshabilitar
/// En el caso de múltiples coincidencias de elementos con el mismo nombre de configuración, si alguno ya está habilitado entonces
/// la opción pEnable=1 no hará nada y la opción pEnable=0 deshabilitará el elemento de la producción activa o, si no está activa,
/// el primer elemento coincidente que esté habilitado que encuentre.
///
/// Ver el método Ens.Director.ParseConfigName() para ver la sintáxis del string de especificación del nombre del ConfigItem.
ClassMethod EnableConfigItem(pConfigItemName As %String, pEnable As %Boolean = 1, pDoUpdate As %Boolean = 1)
# Python
import os
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'
import iris
active_production = iris.cls('Ens.Director').GetActiveProductionName()
item_name = "My.Inbound.HL7"
componentName = active_production + "||" + item_name + "|"
enable = 1 # or 0
iris.cls('Ens.Director').EnableConfigItem(componentName, enable, 1)
Estado de la producción a través de API
// ObjectScript
/// Este método devuelve el estado de la producción por los parámetros de salida.
/// pProductionName: Devuelve el nombre de la producción cuando el estado es en ejecución, suspendida o con problemas.
/// pState: Salidas del estado de la producción. Los valores válidos son:
/// $$$eProductionStateRunning == 1
/// $$$eProductionStateStopped == 2
/// $$$eProductionStateSuspended == 3
/// $$$eProductionStateTroubled == 4
Set sc = ##class(Ens.Director).GetProductionStatus(.productionName, .productionState)
Write productionName, " -- ", productionState
import os
# Configurar el namespace a las malas
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'
import iris
# TEST 2 con variables de salida
productionName, productionState = iris.ref('productionName'), iris.ref('productionState')
status = iris.cls('Ens.Director').GetProductionStatus(productionName, productionState)
print("Status: {}".format(status))
# ver .value
print("Production: {}".format(productionName.value))
# ver .value
print("Production State: {}".format(productionState.value))
Comentarios (0)0