値の設定ブロックとは、プロパティー、フィールド、または変数の値を設定できるコード内の領域のことです。 プロパティーの背景については、『EGL プロパティーの概要』を参照してください。
最後の 2 つの事例では、フィールドにのみ、値を代入できます。
program hello
myString STRING = "Hello, Cleveland";
{handleHardIOErrors = YES} // これが実行されます
...
end
program hello
myString STRING = "Hello, Cleveland"
{handleHardIOErrors = YES}; // これは myString 宣言の一部です
...
end
問題は、handleHardIOErrors が、「Hello, Cleveland.」というストリングの有効範囲内に入ったことにあります。 ストリングに設定すべきフィールドはありません (handleHardIOErrors というフィールドは論外です)。 そのため、EGL は式を解決できません。
myInt INT?{};
myList Dictionary; // myList = null
myList.x = 23; // イリーガルな参照
ただし、次のコードでは、
代入が試行される前に、新規の辞書変数が初期化されます。
myList2 Dictionary; // myList2 = null
myList2{ x = 23 }; // myList2 には 1 つのキー x があり、その値は 23 です
package com.companyb.customer;
Record StructuredRecordA
10 fullCheckNum NUM(25);
15 bankNum NUM(9);
15 acctNum NUM(10);
15 checkNum NUM(6);
end
program calculate type BasicProgram
function main()
myRec1 StructuredRecordA
{fullCheckNum = 9531008501602141091001484};
writeStdOut(myRec1.bankNum); // 953100850
writeStdErr(myRec1.checkNum); // 1484
end
end
myRec2 StructuredRecordA {checkNum = 1485};
writeStdOut(myRec2.fullCheckNum); // 1485
値の設定ブロックで同一フィールドまたはプロパティーに複数の割り当てを 行うと、最後の割り当てが有効になります。この規則は、このトピック内の『複合プロパティーでの値の設定ブロック』で説明されている複合プロパティーのフィールドにも適用されます。
いずれの場合でも、値の設定ブロックは、変更対象のパーツ、変数、またはフィールドの有効範囲内にあります。 分かりやすいように、さまざまな構文の例を以下に示します。
// 有効範囲は myVariable です。
myVariable INT
{
inputRequired = yes,
align = left
};
// 有効範囲は optionEntry です。
DataItem optionEntry INT
{
inputRequired = yes,
align = left
};
end
// 有効範囲は menu1Option です。
menu1Option optionEntry
{
inputRequired = no
};
myRecord02.myContent01 = "abc";
myRecord02.myContent02 = "xyz";
myRecord02
{
myContent01="abc",
myContent02="xyz"
};
この簡略化された代入文は、構造化レコード内のフィールドでは使用できません。 また、これを使用してプロパティーを設定することもできません。
レコード変数内のフィールドに値を割り当てる場合は、 以下のように有効範囲を特定のフィールドへ絞り込みます。
record myBasicRecord03 type basicRecord
myInt04 INT;
end
record myBasicRecord02 type basicRecord
myInt03 INT;
myRec03 myBasicRecord03;
end
record myBasicRecord type basicRecord
myInt01 INT;
myInt02 INT;
myRec02 myBasicRecord02;
end
プロパティー値を代入する構文には、次の例に示す書式のどれでも使用できます。これらは、フィールド myInt04 に適用されます。
// ドット構文
myRecB myBasicRecord
{
myRec02.myRec03.myInt04{ align = left }
};
// 大括弧構文
// この構文を使用して、固定構造体内のフィールドに
// 影響を及ぼすことはできません
myRecC myBasicRecord
{
myRec02["myRec03"]["myInt04"]{ align = left }
};
// 中括弧構文
myRecA myBasicRecord
{
myRec02 {myRec03 { myInt04 { align = left }}}
};
// ドット構文
myRecB myBasicRecord
{
myInt01 = 4,
myInt02 = 5,
myRec02.myRec03.myInt04{ align = left },
myRec02.myInt03 = 6
};
// 大括弧構文
myRecC myBasicRecord
{
myInt01 = 4,
myInt02 = 5,
myRec02["myRec03"]["myInt04"]{ align = left },
myRec02["myInt03"] = 6
};
// 中括弧構文。
// ただし、これを使用すると保守がずっと難しくなります。
myRecA myBasicRecord
{
myInt01 = 4,
myInt02 = 5,
myRec02
{
myRec03
{ myInt04
{ action = label5 }},
myInt03 = 6
}
};
変数宣言または assignment 文の中で、レコード・プロパティーと同じ名前が付いたフィールド (keyItems など) を含んでいるコンテナー (SQL レコードなど) を使用できます。 プロパティーではなくフィールドを参照するには、キーワード this を使用します。 これにより、値の設定ブロックが存在する宣言として有効範囲が設定されます。
Record ExampleRecord type SQLRecord
{ tableNames = [["myTable"]],
keyItems = [myKey] }
myKey CHAR(10);
myOtherKey CHAR(10);
keyItems CHAR(60);
end
myRecord ExampleRecord
{
keyItems = [myOtherKey],
this.keyItems = "abc"
};
配列宣言の例については、『値の設定ブロックの追加サンプル』を参照してください。
myService ExampleServicePart
{ @xml
{name="myService",
namespace="http://www.customerpackage.companyb.commy.useful.service"}
};
Record Point
x INT;
y INT;
end
Record Rectangle
topLeft Point;
bottomRight Point;
end
Function test()
screen Rectangle
{
topLeft{x=1, y=1},
bottomRight{x=80, y=24}
};
// 次のコードと等価の文を使用して、
// コード内の x、y を変更します。
// screen.topLeft.x = 1;
// screen.topLeft.y = 2;
screen.topLeft{x=1, y=2};
end
pts Point[2]
{
this[1]{x=1, y=2},
this[2]{x=2, y=3}
};
pts{ x=1, y=1 };
pts[1]{x=10, y=20};
キーワード this は、値の設定ブロック外では別の意味を持つことに注意してください (「this」キーワードを参照)。 いずれの場合でも、ここに pts[1] を使用することは未確定ではないので、区別は不要です。
points Point[];
points{x=1, y=1};
points[1]{x=10, y=20};
points{};
points.resize(2);
points{x=1, y=1};