값 설정 블록

값 설정 블록은 특성, 필드 또는 변수값을 설정할 수 있는 코드의 영역입니다. 특성에 대한 배경은 "EGL 특성의 개요"를 참조하십시오.

다음 조치를 수행하는 경우 값 설정 블록을 포함할 수 있습니다.
  • 파트 정의
  • 변수 선언
  • new 연산자로 파트 작성
  • call, transfer 또는 show 문의 특수 양식 코드화(특성 전용)
  • 지정 명령문의 특수 양식 코드화(값 전용)
  • "openUI"에 설명된 대로 openUI 문 코드화(값 전용)

마지막 두 경우에는 필드에 값만 지정할 수 있습니다.

프로그래머는 일반적으로 파트 컨텐츠의 시작 부분에 하나의 값 설정 블록을 배치합니다. 그러나 범위 지정 규칙(범위 참조)을 준수하는 한 지정한 특성 또는 값마다 개별 값 설정 블록을 가질 수 있으며 파트 전체에 걸쳐 배치할 수 있습니다. 예를 들어, 다음 코드의 값 설정 블록은 handleHardIOErrors 프로그램 특성을 설정합니다.
program hello
	myString STRING = "Hello, Cleveland";
	{handleHardIOErrors = YES}   // this works
	...
end
세미콜론을 이동하면 프로그램에서 유효성 검증 오류가 발생합니다.
program hello
	myString STRING = "Hello, Cleveland"
	{handleHardIOErrors = YES};   // this is part of myString declaration
	...
end

문제는 handleHardIOErrors가 이제 문자열 "Hello, Cleveland"의 범위에 있다는 점입니다. 문자열에 설정할 필드가 없고 "handleHardIOErrors" 필드도 포함되지 않으므로 EGL이 표현식을 해석할 수 없습니다.

값 설정 블록은 다음과 같은 추가 영향을 미칩니다.
  • 널 입력 가능 변수에 대한 널 플래그를 설정 해제합니다.
  • 널 참조 변수의 새 파트를 초기화합니다.
다음 명령문은 초기값이 널이 아닌(이 경우 0) 널 입력 가능 변수를 작성합니다.
myInt INT?{};
다음 예제의 결과 널값 예외가 발생합니다.
myList Dictionary;   // myList = null
myList.x = 23;       // illegal reference
그러나 다음 코드는 지정을 시도하기 전에 새 사전 변수를 초기화합니다.
myList2 Dictionary;   // myList2 = null
myList2{ x = 23 };    // myList2 now has one key, x, whose value is 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
  endend
최상위 레벨 필드를 설정하면 하위 구조 필드도 설정됩니다. 다음 예제와 같이 하위 구조 필드를 개별적으로 설정할 수도 있습니다.
  myRec2 StructuredRecordA {checkNum = 1485};
  writeStdOut(myRec2.fullCheckNum); // 1485

값 설정 블록에서 동일한 필드 또는 특성에 여러 값을 지정하는 경우 마지막 지정이 적용됩니다. 해당 규칙도 복합 특성의 필드에 적용되며 이 주제의 "복합 특성의 값 설정 블록"에서 이에 대해 설명합니다.

기본 상황의 값 설정 블록

대부분의 기본 경우에 다음 규칙이 적용됩니다.
  • 각 값 설정 블록은 왼쪽 중괄호({)로 시작하고 쉼표로 구분된 0개 이상의 항목을 포함하며 오른쪽 중괄호(})로 끝납니다.
  • 각 항목은 다음 두 형식 중 하나입니다.
    • 이름/값 쌍(예: inputRequired = yes).
    • 일련의 위치 값(배열의 연속되는 요소에 지정된 연속되는 값).

두 경우 모두 값 설정 블록은 수정되는 파트, 변수 또는 필드의 범위에 있습니다. 예제를 통해 구문의 변형을 잘 파악할 수 있습니다.

첫 번째 예제는 두 개의 특성(inputRequired, align)이 있는 기본 유형 변수를 표시합니다. :
   // the scope is myVariable
   myVariable INT
   {
      inputRequired = yes,
      align = left
   };
다음 예제는 DataItem 파트 정의를 표시합니다.
  // scope is optionEntry
  DataItem optionEntry INT
  {
      inputRequired = yes,
      align = left
  };
  end
다음 예제는 이전 파트를 유형으로 사용하고 특성 중 하나를 대체하는 변수 선언을 표시합니다.
  // scope is 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 필드에 적용되는 다음 예제에 표시된 모든 양식을 취할 수 있습니다.

  // dotted syntax
  myRecB myBasicRecord 
  { 
    myRec02.myRec03.myInt04{ align = left } 
  };

  // bracket syntax
  // You cannot use this syntax to affect
  // fields in fixed structures
  myRecC myBasicRecord 
  { 
    myRec02["myRec03"]["myInt04"]{ align = left } 
  };

  // brace syntax 
  myRecA myBasicRecord 
  { 
    myRec02 {myRec03 { myInt04 { align = left }}}
  };
복잡한 경우에도 쉼표를 사용하여 값 설정 블록에서 항목을 구분할 수 있습니다. 주어진 블록이 중첩되는 레벨을 고려해야 합니다.
  // dotted syntax
  myRecB myBasicRecord 
  { 
    myInt01 = 4,
    myInt02 = 5,
    myRec02.myRec03.myInt04{ align = left }, 
    myRec02.myInt03 = 6
  };

  // bracket syntax
  myRecC myBasicRecord 
  { 
    myInt01 = 4,
    myInt02 = 5,
    myRec02["myRec03"]["myInt04"]{ align = left }, 
    myRec02["myInt03"] = 6
  };

  // brace syntax; 
  // but this usage is much harder to maintain
  myRecA myBasicRecord 
  { 
    myInt01 = 4,
    myInt02 = 5,
    myRec02 
      {
        myRec03 
          { myInt04 
            { action = label5 }},
        myInt03 = 6
      }
  };

값 설정 블록에서 "this" 사용

변수 선언 또는 지정 명령문에 레코드 특성과 동일한 이름의 필드(예: keyItems)를 포함하는 컨테이너(예: SQL 레코드)가 있을 수 있습니다. 특성이 아닌 필드를 참조하려면 this 키워드를 사용하십시오. 이 키워드는 범위를 값 설정 블록이 상주하는 선언이 되도록 설정합니다.

다음 레코드 정의를 검토합니다.
  Record ExampleRecord type SQLRecord
    { tableNames = [["myTable"]],
      keyItems = [myKey] }
    myKey CHAR(10);
    myOtherKey CHAR(10);
    keyItems CHAR(60);
  end 
다음 레코드 선언은 먼저 keyItems 특성의 값을 설정한 후 동일한 이름의 필드에 값을 설정합니다.
  myRecord ExampleRecord 
  { 
     keyItems = [myOtherKey],
     this.keyItems = "abc"
  };

배열 선언의 예제는 "추가 값 설정 블록 예제"를 참조하십시오.

복합 특성의 값 설정 블록

EGL은 이름이 규칙에 따라 @ 부호로 시작하는 여러 복합 특성을 포함합니다. 복합 특성에는 특성 필드라고 하는 고유의 특성이 있으며 하위 값 설정 블록에서 지정된 값이 있습니다. 다음 예제는 서비스 변수 선언에서 사용되는 @xml 복합 특성을 표시합니다.
  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}
    };
  
    // change x, y in code, using a statement 
    // that is equivalent to the following code:
    //   screen.topLeft.x = 1;
    //   screen.topLeft.y = 2;
    screen.topLeft{x=1, y=2};
  end
다음으로 동일한 함수에서 Point 요소의 동적 배열을 초기화하십시오.
  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]의 사용은 모호하지 않으므로 이와 같은 구분은 필요하지 않습니다.

다음으로 Point 유형의 다른 동적 배열을 고려하십시오.
  points Point[];
배열이 초기화되지 않았으믐로 다음 두 지정에서 NullValueExceptions 예외 처리(throw)를 합니다. 배열이 참조 유형이므로(참조 변수 참조) 널 초기값을 갖습니다.
  points{x=1, y=1};
  points[1]{x=10, y=20};
배열을 초기화한 후 배열에 요소를 추가하고 단일 명령문을 사용하여 모든 요소에 값을 설정할 수 있습니다.
  points{};
  points.resize(2);
  points{x=1, y=1};