Partilhar via


Exemplo: Expandir o Universal Resource Scheduling com uma restrição de idioma personalizada

Este guia passo a passo é um complemento para Compreender e personalizar a correspondência de recursos no Universal Resource Scheduling

Neste guia passo a passo, vamos expandir os recursos do Universal Resource Scheduling com uma restrição Language. Considere uma organização que pretende filtrar recursos pelos idiomas que falam. Também querem capturar no registo Requirement o idioma necessário para a tarefa. Esta restrição segue um padrão semelhante à restrição Territory incorporada. Uma nova entidade principal Language armazenará os diferentes idiomas que um recurso pode falar. Um registo Resource pode em seguida ser associado a vários Languages através de uma entidade de relação muitos-para-muitos. Na entidade Requirement, vamos modelar isto ao criar dois novos atributos de pesquisa: Primary Language e Secondary Language. Quando localizar recursos disponíveis para um requisito, só recursos associados com o Primary Language ou Secondary Language serão mostrados.

Criar as novas entidades e relações

Nesta secção, vamos criar o novo esquema para a entidade Language principal e atualizar as entidades Resource e Requirement com as relações correspondentes para a nova entidade Language.

Criar uma nova entidade Publicador

  1. No Dynamics 365, em Personalizações, crie um novo Publicador

  2. Preencha o formulário Novo Publicador com os dados seguintes:

    Campo Value
    Nome a Apresentar Language
    Nome idioma
    Prefixo idioma
  3. Clique em Guardar e Fechar

Criar uma nova Solução

  1. No Dynamics 365, em Personalizações, crie uma nova Solução

  2. Preencha o formulário Nova Solução com os dados seguintes:

    Campo Value
    Nome a Apresentar Language
    Nome Language
    Fabricante Language
    Versão 1.0.0.0
  3. Clique em Guardar

Criar a entidade Idioma.

  1. Na solução Idioma, crie uma nova Entidade

  2. Preencha o formulário Nova Entidade com os dados seguintes:

    Campo Value
    Nome a Apresentar Language
    Nome Plural Idiomas
    Nome lang_language (O prefixo lang_ será preenchido automaticamente e só de leitura)
  3. Clique em Guardar

Criar a relação muitos-para-muitos da entidade Recurso para a entidade Idioma

  1. Na entidade Idioma, crie uma Relação Muitos-para-Muitos

  2. Preencha o formulário Nova Relação com os dados seguintes:

    Campo Value
    Entidade Actual
    Opção de Apresentação Utilizar Nome Plural
    Outra Entidade
    Nome da Entidade Recurso Reservável
  3. Clique em Guardar e Fechar

  4. Fechar o formulário da entidade Idioma

Criar as relações a partir da entidade Requisito para a entidade Idioma

  1. Na solução Idioma, adicione a entidade requisito Requisito de Recurso à solução (se apresentada com uma caixa de diálogo Componentes Necessários em Falta, selecione Não, não incluir os componentes obrigatórios.)

  2. Na entidade Requisito de Recurso, crie um novo Campo

  3. Preencha o formulário Novo Campo com os dados seguintes:

    Campo Value
    Nome a Apresentar Idioma Principal
    Tipo de Dados Pesquisa
    Tipo de Registo de Destino Language
  4. Clique em Guardar e Fechar

  5. Na entidade Requisito de Recurso, crie um novo Campo

  6. Preencha o formulário Novo Campo com os dados seguintes:

    Campo Value
    Nome a Apresentar Idioma Secundário
    Tipo de Dados Pesquisa
    Tipo de Registo de Destino Language
  7. Clique em Guardar e Fechar

Atualizar o formulário principal Requisito

  1. Na entidade Requisito de Recurso, adicione o formulário de informações existente aos subcomponentes da entidade (se apresentada com uma caixa de diálogo Componentes Necessários em Falta, selecione Não, não incluir os componentes obrigatórios.)
  2. No formulário Informações, utilize o Explorador de Campos para adicionar os dois novos atributos, Idioma Principal e Idioma Secundário, ao formulário para os utilizadores poderem introduzir estas informações à medida que criam requisitos
  3. Clique em Guardar
  4. Clique em Publicar
  5. Pode fechar o editor de formulários

Resumo

Nos passos acima, criámos a nova entidade Idioma. Em seguida, adicionámos novas relações com as entidades Recurso e Requisito. Os recursos podem estar relacionados com vários idiomas, uma vez que adicionámos uma relação muitos-para-muitos entre Idioma e Recurso. Os requisitos podem estar relacionados com dois Idiomas, uma vez que adicionámos dois atributos de pesquisa na entidade Requisito que apontam para a nova entidade Idioma.

Adicionar dados

Utilize a Localização Avançada para adicionar novos registos à entidade Idioma. Em seguida, pode associar registos Recursos aos novos registos Idioma ao abrir um registo Recurso e navegar para a relação Idioma na barra de navegação. Para os registos Requisito, também pode preencher nos novos campos Idioma Principal e Idioma Secundário no formulário Requisito.

Personalizar o Quadro da Agenda

Para filtrar os recursos no Quadro da Agenda com a nova restrição Idioma, vamos atualizar a Consulta de Obtenção de Recursos e os registos de configuração Esquema do Filtro.

Configuração do Esquema do Filtro

Gorjeta

Para os passos abaixo, é útil utilizar um editor de texto que suporta realces de sintaxe XML para efetuar as suas alterações e, em seguida, voltar colar as suas alterações no editor do Universal Resource Scheduling.

A configuração do Esquema de Filtro é uma definição do esquema XML para personalizar o esquema do painel Filtro.

Nota

Neste exercício, vamos remover todos os filtros predefinidos enviados com Universal Resource Scheduling do painel Filtro e adicionar Idiomas como o único filtro disponível.

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

O elemento control adiciona um novo controlo ao painel Filtro. Segue-se a descrição de cada atributo:

Nome Descrição
type O tipo de controlo de filtro. Um controlo combo gera um menu pendente com valores à escolha
source A origem dos valores para o controlo pendente. Uma origem entity mostra os registos da entidade no menu pendente
key A chave que utilizar para armazenar os valores selecionados na matriz de propriedades de restrições
inactive-state O statecode inativo para esta entidade. Utilizado para excluir os registos inativos do menu pendente
label-id A etiqueta localizada a utilizar para este controlo
entity Os registos desta entidade serão apresentados no menu pendente
multi Configura o menu pendente para permitir a seleção de um único registo ou vários registos

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

Criar um novo quadro Idiomas

Para manter estas alterações isoladas, vamos criar um Quadro da Agenda separado totalmente novo e implementar as alterações, mas pode efetuar estas alterações no quadro da agenda em qualquer altura no Quadro da Agenda predefinido para outros Quadros da Agenda poderem herdar automaticamente estas alterações.

  1. No Dynamics 365, na barra de navegação superior, vá para Agendamento de Recursos > Quadro da Agenda
  2. No canto superior direito, clique no sinal + para criar um novo quadro
  3. Atribua um nome ao novo quadro Idioma
  4. Na parte inferior da caixa de diálogo, clique em Adicionar. É criado o novo quadro.

Atualizar o Esquema de Filtro do Quadro da Agenda

Em seguida, vamos criar um novo registo de configuração que armazena os esquemas de filtro e as consulta utilizadas pelo Quadro da Agenda e, em seguida, vamos associar o Quadro da Agenda criado recentemente para o novo registo de configuração. Existem várias formas de o fazer, mas segue-se a mais rápida:

  1. No canto superior direito, faça duplo clique no separador Idioma
  2. Desloque-se para baixo para Definições Gerais > Outras Definições
  3. Localize o campo Esquema de Filtro, clique no botão à direita para abrir o editor
  4. Atualize o campo Valor com o código Esquema de Filtro acima e clique em Guardar Como.
  5. Introduza "Esquema de Filtro de Idioma" no campo Nome e clique em Guardar. Isto cria um novo registo de configuração e associa este Quadro da Agenda ao registo.
  6. Na parte inferior da caixa de diálogo, clique em Aplicar.

O quadro será recarregado e será apresentado o painel Filtro à esquerda com o novo esquema. Apenas o filtro Idiomas estarão disponíveis. A filtragem ainda não funcionará, porque é necessário atualizar a Consulta de Obtenção de Recursos para tirar partido do novo filtro.

Configuração da Consulta de Obtenção de Recursos

Gorjeta

Para os passos abaixo, é útil utilizar um editor de texto que suporta realces de sintaxe XML para efetuar as suas alterações e, em seguida, voltar colar as suas alterações no editor do Universal Resource Scheduling.

A configuração da Consulta de Obtenção de Recursos é uma Consulta UFX utilizada pela API de Correspondência de Recursos. Assume como entrada os valores introduzidos no painel Filtro e constrói de forma dinâmica o FetchXML correto para encontrar os recursos correspondentes.

Seguem-se os novos fragmentos adicionados à Consulta de Obtenção de Recursos para fazer corresponder e ordenar pelos Idiomas dos Recursos.

Adicionar as associações 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>

Os valores selecionados no painel Filtro são transmitidos como entrada para a consulta e estão disponíveis na variável $input de XPath

A Consulta de Obtenção de Recursos utiliza o FetchXML para consultar a entidade Resource (bookableresource). Estamos a utilizar o elemento link-entity e FetchXML para devolver apenas os recursos associados aos registos de Idioma selecionados no painel Filtro. Para suportar a visualização dos idiomas correspondentes e ordenar por idioma principal ou secundário, descrito mais à frente na secção Modelo de Célula de Recurso, estamos a utilizar várias associações link-entity.

Segue-se a descrição de cada element e attribute:

Nome Descrição
link-entity Criar uma associação para a relação muitos-para-muitos entre as entidades Recurso e Idioma
ufx:if Emitir este elemento (link-entity) FetchXML apenas se a expressão XPath neste atributo devolver um valor
attribute Devolver o idioma principal ou secundário correspondido
filter e condition Filtrar os registos da relação muitos-para-muitos para apenas aquelas que correspondem aos IDs de Idioma especificados
ufx:value e select Gera o resultado da expressão XPath no atributo select
ufx:apply e select Emitir os elementos de FetchXML subordinados para cada resultado devolvido pela expressão XPath no atributo select
value Contém o ID de um registo Idioma

Determinar a sequência de ordenação de um Recurso

Depois de obtermos os recursos correspondentes, baseados nos idiomas atribuídos a cada recurso, atribuímos uma nova propriedade lang_order para determinar a sequência de ordenação.

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

Segue-se a descrição de cada element e attribute:

Nome Descrição
lang_order Criar uma nova propriedade em cada Recurso devolvido da consulta FetchXML denominadalang_order
ufx:select Atribuir o resultado da expressão XPath neste atributo à propriedade lang_order. As propriedades lang_primary e lang_secondary, obtidas anteriormente na consulta, são utilizadas em conjunto com a função iif de XPath para determinar a ordem de correspondência de recursos.

Ordenar os resultados

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

As Consultas UFX são processadas por ordem sequencial. Depois obtidos os recursos através de FetchXML, os resultados são atribuídos à propriedade Resources. Estamos a ordenar os resultados com base na propriedade lang_order adicionada anteriormente e a reatribuir os resultados ordenados à propriedade Resources.

Segue-se a descrição de cada element e attribute:

Nome Descrição
Resources Reatribuir a propriedade Resources
ufx:select Atribuir o resultado da expressão XPath neste atributo à propriedade Resources. A função order de XPath é utilizada para ordenar a lista Resources na respetiva propriedade lang_order.

Nota

A Consulta de Obtenção de Recursos predefinida enviada com o Universal Resource Scheduling é uma consulta longa que suporta todas as restrições de recursos incluídas no Universal Resource Scheduling. Para este exercício, vamos utilizar apenas um subconjunto da consulta predefinida e adicionar Idiomas 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>

Atualizar a Consulta de Obtenção de Recursos do Quadro da Agenda

  1. No canto superior direito, faça duplo clique no separador Idioma
  2. Desloque-se para baixo para Definições Gerais > Outras Definições
  3. Localize o campo Consulta de Obtenção de Recursos, clique no botão à direita para abrir o editor
  4. Atualize o campo Valor com o código Consulta de Obtenção de Recursos acima e clique em Guardar Como
  5. Introduza "Consulta de Recursos de Idioma" no campo Nome e clique em Guardar. Isto cria um novo registo de configuração e associa este Quadro da Agenda ao registo.
  6. Na parte inferior da caixa de diálogo, clique em Aplicar.

O quadro será recarregado com a configuração atualizada. A filtragem irá agora funcionar. Se criou registos de Idioma e os associou a registos do Recurso, poderá agora filtrar os recursos pelos respetivos idiomas associados.

Resumo

Nos passos acima, modificámos o painel Filtro para mostrar um controlo de filtro para a entidade Idioma. Também modificámos a Consulta de Obtenção de Recursos para corresponder aos recursos associados aos registos Idioma selecionados. Quando um utilizador seleciona valores no controlo de filtro e clica e Procurar, os valores são transmitidos para a consulta e a consulta FetchXML devolve apenas os recursos correspondentes.

Personalizar o Assistente da Agenda

É necessário personalizar as configurações Esquema de Filtro do Assistente da Agenda e Consulta de Obtenção de Restrições para utilizar as novas restrições de Idioma no Assistente da Agenda.

Ao contrário das personalizações do Quadro da Agenda, onde cada quadro pode ser personalizado individualmente, as personalizações do Assistente da Agenda afetam todos os quadros em que o Assistente da Agenda é utilizado. As personalizações do Assistente da Agenda podem ser específicas de um tipo ou todos os tipos agendáveis. Neste exemplo, vamos personalizar o Assistente da Agenda para todos os tipos.

Configuração do Esquema de Filtro do Assistente da Agenda

Gorjeta

Para os passos abaixo, é útil utilizar um editor de texto que suporta realces de sintaxe XML para efetuar as suas alterações e, em seguida, voltar colar as suas alterações no editor do Universal Resource Scheduling.

A configuração do Esquema de Filtro do Assistente da Agenda, como o Esquema de Filtro do Quadro da Agenda, define o esquema dos controlos no painel Filtro. Uma vez que o Assistente da Agenda utiliza mais filtros que o Quadro da Agenda, tais como Hora de Início, Hora de Fim, Duração, etc., é utilizado um esquema diferente.

Nota

Para este exercício, vamos reutilizar apenas um subconjunto dos filtros predefinidos fornecidos no Universal Resource Scheduling da configuração do Filtro de Assistente da Agenda e adicionar o menu pendente Idiomas como único filtro disponível.

O filtro que estamos a adicionar ao esquema é igual ao anterior em Configuração do Esquema do Filtro. Os outros controlos são necessários para modificar os parâmetros de pesquisa do Assistente da Agenda.

O Esquema de Filtro do Assistente da Agenda 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>

Atualizar o Esquema de Filtro do Assistente da Agenda

  1. No canto superior direito, faça duplo clique no separador Idioma
  2. No canto superior direito, clique em Abrir Predefinições
  3. Desloque-se para a secção Tipos de Agenda e selecione Nenhum na lista esquerda
  4. Localize o campo Esquema de Filtro do Assistente da Agenda, clique no botão à direita para abrir o editor
  5. Atualize o campo Valor com o código Esquema de Filtro do Assistente da Agenda acima e clique em Guardar Como
  6. Introduza "Esquema de Filtro do Assistente da Agenda do Idioma" no campo Nome e clique em Guardar. Isto cria um novo registo de configuração e associa este Quadro da Agenda ao registo.
  7. Na parte inferior da caixa de diálogo, clique em Aplicar.

O quadro será recarregado. Em seguida, é necessário alterar a Consulta de Obtenção de Restrições antes de podermos utilizar o Assistente da Agenda com as nossas novas restrições de Idioma, para os Idiomas definidos no Requisito fazerem parte da pesquisa no Assistente da Agenda.

Configuração da Consulta de Obtenção de Restrições

Gorjeta

Para os passos abaixo, é útil utilizar um editor de texto que suporta realces de sintaxe XML para efetuar as suas alterações e, em seguida, voltar colar as suas alterações no editor do Universal Resource Scheduling.

A configuração da Consulta de Obtenção de Restrições é uma Consulta UFX utilizada pela API de Obter Restrições de Requisitos. Assume como entrada o ID de um registo Requisito (selecionado na IU) e devolve o registo Requisito e todos os respetivos registos subordinados.

Nota

A Consulta de Obtenção de Restrições predefinida enviada com o Universal Resource Scheduling é uma consulta longa que suporta todas as restrições de requisitos incluídas no Universal Resource Scheduling. Para este exercício, vamos utilizar apenas um subconjunto da consulta predefinida e adicionar Idiomas como único filtro.

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

As Consultas UFX são processadas por ordem sequencial. A Consulta de Obtenção de Restrições utiliza o FetchXML para consultar a entidade Requirement (msdyn_resourcerequirement) e atribui o resultado, um registo Requisito, à propriedade Requirement. Estamos a adicionar à matriz de propriedades de restrições uma nova propriedade Languages que combina ambos os atributos, o Idioma Principal e o Idioma Secundário, numa única lista de entidades (EntityCollection). Isto é obrigatório, como estamos a mostrar o controlo Idiomas no painel Filtro sob a forma de lista de registos. Uma alternativa seria criar dois controlos separados no painel Filtro para os dois atributos.

Segue-se a descrição de cada element e attribute:

Nome Descrição
Languages Criar uma nova propriedade na matriz de propriedades de restrições resultante, denominada Languages
ufx:select Atribuir o resultado da expressão XPath neste atributo à propriedade Languages. As propriedades lang_primarylanguage e lang_secondarylanguage, obtidas anteriormente na consulte disponível na propriedade Requirement, são transmitidas para a função lookup-to-list de XPath que converte várias propriedades lookup para uma única list (EntityCollection)

Consulta de Obtenção de Restrições:

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

Atualizar a Obtenção de Restrições Predefinida

  1. No canto superior direito, faça duplo clique no separador Idioma
  2. No canto superior direito, clique em Abrir Predefinições
  3. Desloque-se para a secção Tipos de Agenda e selecione Nenhum na lista esquerda
  4. Localize o campo Consulta de Obtenção de Restrições do Assistente da Agenda, clique no botão à direita para abrir o editor
  5. Atualize o campo Valor com o código Consulta de Obtenção de Recursos acima e clique em Guardar Como
  6. Introduza "Consulta de Restrições de Idioma" no campo Nome e clique em Guardar. Isto cria um novo registo de configuração e associa este Quadro da Agenda ao registo.
  7. Localize o campo Consulta de Obtenção de Recursos do Assistente da Agenda e selecione a Consulta de Recursos de Idioma criada anteriormente para as Personalizações do Quadro da Agenda
  8. Na parte inferior da caixa de diálogo, clique em Aplicar.

O quadro será recarregado com a configuração atualizada. A filtragem do Assistente da Agenda irá agora funcionar. Se criou registos de Idioma e os associou a registos de Requisito, agora poderá selecionar um registo de Requisito na parte inferior do Quadro da Agenda, clique em Localizar Disponibilidade para iniciar o Assistente da Agenda e consulte apenas os recursos correspondentes aos idiomas guardados no requisito.

Configuração do Modelo de Célula de Recurso

Gorjeta

Para os passos abaixo, é útil utilizar um editor de texto que suporta realces de sintaxe HTML para efetuar as suas alterações e, em seguida, voltar colar as suas alterações no editor do Universal Resource Scheduling.

A configuração do Modelo de Célula de Recurso é um modelo de Barras utilizado para compor conteúdos na célula do recurso. O resultado da Consulta de Obtenção de Recursos está disponível para o modelo.

Estamos a modificar o modelo de recurso predefinido para mostrar um indicador ✔✱ verde se o recurso coincidir com os idiomas principal e secundário, um indicador ✔ verde se o recurso coincidia apenas com o idioma principal e um indicador ✔ amarelo se o recurso coincidia apenas com o idioma secundário.

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

As propriedades lang_primary e lang_secondary são devolvidas a partir da nossa Consulta de Obtenção de Recursos personalizada que configurámos acima. Visite o Web site Barras para a documentação na sintaxe da criação de modelos.

Modelo de Célula 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>

Atualizar o Modelo de Célula de Recurso

  1. No canto superior direito, faça duplo clique no separador Idioma
  2. No canto superior direito, clique em Abrir Predefinições
  3. Desloque-se para a secção Tipos de Agenda e selecione Nenhum na lista esquerda
  4. Localize o campo Modelo de Célula de Recurso do Assistente da Agenda, clique no botão à direita para abrir o editor
  5. Atualize o campo Valor com o código Modelo de Célula de Recurso acima e clique em Guardar Como
  6. Introduza "Modelo de Célula de Recurso do Idioma" no campo Nome e clique em Guardar. Isto cria um novo registo de configuração e associa este Quadro da Agenda ao registo.
  7. Na parte inferior da caixa de diálogo, clique em Aplicar.

O quadro será recarregado com a configuração atualizada. A célula do recurso indicará agora como recurso coincidiu com a restrição de idioma no painel Filtro.

Resumo

Nos passos acima, modificámos o painel Filtro no Assistente da Agenda para mostrar um controlo de filtro para a entidade Idioma. Também modificámos a Consulta de Obtenção de Restrições para consultar os novos atributos de Idioma relacionados com a entidade Requisito e dar-lhes um formato de lista. Quando um utilizador seleciona para localizar a disponibilidade de um registo Requisito, o painel Filtro mostrará as restrições Idioma capturadas. Os valores do painel Filtro são transmitidos para a consulta Obter Recursos e a consulta FetchXML devolve apenas os recursos correspondentes.

Consulte também

Universal Fetch XML

Notas de versão da extensibilidade do Universal Resource Scheduling