Yuji Ohata · 3月 29, 2021 記事へ

Minamoto さん

早々にコメントいただきありがとうございます!

頂いた内容で、やりたかったことが対応できそうです。

Yuji Ohata · 3月 29, 2021 記事へ

Minamoto さん

情報ありがとうございます!

RegisteredObjectにそんな便利APIがあったんですね。

まさに利用したいAPIはそちらでしたので、利用させていただきます!

Yuji Ohata · 4月 15, 2021 記事へ

Kaminakaさん、こんにちは。

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

非活動タイムアウトとか標準の仕組みで上手く作成できないかな、

とはいろいろ考えていたのですが、やっぱりその方法がよさそうですね。

一度その方針で進めてみます!有難うございました!

Yuji Ohata · 4月 15, 2021 記事へ

Minamoto さん

ご回答いただきありがとうございます!
Ens.Alert機能自体あまり利用したことがなかったため、
確認に時間がかかっているところとなります。

RecordMap読み込みにおいてはParseOnlyをTrueにしてるのですが、
この時にアラートが飛んできていないような気がしていて、その点の確認中です。
解消しましたら改めてご連絡させて頂きます!

Yuji Ohata · 4月 19, 2021 記事へ

Minamoto さん

Alertでログが取れそうなことが確認できました!ありがとうございます。
ただ、ParseOnlyをTrueにするとVer 2020.1ではやはり通知が来ていなさそうなので、
別途サポートに問い合わせるようにします。

Yuji Ohata · 5月 19, 2021 記事へ

自己解決しました! 以下のように実行することで、irisownerのユーザでIRIS内の命令を直接実行できるようになりました。

su - irisowner -c "iris terminal IRIS \"##CLASS(%SYSTEM.OBJ).ImportDir(\\\"参照パス\\\",\\\"*.cls;*.mac;*.int;*.inc;*.dfi\\\",\\\"ck\\\",,1)\" "

一旦問題は解消されたので課題は閉じさせていただこうと思うのですが、 Codebuildの使い方について他にベストプラクティス等あれば 情報いただけますと幸いです。

Yuji Ohata · 5月 20, 2021 記事へ

Iwamoto さん

ご連絡いただきありがとうございます。
docker起動時にユーザ指定できるのは知りませんでした!
まだまだいろいろなことができそうなので、こちらでも触ってみるようにします。

Yuji Ohata · 5月 20, 2021 記事へ

解決策に書いた以上のことはあまり何もしてないのですが、
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
Yuji Ohata · 6月 7, 2021 記事へ

Minamotoさん

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

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

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

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

Yuji Ohata · 8月 17, 2021 記事へ

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

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

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

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

Yuji Ohata · 8月 17, 2021 記事へ

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

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 "コンパイルエラーがあります。",!
        }
    }
}
Yuji Ohata · 8月 25, 2021 記事へ

Kakechi さん

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

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

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

Yuji Ohata · 8月 26, 2021 記事へ

Kakechi さん

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

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

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

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

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

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

Yuji Ohata · 8月 26, 2021 記事へ

Kakechi さん

回答いただきありがとうございます。
内容理解できました!私のケースでは対応必要そうです。

相談に乗っていただきありがとうございました!

Yuji Ohata · 8月 26, 2021 記事へ

Kakechi さん

回答いただきありがとうございます。
内容理解できました!私のケースでは対応必要そうです。

相談に乗っていただきありがとうございました!

Yuji Ohata · 12月 6, 2021 記事へ

Minamoto さん

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

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

Yuji Ohata · 1月 27, 2022 記事へ

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

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

Yuji Ohata · 2月 1, 2022 記事へ

Hashimoto さん

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

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

Yuji Ohata · 2月 2, 2022 記事へ

Iwamotoさん

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

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

Yuji Ohata · 2月 20, 2022 記事へ

Mihoko Iijimaさん

調査協力いただきありがとうございます!
その方法で試してみます!

Yuji Ohata · 3月 8, 2022 記事へ

Toshihiko Minamoto さん

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

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

Yuji Ohata · 5月 29, 2022 記事へ

Toshihiko Minamoto さん

ご回答いただきありがとうございます!
頂いた方法で試してみます。
 

Yuji Ohata · 6月 15, 2022 記事へ

Minamoto さん

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

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

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

Yuji Ohata · 6月 19, 2022 記事へ

Minamoto さん

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

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

Yuji Ohata · 9月 14, 2022 記事へ

Minamotoさん

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

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

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

Yuji Ohata · 9月 14, 2022 記事へ

Hashimotoさん

ありがとうございます!
カラム名を渡されたらそちらの%Metadata.columnsから番号を取得して、
%GetRow()で引っ掛けてみる、という事ですね。

一度試してみようと思います。

Yuji Ohata · 10月 26, 2022 記事へ

Mihoko Iijima さん

ご確認いただきありがとうございます!
そういう事だったんですね。
インジェクション対策として、パラメータを分けることを基本方針にしていたのですが、
設計を見直す必要がありそうですね・・・。

Yuji Ohata · 10月 26, 2022 記事へ

Toshihiko Minamoto さん

ご確認いただきありがとうございます!
こちらでも、今問題となってるテーブルから問題のカラムを抽出して
新たなテーブルを作成し、そこに対してIS NULLで検索をかけますとヒットすることが確認できました。


テーブルのデータ件数なのか、Insertのやり方なのか、何か条件がありそうですので、
もう少し絞り込めましたら、改めてサポートに問い合わせてみようと思います。