Ampliar Universal Resource Scheduling con Universal FetchXML
UFX es un lenguaje de consulta avanzado que le permite consultar datos utilizando FetchXML dinámico, así como dar forma y preparar los datos resultantes para su uso por la solución Universal Resource Scheduling (URS). Este idioma de consulta le permite crear consultas personalizadas para personalizar y ampliar el tablero de programación y programar filtros del asistente para cumplir con las necesidades de negocio exclusivas de la organización.
UFX consta de dos componentes: contenedor UFX y consulta UFX.
Contenedor UFX simple
Un contenedor UFX contiene datos escritos estáticos. En la memoria, se representa como un diccionario con claves y valores. Se puede serializar con JSON y XML. Disponer de datos escritos permite a una consulta UFX realizar una consulta de datos desde ella y posibilita la vinculación de la interfaz de usuario del cliente con ella.
Por razones prácticas y de rendimiento, el contenedor en memoria se implementa en la parte superior del objeto
Entity
de aplicaciones de Dynamics 365 SDK.
El contenedor de ejemplo contiene dos valores.
En memoria:
tecla | valor | tipo |
---|---|---|
nombre | John | cadena |
edad | 36 | int |
En JSON:
{
"name": "John",
"age": 36
}
En XML:
<bag>
<name ufx-type="string">John</name>
<age ufx-type="int">36</age>
</bag>
Tipos admitidos de UFX
Un contenedor UFX puede disponer de valores de muchos tipos. Se categorizan en tres clases de tipos:
Categoría | valor |
---|---|
Tipos sencillos | bool (Boolean) , int (Int32) , long (Int64) , double (Double) , decimal (Decimal) , datetime (DateTime) , guid (Guid) , string (String) Tipos sencillos específicos de Dynamics 365: money (Money) , option (OptionSet) , lookup (EntityReference) |
Otros contenedores | bag (Entity) |
Lista de contenedores | list (EntityCollection) |
Aquí le mostramos un contenedor JSON de ejemplo que contiene más 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" }
]
}
El mismo contenedor en 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>
Introducción a consultas UFX
Las consultas UFX se escriben como contenedores UFX basados en XML. Las propiedades del contenedor pueden contener directivas UFX para consultar datos dinámicamente. Una consulta UFX se ejecuta en objetos en memoria, no XML. Solo las directivas se escriben en XML. El resultado se puede serializar en JSON o XML.
La siguiente consulta UFX define la propiedad accounts
en el contenedor con la directiva UFX source
. Esto provoca que Dynamics 365 ejecute este resultado en FetchXML en línea y que la propiedad accounts
sea una lista de contenedores, o EntityCollection
, en la que cada contenedor es una instancia de un registro de cuenta de 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>
Se procesa una consulta UFX de forma secuencial y puede contener varias consultas FetchXML.
Aquí se muestra un fragmento del resultado de la consulta UFX anterior serializada en XML. Tenga en cuenta que algunos valores disponen de metadatos además de describirlos.
<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>
La directiva UFX select
toma la expresión de XPath que selecciona valores del contenedor actual.
<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>
El contenedor resultante en XML:
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
Realmente, el aspecto más potente de una consulta UFX es la capacidad de generar dinámicamente FetchXML basado en datos de entrada.
En el ejemplo siguiente, buscamos cuentas por un valor proporcionado por el usuario y se encuentra disponible como contenedor UFX a través de la variable $input
de XPath. Tenga en cuenta las directivas if y value de UFX sobre el 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>
Si la propiedad NameFilter
del contenedor de entrada contenía %city%
, la condición de FetchXML producida ejecutada por Dynamics 365 tendría un aspecto similar a este.
<condition attribute="name" operator="like" value="%city%" />
Claves, valores y metadatos
Un contenedor UFX contiene claves y valores, con algunos valores que disponen de metadatos adicionales que los describen aún más.
Un ejemplo podría ser un valor de tipo lookup (EntityReference)
. Cuando se realice la consulta de Dynamics 365 a través de FetchXML, se devolverá el nombre lógico de la entidad, así como el nombre con formato del registro. El contenedor UFX conserva esta información adicional como metadatos adjuntos al valor principal.
Con la serialización JSON, lookup
con metadatos tendrá el siguiente aspecto:
{
"primarycontactid": "7e6e39dd-34a1-e611-8111-00155d652f01",
"primarycontactid@ufx-type": "lookup",
"primarycontactid@ufx-logicalname": "contact",
"primarycontactid@ufx-formatvalue": "Susanna Stubberod (sample)"
}
En XML:
<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
XPath sobre datos de Dynamics 365
Disponer de los datos escritos en un contenedor UFX permite a la consulta UFX verlos con un formato estructurado y usar XPath para recorrer los datos y seleccionar los valores a partir de ellos.
Una expresión XPath especificada en una directiva UFX comprueba los datos del contenedor que son parecidos a la estructura del contenedor en el formulario con serialización XML. Sin embargo, los datos se almacenan en objetos .NET en memoria (en instancias de tipos Entity
y EntityCollection
) y no en documentos XML.
Apéndice A: Referencia de tipo UFX
Nota: Todos los tipos UFX admiten los metadatos ufx-type
y ufx-formatvalue
. Los metadatos adicionales se describen junto a cada tipo en la siguiente tabla.
Nombre de UFX | Código de tipo de atributo | Nombre de .NET | Metadatos UFX |
---|---|---|---|
bool | Valor booleano | Valor booleano | |
int | Entero | Int32 | |
long | BigInt | Int64 | |
doble | Double | Double | |
decimal | Decimal | Decimal | |
datetime | DateTime | DateTime | |
guid | Uniqueidentifier | Guid | |
cadena | Memorando | String | |
money | Dinero | Dinero | |
opción | Picklist | OptionSetValue | |
búsqueda | Búsqueda | EntityReference | ufx-logicalname |
bag | N/D | Entity | ufx-id ufx-logicalname |
lista | N/D | EntityCollection | |
N/D | N/D | AliasedValue | ufx-aliasentity ufx-aliasattribute |
Apéndice B: Directivas de consulta UFX
Las directivas UFX se pueden usar en las propiedades del contenedor y en elementos XML de una consulta de FetchXML.
Directivas de contenedor UFX
Atributo | Value | Descripción |
---|---|---|
ufx:if |
XPath | Realiza una prueba de la expresión XPath y solo procesa la propiedad si la prueba devuelve true. |
ufx:source |
fetch |
Ejecuta el elemento XML <fetch> en línea y asigna el resultado a la propiedad. |
ufx:select |
XPath | Ejecuta la expresión XPath y asigna el resultado a la propiedad. Cuando se realiza una consulta para bag o list , puede especificarse un elemento secundario opcional bag con formato XML para transformar el resultado de la expresión XPath. |
Directivas FetchXML UFX
Elemento | Atributo | Value | Descripción |
---|---|---|---|
Todos los elementos | ufx:if |
XPath | Realiza una prueba de la expresión XPath y solo emite el elemento XML si las pruebas son correctas |
ufx:apply |
select |
XPath | Recorre en bucle el conjunto de nodos devuelto por la expresión XPath y genera los elementos XML secundarios una vez para cada nodo. |
ufx:value |
select |
XPath | Ejecuta la expresión XPath y genera el resultado en el elemento XML actual. |
ufx:value |
attribute |
nombre de atributo | Asigna el resultado de la expresión XPath al nombre de atributo especificado en el elemento XML actual. |
Apéndice C: Funciones XPath UFX
UFX agrega un número de funciones nuevas además de las ya disponibles de forma nativa en XPath.
datetime()
- datetime(): devuelve la hora actual en UTC.
list()
- list(bag | list, ...[bag | list]): toma un número de valores
bag
olist
como entrada y los aplana en una únicalist
.
lookup-to-list()
- lookup-to-list(lookup, ...[lookup]): toma un número de valores
lookup
, los convierte en unbag
con el conjunto de metadatosufx-id
yufx-logicalname
y los aplana en una únicalist
.
option-to-list()
- option-to-list(option, ...[option]): toma un número de valores
option
, los convierte en unbag
con una única propiedadoption
y los aplana en una únicalist
.
order()
- order(list, string, bool): ordena una lista por propiedad en cada contenedor. La propiedad se especifica en el argumento 2. La propiedad descending se especifica en el argumento 3.
- order(list, list): ordena una lista por varios criterios de ordenación especificados como una lista en el argumento 2. Cada
bag
de la segunda lista puede tener una propiedadname
anddescending
.
iif()
- iif(any, any, any): si el argumento 1 es true, devuelve el argumento 2. De lo contrario, devuelve el argumento 3.
Apéndice D: Variables de XPath UFX
Nombre | Descripción |
---|---|
$input | Un bag disponible para la consulta UFX con valores de entrada. |
$null | Una constante nula. Si selecciona $null en una propiedad, se quita la propiedad del contenedor. |
$current | Referencia al contenedor actual que procesa la consulta UFX. |
Consultar también
Comprensión y personalización de la coincidencia del recurso en Universal Resource Scheduling
Notas de la versión de extensibilidad de Universal Resource Scheduling