Minamotoさん

ご回答いただきありがとうございます。
そちらの方法も検討したのですが、SELECTで*を使って取得した場合や、
複数のテーブルを結合してアクセスした際に、番号を把握しにくいというのと、
SQLのメンテナンスによって列番号が変わった際の保守性が低いという所より、見送りました。

やはりパフォーマンス劣化は避けられなさそうでしょうか…。

DynamicObjectに対して、「.name」でアクセスするのと、「%Get()」で動的にアクセスするのでは、
実質動作に差異がないと思っていたのですが、SQLからの取得結果へのアクセスとなると、
内部でカラム番号の変換処理が必要になってる、という事なんですね。。。
(であれば、何故直接「.name」でアクセスするのが早いのかは気になりますが…。)

Minamoto さん

ありがとうございます!
トランザクションと関係なくコミットできるのであれば、
1000件アップデートによるテーブルロックも防げそうですし、
期待動作が得られそうです。

頂いた方法で試してみたいと思います。

Minamoto さん

ご回答いただきありがとうございます!
記載頂いたものについては、私が欲していたものなのですが、
よくよく考えるとミラーリングを行っている都合上、
ジャーナルに書かれないデータが出来てしまう事にリスクを感じています。
($INCREMENTもそうでしたね。。。)

そのため、わがままな要望となってしまい大変恐縮なのですが、
ジャーナルには書かれるが、親のトランザクションを無視して更新を確定させたいです。

IRISの仕組み的に難しそうでしょうか・・・?

Toshihiko Minamoto さん

情報ありがとうございます!
初歩的なところに項目あったのですね、恥ずかしながら気づいておりませんでした。

疑問点は解消されましたので、クローズさせていただきます。

Hiroseさん

こんにちは。
恥ずかしながらDjangoについて殆ど知見はないですが、
先日こんな投稿があったので、参考になるかもしれません。

https://community.intersystems.com/post/welcome-django

Iwamotoさん

こんにちは。
情報共有いただきありがとうございます!

$ZTIMEZONEは秒のオフセットを返してくれるのですね!
オフセットの単位がわからず使いこなせなかったのですが、
頂いた方法で対応できそうです。

Hashimoto さん

こんにちは。
なるほど、この辺のお話ですね。

https://irisdocs.intersystems.com/iris20211/csp/docbookj/DocBook.UI.Page...

実行パフォーマンスとか気にして、今まで利用したことなかったですが、
一度実験してみようと思います。ありがとうございます!

Hashimoto さん

こんにちは。
コメントいただきありがとうございます!

確かに、ObjectScript内ではそのようなAPIも使えそうですね!
SQL関数として同様の振舞をするものがあればもっと良かったのですが、
自分の方ではなかなか見つけられませんでした。

Minamotoさん
こんにちは。ご回答いただきありがとうございます!

丁寧に教えていただきありがとうございます。
ローカル時刻で扱おうとすると、なかなか癖があるものなんですね。。
一度記載いただいた方法で試してみます!

Minamoto さん

ご回答ありがとうございます!

SQL自体にObjecsScriptのコマンドを埋め込む発想はありませんでした。
記載いただいた内容含め、検討してみます。

Kakechi さん

回答いただきありがとうございます!
BSもBOも標準のまま利用するのであれば開放処理がシステム内で行われると理解しました。

私が作成しているシステムでは、BS/BP/BOをそれぞれ標準を継承してカスタマイズしたり、
Batch.RecordをObjectScript内でループさせて利用するような処理もあるのですが、
この場合には%UnSwizzleAt()が必要との理解でよろしいでしょうか?

例)
BSでファイル検知を行い、RecordMapの仕組みを利用してファイルからBatchクラスを生成。

BOに連携し、BatchクラスをObjectScript内のクラスに譲与。

取得したBatch.Recordの内容をループで回しながら処理を実行。

このループの中では%UnSwizzleAt()が必要?
もしくはInteroperabilityのプロセスで実行する処理の中では、
BatchクラスのRecordの内容は勝手に開放される?

Kakechi さん

貴重な情報を公開いただきありがとうございます!
Relationshipオブジェクトの理解が浅く申し訳ないのですが、一点だけ教えてください。

今回の場合、Relationshipオブジェクトをループで回した際にのみ事象が発生するという理解なのですが、
Interoperabilityで利用可能なRecordMap利用時に生成される、Batchクラス内の
Recordsプロパティも上記に該当するのでしょうか?

今私が携わるシステムではRecordMapを多用しており、
数万件のデータをこの仕組みを用いて取り込みをおこなっているため、
上記の事象が発生するのではないかと懸念しております。

こんな感じのメソッドを作って、登録済みのクラス全体をチェックかける仕組みを構築してみました。

ClassMethod CheckAllClass()
{
    Do $SYSTEM.OBJ.GetClassList(.classes, "/application=1/generated=0")
    Set class = ""
    For {
        Set class = $ORDER(classes(class))
        If (class = "") {
            Quit
        }

        If ($EXTRACT(class,1,4) = "csp.") {
            Continue
        }

        Write !,"****************コンパイルチェック開始****************",!
        Write "TARGET : "_class,!
        #; 各種チェッククラスの実行。
        Set hasErr = '##class(AbstractMethodChecker).%New().IsCorrectDefine(class)
        Set hasErr = hasErr + '##class(ClassNamingChecker).%New().IsCorrectDefine(class)
        Set hasErr = hasErr + '##class(DefineNamingChecker).%New().IsCorrectDefine(class)
        Set hasErr = hasErr + '##class(MethodImplChecker).%New().IsCorrectImpl(class)

        Write "****************コンパイルチェック完了****************",!

        If (hasErr > 0) {
            Write "コンパイルエラーがあります。",!
        }
    }
}

Minamoto さん
こんにちは。ご回答いただきありがとうございます!

> しかしImportDirなどObjectScriptのメソッドにはこのような機能がないため、SourceControlの処理は実行されません。
やはりそうでしたか。私の方でもそもそも仕組みがないのではないかと疑っていました。

確かにExport前にチェックできていれば問題はないのですが、
チェック観点を追加した際に水平展開的に全体に仕掛けようと思った際に
どうやろうかなぁ、と試行錯誤していた状態です。

もう少しやり方は検討させていただきますが、本課題はいったんクローズさせていただきます。

Minamotoさん

ご回答いただきありがとうございます!
私が求めていた形はUDL形式と言うんですね。無知でした。
頂いた内容で進めていこうと思います。

> Create tableで作成されたタイミングでExportということに関しては、
> 現状、タスクで定期的にクラスをサーチするというベタな方法しか思いつきません。。。
そうですよね。こちらでもこのやり方で実装しようと思っています。

全てのコードを外だししてGIT管理したいが、IRIS内で自動生成された
ファイルたちをどうやって楽に取得するかを考えておりました。

疑問点は解消されましたので、クローズさせていただきます。

解決策に書いた以上のことはあまり何もしてないのですが、
buildspec.ymlの内容を転記させていただきます。cheeky

  build:
    commands:
      - mkdir -p /user/local/work
      - cd ..
      - mv * /user/local/work
      - cd /user/local/work
      - chmod -R 777 /user/local/work
      - iris start IRIS
      - su - irisowner -c "iris terminal IRIS \"##CLASS(%SYSTEM.OBJ).ImportDir(\\\"/user/local/work\\\",\\\"*.cls;*.mac;*.int;*.inc;*.dfi\\\",\\\"ck\\\",,1)\" " | tee result.txt
      - find result.txt | xargs grep -n "error" | wc -l
      - |
         if find result.txt | xargs grep -n "error" | wc -l >0; then
             false;
         fi