Udvide Universal Resource Scheduling med Universal FetchXML
UFX er et avanceret forespørgselssprog, som gør det muligt at forespørge om data ved hjælp af dynamisk FetchXML og tilpasse og forberede dataene til forbrug af løsningen Universal Resource Scheduling (URS). Med dette forespørgselssprog kan du oprette brugerdefinerede forespørgsler for at tilpasse og udvide planlægningsområde- og planlægningsassistentfiltre, så de stemmer overens med organisationens særlige forretningsbehov.
UFX består af to komponenter, UFX-beholder (UFX Bag) og UFX-forespørgsel (UFX Query).
Simpel UFX-beholder
En UFX-beholder indeholder statiske indtastede data. I hukommelsen repræsenteres den som et katalog med nøgler og værdier. Den kan serialiseres til JSON og XML. Fordi dataene kan indtastes, kan UFX-forespørgsel forespørge om data fra den, og brugergrænsefladen (UI ) i klienten kan oprette binding til den.
Af praktiske årsager og af hensyn til ydeevnen implementeres beholderen i hukommelsen oven på SDK
Entity
-objektet i Dynamics 365-apps.
Eksempel på beholder, der indeholder to værdier.
I hukommelsen:
key | værdi | type |
---|---|---|
name (navn) | John | string (streng) |
age (alder) | 36 | int (heltal) |
I JSON:
{
"name": "John",
"age": 36
}
I XML:
<bag>
<name ufx-type="string">John</name>
<age ufx-type="int">36</age>
</bag>
UFX-understøttede typer
En UFX-beholder kan indeholde mange forskellige typer værdier. De kategoriseres i tre typeklasser:
Kategori | Værdi |
---|---|
Simple typer | bool (Boolean) , int (Int32) , long (Int64) , double (Double) , decimal (Decimal) , datetime (DateTime) , guid (Guid) , string (String) Specifikke simple typer for Dynamics 365: money (Money) , option (OptionSet) , lookup (EntityReference) |
Andre beholdere | bag (Entity) |
Liste over beholdere | list (EntityCollection) |
Her er et eksempel på en JSON-beholder, der indeholder flere typer:
{
"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" }
]
}
Den samme beholder i XML-format:
<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>
Introduktion til UFX Queries
UFX-forespørgsler skrives som XML-baserede UFX-beholdere. Beholderen kan have egenskaber som UFX direktiver, som gør det muligt at hente data dynamisk. En UFX-forespørgsel køres på objekter i hukommelsen, ikke XML. Kun direktiverne skrives i XML-format. Outputtet kan serialiseres til JSON eller XML.
Følgende UFX-forespørgsel definerer accounts
-egenskaben i beholderen med source
UFX-direktivet. Dette medfører, at den indbyggede FetchXML udføres af Dynamics 365 og accounts
-egenskaben bliver en liste over beholdere eller en EntityCollection
, hvor de enkelte beholdere er en forekomst af en firmapost fra 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>
En UFX-forespørgsel behandles sekventielt og kan indeholde mange FetchXML-forespørgsler.
Her er et kodestykke fra resultatet af den forrige UFX-forespørgsel serialiseret til XML. Bemærk, at nogle værdier har metadata, der beskriver dem yderligere.
<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>
UFX-direktivet select
tager et XPath-udtryk, der vælger værdier fra den aktuelle beholder.
<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>
Den beholder, der oprettes, i XML-format:
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
Den mest effektive egenskab ved en UFX-forespørgsel er uden tvivl evnen til dynamisk at generere FetchXML baseret på inputdata.
I eksemplet nedenfor søger vi efter firmaer ud fra en værdi, der er angivet af brugeren, og som er tilgængelig som en UFX-beholder via XPath $input
-variablen. Bemærk UFX if og value direktiverne i condition
-elementet.
<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>
Hvis NameFilter
-egenskaben i inputbeholderen indeholdt %city%
, ville den producerede FetchXML-betingelse, der blev udført af Dynamics 365, se således ud.
<condition attribute="name" operator="like" value="%city%" />
Nøgler, værdier og metadata
En UFX-beholder indeholder nøgler og værdier, hvor nogle værdier har yderligere metadata, der beskriver dem yderligere.
Et eksempel kan være en værdi af typen lookup (EntityReference)
. Når der forespørges fra Dynamics 365 via FetchXML, returneres det logiske navn på objektet samt det formaterede viste navn på posten. UFX-beholderen gemmer disse yderligere oplysninger som metadata, der er knyttet til den primære værdi.
Når et lookup
med metadata serialiseres til JSON, ser det sådan ud:
{
"primarycontactid": "7e6e39dd-34a1-e611-8111-00155d652f01",
"primarycontactid@ufx-type": "lookup",
"primarycontactid@ufx-logicalname": "contact",
"primarycontactid@ufx-formatvalue": "Susanna Stubberod (sample)"
}
I XML:
<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
XPath over Dynamics 365-data
Når dataene i en UFX-beholder indtastes, kan en UFX-forespørgsel se dem i et struktureret format og bruge XPath til at gennemgå dataene og vælge værdier fra dem.
For et XPath-udtryk, der er angivet i et UFX-direktiv, ser dataene i beholderen ud på samme måde som strukturen af beholderen i XML-serialiseret form. Men data gemmes i hukommelsen i .NET objekter (i forekomster af Entity
og EntityCollection
typer) og ikke i XML-dokumenter.
Tillæg A: reference af UFX-typen
Bemærk: Alle UFX-typer understøtter ufx-type
og ufx-formatvalue
metadata. Yderligere metadata er beskrevet ud for hver type i tabellen nedenfor.
UFX-navn | Kode for attributtype | .NET-navn | UFX-metadata |
---|---|---|---|
bool | Boolesk værdi | Boolesk værdi | |
heltal | Heltal | Int32 | |
long | BigInt | Int64 | |
dobbelt | Dobbelt | Dobbelt | |
decimal | Decimal | Decimal | |
dato/klokkeslæt | DateTime | DateTime | |
guid | Uniqueidentifier | Guid | |
streng | Notat | Streng | |
penge | Penge | Penge | |
indstilling | Valglisteattributter | OptionSetValue | |
opslag | Opslag | EntityReference | ufx-logicalname |
bag | I/T | Objekt | ufx-id ufx-logicalname |
liste | I/T | EntityCollection | |
I/T | I/T | AliasedValue | ufx-aliasentity ufx-aliasattribute |
Tillæg B: UFX-forespørgselsdirektiv
UFX-direktiver kan bruges til beholderegenskaber og i XML-elementer i en FetchXML-forespørgsel.
UFX-beholderdirektiver
Attribut | Værdi | Beskrivelse |
---|---|---|
ufx:if |
XPath | Tester XPath-udtrykket og behandler kun egenskaben, hvis testen returnerer true |
ufx:source |
fetch |
Kører det indbyggede <fetch> XML-element og tildeler resultatet til egenskaben |
ufx:select |
XPath | Kører XPath-udtrykket og tildeler resultatet til egenskaben Når der forespørges om en bag eller list , kan en valgfri underordnet bag i XML-format angives til transformering af resultatet af XPath-udtrykket |
UFX FetchXML-direktiver
Element | Attribut | Value | Beskrivelse |
---|---|---|---|
Alle elementer | ufx:if |
XPath | Tester XPath-udtrykket og udsender kun XML-elementet, hvis testene lykkes |
ufx:apply |
select |
XPath | Gentages over det nodesæt, der returneres af XPath-udtrykket, og leverer output i form af underordnede XML-elementer én gang for hver node |
ufx:value |
select |
XPath | Udfører XPath-udtryk og viser resultatet i det aktuelle XML-element |
ufx:value |
attribute |
attribute name | Tildeler resultatet af XPath-udtrykket til det angivne attributnavn i det aktuelle XML-element |
Tillæg C: UFX XPath-funktioner
UFX tilføjer en række nye funktioner ud over dem, der er indbygget i XPath.
datetime()
- datetime(): returnerer det aktuelle tidspunkt i UTC
list()
- list(bag | list, ...[bag | list]): Benytter en række
bag
- ellerlist
-værdier som input og komprimerer dem til en enkeltlist
lookup-to-list()
- lookup-to-list(lookup, ...[lookup]): Benytter en række
lookup
-værdier, konverterer dem til enbag
med metadatasætteneufx-id
ogufx-logicalname
og komprimerer dem til en enkeltlist
option-to-list()
- option-to-list(option, ...[option]): Benytter en række
option
-værdier, konverterer hver af dem til enbag
med en enkeltoption
-egenskab og komprimerer dem til en enkeltlist
order()
- order(list, string, bool): Arrangerer en liste efter en egenskab i hver beholder. Egenskaben er angivet i argument 2, faldende er angivet i argument 3.
- order(list, list): Sorterer en liste i flere sorteringsrækkefølger, der er angivet som en liste i argument 2. Hver
bag
i den anden liste kan have enname
ogdescending
egenskab
iif()
- iif(any, any, any): Hvis argument 1 er true, returneres argument 2, ellers returneres argument 3
Tillæg D: UFX XPath-variabler
Navn | Beskrivelse |
---|---|
$input | En bag , der er tilgængelig for UFX-forespørgslen med inputværdier |
$null | En null-konstant. Hvis du vælger $null i en egenskab, fjernes egenskaben fra beholderen |
$current | Reference til den aktuelle beholder, der behandles af UFX-forespørgslen |
Se også
Forstå og tilpasse brugerdefineret ressourcematchning i Universal Resource Scheduling
Produktbemærkninger til Mulighed for udvidelse af Universal Resource Scheduling