Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Universal FetchXML (UFX) to zaawansowany język zapytań, który umożliwia wykonywanie zapytań o dane przy użyciu dynamicznego formatu FetchXML, kształtowanie i przygotowywanie danych wynikowych do użycia przez rozwiązanie Universal Resource Scheduling (URS). Ten język zapytań umożliwia tworzenie kwerend niestandardowych w celu dostosowywania i rozszerzania filtrów tablicy harmonogramu i asystenta planowania w celu spełnienia unikatowych potrzeb biznesowych organizacji.
UFX składa się z dwóch komponentów: torby UFX i zapytania UFX.
Prosta torba UFX
Torba UFX zawiera dane statyczne. W pamięci modeluje słownik z kluczami i wartościami. Może być serializowany do formatów JSON i XML. Wpisywanie danych pozwala zapytaniu UFX na wysyłanie z nich zapytań o dane, a interfejsowi użytkownika klienta na powiązanie się z nimi.
Ze względów praktycznych i wydajnościowych torba w pamięci jest implementowana na obiekcie Dynamics 365 Apps SDK Entity .
Worek na próbkę zawierający dwie wartości.
W pamięci:
| klucz | wartość | typ |
|---|---|---|
| nazwa | John | ciąg |
| wiek | 36 | int (integer) |
W formacie JSON:
{
"name": "John",
"age": 36
}
W formacie XML:
<bag>
<name ufx-type="string">John</name>
<age ufx-type="int">36</age>
</bag>
Typy obsługiwane przez UFX
Torba UFX może zawierać wartości wielu typów. Są one podzielone na trzy klasy typów:
| Kategoria | Wartość |
|---|---|
| Typy proste |
bool (Boolean), int (Int32), , long (Int64), double (Double)decimal (Decimal), , datetime (DateTime), , guid (Guid)string (String)Specyficzne proste typy usługi Dynamics 365: money (Money), option (OptionSet), lookup (EntityReference) |
| Inne torby | bag (Entity) |
| Lista toreb | list (EntityCollection) |
Oto przykładowa torba JSON zawierająca więcej typów:
{
"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" }
]
}
Ta sama torba w 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>
Zapytania UFX
Zapytania UFX są zapisywane jako worki UFX oparte na XML. Właściwości w torbie mogą zawierać dyrektywy UFX do dynamicznego wysyłania zapytań do danych. Zapytanie UFX jest wykonywane na obiektach w pamięci, a nie w kodzie XML. Tylko dyrektywy są zapisane w formacie XML. Jego dane wyjściowe mogą być serializowane do formatu JSON lub XML.
Poniższe zapytanie UFX definiuje accounts właściwość w torbie z dyrektywą source UFX. W rezultacie Dynamics 365 wykonuje wbudowany FetchXML, wypełniając accounts właściwość listą worków. Miejsce EntityCollection , w którym każdy worek reprezentuje indywidualny rekord klienta z usługi 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>
Zapytanie UFX jest przetwarzane sekwencyjnie i może zawierać wiele zapytań FetchXML.
Oto fragment kodu wyniku poprzedniego zapytania UFX zserializowanego do formatu XML. Zwróć uwagę, że niektóre wartości mają metadane dodatkowo je opisujące.
<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>
Dyrektywa select UFX przyjmuje wyrażenie XPath, które wybiera wartości z bieżącego worka.
<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>
Wynikowy worek w formacie XML:
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
Z pewnością najpotężniejszym aspektem zapytania UFX jest jego zdolność do dynamicznego generowania FetchXML na podstawie danych wejściowych.
W poniższym przykładzie wyszukujemy konta według wartości podanej przez użytkownika i dostępnej jako torba UFX za pomocą zmiennej XPath $input . Zwróć uwagę na dyrektywy UFX if i value w condition elemencie.
<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>
NameFilter Jeśli właściwość w torbie wejściowej zawierała %city% utworzony warunek FetchXML wykonywany przez usługę Dynamics 365, wyglądałby następująco.
<condition attribute="name" operator="like" value="%city%" />
Klucze, wartości i metadane
Torba UFX zawiera klucze i wartości, przy czym niektóre wartości mają więcej metadanych, aby je opisać.
Przykładem może być wartość typu lookup (EntityReference). W przypadku zapytania z Dynamics 365 za pośrednictwem FetchXML zwraca logiczną nazwę encji i sformatowaną nazwę wyświetlaną rekordu. Torba UFX zachowuje te dodatkowe informacje jako metadane dołączone do wartości podstawowej.
Serializowane do formatu JSON, a lookup z metadanymi wyglądają następująco:
{
"primarycontactid": "7e6e39dd-34a1-e611-8111-00155d652f01",
"primarycontactid@ufx-type": "lookup",
"primarycontactid@ufx-logicalname": "contact",
"primarycontactid@ufx-formatvalue": "Susanna Stubberod (sample)"
}
W formacie XML:
<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
XPath za pośrednictwem danych Dynamics 365
Wpisywanie danych w torbie UFX umożliwia zapytaniu UFX wyświetlenie ich w ustrukturyzowanym formacie i użycie XPath do przejrzenia danych i wybrania z nich wartości.
Wyrażenie XPath określone w dyrektywie UFX powoduje, że dane w torbie są podobne do struktury worka w postaci serializowanej w formacie XML. Jednak dane są przechowywane w obiektach .NET w pamięci (w wystąpieniach Entity i EntityCollection typach), a nie w dokumentach XML.
Odniesienie do typu UFX
Wszystkie typy UFX obsługują ufx-type metadane i ufx-formatvalue . Dodatkowe metadane są opisane obok każdego typu.
| Nazwa UFX | Kod typu atrybutu | Nazwa platformy .NET | Metadane UFX |
|---|---|---|---|
| Bool | logiczny | logiczny | |
| int (integer) | Liczba całkowita | Int32 | |
| długi | Duży Int | Int64 | |
| podwójny | Podwójny | Podwójny | |
| liczba dziesiętna | Liczba dziesiętna | Liczba dziesiętna | |
| data/godzina | Data i Czas | Data i Czas | |
| przewodnik | Unikatowy identyfikator | Przewodnik | |
| ciąg | Memo | Sznurek | |
| pieniądze | Pieniądze | Pieniądze | |
| Opcja | Lista wyboru | OptionSetValue (Wartość zestawuOpcji) | |
| wyszukiwanie | Szukaj | EntityReference | ufx-logicalname |
| torba | N/A | Jednostka | ufx-idufx-logicalname |
| lista | N/A | EntityCollection | |
| N/A | N/A | AliasedValue | ufx-aliasentityufx-aliasattribute |
Dyrektywy zapytań UFX
Dyrektywy UFX mogą być używane w odniesieniu do właściwości worka oraz elementów XML zapytania FetchXML.
Dyrektywy dotyczące toreb UFX
| Atrybut | Wartość | Opis |
|---|---|---|
ufx:if |
XPath | Testuje wyrażenie XPath i przetwarza właściwość tylko wtedy, gdy test zwraca wartość true |
ufx:source |
fetch |
Wykonuje wbudowany <fetch> element XML i przypisuje wynik do właściwości |
ufx:select |
XPath | Wykonuje wyrażenie XPath i przypisuje wynik do właściwości Podczas wykonywania zapytania o baglist lub opcjonalny element podrzędny bag w postaci XML można określić w celu przekształcenia wyniku wyrażenia XPath |
Dyrektywy UFX FetchXML
| Składnik | Atrybut | Wartość | Opis |
|---|---|---|---|
| Wszystkie elementy | ufx:if |
XPath | Testuje wyrażenie XPath i emituje element XML tylko wtedy, gdy testy zakończą się pomyślnie |
ufx:apply |
select |
XPath | Tworzy pętlę po zestawie węzłów zwróconym przez wyrażenie XPath i wyprowadza podrzędne elementy XML raz dla każdego węzła |
ufx:value |
select |
XPath | Wykonuje wyrażenie XPath i wyprowadza wynik w bieżącym elemencie XML |
ufx:value |
attribute |
nazwa atrybutu | Przypisuje wynik wyrażenia XPath do określonej nazwy atrybutu w bieżącym elemencie XML |
Funkcje UFX XPath
UFX dodaje wiele nowych funkcji oprócz tych dostępnych natywnie w XPath.
data/godzina()
- datetime(): Zwraca bieżący czas w UTC
lista()
- list(torba | lista, ... [bag | list]): Pobiera pewną liczbę
bagwartości orlistjako dane wejściowe i spłaszcza je do jednejlist
Szukaj do-listy()
- Lookup-to-list(Wyszukiwanie, ... [lookup]): Pobiera pewną liczbę
lookupwartości, konwertuje każdą z nich na abagz zestawemufx-idmetadanych iufx-logicalnamei spłaszcza je do jednegolist
option-to-list() (opcja do listy)
- option-to-list(opcja, ... [opcja]): Pobiera pewną liczbę
optionwartości, konwertuje każdą z nich na abagz pojedyncząoptionwłaściwością i spłaszcza je do jednejlist
porządek()
- order(list, string, bool): porządkuje listę według właściwości w każdym worku. Właściwość jest określona w argumencie 2, malejąco jest określona w argumencie 3.
- order(list, list): Uporządkuj listę według wielu porządków sortowania określonych jako lista w argumencie 2. Każdy
bagz drugiej listy może mieć właściwośćnameidescending
iif()
- iif(any, any, any): Jeśli argument 1 jest prawdziwy, zwraca argument 2, w przeciwnym razie zwraca argument 3
Zmienne UFX XPath
| Nazwa | Opis |
|---|---|
| $input | Dostępny bag dla zapytania UFX z wartościami wejściowymi |
| $null | Stała zerowa. Wybranie $null właściwości powoduje usunięcie właściwości z torby |
| $current | Odniesienie do bieżącego zasobnika, który jest przetwarzany przez zapytanie UFX |
Dodatkowe zasoby
Opis i dostosowywanie dopasowywania zasobów w Universal Resource Scheduling