Universelles FetchXML zum Erweitern von Universal Resource Scheduling
UFX ist eine erweiterte Abfragesprache, die es Ihnen ermöglicht, Daten mit dem dynamischen FetchXML abzufragen, die resultierenden Daten aufzubereiten und für die Nutzung durch die Universal Resource Scheduling (URS)-Lösung vorzubereiten. Mit dieser Abfragesprache können Sie benutzerdefinierte Abfragen erstellen, um die Zeitplanübersicht und die Filter des Zeitplan-Assistenten anzupassen und zu erweitern, um die individuellen Geschäftsanforderungen zu erfüllen.
UFX umfasst zwei Komponenten: UFX-Behälter und UFX-Abfrage.
Einfacher UFX-Behälter
Ein UFX-Behälter enthält typisierte statische Daten. Speicherintern wird er als Wörterbuch mit Schlüsseln und Werten angezeigt. Er kann zu JSON und XML serialisiert werden. Durch typisiere Daten kann eine UFX-Abfrage Daten davon abfragen und eine Client-UI kann eine Bindung damit vornehmen.
Aus praktischen und Leistungsgründen ist der In-Memory-Bag auf dem Dynamics 365 Apps SDK
Entity
Objekt implementiert.
Beispielbehälter mit zwei Werten.
Speicherintern:
Schlüssel | Wert | typ |
---|---|---|
Name | Erwin | Zeichenfolge |
Alter | 36 | int |
In JSON:
{
"name": "John",
"age": 36
}
In XML:
<bag>
<name ufx-type="string">John</name>
<age ufx-type="int">36</age>
</bag>
UFX-unterstützte Typen
Ein UFX-Behälter kann Werte vieler Typen enthalten. Sie werden in 3 Typklassen kategorisiert:
Kateg. | Wert |
---|---|
Einfache Typen | bool (Boolean) , int (Int32) , long (Int64) , double (Double) , decimal (Decimal) , datetime (DateTime) , guid (Guid) , string (String) Dynamics 365 spezifische einfache Typen: money (Money) , option (OptionSet) , lookup (EntityReference) |
Weitere Behälter | bag (Entity) |
Liste der Behälter | list (EntityCollection) |
Im Folgenden finden Sie ein Beispiel JSON-Behälter, der weitere Typen enthält:
{
"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" }
]
}
Der gleiche Behälter 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>
Einführung in UFX-Abfragen
UFX-Abfragen werden als XML-basierte UFX-Behälter geschrieben. Eigenschaften im Behälter können UFX-Direktiven enthalten, um Daten dynamisch abzufragen. Eine UFX-Abfrage wird auf speicherinterne Objekte nicht auf XML ausgeführt. Nur die Direktiven werden in XML erstellt. Die Ausgabe kann zu JSON oder XML serialisiert werden.
Die folgende UFX-Abfrage definiert die accounts
-Eigenschaft im Behälter mit den source
-UFX-Direktiven. Dadurch wird das Inline-FetchXML von Dynamics 365 ausgeführt und die accounts
-Eigenschaft wird zu einer Liste der Behälter oder ein EntityCollection
, wobei jeder Behälter eine Instanz eines Firmendatensatzes von Dynamics 365 ist.
<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
<accounts ufx:source="fetch">
<fetch top="10">
<entity name="account" />
</fetch>
</accounts>
</bag>
Eine UFX-Abfrage wird sequenziell verarbeitet und kann viele FetchXML-Abfragen enthalten.
Hier ist ein Ausschnitt des Ergebnisses der vorherigen UFX-Abfrage, die zu XML serialisiert wurde. Beachten Sie, dass einige Werte über Metadaten verfügen, die sie weiter beschrieben.
<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>
Die select
-UFX-Direktive übernimmt einen XPath-Ausdruck, der Werte aus dem aktuellen Behälter auswählt.
<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>
Der sich ergebende Behälter in XML:
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
Zweifellos ist der leistungsfähigste Aspekte einer UFX-Abfrage die Fähigkeit, FetchXML anhand von Eingabedaten dynamisch zu generieren.
Im Beispiel unten suchen wir durch die XPath-Variable $input
mithilfe eines Werts nach Firmen, der vom Benutzer angegeben wird und als UFX-Behälter verfügbar ist. Beachten Sie die UFX-Direktiven if und value im 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>
Wenn die NameFilter
-Eigenschaft im Eingabebehälter %city%
enthielt, würde die erzeugte FetchXML-Bedingung, die von Dynamics 365 ausgeführt wurde, wie folgt aussehen.
<condition attribute="name" operator="like" value="%city%" />
Schlüssel, Werte und Metadaten
Ein UFX-Behälter enthält Schlüssel und Werte, wobei einige über Werte weitere Metadaten verfügen, die sie weiter beschreiben.
Ein Beispiel kann der Wert vom Typ lookup (EntityReference)
sein. Bei einer Abfrage von Dynamics 365 über FetchXML wird er den logischen Namen der Entität sowie den formatierten Anzeigenamen des Datensatzes zurückgeben. Der UFX-Behälter bewahrt diese zusätzlichen Informationen als Metadaten, die dem primären Wert angefügt sind.
Serialisiert zu JSON, sieht ein lookup
mit Metadaten wie folgt aus:
{
"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 zu Dynamics 365-Daten
Mit typisierten Daten in einem UFX-Behälter kann eine UFX-Abfrage diese Daten in einem strukturierten Format anzeigen und die Daten mit XPath durchlaufen und Werte daraus auswählen.
Ein XPath-Ausdruck, der in einer UFX-Direktive angegeben wird, zeigt die Daten im Behälter mit einer Struktur an, die der des Behälters in serialisierter XML-Form ähnlich sieht. Allerdings werden die Daten in speicherinternen .NET-Objekten (in Instanzen des Typs Entity
und EntityCollection
) und nicht in XML-Dokumenten gespeichert.
Anhang A: UFX-Typ-Verweis
Hinweis: Alle UFX-Typen unterstützen die Metadaten ufx-type
und ufx-formatvalue
. Zusätzliche Metadaten werden neben jedem Typ in der Tabelle unten beschrieben.
UFX-Name | Attributtypcode | .NET-Name | UFX-Metadaten |
---|---|---|---|
bool | Boolean | Boolean | |
int | Integer | Int32 | |
long | BigInt | Int64 | |
double | Double | Double | |
Dezimalzahl | Dezimal | Dezimal | |
datetime | DateTime | DateTime | |
guid | Uniqueidentifier | Guid | |
Zeichenfolge | Memo | String | |
Zahlung | Geld | Geld | |
option | Picklist | OptionSetValue | |
Suche | Suche | EntityReference | ufx-logicalname |
Behälter | Nicht zutreffend | Entity | ufx-id ufx-logicalname |
Liste | Nicht zutreffend | EntityCollection | |
Nicht zutreffend | Nicht zutreffend | AliasedValue | ufx-aliasentity ufx-aliasattribute |
Anhang B: UFX-Abfrage-Direktiven
UFX-Direktiven können für Behältereigenschaften und XML-Elemente einer FetchXML-Abfrage verwendet werden.
UFX-Behälterdirektiven
Attribut | Value | Beschreibung |
---|---|---|
ufx:if |
XPath | Testet den XPath-Ausdruck und verarbeitet die Eigenschaft nur, wenn der Test "wahr" zurückgibt |
ufx:source |
fetch |
Führt das Inline <fetch> -XML-Element aus und weist das Ergebnis der Eigenschaft zu |
ufx:select |
XPath | Führt den XPath-Ausdruck aus und weist das Ergebnis der Eigenschaft zu Wenn das Abfragen einer bag eine list kann ein optionales untergeordnetes bag in XML-Form angegeben werden, um das Ergebnis des XPath-Ausdrucks zu transformieren |
UFX FetchXML-Direktiven
Element | Attribut | Value | Beschreibung |
---|---|---|---|
Alle Elemente | ufx:if |
XPath | Testet den XPath-Ausdruck und gibt das XML-Element nur aus, wenn die Tests erfolgreich sind |
ufx:apply |
select |
XPath | Führt eine Schleife vom Nodeset durch, das vom XPath-Ausdruck zurückgegeben wird und gibt die untergeordneten XML-Elemente für jeden Knoten einmal aus |
ufx:value |
select |
XPath | Führt den XPath-Ausdruck aus und gibt das Ergebnis im aktuellen XML-Element aus |
ufx:value |
attribute |
Attributname | Weist die XPath-Ausdrucksergebnisse dem angegebenen Attributnamen auf den aktuellen XML-Element zu |
Anhang C: UFX XPath-Funktionen
UFX fügt eine Reihe neuer Funktionen zusätzlich zu denen hinzu, die systemintern in XPath verfügbar sind.
datetime()
- datetime(): Gibt die aktuelle Uhrzeit in UTC zurück
list()
- list(bag | list, ...[bag | list]): Nimmt eine Anzahl von
bag
oderlist
Werten als Eingabe und glättet sie zu einer einzigenlist
.
lookup-to-list()
- lookup-to-list(lookup, ...[lookup]): Nimmt eine Anzahl von
lookup
-Werten, wandelt jeden von ihnen in einebag
mit dem Metadatensatzufx-id
undufx-logicalname
um und glättet sie zu einer einzigenlist
.
option-to-list()
- option-to-list(option, ...[option]): Nimmt eine Anzahl von
option
-Werten, wandelt jeden von ihnen in einebag
mit einer einzigenoption
-Eigenschaft um und glättet sie in eine einzigelist
.
order()
- order(list, string, bool): Sortiert eine Liste nach einer Eigenschaft in jedem Behälter. Die Eigenschaft wird in Argument 2 angegeben. Die absteigende Reihenfolge wird in Argument 3 angegeben.
- order(list, list): Sortieren Sie eine Liste nach mehreren Sortierreihenfolgen, die als eine Liste in Argument 2 angegeben werden. Jedes
bag
in der zweiten Liste kann einedescending
undname
Eigenschaft haben
iif()
- iif(any, any, any): Wenn Argument 1 wahr ist, wird Argument 2 zurückgegeben, andernfalls wird Argument 3 zurückgegeben
Anhang D: UFX XPath-Variablen
Name | Beschreibung |
---|---|
$input | Ein bag , der für die UFX-Abfrage mit Eingabewerten verfügbar ist |
$null | Eine NULL-Konstante. Das Auswählen von $null für eine Eigenschaft entfernt die Eigenschaft aus dem Behälter |
$current | Verweisen Sie auf den aktuellen Behälter, der von der UFX-Abfrage verarbeitet wird |
Siehe auch
Verstehen und Anpassen der Ressourcenanpassung in Universal Resource Scheduling
Universal Resource Scheduling Erweiterbarkeit Versionenhinweise