プログラムによるインターオペラビリティの実行例
プログラムによる本番環境アクセス
プログラムで本番環境(インターフェース)を編集するには、相互運用性 apis と SQL クエリを組み合わせて使用できます。
現在のネームスペース
大まかに言えば、その時点で作業しているネームスペースと本番環境を知ることが重要です。
// Object script
// アクティブなネームスペースはこの変数に格納される
$$$NAMESPACE
// ネームスペースを出力
Write $$$NAMESPACE
# Python
import iris
# このメソッドからアクティブなネームスペースが返される
iris.utils._OriginalNamespace()
# ネームスペースを出力
print(iris.utils._OriginalNamespace())
>>> DEMONSTRATION
現在の本番環境(アクティブまたは最後に実行した本番環境)
本番環境の名前を知ることも重要です。次の API を使用してネームスペース内のアクティブな本番環境を取得できます。
// ObjectScript
USER>ZN "DEMONSTRATION"
// 現在または最後に実行した本番環境を取得
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
本番環境内の項目を検索する
ObjectScript または Python を使用して、本番環境内のアクティブな項目を検索できます。
1. SQL クエリで本番環境内の項目を調べる
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. SQL クエリで本番環境内のアクティブな項目を調べる
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. 本番環境内の項目にアクセスするオブジェクト
// ObjectScript
// アクティブな本番環境内のすべての項目を取得するアクセス
// 項目のリストを返す
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
# Get Dataframe of active production items
import os
# Set environment variables
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
API 経由で本番環境を操作する
1. コンポーネントを追加する
// ObjectScript
set productionName = ##class(Ens.Director).GetActiveProductionName()
//新しい xml ファイルサービスを作成
set classname="EnsLib.XML.FileService" //この項目のクラス
set name="NewService" //構成名
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()
//
// 本番環境クラスを開く
// prod="Test.configtest" を設定 //本番環境名を手動で設定
// または
set prod = productionName
set prodObj=##class(Ens.Config.Production).%OpenId(prod)
// 新しい項目を保存
set tSC=prodObj.Items.Insert(item)
set tSC=prodObj.SaveToClass(item)
set tSC=prodObj.%Save()
// 上記から項目を削除
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))
# コンポーネントに関するメタデータ
classname="EnsLib.XML.FileService" # この項目のクラス
name="NewService" # 構成名
item=iris.cls('Ens.Config.Item')._New(classname) # 新しいコンポーネントを作る
item.Name=name
item.Comment = "Test Service"
item.PoolSize = "1"
item.Enabled = 1
item._Save()
# 本番環境クラスを開く
# prod="Test.configtest" # 本番環境名を手動で設定
# または上記のアクティブな本番環境名を使用
prod = active_production
prodObj=iris.cls('Ens.Config.Production')._OpenId(prod)
# 項目を挿入したら本番環境を保存
tSC=prodObj.Items.Insert(item)
tSC=prodObj.SaveToClass(item)
tSC=prodObj._Save()
# 上記から項目を削除
tSC = prodObj.RemoveItem(item)
tSC = prodObj.SaveToClass()
tSC=prodObj._Save()
2. コンポーネントを無効化/有効化する
// ObjectScript
set productionName = ##class(Ens.Director).GetActiveProductionName()
set itemName = "My.Inbound.HL7"
// 項目の有効化に必要
Set componentName = productionName _ "||" _ itemName _ "|"
// 無効化または有効化
Set enable = 1 // または 0
Do ##class(Ens.Director).EnableConfigItem(componentName, enable, 1)
/// 本番環境内で構成項目を有効化または無効化します。 本番環境は実行中であってもなくても構いません。
/// pConfigItemName 引数は、有効化または無効化される構成項目名を指定します。
/// 同じ構成名を持つ項目が複数一致し、そのいずれかがすでに有効化されている場合は、
/// pEnable=1 オプションの効果はなく、pEnable=0 オプションによって実行中の一致する
/// 本番環境項目が無効化されます。実行中でない場合は、最初に一致する有効な項目が無効化されます。
///
/// 構成項目名の仕様の文字列の完全な構文については、Ens.Director.ParseConfigName() メソッドをご覧ください。
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)
API による本番環境ステータス
// ObjectScript
/// このメソッドは、出力パラメーター経由で本番環境のステータスを返します。
/// pProductionName: ステータスが running、suspended、または troubled の場合に、その本番環境名を返します。
/// pState: 本番環境のステータスを出力します。 有効な値:
/// $$$eProductionStateRunning == 1
/// $$$eProductionStateStopped == 2
/// $$$eProductionStateSuspended == 3
/// $$$eProductionStateTroubled == 4
Set sc = ##class(Ens.Director).GetProductionStatus(.productionName, .productionState)
Write productionName, " -- ", productionState
import os
# ネームスペースを難しい方法で設定
os.environ['IRISNAMESPACE'] = 'DEMONSTRATION'
import iris
# 出力変数を使用したテスト2
productionName, productionState = iris.ref('productionName'), iris.ref('productionState')
status = iris.cls('Ens.Director').GetProductionStatus(productionName, productionState)
print("Status: {}".format(status))
# .value を表示
print("Production: {}".format(productionName.value))
# .value を表示
print("Production State: {}".format(productionState.value))
ディスカッション (0)0