Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

$NAME

変数の名前値、もしくは添え字参照部分を返します。

Synopsis

$NAME(variable,integer)
$NA(variable,integer)

パラメータ

variable 名前値が返される変数。添え字付きあるいは添え字なしのローカル変数やグローバル変数を指定できます。定義済みの変数である必要はありません。ただし、定義済みのプライベート変数ではないことが必要です。variable が添え字付きのグローバルの場合は、ネイキッド・グローバル参照を指定できます。
integer オプション — 添え字参照のどの部分 (レベル) を返すか指定する数値。正の整数、変数名、式を指定できます。この場合、variable は添え字付き参照である必要があります。

概要

$NAMEvariable として提供されている変数名参照の、フォーマットされた形式を返します。この変数が定義済みであるか、またはデータ値を持つかなどのチェックは行いません。$NAME が返す値は、使用するパラメータによって決まります。

  • $NAME(variable) は、キャノニック形式で (完全な拡張参照として) 指定した変数名の値を返します。

  • $NAME(variable,integer) は、添え字参照の一部を返します。特に、integer は関数によって返される添え字数を制御します。

この関数を実行しても、ネイキッド・インジケータに影響はありません。

パラメータ

variable

variable は、ローカル変数、プロセス・プライベート・グローバル変数、またはグローバル変数です。これは添え字なしでも添え字付きでもかまいません。variable は、グローバル変数である場合は拡張グローバル参照を使用できます。$NAME は、指定された拡張グローバル参照を返しますが、その際に、指定されたネームスペースが存在するかどうかや、ユーザがそのネームスペースに対するアクセス特権を持っているかどうかを確認しません。この関数は、ネームスペース名を大文字にしません。variable がネイキッド・グローバル参照の場合、$NAME は、完全なグローバル参照を返します。variable がプライベート変数である場合は、コンパイル・エラーが発生します。

これは多次元オブジェクト・プロパティであってもかまいませんが、非多次元オブジェクト・プロパティであってはいけません。非多次元オブジェクト・プロパティで $NAME を使用しようとすると、<OBJECT DISPATCH> エラーが発生します。

$NAME は、SET を使用して変更できるものも含めて、特殊変数を返すことはできません。特殊変数を返そうとすると、<SYNTAX> エラーが発生します。

integer

variable が添え字付き参照のとき、integer パラメータが使用されます。integer の値が 0 のとき、$NAME は変数名のみを返します。integer 値が variable の添え字数よりも小さい場合、$NAMEinteger 値で示される添え字数のみを返します。integervariable の添え字数よりも大きい場合、$NAME は完全添え字参照を返します。

variable が添え字なしの場合、integer の値は無視され、$NAME は変数名を返します。integer が NULL 文字列 ("")、または数値以外の文字列の場合、$NAME は添え字なしの変数名を返します。

integer の値は、標準整数解析を受け取ります。例えば、先頭のゼロとプラス符号は無視されます。小数桁は切り捨てられ、無視されます。負の integer 値は、<FUNCTION> エラーとなります。

この例では、integer パラメータが返すレベルを指定します。integer で指定した添え字数が添え字レベルの数 (この場合は 3) と一致するか、またはそれを超えるとき、$NAME は 1 パラメータ形式が指定されたかのように、すべての定義済みレベルを返します。integer レベルにゼロ (0)、NULL 文字列 ("")、または数値以外の文字列 ("A" など) を指定した場合、$NAME は配列名を返します (この場合は "^client")。

   SET ^client(4)="Vermont"
   SET ^client(4,1)="Brattleboro"
   SET ^client(4,1,1)="Yankee Ingenuity"
   SET ^client(4,1,2)="Vermonster Systems"
   WRITE !,$NAME(^client(4,1,1),1) ; returns 1 level
   WRITE !,$NAME(^client(4,1,1),2) ; returns 2 levels
   WRITE !,$NAME(^client(4,1,1),3) ; returns 3 levels
   WRITE !,$NAME(^client(4,1,1),4) ; returns all (3) levels
   WRITE !,$NAME(^client(4,1,1),0) ; returns array name
   WRITE !,$NAME(^client(4,1,1),"") ; returns array name
   WRITE !,$NAME(^client(4,1,1))    ; returns all (3) levels

以下の例では、$NAME は、ループの中でネイキッド参照と共に使用され、現在の (ユーザが提供した) 配列レベルのすべての要素の値を出力します。

   READ !,"Array element: ",ary
   SET x=@ary ; dummy operation to set current array and level
   SET y=$ORDER(^("")) ; null string to find beginning of level
   FOR i=0:0 {
     WRITE !,@$NAME(^(y)) 
     SET y=$ORDER(^(y)) 
     QUIT:y=""
   }

最初の SET コマンドは、ユーザ提供の配列とその後のネイキッド参照の基準としてのレベルを確立するために、仮の割り当てを実行しています。$ORDER 関数は、ネイキッド参照と共に使用され、現在のレベルで最初の添え字数 (負あるいは正) を返します。

FOR ループの WRITE コマンドは、ネイキッド参照と引数の間接指定を $NAME と共に使用して、現在の要素の値を出力します。SET コマンドは、ネイキッド・グローバル参照を $ORDER と共に使用して、データを含む次の要素の添え字を返します。最後に、後置条件付きの QUIT は、$ORDER の返り値を確認し、現在のレベルの最後を検索して、ループ処理を終了します。

名前や添え字の間接指定に、返した $NAME 文字列値を使用したり、パラメータとしてルーチンやユーザ定義関数に渡します。詳細は、"Caché ObjectScript の使用法" の "間接演算" を参照してください。指定したノードの下位ノードをリストするルーチン ^DESCEND を考えてみます。

DESCEND(ROOT)  ;List descendant nodes
   NEW REF 
   SET REF=ROOT
   IF ROOT'["(" {
       FOR {
       SET REF=$QUERY(@REF) 
       QUIT:REF="" 
       WRITE REF,! }
   }
   ELSE {
     SET $EXTRACT(ROOT,$LENGTH(ROOT))=","
     FOR {
       SET REF=$QUERY(@REF)
       QUIT:REF'[ROOT 
       WRITE REF,!   }
   }

以下の例は、$NAME を使用して、前例で定義された ^DESCEND ルーチンにパラメータを渡す方法を示しています。

   FOR var1="ONE","TWO","THREE" { 
     DO ^DESCEND($NAME(^X(var1))) }  

^X("ONE",2,3)

メモ

$NAME の使用

$DATA 関数と $ORDER 関数で使用する配列要素の名前値を返すには、通常 $NAME を使用します。

配列要素に対する参照に式が含まれている場合、$NAME はキャノニック形式の名前を返す前にその式を評価します。例えば以下のようになります。

   SET x=1+2
   SET y=$NAME(^client(4,1,x))
   WRITE y

$NAME は、変数 x を評価して、値 ^client(4,1,3) を返します。

ネイキッド・グローバル参照

$NAME はネイキッド・グローバル参照も受け入れ、そのキャノニック形式 (つまり完全な (非ネイキッド) 参照) で名前値を返します。ネイキッド参照は配列名なしで指定され、最近実行されたグローバル参照を示します。以下の例では、最初の SET コマンドはグローバル参照を作成して、2 つ目の SET コマンドはネイキッド・グローバル参照と共に $NAME 関数を使用しています。

   SET ^client(5,1,2)="Savings/27564/3270.00"
   SET y=$NAME(^(3))
   WRITE y

この場合、$NAME は ^client(5,1,3) を返します。現在のレベルで、元の値である添え字値 (2) を、提供された添え字値 (3) に置き換えます。

詳細は、"Caché グローバルの使用法" の "ネイキッド・グローバル参照" を参照してください。

拡張グローバル参照

%SYSTEM.ProcessOpens in a new tab クラスの RefInKind()Opens in a new tab メソッドを使用して、$NAME が拡張グローバル参照形式で名前の値を返すかどうかを、プロセスごとに制御できます。システム全体の既定の動作は、Config.MiscellaneousOpens in a new tab クラスの RefInKindOpens in a new tab プロパティで設定できます。

拡張参照モードが有効な場合、以下の例は、^MyRoutine (2 つ目の例で示されています) だけでなく、定義済みのネームスペースと名前 ^["PAYROLL"]MyRoutine (1 つ目の例で示されています) を返します。

   DO ##class(%SYSTEM.Process).RefInKind(0)
   WRITE $NAME(^["PAYROLL"]MyRoutine)
   DO ##class(%SYSTEM.Process).RefInKind(1)
   WRITE $NAME(^["PAYROLL"]MyRoutine)

拡張グローバル参照構文に関する詳細は、"Caché グローバルの使用法" の "グローバル構造" の章を参照してください。

関連項目

FeedbackOpens in a new tab