Поделиться через


Пример: расширение Universal Resource Scheduling с настраиваемым ограничением по языку

Это пошаговое руководство дополняет раздел Общие сведения и настройка сопоставления ресурсов в Universal Resource Scheduling

В этом пошаговом руководстве мы расширим ресурсы Universal Resource Scheduling с ограничением Language. Рассмотрим организацию, которой требуется фильтровать ресурсы по языкам, на которых они говорят. Также они хотят фиксировать в записи Requirement язык, необходимый для задания. Это ограничение следует такой же схеме, что и встроенное ограничение Territory. Новая главная сущность Language будет хранить разные языки, на которых ресурс может говорить. Запись Resource можно затем связать с несколькими языками Languages с помощью сущности отношения "многие-ко-многим". В сущности Requirement мы смоделируем это, создав два новых атрибута подстановки: Primary Language и Secondary Language. При поиске доступных ресурсов для требования будут отображаться только ресурсы, связанные с Primary Language или Secondary Language.

Создание новых сущностей и отношений

В этом разделе мы создадим новую схему для главной сущности Language и обновим сущности Resource и Requirement с соответствующими отношениями к новой сущности Language.

Создание нового издателя

  1. В Dynamics 365 в разделе "Настройки" создайте нового издателя

  2. Заполните форму нового издателя приведенными внизу сведениями:

    Поле Value
    Отображаемое имя Language
    Имя язык
    Префикс lang
  3. Нажмите кнопку "Сохранить и закрыть".

Создание нового решения

  1. В Dynamics 365 в разделе "Настройки" создайте новое решение

  2. Заполните форму нового решения приведенными внизу сведениями:

    Поле Value
    Отображаемое имя Language
    Имя Language
    Издатель Language
    Версия 1.0.0.0
  3. Нажмите кнопку Сохранить.

Создание сущности языка

  1. В решении Language создайте новую сущность

  2. Заполните форму новой сущности приведенными ниже сведениями:

    Поле Value
    Отображаемое имя Language
    Множественное число Языки
    Полное имя lang_language (Префикс lang_ заполняется автоматически и доступен только для чтения)
  3. Нажмите кнопку Сохранить.

Создание отношения "многие ко многим" из сущности ресурса с сущностью языка

  1. В сущности языка создайте новое отношение "многие ко многим"

  2. Заполните форму нового отношения приведенными ниже сведениями:

    Поле Value
    Текущий объект
    Параметры отображения Использовать имя во множественном числе
    Другой объект
    Имя объекта Резервируемый ресурс
  3. Нажмите кнопку "Сохранить и закрыть".

  4. Закройте форму сущности языка

Создание отношений из сущности требования с сущностью языка

  1. В решении Language добавьте существующую сущность требования ресурсов в решение (если откроется диалоговое окно "Отсутствуют необходимые компоненты", выберите "Нет, не включать необходимые компоненты.")

  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.

Конфигурация запроса извлечения ресурсов представляет собой запрос UFX, используемый API-интерфейсом сопоставления ресурсов. В качестве входных данных он принимает значения, введенные на панели фильтров, и динамически формирует правильный запрос на языке 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). Мы используем элемент link-entity языка FetchXML только для возвращения ресурсов, связанных с записями языка, выбранными на панели фильтров. Для поддержки отображения соответствующих языков и упорядочивания по основному или дополнительному языку, описанным далее в разделе Шаблон ячейки ресурса, мы используем несколько соединений link-entity.

Вот описание каждого element и attribute:

Имя Описание
link-entity Создание соединения с отношением "многие ко многим" между сущностями ресурса и языка
ufx:if Вызвать этот элемент языка FetchXML (link-entity) только в случае, если выражение XPath в этом атрибуте возвращает значение
attribute Возвращает основной или дополнительный соответствующий язык
filter и condition. Фильтрация записей отношения "многие-ко-многим" для отбора только тех, которые соответствуют указанным идентификаторам языка
ufx:value и select. Вывод результата выражения XPath в атрибуте select
ufx:apply и select. Выдача дочерних элементов языка FetchXML для каждого результата, возвращенного выражением XPath в атрибуте select
value Содержит идентификатор записи языка

Определение порядка сортировки ресурса

После извлечения соответствующих ресурсов на основе языка, назначенного каждому ресурсу, мы назначаем новое свойство lang_order, чтобы определить его порядок сортировки.

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

Вот описание каждого element и attribute:

Имя Описание
lang_order Создание нового свойства в каждом возвращенном ресурсе из запроса языка FetchXML с именем lang_order
ufx:select Назначение результата выражения XPath в этом атрибуте свойству lang_order. Свойства lang_primary и lang_secondary, извлеченные ранее в запросе, используются совместно с функцией XPath iif, чтобы определить порядок сопоставления ресурсов.

Задание порядка результатов

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

Запросы UFX обрабатываются в последовательном порядке. После извлечения ресурсов с помощью языка FetchXML результаты назначаются свойству Resources. Мы сортируем результаты на основе свойства lang_order, добавленного ранее и заново назначаем сортированные результаты свойству Resources.

Вот описание каждого element и attribute:

Полное имя Описание
Resources Переназначение свойства Resources
ufx:select Назначение результата выражения XPath в этом атрибуте свойству Resources. Функция 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. Введите "Запрос ресурсов языка" в поле "Имя" и нажмите кнопку "Сохранить". При этом создается новая запись конфигурации и связывается эта доска расписания с записью.
  6. Внизу этого диалогового окна нажмите "Применить"

Доска заново загрузится с обновленной конфигурацией. Фильтрация теперь будет работать. Если созданные записи языка и связали с ними записи ресурса, теперь можно фильтровать ресурсы по связанным с ними языкам.

Cводка

В шагах выше мы изменили панель фильтра для отображения элемента управления фильтра для сущности языка. Мы также изменили запрос извлечения ресурсов в соответствии с ресурсам, связанным с выбранными записями языка. Когда пользователь выбирает значения в элементе управлении фильтра и щелкает "Поиск", значения передаются в запрос и запрос языка 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.

Конфигурация запроса извлечения ограничений представляет собой запрос UFX, используемый API-интерфейс извлечения ограничений требования. Он принимает в качестве входных данных идентификатор записи требования (выбранной в пользовательском интерфейсе) и возвращает запись требования и все ее дочерние записи.

Заметка

Запрос извлечения ограничений по умолчанию, поставляемый с Universal Resource Scheduling, это большой запрос, который поддерживает все ограничения требования, включенные с Universal Resource Scheduling. Для этого упражнения мы будем использовать только подмножество запроса по умолчанию и добавим языки как единственный фильтр.

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

Запросы UFX обрабатываются в последовательном порядке. Запрос извлечения ограничений использует язык FetchXML для запроса сущности Requirement (msdyn_resourcerequirement) и назначает результат (запись требования) свойству Requirement. Мы добавляем в сумку свойств ограничений новое свойство Languages, которое объединяет оба атрибута, основной язык и дополнительный язык, в единый список сущностей (EntityCollection). Это обязательно, так как мы отображаем элемент управление языком на панели фильтров как список записей. Альтернативным вариантом могло бы быть создание двух отдельных элементов управления на панели фильтров для двух атрибутов.

Вот описание каждого element и attribute:

Имя Описание
Languages Создание нового свойства в сумке свойств ограничений результата с именем Languages
ufx:select Назначение результата выражения XPath в этом атрибуте свойству Languages. Свойства lang_primarylanguage и lang_secondarylanguage, извлеченные ранее в запросе и доступные в свойстве Requirement, передается в функцию XPath lookup-to-list, которая преобразует несколько свойств 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>

Обновление запрос извлечения ограничений

  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_primary и lang_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. Внизу этого диалогового окна нажмите "Применить"

Доска заново загрузится с обновленной конфигурацией. Ячейка ресурса теперь отображает, как ресурс соответствует ограничению языка на панели фильтров.

Cводка

В шагах выше мы изменили панель фильтра в помощнике по расписанию для отображения элемента управления фильтра для сущности языка. Мы также изменили запрос извлечения ограничений для запроса новых атрибутов языка, связанных с сущностью требования, и преобразовали их в список. Когда пользователь выбирает поиск доступности для записи требования, панель фильтра отображает зафиксированные ограничения языка. Значения из панели фильтров передаются в запрос извлечения ресурсов, а запроса языка FetchXML возвращает только соответствующие ресурсы.

См. также

Универсальный язык FetchXML

Заметки о выпуске расширяемости Universal Resource Scheduling