Ohataさん、情報ありがとうございます!

NOT NULL制約のカラムはNULLが入らない前提になっているので、
NULLが入っていると、ヒットしてしまうのですね。

Ohataさん、こんにちは。
②について、カラム値がNULLかどうかを判定するには、IS NULL、IS NOT NULL を使用いただく必要があります。
https://zenn.dev/indigo13love/articles/b3604502149b2f

ただ、記載いただいた結果ですと逆になっているようですが、こちらのIRIS 2022.1で試すと
IS NULL では指定したカラム値がNULLのレコードがヒットしますが、= NULLではヒットしませんでした。

Ohataさん
こんばんは。

カラムデータを取得する際にカラム名ではなく、カラム番号で取得するのは難しいでしょうか?
例えば
    select A,B,C FROM Table
としたときに、Cの値を取りたければ
   set var = rset.%Get("C")
の代わりに
   set var = rset.%GetData(3)
といった感じです。

もし可能でしたら、カラム名からカラム番号に変換するという余分な処理をしなくても済むので
早くなるのではないかと思います。
 

Kobataさん、こんにちは。
すみません、知見があるわけではないのですが、Ubuntu 22.04はIRIS 2022.2からサポートされる予定ですので、
2022.2 プレビュー版をdocker上で動作させるか、2022.2の製品版が出てからUbuntu上にインストールいただいた方が無難かと思います。

ただ、2022.2はCDリリースですのでadhocを出すことができませんので、adhocが必要なケースが想定されるのであれば、Ubuntu 20.04 LTSを利用された方が良いかと思います。 
よろしくお願いします。

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

よろしくお願いします。

Ohataさん、
こんにちは。
ちょっと調べてみたのですが、
UPDATE文に%NOJOURNというオプションがありますので

    UPDATE  %NOJOURN table SET counter = counter + 1 WHERE name='xxx'

のように記述いただくと、その更新はロールバックを無視します。
よろしくお願いします。

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

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の部分を以下のように修正しています。

DATABASES = {
     'default': {
         'ENGINE': 'django_iris',
         'NAME': 'USER',
         'HOST': 'localhost',
         'PORT': 1972,
         'USER': '_SYSTEM',
         'PASSWORD': 'password',
     }
 }

Hashimotoさん
こんにちは。

IRISスタジオだと「他の表示」で表示されたINTコード上で、エラーの行にカーソルを持っていき、
再度「他の表示」をクリックすると対応するソースコードに移るのでなんらかの方法はあるかと
思い、調べてみました。(%SYS.MONLBLで... cheeky)

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,ネームスペース)