記事へ 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年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月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年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プロパティ)が格納されます。ラフな説明ですみません。ご不明な点等ありましたら、ご連絡ください。
記事へ
Ohataさん
こんにちは。
残念ながら、ミラーリングですと、%NOJOURNキーワードは無視されるようです。
その他の方法を探してみたところ、ObjectScriptから実行することになりますが、
$SYSTEM.Process.TransactionsSuspended()でトランザクションを一時停止すると、その間の更新はバックアップサーバに値は転送されますし、ロールバックしても戻らなくなりました。
例
よろしくお願いします。
記事へ
Ohataさん、こんにちは。
既に解決されているかもしれませんが、記述されていた通り、スタンドアロン環境ではパッケージをインストールできませんので、以下の手順でインストールする必要があるかと思います。
1. インターネット環境にて必要なパッケージ(.gzファイル)をダウンロードする
c:\InterSystems\IRIS\mgr\pyhtonフォルダにパッケージ(tar.gz形式)のファイルが作成されます。
2. スタンドアロン環境にパッケージをコピー
3. スタンドアロン環境にてパッケージをインストール
以下のサイトを参考にしました。
https://qiita.com/analytics-hiro/items/2565adbb2c900e6738cd
記事へ
Ohataさん
こんにちは。
もしかすると、自己解決されているかもしれませんが、
ビジネスサービスの「設定」タブの「追加の設定」にあるスケジュールに、
作成されたスケジュール仕様を選択すれば、その時間帯だけ稼働するかと
思います。
記事へ
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の部分を以下のように修正しています。
記事へ
Hashimotoさん
)
こんにちは。
IRISスタジオだと「他の表示」で表示されたINTコード上で、エラーの行にカーソルを持っていき、
再度「他の表示」をクリックすると対応するソースコードに移るのでなんらかの方法はあるかと
思い、調べてみました。(%SYS.MONLBLで...
Internalクラスなので、インターシステムズのサポートは無く、将来的に変わる可能性はありますが、以下の方法で求められそうです。
まず以下のメソッドでエラーのロケーション形式( label+offset^routine )から、INTルーチンの先頭からのoffsetを求めます。
で、sc=1の場合、intnameにはINTルーチン名、intlineには先頭からのオフセットが入ります。
次に、以下のメソッドでソースコードのロケーションを求めます。
sc=1の場合、変数mapは以下の形式で返ります。
ちなみに、SourceLine()メソッドの第2~5引数は
startLine, startPos, endLine, endPos
となっており、どうもエディタ上で選択した範囲を入力すると、それに対応するソースコードの範囲を計算してくれるようです。
その場合、変数mapはこんな感じになります。
記事へ
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')
記事へ
Ohataさん
こんにちは。
例えば、$listを使用して、10パラメータずつまとめてExecuteメソッドのパラメータに渡すというのはいかがでしょうか。プログラム例は以下のとおりです。(長くなりますので、途中「...」で省略しています)
Prepare()メソッドでは、60個のパラメータにP0~P59の名前を付けるサブクエリを作り、それをFROM句に指定して$listget関数で分解したデータをcoltest.testテーブルのP0001~P599のカラムにINSERTするSQL文を指定しています。
Execute()メソッドではデータ10個を$listbuild()関数で$list形式に変換し、パラメータとして指定しています。
記事へ
Ohataさん
こんにちは。
実際にSourceControlを使っているわけではないのでよくわかっていない部分はありますが、
スタジオやVSCodeで保存した際には、スタジオやVSCodeのフック処理にてSourceControlの処理が実行されるかと思います。しかしImportDirなどObjectScriptのメソッドにはこのような機能がないため、SourceControlの処理は実行されません。
ImportDirメソッドを実行されるということは、その前に特定のディレクトリに.CLSなどのファイルを保存されるかと思います。
その際にSourceControlで使用する作業ディレクトリに保存すれば、SourceControlの処理が実行されるかと思うのですが、いかがでしょうか?
抽象的な内容ですみません。
何らかのヒントになれば幸いです。
記事へ
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ということに関しては、
現状、タスクで定期的にクラスをサーチするというベタな方法しか思いつきません。。。
ジェネレータメソッドを持つクラスを作成し、そのクラスを継承できれば良いのですが。。。
記事へ
Ohataさん
こんにちは。
頂いたエラーが出力されているTestAsou2というビジネスサービスはEnsLib.RecordMap.Service.FileServiceクラスを利用されているのではないかと思います。
であれば、アラート出力を利用する方が良いかと思います。
まず、以下のようにEns.AlertRequestメッセージを受信するビジネスオペレーションクラスを作成します。
作成したビジネスオペレーションを追加します。この時、オペレーションクラスには先ほど作成したクラス名、
オペレーション名には「Ens.Alert」を指定します。
最後にエラーを受信したいビジネスホストの設定タブにある「エラー時に警告」にチェックを入れます。
こうすると、各ビジネスホストでエラーが発生すると、Ens.AlertにEns.AlertRequestメッセージが流れ、
^Logグローバルにエラーメッセージ(AlertTextプロパティ)や発生元のビジネスホスト(SourceConfigNameプロパティ)が格納されます。
ラフな説明ですみません。
ご不明な点等ありましたら、ご連絡ください。