다음을 통해 공유


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

이 문서는 유니버설 리소스 예약에서 리소스 일치를 이해하고 사용자 지정하는 데 사용할 수 있는 도우미입니다.

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

팁 (조언)

엔터티를 테이블이라고도 합니다.

새 테이블 및 관계 만들기

Language 테이블에 대한 새 스키마를 만들고 ResourceRequirement 테이블을 새 Language 테이블과의 관련된 관계로 업데이트합니다.

새 게시자 만들기

  1. Power Platform 환경 설정 앱으로 이동합니다. 사용자 지정> 퍼블리셔를 선택하고 새 퍼블리셔를 만듭니다. 게시자 만들기에서 자세히 알아보세요.

  2. 다음 정보를 입력합니다.

    분야 가치
    표시 이름 언어
    이름 언어
    프리픽스 언어
  3. 저장을 선택합니다.

새 솔루션 만들기

  1. 사용자 지정>솔루션을 선택하고 새 솔루션을 만듭니다. 솔루션 만들기에 대해 자세히 알아보세요.

  2. 다음 정보를 입력합니다.

    분야 가치
    표시 이름 언어
    이름 언어
    게시자 언어
    버전 1.0.0.0
  3. 선택하고생성합니다.

언어 테이블 만들기

  1. 언어 솔루션을 열고 >테이블>(고급 속성)을 선택합니다. 새 테이블 만들기에 대해 자세히 알아봅니다.

  2. 다음 정보를 입력합니다.

    분야 가치
    표시 이름 언어
    복수 이름 언어들

    고급 옵션의 스키마 이름이 자동으로 입력됩니다. | lang_Language. lang_ 접두사는 읽기 전용입니다.

  3. 저장을 선택합니다.

리소스 테이블에서 언어 테이블로 다대다 관계를 만들기

  1. 언어 테이블을 열고 새로 만들기>관계>다 대 다를 선택합니다. 다대다 테이블 관계 만들기에 대해 자세히 알아봅니다.
  2. 관련 다수 테이블의 경우 예약 가능한 리소스를 선택합니다.
  3. 완료를 선택합니다.
  4. 언어 테이블을 닫습니다.

기존 요구 사항 테이블에서 언어 테이블로의 관계 만들기

  1. 언어 솔루션을 열고 기존테이블>리소스 요구 사항> 선택합니다.

  2. 필수 구성 요소 누락 대화 상자가 표시되면 아니요를 선택하고 필수 구성 요소를 포함하지 않습니다.

  3. 추가를 선택합니다.

  4. 리소스 요구 사항 테이블에서 새 열을 만듭니다.

  5. 다음 정보를 입력합니다.

    분야 가치
    표시 이름 기본 언어
    데이터 형식 Lookup
    관련 테이블 언어
  6. 저장을 선택합니다.

  7. 리소스 요구 사항 테이블에서 새 열을 만듭니다.

  8. 다음 정보를 입력합니다.

    분야 가치
    표시 이름 보조 언어
    데이터 형식 Lookup
    관련 테이블 언어
  9. 저장을 선택합니다.

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

  1. 리소스 요구 사항 테이블에서 양식을 선택합니다.
  2. 종료 양식>정보 추가 및 추가를 선택합니다. 필수 구성 요소 누락 대화 상자가 나타나면 아니요를 선택하고 필수 구성 요소를 포함하지 않습니다.
  3. 정보 양식을 열고 사용자가 요구 사항을 만들 때 이 정보를 입력할 수 있도록 양식에 기본 언어와 보조 언어의 두 가지 새 특성을 추가합니다.
  4. 저장 및 게시를 선택합니다.

리소스 및 요구 사항에 언어 데이터 추가

언어 테이블에 새 레코드를 추가합니다. 그런 다음 리소스 레코드를 열고 탐색 모음에서 언어 관계로 이동하여 리소스 레코드를 새 언어 레코드에 연결할 수 있습니다. 요구 사항 레코드의 경우 요구 사항 양식에 새 기본 언어 및 보조 언어 필드를 입력할 수 있습니다.

일정 보드 사용자 지정

새 언어 제약 조건으로 일정 보드에서 리소스를 필터링하려면 리소스 검색 쿼리 및 필터 레이아웃 구성 레코드를 업데이트합니다.

비고

이러한 일정 보드 사용자 지정은 모든 탭에 균일하게 적용되며 탭당 개별적으로 설정할 수 없습니다. 이 사용자 지정은 일정 도우미 필터 레이아웃, "일정 도우미 리소스 검색 쿼리, 일정 도우미 리소스 셀 템플릿일정 도우미 검색 제약 조건 쿼리에 적용됩니다.

필터 레이아웃 구성

다음 단계에서는 XML 구문 강조 표시를 지원하는 텍스트 편집기를 사용하여 변경한 다음 변경 내용을 유니버설 리소스 예약 편집기에 다시 붙여넣습니다.

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

비고

필터 패널에서 유니버설 리소스 일정 예약과 함께 제공되는 모든 기본 필터를 제거하고 언어를 사용 가능한 유일한 필터로 추가합니다.

<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. 리소스 예약 앱으로 이동하여 일정 보드를 선택합니다.
  2. 기호를 + 선택하여 새 보드를 만듭니다.
  3. 새 보드 언어의 이름을 지정하십시오.
  4. 대화 상자 아래쪽에서 추가를 선택합니다. 새 보드가 만들어집니다.

일정 보드 필터 레이아웃 구성

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

  1. 일정 보드의 오른쪽 위와 스케줄러 설정에서 줄임표(...)를 선택합니다.
  2. 창 아래쪽에서 모든 보드 설정을 선택합니다. 그런 다음 기타를 선택합니다.
  3. 필터 레이아웃 필드를 찾고 연필 아이콘을 선택하여 편집기를 엽니다.
  4. 이름 필드에 "언어 필터 레이아웃"을 입력하고 필터 레이아웃 코드를 추가하고 새로 저장을 선택합니다.
  5. 저장을 선택합니다. 이 일정 보드를 레코드에 연결하는 새 구성 레코드가 만들어집니다.
  6. 필터를 선택합니다. 필터 패널이 새 레이아웃과 함께 나타납니다. 언어 필터만 사용할 수 있습니다. 리소스 검색 쿼리를 업데이트할 때까지 필터링이 작동하지 않습니다.

리소스 검색 쿼리 업데이트

다음 단계에서는 XML 구문 강조 표시를 지원하는 텍스트 편집기를 사용하여 변경한 다음 변경 내용을 유니버설 리소스 예약 편집기에 다시 붙여넣습니다.

리소스 검색 쿼리 구성은 리소스 일치 API에서 사용하는 UFX(유니버설 FetchXML) 쿼리 입니다. 필터 패널에 입력된 값을 입력으로 사용하고 올바른 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) . Filter 패널에서 선택한 언어 레코드와 연결된 리소스만 반환하도록 FetchXML link-entity 요소를 선택했습니다. link-entity 섹션에 설명된 대로 여러 조인을 사용하여 일치하는 언어 및 기본 또는 보조 언어별 순서를 표시합니다.

다음은 각각 element 에 대한 설명입니다 attribute.

이름 설명
link-entity 리소스와 언어 엔터티 사이의 다대다 관계에 조인을 만듭니다.
ufx:if 이 속성의 XPath 표현식이 값을 반환하는 경우에만 이 FetchXML 요소(link-entity)를 내보냅니다
attribute 일치하는 기본 또는 보조 언어를 반환합니다.
filtercondition 다대다 관계 레코드를 지정된 언어 ID와 일치하는 레코드로만 필터링합니다
ufx:valueselect XPath 표현식의 결과를 속성으로 출력합니다.select
ufx:applyselect XPath 표현식에서 반환된 각 결과에 대한 하위 FetchXML 요소를 속성 select에서 내보내기.
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 FetchXML 쿼리에서 반환된 각 Resource에 새 속성을 만듭니다. lang_order
ufx:select 이 특성 lang_order 에서 XPath 표현식의 결과를 속성에 할당합니다. lang_primary 쿼리의 앞부분에서 검색된 and lang_secondary 속성은 XPath iif 함수와 함께 사용되어 리소스 일치 순서를 결정합니다.

결과 순서 지정

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

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

elementattribute에 대한 설명:

이름 설명
Resources Resources 속성을 재할당합니다.
ufx:select 이 특성 Resources 에서 XPath 표현식의 결과를 속성에 할당합니다. XPath order 함수는 Resources 속성에 따라 lang_order 목록을 순서대로 정렬하는 데 사용됩니다.

비고

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. 저장을 선택합니다. 이 일정 보드를 레코드에 연결하는 새 구성 레코드가 만들어집니다.

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

일정 도우미 사용자 지정

일정 도우미 필터 레이아웃을 사용자 지정하고 일정 도우미에서 새 언어 제약 조건을 사용하도록 제약 조건 쿼리 구성을 검색합니다.

각 보드를 개별적으로 사용자 지정할 수 있는 Schedule Board 사용자 지정과 달리 Schedule Assistant 사용자 지정은 Schedule Assistant가 사용되는 모든 보드에 영향을 줍니다. 일정 도우미 사용자 지정은 예약 가능한 유형 또는 모든 유형에 따라 달라질 수 있습니다. 이 예에서는 모든 유형에 대해 일정 도우미를 사용자 지정합니다.

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

다음 단계에서는 XML 구문 강조 표시를 지원하는 텍스트 편집기를 사용하여 변경한 다음 변경 내용을 유니버설 리소스 예약 편집기에 다시 붙여넣습니다.

Schedule Board Filter Layout과 같은 Schedule Assistant Filter Layout 구성은 Filter 패널에서 컨트롤의 레이아웃을 정의합니다. 일정 도우미는 시작 시간, 종료 시간 및 기간과 같은 일정 보드보다 더 많은 필터를 사용하므로 다른 레이아웃이 사용됩니다.

비고

이 연습에서는 일정 도우미 필터 레이아웃 구성에서 유니버설 리소스 예약에 제공된 기본 필터의 하위 집합만 다시 사용하고 언어 드롭다운을 사용 가능한 유일한 필터로 추가합니다.

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

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

<?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. 일정 도우미 필터 레이아웃 필드를 코드로 업데이트하고 새로 저장을 선택합니다. 이 일정 보드를 레코드에 연결하는 새 구성 레코드가 만들어집니다.
  8. 보드 설정 대화 상자 아래쪽에서 저장을 선택합니다.

보드가 다시 로드됩니다. 일정 도우미 검색에 요구 사항에 설정된 언어를 포함하도록 제약 조건 검색 쿼리를 변경합니다.

검색 제약 조건 쿼리 구성

다음 단계에서는 XML 구문 강조 표시를 지원하는 텍스트 편집기를 사용하여 변경한 다음 변경 내용을 유니버설 리소스 예약 편집기에 다시 붙여넣습니다.

Retrieve Constraints Query 구성은 Retrieve Requirement Constraints 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 이 특성 Languages 에서 XPath 표현식의 결과를 속성에 할당합니다. lang_primarylanguagelang_secondarylanguage 속성은 쿼리에서 이전에 검색되어 Requirement 속성에서 사용할 수 있으며, 이들은 lookup-to-list XPath 함수로 전달되어 여러 lookup 속성을 단일 list (EntityCollection) 속성으로 변환합니다.

제약 조건 쿼리 검색:

<?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>

Retrieve Constraints 쿼리 업데이트

  1. 일정 보드의 오른쪽 위와 스케줄러 설정에서 줄임표(...)를 선택합니다.
  2. 창 아래쪽에서 모든 보드 설정을 선택합니다.
  3. 일정 유형으로 스크롤하고 없음을 선택합니다.
  4. 기본값 편집을 선택합니다.
  5. 일정 도우미 검색 제약 조건 쿼리 필드를 찾아 연필 아이콘을 선택하여 편집기를 엽니다.
  6. 이름 필드에 "언어 제약 조건 쿼리"를 입력합니다.
  7. 일정 도우미 검색 제약 조건 쿼리 필드를 검색 제약 조건 쿼리 코드로 업데이트하고 새로 저장을 선택합니다.
  8. 저장을 선택합니다. 이 일정 보드를 레코드에 연결하는 새 구성 레코드가 만들어집니다.
  9. 일정 도우미 검색 리소스 쿼리 필드를 찾고 일정 보드 사용자 지정을 위해 만든 언어 리소스 쿼리를 선택합니다.
  10. 대화 상자 아래쪽에서 저장을 선택합니다.

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

리소스 셀 템플릿 구성

다음 단계에서는 HTML 구문 강조 표시를 지원하는 텍스트 편집기를 사용하여 변경한 다음 변경 내용을 유니버설 리소스 예약 편집기에 다시 붙여넣습니다.

Resource Cell Template 구성은 리소스 셀의 콘텐츠를 렌더링하는 데 사용되는 Handlebars 템플릿입니다. Retrieve Resources Query의 출력은 템플릿에서 사용할 수 있습니다.

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

{{#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>

Resource Cell 템플릿 업데이트

  1. 일정 보드의 오른쪽 위와 스케줄러 설정에서 줄임표(...)를 선택합니다.
  2. 창 아래쪽에서 모든 보드 설정을 선택합니다.
  3. 일정 유형으로 스크롤하고 없음을 선택합니다.
  4. 기본값 편집을 선택합니다.
  5. 일정 도우미 리소스 셀 서식 파일 필드를 찾고 연필 아이콘을 선택하여 편집기를 엽니다.
  6. 이름 필드에 "언어 리소스 셀 템플릿"을 입력합니다.
  7. Resource Cell 템플릿 코드를 사용하여 리소스 셀 템플릿 필드를 업데이트하고 새로 저장을 선택합니다.
  8. 저장을 선택합니다. 이 일정 보드를 레코드에 연결하는 새 구성 레코드가 만들어집니다.
  9. 일정 도우미 검색 리소스 쿼리 필드를 찾고 일정 보드 사용자 지정을 위해 만든 언어 리소스 쿼리를 선택합니다.
  10. 대화 상자 아래쪽에서 저장을 선택합니다.

보드가 업데이트된 구성으로 다시 로드됩니다. 리소스 셀은 리소스가 필터 패널의 언어 제약 조건과 일치하는 방법을 보여줍니다.

추가 리소스

유니버설 페치 XML