Rechercher

Announcement
· Jul 4, 2024

积极参与社区互动,赢取中文社区最佳贡献奖!

👉即日起积极参与社区互动,就有机会获得赠书《AI医疗革命》(中文版)!

Hi 开发者们,

为鼓励大家积极参与社区建设,即日起我们将持续、按月举办💡“中文社区最佳贡献奖”💡活动。

📅  活动简介

我们会在每个月的新增成员现有成员中分别抽取一名当月积分最高的社区成员,奉上“中文社区最佳贡献奖”,奖品为《AI医疗革命》(中文繁体译版)一本。本书中文简体译版为《超越想象的GPT医疗》,原著The AI REVOLUTION IN MEDICINE(GPT-4 AND BEYOND) 出版于2023年,作者Peter Lee,Carey Goldberg,Isaac Kohane分享了以GPT-4 为代表的大语言模型在医学领域的诸多应用可能性,更重要的是向大家展现了一种可能出现的人- 机相结合的“关系”范式。本书(中文简体译版)也在CHIMA 2024期间作为优秀图书得到了推荐,值得一读。

🎉  哪些成员可以参与?

InterSystems开发者社区中文社区现有成员,以及当月新加入中文社区的成员(非InterSystems员工),均在此次活动范围。

✅如何参与?

我们欢迎您在社区进行以下互动:

  • 发布文章/经验帖;
  • 在Open Exchange发布应用;
  • 在现有的帖子下,积极发布有效评论/回复;
  • 将英文社区的文章翻译到中文社区;
  • 邀请新成员加入开发者社区(如果您邀请了新成员,请通过站内信联系 @Claire Zheng 并告知)。

🎁  获奖须知

  • 每位社区成员仅有一次获奖机会,我们会在抽奖时排除已获得过“中文社区最佳贡献奖”的成员。
  • 我们会于次月公布上月的获奖者,通过开发者社区站内信与获奖者取得联系并进行奖品邮寄。敬请您留意。

 🍀 如果您对此次活动有任何疑问,欢迎跟帖提问!🍀 

Discussion (0)1
Log in or sign up to continue
Article
· Jul 4, 2024 9m read

Embedded Python利用時にエラーが発生した場合の対応方法のご紹介

これは InterSystems FAQ サイトの記事です。

PythonスクリプトファイルやPythonで記述されたIRIS内メソッドを呼び出す際、エラーが発生した場合の対応方法をご紹介します。

説明使用するコードや資料PDFは公開しています👉 test1.pyFS.Utilsクラスコードのコピー元ビデオで解説している資料PDF

Embedded Python 自習用ビデオをご用意しています(項目別にYouTubeプレイリストをご用意しています)。

各プレイリストについて詳しくはこちらをご参照ください👉【はじめてのInterSystems IRIS】Embedded Python セルフラーニングビデオシリーズ公開!

Python側でエラーが発生した場合、ObjectScriptのシステムエラーとして取り扱うことができます。

具体的に確認してみましょう。

解説と実行例については以下のビデオの 最初~03:57までで解説しています。

例えば、以下メソッドの第2引数に0を指定すると'ZeroDivisionError'エラーが発生します。IRISから呼び出した場合は、このエラーは特殊変数$ZERRORにセットされます(=ObjectScriptでエラーが発生したときと同じ状況になります)

ClassMethod errtest1(a As %Integer, b As %Integer) As %Integer [ Language = python ]
{
    result=a/b
    return result
}

 

IRISから実行した場合の結果は以下の通りです(特殊変数$ZERRORにエラー文字列が設定されていることを確認できます)。

コマンド例は以下の通りです。

do ##class(FS.Utils).errtest1(1,0)

ターミナル実行例は以下の通りです。

USER>do ##class(FS.Utils).errtest1(1,0) 

DO ##CLASS(FS.Utils).errtest1(1,0) 
^
<THROW> *%Exception.PythonException <PYTHON EXCEPTION> 246 <class 'ZeroDivisionError'>: division by zero
USER>w $ZE
<THROW> *%Exception.PythonException <PYTHON EXCEPTION> 246 <class 'ZeroDivisionError'>: division by zero
USER>

 

次に、Pythonのコード内で%Statusのエラーが発生した場合はどうなるでしょうか。

下記コードの解説と実行例については、ビデオの 03:37~ 07:43まで解説しています。

《ObjectScript》

ClassMethod statustest() [ Language = python ]
{
    import iris
    try:
        a=iris.cls("FS.Person")._New()
        a.DOB="ThisIsError"
        st=a._Save()
        iris.check_status(st)
    except RuntimeError as ex:
        print("pythonのエクセプション!")
        print(str(repr(ex)))
        raise
}

コマンド例は以下の通りです。

write ##class(FS.Utils).errtest1(1,0)

ターミナル実行例は以下の通りです。

USER>write ##class(FS.Utils).errtest1(1,0)

WRITE ##CLASS(FS.Utils).errtest1(1,0)
^
<THROW> *%Exception.PythonException <PYTHON EXCEPTION> 246 <class 'ZeroDivisionError'>: division by zero
USER>

 

《Pythonスクリプト》

def err1(a,b):
    result=a/b
    return result

コマンド例は以下の通りです。

set sys=##class(%SYS.Python).Import("sys")
do sys.path.append("c:\WorkSpace\TryIRIS")
set test1=##class(%SYS.Python).Import("test1")
write test1.err1(1,0)

ターミナル実行例は以下の通りです。

USER>set sys=##class(%SYS.Python).Import("sys")

USER>do sys.path.append("c:\WorkSpace\TryIRIS")

USER>set test1=##class(%SYS.Python).Import("test1")

USER>write test1.err1(1,0)

WRITE test1.err1(1,0)
^
<THROW> *%Exception.PythonException <PYTHON EXCEPTION> 246 <class 'ZeroDivisionError'>: division by zero
USER>

 

SQL実行時のエラーはどうなるでしょうか。

下記コードの解説と実行例については、ビデオの07:43~09:06 をご参照ください。

《Pythonスクリプト》

def sqlerr():
    import iris
    import irisbuiltins
    try:
        sql="select * from Training.Person"
        rset=iris.sql.exec(sql)
        for key,val in enumerate(rset):
            print(val)

    except irisbuiltins.SQLError as ex:
        print(str(repr(ex)))
        print(ex.sqlcode)
        print(ex.message)
        print(ex.statement)
        raise

一連のコマンド例は以下の通りです。

//ローカル変数に何も設定されていない事を確認します
write
//システムエラーが発生した場合に$ZE特殊変数に情報が設定されます
write $ZE
// Pythonシェル起動
do ##class(%SYS.Python).Shell()
## 以下Pythonシェルで実行
import sys
sys.path+=["c:\WorkSpace\TryIRIS"]
import test1
test1.sqlerr()
quit()
// 以下IRISターミナルで実行
write $ZE
// %objlasterrorが存在すると、エラーメッセージが表示されます。
do $system.OBJ.DisplayError()

ターミナル実行例は以下の通りです。

USER>write

USER>write $ZE

USER>:py  //またはdo ##class(%SYS.Python).Shell()

Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type quit() or Ctrl-D to exit this shell.
>>> import sys
>>> sys.path+=["c:\WorkSpace\TryIRIS"]
>>> import test1
>>> test1.sqlerr()
SQLError(" テーブル 'TRAINING.PERSON' が見つかりません")
-30
 テーブル 'TRAINING.PERSON' が見つかりません
select * from Training.Person
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "c:\WorkSpace\TryIRIS\test1.py", line 36, in sqlerr
    rset=iris.sql.exec(sql)
irisbuiltins.SQLError:  テーブル 'TRAINING.PERSON' が見つかりません
>>> quit()

USER>write $ZE
<SYNTAX>errdone+2^%qaqqt

 

《2024/7/8確認》ビデオで触れていませんがこの時点で、%Statusのエラーが生成され %objlasterror変数に直近のエラー情報がセットされています。(Pythonシェルで受け取ったエラーと同様の情報を確認できます。)

USER>write

%objlasterror="0 ÞâB Æ0ü0Ö0ë0 'TRAINING.PERSON' L0d0K00~0[00USER
                                                                e^exec+3^%SYS.Python.SQL.1^1e^^%SYS.Python.1^0w^Shell+47^%SYS.Python.1^1-e^%DispatchClassMethod+2^%SYSTEM.Python.1^1d^^^0"
USER>do $system.OBJ.DisplayError()
エラー #5521: SQLエラー: SQLCODE=-30 %msg= テーブル 'TRAINING.PERSON' が見つかりません
USER>

 

%Statusのエラーの表示方法ついて詳しくは、ObjectScriptクックブックの「%Statusのエラーが戻ってきたら

 

Python側でエラー処理を書かない場合の説明についてはビデオ 09:06~ ご参照ください。


 

続いて、Embedded Python利用時にエラーが発生した場合のエラー処理例をご紹介します。

戻り値でエラーだったことを報告する例(Pythonスクリプトの例)の解説は、ビデオの最初~1:48までをご参照ください。

 

戻り値でエラーだったことを報告する例(language=pythonの例)は、以下ビデオの1:48~3:16で解説しています。

コード例は以下の通りです。

《Pythonスクリプト》

def err2(a,b):
    try:
        if b==1:
            modori="1で割っても答えは同じです"
            return modori
        print(f"割り算の答えは={a/b}")
        modori="OK"
        return modori
    except ZeroDivisionError as ex:
        modori=str(repr(ex))
        print(modori)
        return modori

《IRISからのコマンド実行例》

set sys=##class(%SYS.Python).Import("sys")
do sys.path.append("C:\WorkSpace\TryIRIS")
set errtest=##class(%SYS.Python).Import("test1")
set ret=errtest.err2(2,2) write ret
set ret=errtest.err2(2,1)
write ret
set ret=errtest.err2(2,0)
write ret

ターミナル実行例は以下の通りです。

USER>set sys=##class(%SYS.Python).Import("sys")

USER>do sys.path.append("C:\WorkSpace\TryIRIS")

USER>set errtest=##class(%SYS.Python).Import("test1")

USER>set ret=errtest.err2(2,2) write ret
割り算の答えは=1.0
OK
USER>set ret=errtest.err2(2,1)

USER>write ret
1で割っても答えは同じです
USER>set ret=errtest.err2(2,0)
ZeroDivisionError('division by zero')

USER>write ret
ZeroDivisionError('division by zero')
USER>

 

《ObjectScriptの例》

ClassMethod errtest2(a As %Integer, b As %Integer) As %Integer [ Language = python ]
{
    try:
        if b==1:
            modori="1で割っても答えは同じです"
            return modori
        print(f"割り算の答えは={a/b}")
        modori="OK"
        return modori
    except ZeroDivisionError as ex:
        modori=str(repr(ex))
        print(modori)
        return modori
}

コマンド実行例は以下の通りです。

set modori=##class(FS.Utils).errtest2(2,2)
write modori
set modori=##class(FS.Utils).errtest2(2,1)
write modori
set modori=##class(FS.Utils).errtest2(2,0)
write modori

ターミナル実行例は以下の通りです。

USER>set modori=##class(FS.Utils).errtest2(2,2)
割り算の答えは=1.0

USER>write modori
OK
USER>set modori=##class(FS.Utils).errtest2(2,1)

USER>write modori
1で割っても答えは同じです
USER>set modori=##class(FS.Utils).errtest2(2,0)
ZeroDivisionError('division by zero')

USER>write modori
ZeroDivisionError('division by zero')
USER>

 

戻り値でエラーだったことを報告する例(%Statusを戻す場合)は、ビデオの3:38~5:22で解説しています。

コード例は以下の通りです。

《ObjectScriptの例》

ClassMethod errtest3(a As %Integer, b As %Integer) As %Status [ Language = python ]
{
    import iris
    try:
        print(a/b)
        ret=1
    except Exception as ex:
        moji="エラーが発生しました!"+str(repr(ex))
        ret=iris.system.Status.Error(5001,moji)
    return ret
}

コマンド実行例は以下の通りです。

set status=##class(FS.Utils).errtest3(1,0)
write $system.Status.GetErrorText(status)
set status=##class(FS.Utils).errtest3(1,1)
write status

ターミナル実行例は以下の通りです。

USER>set status=##class(FS.Utils).errtest3(1,0)

USER>write $system.Status.GetErrorText(status)
エラー #5001: エラーが発生しました!ZeroDivisionError('division by zero')
USER>set status=##class(FS.Utils).errtest3(1,1)
1.0

USER>write status
1
USER>

 

try: except: を使う + raise でそのままIRISに例外を戻す例と解説は以下ビデオ5:22~最後までご覧ください。

《Pythonスクリプトの例》

def err3(a,b):
    try:
        ret=a/b
        print(ret)
    except:
        raise

《ObjectScriptコード例》

ClassMethod errtest4() As %Status
{
    #dim ex As %Exception.AbstractException
    try {
        set sys=##class(%SYS.Python).Import("sys")
        do sys.path.append("C:\WorkSpace\TryIRIS")
        set errtest=##class(%SYS.Python).Import("test1")
        do errtest.err3(1,0)
    }
    catch ex {
        write "エラーが発生しました:",ex.DisplayString(),!
        //例外から%Statusに変換
        set st=ex.AsStatus()
        //例外からSQLCODEとメッセージを取得
        set SQLCODE=ex.AsSQLCODE()
        set SQLMessage=ex.AsSQLMessage()
    }
} 

コマンド実行例は以下の通りです。

do ##class(FS.Utils).errtest4()

ターミナル実行例は以下の通りです。

USER>do ##class(FS.Utils).errtest4()
エラーが発生しました:<PYTHON EXCEPTION> 246 <class 'ZeroDivisionError'>: division by zero

USER>
Discussion (0)1
Log in or sign up to continue
Question
· Jul 4, 2024

JWT enabled FHIR Server web app access

Hello Community,

I've configured a FHIR Server in FHIR Configuration "/csp/healthshare/learn1/fhir/r4 " and I enabled a JWT Authentication for this web application. I've invoked this url http://localhost:52773/csp/healthshare/learn1/fhir/r4/login with basic auth get the JWT token. Now I use the access token as a "Bearer" for GET the patient resource. But I got 401Unauthorized error. Anyway I can get the patient resource with basic auth. I tired assign with %ALL role for testing as well. Did I miss any additional configuration in "FHIR Server Configuration"

 

Discussion (0)1
Log in or sign up to continue
Article
· Jul 4, 2024 5m read

Application de génération de tests de messagerie HL7

Nous avons récemment mis en ligne sur OpenExchange une petite application que j'ai développée il y a quelque temps (et que @Jose-Tomas Salvador a améliorée et peaufinée) que j'utilise souvent lorsque j'ai besoin de générer de gros volumes de messagerie HL7.

L'application est développée en NodeJS et fonctionne en générant des données de patients et de médecins à partir de fichiers de départ que vous pouvez modifier à votre guise pour personnaliser les patients générés. L'application utilisera les patients générés pour préparer différents types de messages HL7. Pour le moment, l'application peut générer les types de messages suivants. Si le nombre de messages demandés dépasse le nombre de patients, les messages seront générés sur eux, créant ainsi plusieurs messages pour le même patient avec des heures différentes.

ADT^A08

Mettre à jour les données des patients avec les observations associées.

MSH|^~\&|HIS|HULP|EMPI||20240305120344||ADT^A08|176690|P|2.5.1
EVN|A08|20240305120344
PID|||1556655212^^^SERMAS^SN~230546^^^HULP^PI||GARCÍA PÉREZ^JUAN^^^||20150403|M|||PASEO PEDRO ÁLVAREZ 195 1 CENTRO^^LEGANÉS^MADRID^28379^SPAIN||555283055^PRN^^JUAN.GARCIA@YAHOO.COM|||||||||||||||||N|
PV1||N
OBX|1|NM|162986007^Pulso^SNM||79|^bpm|||||F|||20240305120344
OBX|2|NM|105723007^Temperatura^SNM||37|^Celsius|||||F|||20240305120344
OBX|3|NM|163030003^Presión sanguínea sistólica^SNM||139|^mmHg|||||F|||20240305120344
OBX|4|NM|163031004^Presión sanguínea diastólica^SNM||91|^mmHg|||||F|||20240305120344

ADT^A28

Ajoutez des informations sur le patient.

MSH|^~\&|HIS|HULP|EMPI||20240305120319||ADT^A28|377160|P|2.5.1
EVN|A28|20240305120319|20240305120319|1
PID|||1556655212^^^SERMAS^SN~922210^^^HULP^PI||GARCÍA PÉREZ^JUAN^^^||20150403|M|||PASEO PEDRO ÁLVAREZ^195 1 CENTRO^LEGANÉS^MADRID^28379^SPAIN||555283055^PRN^^JUAN.GARCIA@YAHOO.COM|||||||||||||||||N|
PV1||N
AL1|1|MA|^Polen de gramineas^|SV^^||20440605172902

SIU^S12

Nouveau rendez-vous patient.

MSH|^~\&|HIS|HULP|EMPI||20240305120758||SIU^S12|298114|P|2.5.1
SCH|607860^607860|92610^92610|||607860|TRA02^Visita de revisión de traumatología|Visita sucesiva trauma|TRA02|15|m|^^15^20240305161758^20240305163258|||||^GARCÍA ROJO^ÁLVARO^||||^GARCÍA GARCÍA^DIANA^|||||Scheduled
PID|||1556655212^^^SERMAS^SN~922210^^^HULP^PI||GARCÍA PÉREZ^JUAN ALBERTO^^^||20150403|M|||CALLE MARÍA JUAREZ 23 2A^^MÓSTOLES^MADRID^28045^SPAIN||555283055^PRN^^JUAN.GARCIA@YAHOO.COM|||||||||||||||||N|
PV1|1|O|||||^ ^^^MD^^^^|^ ^^^MD^^^^||||||||||||||||||||||||||||||||||||||||||||
RGS|1|A
AIS|1|A|^|20240305161758|||15|m^Minutes||Scheduled
AIL|1|A|TRA02^^^|^||20240305161758|||15|m^Minutes||Scheduled
AIP|1|A|1^ ^^A^MD^^^^|D^, ||20240305161758|||15|m^Minutes||Scheduled

ORU^R01

Transmission non sollicitée de l’observation demandée.

MSH|^~\&|HIS|CHGM|EMPI||20240305121511||ORU^R01|16955|P|2.5.1
PID|||1556655212^^^SEGSOC^SSN~230546^^^CHGM^PI||GARCÍA PÉREZ^JUAN^^^||20150403|M|||PASEO PEDRO ÁLVAREZ 195 1 CENTRO^^LEGANÉS^MADRID^28379^SPAIN||555283055^PRN^^JUAN.GARCIA@YAHOO.COM|||||||||||||||||N|
PV1||O|||||079492022O^GARCÍA FERNÁNDEZ^PETRONILA^^MD^^^^|||||||1|||||450908|||||||||||||||||||||||||20240305121511|20240305121511
ORC|1|193683|8680||||^^^20240305121511||20240305121511|||0631438066E^MARGALL GARCÍA^MARCOS^^MD^^^^|CHGM||||||||CHGM||||||||LAB
OBR|1|193683|8680|LAB^LABORATORY^L||||||||||||0631438066E^MARGALL GARCÍA^MARCOS^^MD^^^^|||||||||F
OBX|1|NM|WBC^Conteo de glóbulos blancos^SNM||2.0|10(9)/L|4.0-10.6||||F|||20240305121511
OBX|2|NM|RBC^Conteo de glóbulos rojos^SNM||3.0|10x12/L|4.5-5.9||||F|||20240305121511
OBX|3|NM|HGB^Hemoglobina^SNM||13.0|g/dL|12.0-16.0||||F|||20240305121511
OBX|4|NM|HCT^Hematocrito^SNM||48.0|%|36.0-46.0||||F|||20240305121511
OBX|5|NM|MCV^Volumen celular medio^SNM||75|fL|80-100||||F|||20240305121511
OBX|6|NM|MCH^Hemoglobina celular media^SNM||22.0|pg|26-34||||F|||20240305121511
OBX|7|NM|MCHC^Concentración de hemoglobina celular media^SNM||24.0|g/dL|31-37||||F|||20240305121511
OBX|8|NM|RDW^Ancho de distribución eritrocitaria^SNM||15.0|%|11.5-14.5||||F|||20240305121511
OBX|9|NM|PLT^Conteo de plaquetas - Automatizado^SNM||284|10(9)L|140-440||||F|||20240305121511
OBX|10|NM|MPV^Volumen de plaquetas medio^SNM||10.0|UMx1000|8-11||||F|||20240305121511
OBX|11|NM|NE^# Neutrófilos^SNM||6.00|#|1.8-8.5||||F|||20240305121511
OBX|12|NM|LY^# Linfa^SNM||2.00|#|0.8-3.5||||F|||20240305121511
OBX|13|NM|MO^# Monocitos^SNM||0.00|#|0.2-0.9||||F|||20240305121511
OBX|14|NM|EO^# Eosinófilos^SNM||0.00|#|0.0-0.6||||F|||20240305121511
OBX|15|NM|BA^# Basófilos^SNM||0.00|#|0.0-0.2||||F|||20240305121511
OBX|16|NM|PERCENTNE^% Neutrófilos^SNM||57.0|%|40-80||||F|||20240305121511
OBX|17|NM|PERCENTLY^% Linfa^SNM||19.0|%|15-45||||F|||20240305121511
OBX|18|NM|SEG^Neutrófilos segmentados^SNM||55.0|%|50-75||||F|||20240305121511
OBX|19|NM|LYMPHS^Linfocitos^SNM||37.0|%|20-44||||F|||20240305121511
OBX|20|NM|MONO^Monocitos^SNM||2.0|%|2-9||||F|||20240305121511
OBX|21|NM|ATYP^Linfocitos atípicos^SNM||33|%|0-100||||F|||20240305121511

Comment ça fonctionne

Le README.md associé au projet explique comment déployer l'application. Pour y accéder, il vous suffira de saisir l'URL dans votre navigateur internet : http://localhost:5000, et la fenêtre principale s'ouvrira automatiquement.

Ci-dessous vous pouvez indiquer le nombre de patients souhaités et le nombre de médecins. Avec les deux fichiers générés, vous pouvez générer autant de messages que vous le souhaitez des types décrits ci-dessus.

Vous avez la possibilité de générer des messages pour différentes autorités assignatrices (l'organisme qui attribue le numéro d'historique) ainsi que différents identifiants des patients (numéro de sécurité sociale, NIF, etc...).

Comme vous pouvez le constater, il s'agit d'une application basique, n'hésitez pas à modifier ce que vous souhaitez et à l'adapter à vos besoins et si vous avez des questions à ce sujet, écrivez-les dans les commentaires.

Pd. : Les fichiers sont en espagnol, désolé !

Discussion (0)1
Log in or sign up to continue
Article
· Jul 4, 2024 1m read

How to change the special variable $ZTIMESTAMP to your local time zone

InterSystems FAQ rubric

$ZTIMESTAMP returns the date and time in UTC format, so to change it to the local time zone, use the following system method: 

$SYSTEM.Util.UTCtoLocalWithZTIMEZONE($ZTIMESTAMP)

The above output will be in the format ddddd,sssss.fff.

    ddddd: Same format as $HOROLOG dates
 sssss: An integer indicating the number of seconds elapsed since midnight on the current date
 fff: Variable number of digits indicating the fractional part of a second

* Similar to $HOROLOG, except that $HOROLOG does not include fractional seconds. 

SAMPLES>write $SYSTEM.Util.UTCtoLocalWithZTIMEZONE($ZTIMESTAMP)," - ", $horolog,!
63895,64252.66 - 63895,64252
SAMPLES>write $ZDATETIME($SYSTEM.Util.UTCtoLocalWithZTIMEZONE($ZTIMESTAMP),8)
20151209 17:45:56
SAMPLES>write $ZDATETIME($ZTIMESTAMP,8)
20151209 08:46:05
SAMPLES>
1 Comment
Discussion (1)1
Log in or sign up to continue