記事へ Toshihiko Minamoto · 2022年6月17日 Ohataさんこんにちは。残念ながら、ミラーリングですと、%NOJOURNキーワードは無視されるようです。その他の方法を探してみたところ、ObjectScriptから実行することになりますが、$SYSTEM.Process.TransactionsSuspended()でトランザクションを一時停止すると、その間の更新はバックアップサーバに値は転送されますし、ロールバックしても戻らなくなりました。例 まず、JRNTEST.Testテーブルに2行追加します。 USER>s r=##class(%SQL.Statement).%ExecDirect(,"insert jrntest.test set p1=1") USER>s r=##class(%SQL.Statement).%ExecDirect(,"insert jrntest.test set p1=1") トランザクションを開始します USER>s r=##class(%SQL.Statement).%ExecDirect(,"start transaction") トランザクションを一時停止します。 TL1:USER>d $SYSTEM.Process.TransactionSuspended(1) ID=1のレコードのカラムP1の値をインクリメントします。 TL1:USER>s r=##class(%SQL.Statement).%ExecDirect(,"update jrntest.test set p1=p1+1 where id=1") トランザクションを再開します TL1:USER>d $SYSTEM.Process.TransactionSuspended(0) ID=2のレコードのカラムP1の値をインクリメントします。 TL1:USER>s r=##class(%SQL.Statement).%ExecDirect(,"update jrntest.test set p1=p1+1 where id=2") 現在値を確認します。 TL1:USER>do ##class(%SQL.Statement).%ExecDirect(,"select * from jrntest.test").%Display() ID p1 1 2 2 2 2 Row(2) Affected ロールバックします TL1:USER>s r=##class(%SQL.Statement).%ExecDirect(,"rollback") 現在値を確認します。 USER>do ##class(%SQL.Statement).%ExecDirect(,"select * from jrntest.test").%Display() ID p1 1 2 2 1 2 Row(s) Affected よろしくお願いします。
記事へ Toshihiko Minamoto · 2022年6月14日 Ohataさん、こんにちは。ちょっと調べてみたのですが、UPDATE文に%NOJOURNというオプションがありますので UPDATE %NOJOURN table SET counter = counter + 1 WHERE name='xxx'のように記述いただくと、その更新はロールバックを無視します。よろしくお願いします。
記事へ Toshihiko Minamoto · 2022年5月29日 Ohataさん、こんにちは。 既に解決されているかもしれませんが、記述されていた通り、スタンドアロン環境ではパッケージをインストールできませんので、以下の手順でインストールする必要があるかと思います。 1. インターネット環境にて必要なパッケージ(.gzファイル)をダウンロードする irispip download -d c:\intersystems\iris\mgr\python --no-binary :all: <パッケージ名> c:\InterSystems\IRIS\mgr\pyhtonフォルダにパッケージ(tar.gz形式)のファイルが作成されます。 2. スタンドアロン環境にパッケージをコピー 3. スタンドアロン環境にてパッケージをインストール irispip install c:\intersystems\iris\mgr\python\<パッケージファイル名> 以下のサイトを参考にしました。 https://qiita.com/analytics-hiro/items/2565adbb2c900e6738cd
記事へ Toshihiko Minamoto · 2022年3月8日 Ohataさんこんにちは。もしかすると、自己解決されているかもしれませんが、ビジネスサービスの「設定」タブの「追加の設定」にあるスケジュールに、作成されたスケジュール仕様を選択すれば、その時間帯だけ稼働するかと思います。
記事へ Toshihiko Minamoto · 2022年3月2日 Hiroseさん こんにちは。 Ohataさんが紹介されている記事にあるDjango-irisを使ってDjangoからIRISのDBを使うことができました。(Pythonコンテスト1位でしたね!) 手順はこんな感じです。 1. IRISインストール 記事の中にあるように、IRIS 2022.1のプレビュー版が必要ですので、ダウンロードし、インストールします。 2. Pythonインストール Python 3.10.2 amd64をインストールしました。インストール時に add Python 3.10 to Pathをチェックしてインストールしています。 3. Djangoインストール コマンドプロンプトより、python -m pip install Django 4. Django-irisのダウンロード https://openexchange.intersystems.com/package/django-iris よりdjango-iris-0.1.x.zipをダウンロードし、c:\に展開 5. Python DB-APIのインストール コマンドプロンプトで4で展開されたディレクトリに移動し、whlファイルをインストールします。 pip3 install intersystems_irispython-3.2.0-py3-none-any.whl 6. Django-irisのインストール コマンドプロンプトより、以下のコマンドでインストールします。 pip install django-iris 7. Djangoアプリの作成 Djangoの公式ページにあるチュートリアルに従ってアプリを作ってみました。 https://docs.djangoproject.com/ja/4.0/intro/tutorial01/ ただし、Databaseの設定部分で設定ファイル(settings.py)のDATABASESの部分を以下のように修正しています。 DATABASES = { 'default': { 'ENGINE': 'django_iris', 'NAME': 'USER', 'HOST': 'localhost', 'PORT': 1972, 'USER': '_SYSTEM', 'PASSWORD': 'password', } }
記事へ Toshihiko Minamoto · 2022年2月15日 Hashimotoさんこんにちは。IRISスタジオだと「他の表示」で表示されたINTコード上で、エラーの行にカーソルを持っていき、再度「他の表示」をクリックすると対応するソースコードに移るのでなんらかの方法はあるかと思い、調べてみました。(%SYS.MONLBLで... )Internalクラスなので、インターシステムズのサポートは無く、将来的に変わる可能性はありますが、以下の方法で求められそうです。 まず以下のメソッドでエラーのロケーション形式( label+offset^routine )から、INTルーチンの先頭からのoffsetを求めます。 set sc=##class(%Studio.Debugger).INTLine("ClassName.1.INT","zNewMethod",32,.intname,.intline) で、sc=1の場合、intnameにはINTルーチン名、intlineには先頭からのオフセットが入ります。 次に、以下のメソッドでソースコードのロケーションを求めます。 set sc=##class(%Studio.Debugger).SourceLine(intname,intline,1,99999,1,"USER",.map) sc=1の場合、変数mapは以下の形式で返ります。 map("CLS",1)=$lb(クラス名,メソッド名,メソッドからの行数,1,ネームスペース) ちなみに、SourceLine()メソッドの第2~5引数は startLine, startPos, endLine, endPos となっており、どうもエディタ上で選択した範囲を入力すると、それに対応するソースコードの範囲を計算してくれるようです。 その場合、変数mapはこんな感じになります。 map("CLS",1)=$lb(クラス名,StartLineのメソッド名,StartLineのメソッドからの行数,startPos,ネームスペース) map("CLS",2)=$lb(クラス名,EndLineのメソッド名,EndLineのメソッドからの行数,endPos,ネームスペース)
記事へ Toshihiko Minamoto · 2022年1月27日 Ohataさんこんばんは。Ens.Util.LogテーブルのTimeLoggedカラムを見ると、Ens.DataType.UTCとなっていました。これはUTCで保管されているのですが、表示するときにLogicalToDisplay()などでローカル時刻に変換しています。従いまして、①については、実体としてUTCで保管されています。②についてはEns.DataType.UTCは表示するときにローカル時刻に変換されますが、キャストしたものは型が異なるので変換されずに表示されるからだと思います。③についても、WHERE句の条件はUTCで計算されますので、記載されたようにDATEADDで変換するしかなさそうです。ただTimeLoggedカラムに変換をかけるよりも、指定したパラメータをUTCに変換する方が、DBのインデックスも使用できるので効率が良いかと思います。 WHERE timelogged >= DATEADD('hh',-9,'2022-01-26')
記事へ Toshihiko Minamoto · 2021年12月16日 12/16現在、各製品の調査状況は以下の通りです。詳細はこちらをご確認ください。 以下の製品につきましては、Log4j2による脆弱性があることが確認されました。 Data Platforms Add-ons • InterSystems Reports Server • InterSystems Reports Designer TrakCare • TrakCare Core 以下の製品はLog4j2を使用していますが、信頼できないソースからのデータ処理には使用されていません。 Data Platforms Add-ons • InterSystems Cloud Manager HealthShare • HealthShare Clinical Viewer (2019.2 ~ 2021.2) 以下の製品につきましてはLog4j2による脆弱性が無いことが確認されています。 Data Platforms• InterSystems IRIS• Caché• InterSystems IRIS for Health• Ensemble Data Platforms Add-ons• Atelier Integration• CSP Gateway for CE• IRIS Studio• InterSystems API Manager• InterSystems Kubernetes Operator (IKO)• ISC Agent• Legacy .Net bindings• Legacy node JS binding• ODBC Driver• System Alerting and Monitoring (SAM)• VS Code Integration• Web Gateway for IRIS• Zen Mojo HealthShare• HealthShare Clinical Viewer (2019.1以前 )• Unified Care Record• Care Community• Personal Community• Provider Directoryi• Health Insight• Patient Index• Health Connect
記事へ Toshihiko Minamoto · 2021年12月6日 Ohataさんこんにちは。 例えば、$listを使用して、10パラメータずつまとめてExecuteメソッドのパラメータに渡すというのはいかがでしょうか。プログラム例は以下のとおりです。(長くなりますので、途中「...」で省略しています) set rs=##class(%ScrollableResultSet).%New() // Prepare で 60個のパラメータから$listget関数を使って各カラムに分けたものをINSERTします。 set ret=rs.Prepare("INSERT coltest.test (P0000, ... ,P0599) " _" SELECT $listget( P0,1), ... ,$listget( P0,10) " _",$listget( P1,1), ... ,$listget( P1,10)" : _",$listget(P59,1), ... ,$listget(P59,10) " _" FROM (SELECT ? as P0,? as P1,? as P2, ... ,? as P58,? as P59)") quit:$$$ISERR(ret) ret set ret=rs.Execute($lb("PPP0", ... ,"PPP9") ,$lb("PPP10", ... ,"PPP19"), ... ,$lb("PPP590",...,"PPP599")) quit ret Prepare()メソッドでは、60個のパラメータにP0~P59の名前を付けるサブクエリを作り、それをFROM句に指定して$listget関数で分解したデータをcoltest.testテーブルのP0001~P599のカラムにINSERTするSQL文を指定しています。 Execute()メソッドではデータ10個を$listbuild()関数で$list形式に変換し、パラメータとして指定しています。
記事へ Toshihiko Minamoto · 2021年8月17日 Ohataさんこんにちは。実際にSourceControlを使っているわけではないのでよくわかっていない部分はありますが、スタジオやVSCodeで保存した際には、スタジオやVSCodeのフック処理にてSourceControlの処理が実行されるかと思います。しかしImportDirなどObjectScriptのメソッドにはこのような機能がないため、SourceControlの処理は実行されません。ImportDirメソッドを実行されるということは、その前に特定のディレクトリに.CLSなどのファイルを保存されるかと思います。その際にSourceControlで使用する作業ディレクトリに保存すれば、SourceControlの処理が実行されるかと思うのですが、いかがでしょうか?抽象的な内容ですみません。何らかのヒントになれば幸いです。
記事へ Toshihiko Minamoto · 2021年6月7日 Ohataさん、こんにちは。cls形式(UDLフォーマット)での出力ですが、ExportUDLメソッドで出力できます。https://docs.intersystems.com/irislatest/csp/documatic/%25CSP.Documatic....実際、こんな感じです。set ret=$SYSTEM.OBJ.ExportUDL("Sample.Person.cls","c:\temp\Sample\Person.cls")よろしくお願いします。Create tableで作成されたタイミングでExportということに関しては、現状、タスクで定期的にクラスをサーチするというベタな方法しか思いつきません。。。ジェネレータメソッドを持つクラスを作成し、そのクラスを継承できれば良いのですが。。。
記事へ Toshihiko Minamoto · 2021年6月6日 Furuzonoさん、情報ありがとうございます。Windowsマシンで試したのですが、OS認証をONにするのを忘れてハマってしまったので、念のため情報共有しておきます。OS認証をONにする方法 システム管理ポータルの「システム管理」「セキュリティ」「システムセキュリティ」「認証/ウェブセッションオプション」メニューをクリックします。 以下のページが表示されますので、「OS認証を許可」をチェックし、「保存」ボタンをクリックします。 システム管理ポータルの「システム管理」「セキュリティ」「サービス」メニューをクリックします。 「%Service_Console」をクリックし、表示されるダイアログにて「オペレーティングシステム」をチェック、「保存」ボタンをクリックします。 あとはWindowsユーザと同じ名前のユーザを作成すれば(インストール時のWindowsユーザであれば自動的に作成されています)、バッチファイルからirisコマンドでルーチンやクラスが起動できました。
記事へ Toshihiko Minamoto · 2021年4月20日 Ohataさん ご連絡ありがとうございます。ちなみに私の手元のIRIS 2020.3で試してみましたところ、アラートメッセージが送られました。お手数ですが、サポートセンターに問い合わせて頂ければと思います。
記事へ Toshihiko Minamoto · 2021年4月13日 Ohataさんこんにちは。頂いたエラーが出力されているTestAsou2というビジネスサービスはEnsLib.RecordMap.Service.FileServiceクラスを利用されているのではないかと思います。であれば、アラート出力を利用する方が良いかと思います。まず、以下のようにEns.AlertRequestメッセージを受信するビジネスオペレーションクラスを作成します。 /// アラートデータの保存 Class Util.Alert.StoreAlert Extends Ens.BusinessOperation [ Language = objectscript ] { Parameter INVOCATION = "Queue"; Parameter SETTINGS = "-AlertOnError"; Method StoreError(pRequest As Ens.AlertRequest, Output pResponse As Ens.Response) As %Status { set ^Log($I(^Log))=$lb(pRequest.AlertText,pRequest.AlertTime ,pRequest.SourceConfigName,pRequest.SessionId) return $$$OK } XData MessageMap { <MapItems> <MapItem MessageType="Ens.AlertRequest"> <Method>StoreError</Method> </MapItem> </MapItems> } } 作成したビジネスオペレーションを追加します。この時、オペレーションクラスには先ほど作成したクラス名、オペレーション名には「Ens.Alert」を指定します。 最後にエラーを受信したいビジネスホストの設定タブにある「エラー時に警告」にチェックを入れます。こうすると、各ビジネスホストでエラーが発生すると、Ens.AlertにEns.AlertRequestメッセージが流れ、^Logグローバルにエラーメッセージ(AlertTextプロパティ)や発生元のビジネスホスト(SourceConfigNameプロパティ)が格納されます。ラフな説明ですみません。ご不明な点等ありましたら、ご連絡ください。
記事へ Toshihiko Minamoto · 2021年3月29日 Ohataさん すみません、instanceof と同等のメソッドとして、%IsA()メソッドがあります。これは、インスタンスがパラメータに指定されたクラスまたはそのサブクラスかどうかをチェックするものです。USER>write a.%IsA("Sample.Person")1よろしくお願いします。
記事へ Toshihiko Minamoto · 2021年3月29日 Ohataさんこんにちは。型(クラス名)を取得するには$classname()関数を使用したり、%ClassName()メソッドを使用します。例えば、USER> set a=##class(Sample.Person).%OpenId(1)でaというインスタンスを作成した場合、USER>write $classname(a)Sample.PersonUSER>write a.%ClassName(1)Sample.Personとクラス名が文字列で返ります。
記事へ Toshihiko Minamoto · 2021年3月14日 Amanoさん、こんにちは。非同期動作の場合、Serverメソッドを正常終了(quit $$$OK)すると、その後メッセージを受信するとOnClientMessage()が呼ばれます。 Method OnClientMessage(data As %String = "", close As %Integer) As %Status { // メッセージ受信処理 Quit 1 } ここで、dataはクライアントから送信されたメッセージが入り、クライアントがWebSocketをcloseすると、closeパラメータに1が入ります。 OnClientMessageの戻り値が1の場合、正常終了とみなされます。
記事へ Toshihiko Minamoto · 2021年2月25日 Amanoさん 投稿ありがとうございます。 ターミナルからの起動ではないので、エスケープシーケンス等正しく表示されない可能性はありますが、Vscodeでの簡単な設定で、ルーチンやシステム関数の戻り値などをちょっと試すのに便利ですね。
記事へ Toshihiko Minamoto · 2021年2月25日 Hiroseさん投稿ありがとうございます。現状、修正は依頼しているのですが、まだ最新のバージョンには反映されていないようです。将来的には修正されるかと思います。よろしくお願いいたします。
記事へ Toshihiko Minamoto · 2021年2月23日 データプラットフォームと同じかもしれませんが、個人的にはデータベースと言語が一体となったシステムだと思います。(MUMPSやCachéも同じですが。。。) データベースと言語が一体となっているので、言語からデータベースの内容を簡単かつ安全、高速に参照、更新できるところが利点だと思います。また、以前はデータベース=RDBとなっていたので、拒絶反応を示されることが多かったのですが、最近ではドキュメントDBやグラフDBなどリレーショナルでないものもいろいろと出てきているので、少しご理解いただけるようになってきているのでは。と思います。