参照変数の値変数への代入 (およびその他の方法) など、上記の場合について詳しくは、EGL での参照の互換性を参照してください。
以下のテーブルでは、一番左の列の型は、代入ステートメントの左側 (ターゲット) を表し、 他のすべての列は、右側 (ソース) を表しています。 文字 Y は、互換性のある型を表します。ブランクは、型に互換性がないことを示しています。 数字は、3 番目の表に続く注の説明にあり、型に互換性がある場合の状況を詳しく説明しています。
最初の表は、代入のソースとしてのテキスト型の詳細です。
| ターゲット | ソース | |||
|---|---|---|---|---|
| CHAR | MBCHAR | STRING、UNICODE | DBCHAR | |
| CHAR | Y | Y | Y | |
| MBCHAR | Y | Y | Y | |
| STRING、UNICODE | Y | Y | Y | Y |
| DBCHAR | Y | Y | ||
| BIN | 1 | 1 | 1 | |
| INT、BIGINT、SMALLINT | 1 | 1 | 1 | |
| DECIMAL | 1 | 1 | 1 | |
| NUM | 1 | 1 | 1 | |
| NUMBER | 1 | 1 | 1 | |
| FLOAT、 SMALLFLOAT | 1 | 1 | 1 | |
| MONEY | 1 | 1 | 1 | |
| NUMC | 1 | 1 | 1 | |
| PACF | 1 | 1 | 1 | |
| DATE | 2 | 2 | 2 | |
| INTERVAL (months) | 2 | 2 | 2 | |
| INTERVAL (seconds) | 2 | 2 | 2 | |
| TIME | 2 | 2 | 2 | |
| TIMESTAMP | 2 | 2 | 2 | |
| HEX | Y | Y | ||
| BOOLEAN | ||||
2 番目の表は、代入のソースとしての数値型の詳細です。
| ターゲット | ソース | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| BIN | INT、 |
DECI- |
NUM | NUM- |
FLOAT、 |
MONEY | NUMC | PACF | |
| CHAR | Y | Y | Y | Y | Y | Y | 3 | Y | Y |
| MBCHAR | Y | Y | Y | Y | Y | Y | 3 | Y | Y |
| STRING | 4 | 4 | 4 | 4 | 4 | 4 | 3、4 | 4 | 4 |
| UNICODE | Y | Y | Y | Y | Y | Y | 3 | Y | Y |
| DBCHAR | Y | Y | Y | Y | Y | Y | Y | Y | Y |
| BIN | Y | Y | Y | Y | Y | Y | Y | Y | Y |
| INT、BIGINT、SMALLINT | Y | Y | Y | Y | Y | Y | Y | Y | Y |
| DECIMAL | Y | Y | Y | Y | Y | Y | Y | Y | Y |
| NUM | Y | Y | Y | Y | Y | Y | Y | Y | Y |
| NUMBER | Y | Y | Y | Y | Y | Y | Y | Y | Y |
FLOAT、 |
Y | Y | Y | Y | Y | Y | Y | Y | Y |
| MONEY | Y | Y | Y | Y | Y | Y | Y | Y | Y |
| NUMC | Y | Y | Y | Y | Y | Y | Y | Y | Y |
| PACF | Y | Y | Y | Y | Y | Y | Y | Y | Y |
| DATE | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
| INTERVAL (months) | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
| INTERVAL (seconds) | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
| TIME | |||||||||
| TIMESTAMP | |||||||||
| HEX | 7 | ||||||||
| BOOLEAN | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 |
3 番目の表は、代入のソースとしての日付/時刻、16 進数、および Boolean 型の詳細です。
| ターゲット | ソース | ||||||
|---|---|---|---|---|---|---|---|
| DATE | INTERVAL (months) | INTERVAL (seconds) | TIME | TIME- |
HEX | BOOLEAN | |
| CHAR | 9 | 9 | 9 | 9 | 9 | Y | |
| MBCHAR | 9 | 9 | 9 | 9 | 9 | ||
| STRING、UNICODE | 9 | 9 | 9 | 9 | 9 | Y | |
| DBCHAR | |||||||
| BIN | 10 | Y | Y | 11 | |||
| INT、BIGINT、SMALLINT | 10 | Y | Y | 11 | |||
| DECIMAL | 10 | 12 | 12 | 11 | |||
| NUM | 10 | 12 | 12 | 11 | |||
| NUMBER | 10 | 12 | 12 | 11 | |||
| FLOAT、 SMALLFLOAT | 10 | Y | 11 | ||||
| MONEY | 10 | 12 | 12 | 11 | |||
| NUMC | 10 | 12 | 12 | 11 | |||
| PACF | 10 | 12 | 12 | 11 | |||
| DATE | Y | Y | |||||
| INTERVAL (months) | Y | ||||||
| INTERVAL (seconds) | Y | ||||||
| TIME | Y | Y | |||||
| TIMESTAMP | Y | Y | Y | ||||
| HEX | Y | ||||||
| BOOLEAN | Y | ||||||
Function main()
testBin BIN(9,3) = 38796.999;
testDate DATE;
StrLib.defaultDateFormat = "MM/dd/yyyy";
testDate = testBin;
writeStdout (testDate);
end
myInterval INTERVAL("yyMM") = 1208;
ここで、EGL は、数値 1208 を 12 年と 8 カ月と解釈します。以下の規則が適用されます。
myInterval INTERVAL("yyMM") = 8216;
EGL は、間隔 83 年と 4 カ月を代入します。1 年は 12 カ月しかないので、「16」は 4 カ月として扱われ、元の 82 年にもう 1 年が繰り上げられます。myInterval INTERVAL("yyMM") = 9925;
EGL は、間隔 1 年と 1 カ月を代入します。25 カ月 = 2 年と 1 カ月であるので、月 = 01 となります。年の値 99 に月から繰り上がった超過分 2 を加えると 101 となり、01 に丸められます。数値型 (NUMC および PACF を含む) の値は、任意の数値型とサイズの変数に代入できます。 EGL は、値をターゲット・フォーマットで保持するために必要な変換を行います。
必要な場合、有意でないゼロが追加または切り捨てられます。 (値の整数部分の先頭からのゼロは有意ではありません。 同様に、値の小数部分の末尾桁のゼロも有意ではありません。)
V6 例外モードを使用し、vgVar.handleOverflow を適切に設定している場合は、 sysVar.overflowIndicator システム変数を使用して、 代入または算術計算の結果としてオーバーフローが発生したかどうかをテストできます。詳しくは、handleOverflowを参照してください。V6 例外モードを使用していない場合、またはオーバーフローをハンドルしない場合は、 オーバーフローが原因で EGL が RuntimeException をスローします。
assignment 文では、truncateExtraDecimals ビルド記述子 オプションが YES (これはデフォルトです。 詳しくは「EGL 生成ガイド」を参照) に設定されていると、 ソースが FLOAT または SMALLFLOAT でターゲットに小数部の固定数がないかぎり、 余分の小数部が切り捨てられます。 truncateExtraDecimlas が NO に設定されているか、 ソースが FLOAT または SMALLFLOAT でターゲットに小数部の固定数がある場合は余分の小数部 は丸められます。
EGL のバージョン 6 および前のバージョンでは、truncateExtraDecimals オプションは存在しなかったので、 余分の小数部は、ソースが FLOAT または SMALLFLOAT でターゲットに小数部の固定数がある場合以外、切り捨てられました。 代入のソースが MathLib 関数の 1 つである場合は、規則を追加することによって、 切り捨てが回避されました。 この V6 スタイルの丸めを保持したい場合は、MathLib.assign() 関数を使用します (assign()参照)。
ソース値を格納するためのスペースが文字型のターゲットで不足している場合は、EGL によって右側の値が切り捨てられます。通知されるエラーはありません。
このような場合、EGL は、MBCHAR 型の有効なストリングがターゲット変数に格納されるように文字を切り捨て、必要があれば、終端に単一バイトのブランクを付加します。
NULL 可能変数は、全く同じ基本型を持つ別の NULL 可能変数との間にのみ参照互換性があります。 代入は、EGL での参照の互換性で説明されている規則に従います。
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 Num12
NUM(12)
end
Record ExampleRecord 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 レコードに確保する必要があります (詳しくは、構造化レコードを参照)。
非構造化レコード変数は、型が同じ他の非構造化レコード変数とのみ代入に互換性があります。
中間結果の切り捨てが原因で、COBOL プログラムでは、同じ算術ステートメントの結果が Java™ または Rich UI プログラムとは異なることがあります。環境間で整合した結果にするには、ステートメントごとに 2 項演算子を 1 つのみ使用してください。結果項目に対して定義されている小数点以下の桁数が、いずれかのオペランドにおける小数点以下の桁数以上である場合は、複数の加算演算子と減算演算子を結合しても問題ありません。
quotient = dividend / divisor;
remainder = dividend - (quotient * divisor);
| プラットフォーム | 問題 |
|---|---|
| COBOL 生成 | EGL は、テキストを SMALLFLOAT や FLOAT に変換することはできませんが、それ以外であれば可能です。 |