예: 사용자 지정 언어 제약 조건으로 Universal Resource Scheduling 확장

이 단계별 가이드는 Universal Resource Scheduling에서 리소스 일치 이해 및 사용자 정의와 동반됩니다.

이 단계별 가이드에서는 Universal Resource Scheduling 리소스를 Language 제약 조건으로 확장합니다. 조직은 자신이 말하는 언어로 리소스를 필터링하려고 한다고 가정합니다. 또한 Requirement 레코드를 작업에 필요한 언어로 캡처하려고 합니다. 이 제약 조건은 기본 제공 Territory 제약 조건과 비슷한 패턴을 따릅니다. 새 마스터 엔터티 Language는 리소스가 말할 수 있는 다양한 언어를 저장합니다. 다대다 관계 엔터티를 통해 Resource 레코드를 여러 Languages에 연결할 수 있습니다. Requirement 엔터티에서 두 개의 새 조회 특성 Primary LanguageSecondary Language를 만들어 이를 모델링할 것입니다. 요구 사항에 대해 사용 가능한 리소스를 찾을 때 Primary Language 또는 Secondary Language와 연결된 리소스만 표시됩니다.

새 엔터티 및 관계 만들기

이 섹션에서는, 마스터 Language 엔터티에 대한 새 스키마를 만들고 새 Language 엔터티와 해당 관계를 사용하여 ResourceRequirement 엔터티를 업데이트 합니다.

새 게시자 만들기

  1. Dynamics 365의 사용자 지정에서 새 게시자를 만듭니다.

  2. 아래 세부 정보를 사용하여 새 게시자 양식을 작성합니다.

    필드 Value
    표시 이름 Language
    이름 언어
    접두사 언어
  3. 저장 후 닫기를 클릭합니다.

새 솔루션 만들기

  1. Dynamics 365의 사용자 지정에서 새 솔루션을 만듭니다.

  2. 아래 세부 정보를 사용하여 새 솔루션 양식을 작성합니다.

    필드 Value
    표시 이름 Language
    이름 Language
    게시자 Language
    버전 1.0.0.0
  3. 저장을 클릭합니다.

언어 엔터티를 만듭니다.

  1. 언어 솔루션에서 새 엔터티를 만듭니다.

  2. 아래 세부 정보를 사용하여 새 엔터티 양식을 작성합니다.

    필드 Value
    표시 이름 Language
    복수 이름 언어
    이름 lang_language (접두사 lang_는 자동으로 채워지고 읽기 전용입니다.)
  3. 저장을 클릭합니다.

리소스 엔터티에서 언어 엔터티로 다대다 관계를 만듭니다.

  1. 언어 엔터티에서 다대다 관계를 새로 만듭니다.

  2. 아래 세부 정보를 사용하여 새 관계 양식을 작성합니다.

    필드 Value
    현재 엔터티
    표시 옵션 복수 이름
    기타 엔터티
    엔터티 이름 예약 가능한 리소스
  3. 저장 후 닫기를 클릭합니다.

  4. 언어 엔터티 양식을 닫습니다.

요구 사항 엔터티에서 언어 엔터티로 관계를 만듭니다.

  1. 언어 솔루션에서 기존 리소스 요구 사항 엔터티를 솔루션에 추가합니다(필수 구성 요소 누락 대화 상자가 표시되는 경우 아니요, 필수 구성 요소를 포함하지 않습니다.를 선택).

  2. 리소스 요구 사항 엔터티에서 새 필드를 만듭니다.

  3. 아래 세부 정보를 사용하여 새 필드 양식을 작성합니다.

    필드 Value
    표시 이름 기본 언어
    데이터 형식 조회
    대상 레코드 종류 Language
  4. 저장 후 닫기를 클릭합니다.

  5. 리소스 요구 사항 엔터티에서 새 필드를 만듭니다.

  6. 아래 세부 정보를 사용하여 새 필드 양식을 작성합니다.

    필드 Value
    표시 이름 보조 언어
    데이터 형식 조회
    대상 레코드 종류 Language
  7. 저장 후 닫기를 클릭합니다.

요구 사항 기본 양식 업데이트

  1. 리소스 요구 사항 엔터티에서 기존 정보 양식을 엔터티 하위 구성 요소에 추가합니다(필수 구성 요소 누락 대화 상자가 표시되는 경우 아니요, 필수 구성 요소를 포함하지 않습니다.를 선택).
  2. 정보 양식에서 필드 탐색기를 사용하여 두 개의 새 특성, 기본 언어 및 보조 언어를 양식에 추가하여 사용자가 요구 사항을 만들 때 이 정보를 입력할 수 있도록 합니다.
  3. 저장을 클릭합니다.
  4. 게시를 클릭합니다.
  5. 양식 편집기를 닫을 수 있습니다.

요약

위의 단계에서 새 언어 엔터티를 만들었습니다. 그런 다음 리소스 및 요구 사항 엔터티를 사용하여 새 관계를 추가했습니다. 언어와 리소스 간에 다대다 관계를 추가했으므로 리소스는 여러 언어와 관련될 수 있습니다. 요구 사항 엔터티에 새 언어 엔터티를 가리키는 두 개의 조회 특성을 추가했으므로 요구 사항은 두 언어와 관련될 수 있습니다.

데이터 추가

상세하게 찾기를 사용하여 새 레코드를 언어 엔터티에 추가합니다. 그런 다음 리소스 레코드를 열고 탐색 모음에서 언어 관계를 탐색하여 리소스 레코드를 새 언어 레코드에 연결할 수 있습니다. 요구 사항 레코드의 경우 요구 사항 양식에 새 기본 언어 및 보조 언어 필드를 채울 수 있습니다.

일정 게시판 사용자 지정

새 언어 제약 조건을 사용하여 일정 게시판의 리소스를 필터링하려면 리소스 검색 쿼리와 필터 레이아웃 구성 레코드를 업데이트합니다.

필터 레이아웃 구성

아래 단계에서는 XML 구문 강조 표시를 지원하는 텍스트 편집기를 사용하여 변경한 다음 변경 내용을 다시 Universal Resource Scheduling 편집기에 붙여 넣는 것이 좋습니다.

필터 레이아웃 구성은 필터 패널의 레이아웃을 사용자 지정하기 위한 XML 레이아웃 정의입니다.

노트

이 연습에서는 필터 패널에서 Universal Resource Scheduling과 함께 제공된 모든 기본 필터를 제거하고 언어를 사용 가능한 유일한 필터로 추가합니다.

<control type="combo" source="entity" key="Languages" inactive-state="1" label-id="Languages" entity="lang_language" multi="true" />

control 요소는 필터 패널에 새 컨트롤을 추가합니다. 각 특성에 대한 설명은 다음과 같습니다.

이름 설명
type 필터 컨트롤의 유형입니다. combo 컨트롤은 선택할 값이 있는 드롭다운을 렌더링합니다.
source 드롭다운 컨트롤에 대한 값의 소스입니다. entity 소스는 드롭다운에서 엔터티 레코드를 표시합니다.
key 제약 조건 속성 모음에서 선택한 값을 저장하는 데 사용할 키입니다.
inactive-state 이 엔터티에 대한 비활성 statecode입니다. 드롭다운에서 비활성 레코드를 제외하는 데 사용됩니다.
label-id 이 컨트롤에 사용할 지역화된 레이블입니다.
entity 이 엔터티의 레코드는 드롭다운에 표시됩니다.
multi 단일 레코드 또는 여러 레코드를 선택할 수 있도록 드롭다운을 구성합니다.

필터 레이아웃:

<?xml version="1.0" encoding="utf-8" ?>
<filter>
  <controls>
    <control type="combo" source="entity" key="Languages" inactive-state="1" label-id="Languages" entity="lang_language" multi="true" />
  </controls>
</filter>

새 언어 보드 만들기

이러한 변경 사항을 격리된 상태로 유지하기 위해 새로운 별도의 일정 게시판을 만들고 변경 내용을 구현하지만, 다른 일정 게시판에서 이러한 변경 내용을 자동으로 상속할 수 있도록 항상 기본 일정 게시판에서 이러한 변경 작업을 수행할 수 있습니다.

  1. Dynamics 365에서 위쪽 탐색 모음에서 리소스 예약 > 일정 게시판으로 이동합니다.
  2. 오른쪽 상단에서 + 기호를 클릭하여 새 보드를 만듭니다.
  3. 새 보드 언어 이름을 지정합니다.
  4. 대화 상자 아래에서 추가를 클릭합니다. 새 보드가 만들어집니다.

일정 게시판 필터 레이아웃 업데이트

그런 다음 일정 게시판에서 사용하는 필터 레이아웃과 쿼리를 저장하는 새 구성 레코드를 만든 다음, 새로 만든 일정 게시판을 새 구성 레코드에 연결합니다. 이 작업을 수행하는 방법에는 여러 가지가 있지만 가장 빠른 방법은 다음과 같습니다.

  1. 오른쪽 상단에서 언어 탭을 두 번 클릭합니다.
  2. 일반 설정 > 기타 설정으로 스크롤합니다.
  3. 필터 레이아웃 필드를 찾고 오른쪽 단추를 클릭하여 편집기를 엽니다.
  4. 위의 필터 레이아웃 코드를 사용하여 값 필드를 업데이트하고 다른 이름으로 저장을 클릭합니다.
  5. 이름 필드에 "언어 필터 레이아웃"을 입력하고 저장을 클릭합니다. 이렇게 하면 새 구성 레코드가 만들어지고 이 일정 게시판이 레코드에 연결됩니다.
  6. 대화 상자 아래에서 적용을 클릭합니다.

보드가 다시 로드되고 왼쪽에 새 레이아웃이 있는 필터 패널이 표시됩니다. 언어 필터만 사용할 수 있습니다. 새 필터를 활용하기 위해 리소스 검색 쿼리를 업데이트해야 하므로 필터링이 아직 작동하지 않습니다.

리소스 쿼리 검색 구성

아래 단계에서는 XML 구문 강조 표시를 지원하는 텍스트 편집기를 사용하여 변경한 다음 변경 내용을 다시 Universal Resource Scheduling 편집기에 붙여 넣는 것이 좋습니다.

리소스 검색 쿼리 구성은 리소스 일치 API에서 사용하는 UFX 쿼리입니다. 필터 패널에 입력된 값을 입력으로 사용하고 일치하는 리소스를 찾기 위해 올바른 FetchXML을 동적으로 생성합니다.

다음은 리소스의 언어에 따라 일치하고 정렬하기 위해 리소스 검색 쿼리에 추가된 새 코드 조각입니다.

bookableresource에서 lang_language로 조인 추가

<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_primary" link-type="outer" ufx:if="$input/Languages/bag[1]">
  <attribute name="lang_languageid" alias="lang_primary" groupby="true" />

  <filter>
    <condition attribute="lang_languageid" operator="eq">
      <ufx:value select="$input/Languages/bag[1]/@ufx-id" attribute="value" />
    </condition>          
  </filter>
</link-entity>

<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_secondary" link-type="outer" ufx:if="$input/Languages/bag[2]">
  <attribute name="lang_languageid" alias="lang_secondary" groupby="true" />

  <filter>
    <condition attribute="lang_languageid" operator="eq">
      <ufx:value select="$input/Languages/bag[2]/@ufx-id" attribute="value" />
    </condition>          
  </filter>
</link-entity>

<link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_others" link-type="outer" ufx:if="$input/Languages/bag[position() > 2]">

  <filter>
    <condition attribute="lang_languageid" operator="in">
      <ufx:apply select="$input/Languages/bag[position() > 2]">
        <value>
          <ufx:value select="@ufx-id" />
        </value>
      </ufx:apply>
    </condition>            
  </filter>
</link-entity>        

<filter type="or">
  <condition entityname="lang_primary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[1]" />
  <condition entityname="lang_secondary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[2]" />
  <condition entityname="lang_others" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[position() > 2]" />          
</filter>

필터 패널에서 선택한 값은 쿼리에 대한 입력으로 전달되며 XPath $input 변수에서 사용할 수 있습니다.

리소스 검색 쿼리는 FetchXML을 사용하여 Resource (bookableresource) 엔터티를 쿼리합니다. FetchXML link-entity 요소를 사용하여 필터 패널에서 선택한 언어 레코드와 연결된 리소스만 반환합니다. 리소스 셀 템플릿섹션의 뒷부분에서 설명한 기본 또는 보조 언어로 일치하는 언어와 순서를 표시하는 것을 지원하기 위해 여러 link-entity 조인을 사용하고 있습니다.

elementattribute에 대한 설명은 다음과 같습니다.

이름 설명
link-entity 리소스와 언어 엔터티 사이의 다대다 관계에 조인을 만듭니다.
ufx:if 이 특성의 XPath 식이 값을 반환하는 경우에만 FetchXML 요소(link-entity)를 내보냅니다.
attribute 일치하는 기본 또는 보조 언어를 반환합니다.
filtercondition 다대다 관계 레코드를 지정된 언어 ID와 일치하는 레코드만으로 필터링합니다.
ufx:valueselect XPath 표현식의 결과를 select 특성에 출력합니다.
ufx:applyselect select 특성의 XPath 표현식에서 반환된 각 결과에 대해 하위 FetchXML 요소를 내보냅니다.
value 언어 레코드의 ID를 포함합니다.

리소스 정렬 순서 결정

각 리소스의 할당된 언어에 따라 일치하는 리소스를 검색한 후 정렬 순서를 결정하는 새 lang_order 속성을 할당합니다.

<bag>
  <lang_order ufx:select="iif(lang_primary and lang_secondary, 1, iif(lang_primary, 2, iif(lang_secondary, 3, 4)))" />
</bag>

elementattribute에 대한 설명은 다음과 같습니다.

이름 설명
lang_order lang_order라는 FetchXML 쿼리에서 반환된 각 리소스에 새 속성을 만듭니다.
ufx:select 이 특성에서 XPath 표현식의 결과를 lang_order 속성에 할당합니다. 쿼리의 앞부분에서 검색된 lang_primarylang_secondary 속성은 XPath iif 함수와 함께 리소스 일치 순서를 결정하는 데 사용됩니다.

결과 순서 지정

<Resources ufx:select="order(Resources, 'lang_order')" />

UFX 쿼리는 순차적으로 처리됩니다. FetchXML을 통해 리소스를 검색한 후에는 결과가 Resources 속성에 할당됩니다. 앞에서 추가한 lang_order 속성에 따라 결과를 정렬하고 정렬된 결과를 Resources 속성에 재할당합니다.

elementattribute에 대한 설명은 다음과 같습니다.

이름 설명
Resources Resources 속성을 재할당합니다.
ufx:select 이 특성의 XPath 식 결과를 Resources 속성에 할당하십시오. XPath order 함수는 해당 lang_order 속성에 대한 Resources 목록을 정렬하는 데 사용됩니다.

노트

Universal Resource Scheduling과 함께 제공되는 기본 리소스 검색 쿼리는 Universal Resource Scheduling에 포함된 모든 리소스 제약 조건을 지원하는 대규모 쿼리입니다. 이 연습에서는 기본 쿼리의 하위 집합만 사용하고 언어를 유일한 필터로 추가합니다.

<?xml version="1.0" encoding="utf-8" ?>
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
  <Resources ufx:source="fetch">
    <fetch mapping="logical" aggregate="true">
      <entity name="bookableresource">
        <attribute name="bookableresourceid" alias="bookableresourceid" groupby="true"/>
        <attribute name="name" alias="name" groupby="true"/>
        <attribute name="calendarid" alias="calendarid" groupby="true"/>
        <attribute name="resourcetype" alias="resourcetype" groupby="true"/>
        <attribute name="msdyn_startlocation" alias="startlocation" groupby="true"/>

        <!-- Language join -->
        <link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_primary" link-type="outer" ufx:if="$input/Languages/bag[1]">
          <attribute name="lang_languageid" alias="lang_primary" groupby="true" />
          
          <filter>
            <condition attribute="lang_languageid" operator="eq">
              <ufx:value select="$input/Languages/bag[1]/@ufx-id" attribute="value" />
            </condition>          
          </filter>
        </link-entity>

        <link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_secondary" link-type="outer" ufx:if="$input/Languages/bag[2]">
          <attribute name="lang_languageid" alias="lang_secondary" groupby="true" />
          
          <filter>
            <condition attribute="lang_languageid" operator="eq">
              <ufx:value select="$input/Languages/bag[2]/@ufx-id" attribute="value" />
            </condition>          
          </filter>
        </link-entity>
        
        <link-entity name="lang_lang_language_bookableresource" from="bookableresourceid" to="bookableresourceid" alias="lang_others" link-type="outer" ufx:if="$input/Languages/bag[position() > 2]">
          
          <filter>
            <condition attribute="lang_languageid" operator="in">
              <ufx:apply select="$input/Languages/bag[position() > 2]">
                <value>
                  <ufx:value select="@ufx-id" />
                </value>
              </ufx:apply>
            </condition>            
          </filter>
        </link-entity>        
        
        <filter type="or">
          <condition entityname="lang_primary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[1]" />
          <condition entityname="lang_secondary" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[2]" />
          <condition entityname="lang_others" attribute="lang_languageid" operator="not-null" ufx:if="$input/Languages/bag[position() > 2]" />          
        </filter>
        
        <link-entity name="systemuser" from="systemuserid" to="userid" link-type="outer">
          <attribute name="systemuserid" alias="systemuserid" groupby="true" />
          <attribute name="entityimage_url" alias="userimagepath" groupby="true"/>
        </link-entity>

        <link-entity name="contact" from="contactid" to="contactid" link-type="outer">
          <attribute name="contactid" alias="contactid" groupby="true"/>
          <attribute name="entityimage_url" alias="contactimagepath" groupby="true"/>
        </link-entity>
        
        <link-entity name="account" from="accountid" to="accountid" link-type="outer">
          <attribute name="accountid" alias="accountid" groupby="true"/>
          <attribute name="entityimage_url" alias="accountimagepath" groupby="true"/>
        </link-entity>
      </entity>
    </fetch>

    <bag>
      <imagepath ufx:select="accountimagepath | contactimagepath | userimagepath" />

      <accountimagepath ufx:select="$null" />
      <contactimagepath ufx:select="$null" />
      <userimagepath ufx:select="$null" />
      
      <lang_order ufx:select="iif(lang_primary and lang_secondary, 1, iif(lang_primary, 2, iif(lang_secondary, 3, 4)))" />
    </bag>
  </Resources>

  <Resources ufx:select="order(Resources, 'lang_order')" />
</bag>

일정 게시판 리소스 쿼리 검색 업데이트

  1. 오른쪽 상단에서 언어 탭을 두 번 클릭합니다.
  2. 일반 설정 > 기타 설정으로 스크롤합니다.
  3. 리소스 쿼리 검색 필드를 찾고 오른쪽 단추를 클릭하여 편집기를 엽니다.
  4. 위의 리소스 쿼리 검색 코드를 사용하여 값 필드를 업데이트하고 다른 이름으로 저장을 클릭합니다.
  5. 이름 필드에 "언어 리소스 쿼리"를 입력하고 저장을 클릭합니다. 이렇게 하면 새 구성 레코드가 만들어지고 이 일정 게시판이 레코드에 연결됩니다.
  6. 대화 상자 아래에서 적용을 클릭합니다.

보드가 업데이트된 구성으로 다시 로드됩니다. 이제 필터링이 작동합니다. 언어 레코드를 생성하고 이를 리소스 레코드와 연결했다면 이제 관련 언어로 리소스를 필터링할 수 있습니다.

요약

위의 단계에서, 언어 엔터티에 대한 필터 컨트롤을 표시하도록 필터 패널을 수정했습니다. 또한 선택한 언어 레코드와 연결된 리소스와 일치하도록 리소스 검색 쿼리를 수정했습니다. 사용자가 필터 컨트롤에서 값을 선택하고 검색을 클릭하면 값이 쿼리로 전달되고 FetchXML 쿼리는 일치하는 리소스만 반환합니다.

일정 도우미 사용자 지정

일정 도우미 필터 레이아웃 및 제약 조건 쿼리 구성을 사용자 지정 하려면 일정 도우미에서 새 언어 제약 조건을 사용해야 합니다.

각 보드를 개별적으로 사용자 지정할 수 있는 일정 게시판 사용자 지정과 달리 일정 도우미 사용자 지정은 일정 도우미가 사용되는 모든 보드에 영향을 줍니다. 일정 도우미 사용자 지정은 예약 가능한 형식 또는 모든 형식에 대해 특정될 수 있습니다. 이 예제에서는, 모든 형식에 대한 일정 도우미를 사용자 지정합니다.

일정 도우미 필터 레이아웃 구성

아래 단계에서는 XML 구문 강조 표시를 지원하는 텍스트 편집기를 사용하여 변경한 다음 변경 내용을 다시 Universal Resource Scheduling 편집기에 붙여 넣는 것이 좋습니다.

일정 도우미 필터 레이아웃 구성은 일정 게시판 필터 레이아웃과 마찬가지로 필터 패널에서 컨트롤의 레이아웃을 정의합니다. 일정 도우미는 시작 시간, 종료 시간, 기간 등과 같은 일정 게시판보다 많은 필터를 사용하므로 레이아웃이 다르게 사용됩니다.

노트

이 연습에서는 일정 도우미 필터 레이아웃 구성에서 Universal Resource Scheduling에 제공된 기본 필터 중 일부만 재사용하고 언어 드롭다운을 사용 가능한 유일한 필터로 추가합니다.

레이아웃에 추가하는 필터는 필터 레이아웃 구성에서 위와 동일합니다. 다른 컨트롤은 일정 도우미 검색 매개 변수를 수정하는 데 필요합니다.

전체 일정 도우미 필터 레이아웃

<?xml version="1.0" encoding="utf-8" ?>
<filter>
  <controls>
    <control type="twocolumn">
      <control type="combo" source="optionset" key="Requirement/msdyn_worklocation" label-id="ScheduleAssistant.West.settingsform.WorkLocation" entity="msdyn_resourcerequirement" attribute="msdyn_worklocation">
        <bind property="disabled" to="Requirement/InitialWorkLocation" operator="eq" value="690970002" />
        <data>
          <value id="690970000" />
          <value id="690970001" />
          <value id="690970002" />
        </data>
      </control>
      <control type="duration" key="Requirement/msdyn_remainingduration" label-id="ScheduleAssistant.West.settingsform.AvailableDuration" />
    </control>
    <control type="distance" key="Requirement/Radius" label-id="ScheduleAssistant.West.settingsform.Radius" min="1">
      <bind property="disabled" to="Requirement/msdyn_worklocation" operator="eq" value="690970002" />
    </control>
    <control type="datetime" key="Requirement/msdyn_fromdate" label-id="ScheduleAssistant.West.settingsform.StartDay">
      <bind property="disabled" to="Requirement/RealTimeMode" operator="eq" value="true" />
      <bind property="max" to="Requirement/msdyn_todate" operator="eq" />
    </control>
    <control type="datetime" key="Requirement/msdyn_todate" label-id="ScheduleAssistant.West.settingsform.EndDay">
      <bind property="min" to="Requirement/msdyn_fromdate" operator="eq" />
    </control>
    <control type="combo" source="entity" key="Languages" inactive-state="1" label-id="Languages" entity="lang_language" multi="true" />
  </controls>
</filter>

일정 도우미 필터 레이아웃 업데이트

  1. 오른쪽 상단에서 언어 탭을 두 번 클릭합니다.
  2. 오른쪽 상단에서 기본 설정 열기를 클릭합니다.
  3. 일정 유형 섹션으로 스크롤하고 왼쪽 목록에서 없음을 선택합니다.
  4. 일정 도우미 필터 레이아웃 필드를 찾고 오른쪽 단추를 클릭하여 편집기를 엽니다.
  5. 위의 일정 도우미 필터 레이아웃 코드를 사용하여 값 필드를 업데이트하고 다른 이름으로 저장을 클릭합니다.
  6. 이름 필드에 "언어 일정 도우미 필터 레이아웃"을 입력하고 저장을 클릭합니다. 이렇게 하면 새 구성 레코드가 만들어지고 이 일정 게시판이 레코드에 연결됩니다.
  7. 대화 상자 아래에서 적용을 클릭합니다.

보드가 다시 로드됩니다. 그런 다음 요구 사항에 설정된 언어가 일정 도우미 검색의 일부가 되도록 새 언어 제약 조건으로 일정 도우미를 사용하기 전에 검색 제약 조건 쿼리를 변경해야 합니다.

제약 조건 검색 쿼리 구성

아래 단계에서는 XML 구문 강조 표시를 지원하는 텍스트 편집기를 사용하여 변경한 다음 변경 내용을 다시 Universal Resource Scheduling 편집기에 붙여 넣는 것이 좋습니다.

제약 조건 검색 쿼리 구성은 요구 사항 제약 조건 검색 API에서 사용하는 UFX 쿼리입니다. 이는 요구 사항 레코드(UI에서 선택됨)의 ID를 입력으로 사용하고 요구 사항 레코드와 모든 하위 레코드를 반환합니다.

노트

Universal Resource Scheduling과 함께 제공되는 기본 검색 제약 조건 쿼리는 Universal Resource Scheduling에 포함된 모든 요구 사항 제약 조건을 지원하는 대규모 쿼리입니다. 이 연습에서는 기본 쿼리의 하위 집합만 사용하고 언어를 유일한 필터로 추가합니다.

<Languages ufx:select="lookup-to-list(Requirement/lang_primarylanguage, Requirement/lang_secondarylanguage)" />

UFX 쿼리는 순차적으로 처리됩니다. 제약 조건 검색 쿼리는 FetchXML을 사용하여 Requirement (msdyn_resourcerequirement) 엔터티를 쿼리하고 Requirement 속성에 결과, 요구 사항 레코드를 할당합니다. 기본 언어 및 보조 언어의 두 특성을 단일 엔터티 목록(EntityCollection)으로 결합하는 새 속성 Languages를 제약 조건 속성 모음에 추가합니다. 이는 필터 패널에서 언어 컨트롤을 레코드 목록으로 표시하기 때문에 필요합니다. 다른 방법은 두 특성에 대한 필터 패널에서 두 개의 개별 컨트롤을 만드는 것입니다.

elementattribute에 대한 설명은 다음과 같습니다.

이름 설명
Languages 결과 제약 조건 속성 모음에 Languages라는 새 속성을 만듭니다.
ufx:select 이 특성에서 XPath 표현식의 결과를 Languages 속성에 할당합니다. 쿼리에서 이전에 검색되고 Requirement 속성에서 사용할 수 있는 lang_primarylanguagelang_secondarylanguage 속성은 여러 lookup 속성을 단일 list (EntityCollection)로 변환하는 lookup-to-list XPath 함수로 전달됩니다.

제약 조건 쿼리 검색:

<?xml version="1.0" encoding="utf-8" ?>
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
  <Requirement ufx:source="fetch" ufx:select="bag[1]">
    <fetch top="1">
      <entity name="msdyn_resourcerequirement">
        <all-attributes />
        
        <filter>
          <condition attribute="statecode" operator="eq" value="0" />
          <condition attribute="msdyn_resourcerequirementid" operator="eq">
            <ufx:value select="$input/@ufx-id" attribute="value" />
          </condition>
        </filter>
      </entity>
    </fetch>

    <bag>
      <InitialWorkLocation ufx:select="msdyn_worklocation" />
    </bag>
  </Requirement>
  
  <Languages ufx:select="lookup-to-list(Requirement/lang_primarylanguage, Requirement/lang_secondarylanguage)" />
</bag>

제약 조건 쿼리 검색 업데이트

  1. 오른쪽 상단에서 언어 탭을 두 번 클릭합니다.
  2. 오른쪽 상단에서 기본 설정 열기를 클릭합니다.
  3. 일정 유형 섹션으로 스크롤하고 왼쪽 목록에서 없음을 선택합니다.
  4. 일정 도우미 제약 조건 쿼리 검색 필드를 찾고 오른쪽 단추를 클릭하여 편집기를 엽니다.
  5. 위의 리소스 쿼리 검색 코드를 사용하여 값 필드를 업데이트하고 다른 이름으로 저장을 클릭합니다.
  6. 이름 필드에 "언어 제약 조건 쿼리"를 입력하고 저장을 클릭합니다. 이렇게 하면 새 구성 레코드가 만들어지고 이 일정 게시판이 레코드에 연결됩니다.
  7. 일정 도우미 리소스 쿼리 검색 필드를 찾아 일정 게시판 사용자 지정을 위해 이전에 만든 언어 리소스 쿼리를 선택합니다.
  8. 대화 상자 아래에서 적용을 클릭합니다.

보드가 업데이트된 구성으로 다시 로드됩니다. 이제 일정 도우미 필터링이 작동합니다. 언어 레코드를 생성하고 요구 사항 레코드와 연결했다면 이제 일정 게시판 하단에 있는 요구 사항 레코드를 선택하고 가용성 찾기를 클릭 하여 일정 도우미를 시작하고 요구 사항에 저장된 언어와 일치하는 리소스만 볼 수 있습니다.

리소스 셀 템플릿 구성

아래 단계에서는 HTML 구문 강조 표시를 지원하는 텍스트 편집기를 사용하여 변경한 다음 변경 내용을 다시 Universal Resource Scheduling 편집기에 붙여 넣는 것이 좋습니다.

리소스 셀 템플릿 구성은 리소스 셀의 콘텐츠를 렌더링하는 데 사용되는 Handlebars 템플릿입니다. 리소스 검색 쿼리의 출력을 템플릿에서 사용할 수 있습니다.

리소스가 기본 및 보조 언어와 일치하는 경우 녹색 ✔✱ 표시기를 표시하고 리소스가 기본 언어와만 일치하는 경우 녹색 ✔ 표시기를 표시하며 리소스가 보조 언어와만 일치하는 경우 노란색 ✔ 표시기를 표시하도록 기본 리소스 템플릿을 수정합니다.

{{#if lang_primary}}
<span style='color:green;'>&#10004;{{#if lang_secondary}} &#10033;{{/if}}</span>
{{else if lang_secondary}}
<span style='color:#ffe700;'>&#10004;</span>
{{/if}} 

lang_primarylang_secondary 속성은 위에서 설정한 사용자 지정 리소스 쿼리 검색에서 반환됩니다. 템플릿 구문에 대한 설명서는 Handlebars 웹 사이트를 참조하십시오.

리소스 셀 템플릿:

<div class='resource-card-wrapper {{iif ResourceCellSelected "resource-cell-selected" ""}} {{iif ResourceUnavailable "resource-unavailable" ""}} {{iif IsMatchingAvailability "availability-match" ""}}'>
  {{#if imagepath}}
  <img class='resource-image' src='{{client-url}}{{imagepath}}' />
  {{else}}
  <div class='resource-image unknown-resource'></div>
  {{/if}}
  <div class='resource-info'>
    <div class='resource-name primary-text ellipsis' title='{{name}}'>{{name}}</div>
    <div class='secondary-text ellipsis'>
      {{#if (eq (is-sa-grid-view) false) }}
      <div class='booked-duration'>{{BookedDuration}}</div>
      <div class='booked-percentage'>
        {{BookedPercentage}}%
        
        {{#if lang_primary}}
        <span style='color:green;'>&#10004;{{#if lang_secondary}} &#10033;{{/if}}</span>
        {{else if lang_secondary}}
        <span style='color:#ffe700;'>&#10004;</span>
        {{/if}}            
      </div>
      {{/if}}
    </div>
    {{#if (eq (is-sa-grid-view) false) }}
    <div class='matching-indicator'></div>
    {{/if}}
  </div>
  {{#if (eq (is-sa-grid-view) false) }}
  {{> resource-map-pin-template this }}
  {{/if}}
</div>

리소스 셀 템플릿 업데이트

  1. 오른쪽 상단에서 언어 탭을 두 번 클릭합니다.
  2. 오른쪽 상단에서 기본 설정 열기를 클릭합니다.
  3. 일정 유형 섹션으로 스크롤하고 왼쪽 목록에서 없음을 선택합니다.
  4. 일정 도우미 리소스 셀 템플릿 필드를 찾고 오른쪽 단추를 클릭하여 편집기를 엽니다.
  5. 위의 리소스 셀 템플릿 코드를 사용하여 값 필드를 업데이트하고 다른 이름으로 저장을 클릭합니다.
  6. 이름 필드에 "언어 리소스 셀 템플릿"을 입력하고 저장을 클릭합니다. 이렇게 하면 새 구성 레코드가 만들어지고 이 일정 게시판이 레코드에 연결됩니다.
  7. 대화 상자 아래에서 적용을 클릭합니다.

보드가 업데이트된 구성으로 다시 로드됩니다. 이제 리소스 셀이 필터 패널에서 리소스가 언어 제약 조건과 일치하는 방식을 나타냅니다.

요약

위의 단계에서, 언어 엔터티에 대한 필터 컨트롤을 표시하도록 일정 도우미의 필터 패널을 수정했습니다. 또한 요구 사항 엔터티와 관련된 새 언어 특성을 쿼리하기 위해 제약 조건 검색 쿼리를 수정하고 목록으로 구현했습니다. 사용자가 요구 사항 레코드에 대한 가용성을 찾기 위해 선택하면 필터 패널에 캡처된 언어 제약 조건이 표시됩니다. 필터 패널의 값은 리소스 검색 쿼리로 전달되고 FetchXML 쿼리는 일치하는 리소스만 반환합니다.

참조

범용 Fetch XML

Universal Resource Scheduling 확장성 릴리스 노트