Universal Resource Scheduling uitbreiden met Universeel FetchXML
UFX is een geavanceerde querytaal waarmee u query's op gegevens kunt uitvoeren op basis van dynamische FetchXML en de resulterende gegevens voor verbruik kunt vormen en voorbereiden voor gebruik door de oplossing URS (Universal Resource Scheduling). Met deze querytaal kunt u aangepaste query's maken om de planbord- en planningsassistentfilters uit te breiden om te voldoen aan de unieke zakelijke behoeften van de organisatie.
UFX bestaat uit twee componenten: UFX-verzameling en UFX-query.
Eenvoudige UFX-verzameling
Een UFX-verzameling bevat statische getypte gegevens. In het geheugen wordt dit weergegeven als een woordenboek met sleutels en waarden. Het kan naar JSON en XML worden geserialiseerd. Omdat de gegevens getypt zijn, kan er een UFX-query op de gegevens worden uitgevoerd en kan er client-UI aan worden gebonden.
Uit praktische overwegingen en omwille van de prestaties wordt de verzameling in het geheugen geïmplementeerd naast het SDK-object
Entity
van de Dynamics 365-apps.
Voorbeeldverzameling met twee waarden.
In geheugen:
key | waarde | type |
---|---|---|
naam | Johan | tekenreeks |
age | 36 | geheel getal (int) |
In JSON:
{
"name": "John",
"age": 36
}
In XML:
<bag>
<name ufx-type="string">John</name>
<age ufx-type="int">36</age>
</bag>
Door UFX ondersteunde typen
Een UFX-verzameling kan waarden van vele typen bevatten. Deze zijn gecategoriseerd in drie typeklassen:
Categorie | Weergegeven als |
---|---|
Eenvoudige typen | bool (Boolean) , int (Int32) , long (Int64) , double (Double) , decimal (Decimal) , datetime (DateTime) , guid (Guid) , string (String) Specifieke eenvoudige typen voor Dynamics 365: money (Money) , option (OptionSet) , lookup (EntityReference) |
Andere verzamelingen | bag (Entity) |
Lijst met verzamelingen | list (EntityCollection) |
Hier volgt een voorbeeld van een JSON-verzameling met meer typen:
{
"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" }
]
}
Dezelfde verzameling in 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>
Inleiding tot UFX-query's
UFX-query's worden geschreven als op XML gebaseerde UFX-verzamelingen. Eigenschappen in de verzameling kunnen UFX-richtlijnen bevatten om dynamisch query's op gegevens uit te voeren. Een UFX-query wordt uitgevoerd op objecten in het geheugen, niet op XML. Alleen de richtlijnen worden geschreven in XML. De uitvoer kan naar JSON of XML worden geserialiseerd.
Met de volgende UFX-query wordt de eigenschap accounts
in de verzameling gedefinieerd met de UFX-richtlijn source
. Dit leidt ertoe dat de inline FetchXML wordt uitgevoerd door Dynamics 365 en de eigenschap accounts
een lijst met verzamelingen wordt of een EntityCollection
, waarbij elke verzameling een exemplaar van een accountrecord uit Dynamics 365 is.
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
<accounts ufx:source="fetch">
<fetch top="10">
<entity name="account" />
</fetch>
</accounts>
</bag>
Een UFX-query wordt op volgorde verwerkt en kan veel FetchXML-query's bevatten.
Hier is een fragment van het resultaat van de vorige naar XML geserialiseerde UFX-query. Naast sommige waarden worden nog metagegevens weergegeven.
<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>
De UFX-richtlijn select
gebruikt een XPath-expressie waarmee waarden uit de huidige verzameling worden geselecteerd.
<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>
De resulterende verzameling in XML:
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
Het krachtigste aspect van een UFX-query is het vermogen om dynamisch FetchXML te genereren op basis van invoergegevens.
In het onderstaande voorbeeld zoeken we naar accounts op basis van een waarde die door de gebruiker is opgegeven en als UFX-verzameling beschikbaar is via de XPath-variabele $input
. Let op de UFX-richtlijnen if en value in het element 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>
Als de eigenschap NameFilter
in de invoerverzameling %city%
bevatte, zou de geproduceerde FetchXML-voorwaarde die door Dynamics 365 wordt uitgevoerd er als volgt uitzien.
<condition attribute="name" operator="like" value="%city%" />
Sleutels, waarden en metagegevens
Een UFX-verzameling bevat sleutels en waarden, waarbij sommige waarden extra metagegevens bevatten waarin deze gegevens verder worden beschreven.
Een voorbeeld kan een waarde van het type lookup (EntityReference)
zijn. Wanneer vanuit Dynamics 365 via FetchXML een query wordt uitgevoerd, wordt de logische naam van de entiteit en de opgemaakte weergavenaam van de record geretourneerd. In de UFX-verzameling worden deze aanvullende gegevens bewaard als metagegevens die aan de primaire waarde zijn gekoppeld.
Geserialiseerd naar JSON ziet een lookup
met metagegevens er als volgt uit:
{
"primarycontactid": "7e6e39dd-34a1-e611-8111-00155d652f01",
"primarycontactid@ufx-type": "lookup",
"primarycontactid@ufx-logicalname": "contact",
"primarycontactid@ufx-formatvalue": "Susanna Stubberod (sample)"
}
In XML:
<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
XPath via Dynamics 365-gegevens
Omdat de gegevens in een UFX-verzameling getypt zijn, kunnen deze met een UFX-query in een gestructureerde indeling worden weergegeven en worden doorlopen om hier waarden in te selecteren.
Bij een XPath-expressie opgegeven in een UFX-richtlijn lijken de gegevens in de verzameling op de structuur van de verzameling in XML-geserialiseerde vorm. De gegevens worden echter opgeslagen in .NET-objecten in het geheugen (in exemplaren van van de typen Entity
en EntityCollection
) en niet in XML-documenten.
Bijlage A: UFX-typen
Opmerking: alle UFX-typen ondersteunen de metagegevens ufx-type
en ufx-formatvalue
. Extra metagegevens worden naast elk type in de onderstaande tabel beschreven.
UFX-naam | Code kenmerktype | .NET-naam | UFX-metagegevens |
---|---|---|---|
bool | Boole-waarde | Boole-waarde | |
geheel getal (int) | Geheel getal | Int32 | |
long | BigInt | Int64 | |
dubbel | Double | Double | |
decimaal | Decimaal | Decimaal | |
datum/tijd (datetime) | DateTime | DateTime | |
guid | Uniqueidentifier | GUID | |
tekenreeks | Memo | Tekenreeks | |
valuta (money) | Geld | Geld | |
optie | Selectielijst | OptionSetValue | |
opzoeken | Opzoekveld | EntityReference | ufx-logicalname |
bag | N.v.t. | Entiteit | ufx-id ufx-logicalname |
lijst | N.v.t. | EntityCollection | |
N.v.t. | N.v.t. | AliasedValue | ufx-aliasentity ufx-aliasattribute |
Bijlage B: Richtlijnen voor UFX-query's
UFX-richtlijnen kunnen worden gebruikt voor verzamelingseigenschappen en in XML-elementen van een FetchXML-query.
UFX-verzamelingsrichtlijnen
kenmerk | Value | Beschrijving |
---|---|---|
ufx:if |
XPath | Hiermee wordt de XPath-expressie getest en wordt de eigenschap alleen verwerkt als de test de waarde true retourneert |
ufx:source |
fetch |
Hiermee wordt het inline XML-element <fetch> uitgevoerd en wordt het resultaat toegewezen aan de eigenschap |
ufx:select |
XPath | Hiermee wordt de XPath-expressie uitgevoerd en wordt het resultaat toegewezen aan de eigenschap Wanneer u een query wilt uitvoeren op een bag of list , kan een optionele onderliggende bag in XML-vorm worden opgegeven om het resultaat van de XPath-expressie te transformeren |
UFX FetchXML-richtlijnen
Element | kenmerk | Value | Beschrijving |
---|---|---|---|
Alle elementen | ufx:if |
XPath | Hiermee wordt de XPath-expressie getest en wordt het XML-element alleen uitgegeven als de test slaagt |
ufx:apply |
select |
XPath | Hiermee wordt een lusbewerking uitgevoerd voor de knooppuntenset die wordt geretourneerd door de XPath-expressie en worden voor elk knooppunt één keer de onderliggende XML-elementen geretourneerd |
ufx:value |
select |
XPath | Hiermee wordt de XPath-expressie uitgevoerd en wordt het resultaat uitgevoerd in het huidige XML-element |
ufx:value |
attribute |
kenmerknaam | Hiermee wordt het XPath-expressieresultaat toegewezen aan de opgegeven kenmerknaam voor het huidige XML-element |
Bijlage C: UFX XPath-functies
UFX voegt een aantal nieuwe functies toe naast de native XPath-functies.
datetime()
- datetime(): retourneert de huidige tijd in UTC
list()
- list(bag | list, ...[bag | list]): hiermee wordt een aantal waarden voor
bag
oflist
als invoer gebruikt en worden deze opgenomen in éénlist
lookup-to-list()
- lookup-to-list(lookup, ...[lookup]): hiermee wordt een aantal waarden voor
lookup
gebruikt, wordt elk geconverteerd naar eenbag
met de ingestelde metagegevensufx-id
enufx-logicalname
en worden ze platgemaakt in éénlist
option-to-list()
- option-to-list(option, ...[option]): hiermee wordt een aantal waarden voor
option
gebruikt, wordt elk geconverteerd naar eenbag
met één eigenschapoption
en worden ze platgemaakt in éénlist
order()
- order(list, string, bool): hiermee wordt een lijst gesorteerd op een eigenschap in elke verzameling. De eigenschap wordt opgegeven in argument 2, aflopend wordt opgegeven in argument 3.
- order(list, list): sorteer een lijst op meerdere sorteervolgordes opgegeven als een lijst in argument 2. Elke
bag
in de tweede lijst kan een eigenschapdescending
enname
hebben
iif()
- iif(any, any, any): als argument 1 true is, wordt argument 2 geretourneerd en anders argument 3
Bijlage D: UFX XPath-variabelen
Naam | Beschrijving |
---|---|
$input | Een beschikbare bag voor de UFX-query met invoerwaarden |
$null | Een null-constante. Wanneer $null voor een eigenschap wordt geselecteerd, wordt de eigenschap uit de verzameling verwijderd |
$current | Verwijzing naar de huidige verzameling die door de UFX-query wordt verwerkt |
Zie ook
Vergelijken van resources in Universal Resource Scheduling begrijpen en aanpassen
Releaseopmerkingen voor Universal Resource Scheduling-uitbreidbaarheid