UFX(Universal FetchXML)는 동적 FetchXML을 사용하여 데이터를 쿼리하고, URS(Universal Resource Scheduling) 솔루션에서 사용할 결과 데이터를 셰이핑하고, 준비할 수 있는 고급 쿼리 언어입니다. 이 쿼리 언어를 사용하면 사용자 지정 쿼리를 생성하여 일정 게시판 및 일정 도우미 필터를 사용자 지정하고 확장하여 조직의 고유한 비즈니스 요구 사항을 충족할 수 있습니다.
UFX는 UFX 가방과 UFX 쿼리의 두 가지 구성 요소로 구성됩니다.
심플 UFX 가방
UFX 가방에는 정적 형식의 데이터가 포함되어 있습니다. 메모리에서 키와 값이 있는 사전을 모델링합니다. JSON 및 XML로 직렬화할 수 있습니다. 데이터 형식을 지정하면 UFX 쿼리 가 데이터에서 데이터를 쿼리하고 클라이언트 UI가 이 데이터에 바인딩할 수 있습니다.
실용적이고 성능적인 이유로 인메모리 백은 Dynamics 365 앱 SDK Entity 개체 위에 구현됩니다.
두 개의 값을 포함하는 샘플 백입니다.
메모리에서:
| 열쇠 | 가치 | 유형 |
|---|---|---|
| 이름 | John | 문자열 |
| 연령 | 36 | 정수 (int) |
JSON:
{
"name": "John",
"age": 36
}
XML의 경우:
<bag>
<name ufx-type="string">John</name>
<age ufx-type="int">36</age>
</bag>
UFX 지원 유형
UFX 가방에는 여러 형식의 값이 포함될 수 있습니다. 세 가지 유형 클래스로 분류됩니다.
| 카테고리 | 가치 |
|---|---|
| 단순 형식 |
bool (Boolean), int (Int32), long (Int64), double (Double), decimal (Decimal), datetime (DateTime), guid (Guid)string (String)Dynamics 365 특정 단순 유형: money (Money), option (OptionSet), lookup (EntityReference) |
| 다른 가방 | bag (Entity) |
| 가방 목록 | list (EntityCollection) |
다음은 더 많은 형식을 포함하는 샘플 JSON 백입니다.
{
"citizen": true, // implicit bool
"age": 36, // explicit int
"age@ufx-type": "int",
"name": { // nested bag
"first": "John",
"last": "Doe"
},
"children": [ // list of bags
{ "name": "Sam" },
{ "name": "Judy" }
]
}
XML의 동일한 백 :
<bag>
<citizen ufx-type="bool">true</citizen>
<age ufx-type="int">36</age>
<name ufx-type="bag">
<first ufx-type="string">John</first>
<last ufx-type="string">Doe</last>
</name>
<children ufx-type="list">
<bag>
<name ufx-type="string">Sam</name>
</bag>
<bag>
<name ufx-type="string">Judy</name>
</bag>
</children>
</bag>
UFX 쿼리
UFX 쿼리는 XML 기반 UFX Bag으로 작성됩니다. 백의 속성에는 데이터를 동적으로 쿼리하는 UFX 지시문 이 포함될 수 있습니다. UFX 쿼리는 XML이 아닌 메모리 내 개체에서 실행됩니다. 지시문만 XML로 작성됩니다. 출력은 JSON 또는 XML로 직렬화할 수 있습니다.
다음 UFX 쿼리는 accounts UFX 지시문을 사용하여 가방의 속성을 정의합니다.source 결과적으로 Dynamics 365는 인라인 FetchXML을 실행하여 속성을 가방 목록으로 채웁 accounts 니다. 여기서 EntityCollection 각 가방은 Dynamics 365의 개별 거래처 레코드를 나타냅니다.
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
<accounts ufx:source="fetch">
<fetch top="10">
<entity name="account" />
</fetch>
</accounts>
</bag>
UFX 쿼리는 순차적으로 처리되며 많은 FetchXML 쿼리를 포함할 수 있습니다.
다음은 XML로 직렬화된 이전 UFX 쿼리의 결과 코드 조각입니다. 일부 값에는 해당 값을 추가로 설명하는 메타데이터가 있는지 확인합니다.
<bag>
<accounts ufx-type="list">
<bag ufx-id="166e39dd-34a1-e611-8111-00155d652f01" ufx-logicalname="account">
<accountid ufx-type="guid">166e39dd-34a1-e611-8111-00155d652f01</accountid>
<accountnumber ufx-type="string">ABSS4G45</accountnumber>
<name ufx-type="string">Fourth Coffee (sample)</name>
<statecode ufx-type="option" ufx-formatvalue="Active">0</statecode>
<websiteurl ufx-type="string">https://www.fourthcoffee.com/</websiteurl>
<primarycontactid ufx-type="lookup" ufx-formatvalue="Yvonne McKay (sample)" ufx-logicalname="contact">7c6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
...
</bag>
<bag ufx-type="bag" ufx-id="186e39dd-34a1-e611-8111-00155d652f01" ufx-logicalname="account">
<accountid ufx-type="guid">186e39dd-34a1-e611-8111-00155d652f01</accountid>
<accountnumber ufx-type="string">ACTBBDC3</accountnumber>
<name ufx-type="string">Litware, Inc. (sample)</name>
<statecode ufx-type="option" ufx-formatvalue="Active">0</statecode>
<websiteurl ufx-type="string">https://www.litwareinc.com/</websiteurl>
<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
...
</bag>
...
</accounts>
</bag>
UFX 지시문은 select 현재 bag에서 값을 선택하는 XPath 식을 사용합니다.
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
<accounts ufx:source="fetch">
<fetch top="10">
<entity name="account" />
</fetch>
</accounts>
<first_account_name ufx:select="accounts/bag[1]/name" />
<!-- null values remove properties from the bag -->
<accounts ufx:select="$null" />
</bag>
XML의 결과 백은 다음과 같습니다.
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
UFX 쿼리의 가장 강력한 측면은 입력 데이터를 기반으로 FetchXML을 동적으로 생성하는 기능입니다.
다음 샘플에서는 사용자가 제공하고 XPath $input 변수를 통해 UFX 가방으로 사용할 수 있는 값으로 계정을 검색합니다. 요소에 대한 UFX if 및 value 지시문을 condition 확인합니다.
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
<accounts ufx:source="fetch">
<fetch top="10">
<entity name="account">
<filter>
<condition attribute="name" operator="like" ufx:if="$input/NameFilter">
<ufx:value select="$input/NameFilter" attribute="value" />
</condition>
</filter>
</entity>
</fetch>
</accounts>
</bag>
입력 모음의 NameFilter 속성에 생성된 FetchXML 조건이 포함된 %city% 경우 Dynamics 365에서 실행되는 조건은 다음과 같습니다.
<condition attribute="name" operator="like" value="%city%" />
키, 값 및 메타데이터
UFX 백에는 키와 값이 포함되어 있으며, 일부 값에는 이를 설명하는 더 많은 메타데이터가 있습니다.
예를 들어 유형의 lookup (EntityReference)값이 있을 수 있습니다. FetchXML을 통해 Dynamics 365에서 쿼리하면 엔터티의 논리적 이름과 레코드의 서식이 지정된 표시 이름이 반환됩니다. UFX 백은 이러한 추가 정보를 기본 값에 첨부된 메타데이터로 보존합니다.
JSON lookup 으로 직렬화된 메타데이터는 다음과 같습니다.
{
"primarycontactid": "7e6e39dd-34a1-e611-8111-00155d652f01",
"primarycontactid@ufx-type": "lookup",
"primarycontactid@ufx-logicalname": "contact",
"primarycontactid@ufx-formatvalue": "Susanna Stubberod (sample)"
}
XML의 경우:
<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
Dynamics 365 데이터에 대한 XPath
UFX Bag의 데이터를 입력하면 UFX 쿼리에서 구조화된 형식으로 데이터를 보고 XPath를 사용하여 데이터를 탐색하고 데이터에서 값을 선택할 수 있습니다.
UFX 지시문에 지정된 XPath 식은 XML로 직렬화된 형식의 백 구조와 유사한 백의 데이터를 확인합니다. 그러나 데이터는 XML 문서가 아닌 메모리 내 .NET 개체(인스턴스 Entity 및 EntityCollection 형식)에 저장됩니다.
UFX 유형 참조
모든 UFX 유형은 및 ufx-typeufx-formatvalue 메타데이터를 지원합니다. 추가 메타데이터는 각 유형 옆에 설명되어 있습니다.
| UFX 이름 | 속성 유형 코드 | .NET 이름 | UFX 메타데이터 |
|---|---|---|---|
| bool | 불리언 (Boolean) | 불리언 (Boolean) | |
| 정수 (int) | 정수 | Int32 | |
| 길다 | 빅인트 (BigInt) | Int64 | |
| 더블 | 두 배 | 두 배 | |
| 십진수 | 십진수 | 십진수 | |
| 날짜 및 시간 | 날짜와 시간 | 날짜와 시간 | |
| 가이드(guid) | 고유 식별자 | 가이드 | |
| 문자열 | 메모 | 문자열 | |
| 돈 | 돈 | 돈 | |
| 옵션 | 선택 목록 | OptionSetValue | |
| 조회 | 조회 | EntityReference | ufx-logicalname |
| 가방 | 해당 없음(N/A) | 개체 | ufx-idufx-logicalname |
| 목록 | 해당 없음(N/A) | 엔터티 컬렉션 | |
| 해당 없음(N/A) | 해당 없음(N/A) | 별칭 값 | ufx-aliasentityufx-aliasattribute |
UFX 쿼리 지시문
UFX 지시문은 FetchXML 쿼리의 XML 요소 및 모음 속성에서 사용할 수 있습니다.
UFX 가방 지침
| 특성 | 가치 | 설명 |
|---|---|---|
ufx:if |
XPath (엑스패스) | XPath 식을 테스트하고 테스트에서 true가 반환되는 경우에만 속성을 처리합니다 |
ufx:source |
fetch |
인라인 <fetch> XML 요소를 실행하고 결과를 속성에 할당합니다 |
ufx:select |
XPath (엑스패스) | XPath 표현식을 실행하고 결과를 속성에 할당합니다 XML 형식의 또는 선택적 자식 bag 을 listbag 쿼리할 때 XPath 표현식의 결과를 변환하기 위해 지정할 수 있습니다 |
UFX FetchXML 지시문
| 요소 | 특성 | 가치 | 설명 |
|---|---|---|---|
| 모든 요소 | ufx:if |
XPath (엑스패스) | XPath 표현식을 테스트하고 테스트가 성공한 경우에만 XML 요소를 내보냅니다 |
ufx:apply |
select |
XPath (엑스패스) | XPath 표현식에서 반환된 노드 집합을 반복하고 각 노드에 대해 한 번씩 자식 XML 요소를 출력합니다 |
ufx:value |
select |
XPath (엑스패스) | XPath 표현식을 실행하고 결과를 현재 XML 요소에 출력합니다. |
ufx:value |
attribute |
특성 이름 | XPath 표현식 결과를 현재 XML 요소의 지정된 속성 이름에 지정합니다 |
UFX XPath 함수
UFX는 XPath에서 기본적으로 사용할 수 있는 기능 외에도 많은 새로운 기능을 추가합니다.
날짜/시간()
- datetime(): 현재 시간을 UTC로 반환합니다.
목록()
- list(bag | list, ... [bag | list]): 여러 또는
baglist값을 입력으로 받아 단일 값으로 평면화합니다.list
lookup-to-list()
- lookup-to-list(조회, ... [lookup]): 여러
lookup값을 취하고, 각 값을 및bag메타데이터가ufx-id설정된 aufx-logicalname로 변환하고, 이를 단일 값으로 평면화합니다list
option-to-list()
- option-to-list(옵션, ... [option]): 여러
option값을 취하고, 각 값을 단일bag속성을 가진 aoption로 변환하고, 이를 단일 값으로 평면화합니다list
순서()
- order(list, string, bool): 각 bag의 속성별로 목록을 정렬합니다. 속성은 인수 2에 지정되고 내림차순은 인수 3에 지정됩니다.
- order(list, list): 인수 2에서 목록으로 지정된 여러 정렬 순서로 목록을 정렬합니다. 두 번째 목록의 각
bag항목에는 andnamedescending속성이 있을 수 있습니다
IIF(영문)
- iif(any, any, any): 인수 1이 true이면 인수 2를 반환하고, 그렇지 않으면 인수 3을 반환합니다.
UFX XPath 변수
| 이름 | 설명 |
|---|---|
| $input | 입력 값이 있는 UFX 쿼리에 사용할 수 있는 A bag |
| $null | null 상수입니다. 속성을 선택하면 $null 백에서 속성이 제거됩니다 |
| $current | UFX 쿼리가 처리 중인 현재 가방에 대한 참조 |