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?

$DATA

variable にデータがあるか否かを調べます。

Synopsis

$DATA(variable,target)
$D(variable,target)

パラメータ

variable 状態が確認される変数。ローカルあるいはグローバルの、添え字付きあるいは添え字なしの変数。この変数は未定義でもかまいません。単純なオブジェクト・プロパティ参照を variable として指定することはできません。構文 obj.property を使用すると、多次元プロパティ参照を variable として指定できます。
target オプション$DATAvariable の現在の値を返す変数。

概要

$DATA を使用して、処理する前に variable にデータがあるか否かを調べます。$DATA は、指定した変数についての情報を返します。variable パラメータは、あらゆる変数 (ローカル変数、プロセス・プライベート・グローバル、またはグローバル) の名前にできます。また、添え字付き配列の要素を含めることができます。これは多次元オブジェクト・プロパティであってもかまいませんが、非多次元オブジェクト・プロパティであってはいけません。

可能な状態値は、以下のとおりです。

状態値 意味
0 変数が未定義です。すべての参照によって <UNDEFINED エラーが発生します。
1 変数が存在し、データを含みますが、下位ノードはありません。NULL 文字列 ("") もデータと見なされます。
10 変数が下位ノード (他の配列要素の下方ポインタを含みます) を持つ配列要素を識別しますが、データは含みません。このような変数への直接参照は、<UNDEFINED> エラーになります。例えば、 y(1) が定義されているものの、y が定義されておらず、$DATA (y) が 10 を返す場合、set x = y は <UNDEFINED> エラーを生成します。
11 変数が下位ノード (他の配列要素の下方ポインタも含みます) を持つ配列要素を識別し、データも含みます。この種類の変数は、式で参照できます。

モジュロ 2 (#2) 演算を使用して、ブーリアン値を $DATA から返すことができます。$DATA(var)#2 は、未定義のステータス・コード (0 および 10) には 0 を返し、定義済みのステータス・コード (1 および 11) には 1 を返します。

状態値 1 と 11 は、データの種類ではなく存在のみを示します。

%SYSTEM.ProcessOpens in a new tab クラスの Undefined()Opens in a new tab メソッドを使用すると、未定義の変数が見つかった場合の動作を設定できます。<UNDEFINED> エラーの詳細は、"$ZERROR" 特殊変数を参照してください。

パラメータ

variable

データの存在に対してテストされる変数:

  • variable は、ローカル変数、グローバル変数、またはプロセス・プライベート・グローバル (PPG) 変数のいずれかにすることができます。これは添え字付きでも添え字なしでもかまいません。

    グローバル変数の場合は、拡張グローバル参照を含めることができます。添え字付きグローバル変数の場合は、ネイキッド・グローバル参照を使用して指定できます。未定義の添え字付きグローバル変数を参照するときでも、variable はネイキッド・インジケータをリセットするので、以下で説明されているように、今後のネイキッド・グローバル参照に影響が及びます。

  • variable は、例えば $DATA(..Count) などの、多次元オブジェクト・プロパティにすることができます。非多次元オブジェクト・プロパティとすることはできません。非多次元オブジェクト・プロパティで $DATA を使用しようとすると、<OBJECT DISPATCH> エラーが発生します。

    $DATA は、プロキシ・オブジェクト・プロパティのデータ・ステータス値を返すことはできません。その代わりに Caché は、指定されたプロパティが存在しないことを示すメッセージを発行します。このプロパティ・アクセスの制限は、"インターシステムズ・クラス・リファレンス" で定義されている、%ZEN.proxyObjectOpens in a new tab クラスに固有のものです。

  • variable^$ROUTINE 構造化システム変数の場合、返される状態値は 1 または 0 が可能です。

target

オプションのパラメータです。ローカル変数名、プロセス・プライベート・グローバル名、またはグローバル名を指定します。この target 変数は定義する必要はありません。target が指定されている場合、$DATAtargetvariable の現在のデータ値を書き込みます。variable が未定義の場合、target 値は変化しません。

ZBREAK コマンドでは、ウォッチポイントとしての target パラメータは指定できません。

この例では、^client 配列から選択した範囲のレコードを書き込みます。^client 配列 は 3 段階のスパース配列で構成されています。最初の添え字には顧客名、第 2 添え字には顧客の住所、第 3 添え字には顧客の口座、口座番号、残高が含まれています。顧客は 4 種類までの口座を持つことができます。3 つの添え字のどこかに未定義の要素があるかもしれません。一般的なレコードの内容は、以下のようになる場合があります。

^client(5) John Jones
^client(5,1) 23 Bay Rd./Boston/MA 02049
^client(5,1,1) Checking/45673/1248.00
^client(5,1,2) Savings/27564/3270.00
^client(5,1,3) Reserve Credit/32456/125.00
^client(5,1,4) Loan/81263/460.00

以下のコードは 3 つの各配列添え字の出力を処理するために、別々のサブルーチンを提供します。各サブルーチンの始めに $DATA 関数を使用して、現在の配列要素をテストします。

Level 1、Level 2、Level 3 の $DATA=0 テストは、現在の配列要素が未定義であるかどうかをテストします。True であれば、コードはQUIT して前のレベルに戻ります。

Level 1 と Level 2 の $DATA=10 テストは、現在の配列要素がデータを含まずに、下位の要素へのポインタを含んでいるかどうかを調べます。True であれば、コードが "No Data" と書き出します。それから、コードは次の下位レベルの FOR ループ・プロセスに飛びます。このレベルの下に要素はないので、Level 3 の $DATA=10 テストは実行されません。

Level 2 と Level 3 の WRITE コマンドは、$PIECE 関数を使用して、現在の配列要素から適切な情報を取り出します。

Start  Read !,"Output how many records: ",n
  Read !,"Start with record number: ",s
  For i=s:1:s+(n1) {
    If $Data(^client(i)) {
      If $Data(^client(i))=10 {
        Write !," Name: No Data"
      }
      Else {
        Write !," Name: " ,^client(i)
      }
      If $Data(^client(i,1)) {
        If $Data(^client(i,1))=10 {
                            Write !,"Address: No Data"
        }
        Else {
            Write !,"Address: ",$Piece(^client(i,1),"/",1)
            Write " , ",$Piece(^client(i,1),"/",2)
          Write " , ",$Piece(^client(i,1),"/",3)
        }
      }
      For j=1:1:4 {
        If $Data(^client(i,1,j)) {
             Write !,"Account: ",$Piece(^client(i,1,j),"/",1)
          Write " #: ",$Piece(^client(i,1,j),"/",2)
          Write " Balance: ",$Piece(^client(i,1,j),"/",3)
        }
      }
    }
  }
  Write !,"Finished."
  Quit

実行されると、このコードは以下のような出力をする場合もあります。

Output how many records: 3
Start with record number: 10
Name: Jane Smith
Address: 74 Hilltop Dr., Beverly, MA 01965
Account: Checking #: 34218 Balance: 876.72
Account: Reserve Credit #: 47821 Balance: 1200.00
Name: Thomas Brown
Address: 46 Huron Ave., Medford, MA 02019
Account: Checking #: 59363 Balance: 205.45
Account: Savings #: 41792 Balance: 1560.80
Account: Reserve Credit #: 64218 Balance: 125.52
Name: Sarah Copley
Address: No Data
Account: Checking #: 30021 Balance: 762.28

以下の例で、多次元プロパティは variable 値として使用されます。この例では、定義されているすべてのネームスペースの名前を target パラメータに返します。

  SET obj = ##class(%ResultSet).%New("%SYS.Namespace:List")
  DO obj.Execute()
  WRITE $DATA(obj.Data,targ),!                // returns 0
  SET targ="blank"
  WHILE targ'="" {
     DO obj.Next()
     WRITE $DATA(obj.Data,targ)               // returns 10
     WRITE " ",$DATA(obj.Data("Nsp"),targ),!  // returns 1
     IF targ'="" {
     WRITE "Namespace: ",targ,! }
     }
   WRITE !,"Done!"

$GET 関数を使用した同様のプログラムでも同じ情報を返します。

メモ

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

$DATA は、グローバル変数と共に使用されるとき、ネイキッド・インジケータを設定します。ネイキッド・インジケータは、指定されたグローバル変数が定義されていない場合 (状態値は 0)でも設定されます。

同じグローバル変数への後続の参照は、以下の例で示されるようにネイキッド・グローバル参照を使用することができます。

   IF $DATA(^A(1,2,3))#2 {
     SET x=^(3)  }

ネイキッド・グローバル参照とグローバル変数での $DATA の使用に関する詳細は、"Caché グローバルの使用法" の "多次元ストレージの使用法 (グローバル)" を参照してください。

ネットワーク環境でのグローバル参照

定義されていないグローバル変数を繰り返し参照するために $DATA 関数を使用すると (例えば、^x が定義されていない $DATA(^x(1)) など)、グローバルが ECP サーバで定義されているかどうかをテストするネットワーク処理が常に必要となります。

定義されたグローバル変数内で、定義されていないノードを繰り返し参照するために $DATA を使用すると (例えば、^x にあるその他のノードがすべて定義済みの $DATA(^x(1)))、いったんグローバルの一部 (^x) がクライアント・キャッシュに格納された後には、ネットワーク処理が必要なくなります。

詳細は、"Caché 分散データ管理ガイド" の "分散アプリケーションの開発" を参照してください。

$DATA に関連している関数

関連情報については、"$GET" と "$ORDER" を参照してください。$ORDER は、データを含む配列にある次の要素を選択するので、配列添え字をループするときに $DATA テストを実行する必要がありません。

関連項目

FeedbackOpens in a new tab