알 수 없는 다중 발생 요소에 액세스

메시지에서 반복 필드에 액세스하려면 반복 필드의 모든 인스턴스에서 반복할 수 있는 구조체를 사용해야 합니다.

태스크 정보

반복 횟수가 알 수 없는 반복 필드 (예: 예제 메시지Item 필드) 를 포함하는 메시지를 처리할 수 있습니다.

Item 필드의 모든 인스턴스를 고려하는 필터를 작성하려면 반복 필드의 모든 인스턴스에서 반복될 수 있는 구조체를 사용해야 합니다. 한정 술어를 통해 반복 필드의 모든 인스턴스에 대해 술어를 실행하고 결과를 조합할 수 있습니다.

예를 들어, 순서가 지정 중인 어느 항목도 수량이 50보다 크지 않음을 확인하고자 할 수도 있습니다. 이를 수행하기 위해 다음을 작성할 수 있습니다.

FOR ALL Body.Invoice.Purchases."Item"[] 
    AS I (I.Quantity <= 50)

한정 술어를 사용할 때, 첫 번째로 주의할 것은 필드 참조 끝에서 FOR ALL 뒤에 있는 대괄호 []입니다. 이는 Item 필드의 모든 인스턴스에서 반복 중임을 나타냅니다.

컨텍스트에서 해당 정보를 얻을 수 있기 때문에 어떤 경우에는 이 구문이 불필요해 보이지만 다른 구문 조각과의 일관성을 위한 것입니다.

AS절은 이름 I를 반복 필드의 현재 인스턴스와 연관시킵니다. 이는 C++와 같은 일부 오브젝트 지향 언어에서 사용되는 반복자 (iterator) 클래스의 개념과 유사합니다. 괄호 안의 표현식은 Item 필드의 각 인스턴스에 대해 평가되는 술어입니다.

다음은 이 예에 대한 설명입니다.

프로시저

Body.Invoice내에서 필드 항목의 모든 인스턴스를 반복합니다.
각 반복의 경우,
  1. 이름 IItem의 현재 인스턴스에 바인드하십시오.
  2. 술어 I.Quantity <= 50를 평가하십시오.
    술어가
    • Item의 모든 인스턴스에 대해 TRUE로 평가되면 TRUE를 리턴합니다.
    • Item의 인스턴스에 대해 FALSE이면 FALSE를 리턴합니다.
    • TRUE와 UNKNOWN이 혼합된 경우 UNKNOWN을 리턴합니다.

결과

위의 내용은 ALL 키워드를 사용하는 경우 술어가 평가되는 방법에 대한 설명입니다. 대신 동등한 SOME 또는 ANY를 지정할 수 있습니다. 이 경우 하위 술어가 반복 필드의 인스턴스에 대해 TRUE를 리턴하면 한정 술어는 TRUE를 리턴합니다. 하위 술어가 반복 필드의 모든 인스턴스에 대해 FALSE를 리턴하는 경우에만 한정 술어가 FALSE를 리턴합니다. 하위 술어에서 FALSE 및 UNKNOWN 값이 혼합되어 리턴된 경우 전체 UNKNOWN 값이 리턴됩니다.

다음 필터 표현식에서,

FOR ANY Body.Invoice.Purchases."Item"[]  
    AS I (I.Title = 'The XML Companion')

하위 술어는 TRUE로 평가됩니다. 그러나 다음 표현식은 FALSE를 리턴합니다.

FOR ANY Body.Invoice.Purchases."Item"[] 
    AS I (I.Title = 'C Primer')

C Primer는 이 송장에 포함되지 않기 때문입니다. 송장의 일부 항목에 책 제목 필드가 포함되지 않은 경우 하위 술어는 UNKNOWN을 리턴하며 한정 술어는 값 UNKNOWN을 리턴합니다.

널(null) 값이 표시될 수 있는 상황을 처리하려면 다음과 같이 필드의 존재를 명시적으로 점검하여 이 필터를 작성하십시오.
FOR ANY Body.Invoice.Purchases."Item"[] 
	 AS I (I.Book IS NOT NULL AND I.Book.Title = 'C Primer')

술어 IS NOT NULL은 Item 필드에 Book가 포함되지 않은 경우 서브술어에서 FALSE값이 리턴되도록 합니다.

데이터베이스에서 열 참조에 설명된 대로 SELECT 표현식을 사용하여 메시지 내에서 임의의 필드 반복을 조작할 수도 있습니다.

얼마나 많은 인스턴스가 있는지 모르는 경우에도 [>] 및 [<] 배열 색인을 사용하여 반복 필드의 첫 번째와 마지막 인스턴스 그리고 첫 번째와 마지막 인스턴스와 관련된 인스턴스를 참조할 수 있습니다. 이러한 색인은 요소의 알려진 다중 어커런스 액세스에 설명되어 있습니다.

또는 CARDINALITY 함수를 사용하여 반복 필드의 인스턴스 수를 판별할 수 있습니다. 예를 들어,

DECLARE I INTEGER CARDINALITY(Body.Invoice.Purchases."Item"[])