EGL의 지정 호환성

지정 호환성은 다음 상황 중 하나에서 적용됩니다.
  • 코드가 하나의 값 유형(비참조) 변수를 다른 변수에 지정합니다.
  • EGL이 인수와 함수 호출의 관련 매개변수 사이에서 데이터를 전송하지만 수신하는 함수의 매개변수가 in 수정자(이 경우 인수가 소스임) 또는 out 수정자(이 경우 매개변수가 소스임)를 가진 경우에만 전송합니다.
다음과 같은 경우에는 다른 규칙 세트가 적용됩니다.
  • 매개변수가 inOut 수정자를 가지고 있습니다.
  • 매개변수가 JSF 핸들러의 onConstructionFunction 특성이 참조하는 함수에 있습니다.
  • 참조 변수를 지정하거나 전달하거나 리턴하고 있습니다.

참조 변수를 값 변수에 지정하고 값 변수를 참조 변수에 지정하는 것을 포함하여 이러한 경우에 대한 자세한 정보는 EGL에서 참조 호환성의 내용을 참조하십시오.

다음 표에서 가장 왼쪽 열에 있는 유형은 assignment문의 왼쪽(대상)을 나타내고 다른 모든 열은 오른쪽(소스)을 나타냅니다. Y라는 문자는 호환 가능한 유형을 표시합니다. 공백은 유형이 호환되지 않음을 의미합니다. 숫자는 유형이 호환 가능한 상황에 대해 자세히 설명하는 세 번째 표 뒤에 있는 참고를 나타냅니다.

첫 번째 표에서는 지정의 소스로서 텍스트 유형을 다룹니다.

표 1. 지정 호환성: 텍스트 유형
대상 소스
  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(월) 2 2 2  
INTERVAL(초) 2 2 2  
TIME 2 2 2  
TIMESTAMP 2 2 2  
HEX Y   Y  
BOOLEAN        

두 번째 표에서는 지정의 소스로서 숫자 유형을 다룹니다.

표 2. 지정 호환성: 숫자 유형
대상 소스
  BIN

INT,
BIGINT, SMALL-
INT

DECI-
MAL

NUM

NUM-
BER

FLOAT,
SMALL-
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,
SMALL-
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(월) 6 6 6 6 6 6 6 6 6
INTERVAL(초) 6 6 6 6 6 6 6 6 6
TIME                  
TIMESTAMP                  
HEX           7      
BOOLEAN 8 8 8 8 8 8 8 8 8

세 번째 표에서는 지정의 소스로서 날짜/시간, 16진 및 부울 유형을 다룹니다.

표 3. 지정 호환성: 기타 유형
대상 소스
  DATE INTERVAL(월) INTERVAL(초) TIME

TIME-
STAMP

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(월)   Y          
INTERVAL(초)     Y        
TIME       Y Y    
TIMESTAMP Y     Y Y    
HEX           Y  
BOOLEAN             Y
참고:
  1. 텍스트는 수신하는 데이터 유형의 리터털을 묘사해야 합니다. 텍스트는 지수 표기법, 선행 기호, 마침표 이외의 소수점 구분 기호(언어 설정에 따라 다름) 및 통화 기호(통화 유형에 지정되는 경우)를 포함할 수 있습니다. 텍스트는 수에 관계없이 선행 공백 또는 후미 공백을 가질 수 있지만 그 사이에는 공백을 가질 수 없습니다.
  2. 텍스트를 날짜/시간 유형으로 변환을 참조하십시오.
  3. 로케일 종속 통화 기호가 지정에서 대상의 시작 부분에 자동으로 추가됩니다. 비교에서는 텍스트 값의 첫 번째 문자가 통화 기호이면 해당 문자가 무시됩니다. "$10.20" 문자열과 "10.20" 문자열은 둘 다 값이 10.20인 MONEY 변수와 동일합니다.
  4. EGL은 숫자 유형을 STRING으로 변환할 때마다 패턴 인수가 없는 strLib.formatNumber()를 사용합니다. 여기에는 지정 및 문자열 연결이 포함됩니다. formatNumber()을 참조하십시오.
  5. 숫자 유형에 소수가 포함된 경우 EGL은 소수를 자르며 숫자는 1899년 12월 31일 이후의 일 수로 가정됩니다. 따라서 다음 코드는 콘솔에 "03/21/2006"을 인쇄합니다.
      Function main()
        testBin BIN(9,3) = 38796.999;
        testDate DATE;
        
        StrLib.defaultDateFormat = "MM/dd/yyyy";
        testDate = testBin;
        writeStdout (testDate);
      end
  6. 이는 숫자 값에 소수점 자리가 없는 경우에만 유효합니다. 숫자는 간격의 형식에 따라 해석됩니다. 다음 예제를 생각해 보십시오.
    myInterval INTERVAL("yyMM") = 1208;
    여기서 EGL은 숫자 1208을 12년 8개월로 해석합니다. 다음과 같은 규칙이 적용됩니다.
    • 숫자가 선행 0(영)은 무시하고 보유할 수 있는 간격보다 많은 자릿수를 가지고 있는 경우에는 오른쪽의 추가 자릿수가 무시됩니다.
    • 숫자가 간격이 보유할 수 있는 것보다 적은 자릿수를 가지고 있는 경우에는 선행 0(영)이 추가됩니다.
    • 간격의 부호는 숫자의 부호로 설정됩니다.
    • 숫자가 간격의 필드에 대해 범위를 벗어난 값을 지정하는 경우 EGL은 초과된 부분을 다음 필드로 이월합니다. 다음의 예제를 생각해 보십시오.
      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로 잘립니다.
  7. FLOAT, SMALLFLOAT 또는 다른 HEX(리터럴 포함) 이외의 값을 지정하려면 as 연산자를 사용하여 값을 캐스트하십시오.
  8. 숫자 변수가 0(영)이 아닌 값(양수 또는 음수)을 가지는 경우 EGL은 TRUE 값을 BOOLEAN 변수에 지정하며 숫자 0만 FALSE BOOLEAN 값을 생성합니다.
  9. 날짜/시간 유형을 텍스트로 변환을 참조하십시오.
  10. DATE를 숫자 유형에 지정하는 경우 값은 1899년 12월 31일 이후의 일 수입니다.
  11. EGL은 BOOLEAN 변수가 TRUE인 경우 값 1을 숫자 유형에 지정하고 FALSE인 경우 0(영)을 지정합니다.
  12. 대상 변수에 소수 자리가 없는 경우에만 유효합니다.

숫자 유형 사이에서 반올림 및 자르기

NUMC 및 PACF를 포함하여 모든 숫자 유형의 값을 모든 숫자 유형 및 크기의 변수에 지정할 수 있으며 EGL은 대상 형식으로 값을 보유하기 위해 필요한 변환을 수행합니다.

의미가 없는 0(영)은 필요에 따라 추가되거나 잘립니다. (값의 정수 파트에 있는 초기 0(영)은 값의 소수 부분에 있는 후미 숫자와 마찬가지로 의미가 없습니다.)

V6 예외 모드를 사용하고 vgVar.handleOverflow를 적절하게 설정하면 sysVar.overflowIndicator 시스템 변수를 사용하여 지정 또는 산술 계산에서 오버플로우가 발생했는지 여부를 테스트할 수 있습니다. 자세한 정보는 handleOverflow를 참조하십시오. V6 예외 모드를 사용하지 않거나 오버플로우를 처리하지 않는 경우에는 오버플로우로 인해 EGL에 RuntimeException이 발생합니다.

소스에 대해 런타임 값 108.314가 제공되면 하나의 DECIMAL 변수를 다른 변수에 복사할 때 다음과 같은 조치가 발생합니다.
  • 대상 변수가 하나의 소수 자리를 가진 7개의 자릿수를 허용하는 경우 대상 변수는 000108.3 값을 수신하며 오버플로우는 발견되지 않습니다. (소수 값에서의 정밀도 손실은 오버플로우로 간주되지 않습니다.)
  • 대상 변수가 두 개의 소수 자리를 가진 4개의 자릿수를 허용하는 경우 오버플로우가 발견됩니다.

assignment문에서는 소스가 FLOAT 또는 SMALLFLOAT이고 대상에 고정된 수의 소수가 포함된 경우가 아니면 truncateExtraDecimals 빌드 디스크립터 옵션이 YES(기본값임, 자세한 정보는 EGL 생성 안내서 참조)인 경우 추가 소수 자리는 잘립니다. truncateExtraDecimlas가 NO로 설정되거나 소스가 FLOAT 또는 SMALLFLOAT이고 대상에 고정된 수의 소수가 포함된 경우 추가 소수 자리는 반올림됩니다.

버전 6 및 이전 버전의 EGL에서는 truncateExtraDecimals 옵션이 없었으므로 소스가 FLOAT 또는 SMALLFLOAT이며 대상에 고정된 수의 소수가 포함된 경우가 아니면 추가 소수가 항상 잘렸습니다. 지정의 소스가 MathLib 함수 중 하나인 경우 추가적인 규칙에서 자르기를 방지했습니다. 이 V6 스타일 반올림을 유지해야 하는 경우에는 MathLib.assign() 함수를 사용하십시오(assign() 참조).

문자 유형을 사용한 채우기 및 자르기

대상이 비STRING 문자 유형(DBCHAR 및 HEX 포함)이며 소스 값을 저장하기 위해 필요한 것보다 많은 공간을 가진 경우 EGL은 다음과 같은 방식으로 오른쪽의 데이터를 채웁니다.
  • 1바이트 공백은 CHAR 또는 MBCHAR 유형의 대상을 채웁니다.
  • 2바이트 공백은 DBCHAR 유형의 대상을 채웁니다.
  • Unicode 2바이트 공백은 UNICODE 유형의 대상을 채웁니다.
  • 2진 0(영)은 HEX 유형의 대상을 채우며 이는 예를 들어, 소스 값 "0A"가 2바이트 대상에서 "000A" 대신 "0A00"으로 저장됨을 의미합니다.

EGL은 문자 유형의 대상에 소스 값을 저장하기에 충분한 공간이 없는 경우 오른쪽의 값을 자릅니다. 오류가 발생하지 않습니다.

대상이 길이가 제한된 문자열인 경우에는 다음과 같은 규칙이 적용됩니다.
  • 대상에서 유효한 수보다 많은 수의 문자가 소스에 있는 경우 EGL 런타임은 사용 가능한 길이에 맞게 복사된 컨텐츠를 자릅니다.
  • 대상에서 유효한 수보다 적은 수의 문자가 소스에 있는 경우 EGL 런타임은 복사된 컨텐츠를 대상 문자열의 길이까지 공백을 채웁니다. 하지만 길이가 제한된 문자열의 후미 공백은 모두 비교에서 무시됩니다.
다음 상황에서는 특수한 경우가 발생할 수 있습니다.
  • 런타임 플랫폼이 EBCDIC 문자 세트를 지원함
  • assignment문이 MBCHAR 유형의 리터럴 또는 MBCHAR 유형의 변수를 MBCHAR 유형의 더 짧은 변수에 복사함
  • 바이트별 자르기에서 최종 SI 문자를 제거하거나 2바이트 문자를 분할함

이 상황에서 EGL은 대상 변수에 MBCHAR 유형의 올바른 문자열이 포함되도록 하기 위해 필요한 대로 문자를 자른 후 필요한 경우 종료 1바이트 공백을 추가합니다.

널 입력 가능 유형에 대한 지정

널 입력 가능 변수는 해당 기본 유형이 지정 호환 가능한 경우 널 입력 가능하지 않은 변수와 지정 호환 가능합니다. 널 입력 가능하지 않은 변수가 널 입력 가능한 변수에 지정되면 지정에서는 이 주제에서 이전에 설명한 규칙을 따릅니다. 소스 변수는 널일 수 없으므로 이 경우 대상 변수는 널로 설정되지 않습니다. 널 입력 가능한 변수가 널 입력 가능하지 않은 변수에 지정되면 소스가 현재 널인지 여부와 데이터의 유형에 따라 동작이 다릅니다. 다음 규칙에서 해당 동작에 대해 설명합니다.
  • 소스가 현재 널이고 대상이 문자 변수인 경우 대상 변수는 공백으로 설정됩니다.
  • 소스가 현재 널이고 대상 변수가 숫자인 경우 대상 변수는 0(영)으로 설정됩니다.
  • 소스가 널이 아닌 경우 지정에서는 일반적인 지정 규칙을 따릅니다.

널 입력 가능 변수는 정확하게 동일한 기본 유형을 가진 다른 널 입력 가능 변수와만 참조 호환 가능합니다. 지정에서는 EGL에서 참조 호환성에 설명된 규칙을 따릅니다.

시간소인 간 지정

하나의 TIMESTAMP 변수를 다른 TIMESTAMP 변수에 지정하는 경우에는 다음과 같은 규칙이 적용됩니다.
  • 대상 변수에 필요한 상대적으로 상위 레벨인 항목이 소스 변수의 마스크에 누락된 경우 해당 대상 항목은 다음 예제와 같이 지정 시 시스템의 시계에 따라 지정됩니다.
    •   sourceTimeStamp timestamp ("MMdd");
         targetTimeStamp timestamp ("yyyyMMdd");
        
         sourceTimeStamp = "1201";
      
        // if this code runs in 2004, the next statement
        // assigns 20041201 to targetTimeStamp
         targetTimeStamp = sourceTimeStamp; 
    •   sourceTimeStamp02 timestamp ("ssff");
        targetTimeStamp02 timestamp ("mmssff");
        
         sourceTimeStamp02 = "3201";
      
        // the next assignment includes the minute
        // that is current when the assignment statement runs
        targetTimeStamp02 = sourceTimeStamp02;
    • 대상 변수에 필요한 상대적으로 높은 레벨의 항목이 소스 변수의 마스크에 누락된 경우 해당 항목에는 다음 예제와 같이 가장 낮은 올바른 값이 지정됩니다.
      • sourceTimeStamp timestamp ("yyyyMM");
        targetTimeStamp timestamp ("yyyyMMdd");
        
        sourceTimeStamp = "200412";
        
        // regardless of the day, the next statement
        // assigns 20041201 to targetTimeStamp
        targetTimeStamp = sourceTimeStamp; 
      • sourceTimeStamp02 timestamp ("hh");
        targetTimeStamp02 timestamp ("hhmm");
        
        sourceTimeStamp02 = "11";
        
        // regardless of the minute, the next statement
        // assigns 1100 to targetTimeStamp02
        targetTimeStamp02 = sourceTimeStamp02;

구조화된 레코드의 필드에 대한 지정

하위 구조 필드를 비하위 구조 필드에 지정하거나 그 반대로 지정할 수 있으며 두 하위 구조 필드 사이에 값을 지정할 수 있습니다. 예를 들어, 이름이 myNummyRecord인 변수가 다음과 같은 파트를 기반으로 한다고 가정합니다.

  DataItem Num12
    NUM(12)
  end
  Record ExampleRecord type basicRecord
    10 topMost CHAR(4);
      20 next01 HEX(4);
      20 next02 HEX(4);
  end

수학적 시스템 변수 외부에서는 NUM 유형의 변수에 대한 HEX 유형의 값 지정이 유효하지 않지만 topMost의 유형이 CHAR이므로 myNum = topMost 양식의 지정은 유효합니다. 일반적으로 assignment문에서 필드의 기본 유형이 지정을 안내하며 하위 필드의 기본 유형은 고려되지 않습니다.

기본적으로 하위 구조 필드의 기본 유형은 CHAR입니다. 하위 구조 필드에 대해 데이터를 지정하는 경우 선언 시 다른 기본 유형을 지정하지 않으면 CHAR 유형의 필드에 대해 이전에 설명한 규칙이 지정 중에 적용됩니다.

구조화된 레코드의 지정

하나의 구조화된 레코드 변수를 다른 구조화된 레코드 변수에 지정하는 것은 CHAR 유형의 하나의 하위 구조 필드를 다른 하위 구조 필드에 지정하는 것과 동등합니다. 길이가 일치하지 않으면 수신된 값의 오른쪽에 1바이트 공백이 추가되거나 수신된 값의 오른쪽에서 1바이트 문자가 제거됩니다. 지정에서는 하위 구조 필드의 기본 유형을 고려하지 않습니다.

다음과 같은 예외가 적용됩니다.
  • 레코드의 컨텐츠를 레코드 변수나 CHAR, HEX, STRING 또는 MBCHAR 유형의 변수에 지정할 수 있지만 기타 유형의 변수에는 지정할 수 없습니다.
  • 레코드는 다음과 같은 소스로부터 데이터를 수신할 수 있습니다.
    • 또다른 레코드
    • 문자열 리터럴(숫자 리터럴은 아님)
    • CHAR, HEX, STRING 또는 MBCHAR 변수(다른 유형은 허용되지 않음)

마지막으로 구조화된 SQL 레코드 변수를 다른 유형의 구조화된 레코드 변수에 대해 지정하는 경우에는 비SQL 레코드에서 각각의 구조 필드 앞에 4바이트 영역을 위한 공간이 있는지 확인해야 합니다(자세한 정보는 구조화 레코드 참조).

레코드 간 지정

비구조화된 레코드 변수는 정확하게 동일한 유형의 기타 비구조화된 레코드 변수와만 지정 호환 가능합니다.

환경 전체에서 일관된 결과 달성

중간 결과가 잘리기 때문에 동일한 산술 명령문에 대해 COBOL 프로그램의 결과가 Java™ 또는 Rich UI 프로그램과 다를 수 있습니다. 환경 전체에서 일관된 결과를 보장하려면 명령문당 하나의 이항 연산자만 사용하십시오. 결과 항목에 대해 정의된 소수 자리의 수가 피연산자의 소수 자리 수 이상인 경우 여러 덧셈 및 뺄셈 연산자를 안전하게 결합할 수 있습니다.

0(영)개보다 많은 소수 자리를 사용하여 결과 또는 피연산자가 정의되는 경우 나머지 연산자는 일관되지 않은 결과를 생성할 수 있습니다. 소수 자리를 가진 일관된 나머지를 얻으려면 나머지 연산자 대신 다음 알고리즘을 사용하십시오.
quotient = dividend / divisor;
remainder = dividend - (quotient * divisor);

호환성

표 4. 지정에 대한 호환성 고려사항
플랫폼 문제
COBOL 생성 EGL이 텍스트를 SMALLFLOAT 또는 FLOAT로 변환할 수 없지만 그 반대 방향으로는 변환할 수 있습니다.