記事へ Toshihiko Minamoto · 2025年2月27日 @Kazuma Watanabe Watanabeさんおはようございます。DynamicObjectの件、うっかりしておりました。DynamicObjectでは数値の精度を設定することはできませんので、OutputToDynamicObject()では従来のフォーマットで出力するようにしました。
記事へ Toshihiko Minamoto · 2025年2月21日 @Kazuma Watanabe Watanabeさんこんにちは。%DynamicObjectをJSON形式で出力するのに%ToJSON()を使っていたのですが、%JSON.Formatterクラスでも出力できましたので、そのクラスを継承して、SCALEを指定しているデータのダブルクオートを出力しないようにしました。同様にDEVブランチにPushしておきましたので、ご確認いただければと思います。よろしくお願いします。
記事へ Toshihiko Minamoto · 2025年2月20日 @Kazuma Watanabe Watanabeさんこんにちは。JSONTemplateは%DynamicObjectを使用してまして、その制限によってダブルクオートがついてしまうのですが、数値のプロパティで指定されたSCALEパラメータの精度に合わせるようにしました。JSONTemplateリポジトリのdevブランチにアップロードしています。https://github.com/Intersystems-jp/JSONTemplate/tree/dev/src/JSONTemplateもしよろしければ、お試しいただければと思います。よろしくお願いします。
記事へ Toshihiko Minamoto · 2025年2月19日 watanabeさんこんにちは。ご連絡ありがとうございます。数値の場合、+をつけて数値化しておりましたが、SCALEパラメータを見て精度を合わせるようにしたいと思います。少しお待ちいただければと思います。
記事へ Toshihiko Minamoto · 2023年11月1日 zpmをロードするメソッドが間違っていましたので、修正しました。$SYSTEM.OBJ.Import(... ⇒ $SYSTEM.OBJ.Load(...
記事へ Toshihiko Minamoto · 2023年8月21日 こんにちは。 あるお客さんからステップ6のNewStorage1:Map1というタイトルのダイアログをどのようにして表示させるのかわからないとご指摘を受けましたので、補足します。 まず、ステップ6のnew storage wizardを表示させるStorageアイコンは で、スタジオのメニューの下にあります。つぎに NewStorage1:Map1というタイトルのダイアログは、スタジオの右にあるインスペクタを表示させ、ステップ6で作成した新規ストーレージを選択すると表示される「SQL storage map」欄をクリックしてその右にある「...」ボタンをクリックします。 以上です。本文中にも補足として追加しておりますので、ご覧ください。
記事へ Toshihiko Minamoto · 2023年8月14日 中橋さん、ありがとうございます!settings.jsonということは、各プロジェクトのフォルダにある.vscodeフォルダのsettings.jsonを変えるとプロジェクトごとに変えられますね😀こんな感じに... 色のセンスはいまいちですが...
記事へ Toshihiko Minamoto · 2023年7月31日 橋本さん、ありがとうございます! このプログラムは、どこかのサイトからダウンロードしてインストールできるのでしょうか?ぜひ、使わせていただきたいです😊よろしくお願いします。
記事へ Toshihiko Minamoto · 2023年6月2日 Ohataさんこんにちは。デフォルト値を変えるよりも、EXACTの照合が必要なプロパティが限定的なのであれば、Propertyのデータ型にCOLLATIONパラメータを設定し、それらのプロパティだけ変更された方が良いかと思います。 Property P1 as %String(COLLATION="Exact") よろしくお願いします。
記事へ Toshihiko Minamoto · 2023年6月1日 Ohataさん、こんにちは。 SQLでデータが一致するかどうかの判定は照合(collation)によります。IRISやCacheのデフォルトの照合は%SQLUPPERとなっています。これは大文字小文字を区別せず、かつ後続の空白は無視されます。そのため、'bbb△'と'bbb'は同じ文字列と識別され、ヒットします。照合についてはマニュアルの以下のURLを参照いただければと思います。https://docs.intersystems.com/iris20221/csp/docbookj/DocBook.UI.Page.cls?KEY=GSQL_COLLATION よろしくお願いします。
記事へ Toshihiko Minamoto · 2023年1月11日 Ohataさん、おはようございます。ちなみに、私はモジュール単位で独立して起動時や終了時の処理を実行できるようにしたかったので、%ZSTARTや%ZSTOPルーチンは管理クラスから生成するようにしています。プログラムはこんな感じです。 /// ZSTARTルーチンの生成 /// 起動時やログイン時、プロセス起動時に実行するプログラムを登録し、 /// %ZSTARTルーチンを生成させる /// systemcode ... システム起動時に実行するコード /// logincode ... ログイン時に実行するコード /// jobcode ... プロセス起動時に実行するコード /// /// ※複数行にわたるときはCRLFを挿入する /// モジュール名は%ZLOADERでファイル名から生成されたモジュール名%moduleの値を使用する ClassMethod GenerateZSTART(systemcode As %String = "", logincode As %String = "", jobcode As %String = "") As %Status { if $get(%module)="" { quit $$$ERROR(5001,"モジュール名%moduleが定義されていません") } kill ^%ZModule.Code("ZSTART","SYSTEM",%module) kill ^%ZModule.Code("ZSTART","LOGIN",%module) kill ^%ZModule.Code("ZSTART","JOB",%module) set:systemcode'="" ^%ZModule.Code("ZSTART","SYSTEM",%module)=systemcode set:logincode'="" ^%ZModule.Code("ZSTART","LOGIN",%module)=logincode set:jobcode'="" ^%ZModule.Code("ZSTART","JOB",%module)=jobcode set rtn=##class(%Routine).%New() set rtn.RoutineName="%ZSTART.MAC" set sec="" for { set sec=$order(^%ZModule.Code("ZSTART",sec)) quit:sec="" do rtn.WriteLine(sec_"() public {") set mod="" for { set mod=$order(^%ZModule.Code("ZSTART",sec,mod),1,code) quit:mod="" do:code'="" rtn.WriteLine(code) } do rtn.WriteLine("}") } quit rtn.Compile() } 便宜上、モジュール名は%付き変数で渡していたり、グローバルを使っていたりしますが、モジュール名と起動、停止コマンドを入れるテーブルを作成し、トリガーで項目が更新される度にルーチンを生成するメソッドを実行しても良いかと思います。 ご参考まで。
記事へ Toshihiko Minamoto · 2023年1月10日 Ohataさん、こんにちは。監視機能の中でMirroringの起動時に実行されるメソッドはないかと思います。ただ、GetSensors()メソッドはデフォルトで30秒ごとに呼ばれますので、$SYSTEM.Mirror.IsPrimary()メソッドの戻り値が0から1になった時点でメソッドを実行することは可能です。メソッドが呼ばれるタイミングは切り替わった時点よりも遅くなりますが。。。 /// 起動処理サンプル Class MonTest.Test Extends %SYS.Monitor.AbstractSensor { Property Primary As %Boolean; Method Start() As %Status { // todo: ここに処理内容を記述します do ##class(%SYS.System).WriteToConsoleLog("startup test sensor in "_$namespace) // ミラーの状態を保存 set ..Primary=$SYSTEM.Mirror.IsPrimary() Q $$$OK } Method GetSensors() As %Status { set ret=$$$OK set status=$SYSTEM.Mirror.IsPrimary() // 状態が変更されたとき if ..Primary'=status { set ..Primary=status if status { // Primaryに変更されたとき set ret=..BecomePrimary() } } Quit ret } Method BecomePrimary() As %Status { Quit $$$OK } }
記事へ Toshihiko Minamoto · 2023年1月4日 Ohataさんあけましておめでとうございます。本年もよろしくお願いします。 インスタンス起動時に実行されるメソッドですが、モニタークラスを作成し、Startメソッドに必要な処理を記載するのはいかがでしょうか? 1.プロダクションを設定されているネームスペースにて、以下のような%SYS.Monitor.AbstractSensorを継承したクラスを作成し、Start()メソッドに起動時の処理を記述します。 /// 起動処理サンプルClass MonTest.Test Extends %SYS.Monitor.AbstractSensor{ Method Start() As %Status { // todo: ここに処理内容を記述します do ##class(%SYS.System).WriteToConsoleLog("startup test sensor in "_$namespace) Q $$$OK } Method GetSensors() As %Status { Quit $$$OK }} 2.ターミナルを起動し、プロダクションを設定しているネームスペースに移動、システムモニター管理(^%SYSMONMGR)を起動します。 USER> zn "PROD" PROD> do ^%SYSMONMGR メニューにて 3 (Configure System Monitor Classes) を選択します。 さらに、1 (Configure System Monitor Components) を選択します。 2 (Add Class)を選択し、「Class?」に対してモニタークラス(この例ではMonTest.Test)を入力します。 Enterキーを何度か押し、システムモニター管理を終了します。 3.ターミナルにて%SYSネームスペースに移動し、システムモニター管理を再度起動します。 PROD> zn "%SYS" %SYS> do ^%SYSMONMGR メニューにて 3 (Configure System Monitor Classes) を選択します。 さらに、2 (Configure Startup Namespaces) を選択します。 2 (Add Namespace)を選択し、「Namespace?」に対してプロダクションを設定しているネームスペースを入力します。 Namespace? PROD 何度かEnterキーを押して、システムモニター管理を終了します。 4.IRISを再起動します。 以上で、起動時にMonTest.TestクラスのStart()メソッドが実行されるかと思います。 注意点としましてはプロダクションを起動するプロセスとは別のプロセスで実行されますので、プロダクションの自動起動は設定せずに、Startメソッドからプロダクションを起動(Ens.DirectorクラスのStartProductionメソッド)したほうが良いかと思います。
記事へ Toshihiko Minamoto · 2022年12月15日 Ohataさん、こんにちは。Ubuntu環境のPythonバージョンですが、以下のマニュアルを見ますと、パッケージマネージャーによりOSで推奨されるバージョンで良いようです。https://docs.intersystems.com/irisforhealth20221/csp/docbookj/DocBook.UI.Page.cls?KEY=AEPYTHON#AEPYTHON_prereqs インストール後、%Service_CallInサービスを有効にする必要があります。忘れると、IRIS_ACCESSDENIED(-15)というエラーが発生します。これはシステム管理ポータルの「システム管理」「セキュリティ」「サービス」をクリックし「%Service_CallIn」をクリック、「サービス有効」をチェックし「保存」ボタンをクリックします。 また、pythonを起動する前(irisライブラリをインポートする前)に以下のように環境変数を登録する必要があります。 export IRISUSERNAME = IRISにログインするユーザ名 export IRISPASSWORD = IRISユーザのパスワード export IRISNAMESPACE = 接続するネームスペース
記事へ Toshihiko Minamoto · 2022年10月27日 Ohataさん、情報ありがとうございます!NOT NULL制約のカラムはNULLが入らない前提になっているので、NULLが入っていると、ヒットしてしまうのですね。
記事へ Toshihiko Minamoto · 2022年10月26日 Ohataさん、こんにちは。②について、カラム値がNULLかどうかを判定するには、IS NULL、IS NOT NULL を使用いただく必要があります。https://zenn.dev/indigo13love/articles/b3604502149b2fただ、記載いただいた結果ですと逆になっているようですが、こちらのIRIS 2022.1で試すとIS NULL では指定したカラム値がNULLのレコードがヒットしますが、= NULLではヒットしませんでした。
記事へ Toshihiko Minamoto · 2022年9月14日 Ohataさんこんばんは。カラムデータを取得する際にカラム名ではなく、カラム番号で取得するのは難しいでしょうか?例えば select A,B,C FROM Tableとしたときに、Cの値を取りたければ set var = rset.%Get("C")の代わりに set var = rset.%GetData(3)といった感じです。もし可能でしたら、カラム名からカラム番号に変換するという余分な処理をしなくても済むので早くなるのではないかと思います。
記事へ Toshihiko Minamoto · 2022年8月16日 Kobataさん、こんにちは。すみません、知見があるわけではないのですが、Ubuntu 22.04はIRIS 2022.2からサポートされる予定ですので、2022.2 プレビュー版をdocker上で動作させるか、2022.2の製品版が出てからUbuntu上にインストールいただいた方が無難かと思います。ただ、2022.2はCDリリースですのでadhocを出すことができませんので、adhocが必要なケースが想定されるのであれば、Ubuntu 20.04 LTSを利用された方が良いかと思います。 よろしくお願いします。