แชร์ผ่าน


ขยาย Universal Resource Scheduling ด้วย FetchXML สากล

UFX เป็นภาษาในการสอบถามขั้นสูงที่ช่วยให้คุณสามารถสอบถามข้อมูลได้โดยใช้ FetchXML ไดนามิก รูปร่าง และเตรียมข้อมูลที่เป็นผลลัพธ์สำหรับการใช้โดยโซลูชัน Universal Resource Scheduling (URS) ภาษาของแบบสอบถามนี้ช่วยให้คุณสามารถสร้างแบบสอบถามแบบกำหนดเองเพื่อปรับแต่ง และขยายบอร์ดกำหนดการและตัวกรองผู้ช่วยจัดกำหนดการ เพื่อให้ตรงกับความต้องการทางธุรกิจเฉพาะขององค์กร

UFX ประกอบด้วยส่วนประกอบสองรายการ ที่เก็บ UFX และแบบสอบถาม UFX

ที่เก็บ UFX อย่างง่าย

ที่เก็บ UFX ประกอบด้วย ข้อมูลที่พิมพ์แบบคงที่ ในหน่วยความจำ จะมีการแสดงเป็นพจนานุกรมที่มีคีย์และค่า สามารถเป็นอนุกรมกับ JSON และ XML ได้ การพิมพ์ข้อมูลอนุญาตให้ การสอบถาม UFX สอบถามข้อมูลจากรายการนั้น และผูกกับ UI ไคลเอ็นต์

เพื่อเหตุผลทางปฏิบัติและประสิทธิภาพการทำงาน ที่เก็บในหน่วยความจำถูกนำไปใช้ที่ด้านบนของออบเจ็กต์แอป Dynamics 365 SDK Entity

ที่เก็บตัวอย่างที่ประกอบด้วยค่าสองค่า

ในหน่วยความจำ:

คีย์ ค่า ชนิด
ชื่อ จอห์น สตริง
อายุ 36 int

ใน 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 ในที่เก็บที่มีคำสั่ง UFX ของ source นี่ส่งผลต่อ FetchXML แบบอินไลน์ ที่จะถูกดำเนินการโดย Dynamics 365 และคุณสมบัติ 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 ผ่านตัวแปร $input XPath สังเกตว่า คำสั่ง UFX ถ้า และ ค่า ในองค์ประกอบ 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 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

ภาคผนวก A: การอ้างอิงชนิด UFX

หมายเหตุ: UFX ทุกชนิดสนับสนุนข้อมูลเมตา ufx-type และ ufx-formatvalue ข้อมูลเมตาเพิ่มเติมถูกอธิบายไว้ถัดจากชนิดแต่ละชนิดในตารางด้านล่าง

ชื่อ UFX รหัสชนิดแอตทริบิวต์ ชื่อ .NET ข้อมูลเมตา UFX
bool บูลีน บูลีน
int จำนวนเต็ม Int32
long BigInt Int64
double สองครั้ง สองครั้ง
ทศนิยม ทศนิยม ทศนิยม
datetime วันที่และเวลา วันที่และเวลา
guid Uniqueidentifier Guid
สตริง บันทึกช่วยจำ String
จำนวนเงิน จำนวนเงิน จำนวนเงิน
ตัวเลือก รายการให้เลือก OptionSetValue
การค้นหา ค้นหา EntityReference ufx-logicalname
ที่เก็บ ไม่มีข้อมูล เอนทิตี ufx-id
ufx-logicalname
list ไม่มีข้อมูล EntityCollection
ไม่มีข้อมูล ไม่มีข้อมูล AliasedValue ufx-aliasentity
ufx-aliasattribute

ภาคผนวก B: คำสั่งของแบบสอบถาม UFX

สามารถใช้คำสั่ง UFX ได้ในคุณสมบัติที่เก็บ และในองค์ประกอบ XML ของแบบสอบถาม FetchXML

คำสั่งที่เก็บของ UFX

แอตทริบิวต์ Value คำอธิบาย
ufx:if XPath ทดสอบนิพจน์ XPath และประมวลผลเฉพาะคุณสมบัติ ถ้าการทดสอบส่งกลับค่าจริง
ufx:source fetch ดำเนินการองค์ประกอบ XML <fetch> แบบอินไลน์ และกำหนดผลลัพธ์ไปยังคุณสมบัติ
ufx:select XPath ดำเนินการนิพจน์ XPath และกำหนดผลลัพธ์ไปยังคุณสมบัติ
เมื่อการสอบถามสำหรับ bag หรือ list รายการรองเพิ่มเติม bag ในฟอร์ม XML สามารถถูกระบุเพื่อแปลงผลลัพธ์ของนิพจน์ XPath ได้

คำสั่ง UFX FetchXML

องค์ประกอบ แอตทริบิวต์ Value คำอธิบาย
องค์ประกอบทั้งหมด ufx:if Xpath ทดสอบนิพจน์ XPath และส่งองค์ประกอบ XML เท่านั้น ถ้าการทดสอบสำเร็จ
ufx:apply select XPath ลูปผ่าน nodeset ที่ถูกส่งกลับโดยนิพจน์ XPath และให้ผลองค์ประกอบ XML รองหนึ่งครั้งสำหรับแต่ละโหนด
ufx:value select Xpath ดำเนินการนิพจน์ XPath และให้ผลผลลัพธ์ในองค์ประกอบ XML ปัจจุบัน
ufx:value attribute ชื่อแอตทริบิวต์ กำหนดผลลัพธ์ของนิพจน์ XPath ไปยังชื่อแอตทริบิวต์ที่ระบุในองค์ประกอบ XML ปัจจุบัน

ภาคผนวก C: ฟังก์ชัน UFX XPath

UFX เพิ่มฟังก์ชันใหม่มากมาย นอกเหนือจากรายการที่พร้อมใช้งานอยู่ใน XPath

datetime()

  • datetime(): ส่งกลับค่าเวลาปัจจุบันใน UTC

list()

  • list(bag | list, ...[bag | list]): ใช้จำนวนของค่า bag หรือ list เป็นข้อมูลป้อนเข้าและยุบรายการเหล่านั้นไว้ใน list เดียว

lookup-to-list()

  • lookup-to-list(lookup, ...[lookup]): ใช้จำนวนของค่า lookup แปลงแต่ละรายการเป็น bag กับชุดข้อมูลเมตา ufx-id และ ufx-logicalname และยุบรายการเหล่านั้นไว้ใน list เดียว

option-to-list()

  • option-to-list(option, ...[option]): ใช้จำนวนของค่า option แปลงแต่ละรายการเป็น bag กับคุณสมบัติ option เดียว และยุบรายการเหล่านั้นไว้ใน list เดียว

order()

  • order(list, string, bool): เรียงลำดับรายการตามคุณสมบัติในที่เก็บแต่ละรายการ คุณสมบัติถูกระบุไว้ในอาร์กิวเมนต์ 2 การเรียงลำดับจากมากไปน้อยถูกระบุไว้ในอาร์กิวเมนต์ 3
  • order(list, list): เรียงลำดับรายการตามลำดับการจัดเรียงที่หลากหลายซึ่งระบุเป็นรายการในอาร์กิวเมนต์ 2 แต่ละ bag ในรายการที่สองสามารถมีคุณสมบัติ name และ descending ได้

iif()

  • iif(any, any, any): ถ้าอาร์กิวเมนต์ 1 เป็นจริง ส่งกลับอาร์กิวเมนต์ 2 มิฉะนั้น ส่งกลับอาร์กิวเมนต์ 3

ภาคผนวก D: ตัวแปร UFX XPath

ชื่อ คำอธิบาย
$input bag ที่พร้อมใช้งานสำหรับแบบสอบถาม UFX ที่มีค่าอินพุต
$null ค่าคงที่ null การเลือก $null ในคุณสมบัติจะลบคุณสมบัติออกจากที่เก็บ
$current การอ้างอิงถึงไปยังที่เก็บปัจจุบันที่กำลังถูกประมวลผลโดยแบบสอบถาม UFX

ดูเพิ่มเติม

การทำความเข้าใจ และการกำหนดการจับคู่ทรัพยากรด้วยตนเองใน Universal Resource Scheduling

Universal Resource Scheduling บันทึกย่อประจำรุ่นของความสามารถในการเพิ่ม