Universal FetchXML להרחבת Universal Resource Scheduling

FetchXML אוניברסלי (UFX) היא שפת שאילתות מתקדמת שאפשר להשתמש בה לשאילתות נתונים באמצעות FetchXML דינמי. הוא מעצב ומכין את הנתונים המתקבלים לצריכה על ידי פתרון תזמון משאבים אוניברסלי (URS). שפת שאילתות זו מאפשרת לך ליצור שאילתות מותאמות אישית כדי להתאים אישית ולהרחיב את לוח הזמנים ואת מסנני מסייע לוחות הזמנים כדי לענות על הצרכים העסקיים הייחודיים של הארגון.

UFX מורכב משני רכיבים: שקית UFX ושאילתת UFX.

תיק UFX פשוט

שקית UFX מכילה נתונים מסווגים סטטית. בזיכרון, הוא מדגמן מילון עם מפתחות וערכים. אתה יכול לסדר את זה ל-JSON ו-XML. כאשר הנתונים מוקלטים, שאילתת UFX יכולה לשאול מהם נתונים, וממשק המשתמש של הלקוח יכול להיקשר אליו.

מסיבות מעשיות וביצועיות, שקית הזיכרון מיושמת מעל אובייקט SDK Entity של אפליקציות Dynamics 365.

תיק לדוגמה המכיל שני ערכים.

לזכר:

מפתח ערך סוג נתונים
שם שי מחרוזת
גיל 36 ת.ת

ב-JSON:

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

ב-XML:

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

סוגים נתמכים של UFX

תיק UFX יכול להכיל ערכים מסוגים רבים. הם מחולקים לשלוש מחלקות:

קטגוריה ערך
סוגים פשוטים bool (Boolean), int (Int32), long (Int64), double (Double), decimal (Decimal)datetime (DateTime), guid (Guid),string (String)
סוגים פשוטים ספציפיים של Dynamics 365: money (Money), option (OptionSet), lookup (EntityReference)
תיקים אחרים bag (Entity)
רשימת תיקים list (EntityCollection)

הנה שקית JSON לדוגמה המכילה סוגים נוספים:

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

אותו תיק ב-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

כתוב שאילתות UFX כשקיות UFX מבוססות XML. מאפיינים בתיק יכולים להכיל הוראות UFX לביצוע שאילתות על נתונים באופן דינאמי. שאילתת UFX מתבצעת באובייקטים בזיכרון, לא ב-XML. רק ההוראות כתובות ב-XML. אפשר לסדר את הפלט שלו ל-JSON או XML.

שאילתת UFX הבאה מגדירה את המאפיין accounts בתיק עם source הוראת UFX. כתוצאה מכך, Dynamics 365 מבצע את ה- FetchXML המוטבע, ומאכלס את accounts המאפיין ברשימה של תיקים. כאשר EntityCollection כל תיק מייצג רשומת תיק לקוח בודדת מ- 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>

שאילתת UFX מעובדת ברצף ויכולה להכיל שאילתות FetchXML רבות.

הנה קטע מהתוצאה של שאילתת ה-UFX הקודמת בסדרה ל-XML. חלק מהערכים מכילים מטא-דאטה שמתארת אותם בפירוט.

<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 select מקבלת ביטוי XPath שבוחר ערכים מהתיק הנוכחי.

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

התיק המתקבל ב-XML:

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

אין ספק שההיבט החזק ביותר של שאילתת UFX הוא היכולת שלה ליצור באופן דינמי FetchXML על סמך נתוני קלט.

בדוגמה הבאה, חפש חשבונות לפי ערך שסופק על ידי המשתמש וזמין כתיק UFX דרך משתנה XPath $input . שים לב להוראות ה-UFX ifו-value על האלמנט 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>

אם התכונה NameFilter בשקית הקלט כללה %city%, תנאי FetchXML שנוצר שבוצע על ידי Dynamics 365 היה נראה כך.

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

מפתחות, ערכים ומטה-נתונים

תיק UFX מכיל מפתחות וערכים, כאשר לערכים מסוימים יש יותר מטא-נתונים כדי לתאר אותם.

דוגמה יכולה להיות ערך מסוג lookup (EntityReference). כאשר מתבצעת שאילתה מ- Dynamics 365 דרך FetchXML, היא מחזירה את השם הלוגי של הישות ואת שם התצוגה המעוצב של הרשומה. שקית ה-UFX שומרת על המידע הנוסף הזה כמטא-דאטה שמצורף לערך הראשי.

בסדרה ל-JSON, a lookup עם מטא-נתונים נראה כך:

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

ב-XML:

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

XPath על נתוני Dynamics 365

כשאתה מקליד נתונים בתיק UFX, שאילתת UFX יכולה לראות אותם בפורמט מובנה ולהשתמש ב-XPath כדי לעבור על הנתונים ולבחור ערכים.

ביטוי XPath שצוין בהנחיית UFX רואה את הנתונים בתיק בדומה למבנה התיק בצורה סידורית XML. עם זאת, הנתונים מאוחסנים באובייקטי .NET בזיכרון (במופעים של Entity וסוגים EntityCollection ) ולא במסמכי XML.

הפניה לסוג UFX

כל סוגי ה-UFX תומכים ב-ו-metadata ufx-typeufx-formatvalue . הטבלה הבאה מתארת מטא-דאטה נוספים לכל סוג.

שם UFX קוד סוג תכונה שם .NET מטא נתונים של UFX
בול בוליאני בוליאני
ת.ת מספר שלם אינט 32
ארוך ביגנט אינט 64
כפול כפול כפול
עשרוני עשרוני עשרוני
תאריך ושעה תאריך ושעה תאריך ושעה
GUID מזהה ייחודי GUID
מחרוזת תזכיר מחרוזת
כסף כסף כסף
אפשרות רשימת בחירה OptionSetValue
בדיקת מידע בדיקת מידע EntityReference ufx-logicalname
תיק לא ישים ישות ufx-id
ufx-logicalname
רשימה לא ישים EntityCollection
לא ישים לא ישים כינוי ערך ufx-aliasentity
ufx-aliasattribute

הוראות שאילתות UFX

השתמש בהוראות UFX על מאפייני bag ועל אלמנטים XML בשאילתת FetchXML.

הנחיות שקיות UFX

תכונה ערך תיאור
ufx:if XPath בדיקת ביטוי XPath ועיבוד המאפיין רק אם הבדיקה מחזירה true
ufx:source fetch מפעיל את רכיב ה- XML המוטבע <fetch> ומקצה את התוצאה למאפיין
ufx:select XPath ביצוע ביטוי XPath והקצאת התוצאה למאפיין
בעת שאילתור עבור או baglist, ניתן לציין ילד bag אופציונלי בצורת XML כדי להמיר את תוצאת הביטוי XPath

הוראות UFX FetchXML

אלמנט תכונה ערך תיאור
כל האלמנטים ufx:if XPath בודק את הביטוי XPath ופולט את אלמנט ה-XML רק אם הבדיקה מצליחה
ufx:apply select XPath לולאה מעל ערכת הצומת המוחזרת על-ידי ביטוי XPath ומוציאה את רכיבי ה-XML הצאצאים פעם אחת עבור כל צומת
ufx:value select XPath מבצע את ביטוי XPath ומוציא את התוצאה ברכיב XML הנוכחי
ufx:value attribute שם תכונה הקצאת תוצאת ביטוי XPath לשם התכונה שצוינה ברכיב ה- XML הנוכחי

פונקציות UFX XPath

UFX מוסיף פונקציות חדשות רבות בנוסף לאלו הזמינות באופן מקורי ב-XPath.

datetime()

  • datetime(): מחזיר את השעה הנוכחית ב-UTC.

רשימה ()

  • list(bag | list, ...[bag | list]): לוקחת מספר של bag ערכי Or list כקלט ומשטחת אותם ליחיד list.

lookup-to-list()

  • lookup-to-list(lookup, ...[lookup]): לוקח מספר lookup ערכים, ממיר כל ערך ל-a bag עם ufx-id מערך ו-מטא-דאטה ufx-logicalname , ומשטח אותם לערך אחד list.

option-to-list()

  • option-to-list(option, ...[option]): מקבל מספר option ערכים, ממיר כל ערך ל-a bag עם תכונה אחת option , ומשטח אותם לערך יחיד list.

סדר()

  • order(list, string, bool): מסדר רשימה לפי תכונה בכל bag. ציין את התכונה בארגומנט השני, וציין סדר יורד בארגומנט השלישי.
  • order(list, list): מסדר רשימה לפי מספר סדרי מיון המוגדרים כרשימה בארגומנט השני. לכל bag אחד ברשימה השנייה יכול להיות תכונה ו namedescending -.

iif()

  • iif(any, any, any): אם הטיעון הראשון נכון, מחזיר את הארגומנט השני. אחרת, מחזיר את הטיעון השלישי.

משתני UFX XPath

שם תיאור
$input A bag זמין לשאילתת UFX עם ערכי קלט
$null קבוע אפס. בחירה $null בנכס מסירה את הנכס מה- bag
$current התייחסות לנוכח bag ששאילתת ה-UFX מעבדת

משאבים נוספים

הבנה והתאמה אישית של התאמת משאבים ב- Universal Resource Scheduling