Update 함수
Update 함수가 개체를 호출하면 새 데이터와 상태에 따라 재평가할 엔진에 개체가 다시 추가됩니다. 개체는 TypedXmlDocument 또는 .NET 클래스 또는 DataConnection 또는 TypedDataTable 형식일 수 있습니다.
이 항목에 설명된 대로 Update 함수를 사용하여 엔진 성능을 개선하고 무한 루프 시나리오를 방지할 수도 있습니다.
일반적으로 Assert 를 사용하여 규칙 엔진의 작업 메모리에 새 개체를 배치하고 Update 를 사용하여 작업 메모리의 기존 개체를 업데이트합니다. 새 개체를 어설션하면 모든 규칙의 조건이 평가됩니다. 기존 개체를 업데이트하면 업데이트된 팩트를 사용하는 조건만 다시 평가되고, 이러한 조건이 true로 평가되면 작업이 어젠더에 추가됩니다.
다음과 같은 두 가지 규칙 예를 살펴보십시오. 개체 ItemA 및 ItemB가 작업 중인 메모리에 이미 있다고 가정합니다. 규칙 1은 ItemA의 Id 속성을 평가하고, ItemB에서 Id 속성을 설정한 다음, 변경 후 ItemB를 다시 확인합니다. ItemB가 재주장되면 새 개체로 처리되고 엔진은 조건자 또는 작업에서 개체 ItemB를 사용하는 모든 규칙을 다시 평가합니다. 이렇게 하면 규칙 1에 설정된 대로 규칙 2가 ItemB.Id 새 값에 대해 다시 평가됩니다. 규칙 2는 처음 평가되었을 때 실패했을 수 있지만 두 번째로 평가될 때 true 로 평가됩니다.
IF ItemA.Id == 1
THEN ItemB.Id = 2
Assert(ItemB)
IF ItemB.Id == 2
THEN ItemB.Value = 100
개체를 작업 중인 메모리로 다시 어설션하는 이러한 기능을 통해 사용자는 정방향 추론 시나리오에서의 동작을 명시적으로 제어할 수 있습니다. 그러나 이 예에서 다시 어설션하는 경우 규칙 1도 다시 평가된다는 단점이 있습니다. ItemA.Id 변경되지 않았으므로 규칙 1이 다시 true로 평가되고 Assert(ItemB) 작업이 다시 실행됩니다. 따라서 규칙을 통해 계속해서 반복되는 상황이 발생합니다.
참고
규칙 재평가의 기본 최대 루프 수는 2^32입니다. 특정 규칙의 경우 정책 실행이 오랫동안 지속될 수 있습니다. 정책 버전의 최대 실행 루프 깊이 속성을 조정하여 개수를 줄일 수 있습니다.
무한 루프를 만들지 않고 개체를 다시 어설션할 수 있어야 하며 Update 함수는 이 기능을 제공합니다. reassert와 마찬가지로 Update 함수는 규칙 작업에서 변경된 연결된 개체 인스턴스의 Retract 및 Assert 를 수행하지만 두 가지 주요 차이점이 있습니다.
인스턴스 유형이 조건부가 아닌 작업에서만 사용되는 규칙에 대한 어젠더의 작업은 어젠더에 유지됩니다.
작업의 인스턴스 유형만 사용하는 규칙은 다시 평가되지 않습니다.
따라서 조건부의 인스턴스 유형만 사용하는 규칙 또는 조건부와 작업 모두의 인스턴스 유형을 사용하는 규칙은 다시 평가되고 어젠더에 해당 작업이 적절하게 추가됩니다.
Update 함수를 사용하도록 앞의 예제를 변경하면 ItemB 가 규칙 2의 조건에서 사용되므로 규칙 2만 다시 평가됩니다. ItemB는 규칙 1의 작업에서만 사용되므로 규칙 1은 다시 평가되지 않으므로 반복 시나리오가 제거됩니다.
IF ItemA.Id == 1
THEN ItemB.Id = 2
Update(ItemB)
IF ItemB.Id == 2
THEN ItemB.Value = 100
그러나 아직 반복 시나리오가 발생할 가능성이 있습니다. 예를 들어 다음과 같은 규칙이 있을 수 있습니다.
IF ItemA.Id == 1
THEN ItemA.Value = 20
Update(ItemA)
ItemA는 조건자에서 사용되므로 ItemA에서 업데이트가 호출될 때 다시 평가됩니다. ItemA.Id 값이 다른 곳에서 변경되지 않으면 규칙 1이 계속 true로 평가되어 A에서 업데이트가 다시 호출됩니다. 규칙 디자이너는 이와 같은 루핑 시나리오가 만들어지지 않도록 해야 합니다.
이에 대한 적절한 접근 방법은 규칙의 기본 특성에 따라 달라집니다. 다음은 위 예에서 발생하는 문제를 해결하기 위한 간단한 메커니즘입니다.
Update 함수는 Assert, Retract 또는 RetractByType 함수와 마찬가지로 클래스에 대한 참조와 함께 비즈니스 규칙 작성기에서 사용할 수 있습니다.
IF ItemA.Id == 1 and ItemA.Value != 20
THEN ItemA.Value = 20
Update(ItemA)
ItemA.Value에 검사 추가하면 규칙 1의 작업이 처음 실행된 후 규칙 1이 다시 true로 평가되지 않습니다.
다음과 같은 두 가지 규칙 예를 살펴보십시오. 아래와 같이 가정합니다. 규칙 1은 구매 주문 메시지에서 총 항목 수를 평가하고 규칙 2는 총 합계가 10 이상인 경우 상태를 "Needs approval"로 설정합니다.
IF 1 == 1
THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)
IF ProcessPO.Order:/Order/Items/TotalCount >= 10
THEN ProcessPO.Order:/Order/Status = "Needs approval"
이 정책에 대한 입력으로 다음 PO(구매 주문) 메시지를 전달하는 경우 총 항목 수가 14개임에도 불구하고 상태 "승인 필요"로 설정되지 않습니다. TotalCount 필드의 값이 0일 때만 rule2가 평가되고 사용 가능한 총 개수가 업데이트될 때마다 규칙이 평가되지 않기 때문입니다. TotalCount가 업데이트될 때마다 조건을 다시 평가하려면 수정된 노드(TotalCount)의 부모 노드(항목)에서 Update 함수를 호출해야 합니다. 아래와 같이 규칙 1을 변경하고 다시 테스트하면 상태 필드의 값이 "Needs Approval"로 설정되는 것을 확인할 수 있습니다.
<ns0:Order xmlns:ns0="http://ProcessPO.Order">
<Items>
<Item>
<Id>ITM1</Id>
<Count>2</Count>
</Item>
<Item>
<Id>ITM2</Id>
<Count>5</Count>
</Item>
<Item>
<Id>ITM3</Id>
<Count>7</Count>
</Item>
<TotalCount>0</TotalCount>
</Items>
<Status>No approval needed</Status>
</ns0:Order>
수정된 규칙 1 은 다음과 같습니다.
IF 1 == 1
THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count) AND
Update(ProcessPO.Order:/Order/Items)
TypedDataTable에서 Update가 호출되면 연결된 모든 TypedDataRows의 엔진에서 Update가 호출됩니다. 개별 TypedDataRows에서 업데이트를 호출할 수도 있습니다.
DataConnection 업데이트는 지원되지 않습니다. 대신 Assert 를 사용합니다.