Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Universal FetchXML (UFX) é uma linguagem de consulta avançada que permite consultar dados usando FetchXML dinâmico, formatar e preparar os dados resultantes para consumo pela solução Universal Resource Scheduling (URS). Essa linguagem de consulta permite que você crie consultas personalizadas para personalizar e estender o painel de agendamento e os filtros do assistente de agendamento para atender às necessidades comerciais exclusivas da organização.
O UFX consiste em dois componentes: UFX bag e UFX query.
Bolsa UFX simples
Uma bolsa UFX contém dados de tipo estático. Na memória, ele modela um dicionário com chaves e valores. Ele pode ser serializado para JSON e XML. Ter os dados digitados permite que uma consulta UFX consulte dados dele e a interface do usuário do cliente se associe a ele.
Por motivos práticos e de desempenho, o pacote na memória é implementado sobre o objeto SDK Entity dos aplicativos do Dynamics 365.
Saco de amostras contendo dois valores.
Na memória:
| chave | valor | tipo |
|---|---|---|
| nome | John | cadeia |
| 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 suportados pela UFX
Uma bolsa UFX pode conter valores de vários 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 bolsas | bag (Entity) |
| Lista de Bolsas | list (EntityCollection) |
Aqui está um exemplo de pacote 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" }
]
}
O mesmo saco 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>
Consultas UFX
As consultas UFX são gravadas como UFX Bags baseadas em XML. As propriedades no repositório podem conter diretivas UFX para consultar dados dinamicamente. Uma consulta UFX é executada em objetos na memória, não em 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 accounts propriedade no recipiente com a source diretiva UFX. Como resultado, o Dynamics 365 executa o FetchXML embutido, preenchendo a accounts propriedade com uma lista de recipientes. Um EntityCollection em que cada recipiente representa um registro de conta individual 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.
Aqui está um trecho do resultado da consulta UFX anterior serializada para XML. Observe que alguns valores têm metadados que os descrevem melhor.
<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 select diretiva UFX usa uma expressão XPath que seleciona valores do recipiente 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 saco 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 dinamicamente FetchXML com base nos dados de entrada.
No exemplo a seguir, pesquisamos contas por um valor fornecido pelo usuário e disponível como uma bolsa UFX por meio da variável XPath $input . Observe as diretivas if e value da UFX no condition elemento.
<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 NameFilter propriedade no recipiente 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
Um saco UFX contém chaves e valores, onde alguns valores têm mais metadados para descrevê-los.
Um exemplo pode ser um valor do tipo lookup (EntityReference). Quando consultado do Dynamics 365 por meio do FetchXML, ele retorna o nome lógico da entidade e o nome de exibição formatado do registro. O saco UFX preserva essas informações adicionais como metadados anexados ao valor primário.
Serializado para JSON, um lookup com metadados tem esta aparência:
{
"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 um UFX Bag digitados permite que uma consulta UFX os veja em um formato estruturado e use XPath para percorrer os dados e selecionar valores deles.
Uma expressão XPath especificada em uma diretiva UFX vê os dados no repositório semelhante à estrutura do repositório no formato serializado em XML. No entanto, os dados são armazenados em objetos .NET na memória (em instâncias de Entity e EntityCollection tipos) e não em documentos XML.
Referência de tipo UFX
Todos os tipos UFX suportam os ufx-type metadados e ufx-formatvalue . Metadados adicionais são descritos ao lado de cada tipo.
| Nome UFX | Código do tipo de atributo | Nome do .NET | Metadados UFX |
|---|---|---|---|
| Bool | booleano | booleano | |
| int | Número Inteiro | Int32 | |
| Longas | BigInt | Int64 | |
| duplo | Duplo | Duplo | |
| decimal | Decimal | Decimal | |
| datetime | Data e Hora | Data e Hora | |
| Guid | Identificador exclusivo | GUID | |
| cadeia | Memorando | fio | |
| dinheiro | Quantia | Quantia | |
| Opção | Lista de seleção | Valor do Conjunto de Opções | |
| pesquisa | Busca | EntityReference | ufx-logicalname |
| saco | Não aplicável | Entidade | ufx-idufx-logicalname |
| lista | Não aplicável | Coleção de entidades | |
| Não aplicável | Não aplicável | AliasedValue | ufx-aliasentityufx-aliasattribute |
Diretivas de consulta UFX
As diretivas UFX podem ser usadas em propriedades de recipiente e em elementos XML de uma consulta FetchXML.
Diretivas de bolsas UFX
| Atributo | Valor | Descrição |
|---|---|---|
ufx:if |
XPath | Testa a expressão XPath e só processa a propriedade se o teste retornar true |
ufx:source |
fetch |
Executa o elemento XML embutido <fetch> e atribui o resultado à propriedade |
ufx:select |
XPath | Executa a expressão XPath e atribui o resultado à propriedade Ao consultar um bag ou list um filho bag opcional no formato XML pode ser especificado para transformar o resultado da expressão XPath |
Diretivas UFX FetchXML
| Elemento | Atributo | Valor | Descrição |
|---|---|---|---|
| Todos os elementos | ufx:if |
XPath | Testa a expressão XPath e só emite o elemento XML se os testes forem bem-sucedidos |
ufx:apply |
select |
XPath | Executa loops 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 |
Funções do UFX XPath
O UFX adiciona muitas novas funções além das disponíveis nativamente no XPath.
datetime()
- datetime(): Retorna a hora atual em UTC
lista()
- lista(saco | lista, ... [bag | list]): Pega um número de valores or
baglistcomo entrada e os nivela em um únicolist
procurar-para-lista()
- procurar-para-list(pesquisar, ... [lookup]): pega vários
lookupvalores, converte cada um deles em umbagcom oufx-idconjunto de metadados eufx-logicalnameos nivela em um únicolist
opção para listar()
- opção para listar(opção, ... [option]): pega vários
optionvalores, converte cada um deles em umbagcom uma únicaoptionpropriedade e os nivela em um únicolist
ordem()
- order(list, string, bool): ordena uma lista por uma propriedade em cada saco. A propriedade é especificada no argumento 2, a decrescente é especificada no argumento 3.
- order(list, list): ordene uma lista por várias ordens de classificação especificadas como uma lista no argumento 2. Cada
bagum na segunda lista pode ter umanamepropriedade edescending
iif()
- iif(qualquer, qualquer, qualquer): Se o argumento 1 for verdadeiro, retorna o argumento 2, caso contrário, retorna o argumento 3
Variáveis UFX XPath
| Nome | Descrição |
|---|---|
| $input | A bag disponível para a consulta UFX com valores de entrada |
| $null | Uma constante nula. Selecionar $null uma propriedade remove a propriedade do recipiente |
| $current | Referência ao recipiente atual que a consulta UFX está processando |
Recursos adicionais
Noções básicas e personalização da correspondência de recursos no Universal Resource Scheduling