Compartir a través de


Ejemplo: ampliar Universal Resource Scheduling con una restricción de idioma personalizada

Este manual paso a paso complementa a Comprensión y personalización del recurso que coincide en Universal Resource Scheduling

En este manual paso a paso, ampliaremos los recursos Universal Resource Scheduling con una restricción Language. Piense en una organización que desea filtrar recursos por los idiomas que se hablan en ella. También desea capturar en el registro Requirement el idioma necesario para el trabajo. Esta restricción sigue un diseño similar a la restricción Territory integrada. Una nueva entidad maestra Language almacenará los distintos idiomas que habla 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, modelaremos esto mediante la creación de dos nuevos atributos de búsqueda: Primary Language y Secondary Language. Cuando se busquen los recursos disponibles para un requisito, solo se mostrarán los recursos asociados con Primary Language o Secondary Language.

Creación de nuevas entidades y relaciones

En esta sección crearemos el nuevo esquema para la entidad Language maestra y actualice las entidades Resource y Requirement con las relaciones correspondientes con la nueva entidad Language.

Crear un nuevo editor

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

  2. Complete el formulario del nuevo editor con la siguiente información:

    Campo Value
    Nombre para mostrar Idioma
    Nombre language
    Prefijo lang
  3. Haga clic en Guardar y Cerrar.

Crear una nueva solución

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

  2. Complete el formulario de la nueva solución con la siguiente información:

    Campo Value
    Nombre para mostrar Idioma
    Nombre Idioma
    Editor Idioma
    Versión 1.0.0.0
  3. Haga clic en Guardar.

Crear la entidad de idioma

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

  2. Complete el formulario de la nueva entidad con la siguiente información:

    Campo Value
    Nombre para mostrar Idioma
    Nombre plural Idiomas
    Nombre lang_language (El prefijo lang_ se completará automáticamente y será de solo lectura)
  3. Haga clic en 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 la siguiente información:

    Campo Value
    Entidad actual
    Opción de visualización Usar nombre plural
    Otra entidad
    Nombre de entidad Recurso que se puede reservar
  3. Haga clic en Guardar y Cerrar.

  4. Cerrar 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 idioma, agregue la entidad de requisito de recursos existente a la solución (si se presenta con un diálogo Faltan componentes necesarios, seleccione No, no incluir los componentes necesarios).

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

  3. Complete el formulario de nuevo campo con la siguiente información:

    Campo Value
    Nombre para mostrar Idioma principal
    Tipo de datos Búsqueda
    Tipo de registro de destino Idioma
  4. Haga clic en Guardar y Cerrar.

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

  6. Complete el formulario de nuevo campo con la siguiente información:

    Campo Value
    Nombre para mostrar Idioma secundario
    Tipo de datos Búsqueda
    Tipo de registro de destino Idioma
  7. Haga clic en Guardar y Cerrar.

Actualizar el formulario principal de requisito

  1. En la entidad de requisito de recursos, agregue el formulario de información existente a los componentes secundarios de la entidad (si se presenta con un diálogo Faltan componentes necesarios, seleccione No, no incluir los componentes necesarios).
  2. En el formulario de información, use el Explorador de campos para agregar los dos nuevos atributos, el idioma principal y el idioma secundario al formulario de manera que los usuarios puedan especificar esta información a medida que crean los requisitos.
  3. Haga clic en Guardar.
  4. Haga clic en Publicar.
  5. Puede cerrar el editor de formularios.

Resumen

En los pasos anteriores, creamos la nueva entidad de idioma. A continuación, agregamos nuevas relaciones con las entidades de requisito y recurso. Los recursos pueden relacionarse con varios idiomas, ya que agregamos una relación de varios a varios entre el idioma y el recurso. Los requisitos pueden estar relacionados con dos idiomas desde que agregamos dos atributos de búsqueda en la entidad de requisito que señala a la nueva entidad de idioma.

Añadir datos

Use Búsqueda avanzada para agregar nuevos registros a la entidad de idioma. A continuación, puede asociar registros de recurso a los nuevos registros de idioma abriendo un registro de recurso y dirigiéndose a la relación de idioma en la barra de navegación. Para los registros de requisito, puede completar los nuevos campos de idioma principal y secundario en el formulario de requisito.

Personalización del tablero de programación

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

Configuración de diseño de filtro

Propina

Para los pasos siguientes, resulta útil utilizar un editor de texto que admita el resaltado de la sintaxis XML para realizar los cambios y, a continuación, pegar de nuevo los cambios 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 de filtro.

Nota

En este ejercicio, quitaremos todos los filtros predeterminados incluidos con Universal Resource Scheduling desde el panel de filtro y agregaremos idiomas como el único filtro disponible.

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

El elemento control agrega un nuevo control al panel de filtro. A continuación se muestra la descripción de cada atributo:

Nombre Descripción
type El tipo de control de filtro. El control combo muestra un menú desplegable con valores 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 La clave que usar para almacenar los valores seleccionados en el contenedor de propiedades de restricciones.
inactive-state El statecode inactivo para esta entidad. Se utiliza para excluir los registros inactivos del menú desplegable.
label-id La etiqueta localizada que utilizar para este control.
entity Los registros de esta entidad aparecerán en el menú desplegable.
multi Configura el menú desplegable para permitir la selección de un registro único 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 aislados estos cambios, crearemos un nuevo tablero de programación independiente e implementaremos los cambios, pero siempre puede realizar estos cambios en el tablero de programación predeterminado de forma que otros tableros de programación puedan heredar estos cambios.

  1. En Microsoft Dynamics 365, en la barra de navegación superior, vaya al Programación de recursos > Tablero de programación.
  2. En la parte superior derecha, haga clic en el signo + para crear un nuevo tablero.
  3. Póngale un nombre al idioma del nuevo tablero.
  4. En la parte inferior del diálogo, haga clic en Agregar. Se creará el nuevo tablero.

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

A continuación, crearemos un nuevo registro de configuración que almacena diseños de filtro y consultas utilizadas por el tablero de programación y, a continuación, vincularemos el tablero de programación recién creado con el nuevo registro de configuración. Existen varias formas de realizar este procedimiento, pero este es el más rápido:

  1. En la parte superior derecha, haga doble clic en la pestaña Idioma
  2. Desplácese hacia abajo a Configuración general > Otras configuraciones.
  3. Busque el campo Diseño de filtro y haga clic en el botón de la derecha para abrir el editor.
  4. Actualice el campo Valor con el código de diseño de filtro anterior y haga clic en Guardar como.
  5. Especifique "Diseño de filtro de idioma" en el campo Nombre y haga clic en Guardar. De esta forma, se crea un nuevo registro de configuración y se vincula este tablero de programación con el registro.
  6. En la parte inferior del diálogo, haga clic en Aplicar.

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

Recuperar la configuración de la consulta de recursos

Propina

Para los pasos siguientes, resulta útil utilizar un editor de texto que admita el resaltado de la sintaxis XML para realizar los cambios y, a continuación, pegar de nuevo los cambios en el editor de Universal Resource Scheduling.

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

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

Adición de 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 de filtro se pasan como entrada a la consulta y están disponibles en la variable $input de XPath.

La consulta de recuperación de recursos utiliza FetchXML para consultar la entidad Resource (bookableresource). Estamos usando el elemento link-entity de FetchXML para devolver solo recursos asociados a los registros de idioma seleccionados en el panel de filtro. Para admitir la visualización de los idiomas que coinciden y la ordenación por idioma principal o secundario descritas anteriormente en la sección Plantilla de celda de recurso, estamos usando varias uniones link-entity.

A continuación se muestra 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 Permite emitir solo este elemento de FetchXML (link-entity) si la expresión de XPath en este atributo devuelve un valor.
attribute Permite devolver el idioma principal o secundario que coincida.
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 resulta de la expresión de XPath en el atributo select.
ufx:apply y select Permite emitir los elementos de FetchXML secundarios para los resultados devueltos a partir de la expresión de XPath en el atributo select.
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, basados en los idiomas asignados de cada recurso, asignamos una nueva propiedad lang_order 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>

A continuación se muestra la descripción de cada element y attribute:

Nombre Descripción
lang_order Permite crear una nueva propiedad en cada recurso devuelto de la consulta de FetchXML con el nombre lang_order.
ufx:select Permite asignar el resultado de una expresión de XPatch en este atributo a la propiedad lang_order. Las propiedades lang_primary y lang_secondary, que se recuperaron anteriormente en esta consulta, se utilizan de forma conjunta con la función de XPatch iif para determinar el orden de coincidencia del recurso.

Ordenación de los resultados

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

Las consultas de UFX se procesan en orden secuencial. Una vez que se recuperan los recursos a través de FetchXML, se asignan los resultados a la propiedad Resources. Estamos ordenando los resultados basados en la propiedad lang_order agregada anteriormente y reasignando los resultados ordenados en la propiedad Resources.

A continuación se muestra la descripción de cada element y attribute:

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

Nota

La consulta de recuperación de recursos predeterminada incluida con Universal Resource Scheduling es una consulta de gran tamaño que admite todas las restricciones de recursos incluidas con Universal Resource Scheduling. Para este ejercicio, solo usaremos un subconjunto de la consulta predeterminada y agregaremos idiomas como el ú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 programación

  1. En la parte superior derecha, haga doble clic en la pestaña Idioma
  2. Desplácese hacia abajo a Configuración general > Otras configuraciones.
  3. Busque el campo Consulta de recuperación de recursos y haga clic en el botón de la derecha para abrir el editor.
  4. Actualice el campo Valor con el código Consulta de recuperación de recursos y haga clic en Guardar como.
  5. Especifique "Consulta de recursos de idioma" en el campo Nombre y haga clic en Guardar. De esta forma, se crea un nuevo registro de configuración y se vincula este tablero de programación con el registro.
  6. En la parte inferior del diálogo, haga clic en Aplicar.

El tablero volverá a cargarse con la configuración actualizada. El filtrado no funcionará. Si ha creado registros de idioma y los ha asociado con registros de recurso, ahora podrá filtrar recursos por sus idiomas asociados.

Resumen

En los pasos anteriores, modificamos el panel de filtro para mostrar un control de filtro para la entidad de idioma. También modificamos la consulta de recuperación de recursos para que coincidan los recursos asociados con los registros de idioma seleccionados. Cuando un usuario seleccione valores en el control de filtro y haga clic en Búsqueda, los valores pasarán a la consulta y la consulta de FetchXML devolverá solo los recursos que coincidan.

Personalización del Asistente de programación

Es necesario personalizar las configuraciones de la consulta de recuperación de restricciones y el diseño de filtro del Asistente de programación para usar las nuevas restricciones de idioma en el Asistente de programación.

A diferencia de las personalizaciones del tablero de programación, donde cada tablero puede personalizarse 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, personalizaremos el Asistente de programación de todos los tipos.

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

Propina

Para los pasos siguientes, resulta útil utilizar un editor de texto que admita el resaltado de la sintaxis XML para realizar los cambios y, a continuación, pegar de nuevo los cambios 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. Puesto que el Asistente de programación usa más filtros que el tablero de programación, como la hora de inicio, la hora de finalización, la duración, etc., se utiliza un diseño diferente.

Nota

Para este ejercicio, volveremos a usar solo una subred de los filtros predeterminados incluidos en Universal Resource Scheduling desde la configuración del diseño de filtro del Asistente de programación y agregaremos el menú desplegable Idiomas como único filtro disponible.

El filtro que estamos agregando al diseño es el mismo que el de Configuración de diseño de filtro. Los demás 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 de 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, haga clic en Abrir configuración predeterminada.
  3. Desplácese a la sección Tipos de programación y seleccione Ninguno en la lista de la izquierda.
  4. Busque el campo Diseño de filtro del Asistente de programación y haga clic en el botón de la derecha para abrir el editor.
  5. Actualice el campo Valor con el código de diseño de filtro del Asistente de programación y haga clic en Guardar como.
  6. Especifique "Diseño de filtro del Asistente de programación de idioma" en el campo Nombre y haga clic en Guardar. De esta forma, se crea un nuevo registro de configuración y se vincula este tablero de programación con el registro.
  7. En la parte inferior del diálogo, haga clic en Aplicar.

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

Recuperar la configuración de la consulta de restricciones

Propina

Para los pasos siguientes, resulta útil utilizar un editor de texto que admita el resaltado de la sintaxis XML para realizar los cambios y, a continuación, pegar de nuevo los cambios 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 Universal Resource Scheduling es una consulta de gran tamaño que admite todas las restricciones de recursos incluidas con Universal Resource Scheduling. Para este ejercicio, solo usaremos un subconjunto de la consulta predeterminada y agregaremos idiomas como el único filtro.

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

Las consultas de UFX se procesan en orden secuencial. La consulta de recuperación de restricciones usa FetchXML para consultar la entidad Requirement (msdyn_resourcerequirement) y asignar el resultado, un registro de requisito, a la propiedad Requirement. Estamos agregando al contenedor de propiedades de restricciones una nueva propiedad Languages que combina ambos atributos, el idioma principal y secundario, en una lista única de entidades (EntityCollection). Esto es necesario porque estamos mostrando el control de idiomas en el panel de filtro como una lista de registros. Una alternativa sería crear dos controles independientes en el panel de filtro para los dos atributos.

A continuación se muestra 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 Permite asignar el resultado de una expresión de XPatch en este atributo a la propiedad Languages. Las propiedades lang_primarylanguage y lang_secondarylanguage recuperadas anteriormente en la consulta, y que se encuentran disponibles en la propiedad Requirement, se pasan a la función de XPath lookup-to-list, que convierte varias propiedades lookup en una única 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, haga clic en Abrir configuración predeterminada.
  3. Desplácese a 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 y haga clic en el botón de la derecha para abrir el editor.
  5. Actualice el campo Valor con el código Consulta de recuperación de recursos y haga clic en Guardar como.
  6. Especifique "Consulta de restricciones de idioma" en el campo Nombre y haga clic en Guardar. De esta forma, se crea un nuevo registro de configuración y se vincula este tablero de programación con el registro.
  7. Busque el campo Consulta de recuperación de recursos del Asistente de programación y seleccione la consulta de recursos de idioma que creamos anteriormente para las personalizaciones del tablero de programación.
  8. En la parte inferior del diálogo, haga clic en Aplicar.

El tablero volverá a cargarse con la configuración actualizada. El filtrado del Asistente de programación funcionará ahora. Si ha creado registros de idioma y los asociado con los registros de requisito, ahora podrá seleccionar un registro de requisito en la parte inferior del tablero de programación, hacer clic en Buscar disponibilidad para iniciar el Asistente de programación y ver solo los recursos que coinciden con los idiomas guardados en el requisito.

Configuración de la plantilla de celda de recurso

Propina

Para los pasos siguientes, resulta útil utilizar un editor de texto que admita el resaltado de la sintaxis HTML para realizar los cambios y, a continuación, pegar de nuevo los cambios en el editor de Universal Resource Scheduling.

La configuración de la plantilla de celda de recurso es una plantilla de Handlebars que se utiliza para mostrar contenido en la celda de recurso. La salida de la consulta de recuperación de recursos está disponible en la plantilla.

Estamos modificando la plantilla de recursos predeterminada para que muestre un indicador verde ✔✱ si el recurso coincidió con los idiomas principal y secundario, un indicador verde ✔ si el recurso solo coincidió con el idioma principal y un indicador ✔ amarillo si el recurso solo coincidió 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 propiedades lang_primary y lang_secondary se devolvieron a partir de nuestra consulta de recuperación de recursos personalizada configurada anteriormente. Consulte el sitio web de Handlebars para ver la documentación sobre la sintaxis de las 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>

Actualizar la plantilla de celda de recurso

  1. En la parte superior derecha, haga doble clic en la pestaña Idioma
  2. En la parte superior derecha, haga clic en Abrir configuración predeterminada.
  3. Desplácese a 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 haga clic en el botón de la derecha para abrir el editor.
  5. Actualice el campo Valor con el código Plantilla de celda de recurso y haga clic en Guardar como.
  6. Especifique "Plantilla de celda de recurso de idioma" en el campo Nombre y haga clic en Guardar. De esta forma, se crea un nuevo registro de configuración y se vincula este tablero de programación con el registro.
  7. En la parte inferior del diálogo, haga clic en Aplicar.

El tablero volverá a cargarse con la configuración actualizada. La celda de recurso ahora indicará cómo un recurso coincidió con la restricción de idioma en el panel Filtro.

Resumen

En los pasos anteriores, modificamos el panel de filtro en el Asistente de programación para mostrar un control de filtro para la entidad de idioma. También modificamos la consulta de recuperación de restricciones para que consultara los nuevos atributos de idiomas relacionados con la entidad de requisito y los agrupara en una lista. Cuando un usuario decida consultar la disponibilidad de un registro de requisito, el panel Filtro mostrará las restricciones de idioma capturadas. Los valores del panel Filtro se pasarán a la consulta de recuperación de recursos y la consulta de FetchXML devolverá solo los recursos que coincidan.

Consultar también

Universal FetchXML

Notas de la versión de extensibilidad de Universal Resource Scheduling