代入の例を以下に示します。
z = a + b + c; myDate = VGVar.currentShortGregorianDate; myUser = sysVar.userID; myRecord01 = myRecord02; myRecord02 = "USER";
次の表とそれに続く説明は、互換性の規則を示しています。
ターゲットのプリミティブ型 | ターゲットとして有効なソースのプリミティブ型 |
---|---|
BIN | BIN、INT、BIGINT、SMALLINT、DECIMAL、NUM、NUMBER、NUMC、PACF、FLOAT、SMALLFLOAT、MONEY |
CHAR | CHAR、DATE、TIME、HEX、MBCHAR、NUM、NUMBER、TIMESTAMP |
DATE | DATE、CHAR、NUM、TIMESTAMP |
DBCHAR | DBCHAR |
DECIMAL | BIN、INT、BIGINT、SMALLINT、DECIMAL、NUM、 NUMBER、NUMC、PACF |
FLOAT | BIN、INT、BIGINT、SMALLINT、DECIMAL、NUM、NUMBER、NUMC、PACF、FLOAT、SMALLFLOAT、MONEY |
HEX | CHAR、HEX |
INTERVAL | INTERVAL |
MBCHAR | CHAR、MBCHAR |
MONEY | BIN、INT、BIGINT、SMALLINT、DECIMAL、NUM、NUMBER、NUMC、PACF、FLOAT、SMALLFLOAT |
NUM | BIN、INT、DATE、TIME、BIGINT、SMALLINT、CHAR、NUM、NUMBER、NUMC、PACF、DECIMAL、FLOAT、SMALLFLOAT、MONEY |
NUMC | BIN、INT、BIGINT、SMALLINT、DECIMAL、NUM、NUMBER、NUMC、PACF、FLOAT、SMALLFLOAT |
PACF | BIN、INT、BIGINT、SMALLINT、DECIMAL、NUM、 NUMBER、NUMC、PACF |
SMALLFLOAT | BIN、INT、BIGINT、SMALLINT、DECIMAL、NUM、NUMBER、NUMC、PACF、FLOAT、SMALLFLOAT、MONEY |
TIME | TIME、CHAR、NUM、TIMESTAMP |
TIMESTAMP | CHAR、DATE、TIME、TIMESTAMP |
UNICODE | UNICODE |
特別な例として、数値システム・ワードから戻された数値は、HEX 型の項目に代入することができます。詳細については、『数学的 (システム・ワード)』を参照してください。 |
EGL の assignment 文の振る舞いは、別の参照トピックで説明している move 文と異なります。
数値型 (BIN、DECIMAL、FLOAT、MONEY、NUM、NUMBER、NUMC、PACF、SMALLFLOAT) の値は、任意の数値型とサイズを持つ項目に代入できます。EGL では、値をターゲットの形式で保持するために必要な変換が行われます。
ターゲットが固定小数点型 (FLOAT や SMALLFLOAT でないもの) の場合は、必要に応じて無効のゼロの追加または切り捨てが行われます。(値の整数部分の先頭からのゼロは無効です。同様に、値の小数部分の後続のゼロも無効です。)
いずれの数値型の場合でも、システム変数 sysVar.overflowIndicator を使用すると、代入または算術計算によって算術オーバーフローが発生したかどうかをテストできます。また、システム変数 VGVar.handleOverflow を設定すると、そうしたオーバーフローの結果を指定できます。
算術オーバーフローが発生した場合、ターゲット項目の値は変更されません。算術オーバーフローが発生しない場合、ターゲット項目に代入される値は、ターゲット項目の宣言に従って位置合わせされます。
固定小数点型の項目に浮動小数点値 (FLOAT 型または SMALLFLOAT 型) を代入すると、ターゲットの値は必要に応じて切り捨てられます。 例えば、ソース値が 108.357 で、固定小数点のターゲットの小数点以下の桁が 1 つの場合、ターゲットは 108.3 を受け取ります。
負の NUM 型の値が CHAR 型の値に代入される場合、項目にコピーされる最後のバイトは印刷不能文字となります。
この操作は、NUM から NUM への代入と同等です。
NUMC 型のターゲットの値が負の場合、CHAR 型のターゲットにコピーされる最後のバイトは、印刷不能文字となります。
// 2 月 30 日は有効な日付でないので無効 myTS timestamp("yyyyMMdd"); myTS = "20050230";
// 2 月に実行された場合は無効 myTS timestamp("dd"); myTS = "30";
このような場合、EGL は、MBCHAR 型の有効なストリングがターゲット項目に格納されるように文字を切り捨て、必要があれば、終端に単一バイトのブランクを付加します。
sourceTimeStamp timestamp ("MMdd"); targetTimeStamp timestamp ("yyyyMMdd"); sourceTimeStamp = "1201"; // このコードが 2004 年に実行された場合、次の文が // targetTimeStamp に 20041201 を代入する targetTimeStamp = sourceTimeStamp;
sourceTimeStamp02 timestamp ("ssff"); targetTimeStamp02 timestamp ("mmssff"); sourceTimeStamp02 = "3201"; // 次の代入は、分を含んでいる // それは、assignment 文が実行されたときの現行の分である targetTimeStamp02 = sourceTimeStamp02;
sourceTimeStamp timestamp ("yyyyMM"); targetTimeStamp timestamp ("yyyyMMdd"); sourceTimeStamp = "200412"; // 日に関係なく、次の文は // targetTimeStamp に 20041201 を代入する targetTimeStamp = sourceTimeStamp;
sourceTimeStamp02 timestamp ("hh"); targetTimeStamp02 timestamp ("hhmm"); sourceTimeStamp02 = "11"; // 分に関係なく、次の文は // targetTimeStamp02 に 1100 を代入する targetTimeStamp02 = sourceTimeStamp02;
副構造のある項目を副構造のない項目に代入したり、その逆を行うことができます。また、2 つの副構造項目の間で値を代入できます。 例えば、myNum および myRecord という名前の変数が、次のパーツに基づいているものとします。
DataItem myNumPart NUM(12) end Record myRecordPart type basicRecord 10 topMost CHAR(4); 20 next01 HEX(4); 20 next02 HEX(4); end
数値システム・ワードの外側では、HEX 型の値を NUM 型の項目へ代入するのは無効です。しかし、myNum = topMost という書式の代入は、topMost が CHAR 型なので有効です。一般に、代入は、assignment 文内の項目のプリミティブ型に基づいて実行され、従属項目のプリミティブ型は考慮されません。
副構造のある項目のプリミティブ型は、デフォルトで CHAR に設定されています。副構造のある項目にデータを代入したり、副構造のある項目からデータを代入したりする場合、宣言時に別のプリミティブ型を指定しないと、CHAR 型の項目に対する前述の規則が代入時に適用されます。
レコードから別のレコードへの代入は、CHAR 型の副構造の項目から別の CHAR 型の副構造の項目への代入と同等です。長さの不一致があると、受け取った値の右端に単一バイトのブランクが付加されたり、受け取った値の右端から 1 バイトの文字が除去されたりします。代入では、従属構造体項目のプリミティブ型は考慮されません。
最後に、SQL レコードと、異なる型のレコードとの間で代入を行う場合は、 構造体の各項目に先行する 4 バイトの領域のためのスペースを非 SQL レコードに確保する必要があります。
関連する概念
構文図