Exemplo: Estender o Universal Resource Scheduling com uma restrição de idioma personalizada
Este guia passo a passo é um complemento de Noções básicas e personalização da correspondência de recursos no Universal Resource Scheduling
Neste guia passo a passo, vamos estender recursos do Universal Resource Scheduling com uma restrição de Language
. Considere uma organização que quer filtrar recursos pelos idiomas falados. Eles também querem capturar no registro Requirement
o idioma exigido para o trabalho. Essa restrição segue um padrão parecido com a restrição interna Territory
. Uma nova entidade mestre Language
armazenará os diferentes idiomas falados por um recurso. Desse modo, um registro Resource
poderá ser associado a muitas Languages
por meio de uma entidade no relacionamento muitos para muitos. Na entidade Requirement
, modelaremos isso criando dois novos atributos de pesquisa: Primary Language
e Secondary Language
. Ao localizar os recursos disponíveis para um requisito, serão mostrados apenas os recursos associados a Primary Language
ou a Secondary Language
.
Como criar as novas entidades e os relacionamentos
Nesta seção, criaremos o novo esquema para a entidade mestre Language
e atualizaremos as entidades Resource
e Requirement
com os relacionamentos correspondentes para a nova entidade Language
.
Criar um novo Publicador
No Dynamics 365, em Personalizações, crie um novo Publicador
Preencha o formulário Novo Publicador com os seguintes detalhes:
Campo Value Nome para exibição Language Nome language Prefixo lang Clique em Salvar e Fechar
Criar uma nova Solução
No Dynamics 365, em Personalizações, crie uma nova Solução
Preencha o formulário Nova Solução com os seguintes detalhes:
Campo Value Nome para exibição Language Nome Language Publicador Language Versão 1.0.0.0 Clique em Salvar.
Criar a entidade Language
Na solução de idioma, crie uma nova Entidade
Preencha o formulário Nova Entidade com os seguintes detalhes:
Campo Value Nome para exibição Language Nome no Plural Idiomas Nome lang_language (O prefixo lang_
será preenchido de forma automática e é somente leitura)Clique em Salvar.
Criar o relacionamento muitos para muitos da entidade Resource com a entidade Language
Na entidade Language, crie um novo relacionamento muitos para muitos
Preencha o formulário Novo Relacionamento com os seguintes detalhes:
Campo Value Entidade Atual Opção de Exibição Usar Nome no Plural Outra Entidade Nome da entidade Recurso Reservável Clique em Salvar e Fechar
Feche o formulário da entidade Language
Criar os relacionamentos da entidade Requirement com a entidade Language
Na solução de idioma, adicione a entidade Resource Requirement existente à solução (se for exibida uma caixa de diálogo Componentes Necessários Ausentes, selecione Não, não inclua os componentes necessários).
Na entidade Resource Requirement, crie um novo Campo
Preencha o formulário Novo Campo com os seguintes detalhes:
Campo Value Nome para exibição Idioma Principal Tipo de dados Pesquisa Tipo de Registro de Destino Language Clique em Salvar e Fechar
Na entidade Resource Requirement, crie um novo Campo
Preencha o formulário Novo Campo com os seguintes detalhes:
Campo Value Nome para exibição Idioma Secundário Tipo de dados Pesquisa Tipo de Registro de Destino Language Clique em Salvar e Fechar
Atualizar o formulário principal de requisitos
- Na entidade Resource Requirement, adicione o formulário de informações existentes aos subcomponentes da entidade (se for exibida uma caixa de diálogo Componentes Necessários Ausentes, selecione Não, não inclua os componentes necessários).
- No formulário de informações, use o Gerenciador de Campos para adicionar os dois novos atributos, Idioma Principal e Idioma Secundário, de modo que os usuários possam inserir esses dados ao criar os requisitos
- Clique em Salvar.
- Clique em Publicar
- Você pode fechar o editor de formulários
Resumo
Nas etapas anteriores, criamos a nova entidade Language. Depois, adicionamos novos relacionamentos com as entidades Resource e Requirement. Os recursos podem estar relacionados a vários idiomas, pois adicionamos um relacionamento muitos para muitos entre Language e Resource. Os requisitos podem estar relacionados a duas entidades Language, uma vez que adicionamos dois atributos de pesquisa na entidade Requirement que apontam para a nova entidade Language.
Como adicionar dados
Use a Localização Avançada para adicionar novos registros à entidade Language. Em seguida, é possível associar registros de Resource aos novos registros de Language abrindo um registro de Resource e navegando até o relacionamento Language na barra de navegação. Para registros de Requirement, você pode preencher os novos campos de Idioma Principal e Idioma Secundário no formulário de Requirement.
Como personalizar o Painel de Agendamento
Para filtrar recursos no Painel de Agendamento com a nova restrição Language, atualizaremos os registros de configuração da Consulta Recuperar Recursos e de Layout de Filtro.
Configuração de Layout de Filtro
Gorjeta
Para as etapas abaixo, convém usar um editor de texto com suporte a realce de sintaxe XML para fazer as alterações e, depois, colar as alterações de volta no editor do Universal Resource Scheduling.
A configuração de Layout de Filtro é uma definição de layout XML para personalizar o layout do painel Filtro.
Nota
Para este exercício, removeremos todos os filtros padrão fornecidos com o Universal Resource Scheduling do painel Filtro e adicionaremos 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 controle ao painel Filtro. Veja a descrição de cada atributo:
Nome | Descrição |
---|---|
type |
O tipo de controle de filtro. Um controle combo renderiza uma lista suspensa com valores para escolher |
source |
A origem dos valores do controle suspenso. Uma origem entity mostra os registros de entidade na lista suspensa |
key |
A chave a ser usada para armazenar os valores selecionados no conjunto de propriedades de restrições |
inactive-state |
O statecode inativo desta entidade. Usado para excluir registros inativos na lista suspensa |
label-id |
O rótulo localizado a ser usado para este controle |
entity |
Os registros desta entidade serão exibidos na lista suspensa |
multi |
Configura a lista suspensa para permitir a seleção de um único registro ou de vários registros |
Layout 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>
Criar um novo painel Idiomas
Para manter essas alterações isoladas e implementá-las, criaremos um novo Painel de Agendamento separado, mas sempre é possível fazer alterações no painel padrão para que outros Painéis de Agendamento possam herdá-las automaticamente.
- No Dynamics 365, na barra de navegação superior, vá para Agendamento de Recurso > Painel de Agendamento
- No canto superior direito, clique no sinal de adição para criar um novo painel
- Nomeie o novo painel como Idioma
- Na parte inferior da caixa de diálogo, clique em Adicionar. O novo painel será criado.
Atualizar o Layout de Filtro do Painel de Agendamento
Em seguida, criaremos um novo registro de configuração que armazena os layouts de filtro e consultas usados no Painel de Agendamento e vincularemos o recém-criado painel ao registro. Há diversas formas de fazer isso, mas esta é a mais rápida:
- No canto superior direito, clique duas vezes na guia Idioma
- Role a tela para baixo até Configurações Gerais > Outras Configurações
- Localize o campo Layout de Filtro e clique no botão à direita para abrir o editor
- Atualize o campo Valor com o código de Layout de Filtro acima e clique em Salvar Como.
- Insira “Layout de Filtro de Idioma" no campo Nome e clique em Salvar. Isso cria um novo registro de configuração e vincula este Painel de Agendamento a ele.
- Na parte inferior da caixa de diálogo, clique em Aplicar.
O painel será recarregado e você verá o painel Filtro no lado esquerdo com o novo layout; somente o filtro Idiomas estará disponível. A filtragem ainda não funcionará, pois precisaremos atualizar a Consulta Recuperar Recursos para aproveitar o novo filtro.
Configuração da Consulta Recuperar Recursos
Gorjeta
Para as etapas abaixo, convém usar um editor de texto com suporte a realce de sintaxe XML para fazer as alterações e, depois, colar as alterações de volta no editor do Universal Resource Scheduling.
A configuração da Consulta Recuperar Recursos é uma Consulta UFX usada pela API de correspondência de recursos. Ela usa como entrada os valores inseridos no painel Filtro e constrói a FetchXML correta para localizar os recursos correspondentes.
A seguir estão os novos snippets adicionados à Consulta Recuperar Recursos para fazer a correspondência e ordenar pelos Idiomas dos Recursos.
Adição das junçõ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 passados como entrada para a consulta e ficam disponíveis na variável de XPath
$input
A Consulta Recuperar Recursos usa FetchXML para consultar a entidade Resource (bookableresource)
. Estamos usando o elemento de FetchXML link-entity
para retornar somente os recursos associados aos registros de Language selecionados no painel Filtro. Para oferecer suporte para mostrar os idiomas com correspondência e ordenar por idioma principal ou secundário, o que será descrito mais adiante na seção Modelo da Célula de Recurso, estamos usando várias junções link-entity
.
Veja a descrição de cada element
e attribute
:
Nome | Descrição |
---|---|
link-entity |
Criar a junção para o relacionamento muitos para muitos entre as entidades Resource e Language |
ufx:if |
Emitir este elemento de FetchXML (link-entity ) somente se a expressão XPath neste atributo retorna um valor |
attribute |
Retornar o idioma principal ou secundário com correspondência |
filter e condition |
Filtrar os registros de relacionamentos muitos para muitos para mostrar apenas os que correspondem às IDs de idioma especificadas |
ufx:value e select |
Gera o resultado da expressão XPath select no atributo |
ufx:apply e select |
Emitir os elementos filho de FetchXML para cada resultado retornado da expressão XPath no atributo select |
value |
Contém a ID de um registro de Language |
Como determinar a ordem de classificação de um recurso
Depois que recuperamos os recursos correspondentes, com base nos idiomas atribuídos de cada recurso, atribuímos uma nova propriedade lang_order
para determinar a ordem de classificação.
<bag>
<lang_order ufx:select="iif(lang_primary and lang_secondary, 1, iif(lang_primary, 2, iif(lang_secondary, 3, 4)))" />
</bag>
Veja a descrição de cada element
e attribute
:
Nome | Descrição |
---|---|
lang_order |
Crie uma nova propriedade em cada recurso retornado da consulta FetchXML chamada lang_order |
ufx:select |
Atribua o resultado da expressão XPath neste atributo à propriedade lang_order . As propriedades lang_primary e lang_secondary , recuperadas anteriormente na consulta, são usadas junto com a função XPath iif para determinar a ordem de correspondência dos recursos. |
Como ordenar os resultados
<Resources ufx:select="order(Resources, 'lang_order')" />
As consultas UFX são processadas em ordem sequencial. Depois que os recursos são recuperados com FetchXML, os resultados são atribuídos à propriedade Resources
. Estamos classificando os resultados com base na propriedade lang_order
adicionada anteriormente e reatribuindo os resultados classificados à propriedade Resources
.
Veja a descrição de cada element
e attribute
:
Nome | Descrição |
---|---|
Resources |
Reatribuir a propriedade Resources |
ufx:select |
Atribua o resultado da expressão XPath neste atributo à propriedade Resources . A função XPath order é usada para classificar a lista Resources em sua propriedade lang_order . |
Nota
A Consulta Recuperar Recursos padrão fornecida com o Universal Resource Scheduling é uma consulta grande que oferece suporte para todas as restrições de recursos incluídas no Universal Resource Scheduling. Para este exercício, utilizaremos apenas um subconjunto da consulta padrão e adicionaremos Idiomas como o ú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 Recuperar Recursos do Painel de Agendamento
- No canto superior direito, clique duas vezes na guia Idioma
- Role a tela para baixo até Configurações Gerais > Outras Configurações
- Localize o campo Consulta Recuperar Recursos e clique no botão à direita para abrir o editor
- Atualize o campo Valor com o código de Consulta Recuperar Recursos acima e clique em Salvar Como
- Insira “Consulta de Recursos de Idioma" no campo Nome e clique em Salvar. Isso cria um novo registro de configuração e vincula este Painel de Agendamento a ele.
- Na parte inferior da caixa de diálogo, clique em Aplicar.
O painel será recarregado com a configuração atualizada. Agora a filtragem funcionará. Se você criou registros de Language e os associou a registros de Resource, agora conseguirá filtrar os recursos pelos idiomas associados.
Resumo
Nas etapas acima, modificamos o painel Filtro para mostrar um controle de filtro para a entidade Language. Também modificamos a Consulta Recuperar Recursos para corresponder os recursos associados aos registros selecionados de Language. Quando um usuário seleciona valores no controle de filtro e clica em Pesquisar, os valores são passados para a consulta e a consulta FetchXML retorna apenas os recursos correspondentes.
Como personalizar o Assistente de Agendamento
Precisamos personalizar as configurações de Layout de Filtro do Assistente de Agendamento e da Consulta Recuperar Restrições para usar as novas restrições de Language no Assistente de Agendamento.
Diferentemente das personalizações do Painel de Agendamento, em que é possível personalizar cada painel de forma individual, as personalizações do Assistente de Agendamento afetam todos os painéis onde o Assistente de Agendamento é usado. As personalizações do Assistente de Agendamento podem ser específicas para um tipo agendável ou para todos os tipos. Neste exemplo, personalizaremos o Assistente de Agendamento para todos os tipos.
Configuração de Layout de Filtro do Assistente de Agendamento
Gorjeta
Para as etapas abaixo, convém usar um editor de texto com suporte a realce de sintaxe XML para fazer as alterações e, depois, colar as alterações de volta no editor do Universal Resource Scheduling.
A configuração de Layout de Filtro do Assistente de Agendamento, como o Layout de Filtro do Painel de Agendamento, define o layout dos controles no painel Filtro. Como o Assistente de Agendamento utiliza mais filtros do que o Painel de Agendamento, como Hora de Início, Hora de Término, Duração etc., é usado um layout diferente.
Nota
Para este exercício, reutilizaremos apenas um subconjunto dos filtros padrão fornecidos no Universal Resource Scheduling da configuração de Layout de Filtro do Assistente de Agendamento e adicionaremos a lista suspensa Idiomas como o único filtro disponível.
O filtro que vamos adicionar ao layout é igual ao filtro acima em Configuração de Layout de Filtro. Os outros controles são necessários para modificar os parâmetros de pesquisa do Assistente de Agendamento.
O Layout de Filtro completo do Assistente de Agendamento
<?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 Layout de Filtro do Assistente de Agendamento
- No canto superior direito, clique duas vezes na guia Idioma
- No canto superior direito, clique em Abrir Configurações Padrão
- Role até a seção Tipos de Agendamento e selecione Nenhum na lista à esquerda
- Localize o campo Layout de Filtro do Assistente de Agendamento e clique no botão à direita para abrir o editor
- Atualize o campo Valor com o código de Layout de Filtro do Assistente de Agendamento acima e clique em Salvar Como
- Insira “Layout de Filtro de Idioma do Assistente de Agendamento" no campo Nome e clique em Salvar. Isso cria um novo registro de configuração e vincula este Painel de Agendamento a ele.
- Na parte inferior da caixa de diálogo, clique em Aplicar.
O painel será recarregado. Em seguida, precisamos alterar a Consulta Recuperar Restrições para podermos usar o Assistente de Agendamento com as novas restrições de Language, de forma que os idiomas definidos na entidade Requirement façam parte da pesquisa do Assistente de Agendamento.
Configuração da Consulta Recuperar Restrições
Gorjeta
Para as etapas abaixo, convém usar um editor de texto com suporte a realce de sintaxe XML para fazer as alterações e, depois, colar as alterações de volta no editor do Universal Resource Scheduling.
A configuração da Consulta Recuperar Restrições é uma Consulta UFX usada pela API de recuperação de restrições de Requirement. Ela usa como entrada a ID de um registro de Requirement (selecionado na interface do usuário) e retorna esse registro e todos os seus registros secundários.
Nota
A Consulta Recuperar Restrições padrão fornecida com o Universal Resource Scheduling é uma consulta grande que oferece suporte para todas as restrições de requisitos incluídas no Universal Resource Scheduling. Para este exercício, utilizaremos apenas um subconjunto da consulta padrão e adicionaremos Idiomas como o único filtro.
<Languages ufx:select="lookup-to-list(Requirement/lang_primarylanguage, Requirement/lang_secondarylanguage)" />
As consultas UFX são processadas em ordem sequencial. A Consulta Recuperar Restrições usa FetchXML para consultar a entidade Requirement (msdyn_resourcerequirement)
e atribui o resultado, um registro de Requirement, à propriedade Requirement
. Estamos adicionando ao conjunto de propriedades de restrições uma nova propriedade Languages
que combina os dois atributos, Idioma Principal e Idioma Secundário, em uma única lista de entidades (EntityCollection). Isso é necessário porque estamos mostrando o controle Idiomas no painel Filtro como uma lista de registros. Uma alternativa seria criar dois controles separados no painel Filtro para os dois atributos.
Veja a descrição de cada element
e attribute
:
Nome | Descrição |
---|---|
Languages |
Crie uma nova propriedade no conjunto de propriedades de restrições resultante chamada Languages |
ufx:select |
Atribua o resultado da expressão XPath neste atributo à propriedade Languages . As propriedades lang_primarylanguage e lang_secondarylanguage , recuperadas anteriormente na consulta e disponíveis na propriedade Requirement , são passadas para a função XPath lookup-to-list , que converte várias propriedades lookup em uma única list (EntityCollection) |
Consulta Recuperar 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 Consulta Recuperar Restrições
- No canto superior direito, clique duas vezes na guia Idioma
- No canto superior direito, clique em Abrir Configurações Padrão
- Role até a seção Tipos de Agendamento e selecione Nenhum na lista à esquerda
- Localize o campo Consulta Recuperar Restrições do Assistente de Agendamento e clique no botão à direita para abrir o editor
- Atualize o campo Valor com o código de Consulta Recuperar Recursos acima e clique em Salvar Como
- Insira “Consulta de Restrições de Idioma" no campo Nome e clique em Salvar. Isso cria um novo registro de configuração e vincula este Painel de Agendamento a ele.
- Localize o campo Consulta Recuperar Recursos do Assistente de Agendamento e selecione a Consulta de Recursos de Idiomas que criamos anteriormente para as Personalizações do Painel de Agendamento
- Na parte inferior da caixa de diálogo, clique em Aplicar.
O painel será recarregado com a configuração atualizada. Agora a filtragem do Assistente de Agendamento funcionará. Se você criou registros de Language e os associou a registros de Requirement, agora poderá selecionar um registro de Requirement na parte inferior do Painel de Agendamento, clicar em Localizar Disponibilidade para iniciar o Assistente de Agendamento e ver apenas os recursos que correspondem aos idiomas salvos no requisito.
Configuração do Modelo da Célula de Recurso
Gorjeta
Para as etapas abaixo, convém usar um editor de texto com suporte a realce de sintaxe HTML para fazer as alterações e, depois, colar as alterações de volta no editor do Universal Resource Scheduling.
A configuração de Modelo da Célula de Recurso é um modelo de Handlebars usado para renderizar o conteúdo na célula de recurso. A saída da Consulta Recuperar Recursos está disponível para o modelo.
Estamos modificando o modelo de recurso padrão para mostrar um indicador ✔✱ verde se o recurso correspondeu aos idiomas principal e secundário, um indicador ✔ verde se o recurso correspondeu apenas ao idioma principal e um indicador ✔ amarelo se o recurso correspondeu somente ao idioma secundário.
{{#if lang_primary}}
<span style='color:green;'>✔{{#if lang_secondary}} ✱{{/if}}</span>
{{else if lang_secondary}}
<span style='color:#ffe700;'>✔</span>
{{/if}}
As propriedades lang_primary
e lang_secondary
são retornadas da Consulta Recuperar Recursos personalizada que configuramos acima. Consulte o site do Handlebars para ver a documentação sobre a sintaxe de modelagem.
Modelo da 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;'>✔{{#if lang_secondary}} ✱{{/if}}</span>
{{else if lang_secondary}}
<span style='color:#ffe700;'>✔</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 da Célula de Recurso
- No canto superior direito, clique duas vezes na guia Idioma
- No canto superior direito, clique em Abrir Configurações Padrão
- Role até a seção Tipos de Agendamento e selecione Nenhum na lista à esquerda
- Localize o campo Modelo da Célula de Recurso do Assistente de Agendamento e clique no botão à direita para abrir o editor
- Atualize o campo Valor com o código de Modelo da Célula de Recurso acima e clique em Salvar Como
- Insira “Modelo da Célula de Recurso de Idioma" no campo Nome e clique em Salvar. Isso cria um novo registro de configuração e vincula este Painel de Agendamento a ele.
- Na parte inferior da caixa de diálogo, clique em Aplicar.
O painel será recarregado com a configuração atualizada. Agora uma célula de recurso indicará como um recurso correspondeu à restrição de idioma no painel Filtro.
Resumo
Nas etapas acima, modificamos o painel Filtro no Assistente de Agendamento para mostrar um controle de filtro para a entidade Language. Também alteramos a Consulta Recuperar Restrições para consultar os novos atributos de Idioma relacionados à entidade Requirement e os modelamos em uma lista. Quando um usuário selecionar a opção para localizar a disponibilidade de um registro de Requirement, o painel Filtro mostrará as restrições de Language capturadas. Os valores do painel Filtro são passados para a Consulta Recuperar Recursos e a consulta FetchXML retorna apenas os recursos correspondentes.
Consulte também
Notas sobre a versão da extensibilidade do Universal Resource Scheduling