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?

SET

値を変数に代入します。

Synopsis

SET:pc setargument,... 
S:pc setargument,...

setargument には、以下を指定できます。

variable=value 
(variable-list)=value

引数

pc オプション — 後置条件式
variable 対応する value に設定される変数。variable は、ローカル変数、プロセス・プライベート・グローバル、グローバル、オブジェクト・プロパティ、または特殊変数にできます。(すべての特殊変数がアプリケーションによって設定されるわけではありません。詳細は、それぞれの特殊変数のドキュメントを参照してください。)
variable-list 1 つ、または複数の variable 引数で構成されている、括弧で囲まれたコンマ区切りのリスト。variable-list のすべての variable 引数に、同じ value が代入されます。
value リテラル値、または値に評価される有効な ObjectScript 式。JSON オブジェクトまたは JSON 配列を指定できます。

説明

SET コマンドは、値を変数に代入します。単一の変数、または、2 つの構文形式の任意の組み合わせで、複数の変数を設定できます。variable=value の組み合わせのコンマ区切りのリストを指定することで、変数に値を代入できます。次に例を示します。

   SET a=1,b=2,c=3
   WRITE a,b,c

SET a=value,b=value,c=value,... コマンドの 1 回の呼び出しで実行できる代入数には、制限はありません。

指定された変数が存在しない場合、SET は変数を作成し、値を代入します。指定された変数が存在する場合、SET は前の値を指定された値で置換します。SET は左から右の順に実行されるので、以下のように値をある変数に割り当てた後に、その変数を他の変数に割り当てることができます。

   SET a=1,b=a
   WRITE a,b

値は、文字列、数値、JSON オブジェクト、JSON 配列、またはこれらの値のいずれかに評価される式です。“空”の変数を定義するには、変数を空の文字列 ("") の値に設定します。

複数の変数に同じ値を設定する方法

SET を使用して、複数の変数に同じ値を割り当てるには、括弧で囲んだ変数のコンマ区切りリストを指定します。次に例を示します。

   SET (a,b,c)=1
   WRITE a,b,c

これら 2 つの SET 構文形式は、任意の方法で組み合わせることができます。次に例を示します。

   SET (a,b)=1,c=2,(d,e,f)=3
   WRITE a,b,c,d,e,f

SET (a,b,c,...)=value の 1 回の呼び出しで実行できる最大代入数は、128 です。この数を超えると、<SYNTAX> エラーが返されます。

SET (a,b,c,...)=value 構文を使用して、相対オフセット構文を使用する関数 ($EXTRACT$PIECE、または $LIST 関数) に値を割り当てることはできません。相対オフセット構文では、アスタリスクが文字列の末尾を表し、*-n および *+n が文字列の末尾からの相対オフセットを表します。相対オフセットを使用してこれらの関数のいずれかを設定する場合は、SET a=value,b=value,c=value,... 構文を使用する必要があります。

引数

pc

オプションの後置条件式です。Caché は、後置条件式が True (0 以外の数値) の場合にこのコマンドを実行します。Caché は、後置条件式が False (0) の場合はコマンドを実行しません。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。

variable

value の評価の結果の値を受け取る変数です。ローカル変数プロセス・プライベート・グローバルグローバル変数、または特殊変数を指定できます。ローカル変数、プロセス・プライベート・グローバル、またはグローバル変数は、添え字付きでも添え字なしでもかまいません (詳細は "SET と添え字" を参照)。グローバル変数は、拡張グローバル参照で指定できます (詳細は、"Caché グローバルの使用法" の "グローバル構造" を参照してください)。

ローカル変数、プロセス・プライベート・グローバル、グローバル変数、または特殊変数は、現在のプロセスに対して固有で、マッピングすると、すべてのネームスペースからアクセスできます。グローバル変数は、それを作成したプロセスが終了しても存続します。

グローバルは、作成元のネームスペースに対して固有です。既定では、SET コマンドにより現在のネームスペースにグローバルが割り当てられます。SET ^["Samples"]myglobal="Ansel Adams" のような構文を使用すると、SET を使用して別のネームスペースのグローバル (^myglobal) を定義できます。存在しないネームスペースを指定した場合、Caché は <NAMESPACE> エラーを発行します。特権を持たないネームスペースを指定した場合、Caché は <PROTECT> エラーを発行し、続けてグローバル名とデータベース・パスを表示します (例:<PROTECT> ^myglobal,c:\intersystems\cache\mgr\)。

変数は、$PIECE 関数、または $EXTRACT 関数の引数で指定される、変数の一部、またはセグメントのいずれかです。

変数は、obj.property 構文または .. property 構文を使用してオブジェクト・プロパティとして表現できます。また、$PROPERTY 関数を使用して表現することもできます。以下の構文を使用して、i%property インスタンスのプロパティ・リファレンスを設定できます。

  SET i%propname = "abc"

SET は任意の長さの変数名を受け入れますが、長い変数名は値を割り当てる前に 31 文字に切り捨てられます。変数名の最初の 31 文字が一意ではない場合、この名前への切り捨てを行うと、以下の例のように、変数値が意図せずに上書きされる場合があります。

  SET abcdefghijklmnopqrstuvwxyz2abc="30 characters"
  SET abcdefghijklmnopqrstuvwxyz2abcd="31 characters"
  SET abcdefghijklmnopqrstuvwxyz2abcde="32 characters"
  SET abcdefghijklmnopqrstuvwxyz2abcdef="33 characters"
  WRITE !,abcdefghijklmnopqrstuvwxyz2abc     // returns "30 characters"
  WRITE !,abcdefghijklmnopqrstuvwxyz2abcd    // returns "33 characters"
  WRITE !,abcdefghijklmnopqrstuvwxyz2abcde   // returns "33 characters"
  WRITE !,abcdefghijklmnopqrstuvwxyz2abcdef  // returns "33 characters"

特殊変数とは、システム・イベントによって設定されるものです。SET を使用して、特定の特殊変数に値を割り当てることができます。ただし、ほとんどの特殊変数には、SET を使用して値を割り当てることができません。個別の特殊変数に関する詳細は、リファレンスを参照してください。

変数の種類および名前付け規則の詳細は、"Caché ObjectScript の使用法" の “変数” の章を参照してください。

value

リテラル値、定義した変数、または任意の有効な ObjectScript 式。通常、value は数式、または文字列式のいずれかです。value には、JSON オブジェクトまたは JSON 配列を指定できます。

  • 数値はキャノニック形式に変換されてから代入されます。先頭と末尾にあるゼロ、先頭にある + 記号、および末尾にある小数点が取り除かれます。科学的記数法からの変換および算術演算の評価が実行されます。

  • 文字列の値は引用符で囲みます。文字列は、内部の二重引用符が一重引用符に変換されない限り、未変更のまま代入されます。NULL 文字列 (“”) は、有効な value として評価されます。

  • 引用符で囲まれた数値はキャノニック形式に変換されないため、代入の前に算術演算は実行されません。

  • 関係式または論理式が使用された場合、Caché は式の結果である真偽値 (0 または 1) を代入します。

  • 値を返すオブジェクトのプロパティとメソッドは有効な式になります。相対ドット構文 (..) を使用して、変数にプロパティまたはメソッドの値を代入します。

JSON 値

SET コマンドを使用して変数を JSON オブジェクトまたは JSON 配列に設定できます。JSON オブジェクトの場合、value は中括弧で区切られた JSON オブジェクトです。JSON 配列の場合、value は角括弧で区切られた JSON 配列です。

これらの区切り内では、リテラル値は JSON リテラルです。ObjectScript リテラルではありません。無効な JSON リテラルを使用すると <SYNTAX> エラーが発生します。

  • 文字列リテラル:JSON 文字列を二重引用符で囲む必要があります。特定の文字を JSON 文字列内のリテラルとして指定するには、\ エスケープ文字を指定し、その後にリテラルを指定する必要があります。JSON 文字列に二重引用符リテラル文字が含まれている場合、この文字は \" と記述されます。JSON 文字列構文では、二重引用符 (\")、バックスラッシュ (\\)、およびスラッシュ (\/) をエスケープできます。行スペース文字 (バックスペース (\b)、フォームフィード (\f)、改行 (\n)、キャリッジ・リターン (\r)、およびタブ (\t)) もエスケープできます。すべての Unicode 文字は、6 文字のシーケンス (バックスラッシュ、その後に小文字の u、その後に 4 桁の 16 進数) で表すことができます。例えば、\u0022 はリテラルの二重引用符文字を指定します。\u03BC は、ギリシア語の小文字の Mu を指定します。

  • 数値リテラル:JSON では、数値を ObjectScript キャノニック形式に変換しません。JSON には独自の変換規則と検証規則があります:先頭のマイナス符号は 1 つのみ許可されます。先頭のプラス符号は許可されません。複数の先頭符号は許可されません。“E” 科学的記数文字は許可されていますが、評価されません。先頭のゼロは許可されません。末尾のゼロは保持されます。小数点区切り文字の両側に数字を記述する必要があります。したがって、JSON 数値 00.00.4、および 0.400 は有効です。ゼロ値の負の符号は保持されます。

    IEEE 浮動小数点数の場合、追加の規則が適用されます。詳細は、"$DOUBLE" 関数を参照してください。

    JSON の小数は、ObjectScript の数値とは異なる形式で格納されます。ObjectScript の浮動小数点数は、最大精度に達すると丸められ、末尾のゼロは削除されます。JSON でパックされた BCD の小数は精度の向上が可能になり、末尾のゼロは保持されます。以下に例を示します。

      SET jarray=[1.23456789123456789876000,(1.23456789123456789876000)]
      WRITE jarray.%ToJSON()
  • 特別な値:JSON は、次の特殊な値をサポートしています:truefalse、および null。これらは、引用符で囲まれていないリテラルとして小文字で指定する必要がある、リテラル値です。これらの JSON 特殊値は、変数を使用して指定することも、ObjectScript 式で指定することもできません。

  • ObjectScript:JSON 配列要素または JSON オブジェクト値に、ObjectScript リテラルまたは式を含めるには、文字列全体を括弧で囲む必要があります。JSON オブジェクト・キーに ObjectScript を指定することはできません。ObjectScript と JSON は、異なるエスケープ・シーケンス規則を使用します。ObjectScript で二重引用符文字をエスケープするには、二重にします。以下の例では、JSON 文字列リテラルおよび ObjectScript 文字列リテラルが JSON 配列で指定されています。

      SET jarray=["This is a \"good\" JSON string",("This is a ""good"" ObjectScript string")]
      WRITE jarray.%ToJSON()

    次の JSON 配列の例では、ObjectScript ローカル変数を指定し、キャノニック形式への ObjectScript 数値変換を実行します。

      SET str="This is a string"
      SET jarray=[(str),(--0007.000)]
      WRITE jarray.%ToJSON()

    次の例では、JSON オブジェクト値で ObjectScript 関数を指定しています。

      SET jobj={"firstname":"fred","namelen":($LENGTH("fred"))}
      WRITE jobj.%ToJSON()

JSON オブジェクト

value には、中括弧で区切られた JSON オブジェクトを指定できます。variable は、3@%Library.DynamicObject のように oref に設定されます。%Get() メソッドを使用することで、この oref で指定されたキーの値を取得できます。%ToJSON() 関数を使用することで、この oref を JSON オブジェクト値に解決できます。以下に例を示します。

  SET jobj={"firstname":"Fred"}
  WRITE "JSON object reference = ",jobj,!
  WRITE "key value = ",jobj.%Get("firstname"),!
  WRITE "JSON object value = ",jobj.%ToJSON()

有効な JSON オブジェクトの形式は、以下のとおりです。

  • 左中括弧で始まり、右中括弧で終わります。空のオブジェクト {} は有効な JSON オブジェクトです。

  • 中括弧の内部は、key:value ペアまたはコンマで区切られた key:value ペアのリストです。キー・コンポーネントと値コンポーネントの両方が JSON リテラルです。ObjectScript リテラルではありません。

  • キー・コンポーネントは JSON の引用符付きの文字列リテラルでなければなりません。括弧で囲まれた ObjectScript リテラルまたは式にすることはできません。

  • 値コンポーネントには、JSON 文字列または JSON 数値リテラルを指定できます。JSON リテラルは JSON 検証条件に従います。値コンポーネントには、括弧で囲まれた ObjectScript リテラルまたは式を指定できます。値コンポーネントは、文字列、数値、JSON オブジェクト、または JSON 配列を指定する定義済み変数として指定できます。値コンポーネントには、入れ子になった JSON オブジェクトまたは JSON 配列を含めることができます。値コンポーネントに、小文字の true、false、null の 3 つの特殊な JSON 値のいずれかを引用符なしのリテラルとして指定することもできます。ただし、変数を使用してこれらの特殊な JSON 値を指定することはできません。

以下はすべて有効な JSON オブジェクトです。{"name":"Fred"}{"name":"Fred","city":"Bedrock"}{"bool":true}{"1":true,"0":false,"Else":null}{"name":{"fname":"Fred","lname":"Flintstone"},"city":"Bedrock"}{"name":["Fred","Wilma","Barney"],"city":"Bedrock"}

JSON オブジェクトでは、以下の例に示すように、null プロパティ名を指定し、これに値を割り当てることができます。

  SET jobj={}
  SET jobj.""="This is the ""null"" property value"
  WRITE "JSON null property object value = ",jobj.%ToJSON()

返される JSON 文字列は、リテラルの二重引用符文字に JSON エスケープ・シーケンス (\") を使用します。

詳細は、"JSON の使用" の “ダイナミック・オブジェクトの作成” を参照してください。

JSON 配列

value には、角括弧で区切られた JSON 配列を指定できます。variable は、1@%Library.DynamicArray のように oref に設定されます。この oref は、%ToJSON() 関数を使用して JSON 配列値に解決できます。以下に例を示します。

  SET jary=["Fred","Wilma","Barney"]
  WRITE "JSON array reference = ",jary,!
  WRITE "JSON array value = ",jary.%ToJSON()

有効な JSON 配列の形式は、以下のとおりです。

  • 開始角括弧で始まり、終了角括弧で終わります。空の配列 [] は有効な JSON 配列です。

  • 角括弧の内部は、要素またはコンマで区切られた要素のリストです。配列の各要素には、JSON 文字列または JSON 数値リテラルを指定できます。JSON リテラルは JSON 検証条件に従います。配列要素には、括弧で囲まれた ObjectScript リテラルまたは式を指定できます。配列の要素は、文字列、数値、JSON オブジェクト、または JSON 配列を指定する定義済み変数として指定できます。配列の要素には、1 つ以上の JSON オブジェクトまたは JSON 配列を含めることができます。配列の要素に、小文字の true、false、null の 3 つの特殊な JSON 値のいずれかを引用符なしのリテラルとして指定することもできます。ただし、変数を使用してこれらの特殊な JSON 値を指定することはできません。

以下はすべて有効な JSON 配列です。[1][5,7,11,13,17]["Fred","Wilma","Barney"][true,false]["Bedrock",["Fred","Wilma","Barney"]][{"name":"Fred"},{"name":"Wilma"}][{"name":"Fred","city":"Bedrock"},{"name":"Wilma","city":"Bedrock"}][{"names":["Fred","Wilma","Barney"]}]

詳細は、"JSON の使用" の “動的配列の作成” を参照してください。

以下は、同じ SET コマンドで複数の引数を指定する例です。具体的には、このコマンドは 3 つの変数に値を代入します。引数は左から右の順に評価されます。

   SET var1=12,var2=var1*3,var3=var1+var2
   WRITE "var1=",var1,!,"var2=",var2,!,"var3=",var3

以下は、SET コマンドの (variable-list)=value 形式の例です。複数の変数に同じ値を代入します。具体的には、このコマンドは 3 つの変数に、値 0 を代入します。

   SET (sum,count,average)=0
   WRITE "sum=",sum,!,"count=",count,!,"average=",average

以下は、拡張グローバル参照を使用して、異なるネームスペースで添え字付きのグローバル変数を設定する例です。

  NEW $NAMESPACE
  SET $NAMESPACE="%SYS"
  SET ^["user"]nametest(1)="fred"
  NEW $NAMESPACE
  SET $NAMESPACE="USER"
  WRITE ^nametest(1)
  KILL ^nametest

オブジェクトでの SET コマンド

以下は、3 つの SET コマンドを含む例です。1 番目は変数を oref (オブジェクト参照) に設定し、2 番目は変数をオブジェクト・プロパティの値に、3 番目はオブジェクト・プロパティを値に設定しています。

  SET myobj=##class(%SQL.Statement).%New()
  SET dmode=myobj.%SelectMode
  WRITE "Default select mode=",dmode,!
  SET myobj.%SelectMode=2
  WRITE "Newly set select mode=",myobj.%SelectMode

ドット構文は、オブジェクト式で使用します。ドットは、オブジェクト参照とオブジェクト・プロパティ名あるいはオブジェクト・メソッド名の間に配置します。

オブジェクト・プロパティに変数を設定する、または現在のオブジェクトにオブジェクト・メソッドの値を設定するには、二重ドット構文を使用します。

   SET x=..LastName

指定したオブジェクト・プロパティが存在しない場合、Caché は <PROPERTY DOES NOT EXIST> エラーを発行します。二重ドット構文を使用し、現在のオブジェクトが定義されていない場合、Caché は <NO CURRENT OBJECT> エラーを発行します。

詳細は、“Caché オブジェクトの使用法” の “オブジェクト特有の ObjectScript の機能” を参照してください。

オブジェクトで SET を使用するときは、複数の代入を実行してはなりません。例えば、以下のような文は使用できません。

 // Avoid this syntax:
   SET (a.Name,b.Name)=z

代わりに、以下のように各代入に対して別々の SET コマンドを使用します。

  SET a.Name=z
  SET b.Name=z

以下のコマンドは、x を、GetNodeName() メソッドが返す値に設定します。

  SET x=##class(%SYS.System).GetNodeName()
  WRITE "the current system node is: ",x

オブジェクトの SET コマンドは、以下のようにカスケード・ドット構文を持つ式を使用できます。

   SET x=patient.Doctor.Hospital.Name

この例では、patient.Doctor オブジェクト・プロパティは、Name プロパティを含む Hospital オブジェクトを参照します。そのため、このコマンドは x を指定された患者の医者と、関連している病院名に設定します。同じカスケード・ドット構文は、オブジェクト・メソッドと一緒に使用できます。

オブジェクトの SET コマンドは、以下のデータ型プロパティ・メソッドのように、システム・レベル・メソッドで使用できます。

   SET x=patient.NameIsValid(Name)

この例では、NameIsValid() メソッドは、現在の patient オブジェクトの結果を返します。つまり、NameIsValid() は、Name プロパティのデータ型検証のために生成されたブーリアン・メソッドです。そのため、このコマンドは指定した名前が有効な場合は x を 1 に、無効の場合は 0 に設定します。

オブジェクト・メソッドを使用した SET

SET 式の左側でオブジェクト・メソッドを指定できます。以下の例では %Get() メソッドを指定しています。

  SET obj=##class(test).%New()  // Where test is class with a multidimensional property md
  SET myarray=[(obj)]
  SET index=0,subscript=2
  SET myarray.%Get(index).md(subscript)="value"
  IF obj.md(2)="value" {WRITE "success"}
  ELSE {WRITE "failure"} 

メモ

それぞれの代入先には、ローカル変数、プロセス・プライベート・グローバル、またはグローバル、$PIECE 関数、$EXTRACT 関数、および $ECODE$ETRAP$DEVICE$KEY$TEST$X$Y などの特定の特殊変数を指定できます。

ターゲット変数がまだ存在していない場合、SET はこれを作成し、値を代入します。既に存在する場合、SET は既存の値を代入する値と置き換えます。

SET と添え字

添え字付きの個別の値 (配列ノード) を、ローカル変数、プロセス・プライベート・グローバル、またはグローバルに設定できます。添え字は順不同です。変数添え字レベルがまだ存在していない場合、SET はこれを作成し、値を代入します。各添え字レベルは独立した変数として処理されます。これらの添え字レベルのみが定義されます。次に例を示します。

   KILL myarray
   SET myarray(1,1,1)="Cambridge"
   WRITE !,myarray(1,1,1)
   SET myarray(1)="address"
   WRITE !,myarray(1)

この例では、変数 myarray(1,1,1) と myarray(1) は定義され、値を持ちます。しかし、変数 myarray と myarray(1,1) は定義されず、呼び出されたときは <UNDEFINED> エラーが返されます。

既定では、NULL 添え字は設定できません。例えば、SET ^x("")=123 は、<SUBSCRIPT> エラーになります。ただし、%SYSTEM.Process.NullSubscripts()Opens in a new tab メソッドを設定して、グローバルおよびプロセス・プライベート・グローバル変数に NULL 添え字を許可することができます。ローカル変数に NULL 添え字を設定することはできません。

添え字の最大長は 511 文字です。この長さを超えると <SUBSCRIPT> エラーになります。

ローカル変数の添え字レベルの最大数は 255です。グローバル変数の添え字レベルの最大数は添え字レベル名に応じて異なり、レベルが 255 を超える場合もあります。(直接に、または間接演算で) ローカル変数の添え字レベルを 255 より大きく設定しようとすると、<SYNTAX> エラーが返されます。添え字付きの変数に関する詳細は、"Caché グローバルの使用法" の "グローバル構造" を参照してください。

評価の順序

Caché は、SET コマンドの引数を左から右の順に評価します。各引数に対しては、以下の順序で評価を実行します。

  1. 変数名を決定するために、間接指定のオカレンス、または等号の左側の添え字を左から右の順に評価します。詳細は、"Caché ObjectScript の使用法" の "間接演算" を参照してください

  2. 等号の右側の式を評価します。

  3. 等号の右側の式に、等号の左側の変数名、または参照を代入します。

トランザクション処理

グローバル変数の SET は現在のトランザクションの一部としてジャーナリングされます。このグローバル変数の割り当ては、トランザクションのロールバックの際にロールバックされます。ローカル変数またはプロセス・プライベート・グローバル変数の SET はジャーナリングされません。したがって、この割り当てはトランザクション・ロールバックの影響を受けません。

定義済み変数および未定義変数

Caché コマンドおよび関数の多くは、変数を指定してから参照する必要があります。既定では、未定義変数を参照しようとすると、<UNDEFINED> エラーが生成されます。定義済みオブジェクトを参照しようとすると、<PROPERTY DOES NOT EXIST> エラーまたは <METHOD DOES NOT EXIST> エラーが生成されます。これらのエラー・コードに関する詳細情報は、$ZERROR を参照してください。

%SYSTEM.Process.Undefined()Opens in a new tab メソッドを設定することで、未定義変数を参照する際の Caché の動作を変更できます。

READ コマンドと $INCREMENT 関数は、未定義変数を参照して値を代入できます。$DATA 関数の場合、未定義または定義済みの変数を使用して、その状態を返します。$GET 関数は、定義済み変数の値を返します。また、未定義変数に値を代入することもできます。

$PIECE や $EXTRACT を使用した SET

SET では、等号のどちらの側にも $PIECE 関数や $EXTRACT 関数を使用できます。詳細は、"$PIECE" と "$EXTRACT" を参照してください。

$PIECE 関数や $EXTRACT 関数を等号の右側で使用すると、変数から部分文字列を抽出し、その値を等号の左側に指定されている変数に代入します。$PIECE は、指定された区切り文字を使用して部分文字列を抽出し、$EXTRACT は、文字カウントを使用して部分文字列を抽出します。

例えば、変数 x に、文字列 "HELLO WORLD" が含まれているとします。以下のコマンドは、それぞれ部分文字列 "HELLO" を抽出し、それを変数 y および z に代入します。

   SET x="HELLO WORLD"
   SET y=$PIECE(x," ",1)
   SET z=$EXTRACT(x,1,5)
   WRITE "x=",x,!,"y=",y,!,"z=",z

等号の左側で使用された場合、$PIECE および $EXTRACT は、等号の右側の式から得た値をターゲット変数の指定された部分に挿入します。ターゲット変数の指定された部分に既に値が存在する場合は、挿入された値と置き換えられます。

例えば、変数 x に文字列 "HELLO WORLD" が含まれ、変数 y に文字列 "HI THERE" が含まれているとして、以下のコマンドを見てみましょう。以下のコマンドでは、

   SET x="HELLO WORLD"
   SET y="HI THERE"
   SET $PIECE(x," ",2)=$EXTRACT(y,4,9)
   WRITE "x=",x

$EXTRACT 関数は、変数 y から文字列 "THERE" を抽出し、$PIECE 関数は、それを変数 x の 2 番目のフィールド位置に挿入します。このとき、既存の文字列 "WORLD" が置き換えられます。変数 x の値は、文字列 "HELLO THERE" になります。

ターゲット変数が存在しない場合は、システムがこれを作成し、必要に応じて区切り文字 ($PIECE の場合)、またはスペース ($EXTRACT の場合) が埋め込まれます。

以下の例では、SET $EXTRACT を使用して z の値を文字列 xy に挿入します。既存の値は上書きされます。

   SET x="HELLO WORLD"
   SET y="OVER EASY"
   SET z="THERE"
   SET $EXTRACT(x,7,11)=z
   SET $EXTRACT(y,*-3,*)=z
   WRITE "edited x=",x,!
   WRITE "edited y=",y  

これで、変数 x には文字列 "HELLO THERE" が格納され、y には文字列 "OVER THERE" が格納されます。この例の SET $EXTRACT 操作の 1 つは負のオフセット (*-3) を使用するため、これらの操作は個別のセットとして実行する必要があります。変数の一部が負のオフセットを使用する場合は、複数の変数を括弧で囲んだ 1 つの SET で設定することができません。

以下の例では、ルート・ノードにクライアントの名前、従属ノードに町名と番地、および市が含まれた構成になっているグローバル配列 ^client があるとします。例えば、^client(2,1,1) には、配列に格納された 2 番目のクライアントの住所の市が含まれます。

さらに、city ノード (x,1,1) には、市、州の略称、郵便番号を識別するフィールド値が含まれており、フィールド分離文字としてコンマを使用しているとします。例えば、典型的な city ノード値は、"Cambridge,MA,02142" となります。以下のコードの 3 つの SET コマンドは、それぞれ $PIECE コマンドを使用して、配列ノード値の特定の部分を適切なローカル変数に代入しています。いずれの場合も、$PIECE は、コンマ (",") を文字列の分離文字として参照していることに注意してください。

ADDRESSPIECE
   SET ^client(2,1,1)="Cambridge,MA,02142"
   SET city=$PIECE(^client(2,1,1),",",1)
   SET state=$PIECE(^client(2,1,1),",",2)
   SET zip=$PIECE(^client(2,1,1),",",3)
   WRITE "City is ",city,!,
         "State or Province is ",state,!
        ,"Postal code is ",zip
   QUIT

$EXTRACT 関数を使用して同じ処理を行うこともできますが、これは、フィールドが固定長で、その長さが分かっている場合に限ります。例えば、city フィールドには最高 9 文字のみ、state フィールドと zip フィールドはそれぞれ 2 文字と 5 文字が含まれることが分かっている場合、SET コマンドを、$EXTRACT 関数を使用して、以下のように書き換えることができます。

ADDRESSEXTRACT
   SET ^client(2,1,1)="Cambridge,MA,02142"
   SET city=$EXTRACT(^client(2,1,1),1,9)
   SET state=$EXTRACT(^client(2,1,1),11,12)
   SET zip=$EXTRACT(^client(2,1,1),14,18)
   WRITE "City is ",city,!,
         "State or Province is ",state,!,
         "Postal code is ",zip
   QUIT

フィールド分離文字のコンマに対応するために、9 から 11、12 から 14 というように、途中で数字が飛んでいることに注意してください。

以下の例は、A (最初は 1 に設定されています) 内の最初の部分文字列を、文字列 "abc" と置き換えます。

StringPiece
   SET A="1^2^3^4^5^6^7^8^9"
   SET $PIECE(A,"^")="abc"
   WRITE !,"A=",A
   QUIT

A="abc^2^3^4^5^6^7^8^9"

以下の例は、$EXTRACT を使用して、A の最初の文字 (この場合も 1) を文字列 "abc" と置き換えます。

StringExtract
   SET A="123456789"
   SET $EXTRACT(A)="abc"
   WRITE !,"A=",A
   QUIT

A="abc23456789"

以下の例は、A の 3 番目から6 番目の部分に文字列 "abc" を設定し、変数 B の最初の文字を、文字列 "abc" と置き換えます。

StringInsert
   SET A="1^2^3^4^5^6^7^8^9"
   SET B="123"
   SET ($PIECE(A,"^",3,6),$EXTRACT(B))="abc"
   WRITE !,"A=",A,!,"B=",B
   QUIT

A="1^2^abc^7^8^9"

B="abc23"

以下の例は、$X$Y$KEY、および以前に定義されなかったローカル変数 A の 4 番目の部分を値 20 に設定します。また、ローカル変数 K には、$KEY の現在の値が設定されます。A には、前の 3 つの部分とキャレット (^) の区切り文字が含まれています。

SetVars
   SET ($X,$Y,$KEY,$PIECE(A,"^",4))=20,X=$X,Y=$Y,K=$KEY
   WRITE !,"A=",A,!,"K=",K,!,"X=",X,!,"Y=",Y
   QUIT

A="^^^20" K="20" X=20 Y=20

以下の例は、$ECODE および $ETRAP を NULL 文字列に設定します。次に、ローカル変数 EC および ET$ECODE および $ETRAP の値を設定します。

SetEvars
   SET ($ECODE,$ETRAP)="",EC=$ECODE,ET=$ETRAP 
   WRITE "EC=",EC,!,"ET=",ET
   QUIT

EC=""

ET=""

$LIST や $LISTBUILD を使用した SET

$LIST 関数は、リストの作成と操作を実行します。これらは、要素の区切り文字を使用する代わりに、リスト内の各要素の長さ (およびタイプ) をエンコードします。これは、コード化された長さの指定を使用して、リスト操作の間に指定されたリスト要素を抽出します。$LIST 関数は区切り文字を使用しないので、この関数を使用して作成されたリストは $PIECE や他の文字区切り関数には入力は行いません。

等号の右側で使用された場合、これらの関数は以下を返します。

$LIST

$LIST は、指定されたリストの指定された要素を返します。

$LISTBUILD

$LISTBUILD は、指定された引数ごとに 1 つの要素を含むリストを返します。

SET 引数で、等号の左側で使用された場合、これらの関数は以下のタスクを実行します。

$LIST

指定された要素を等号の右側で指定された値に置き換えます。

   SET A=$LISTBUILD("red","blue","green","white")
   WRITE "Created list A=",$LISTTOSTRING(A),!
   SET $LIST(A,2)="yellow"
   WRITE "Edited list A=",$LISTTOSTRING(A)
   SET A=$LISTBUILD("red","blue","green","white")
   WRITE "Created list A=",$LISTTOSTRING(A),!
   SET $LIST(A,*-1,*)=$LISTBUILD("yellow")
   WRITE "Edited list A=",$LISTTOSTRING(A)

SET $LIST と括弧を使用して、複数の変数に同じ値を割り当てることはできません。

$LISTBUILD

単一の処理でリストの複数要素を取り出します。$LISTBUILD の引数は変数で、各変数は、$LISTBUILD パラメータ・リストの位置に対応するリスト要素を受け取ります。関連しない位置の変数名は削除されます。

以下の例は、(等号の右側にある) $LISTBUILD が最初に使用され、リストを返します。(等号の左側にある) $LISTBUILD は、そのリストから 2 つの要素を取り出すために使用され、適切な変数を設定します。

SetListBuild
   SET J=$LISTBUILD("red","blue","green","white")
   SET $LISTBUILD(A,,B)=J
   WRITE "A=",A,!,"B=",B

この例では、A="red"、B="green" です。

関連項目

FeedbackOpens in a new tab