Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Universal FetchXML (UFX) is een geavanceerde querytaal waarmee u query's kunt uitvoeren op gegevens met behulp van dynamische FetchXML, vorm en de resulterende gegevens kunt voorbereiden voor gebruik door de Universal Resource Scheduling (URS) -oplossing. Met deze querytaal kunt u aangepaste query's maken om het planbord en de planningsassistentfilters aan te passen en uit te breiden om te voldoen aan de unieke zakelijke behoeften van de organisatie.
UFX bestaat uit twee componenten: UFX, bag en UFX-query.
Eenvoudige UFX tas
Een UFX-tas bevat statisch getypeerde gegevens. In het geheugen modelleert het een woordenboek met sleutels en waarden. Het kan worden geserialiseerd naar JSON en XML. Als de gegevens worden getypt, kan een UFX-query er gegevens uit opvragen en kan de gebruikersinterface van de client eraan binden.
Om praktische en prestatieredenen is de in-memory bag geïmplementeerd bovenop het Dynamics 365 apps SDK-object Entity .
Monsterzakje met twee waarden.
Ter nagedachtenis:
| sleutel | waarde | soort |
|---|---|---|
| naam | John | touw |
| leeftijd | 36 | int (integer) |
In JSON:
{
"name": "John",
"age": 36
}
In XML:
<bag>
<name ufx-type="string">John</name>
<age ufx-type="int">36</age>
</bag>
UFX ondersteunde typen
Een UFX-tas kan vele soorten waarden bevatten. Ze zijn onderverdeeld in drie typeklassen:
| Categorie | Waarde |
|---|---|
| Eenvoudige typen |
bool (Boolean), , int (Int32)long (Int64), double (Double), , decimal (Decimal), , datetime (DateTime)guid (Guid)string (String)Dynamics 365-specifieke eenvoudige typen: money (Money), option (OptionSet), lookup (EntityReference) |
| Andere tassen | bag (Entity) |
| Lijst van tassen | list (EntityCollection) |
Hier is een voorbeeld van een JSON-tas met meer soorten:
{
"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 tas 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>
UFX-query's
UFX-query's worden geschreven als XML-gebaseerde UFX-tassen. Eigenschappen in de tas kunnen UFX-richtlijnen bevatten om gegevens dynamisch op te vragen. Een UFX-query wordt uitgevoerd op objecten in het geheugen, niet op XML. Alleen de directives zijn geschreven in XML. De uitvoer kan worden geserialiseerd naar JSON of XML.
De volgende UFX-query definieert de accounts eigenschap in de tas met de source UFX-richtlijn. Als gevolg hiervan voert Dynamics 365 de inline FetchXML uit, waarbij de accounts eigenschap wordt gevuld met een lijst met tassen. Een EntityCollection waarbij elke zak een individuele accountrecord van Dynamics 365 vertegenwoordigt.
<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 opeenvolgend verwerkt en kan veel FetchXML-query's bevatten.
Hier is een fragment van het resultaat van de vorige UFX-query die is geserialiseerd naar XML. Merk op dat sommige waarden metagegevens hebben die ze verder beschrijven.
<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 select UFX-richtlijn neemt een XPath-expressie aan die waarden uit de huidige tas selecteert.
<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 zak in XML:
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
Het krachtigste aspect van een UFX-query is ongetwijfeld de mogelijkheid om dynamisch FetchXML te genereren op basis van invoergegevens.
In het volgende voorbeeld zoeken we naar accounts op basis van een waarde die door de gebruiker is opgegeven en beschikbaar is als een UFX-tas via de XPath-variabele $input . Let op de UFX als en waarderichtlijnen op het condition element.
<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 NameFilter eigenschap in de invoerzak de geproduceerde FetchXML-voorwaarde bevatte %city% die door Dynamics 365 werd uitgevoerd, ziet deze er als volgt uit.
<condition attribute="name" operator="like" value="%city%" />
Sleutels, waarden en metagegevens
Een UFX-tas bevat sleutels en waarden, waarbij sommige waarden meer metadata hebben om ze te beschrijven.
Een voorbeeld hiervan is een waarde van het type lookup (EntityReference). Wanneer er vanuit Dynamics 365 via FetchXML wordt opgevraagd, worden de logische naam van de entiteit en de opgemaakte weergavenaam van de record geretourneerd. De UFX-tas bewaart deze aanvullende informatie 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 over Dynamics 365-gegevens
Als u de gegevens in een UFX-tas typt, kan een UFX-query deze in een gestructureerd formaat bekijken en XPath gebruiken om de gegevens te doorkruisen en er waarden uit te selecteren.
Een XPath-expressie die is opgegeven in een UFX-instructie, ziet de gegevens in de zak die vergelijkbaar zijn met de structuur van de zak in XML-geserialiseerde vorm. De gegevens worden echter opgeslagen in .NET-objecten in het geheugen (in instanties van Entity en EntityCollection typen) en niet in XML-documenten.
Referentie UFX-type
Alle UFX-typen ondersteunen de ufx-type en ufx-formatvalue metadata. Aanvullende metagegevens worden naast elk type beschreven.
| UFX-naam | Attribuut Type Code | .NET-naam | UFX-metagegevens |
|---|---|---|---|
| Bool | Booleaan | Booleaan | |
| int (integer) | Geheel getal | Int32 | |
| lang | Groot | Int64 | |
| dubbel | Dubbel | Dubbel | |
| decimaal | Decimaal | Decimaal | |
| datum/tijd | Datum/tijd | Datum/tijd | |
| Richtlijn | Unieke identificatiecode | Guid | |
| touw | Notitie | Snaar / Touwtje | |
| geld | Geld | Geld | |
| optie | Keuzelijst | OptionSetValue | |
| Lookup | Opzoeken | EntityReference | ufx-logicalname |
| zak | Niet van toepassing. | Entiteit | ufx-idufx-logicalname |
| lijst | Niet van toepassing. | Entiteit Collectie | |
| Niet van toepassing. | Niet van toepassing. | AliasedValue | ufx-aliasentityufx-aliasattribute |
UFX-query-instructies
UFX-richtlijnen kunnen worden gebruikt voor zakeigenschappen en voor XML-elementen van een FetchXML-query.
Richtlijnen voor UFX-tassen
| Eigenschap | Waarde | Beschrijving |
|---|---|---|
ufx:if |
XPath | Test de XPath-expressie en verwerkt de eigenschap alleen als de test true retourneert |
ufx:source |
fetch |
Voert het inline <fetch> XML-element uit en wijst het resultaat toe aan de eigenschap |
ufx:select |
XPath | Voert de XPath-expressie uit en wijst het resultaat toe aan de eigenschap Wanneer een query wordt uitgevoerd op een bag of list een optioneel onderliggend element bag in XML-vorm kan worden opgegeven om het resultaat van de XPath-expressie te transformeren |
UFX FetchXML-richtlijnen
| Onderdeel | Eigenschap | Waarde | Beschrijving |
|---|---|---|---|
| Alle elementen | ufx:if |
XPath | Test de XPath-expressie en zendt het XML-element alleen uit als de tests slagen |
ufx:apply |
select |
XPath | Loops over de nodeset die wordt geretourneerd door de XPath-expressie en voert de onderliggende XML-elementen één keer uit voor elk knooppunt |
ufx:value |
select |
XPath | Voert de XPath-expressie uit en voert het resultaat uit in het huidige XML-element |
ufx:value |
attribute |
Naam van het kenmerk | Wijst het resultaat van de XPath-expressie toe aan de opgegeven kenmerknaam op het huidige XML-element |
UFX XPath-functies
UFX voegt veel nieuwe functies toe naast de functies die native beschikbaar zijn in XPath.
datum/tijd()
- datetime(): geeft als resultaat de huidige tijd in UTC
lijst()
- lijst(tas | lijst, ... [bag | lijst]): Neemt een aantal
bagof-waardenlistals invoer en vlakt ze af tot éénlist
opzoeken-naar-lijst()
- opzoeken-naar-lijst(opzoeken, ... [opzoeken]): Neemt een aantal
lookupwaarden, converteert elk van deze waarden naar eenbagmet deufx-idenufx-logicalnamemetagegevens set, en vlakt ze af tot éénlist
optie-naar-lijst()
- optie-naar-lijst(optie, ... [optie]): Neemt een aantal
optionwaarden, converteert elk van deze naar eenbagmet een enkeleoptioneigenschap en vlakt ze af tot éénlist
orde()
- order(list, string, bool): Ordent een lijst op basis van een eigenschap in elke zak. De eigenschap wordt gespecificeerd in argument 2, aflopend wordt gespecificeerd in argument 3.
- order(lijst, lijst): Rangschik een lijst op meerdere sorteervolgordes die zijn opgegeven als een lijst in argument 2. Elk
bagin de tweede lijst kan eennameendescendingeigenschap hebben
iif()
- iif(elke, elke, elke): Als argument 1 waar is, geeft argument 2 terug, anders geeft argument 3 terug
UFX XPath-variabelen
| Naam | Beschrijving |
|---|---|
| $input | A bag beschikbaar voor de UFX-query met invoerwaarden |
| $null | Een nulconstante. Als u op een eigenschap selecteert $null , wordt de eigenschap uit de zak verwijderd |
| $current | Verwijzing naar de huidige tas die de UFX-query verwerkt |
Aanvullende bronnen
Resourcevergelijking begrijpen en aanpassen in Universal Resource Scheduling