Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Universal FetchXML (UFX) ist eine fortschrittliche Abfragesprache, die es Ihnen ermöglicht, Daten mit dynamischem FetchXML abzufragen, die resultierenden Daten für die Nutzung durch die URS-Lösung (Universal Resource Scheduling) zu formen und vorzubereiten. Mit dieser Abfragesprache können Sie benutzerdefinierte Abfragen erstellen, um die Filter der Zeitplanübersicht und des Zeitplan-Assistenten anzupassen und zu erweitern, um die individuellen Geschäftsanforderungen der Organisation zu erfüllen.
UFX besteht aus zwei Komponenten: UFX bag und UFX query.
Einfache UFX-Tasche
Ein UFX-Beutel enthält statisch typisierte Daten. Im Arbeitsspeicher modelliert es ein Wörterbuch mit Schlüsseln und Werten. Es kann in JSON und XML serialisiert werden. Wenn die Daten typisiert sind, kann eine UFX-Abfrage Daten von ihr abfragen, und die Client-Benutzeroberfläche kann an sie gebunden werden.
Aus praktischen Gründen und aus Leistungsgründen wird der In-Memory-Behälter zusätzlich zum Dynamics 365 Apps SDK-Objekt Entity implementiert.
Probenbeutel mit zwei Werten.
In Erinnerung:
| Schlüssel | Wert | Typ |
|---|---|---|
| Name | John | Schnur |
| 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>
Von UFX unterstützte Typen
Ein UFX-Beutel kann Werte vieler Typen enthalten. Sie werden in drei Typklassen eingeteilt:
| Kategorie | 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) |
| Andere Taschen | bag (Entity) |
| Liste der Taschen | list (EntityCollection) |
Hier ist ein JSON-Beispielbeutel mit weiteren 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" }
]
}
Der gleiche Beutel 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-Abfragen
UFX-Abfragen werden als XML-basierte UFX Bags geschrieben. Eigenschaften im Beutel können UFX-Direktiven enthalten, um Daten dynamisch abzufragen. Eine UFX-Abfrage wird für In-Memory-Objekte und nicht für XML ausgeführt. Nur die Direktiven sind in XML geschrieben. Die Ausgabe kann in JSON oder XML serialisiert werden.
Die folgende UFX-Abfrage definiert die accounts Eigenschaft im Bag mit der source UFX-Direktive. Infolgedessen führt Dynamics 365 das Inline-FetchXML aus und füllt die accounts Eigenschaft mit einer Liste von Behältern auf. Ein EntityCollection Punkt, an dem jeder Beutel einen einzelnen Kontodatensatz aus Dynamics 365 darstellt.
<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 sehen Sie einen Ausschnitt aus dem Ergebnis der vorherigen UFX-Abfrage, die in XML serialisiert wurde. Beachten Sie, dass einige Werte Metadaten haben, die sie weiter beschreiben.
<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 verwendet einen XPath-Ausdruck, der Werte aus dem aktuellen Bag 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 resultierende Beutel in XML:
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
Der leistungsstärkste Aspekt einer UFX-Abfrage ist sicherlich ihre Fähigkeit, FetchXML basierend auf Eingabedaten dynamisch zu generieren.
Im folgenden Beispiel suchen wir nach Konten anhand eines Werts, der vom Benutzer bereitgestellt wird und über die XPath-Variable $input als UFX-Beutel verfügbar ist. Beachten Sie die UFX if- und value-Direktiven für das 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 die erzeugte FetchXML-Bedingung enthält %city% , die von Dynamics 365 ausgeführt wird, würde dies wie folgt aussehen.
<condition attribute="name" operator="like" value="%city%" />
Schlüssel, Werte und Metadaten
Ein UFX-Beutel enthält Schlüssel und Werte, wobei einige Werte mehr Metadaten haben, um sie zu beschreiben.
Ein Beispiel könnte ein Wert vom Typ .lookup (EntityReference) Bei der Abfrage von Dynamics 365 über FetchXML wird der logische Name der Entität und der formatierte Anzeigename des Datensatzes zurückgegeben. Der UFX-Beutel behält diese zusätzlichen Informationen als Metadaten bei, die an den Primärwert angehängt sind.
Serialisiert in JSON sieht ein mit lookup 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 über Dynamics 365-Daten
Wenn die Daten in einem UFX-Bag typisiert sind, kann eine UFX-Abfrage sie in einem strukturierten Format anzeigen und XPath verwenden, um die Daten zu durchlaufen und Werte daraus auszuwählen.
Ein XPath-Ausdruck, der in einer UFX-Direktive angegeben wird, sieht die Daten im Beutel ähnlich wie die Struktur des Behälters in XML-serialisierter Form. Die Daten werden jedoch in .NET-Objekten im Arbeitsspeicher (in Instanzen von Entity und EntityCollection Typen) und nicht in XML-Dokumenten gespeichert.
UFX-Typen-Referenz
Alle UFX-Typen unterstützen die ufx-typeufx-formatvalue und-Metadaten. Zusätzliche Metadaten werden neben jedem Typ beschrieben.
| UFX-Name | Code für den Attributtyp | .NET-Name | UFX-Metadaten |
|---|---|---|---|
| Boolesch | Boolescher Typ (Boolean) | Boolescher Typ (Boolean) | |
| INT | Ganze Zahl | Int32 | |
| lang | BigInt | Int64 | |
| doppelt | Doppelt | Doppelt | |
| Decimal | Dezimalzahl | Dezimalzahl | |
| Datum/Uhrzeit | Datum/Uhrzeit | Datum/Uhrzeit | |
| GUID | Eindeutiger Bezeichner | Leitfaden | |
| Schnur | Mitteilung | Schnur | |
| Geld | Geld | Geld | |
| Option | Auswahlliste | OptionSetValue | |
| nachschlagen | Suche | EntityReference | ufx-logicalname |
| Tasche | Nicht verfügbar | Entität | ufx-idufx-logicalname |
| Liste | Nicht verfügbar | EntityCollection | |
| Nicht verfügbar | Nicht verfügbar | AliasedValue | ufx-aliasentityufx-aliasattribute |
UFX-Abfrage-Direktiven
UFX-Direktiven können für Beuteleigenschaften und XML-Elemente einer FetchXML-Abfrage verwendet werden.
Richtlinien für UFX-Beutel
| Merkmal | Wert | BESCHREIBUNG |
|---|---|---|
ufx:if |
XPath | Testet den XPath-Ausdruck und verarbeitet die Eigenschaft nur, wenn der Test true zurückgibt |
ufx:source |
fetch |
Führt das Inline-XML-Element <fetch> aus und weist der Eigenschaft das Ergebnis zu. |
ufx:select |
XPath | Führt den XPath-Ausdruck aus und weist das Ergebnis der Eigenschaft zu Bei der Abfrage eines bag oder list eines optionalen untergeordneten bag Elements im XML-Formular kann angegeben werden, um das Ergebnis des XPath-Ausdrucks zu transformieren |
UFX FetchXML-Direktiven
| Element | Merkmal | Wert | 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 über das vom XPath-Ausdruck zurückgegebene Nodeset durch und gibt die untergeordneten XML-Elemente einmal für jeden Knoten 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 das Ergebnis des XPath-Ausdrucks dem angegebenen Attributnamen im aktuellen XML-Element zu. |
UFX XPath-Funktionen
UFX fügt viele neue Funktionen hinzu, zusätzlich zu denen, die nativ in XPath verfügbar sind.
Datum/Uhrzeit()
- datetime(): Gibt die aktuelle Uhrzeit in UTC zurück
liste()
- list(Tasche | Liste, ... [bag | list]): Nimmt eine Anzahl von
baglistoder Werten als Eingabe und reduziert sie zu einem einzigenlist
Nachschlage-nach-Liste()
- lookup-to-list(Nachschlagen, ... [lookup]): Nimmt eine Reihe von
lookupWerten, konvertiert jeden von ihnen in abagmit demufx-idMetadatensatz undufx-logicalnameund reduziert sie zu einem einzigenlist
Option-zur-Liste()
- option-to-list(Option, ... [option]): Nimmt eine Reihe von
optionWerten an, konvertiert jeden von ihnen in abagmit einer einzelnenoptionEigenschaft und reduziert sie in eine einzelnelist
Reihenfolge()
- order(list, string, bool): Sortiert eine Liste nach einer Eigenschaft in jedem Beutel. Die Eigenschaft wird in Argument 2 angegeben, absteigend wird in Argument 3 angegeben.
- order(list, list): Sortiert eine Liste nach mehreren Sortierreihenfolgen, die in Argument 2 als Liste angegeben sind. Jede
bagin der zweiten Liste kann eine und-Eigenschaftnamedescendinghaben
iif()
- iif(any, any, any): Wenn Argument 1 wahr ist, gibt es Argument 2 zurück, andernfalls wird Argument 3 zurückgegeben
UFX XPath-Variablen
| Name | BESCHREIBUNG |
|---|---|
| $input | A bag , der für die UFX-Abfrage mit Eingabewerten verfügbar ist |
| $null | Eine NULL-Konstante. Wenn Sie eine Eigenschaft auswählen $null , wird die Eigenschaft aus dem Behälter entfernt. |
| $current | Verweis auf den aktuellen Beutel, den die UFX-Abfrage verarbeitet |
Weitere Ressourcen
Verstehen und Anpassen des Ressourcenabgleichs in Universal Resource Scheduling