"Universal FetchXML", kad išplėstumėte "Universal Resource Scheduling"

"Universal FetchXML" (UFX) yra išplėstinė užklausų kalba, leidžianti užklausti duomenis naudojant dinaminį "FetchXML", formuoti ir paruošti gautus duomenis naudoti " Universal Resource Scheduling" (URS) sprendimui. Ši užklausos kalba leidžia kurti pasirinktines užklausas, kad galėtumėte tinkinti ir išplėsti planavimo lentos ir planavimo pagalbinės priemonės filtrus, kad jie atitiktų unikalius organizacijos verslo poreikius.

UFX susideda iš dviejų komponentų: UFX maišelio ir UFX užklausos.

Paprastas UFX krepšys

UFX maišelyje yra statinio tipo duomenys. Atmintyje jis modeliuoja žodyną su raktais ir reikšmėmis. Jis gali būti serijinis JSON ir XML. Įvedę duomenis, UFX užklausa gali pateikti užklausą dėl duomenų iš jų, o kliento vartotojo sąsaja gali su ja susieti.

Praktiniais ir efektyvumo sumetimais atminties krepšys įdiegiamas ant "Dynamics 365" programų SDK Entity objekto.

Ėminio maišas, kuriame yra dvi vertės.

Atmintyje:

raktas reikšmė tipas
pavadinimas John eilutė
amžius 36 sveik. sk.

In JSON:

{
    "name": "John",
    "age": 36
}

XML formatu:

<bag>
    <name ufx-type="string">John</name>
    <age ufx-type="int">36</age>
</bag>

UFX palaikomi tipai

UFX maišelyje gali būti įvairių tipų vertės. Jie skirstomi į tris tipų klases:

Kategorija Reikšmė
Paprasti tipai bool (Boolean), int (Int32), , long (Int64), double (Double)decimal (Decimal), , datetime (DateTime), guid (Guid)string (String)
"Dynamics 365" konkretūs paprasti tipai: money (Money), option (OptionSet), lookup (EntityReference)
Kiti krepšiai bag (Entity)
Krepšių sąrašas list (EntityCollection)

Štai pavyzdinis JSON krepšys, kuriame yra daugiau tipų:

{
    "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" }
    ]
}

Tas pats maišelis 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 užklausos

UFX užklausos rašomos kaip XML pagrįsti UFX maišeliai. Maišelio ypatybėse gali būti UFX direktyvų , kad būtų galima dinamiškai užklausti duomenų. UFX užklausa vykdoma atmintyje esančiuose objektuose, o ne XML. Tik direktyvos yra parašytos XML formatu. Jo išvestis gali būti serializuota į JSON arba XML.

Ši UFX užklausa apibrėžia accounts maišelyje esančią ypatybę su source UFX direktyva. Dėl to "Dynamics 365" vykdo įdėtąjį "FetchXML", užpildydama accounts ypatybę maišelių sąrašu. Kur EntityCollection kiekvienas krepšys reiškia atskirą "Dynamics 365" kliento įrašą.

<bag xmlns:ufx="https://schemas.microsoft.com/dynamics/2017/universalfetchxml">
    <accounts ufx:source="fetch">
        <fetch top="10">
            <entity name="account" />
        </fetch>
    </accounts>
</bag>

UFX užklausa apdorojama nuosekliai ir joje gali būti daug "FetchXML" užklausų.

Štai ankstesnės UFX užklausos rezultato fragmentas, suskirstytas į XML. Stebėkite, kad kai kurios vertės turi metaduomenis, toliau juos apibūdinančius.

<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>

select UFX direktyvoje naudojama XPath išraiška, kuri parenka reikšmes iš dabartinio maišelio.

<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>

Gautas maišelis XML:

<bag>
    <first_account_name ufx-type="string">Fourth Coffee (sample)</first_acount_name>
</bag>

Žinoma, galingiausias UFX užklausos aspektas yra jos galimybė dinamiškai generuoti "FetchXML", remiantis įvesties duomenimis.

Šiame pavyzdyje ieškome sąskaitų pagal vartotojo pateiktą vertę ir prieinamą kaip UFX maišelį per XPath $input kintamąjį. Atkreipkite dėmesį į UFX if ir vertės direktyvas ant elemento 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>

Jei įvesties maišelio ypatybėje NameFilter buvo %city% sukurta "FetchXML" sąlyga, kurią vykdo "Dynamics 365", atrodys taip.

<condition attribute="name" operator="like" value="%city%" />

Raktai, reikšmės ir metaduomenys

UFX maišelyje yra raktai ir reikšmės, kur kai kurios reikšmės turi daugiau metaduomenų joms apibūdinti.

Pavyzdys gali būti tipo lookup (EntityReference)reikšmė . Kai užklausiama iš "Dynamics 365" per "FetchXML", pateikiamas loginis objekto pavadinimas ir suformatuotas rodomas įrašo pavadinimas. UFX maišelyje ši papildoma informacija saugoma kaip metaduomenys, pridėti prie pirminės vertės.

Serializuotas į JSON, a lookup su metaduomenimis atrodo taip:

{
    "primarycontactid": "7e6e39dd-34a1-e611-8111-00155d652f01",
    "primarycontactid@ufx-type": "lookup",
    "primarycontactid@ufx-logicalname": "contact",
    "primarycontactid@ufx-formatvalue": "Susanna Stubberod (sample)"
}

XML formatu:

<primarycontactid ufx-type="lookup" ufx-formatvalue="Susanna Stubberod (sample)" ufx-logicalname="contact">7e6e39dd-34a1-e611-8111-00155d652f01</primarycontactid>

XPath per "Dynamics 365" duomenis

Įvedus duomenis į UFX maišą, UFX užklausa gali juos matyti struktūriniu formatu ir naudoti XPath, kad pereitų duomenis ir iš jų pasirinktų reikšmes.

XPath išraiška, nurodyta UFX direktyvoje, mato duomenis maišelyje, panašius į maišelio struktūrą XML serijos forma. Tačiau duomenys saugomi atminties .NET objektuose (pvz., ir tipuose EntityEntityCollection ), o ne XML dokumentuose.

UFX tipo nuoroda

Visi UFX tipai palaiko ufx-type ir ufx-formatvalue metaduomenis. Papildomi metaduomenys aprašomi šalia kiekvieno tipo.

UFX pavadinimas Atributo tipo kodas .NET pavadinimas UFX metaduomenys
bool Bulio logikos Bulio logikos
sveik. sk. Sveikasis skaičius Int32
ilgai BigInt Int64
dvigubas Dviguba Dviguba
dešimtainis Dešimtainis skaičius Dešimtainis skaičius
datetime Data ir laikas Data ir laikas
Guid Unikalus identifikatorius GUID
eilutė Atmintinė Eilutės
pinigai Pinigai Pinigai
Parinktį Išrinkimo sąrašas OptionSetValue
Peržvalgos Peržvalga EntityReference ufx-logicalname
krepšys Netaikoma Subjektas ufx-id
ufx-logicalname
sąrašas Netaikoma EntityCollection
Netaikoma Netaikoma AliasedValue ufx-aliasentity
ufx-aliasattribute

UFX užklausos direktyvos

UFX direktyvas galima naudoti maišelio ypatybėms ir "FetchXML" užklausos XML elementams.

UFX maišelių direktyvos

Atributas Reikšmė Aprašas
ufx:if „XPath“ Tikrina XPath išraišką ir apdoroja ypatybę tik tuo atveju, jei testas pateikia true
ufx:source fetch Vykdo įdėtąjį <fetch> XML elementą ir priskiria rezultatą ypatybei
ufx:select „XPath“ Vykdo XPath išraišką ir priskiria rezultatą ypatybei
Kai užklausoje XML bag formoje galima nurodyti arba list pasirinktinį antrinį bag elementą, kad būtų galima transformuoti XPath išraiškos rezultatą

UFX FetchXML direktyvos

Elementas Atributas Reikšmė Aprašas
Visi elementai ufx:if „XPath“ Tikrina XPath išraišką ir skleidžia XML elementą tik tuo atveju, jei bandymai pavyksta
ufx:apply select „XPath“ Kartoja per mazgų rinkinį, kurį grąžina XPath išraiška, ir išveda antrinius XML elementus vieną kartą kiekvienam mazgui
ufx:value select „XPath“ Vykdo XPath išraišką ir išveda rezultatą dabartiniame XML elemente
ufx:value attribute atributo pavadinimas Priskiria XPath išraiškos rezultatą nurodytam dabartinio XML elemento atributo pavadinimui

UFX XPath funkcijos

UFX prideda daug naujų funkcijų, be tų, kurios yra XPath.

datetime()

  • datetime(): pateikia dabartinį laiką UTC

sąrašas()

  • sąrašas(krepšys | sąrašas, ... [krepšys | sąrašas]): paima skaičių bag arba reikšmių kaip list įvestį ir išlygina jas į vieną list

peržvalga į sąrašą()

  • peržvalga į sąrašą(peržvalga, ... [peržvalga]): paima keletą lookup reikšmių, konvertuoja kiekvieną iš jų į a bag su ufx-id metaduomenų rinkiniu ir ufx-logicalname išlygina jas į vieną list

parinktis į sąrašą()

  • parinktis-į sąrašą(parinktis, ... [option]): paima keletą option reikšmių, kiekvieną iš jų konvertuoja į vieną bagoption ypatybę ir išlygina į vieną list

Užsakymas()

  • order(list, string, bool): Užsako sąrašą pagal ypatybę kiekviename maiše. Ypatybė nurodyta 2 argumente, mažėjimo tvarka nurodyta 3 argumente.
  • tvarka (sąrašas, sąrašas): Išdėstykite sąrašą pagal kelias rūšiavimo tvarkas, nurodytas kaip sąrašas 2 argumente. Kiekvienas bag iš antrojo sąrašo gali turėti a name ir descending nuosavybę

IIF()

  • iif(bet koks, bet koks, bet koks): jei argumentas 1 yra teisingas, grąžina argumentą 2, kitu atveju pateikia argumentą 3

UFX XPath kintamieji

Pavadinimas Aprašas
$input A bag pasiekiamas UFX užklausai su įvesties reikšmėmis
$null Nulinė konstanta. Pasirinkus $null ypatybę, nuosavybė pašalinama iš maišo
$current Nuoroda į dabartinį krepšelį, kurį apdoroja UFX užklausa

Papildomi ištekliai

Išteklių atitikimo supratimas ir tinkinimas naudojant "Universal Resource Scheduling"