Rozšíření Universal Resource Scheduling pomocí Univerzálního FetchXML
UFX je pokročilý dotazovací jazyk, který umožňuje dotazovat data pomocí dynamického FetchXML, tvarovat a připravovat výsledná data pro spotřebu pomocí řešení Universal Resource Scheduling (URS). Tento dotazovací jazyk umožňuje vytvářet vlastní dotazy pro přizpůsobení a rozšíření filtrů plánovací vývěsky a pomocníka plánování, aby splňovaly jedinečné obchodní potřeby organizace.
UFX se skládá ze dvou částí - UFX kontejneru a UFX dotazu.
Jednoduchý UFX kontejner
UFX kontejner obsahuje statická data. V paměti je představován jako slovník s klíči a hodnotami. Může být serializován do formátu JSON a XML. Mít k dispozici zadaná data umožňuje UFX dotazu žádat z něj data a uživatelskému rozhraní klienta se na něj vázat.
Z praktických a výkonnostních důvodů je kontejner v paměti implementován nad objektem
Entity
SDK aplikací Dynamics 365.
Vzorový kontejner obsahující dvě hodnoty.
V paměti:
klíč | hodnotu | typ |
---|---|---|
název | Jiří | řetězec |
stáří | 36 | int |
V JSON:
{
"name": "John",
"age": 36
}
V XML:
<bag>
<name ufx-type="string">John</name>
<age ufx-type="int">36</age>
</bag>
Podporované typy UFX
UFX kontejner může obsahovat mnoho typů hodnot. Jsou zařazené do třech typových tříd.
Kategorie | Hodnota |
---|---|
Jednoduché typy | bool (Boolean) , int (Int32) , long (Int64) , double (Double) , decimal (Decimal) , datetime (DateTime) , guid (Guid) , string (String) Specifické jednoduché typy Dynamics 365: money (Money) , option (OptionSet) ,lookup (EntityReference) |
Jiné kontejnery | bag (Entity) |
Seznam kontejnerů | list (EntityCollection) |
Zde je ukázkový kontejner JSON obsahující více typů:
{
"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" }
]
}
Stejný kontejner v 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>
Úvod do dotazů UFX
UFX dotazy jsou zapsány jako UFX kontejnery založené na XML. Vlastnosti v kontejneru mohou obsahovat směrnice UFX pro dynamické dotazování dat. UFX dotaz se spouští na objektech v paměti, nikoli XML. Pouze směrnice jsou napsány v XML. Jeho výstup lze serializovat do JSON nebo XML.
Následující dotaz UFX definuje vlastnost accounts
v kontejneru s UFX směrnicí source
. To má za následek vložený FetchXML prováděný aplikací Dynamics 365 a vlastnost accounts
, která se stane seznamem kontejnerů, nebo EntityCollection
, kde je každý kontejner instancí záznamu obchodního vztahu z 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>
Dotaz UFX se zpracovává postupně a může obsahovat mnoho dotazů FetchXML.
Zde je fragment kódu výsledku z předchozího dotazu UFX serializovaného do XML. Všimněte si, že některé hodnoty mají metadata, které je dále popisují.
<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>
UFX směrnice select
bere výraz XPath, který vybere hodnoty z aktuálního kontejneru.
<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>
Výsledný kontejner v XML:
<bag>
<first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>
Nejvýkonnějším aspektem UFX dotazu je zcela jistě jeho schopnost dynamicky generovat FetchXML na základě vstupních dat.
V následující ukázce jsme hledali obchodní vztahy podle hodnoty zadané uživatelem a dostupné jako UFX kontejner pomocí proměnné XPath $input
. Všimněte si směrnic if a value na prvku 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>
Pokud by vlastnost NameFilter
ve vstupním kontejneru obsahovala %city%
, vytvořená podmínka FetchXML provedená aplikací Dynamics 365 by vypadala takto.
<condition attribute="name" operator="like" value="%city%" />
Klíče, hodnoty a metadata
Kontejner UFX obsahuje klíče a hodnoty a některé hodnoty mají další metadata, která je dále popisují.
Příkladem může být hodnota typu lookup (EntityReference)
. Při dotazu z Dynamics 365 prostřednictvím FetchXML se vrátí logický název entity a formátovaný zobrazovaný název záznamu. Kontejner UFX uchovává tyto dodatečné informace jako metadata připojená k primární hodnotě.
lookup
s metadaty, serializovaný do JSON, vypadá takto:
{
"primarycontactid": "7e6e39dd-34a1-e611-8111-00155d652f01",
"primarycontactid@ufx-type": "lookup",
"primarycontactid@ufx-logicalname": "contact",
"primarycontactid@ufx-formatvalue": "Susanna Stubberod (sample)"
}
V XML:
<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>
XPath přes data Dynamics 365
Zapsaná data v UFX kontejneru umožňují, aby je viděl dotaz UFX ve strukturovaném formátu a použil XPath pro přechod přes data a volbu hodnot z dat.
Výraz XPath specifikovaný ve směrnici UFX vidí data v kontejneru podobně jako ve struktuře kontejneru ve formě serializovaného XML. Data jsou však uložena v paměti v objektech .NET objekty (v instancích typu Entity
a EntityCollection
) a nikoli v dokumentech XML.
Dodatek A: Odkaz na typ UFX
Poznámka: Všechny typy UFX podporují ufx-type
a ufx-formatvalue
metadata. Další metadata jsou popsána u jednotlivých typů v tabulce níže.
Název UFX | Kód typu atributu | Název .NET | Metadata UFX |
---|---|---|---|
bool | logický | logický | |
int | Celé číslo | Int32 | |
long | BigInt | Int64 | |
double | Dvojitá přesnost | Dvojitá přesnost | |
decimal (desetinné číslo) | Desetinné číslo (decimal) | Desetinné číslo (decimal) | |
datetime | Datum a čas | Datum a čas | |
guid | Uniqueidentifier | Guid | |
řetězec | Memo | Řetězec | |
money (peněžní hodnota) | Peněžní hodnota (money) | Peněžní hodnota (money) | |
option | Rozevírací seznam | OptionSetValue | |
lookup | Vyhledávání | EntityReference | ufx-logicalname |
bag | Nelze použít | Entita | ufx-id ufx-logicalname |
seznam | Nelze použít | EntityCollection | |
Nelze použít | Nelze použít | AliasedValue | ufx-aliasentity ufx-aliasattribute |
Dodatek B: Směrnice dotazu UFX
UFX směrnice lze použít na vlastnostech kontejneru a na prvcích XML dotazu FetchXML.
Směrnice kontejneru UFX
Attribute (Atribut) | Value | Popis |
---|---|---|
ufx:if |
XPath | Otestuje výraz XPath a pouze zpracovává vlastnost, pokud test vrátí hodnotu true |
ufx:source |
fetch |
Spustí vložený <fetch> XML prvek a přiřadí výsledek k vlastnosti |
ufx:select |
XPath | Spustí výraz XPath a přiřadí výsledek k vlastnosti Při dotazu na bag nebo list lze určit podřízený bag v XML formě pro převod výsedku výrazu XPath |
Směrnice UFX FetchXML
Element (Prvek) | Attribute (Atribut) | Value | Popis |
---|---|---|---|
Všechny prvky | ufx:if |
XPath | Otestuje výraz XPath a vydá prvek XML jen tehdy, pokud je test úspěšný |
ufx:apply |
select |
XPath | Loops přes sadu uzlů vrácenou výrazem XPath a výstupem jsou podřízené prvky XML, jeden pro každý uzel |
ufx:value |
select |
XPath | Provede výraz XPath a vydá výsledek v aktuálním prvku XML |
ufx:value |
attribute |
název atributu | Přiřadí výsledek výrazu XPath k určenému názvu atributu na aktuálním prvku XML |
Dodatek C: Funkce UFX XPath
UFX přidává několik nových funkcí, kromě těch, které jsou k dispozici nativně ve výrazu XPath.
datetime()
- DATETIME(): vrací aktuální čas v UTC
list()
- list(bag | list, ...[kontejner | seznam]): Vezme počet hodnot
bag
(kontejner) nebolist
(seznam) jako vstup a spojí je do jednoholist
lookup-to-list()
- Vyhledávání list(lookup, ...[vyhledávání]): Vezme počet hodnot
lookup
(vyhledávání), převede každou z nich nabag
(kontejner) se sadou metadatufx-id
aufx-logicalname
a sloučí je do jednoholist
(seznam)
option-to-list()
- option-to-list(option, ...[volba]): Vezme počet hodnot
option
(volba), převede každou z nich dobag
(kontejner) s jedinou vlastnostíoption
a sloučí je do jednoholist
(seznam)
order()
- order(list, string, bool): Seřadí seznam podle vlastnosti v každém kontejneru. Vlastnost je určena v argumentu 2, sestupně je určena v argumentu 3.
- order(list, list): Seřadí seznam podle několika pořadí řazení, určených jako seznam v argumentu 2. Každý
bag
ve druhém seznam může mít vlastnostiname
adescending
iif()
- iif(any, any, any): Pokud má argument 1 hodnotu true, vrátí argument 2, jinak vrátí argument 3
Dodatek D: Proměnné UFX XPath
Jméno | Popis |
---|---|
$input | bag dostupná pro dotaz UFX se vstupními hodnotami |
$null | Konstanta null. Výběr $null na vlastnosti odebere vlastnost z kontejneru |
$current | Odkaz na aktuální kontejner zpracovávaný dotazem UFX |
Viz také
Pochopení a přizpůsobení párování zdrojů v Universal Resource Scheduling