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ということに関しては、
現状、タスクで定期的にクラスをサーチするというベタな方法しか思いつきません。。。

ジェネレータメソッドを持つクラスを作成し、そのクラスを継承できれば良いのですが。。。

Furuzonoさん、情報ありがとうございます。
Windowsマシンで試したのですが、OS認証をONにするのを忘れてハマってしまったので、念のため情報共有しておきます。

OS認証をONにする方法

  1. システム管理ポータルの「システム管理」「セキュリティ」「システムセキュリティ」「認証/ウェブセッションオプション」メニューをクリックします。
  2. 以下のページが表示されますので、「OS認証を許可」をチェックし、「保存」ボタンをクリックします。  
  3. システム管理ポータルの「システム管理」「セキュリティ」「サービス」メニューをクリックします。
  4. 「%Service_Console」をクリックし、表示されるダイアログにて「オペレーティングシステム」をチェック、「保存」ボタンをクリックします。

あとはWindowsユーザと同じ名前のユーザを作成すれば(インストール時のWindowsユーザであれば自動的に作成されています)、バッチファイルからirisコマンドでルーチンやクラスが起動できました。

Ohataさん

ご連絡ありがとうございます。
ちなみに私の手元のIRIS 2020.3で試してみましたところ、アラートメッセージが送られました。
お手数ですが、サポートセンターに問い合わせて頂ければと思います。

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さん

すみません、instanceof と同等のメソッドとして、%IsA()メソッドがあります。これは、インスタンスがパラメータに指定されたクラスまたはそのサブクラスかどうかをチェックするものです。

USER>write a.%IsA("Sample.Person")
1

よろしくお願いします。

Ohataさん
こんにちは。

型(クラス名)を取得するには$classname()関数を使用したり、%ClassName()メソッドを使用します。
例えば、

USER> set a=##class(Sample.Person).%OpenId(1)
でaというインスタンスを作成した場合、

USER>write $classname(a)
Sample.Person

USER>write a.%ClassName(1)
Sample.Person

とクラス名が文字列で返ります。

 

Amanoさん、こんにちは。
非同期動作の場合、Serverメソッドを正常終了(quit $$$OK)すると、その後メッセージを受信するとOnClientMessage()が呼ばれます。

Method OnClientMessage(data As %String = "", close As %Integer) As %Status
{
    // メッセージ受信処理
    Quit 1
}

ここで、dataはクライアントから送信されたメッセージが入り、クライアントがWebSocketをcloseすると、closeパラメータに1が入ります。

OnClientMessageの戻り値が1の場合、正常終了とみなされます。
 

Amanoさん

投稿ありがとうございます。

ターミナルからの起動ではないので、エスケープシーケンス等正しく表示されない可能性はありますが、
Vscodeでの簡単な設定で、ルーチンやシステム関数の戻り値などをちょっと試すのに便利ですね。
 

Hiroseさん
投稿ありがとうございます。

現状、修正は依頼しているのですが、まだ最新のバージョンには反映されていないようです。
将来的には修正されるかと思います。
よろしくお願いいたします。