Compartir a través de


Ejemplo: Ampliar la programación de recursos universales con una restricción de idioma personalizada

Esta guía paso a paso es un complemento para Comprender y personalizar la coincidencia de recursos en Universal Resource Scheduling

En esta guía paso a paso, ampliamos los recursos de Universal Resource Scheduling con una restricción de Language. Considere una organización que desea filtrar los recursos por los idiomas que habla. También desea capturar en el registro Requirement el idioma necesario para el trabajo. Esta restricción sigue un patrón similar a la restricción integrada Territory . Una nueva entidad Language principal almacena los diferentes idiomas que puede hablar un recurso. A continuación, se puede asociar un recurso Resource a varios Languages a través de una entidad de relación de muchos a muchos. En la entidad Requirement, modelamos esto mediante la creación de dos nuevos atributos de búsqueda: Primary Language y Secondary Language. Cuando el sistema busca recursos disponibles para un requisito, solo los recursos asociados con el Primary Language o el Secondary Language se muestran.

Creación de las nuevas entidades y relaciones

En esta sección, creamos el nuevo esquema para la entidad principal Language y actualizamos las Resource entidades y Requirement con las relaciones correspondientes a la nueva Language entidad.

Crear un nuevo editor

  1. En Dynamics 365, en Personalizaciones, cree un nuevo publicador.

  2. Rellene el formulario de nuevo editor con los siguientes detalles:

    Campo Importancia
    Nombre de pantalla Lenguaje
    Nombre lenguaje
    Prefijo Lang
  3. Seleccione Guardar y cerrar.

Crear una nueva solución

  1. En Dynamics 365, en Personalizaciones, cree una nueva solución.

  2. Rellene el formulario de nueva solución con los siguientes detalles:

    Campo Importancia
    Nombre de pantalla Lenguaje
    Nombre Lenguaje
    Publicador Lenguaje
    Versión 1.0.0.0
  3. Haga clic en Guardar.

Crear la entidad de idioma

  1. En la solución Lenguaje, cree una nueva entidad.

  2. Complete el formulario de Nueva Entidad con los siguientes detalles:

    Campo Importancia
    Nombre de pantalla Lenguaje
    Nombre plural Idiomas
    Nombre lang_language (el lang_ prefijo se completará automáticamente y será de solo lectura)
  3. Seleccione Guardar.

Crea la relación many-to-many desde la entidad de Recurso hasta la entidad de Lenguaje

  1. En la entidad de idioma, cree una nueva relación de varios a varios.

  2. Complete el formulario de Nueva Relación con los siguientes detalles:

    Campo Importancia
    Entidad actual
    Opción de visualización Usar el nombre en plural
    Otra Entidad
    Nombre de entidad Recurso que se puede reservar
  3. Seleccione Guardar y cerrar.

  4. Cierre el formulario de entidad de idioma.

Crear las relaciones desde la entidad de requisito a la entidad de idioma

  1. En la solución de lenguaje, agregue la entidad Requisito de recursos existente a la solución. Si se muestra un cuadro de diálogo de Componentes requeridos faltantes, seleccione No, no incluirlos.

  2. En la entidad Requisito de recursos, cree un nuevo campo.

  3. Rellene el formulario Nuevo campo con los siguientes detalles:

    Campo Importancia
    Nombre de pantalla Lengua materna
    Tipo de datos Búsqueda
    Tipo de registro de destino Lenguaje
  4. Seleccione Guardar y cerrar.

  5. En la entidad Requisito de recursos, cree un nuevo campo.

  6. Rellene el formulario Nuevo campo con los siguientes detalles:

    Campo Importancia
    Nombre de pantalla Lengua secundaria
    Tipo de datos Búsqueda
    Tipo de registro de destino Lenguaje
  7. Seleccione Guardar y cerrar.

Actualizar el formulario principal de requisitos

  1. En la entidad Requisito de recursos, agregue el formulario de información existente a los subcomponentes de la entidad. Si se presenta un cuadro de diálogo Faltan componentes necesarios, seleccione No, no incluir componentes necesarios.
  2. En el formulario Información , use Field Explorer para agregar los dos nuevos atributos, idioma principal e idioma secundario al formulario, de modo que los usuarios puedan escribir esta información a medida que crean requisitos.
  3. Haga clic en Guardar.
  4. Seleccione Publicar.

Resumen

En los pasos anteriores, creamos la nueva entidad de idioma. A continuación, agregamos nuevas relaciones con las entidades Resource y Requirement. Los recursos se pueden relacionar con varios idiomas, ya que hemos añadido una relación de muchos a muchos entre el idioma y el recurso. Los requisitos se pueden relacionar con dos idiomas, ya que agregamos dos atributos de búsqueda en la entidad Requisito que apunta a la nueva entidad de idioma.

Adición de datos

Utilice Búsqueda avanzada para agregar nuevos registros a la entidad Idioma. A continuación, puede asociar registros de recursos a los nuevos registros de idioma abriendo un registro de recursos y navegando a la relación de idioma en la barra de navegación. Para los registros de requisitos, puede rellenar los nuevos campos de Idioma principal y Idioma secundario en el formulario de requisitos.

Personalización del tablero de programación

Para filtrar los recursos en el tablero de programación con la nueva restricción de idioma, actualizamos los registros de configuración del diseño de filtro y consulta de recuperación de recursos.

Nota:

Estas personalizaciones del tablero de programación se aplicarán a todas las pestañas de manera uniforme y no se pueden configurar individualmente por pestaña. Esto se aplica al diseño de filtro del Asistente de programación, la "Consulta de recuperación de recursos del Asistente de programación", la plantilla de celda de recursos del Asistente de programación y la consulta de recuperación de restricciones del Asistente de programación.

Configuración del diseño del filtro

Sugerencia

Para los pasos siguientes, es útil usar un editor de texto que admita el resaltado de sintaxis XML para realizar los cambios y, a continuación, volver a pegarlos en el editor de Universal Resource Scheduling.

La configuración de diseño de filtro es una definición de diseño XML para personalizar el diseño del panel Filtro.

Nota:

Para este ejercicio, quitaremos todos los filtros predeterminados incluidos con Universal Resource Scheduling del panel Filtro y agregaremos Idiomas como único filtro disponible.

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

El control elemento agrega un nuevo control al panel Filtro. Esta es la descripción de cada atributo:

Nombre Descripción
type El tipo de control de filtro. Un combo control representa una lista desplegable con valores entre los que elegir
source El origen de los valores para el control desplegable. Un origen entity muestra los registros de entidad en el menú desplegable.
key Clave que se va a utilizar para almacenar los valores seleccionados en el contenedor de propiedades de restricciones
inactive-state El statecode inactivo para esta entidad. Esto se utiliza para excluir registros inactivos del menú desplegable
label-id Etiqueta localizada que debe utilizarse para este control
entity Los registros de esta entidad se muestran en el menú desplegable
multi Configura el menú desplegable para permitir la selección de un solo registro o varios registros

Diseño de filtro:

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

Crear un nuevo tablero de idiomas

Para mantener estos cambios aislados, creamos un nuevo tablero de programación independiente e implementamos los cambios, pero siempre puede realizar estos cambios en el tablero de programación predeterminado para que otros tableros de programación puedan heredar automáticamente estos cambios.

  1. En Dynamics 365, en la barra de navegación superior, vaya a Programación de recursos>Tablero de programación.
  2. En la parte superior derecha, selecciona el + signo para crear un nuevo tablero.
  3. Asigne un nombre al nuevo idioma del foro.
  4. En la parte inferior del cuadro de diálogo, seleccione Agregar. Se creará la nueva junta.

Actualizar el diseño del filtro del tablero de programación

A continuación, creamos un nuevo registro de configuración, que almacena los diseños de filtro y las consultas utilizadas por el tablero de programación y, a continuación, vinculamos el tablero de programación recién creado al nuevo registro de configuración. Hay varias formas de hacerlo, pero esta es la más rápida:

  1. Seleccione la pestaña Idioma .
  2. Desplázate hacia abajo hasta Configuración> generalOtras configuraciones.
  3. Localice el campo Diseño de filtro , seleccione el botón de la derecha para abrir el editor
  4. Actualice el campo Valor con el código Diseño de filtro anterior y seleccione Guardar como.
  5. Introduzca "Diseño de filtro de idioma" en el campo Nombre y seleccione Guardar. Esto crea un nuevo registro de configuración y vincula este tablero de programación al registro.
  6. En la parte inferior del cuadro de diálogo, seleccione Aplicar

El tablero se volverá a cargar y verás el panel Filtro a la izquierda con el nuevo diseño; solo estará disponible el filtro Idiomas. El filtrado aún no funcionará, ya que debemos actualizar la consulta de recuperación de recursos para aprovechar el nuevo filtro.

Configuración de consulta de obtención de recursos

Sugerencia

Para los pasos siguientes, es útil usar un editor de texto que admita el resaltado de sintaxis XML para realizar los cambios y, a continuación, volver a pegarlos en el editor de Universal Resource Scheduling.

La configuración de consulta de recuperación de recursos es una consulta UFX utilizada por la API de coincidencia de recursos. Toma como entrada los valores introducidos en el panel Filtro y construye dinámicamente el FetchXML correcto para encontrar los recursos coincidentes.

A continuación se muestran los nuevos fragmentos agregados a la consulta de recuperación de recursos para que coincidan y se ordenen por los idiomas de los recursos.

Adición de las uniones de bookableresource a 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>

Los valores seleccionados en el panel Filtro se pasan como entrada a la consulta y están disponibles en la variable XPath $input

La consulta Recuperar recursos usa FetchXML para consultar la Resource (bookableresource) entidad. Estamos usando el elemento FetchXML link-entity para devolver solo los recursos asociados con los registros de idioma seleccionados en el panel Filtro. Para admitir la visualización de los idiomas coincidentes y el orden por idioma principal o secundario, que se describe más adelante en la sección Plantilla de celda de recursos, estamos usando varias link-entity combinaciones.

Aquí está la descripción de cada element y attribute.

Nombre Descripción
link-entity Permite crear una unión con la relación de varios a varios entre las entidades de recurso y de idioma.
ufx:if Solo emita este elemento FetchXML (link-entity) si la expresión XPath de este atributo devuelve un valor
attribute Devolver el idioma principal o secundario coincidente
filter y condition Permite filtrar los registros de la relación de varios a varios solo para los que coincidan con los Id. de idioma especificados.
ufx:value y select Genera el resultado de la expresión XPath en el select atributo
ufx:apply y select Emita los elementos FetchXML secundarios para cada resultado devuelto por la expresión XPath en el select atributo
value Contiene el ID de un registro de idioma

Determinación del criterio de ordenación de un recurso

Después de recuperar los recursos coincidentes, en función de los idiomas asignados a cada recurso, asignamos una nueva lang_order propiedad para determinar su criterio de ordenación.

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

Aquí está la descripción de cada element, attribute.

Nombre Descripción
lang_order Cree una nueva propiedad en cada recurso devuelto por la consulta FetchXML denominada lang_order
ufx:select Asigne el resultado de la expresión XPath en este atributo a la lang_order propiedad. Las lang_primary propiedades y lang_secondary , recuperadas anteriormente en la consulta, se utilizan junto con la función XPath iif para determinar el orden de coincidencia de recursos.

Ordenar los resultados

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

Las consultas UFX se procesan en orden secuencial. Una vez que los recursos se recuperan a través de FetchXML, los resultados se asignan a la Resources propiedad. Ordenamos los resultados en función de la lang_order propiedad agregada anteriormente y reasignamos los resultados ordenados a la Resources propiedad.

Aquí está la descripción de element y attribute:

Nombre Descripción
Resources Volver a asignar la Resources propiedad
ufx:select Asigne el resultado de la expresión XPath en este atributo a la Resources propiedad. La función XPath order se utiliza para ordenar la Resources lista en su lang_order propiedad.

Nota:

La consulta de recuperación de recursos predeterminada que se incluye con Universal Resource Scheduling es una consulta grande que admite todas las restricciones de recursos incluidas con Universal Resource Scheduling. Para este ejercicio, usaremos solo un subconjunto de la consulta predeterminada y agregaremos Languages como único filtro.

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

Actualizar la consulta de recuperación de recursos del tablero de planificación

  1. En la parte superior derecha, haga doble clic en la pestaña Idioma
  2. Desplázate hacia abajo hasta Configuración General > Otras configuraciones
  3. Busque el campo Consulta de recuperación de recursos, seleccione el botón de la derecha para abrir el editor
  4. Actualice el campo Valor con el código de consulta "Recuperar recursos" de arriba y seleccione "Guardar como"
  5. Escriba "Consulta de recursos lingüísticos" en el campo Nombre y seleccione Guardar. Esto crea un nuevo registro de configuración y vincula este tablero de programación al registro.
  6. En la parte inferior del cuadro de diálogo, seleccione Aplicar

La placa se recargará con la configuración actualizada. El filtrado ahora funcionará. Si ha creado registros de idioma y los ha asociado a registros de recursos, ahora podrá filtrar los recursos por sus idiomas asociados.

Resumen

En los pasos anteriores, modificamos el panel Filtro para mostrar un control de filtro para la entidad Idioma. También modificamos la consulta de recuperación de recursos para que coincida con los recursos asociados con los registros de idioma seleccionados. Cuando un usuario selecciona valores en el control de filtro y selecciona Buscar, los valores se pasan a la consulta y la consulta FetchXML devuelve solo los recursos coincidentes.

Personalización del Asistente de programación

Necesitamos personalizar la disposición de filtros del asistente de programación y las configuraciones de consulta de recuperación de restricciones para utilizar las nuevas restricciones de idioma en el Asistente de programación.

A diferencia de las personalizaciones del tablero de programación, donde cada tablero se puede personalizar individualmente, las personalizaciones del Asistente de programación afectan a todos los tableros en los que se utiliza el Asistente de programación. Las personalizaciones del Asistente de programación pueden ser específicas para un tipo programable o para todos los tipos. En este ejemplo, personalizamos el Asistente de programación para todos los tipos.

Configuración del diseño de filtro del Asistente de programación

Sugerencia

Para los pasos siguientes, es útil usar un editor de texto que admita el resaltado de sintaxis XML para realizar los cambios y, a continuación, volver a pegarlos en el editor de Universal Resource Scheduling.

La configuración del diseño de filtro del Asistente de programación, como el diseño de filtro del tablero de programación, define el diseño de los controles en el panel de filtro. Dado que el Asistente de programación utiliza más filtros que el tablero de programación, como Hora de inicio, Hora de finalización, Duración, etc., se utiliza un diseño diferente.

Nota:

Para este ejercicio, reutilizaremos solo un subconjunto de los filtros predeterminados que se incluyen en Universal Resource Scheduling desde la configuración de diseño de filtro del Asistente de programación y agregaremos el menú desplegable Idiomas como el único filtro disponible.

El filtro que estamos agregando al diseño es el mismo que el anterior en Configuración de diseño de filtro. Los otros controles son necesarios para modificar los parámetros de búsqueda del Asistente de programación.

El diseño de filtro del Asistente de programación completo

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

Actualizar el diseño del filtro del Asistente de programación

  1. En la parte superior derecha, haga doble clic en la pestaña Idioma
  2. En la parte superior derecha, seleccione Abrir configuración predeterminada
  3. Desplácese hasta la sección Tipos de programación y seleccione Ninguno en la lista de la izquierda
  4. Localice el campo Diseño de filtro del Asistente de programación, seleccione el botón de la derecha para abrir el editor
  5. Actualice el campo Valor con el código del diseño de filtro del Asistente de Programación mencionado anteriormente y seleccione Guardar como opción.
  6. Introduzca "Diseño de filtro del asistente de programación de idiomas" en el campo Nombre y seleccione Guardar. Esto crea un nuevo registro de configuración y vincula este tablero de programación al registro.
  7. En la parte inferior del cuadro de diálogo, seleccione Aplicar

El tablero ser volverá a cargar. A continuación, debemos cambiar la consulta de recuperación de restricciones antes de poder usar el Asistente de programación con nuestras nuevas restricciones de idioma, de modo que los idiomas establecidos en el requisito formen parte de la búsqueda del Asistente de programación.

Recuperar la configuración de la consulta de restricciones

Sugerencia

Para los pasos siguientes, es útil usar un editor de texto que admita el resaltado de sintaxis XML para realizar los cambios y, a continuación, volver a pegarlos en el editor de Universal Resource Scheduling.

La configuración de la consulta de recuperación de restricciones es una consulta UFX utilizada por la API de recuperación de restricciones de requisitos. Toma como entrada el ID de un registro de requisito (seleccionado en la interfaz de usuario) y devuelve el registro de requisito y todos sus registros secundarios.

Nota:

La consulta de recuperación de restricciones predeterminada incluida con Programación de recursos universal es una consulta de gran tamaño que admite todas las restricciones de recursos incluidas con Programación de recursos universal. Para este ejercicio, usaremos solo un subconjunto de la consulta predeterminada y agregaremos Languages como único filtro.

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

Las consultas UFX se procesan en orden secuencial. La consulta Recuperar restricciones usa FetchXML para consultar la Requirement (msdyn_resourcerequirement) entidad y asigna el resultado, un registro de requisito, a la Requirement propiedad. Estamos agregando al contenedor de propiedades constraints una nueva propiedad Languages que combina ambos atributos, el idioma principal y el idioma secundario, en una sola lista de entidades (EntityCollection). Esto es necesario ya que se muestra el control Idiomas en el panel Filtro como una lista de registros. Una alternativa sería crear dos controles independientes en el panel Filtro para los dos atributos.

Aquí está la descripción de cada element y attribute:

Nombre Descripción
Languages Permite crear una nueva propiedad en el contenedor de propiedades de restricciones resultante con el nombre Languages.
ufx:select Asigne el resultado de la expresión XPath en este atributo a la Languages propiedad. Las propiedades lang_primarylanguage y lang_secondarylanguage, recuperadas anteriormente en la consulta y disponible en la propiedad Requirement, se pasan a la función XPath de lookup-to-list, que convierte varias propiedades lookup en una sola list (EntityCollection).

Consulta de recuperación de restricciones:

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

Actualizar la consulta de recuperación de restricciones

  1. En la parte superior derecha, haga doble clic en la pestaña Idioma
  2. En la parte superior derecha, seleccione Abrir configuración predeterminada
  3. Desplácese hasta la sección Tipos de programación y seleccione Ninguno en la lista de la izquierda
  4. Busque el campo Consulta de recuperación de restricciones del Asistente de programación, seleccione el botón a la derecha para abrir el editor
  5. Actualice el campo Valor con el código anterior de la consulta Recuperar Recursos y seleccione Guardar Como
  6. Escriba "Consulta de restricciones de idioma" en el campo Nombre y seleccione Guardar. Esto crea un nuevo registro de configuración y vincula este tablero de programación al registro.
  7. Busque el campo Consulta de recuperación de recursos del Asistente de programación y seleccione la consulta de recursos de idiomas que creamos anteriormente para las personalizaciones del tablero de programación
  8. En la parte inferior del cuadro de diálogo, seleccione Aplicar

La placa se recargará con la configuración actualizada. El filtrado del Asistente de programación funcionará ahora. Si creó registros de idioma y los asoció con registros de requisitos, ahora podrá seleccionar un registro de requisitos en la parte inferior del tablero de programación, seleccionar Buscar disponibilidad para iniciar el Asistente de programación y ver solo los recursos que coincidan con los idiomas guardados en el requisito.

Configuración de la plantilla de celda de recursos

Sugerencia

Para los pasos a continuación, es útil usar un editor de texto que admita el resaltado de sintaxis HTML para realizar los cambios y, a continuación, volver a pegarlos en el editor de Universal Resource Scheduling.

La configuración de la plantilla de celda de recursos es una plantilla de Handlebars que se usa para representar el contenido de la celda de recursos. La salida de la consulta "Recuperar Recursos" está disponible para la plantilla.

Estamos modificando la plantilla de recursos predeterminada para mostrar un ✔ indicador verde ✱ si el recurso coincide con los idiomas principal y secundario, un indicador verde ✔ si el recurso solo coincide con el idioma principal y un indicador amarillo ✔ si el recurso solo coincide con el idioma secundario.

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

Las lang_primary propiedades y lang_secondary se devuelven de nuestra consulta personalizada de recuperación de recursos que configuramos anteriormente. Consulte el sitio web de Handlebars para obtener documentación sobre la sintaxis de plantillas.

Plantilla de celda de recurso:

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

Actualización de la plantilla de celda de recursos

  1. En la parte superior derecha, haga doble clic en la pestaña Idioma
  2. En la parte superior derecha, seleccione Abrir configuración predeterminada
  3. Desplácese hasta la sección Tipos de programación y seleccione Ninguno en la lista de la izquierda
  4. Busque el campo Plantilla de celda de recurso del Asistente de programación y seleccione el botón de la derecha para abrir el editor.
  5. Actualice el campo Valor con el código de plantilla de celda de recursos anterior y seleccione Guardar como
  6. Introduzca "Plantilla de celda de recursos lingüísticos" en el campo Nombre y seleccione Guardar. Esto crea un nuevo registro de configuración y vincula este tablero de programación al registro.
  7. En la parte inferior del cuadro de diálogo, seleccione Aplicar

La placa se recargará con la configuración actualizada. La celda de recursos ahora indicará cómo coincidió un recurso con la restricción de idioma en el panel Filtro.

Resumen

En los pasos anteriores, modificamos el panel de filtros en el Asistente de Programación para mostrar un control de filtros para la entidad Idioma. También modificamos la consulta Retrieve Constraints para consultar los nuevos atributos Language relacionados con la entidad Requirement y darles forma de lista. Cuando un usuario selecciona buscar disponibilidad para un registro de requisito, el panel Filtro muestra las restricciones de idioma capturadas. Los valores del panel Filtro se pasan a la consulta Recuperar recursos y la consulta FetchXML devuelve solo los recursos coincidentes.

Consulte también

Universal Fetch XML

Notas de la versión sobre la extensibilidad de Programación de recursos universal