Del via


Universal FetchXML for å utvide Universal Resource Scheduling

Universal FetchXML (UFX) er et avansert spørringsspråk som lar deg spørre etter data ved hjelp av dynamisk FetchXML, forme og klargjøre de resulterende dataene for forbruk av Universal Resource Scheduling (URS)- løsningen. Med dette spørringsspråket kan du opprette egendefinerte spørringer for å tilpasse og utvide filtrene for planleggingstavlen og planleggingsassistenten for å dekke organisasjonens unike forretningsbehov.

UFX består av to komponenter: UFX-veske og UFX-spørring.

Enkel UFX-veske

En UFX-pose inneholder statiske data. I minnet modellerer den en ordbok med nøkler og verdier. Den kan serialiseres til JSON og XML. Når dataene er skrevet, kan en UFX-spørring spørre etter data fra den, og klientgrensesnittet kan binde seg til den.

Av praktiske årsaker og ytelsesgrunner implementeres den minneinterne posen på toppen av Dynamics 365 Apps SDK-objektet Entity .

Prøvepose som inneholder to verdier.

Til minne:

nøkkel verdi type
navn John streng
alder 36 Int

I JSON:

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

I XML:

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

UFX-støttede typer

En UFX-pose kan inneholde verdier av mange typer. De er kategorisert i tre typeklasser:

Kategori Verdi
Enkle typer bool (Boolean), int (Int32), , long (Int64), double (Double)decimal (Decimal)datetime (DateTime)guid (Guid)string (String)
Dynamics 365-spesifikke enkle typer: money (Money), option (OptionSet), lookup (EntityReference)
Andre vesker bag (Entity)
Liste over vesker list (EntityCollection)

Her er et eksempel på en JSON-pose som inneholder flere typer:

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

Den samme vesken i 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-spørringer

UFX-spørringer skrives som XML-baserte UFX-vesker. Egenskaper i posen kan inneholde UFX-direktiver for å spørre etter data dynamisk. En UFX-spørring kjøres på minneobjekter, ikke XML. Bare direktivene er skrevet i XML. Utdataene kan serialiseres til JSON eller XML.

Følgende UFX-spørring definerer egenskapen accounts i posen med UFX-direktivet source . Som et resultat av dette kjører Dynamics 365 den innebygde FetchXML, og accounts fyller ut egenskapen med en liste over poser. En EntityCollection der hver pose representerer en individuell forretningsforbindelsesoppføring fra 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>

En UFX-spørring behandles sekvensielt og kan inneholde mange FetchXML-spørringer.

Her er et utdrag av resultatet av den forrige UFX-spørringen serialisert til XML. Observer at noen verdier har metadata som beskriver dem ytterligere.

<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-direktivet tar et XPath-uttrykk som velger verdier fra gjeldende pose.

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

Den resulterende posen i XML:

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

Det kraftigste aspektet ved en UFX-spørring er absolutt dens evne til dynamisk å generere FetchXML basert på inngangsdata.

I eksemplet nedenfor søker vi etter kontoer etter en verdi som er angitt av brukeren og tilgjengelig som en UFX-pose via XPath-variabelen $input . Legg merke til UFX if - og verdidirektivene på elementet 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>

Hvis egenskapen NameFilter i inndataposen inneholdt %city% den produserte FetchXML-betingelsen som kjøres av Dynamics 365, vil den se slik ut.

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

Nøkler, verdier og metadata

En UFX-pose inneholder nøkler og verdier, der noen verdier har flere metadata for å beskrive dem.

Et eksempel kan være en verdi av typen lookup (EntityReference). Når den spørres fra Dynamics 365 til FetchXML, returnerer den det logiske navnet på enheten og det formaterte visningsnavnet for oppføringen. UFX-posen bevarer denne tilleggsinformasjonen som metadata knyttet til primærverdien.

Serialisert til JSON, ser en lookup med metadata slik ut:

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

I XML:

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

XPath over Dynamics 365-data

Når dataene i en UFX-pose er skrevet, kan en UFX-spørring se dem i et strukturert format og bruke XPath til å krysse over dataene og velge verdier fra dem.

Et XPath-uttrykk som er angitt i et UFX-direktiv, ser dataene i posen på samme måte som strukturen til posen i XML-serialisert form. Dataene lagres imidlertid i NET-objekter i minnet (i forekomster av Entity og EntityCollection typer) og ikke i XML-dokumenter.

UFX-typereferanse

Alle UFX-typer støtter ufx-type og ufx-formatvalue metadata. Ytterligere metadata er beskrevet ved siden av hver type.

UFX-navn Kode for attributttype .NET-navn UFX-metadata
Bool boolsk boolsk
Int Heltall Int32
lang BigInt Int64
dobbel Dobbel Dobbel
desimal Desimal Desimal
datetime Date/klokkeslett Date/klokkeslett
Guid Unik identifikator Guid
streng Notat Streng
penger Penger Penger
opsjon Valgliste OpsjonssettVerdi
oppslag Oppslag EntityReference ufx-logicalname
pose I/T Enhet ufx-id
ufx-logicalname
liste I/T Samling av enheter
I/T I/T Aliased-verdi ufx-aliasentity
ufx-aliasattribute

UFX-spørringsdirektiver

UFX-direktiver kan brukes på poseegenskaper og på XML-elementer i en FetchXML-spørring.

UFX veske direktiver

Attributt Verdi Beskrivelse
ufx:if XPath Tester XPath-uttrykket og behandler bare egenskapen hvis testen returnerer sann
ufx:source fetch Kjører det innebygde <fetch> XML-elementet og tilordner resultatet til egenskapen
ufx:select XPath Kjører XPath-uttrykket og tilordner resultatet til egenskapen
Når spørring etter en bag eller list en valgfri underordnet bag i XML-skjema kan angis for å transformere resultatet av XPath-uttrykket

UFX FetchXML-direktiver

Element Attributt Verdi Beskrivelse
Alle elementer ufx:if XPath Tester XPath-uttrykket og sender bare XML-elementet hvis testene lykkes
ufx:apply select XPath Sløyfer over nodesettet som returneres av XPath-uttrykket, og sender ut de underordnede XML-elementene én gang for hver node
ufx:value select XPath Kjører XPath-uttrykket og skriver ut resultatet i det gjeldende XML-elementet
ufx:value attribute Navn på attributt Tilordner XPath-uttrykksresultatet til det angitte attributtnavnet på gjeldende XML-element

UFX XPath-funksjoner

UFX legger til mange nye funksjoner i tillegg til de som er tilgjengelige i XPath.

datoklokkeslett()

  • datetime(): Returnerer gjeldende klokkeslett i UTC

liste()

  • liste(veske | liste, ... [bag | list]): Tar et antall bag eller-verdier list som inndata og flater dem ut til ett enkelt list

slå opp til liste()

  • søkeopp-til-liste(oppslag, ... [lookup]): Tar en rekke lookup verdier, konverterer hver av dem til a bag med ufx-id metadatasettet og ufx-logicalname flater dem ut til ett enkelt list

alternativ-til-liste()

  • alternativ-til-liste(alternativ, ... [option]): Tar en rekke option verdier, konverterer hver av dem til en bag med én enkelt option egenskap og flater dem ut til én enkelt list

rekkefølge()

  • order(list, string, bool): Bestiller en liste etter en egenskap i hver pose. Egenskapen er angitt i argument 2, synkende er angitt i argument 3.
  • ordre(liste, liste): Sorter en liste etter flere sorteringsrekkefølger angitt som en liste i argument 2. Hver bag i den andre listen kan ha en name og descending egenskap

iif()

  • iif(any, any, any): Hvis argument 1 er sant, returnerer argument 2, ellers returnerer argument 3

UFX XPath-variabler

Navn Beskrivelse
$input A bag tilgjengelig for UFX-spørringen med inndataverdier
$null En nullkonstant. Hvis du velger $null på en eiendom, fjernes egenskapen fra posen
$current Referanse til gjeldende pose UFX-spørringen behandler

Flere ressurser

Forstå og tilpasse ressurssamsvar i Universal Resource Scheduling