SET jobj={"inventory123":"Fred's \"special\" bowling ball"}
WRITE "JSON object reference = ",jobj,!
WRITE jobj.%Get("inventory123")," (data value in ObjectScript format)",!
WRITE jobj.%Get("inventory123",,"json")," (data value in JSON format)",!
WRITE jobj.%ToJSON()," (key and data value in JSON format)"
jobj.%Get(keyname,default,format)
default 引数は、keyname が存在しない場合に返される値です。
format 引数は、戻り値の形式を指定します。format が指定されていない場合、値は ObjectScript 形式で返されます。format="json" の場合、値は JSON 形式で返されます。format="string" の場合、すべての文字列値と数値は ObjectScript 形式で返されますが、JSON の特別な値である true と false は、ブーリアン整数ではなく、JSON のアルファベット文字列として返されます。JSON の特別な値である null は、ObjectScript 形式で長さ 0 の NULL 文字列として返されます。詳細は、以下の例を参照してください。
SET x={"yep":true,"nil":null}
WRITE "IRIS: ",x.%Get("yep")," JSON: ",x.%Get("yep",,"json")," STRING: ",x.%Get("yep",,"string"),!
/* IRIS: 1 JSON: true STRING: true */
WRITE "IRIS: ",x.%Get("nil")," JSON: ",x.%Get("nil",,"json")," STRING: ",x.%Get("nil",,"string")
/* IRIS: JSON: null STRING: */
詳細は、"JSON の使用" を参照してください。
JSON 配列
value には、角括弧で区切られた JSON 配列を指定できます。variable は、1@%Library.DynamicArray のように OREF に設定されます。ZWRITE コマンドを指定されたローカル変数名と共に使用して、JSON の値を表示できます。
SET jary=["Fred","Wilma","Barney"]
ZWRITE jary
%Get()Opens in a new tab メソッドを使用して、指定した配列要素の値 (0 からカウント) を OREF で取得できます。%Get(n) は ObjectScript 値を返し、%Get(n,,”json”) は JSON 値を返します。%Get(n,”no such element”,”json”) は、指定した配列要素が存在しない場合に返す既定値を指定します。%ToJSON() 関数を使用することで、この OREF を JSON 配列値に解決できます。以下に例を示します。
SET jary=["Fred","Wilma","Barney"]
WRITE "JSON array reference = ",jary,!
WRITE jary.%Get(1)," (array element value in ObjectScript format)",!
WRITE jary.%Get(1,,"json")," (array element value in JSON format)",!
WRITE jary.%ToJSON()," (array values in JSON format)"
有効な 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"]}]
%Push()Opens in a new tab メソッドを使用して、配列の最後に新しい要素を追加できます。%Set()Opens in a new tab メソッドを使用して、新しい配列要素を追加したり、既存の配列要素を位置によって更新したりできます。
詳細は、"JSON の使用" を参照してください。
オブジェクトでの 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
指定したオブジェクト・プロパティが存在しない場合、InterSystems IRIS は <PROPERTY DOES NOT EXIST> エラーを発行します。二重ドット構文を使用し、現在のオブジェクトが定義されていない場合、InterSystems IRIS は <NO CURRENT OBJECT> エラーを発行します。
詳細は、"クラスの定義と使用" の "オブジェクト特有の ObjectScript の機能" を参照してください。
以下のコマンドは、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"}
オブジェクトへの変数のリストの設定
以下の例に示すように、SET をオブジェクトと共に使用する場合、代入を複数回行うと、リスト内のすべての変数が同じ OREF に設定されます。
SET (a,b,c)=##class(Sample.Person).%New()
SET (dyna1,dyna2,dyn3) = ["default","default"]
各変数に別個の OREF を割り当てるには、以下のように各代入に対して別々の SET コマンドを使用します。
SET a=##class(Sample.Person).%New()
SET b=##class(Sample.Person).%New()
SET c=##class(Sample.Person).%New()
SET dyna1 = ["default","default"]
SET dyna2 = ["default","default"]
SET dyna3 = ["default","default"]
また、以下に示すように、#dim プリプロセッサ指示文を使用して、リスト内のすべての変数を別々の OREF に割り当てることもできます。
#dim a,b,c As %ClassDefinition = ##class(Sample.Person).%New()
#dim dyn1,dyn2,dyn3 As %DynamicArray = ["default","default"]
例
以下は、同じ 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
評価の順序
InterSystems IRIS は、SET コマンドの引数を必ず左から右の順に評価します。各引数に対しては、以下の順序で評価を実行します。
-
変数名を決定するために、間接指定のオカレンス、または等号の左側の添え字を左から右の順に評価します。詳細は、"ObjectScript の使用法" の "間接演算" を参照してください
-
等号の右側の式を評価します。
-
等号の右側の式に、等号の左側の変数名、または参照を代入します。
トランザクション処理
グローバル変数の SET は現在のトランザクションの一部としてジャーナリングされます。このグローバル変数の割り当ては、トランザクションのロールバックの際にロールバックされます。ローカル変数またはプロセス・プライベート・グローバル変数の SET はジャーナリングされません。したがって、この割り当てはトランザクション・ロールバックの影響を受けません。
定義済み変数および未定義変数
ObjectScript コマンドおよび関数の多くは、変数を定義してから参照する必要があります。既定では、未定義変数を参照しようとすると、<UNDEFINED> エラーが生成されます。定義済みオブジェクトを参照しようとすると、<PROPERTY DOES NOT EXIST> エラーまたは <METHOD DOES NOT EXIST> エラーが生成されます。これらのエラー・コードに関する詳細情報は、$ZERROR を参照してください。
%SYSTEM.Process.Undefined()Opens in a new tab メソッドを設定することで、未定義変数を参照する際の InterSystems IRIS の動作を変更できます。
READ コマンドと $INCREMENT 関数は、未定義変数を参照して値を代入できます。$DATA 関数の場合、未定義または定義済みの変数を使用して、その状態を返します。$GET 関数は、定義済み変数の値を返します。また、未定義変数に値を代入することもできます。
$LIST や $LISTBUILD を使用した SET
$LIST 関数は、リストの作成と操作を実行します。これらは、要素の区切り文字を使用する代わりに、リスト内の各要素の長さ (およびタイプ) をエンコードします。これは、コード化された長さの指定を使用して、リスト操作の間に指定されたリスト要素を抽出します。$LIST 関数は区切り文字を使用しないので、この関数を使用して作成されたリストは $PIECE や他の文字区切り関数には入力は行いません。
等号の右側で使用された場合、これらの関数は以下を返します。
SET 引数で、等号の左側で使用された場合、これらの関数は以下のタスクを実行します。
-
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 と括弧を使用して、複数の変数に同じ値を割り当てることはできません。
-
SET $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" です。
関連項目