Expandir o Universal Resource Scheduling com o Universal FetchXML
UFX é uma linguagem de consulta avançada que lhe permite consultar dados utilizando FetchXML dinâmico, moldar e preparar os dados resultantes para consumo pela solução Universal Resource Scheduling (URS). Este linguagem de consulta permite-lhe criar consultas personalizadas para personalizar e expandir o quadro da agenda e agendar filtros do assistente de agendamento para satisfazer as necessidades de negócio exclusivas da organização.
UFX consiste em dois componentes, Pacote UFX e Consulta UFX.
Pacote UFX simples
Um Pacote UFX contém dados digitados estáticos. Na memória, é representado como um dicionário com chaves e valores. Pode ser serializado para JSON e XML. Ter os dados digitados permite que uma Consulta UFX consulte dados a partir deles, bem como cliente IU para o ligar.
Por razões práticas e de desempenho o pacote na memória é implementado sobre o objeto
Entity
das aplicações SDK do Dynamics 365.
Pacote de exemplo que contém dois valores.
Na memória:
key | valor | tipo |
---|---|---|
nome | João | Cadeia de carateres |
idade | 36 | número inteiro |
Em JSON:
{
"name": "John",
"age": 36
}
Em XML:
<bag>
<name ufx-type="string">John</name>
<age ufx-type="int">36</age>
</bag>
Tipos suportados UFX
Um Pacote UFX pode conter valores de muitos tipos. Estes são categorizadas em 3 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) |
Outros pacotes | bag (Entity) |
Lista de Pacotes | list (EntityCollection) |
Eis um pacote JSON de exemplo que contem 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" }
]
}
O mesmo pacote 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 a Consultas UFX
Consultas UFX são escritas como Pacotes UFX baseados em XML. Propriedades no pacote podem conter Diretivas UFX para consultar dados dinamicamente. Uma Consulta UFX é executada em objetos na memória, não XML. Só as diretivas são escritas em XML. Os seus dados de saída podem ser serializados em JSON ou XML.
A Consulta UFX seguinte define a propriedade accounts
no pacote com a diretiva UFX source
. Isto faz com que o FetchXML inline seja executado pelo Dynamics 365 e que a propriedade accounts
se torne numa lista de pacotes, ou numa EntityCollection
, sendo que cada pacote é uma instância de um registo de 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.
Segue-se um fragmento dos resultados da consulta UFX anterior serializados para XML. Observe que alguns valores têm metadados adicionais que os descrevem.
<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
utiliza uma expressão XPath que seleciona valores do pacote 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>
O pacote resultante em XML:
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
Certamente, o aspeto mais poderoso de uma consulta UFX é a capacidade para gerar dinamicamente FetchXML com base nos dados de entrada.
No exemplo abaixo, vamos procurar contas por um valor fornecido pelo utilizador e disponíveis como um Pacote UFX através da variável $input
XPath. Repare nas diretivas UFX se e valor 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
no pacote de entrada contiver %city%
, a condição FetchXML produzida executada pelo Dynamics 365 teria este aspeto.
<condition attribute="name" operator="like" value="%city%" />
Chaves, valores e metadados
Um Pacote UFX contém chaves e valores, com alguns valores contendo metadados adicionais que os descrevem.
Um exemplo poderá ser um valor de tipo lookup (EntityReference)
. Quando consultado a partir do Dynamics 365 através de FetchXML, apresentará o nome lógico da entidade, bem como o nome a apresentar formatado do registo. O Pacote UFX preserva estas informações adicionais como metadados anexados ao valor primário.
Serializado para JSON, um lookup
com metadados tem o seguinte aspeto:
{
"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 através de dados do Dynamics 365
Ter os dados num Pacote UFX digitado, permite que uma Consulta UFX o veja num formato estruturado e utilizar XPath para percorrer os dados e selecionar os valores do mesmo.
Uma expressão XPath especificada numa diretiva UFX vê os dados no pacote de forma semelhante à estrutura do pacote no formulário serializado XML. No entanto, os dados são armazenados em objetos .NET na memória (em instâncias de tipos Entity
e EntityCollection
) e não em documentos XML.
Apêndice A: referência de tipo UFX
Nota: todos os tipos de UFX suportam os metadados ufx-type
e ufx-formatvalue
. Metadados adicionais são descritos junto de cada tipo na tabela abaixo.
Nome do UFX | Código do Tipo de Atributo | Nome .NET | Metadados UFX |
---|---|---|---|
booleano | Booleano | Booleano | |
número inteiro | Número Inteiro | Int32 | |
longo | BigInt | Int64 | |
duplo | Duplo | Duplo | |
decimal | Decimal | Decimal | |
datetime | DateTime | DateTime | |
guid | Uniqueidentifier | Guid | |
Cadeia de carateres | Memorando | Cadeia | |
dinheiro | Dinheiro | Dinheiro | |
opção | Lista de Opções | OptionSetValue | |
pesquisa | Pesquisa | EntityReference | ufx-logicalname |
pacote | N/D | Entidade | ufx-id ufx-logicalname |
list | N/D | EntityCollection | |
N/D | N/D | AliasedValue | ufx-aliasentity ufx-aliasattribute |
Apêndice B: diretivas de Consulta UFX
Diretivas UFX podem ser utilizadas em propriedades de pacote e em elementos XML de uma consulta FetchXML.
Diretivas de Pacote UFX
Atributo | Value | Descrição |
---|---|---|
ufx:if |
XPath | Testa a expressão XPath e apenas processa a propriedade se o teste devolve verdadeiro |
ufx:source |
fetch |
Executa o elemento XML <fetch> inline e atribui o resultado à propriedade |
ufx:select |
XPath | Executa a expressão XPath e atribui o resultado à propriedade Quando consulta por um bag ou list um bag subordinado opcional em forma XML pode ser especificado para transformar o resultado da expressão XPath |
Diretivas UFX FetchXML
Elemento | Atributo | Value | Descrição |
---|---|---|---|
Todos os elementos | ufx:if |
XPath | Testa a expressão XPath e emite apenas o elemento XML se os testes tiverem êxito |
ufx:apply |
select |
XPath | Repete por cima do conjunto de nós devolvido pela expressão XPath e gera os elementos XML subordinados uma só 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 UFX XPath
UFX adiciona um número de novas funções para além das disponíveis nativamente no XPath.
datetime()
- datetime(): devolve a hora atual em UTC
list()
- list(bag | list, ...[bag | list]): recebe um número de valores
bag
oulist
como entrada e agrega-os numa únicalist
lookup-to-list()
- lookup-to-list(lookup, ...[lookup]): recebe um número de valores
lookup
, converte cada um deles numbag
com o conjunto de metadadosufx-id
eufx-logicalname
, e agrega-os numa únicalist
option-to-list()
- option-to-list(option, ...[option]): recebe um número de valores
option
, converte cada um deles numbag
com uma única propriedadeoption
, e agrega-os numa únicalist
order()
- order(list, string, bool): pede uma lista por uma propriedade de cada pacote. A propriedade é especificada no argumento 2, descendente é especificado no argumento 3.
- order(list, list): pede uma lista por várias ordens de seleção especificadas como uma lista no argumento 2. Cada
bag
na segunda lista pode ter uma propriedadename
edescending
IIf()
- iif(any, any, any): se argumento 1 for verdadeiro, devolve argumento 2, caso contrário, devolve argumento 3
Apêndice D: variáveis UFX XPath
Nome | Descrição |
---|---|
$input | Um bag disponível para a Consulta UFX com valores de entrada |
$null | Uma constante nula. Selecionar $null numa propriedade remove a propriedade do pacote |
$current | Referência ao pacote atual a ser processado pela Consulta UFX |
Consulte também
Noções básicas e personalizar a correspondência de recursos no Universal Resource Scheduling
Notas de versão da extensibilidade do Universal Resource Scheduling