Estender o Universal Resource Scheduling com o Universal FetchXML
UFX é uma linguagem de consulta avançada que permite consultar dados usando FetchXML dinâmico, moldar e preparar os dados resultantes para consumo pela solução Universal Resource Scheduling (URS). Essa linguagem de consulta permite criar consultas personalizadas para personalizar e estender o painel de agendamento e os filtros do assistente de agendamento para que atendam às necessidades de negócios exclusivas da organização.
O UFX consiste em dois componentes: Bag UFX e Consulta UFX.
Bag UFX simples
Uma Bag UFX contém dados tipados estáticos. Na memória, ela é representada como um dicionário com chaves e valores. Ela pode ser serializada para JSON e XML. Ter os dados tipados permite que uma Consulta UFX consulte dados neles e que a interface do usuário do cliente vincule-se a eles.
Por motivos práticos e de desempenho, a bag na memória é implementada sobre o objeto
Entity
do SDK dos aplicativos do Dynamics 365.
Amostra de bag contendo dois valores.
Na memória:
chave | valor | tipo |
---|---|---|
name | John | string |
idade | 36 | int |
Em JSON:
{
"name": "John",
"age": 36
}
Em XML:
<bag>
<name ufx-type="string">John</name>
<age ufx-type="int">36</age>
</bag>
Tipos de UFX permitidos
Uma Bag UFX pode conter valores de muitos tipos. Eles são categorizados em três classes de tipo:
Categoria | Valor |
---|---|
Tipos simples | bool (Boolean) , int (Int32) , long (Int64) , double (Double) , decimal (Decimal) , datetime (DateTime) , guid (Guid) , string (String) Tipos simples específicos do Dynamics 365: money (Money) , option (OptionSet) , lookup (EntityReference) |
Outras bags | bag (Entity) |
Lista de bags | list (EntityCollection) |
Veja um exemplo de bag JSON contendo mais tipos:
{
"citizen": true, // implicit bool
"age": 36, // explicit int
"age@ufx-type": "int",
"name": { // nested bag
"first": "John",
"last": "Doe"
},
"children": [ // list of bags
{ "name": "Sam" },
{ "name": "Judy" }
]
}
A mesma bag em XML:
<bag>
<citizen ufx-type="bool">true</citizen>
<age ufx-type="int">36</age>
<name ufx-type="bag">
<first ufx-type="string">John</first>
<last ufx-type="string">Doe</last>
</name>
<children ufx-type="list">
<bag>
<name ufx-type="string">Sam</name>
</bag>
<bag>
<name ufx-type="string">Judy</name>
</bag>
</children>
</bag>
Introdução às Consultas UFX
As Consultas UFX são escritas como Bags UFX baseadas em XML. As propriedades na bag podem conter diretivas UFX para consultar dados dinamicamente. Uma Consulta UFX é executada em objetos na memória, não no XML. Somente as diretivas são escritas em XML. Sua saída pode ser serializada para JSON ou XML.
A Consulta UFX a seguir define a propriedade accounts
na bag com a diretiva UFX source
. Isso faz com que o FetchXML embutido seja executado pelo Dynamics 365 e a propriedade accounts
se torne uma lista de bags, ou uma EntityCollection
, com cada bag sendo uma instância de um registro da conta do Dynamics 365.
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
<accounts ufx:source="fetch">
<fetch top="10">
<entity name="account" />
</fetch>
</accounts>
</bag>
Uma Consulta UFX é processada sequencialmente e pode conter muitas consultas FetchXML.
Veja a seguir um trecho do resultado da Consulta UFX anterior serializada para XML. Observe que alguns valores têm metadados descrevendo-os com mais detalhes.
<bag>
<accounts ufx-type="list">
<bag ufx-id="166e39dd-34a1-e611-8111-00155d652f01" ufx-logicalname="account">
<accountid ufx-type="guid">166e39dd-34a1-e611-8111-00155d652f01</accountid>
<accountnumber ufx-type="string">ABSS4G45</accountnumber>
<name ufx-type="string">Fourth Coffee (sample)</name>
<statecode ufx-type="option" ufx-formatvalue="Active">0</statecode>
<websiteurl ufx-type="string">https://www.fourthcoffee.com/</websiteurl>
<primarycontactid ufx-type="lookup" ufx-formatvalue="Yvonne McKay (sample)" ufx-logicalname="contact">7c6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
...
</bag>
<bag ufx-type="bag" ufx-id="186e39dd-34a1-e611-8111-00155d652f01" ufx-logicalname="account">
<accountid ufx-type="guid">186e39dd-34a1-e611-8111-00155d652f01</accountid>
<accountnumber ufx-type="string">ACTBBDC3</accountnumber>
<name ufx-type="string">Litware, Inc. (sample)</name>
<statecode ufx-type="option" ufx-formatvalue="Active">0</statecode>
<websiteurl ufx-type="string">https://www.litwareinc.com/</websiteurl>
<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
...
</bag>
...
</accounts>
</bag>
A diretiva UFX select
usa uma expressão XPath que seleciona valores da bag atual.
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
<accounts ufx:source="fetch">
<fetch top="10">
<entity name="account" />
</fetch>
</accounts>
<first_account_name ufx:select="accounts/bag[1]/name" />
<!-- null values remove properties from the bag -->
<accounts ufx:select="$null" />
</bag>
A bag resultante em XML:
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
Certamente o aspecto mais poderoso de uma Consulta UFX é sua capacidade de gerar FetchXML dinamicamente com base nos dados de entrada.
No exemplo abaixo, pesquisamos contas por um valor fornecido pelo usuário e disponível como uma Bag UFX por meio da variável XPath $input
. Observe as diretivas UFX if e value no elemento condition
.
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
<accounts ufx:source="fetch">
<fetch top="10">
<entity name="account">
<filter>
<condition attribute="name" operator="like" ufx:if="$input/NameFilter">
<ufx:value select="$input/NameFilter" attribute="value" />
</condition>
</filter>
</entity>
</fetch>
</accounts>
</bag>
Se a propriedade NameFilter
na bag de entrada contivesse %city%
, a condição FetchXML produzida executada pelo Dynamics 365 teria esta aparência.
<condition attribute="name" operator="like" value="%city%" />
Chaves, valores e metadados
Uma Bag UFX contém chaves e valores, com alguns valores tendo metadados adicionais descrevendo-os com mais detalhes.
Um exemplo pode ser um valor do tipo lookup (EntityReference)
. Quando consultada no Dynamics 365 por meio de FetchXML, ela retornará o nome lógico da entidade, bem como o nome de exibição formatado do registro. O Saco UFX preserva essas informações adicionais como metadados anexados ao valor principal.
Serializado para JSON, um lookup
com metadados se pareceria com isso:
{
"primarycontactid": "7e6e39dd-34a1-e611-8111-00155d652f01",
"primarycontactid@ufx-type": "lookup",
"primarycontactid@ufx-logicalname": "contact",
"primarycontactid@ufx-formatvalue": "Susanna Stubberod (sample)"
}
Em XML:
<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
XPath sobre dados do Dynamics 365
Ter os dados em uma Bag UFX tipada permite que uma Consulta UFX os veja em um formato estruturado e use XPath para percorrer os dados e selecionar valores neles.
Uma expressão XPath especificada em uma diretiva UFX vê os dados na bag de maneira semelhante à estrutura do saco no formulário serializado por XML. Entretanto, os dados são armazenados em objetos .NET na memória (em instâncias de Entity
e EntityCollection
), e não em documentos XML.
Apêndice A: Referência ao tipo UFX
Observação: todos os tipos UFX aceitam os metadados ufx-type
e ufx-formatvalue
. Os metadados adicionais são descritos ao lado de cada tipo na tabela abaixo.
Nome UFX | Código do tipo de atributo | Nome .NET | Metadados UFX |
---|---|---|---|
bool | Booliano | Booliano | |
int | Inteiro | Int32 | |
long | BigInt | Int64 | |
double | Duplo | Duplo | |
decimal | Decimal | Decimal | |
datetime | DateTime | DateTime | |
guid | Uniqueidentifier | Guid | |
string | Memorando | Cadeia de caracteres | |
money | Dinheiro | Dinheiro | |
option | Atributos de lista de seleção | OptionSetValue | |
pesquisa | Pesquisa | EntityReference | ufx-logicalname |
bag | N/D | Entidade | ufx-id ufx-logicalname |
lista | N/D | EntityCollection | |
N/D | N/D | AliasedValue | ufx-aliasentity ufx-aliasattribute |
Apêndice B: Diretivas de Consulta UFX
As diretrizes UFX podem ser usadas nas propriedades de bag e em elementos XML de uma consulta FetchXML.
Diretivas da Bag UFX
Atributo | Value | Descrição |
---|---|---|
ufx:if |
XPath | Testa a expressão XPath e processa a propriedade apenas se o teste retornar true |
ufx:source |
fetch |
Executa o elementos XML <fetch> embutido e atribui o resultado à propriedade |
ufx:select |
XPath | Executa a expressão XPath e atribui o resultado à propriedade Ao consultar uma bag ou list , uma bag filho opcional no formulário XML pode ser especificada para transformar o resultado da expressão XPath |
Diretivas do FetchXML UFX
Elemento | Atributo | Value | Descrição |
---|---|---|---|
Todos os elementos | ufx:if |
XPath | Testa a expressão XPath e emite o elemento XML somente se o teste for bem-sucedido |
ufx:apply |
select |
XPath | Executa loop sobre o conjunto de nós retornado pela expressão XPath e gera os elementos XML filho uma vez para cada nó |
ufx:value |
select |
XPath | Executa a expressão XPath e gera o resultado no elemento XML atual |
ufx:value |
attribute |
nome do atributo | Atribui o resultado da expressão XPath ao nome do atributo especificado no elemento XML atual |
Apêndice C: Funções XPath UFX
O UFX adiciona várias funções novas além das disponíveis nativamente no XPath.
datetime()
- datetime(): retorna a hora atual em UTC
list()
- list(bag | list, ...[bag | list]): obtém vários valores de
bag
oulist
como entrada e mescla-os em uma únicalist
lookup-to-list()
- lookup-to-list(lookup, ...[lookup]): obtém vários valores de
lookup
, converte cada um deles em umabag
com o conjunto de metadadosufx-id
eufx-logicalname
, mesclando-os em uma únicalist
option-to-list()
- option-to-list(option, ...[option]): obtém vários valores de
option
, converte cada um deles em umabag
com uma única propriedadeoption
e mescla-os em uma únicalist
order()
- order(list, string, bool): ordena uma lista por uma propriedade em cada bag. A propriedade é especificada no argumento 2, descendente é especificado no argumento 3.
- order(list, list): ordena uma lista por várias ordens de classificação especificadas como uma lista em argumento 2. Cada
bag
na segunda lista pode ter uma propriedadename
edescending
iif()
- iif(any, any, any): se o argumento 1 for true, retornará argumento 2; caso contrário retornará argumento 3
Apêndice D: Variáveis XPath UFX
Nome | Descrição |
---|---|
$input | Uma bag disponível para uma Consulta UFX com valores de entrada |
$null | Uma constante nula. A seleção de $null em uma propriedade remove a propriedade da bag |
$current | Referência à bag atual que está sendo processada pela Consulta UFX |
Consulte também
Noções básicas e personalização da correspondência de recursos no Universal Resource Scheduling
Notas sobre a versão da extensibilidade do Universal Resource Scheduling