クラスのコンパイル時に、定義済みのプロパティ、クエリ、またはインデックスごとに対応する複数のメソッドが自動的に生成されます。 これらのメソッドは非常に便利です。 この記事では、その一部について説明します。
InterSystems CachéはマルチモデルのDBMSおよびアプリケーションサーバーです
クラスのコンパイル時に、定義済みのプロパティ、クエリ、またはインデックスごとに対応する複数のメソッドが自動的に生成されます。 これらのメソッドは非常に便利です。 この記事では、その一部について説明します。
これは InterSystems FAQ サイトの記事です。
2012.1以降管理ポータルの使用もライセンスを消費する様にシステムを変更しました。
これはインターシステムズが定める製品のライセンスポリシーとシステムの動作をできるだけ合わせる一連の措置の1つとして行われました。
この変更に伴いライセンス使用に関わる思わぬトラブルが発生する可能性がありますので注意が必要です。
特にライセンスの解放が管理ポータルページの操作法によって異なるため、その違いを十分認識して対処する必要があります。
管理ポータルのライセンスの解放はページの切断の仕方により以下の様に変わります。
a) ポータルを開き何らかの操作を行った後にログアウトを行うとライセンスは即時解放されます。
b) ポータルのページを開いた後、他に何も操作せずにログアウトを行うと一定の待ち時間の後にライセンスの解放が行われます。
この待ち時間はライセンスの意図的な規約違反を防ぐための措置であるため、設定等で変更できないようになっています。
c) ポータルを開き、ブラウザのXボタンやAlt+F4等のショートカットでページを強制的に閉じた場合は、デフォルトでは8時間後にライセンスの解放が行われます。
ライセンスの解放の時間は以下の操作で変更することができます。
管理ポータル:
[システム管理] > [セキュリ

RESTフレームワークの有用な機能の1つに、ディスパッチクラスがリクエストのプレフィックスを識別して別のディスパッチクラスに転送するという機能があります。 URLマップをモジュール化するこの手法により、コードの可読性が向上し、インターフェースの個別のバージョンが管理しやすくなります。また、特定のユーザーのみがアクセスできるように、API呼び出しを保護する手段も得ることができます。
CachéインスタンスにRESTサービスをセットアップするには、専用のSCPアプリケーションを定義して、それに関連付けられた、受信リクエストを処理するディスパッチクラスを作成する必要があります。 ディスパッチクラスは、%CSP.RESTを拡張し、URLマップを含むXDataブロックを含めます。 こうすることで、システムに、特定のリクエストを受信したときにどのメソッドを呼び出すのかを指示します。
以下に、例を示します。
XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ] { <Routes> <RouteUrl="/orders"Method="GET"Call="GetOrders"/> <RouteUrl="/orders"Method="POST"Call="NewOrder"/> </Ro
これは InterSystems FAQ サイトの記事です。
クラス定義の Property 定義文の名称を直接変更した場合、内部的には 元のプロパティを削除し、新しいプロパティを追加 したことになります。
このため、すでにデータを格納している永続クラスのプロパティ名をエディタで直接変更した場合、元のプロパティで設定されていた値にはアクセスができなくなります(新しいデータの格納位置が割り当てられます)。
また、変更したプロパティが必須(非ヌル)に指定されていた場合、データが存在しないために参照時にエラーが発生します。
以下の図は、左画面が変更前の状態、右画面がプロパティ名を変更してコンパイルを行った状態です。
基本的に、このような操作を行う場合は、あらかじめデータをエクスポートし、データの削除を行い、クラス定義の変更を行ってから、データを再インポートする方法が安全です。
または、スタジオのメニューの クラス > リファクタ > 名前変更 を利用してプロパティ名を変更します。
(リファクタの名前変更メニューにより、クラス定義内のストレージやメソッド定義に対して、一括でプロパティ名を変更できます。)
変更対象のクラス定義を開き、修正したいプロパティ名を選択し、スタジオのメニューの クラス > リファクタ > 名前変更 を選択します。
変更対象
.png)
この記事では、InterSystems Cachéにおけるマクロについて説明します。 マクロは、コンパイル中に一連の命令に置き換えられるシンボリック名です。 マクロは、渡されたパラメーターとアクティブ化したシナリオに応じて、呼び出されるたびに一連の命令セットに「展開」されます。 これは、静的コードの場合もあれば、ObjectScriptを実行して得られる結果である場合もあります。 それでは、アプリケーションでマクロをどのように使用できるのかを見てみましょう。
これは InterSystems FAQ サイトの記事です。
同一システムに InterSystems 製品を複数インストールした場合、ドライバマネージャに登録される InterSystems 用の ODBCドライバは、インストールされた製品の中で最新バージョンのドライバが登録されたままとなります。
以下のレジストリエントリを変更することで、任意のドライバへ変更できます。
なお、RegFiles.bat 実行では ODBCドライバは切り替わらないのでご注意ください。
レジストリエントリは、以下の通りです。
上記エントリには、現在使用中のドライバへのパスが記録されています。
これらを、切り替える対象となるドライバが存在するパスに変更してください。
この記事では、syslogテーブルについて説明したいと思います。 syslogとは何か、どのように確認するのか、実際のエントリはどのようなものか、そしてなぜそれが重要であるのかについて説明します。 syslogテーブルには、重要な診断情報が含まれることがあります。 システムに何らかの問題が生じている場合に、このテーブルの確認方法とどのような情報が含まれているのかを理解しておくことが重要です。
注記(2019年6月): 多くの変更がありました。最新の情報についてはこちらをご覧ください。 注記(2018年9月): この記事が最初に投稿されて以来、多くの変更がありました。Dockerコンテナバージョンを使用することをお勧めします。コンテナとして実行するためのプロジェクトと説明は、以前と同じGitHubの公開場所に残っていますので、ダウンロードして実行し、必要に応じて変更してください。
お客様と共にパフォーマンスレビュー、キャパシティ計画、およびトラブルシューティングに取り組む際、pButtonsから、Cachéとオペレーティングシステムのメトリクスを解凍してレビューすることがよくあります。 しばらく前、HTMLファイルを参照して、グラフ化するセクションを切り取ってExcelに貼り付ける代わりに、UNIXシェル、Perl、およAWKスクリプトで書かれたpButtonsメトリクスのアンパックユーティリティを使用する記事を投稿しました。 これは、時間を節約できる便利な手法ではありますが、内容が全部網羅されているわけではありません。 また、メトリクスを素早く確認して、レポートに含められるように、メトリクスを自動的にグラフ化するスクリプトも使用しています。 ただし、これらのグラフ作成スクリプトの管理は簡単に行えるわけではなく、iostatやwindows perfmonのディスクの
これは InterSystems FAQ サイトの記事です。
InterSystems製品のシステムモニタが色々なリソースの使用状況を監視しています。
そしてその使用状況に応じてアラートやワーニング情報をコンソールログ(message.log/cconsole.log)に出力します。
アラート情報が表示するCPUのリソースについては、以下のものが定義されています。
これは InterSystems FAQ サイトの記事です。
ローカル変数の容量は、プロセスに許可する最大メモリ割り当て容量によって制限されます。
この値は、システム構成パラメータの bbsiz で設定します(設定方法は記事の後半にあります)。
既定値は、1プロセスあたり、262,144 KB です。
※IRIS 2022.1 以降は、既定値が -1(最大値:制限なし) になりました。
※Caché/Ensemble 2012.1以前では 16,384 KB でした。
値は 256KB からスタートし、プロセスがより大きな領域を必要とする場合は、bbsiz で設定した値まで拡張します。
(バージョン2012.1以前では 128KB~49,536KB の範囲で設定できます。)
この値を超えるようなローカル変数の使用があると、 エラーが発生します。
現在のプロセスに残っている使用可能なメモリ量は、$STORAGE 変数で確認できます(バイト単位)。
詳細は以下ドキュメントページをご参照ください。
$STORAGEについて【IRIS】
$STORAGEについて
インターシステムズ製品のプロセス・メモリについて
一般的に多量のローカル変数を使うと、システムが稼動するために必要なメモリ量も増加します。
大規模システムの場合には、そのことが原因でメモリ不足が発生することもあり得るため注意
MonCaché — InterSystems Caché での MongoDB API 実装
プロジェクトの構想は、クライアント側のコードを変更せずに MongoDB の代わりに InterSystems Caché を使用できるように、ドキュメントを検索、保存、更新、および削除するための基本的な MongoDB(v2.4.9) API 機能を実装するところにあります。
おそらく、MongoDB に基づくインターフェースを使って、データストレージに InterSystems Caché を使用すると、パフォーマンスが向上するのではないか。 このプロジェクトは、学士号を取得するための研究プロジェクトとして始まりました。
ダメなわけないよね?! ¯\(ツ)/¯
この研究プロジェクトを進める過程で、いくつかの簡略化が行われました。

これは InterSystems FAQ サイトの記事です。
接続先クライアントのIPアドレス取得するには、以下の方法で %SYS.ProcessQuery クラスを使用します。
(a) 対象プロセス ID を指定して、ClientIPAddress プロパティ を参照します。
Set Process=##CLASS(%SYS.ProcessQuery).%OpenId("8656")
Write Process.ClientIPAddress
(b) 全てのプロセスの情報を知りたい場合は、必要な情報のみ取得する SQL クエリを作成し、クラス内で実行することができます。
例) SELECT * FROM %SYS.ProcessQuery で詳細情報を取得できます。
詳細は、以下ドキュメントをご参照ください。
%SYS.ProcessQueryについて【IRIS】
%SYS.ProcessQueryについて
これは InterSystems FAQ サイトの記事です。
<PROTECT> エラーを解消するには、システム全体のライブラリデータベース(※)の読み込み専用属性を外します。
※ InterSystems IRIS の場合は IRISLIB、Caché/Ensemble/HealthShare(Cachéベース) の場合は CACHELIB
ルーチンのインポートが完了しましたら、読み込み専用に忘れずに戻すようにしてください。
【バージョン2013.1~】
[管理ポータル] > [システム管理] > [構成] > [システム構成] > [ローカルデータベース]
データベース名のリンクから「読み込み専用でマウント」のチェックを外します。
【バージョン2011.1~バージョン2012.2】
[管理ポータル] > [システム管理] > [構成] > [システム構成] > [ローカルデータベース]
該当データベースの[編集]から「読込専用?」を変更します。
【バージョン2010.2以前】
[システム管理ポータル] > [構成] > [ローカルデータベース]
該当データベースの[編集]から「読込専用?」を変更します。
通常、システム全体のライブラリデータベース(IRISLIB/CACHELIB)には InterSystems 製品 で予約されている %付 のルーチン
GIS は Geographic Information System(地理情報システム)の略です。
これは、Caché の典型的な分野ではありませんが、 データ量の多い環境に違いありません。
主要分野には、次の 3 つがあります。
ビジュアルフロントエンド:
多数の商用およびオープンソース製品がカバーする成熟した分野です。
ここには Caché は必要ありません。
GIS の数学:
JTS(Java Topology Suite)は、すべての要件を網羅した固定標準です。Java Gateway によって、または Caché Call Out Gateway
を使ったこの標準ライブラリの C++ インカーネーションの C によって Caché にリンク付けることができます。
これまでのところ、Caché による付加価値はありません。
すべての地理オブジェクトとその属性、特に、道路地図、高速道路、会社、個人宅、鉄道、人口統計データなどの地理座標を保持しているデータベース
この分野で Caché が勝利を収めることができます。
従来の属性に基づいてデータを配信することをよく理解しているからです。 何も目新しい事ではありません。
課題は、場所の比較から始まります。 作業する地図は、境界矩形のコレクションとして表されており、
ここでのタスク

これは InterSystems FAQ サイトの記事です。
管理ポータルで設定できるメモリ関連の項目は、以下の通りです。
(項目としては他にもありますが、ここでは、ほとんど設定する必要のないものについては記載していません。)
管理ポータル [ホーム] > [システム管理] > [構成] > [システム構成] > [メモリと開始設定]
古いバージョンのメニューは以下の通りです。
【バージョン5.1~2010.x】
システム管理ポータル [ホーム] > [構成] > [メモリと開始設定] の設定内容
* データベースキャッシュ用メモリ
* ルーチンキャッシュ用メモリ 【バージョン2011.1.0~】
管理ポータル [ホーム] > [システム管理] > [構成] > [追加の設定] > [メモリ詳細設定]【バージョン 5.1~2010.x】
システム管理ポータル [ホーム] > [構成] > [メモリ詳細設定] の設定内容
* 一般メモリヒープ【gmheap】
* ロックテーブル【locksiz】
* IJCバッファ【ijcbuff】
* IJCデバイス【ijcnum】※カテゴリ:IO
* 照合テーブル最大数【nlstab】
設定の詳細は以下の通りです。
2023/9/1更新 添付のPDFに古い記載がありましたので、本文内を最新情報に更新しています。添付ではなく本文をご参照くだ
以前、WRCケースのエスカレーションを受けました。お客様は、Cachéに、rawDEFLATE圧縮/解凍機能が組み込まれているかを尋ねていました。
DEFLATEについて話すには、Zlibについても話す必要があります。Zlibは、90年代半ばに開発された無料の圧縮/解凍ライブラリで、、デファクトスタンダードとなっているからです。
Zlibは特定のDEFLATE圧縮/解凍アルゴリズムと、ラッパー(gzip、zlibなど)内でのカプセル化するという考えの下で動作します。
https://en.wikipedia.org/wiki/Zlib
Caché Object Script(COS)ではすでにGZIPがサポートされており、gzipファイルを使用するために、ファイルデバイスまたはtcpデバイス、またはStreamclassで/GZIP=1を使用できるようになっています。
http://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GOBJ_propstream_gzip
「CSP-Gateway/Web-Gateway」Webサーバーモジュールでも、Caché-Serverから受信するhttp-data送信をGZIP圧縮/解凍するために、Zlibライブラリが使用されています。 (CSP、Zen、SOA
IRIS で REST サーバを作成する際に準備する REST ディスパッチクラスを手動で作成する方法を解説します。
※関連ビデオで、OpenAPI 2.0 で定義したアプリケーションの仕様を利用する手順を使った API ファーストで作成するディスパッチクラスの解説ビデオもあります。
このビデオには、以下の関連ビデオがあります。
もくじ
最初~ 復習ビデオ/関連ビデオについて など
2:20~ 作成するディスパッチクラスの内容
4:20~ 手動でRESTディスパッチクラスを作成する方法(手順説明)
5:07~ VSCode:クラス定義作成(手順説明)
メモ:スタジオでの作成については、別のビデオでご説明しています。
8:18~ ベースURLの設定(管理ポータルでの設定)説明
8:49~ HTTP要求、応答を操作する
10:50~ HTTP要求、応答の操作に便利なクラスパラメータ
13:22~ VSCodeでのクラス定義作成(実演)
GET要求の実装
14:
これは InterSystems FAQ サイトの記事です。
ユーザーが作成したクラス定義は、クラス定義クラスの中に格納されます。
クラス定義一覧をプログラムから取得する方法として、「クラス定義クラス」を利用することができます。
メモ:クラス定義クラスとは、%Dictionary パッケージに含まれるクラス全般のことをさします。
以下サンプルコードでは、%Dictionary.ClassDefinitionQuery クラスの Summary クエリを利用してクラス定義一覧を取得しています。
Class ISJ.Utils
{
ClassMethod ClassInfo()
{
#dim ex As %Exception.AbstractException
try {
set currentNS=$NAMESPACE
while (1) {
read "ネームスペースを指定してください : ",x
if x'="" quit
}
set $NAMESPACE=x // ネームスペースの移動
write !! // 見やすくするために2回改行
Set statement = #これは InterSystems FAQ サイトの記事です。
InterSystems 製品を利用した REST/JSON の操作方法を、簡単なサンプルを利用して解説します。
サンプルでは、REST クライアント、HTML、ターミナルからデータ(JSON)を送信し、サーバ(InterSystems製品)で JSON 形式のデータを返す REST ディスパッチクラスを使った簡単な流れになっています。
サンプルは、https://github.com/Intersystems-jp/FAQ-REST-SimpleSample からダウンロードいただけます。
RESTディスパッチクラスとサンプルHTMLファイルが含まれています
管理ポータルからインポートします(スタジオを利用されている場合は、スタジオでもインポートできます)。
管理ポータルは http://localhost:52773/csp/sys/UtilHome.csp でアクセスできます。
※ ポート番号はお使いの環境に合わせて変更してください。
管理ポータルにアクセスできたら以下メニュ

これは InterSystems FAQ サイトの記事です。
OSのコマンド実行する場合、$ZF(-100) を使用します。
do $ZF(-100,"",program,args) // Windows コマンドを【同期】実行します。do $ZF(-100,"/ASYNC",program,args) // Windows コマンドを【非同期】実行します。mkdir, copy などのOSシェルコマンドを実行する場合は、/SHELL もあわせて指定します。
do $zf(-100,"/shell /async","mkdir","c:\temp\x")詳細は以下のドキュメントを参照してください。
これは InterSystems FAQ サイトの記事です。
InterSystems Data Platformは、データベースキャッシュやルーチンキャッシュなどの共有メモリを、起動時に割り当てます。
バージョン2007.1以降をWindows上で動作させる際、Windows特有の共有メモリに関する問題が生じることが判明しています。
詳細については、以下の技術資料をご参照ください。
また、以下の記事もあわせてご覧ください。
コンソールログに "Failed to allocate xxxMB shared memory using large pages..." のエラーメッセージが出ているとき
これは InterSystems FAQ サイトの記事です。
%Net.FtpSession クラスを使用して FTP サーバから、アップロード/ダウンロードする方法をご紹介します。
1. FTPサーバにイメージファイルをアップロードする
set tmpfile="c:\temp\test.jpg"
set ftp=##class(%Net.FtpSession).%New()
// ftp サーバへ接続する
do ftp.Connect("<サーバ名>","<ユーザ名>","<パスワード>")
// 転送モードをBINARYに設定
do ftp.Binary()
// アップロードするディレクトリに移動
do ftp.SetDirectory("/temp/upload")
// アップロードするファイルのストリームを用意
set file=##class(%File).%New(tmpfile)
do file.Open("UK\BIN\")
// ファイルをアップロード
// 第1引数: アップロード先に作成するファイル名
// 第2引数: アップロードするファイル・ストリーム
do ftp.Store("test.jpg",file)
// ftp サーバからログアウト
do ftp.Logouクラスにどのようなインデックスが必要であるのか、それをどのように定義するのかについて理解できたので、 次に、どのように処理するのかについて確認しましょう。
(注意: クラスに変更を適用する場合と同様に、ライブシステムにインデックスを追加する場合にもリスクが伴います。インデックスが入力されているときに、ユーザーがデータにアクセスしたり更新したりすると、クエリ結果が空になったり誤った結果が生じることがあります。また、構築中のインデックスが破損する場合もあります。 ライブシステムでインデックスを定義したり使用したりするには追加の手順があり、それについてはこのセクションで触れていますが、詳細はドキュメントに記載されています。)
新しいインデックスの準備ができたら、SQLオプティマイザが、クエリを実行する上で最も効率的に読み取れるインデックスであると判断するかどうかを確認できます。 プランを確認するために実際にクエリを実行する必要はありません。 クエリがあれば、プランをプログラムで確認することができます。
Set query = 1
Set query(1) = “SELECT SSN,Name FROM Sample.Per

これは InterSystems FAQ サイトの記事です。
システムクラス SYS.Lock のメソッド GetLockSpaceInfo() にてロックテーブルの空きサイズ、使用サイズが取得可能です。
戻り値は、“AvailableSpace, UsableSpace, UsedSpace” になり、それぞれByte単位の値を表しています。
AvailableSpace:ロックテーブルサイズから使用サイズ(UsedSpace)を引いたサイズ
UsableSpace:AvailableSpaceよりロック管理のための内部データを引いたサイズ
→これがユーザの使用できるロックテーブル空き容量になります。
UsedSpace:使用サイズ
詳細は、クラスリファレンス をご覧ください。
これは、SQLインデックスに関する2部構成の記事の前半です。
最後に図書館に行った時のことを思い出してください。 通常そこには、分野別(そして作者順と題名順)に整理された本が並び、それぞれの棚には、本の分野を説明したコードが記載された本立てがあります。 特定の分野の本を収集する場合、すべての通路を歩いて一冊ずつ本の表紙を読む代わりに、目的の分野の本棚に直接向かって選ぶことができるでしょう。
SQLインデックスにもこれと同じ機能があります。テーブルの各行にフィールドの値へのクイック参照を提供することで、パフォーマンスを向上させています。
インデックスの設定は、最適なSQLパフォーマンスを得られるようにクラスを準備する際の主なステップの1つです。
この記事では、次のことについて説明します。
この記事では、Sampleスキーマのクラスを参照します。 このスキーマは以下に示すGitHubリポジトリにあります。また、CachéとEns

ObjectScriptには、エラー(ステータスコード、例外、SQLCODEなど)を処理する方法が少なくとも3つあります。 ほとんどのシステムコードにはステータスが使用されていますが、例外は、いくつかの理由により、より簡単に処理することができます。 レガシーコードを使用している場合、さまざまな手法の変換にいくらか時間が掛かりますが、 参考として、次のスニペットをよく使用しています。 皆さんのお役にも立てればと思います。
///SQLCODEのステータス:set st = $$$ERROR($$$SQLError, SQLCODE, $g(%msg)) //埋め込みSQLset st = $$$ERROR($$$SQLError, rs.%SQLCODE, $g(rs.%Message)) //動的SQL///SQLCODEの例外:throw ##class(%Exception.SQL).CreateFromSQLCODE(SQLCODE,%msg) //埋め込みSQLthrow ##class(%Exception.SQL).CreateFromSQLCODE(rs.%SQLCODE,rs.%Message) //動的SQLthrow:(SQLCODE'=0)&&(SQLCODE'=100) ##class(%Exception.SQL).CreateFromS
これは InterSystems FAQ サイトの記事です。
InterSystems のミラーリングを使用することで、以下2つの目的を達成できます。
1 については、2台の InterSystems 製品を利用し、プライマリサーバの InterSystems 製品に障害が発生した場合は、もう片方の InterSystems 製品に自動フェイルオーバが行えるミラーリング構成です。
2 については、1台のプライマリサーバである InterSystems 製品から、遠隔地も含め、任意の拠点にある複数台の InterSystems 製品へ(=非同期ミラーメンバ)データベースファイル(InterSystems IRISは「IRIS.DAT」、Caché/Ensemble/HealthShareは「CACHE.DAT」)のミラーリングを行います。
(また、複数のプライマリサーバから1台の非同期メンバのInterSystems 製品へのミラーリングも行えます。)
詳細は以下ドキュメントをご参照ください。
InterSystems IRIS ミラーリングについて【IRIS】
ミラーリングについて
あわせて、以下の記事も是非ご覧ください。
Cache Mirroring 101:簡単なガ

数年ほど前、Caché Foundationsの講座(現「Developing Using InterSystems Objects and SQL」)において、%UnitTestフレームワークの基礎を講義していたことがあります。 その時、ある受講者から、ユニットテストを実行している間に、パフォーマンス統計を収集できるかどうかを尋ねられました。 それから数週間後、この質問に答えるために、%UnitTestの例にコードを追加したのですが、 ようやく、このコミュニティでも共有することにしました。
これは InterSystems FAQ サイトの記事です。
アプリケーションに求められる要件は日々複雑化しています。
しかし、複雑化するからといって開発のスピードおよび実行時のスピードが遅くなることは許されません。
複雑な要件を満たすために現在主流の手法ではソフトウェアスタック上の様々な部品(ミドルウェア、ライブラリ、フレームワークなど)を組み合わせる方法を取ります。
この方法は、様々なものを学習するための時間、それらを連携する方法、経年で様々なものが進化していくことに伴って各部品間の関係性が変化するためにそれらを維持管理していくための手間など様々な付帯的な作業が必要です。
結果として本来行いたいことに集中して取り組む前に付随する作業に忙殺されることになり開発生産性があがりません。
しかも実行時にも様々な部分が連携するためのオーバーヘッドを避けることができず期待する性能を確保することも困難になります。
一方インターシステムズのプラットフォームには上記要件を満たすのに必要十分な機能がひとつの首尾一貫した形で提供されており上記の様な手間がほとんど必要ありません。
さらにこのプラットフォームにはインターシステムズ独自の高性能、スケーラビリティの高いデータベースエンジンが内蔵されており様々なデータ処理を効率良く高速に処理します。
結果として本来行いたい作業に集中でき、アプリ
これは InterSystems FAQ サイトの記事です。
ユーザ定義エラーとして使用したいエラーコードと対応するメッセージを記述したXMLを用意します。
なお、エラーコードは負の整数で設定してください。
<?xml version="1.0" encoding="UTF-8" ?>
<MsgFile Language="ja">
<MsgDomain Domain="UserErrors">
<Message Id="-111" Name="MyError">エラーが発生しました</Message>
<Message Id="-222" Name="MyError2">エラーが発生しました2</Message>
</MsgDomain>
</MsgFile>
XML ファイルが作成できたら使用したいネームスペースにロードします。
set x=##class(%MessageDictionary).Import("error.xml")
ロード完了後、次のようなコマンドでユーザ定義エラーを取得、表示することができます。
USER>set error=$system.Status.Error(-111) // エラーコード -111 を指定してエラーを作成
USER>write $system.Sta