แชร์ผ่าน


ฟังก์ชัน Patch

นําไปใช้กับ: แอป พื้นที่ทํางาน Copilot Studio Desktop โฟลว์ แอป แบบจําลอง Power Platform CLI ฟังก์ชัน Dataverse

ปรับเปลี่ยนหรือสร้าง เรกคอร์ด ใน แหล่งข้อมูล หรือผสานเรกคอร์ดภายนอกแหล่งข้อมูลจำนวนหนึ่งหรือมากกว่า

Patchใช้ฟังก์ชันเพื่อปรับเปลี่ยนระเบียนในสถานการณ์ที่ซับซ้อน เช่น เมื่อคุณทําการอัปเดตที่จําเป็นต้องมีการโต้ตอบของผู้ใช้หรือใช้ฟอร์มที่ครอบคลุมหลายหน้าจอ

การอัปเดตเรกคอร์ดในแหล่งข้อมูล ง่ายขึ้นสำหรับการเปลี่ยนแปลงง่ายๆ ให้ใช้ตัวควบคุม แก้ไขฟอร์ม แทน เมื่อคุณเพิ่มตัวควบคุม แก้ไขฟอร์ม คุณได้ให้ฟอร์มแก่ผู้ใช้เพื่อกรอกข้อมูล แล้วบันทึกการเปลี่ยนแปลงไปยังแหล่งข้อมูล สำหรับข้อมูลเพิ่มเติม ให้ดู ทำความเข้าใจฟอร์มข้อมูล

ดูวิดีโอนี้เพื่อเรียนรู้วิธีการใช้ Patch ฟังก์ชัน:

ภาพรวม

Patchใช้ฟังก์ชันเพื่อปรับเปลี่ยนระเบียนของแหล่งข้อมูลอย่างน้อยหนึ่งระเบียน ค่าของ ฟิลด์ ที่ระบุ จะถูกปรับเปลี่ยนโดยไม่กระทบต่อคุณสมบัติอื่นๆ ตัวอย่างเช่น สูตรนี้จะเปลี่ยนหมายเลขโทรศัพท์ให้ลูกค้าที่มีชื่อว่า Contoso:

Patch( Customers, LookUp( Customers, Name = "Contoso" ), { Phone: "1-212-555-1234" } )

ใช้กับ Patch ฟังก์ชัน Defaults เพื่อสร้างระเบียน ใช้ลักษณะการทำงานนี้เพื่อสร้าง หน้าจอเดียว สำหรับทั้งการสร้างและการแก้ไขเรกคอร์ด ตัวอย่างเช่น สูตรนี้จะสร้างเรกคอร์ดสำหรับลูกค้าที่มีชื่อว่า Contoso:

Patch( Customers, Defaults( Customers ), { Name: "Contoso" } )

Note

เมื่อคุณแก้ไขคอลเลกชันโดยใช้เรกคอร์ดจากแหล่งข้อมูลที่มีค่าเริ่มต้น การดําเนินการแก้ไขจะอัปเดตคอลเลกชันด้วยค่าโปรแกรมแก้ไขที่ระบุและค่าเริ่มต้นจากแหล่งข้อมูล แหล่งข้อมูลของคําสั่งโปรแกรมแก้ไขและแหล่งข้อมูลของฟังก์ชัน Defaults ต้องตรงกันเพื่อสร้างเรกคอร์ดใหม่

แม้ว่าคุณจะไม่ได้กําลังทํางานกับแหล่งข้อมูล คุณสามารถใช้ Patch เพื่อผสานระเบียนสองระเบียนหรือมากกว่าได้ ตัวอย่างเช่น สูตรนี้รวมเรกคอร์ดสองเรกคอร์ดเป็นเรกคอร์ดเดียว ที่ระบุทั้งหมายเลขโทรศัพท์และตำแหน่งที่ตั้งสำหรับ Contoso:

Patch( { Name: "Contoso", Phone: "1-212-555-1234" }, { Name: "Contoso", Location: "Midtown" } )

คำอธิบาย

ปรับเปลี่ยนหรือสร้างเรกคอร์ดในแหล่งข้อมูล

การใช้ฟังก์ชันนี้กับแหล่งข้อมูล ให้ระบุแหล่งข้อมูลแล้วจึงระบุเรกคอร์ดพื้นฐาน:

  • เมื่อต้องการปรับเปลี่ยนเรกคอร์ด เรกคอร์ดพื้นฐานต้องมีมาจากแหล่งข้อมูล ระเบียนพื้นฐานอาจผ่านมาทางคุณสมบัติ รายการของ แกลเลอรี ถูกวางลงใน ตัวแปรบริบท หรือมาทางเส้นทางอื่นก็ได้ แต่คุณงสามารถติดตามเรกคอร์ดพื้นฐานกลับไปยังแหล่งข้อมูลได้ ซึ่งมีความสําคัญ เนื่องจากระเบียนมีข้อมูลเพิ่มเติมเพื่อช่วยในการค้นหาระเบียนสําหรับการปรับเปลี่ยนอีกครั้ง
  • การสร้างเรกคอร์ด ใช้ฟังก์ชัน Defaults เพื่อสร้างเรกคอร์ดพื้นฐานโดยใช้ค่าเริ่มต้น

จากนั้น ระบุเรกคอร์ดที่เปลี่ยนแปลงอย่างน้อยหนึ่งหรือมากกว่า ซึ่งแต่ละเรกคอร์ดจะประกอบด้วยค่าคุณสมบัติใหม่ที่แทนค่าคุณสมบัติในเรกคอร์ดฐาน เรกคอร์ดที่เปลี่ยนแปลงจะถูกประมวลผลตามลำดับจากจุดเริ่มต้นของรายการอาร์กิวเมนต์ไปยังจุดสิ้นสุด โดยมีค่าคุณสมบัติล่าสุดแทนที่ก่อนหน้า

ค่าที่ส่งกลับของ Patch คือระเบียนที่คุณปรับเปลี่ยนหรือสร้างขึ้น ถ้าคุณสร้างระเบียน ค่าที่ส่งกลับอาจรวมถึงคุณสมบัติที่แหล่งข้อมูลที่สร้างขึ้นโดยอัตโนมัติ อย่างไรก็ตาม ค่าส่งกลับไม่ได้ระบุค่าสำหรับฟิลด์ของตารางที่เกี่ยวข้อง

ตัวอย่างเช่น คุณใช้ Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); จากนั้น MyAccount.'Primary Contact'.'Full Name' คุณไม่สามารถใช้ชื่อเต็มในกรณีนี้ หากต้องการเข้าถึงฟิลด์ของตารางที่เกี่ยวข้อง ให้ใช้การค้นหาแยกต่างหาก เช่น:

LookUp(Accounts, Account = MyAccount.Account).'Primary Contact'.'Full Name'

เมื่อคุณอัปเดตแหล่งข้อมูล อาจเกิดปัญหาอย่างน้อยหนึ่งหรือมากกว่าขึ้นได้ ใช้ IfError และ IsError ด้วยค่าที่ส่งกลับจาก Patch เพื่อตรวจหาและตอบสนองต่อข้อผิดพลาด ตามที่ การจัดการข้อผิดพลาด อธิบายไว้ คุณยังสามารถใช้ฟังก์ชัน Errors เพื่อระบุและตรวจสอบปัญหา ตามที่ การทำงานกับแหล่งข้อมูล อธิบายไว้

ฟังก์ชันที่เกี่ยวข้องรวมถึงฟังก์ชัน Update ซึ่งคุณสามารถใช้เพื่อแทนที่ทั้งเรกคอร์ด และฟังก์ชัน Collect ซึ่งคุณสามารถใช้เพื่อสร้างเรกคอร์ดได้ ใช้ฟังก์ชัน UpdateIf เพื่อปรับเปลี่ยนคุณสมบัติเฉพาะเจาะจงของเรกคอร์ดหลายเรกคอร์ด โดยยึดตามเงื่อนไขได้

ปรับเปลี่ยนหรือสร้างชุดของเรกคอร์ดในแหล่งข้อมูล

Patch นอกจากนี้ ยังสามารถใช้เพื่อสร้างหรือปรับเปลี่ยนหลายระเบียนด้วยการเรียกเดียวได้

แทนที่จะส่งผ่านเรกคอร์ดพื้นฐานเดียว สามารถระบุตารางเรกคอร์ดพื้นฐานในอาร์กิวเมนต์ที่สองได้ มีเรกคอร์ดที่เปลี่ยนแปลงในตารางได้เช่นกัน ซึ่งสอดคล้องกันกับเรกคอร์ดพื้นฐานแบบหนึ่งต่อหนึ่ง จำนวนเรกคอร์ดในตารางที่เปลี่ยนแปลงแต่ละตารางจะต้องเหมือนกับจำนวนเรกคอร์ดในตารางพื้นฐาน

เมื่อใช้ Patch ในลักษณะนี้ ค่าที่ส่งกลับยังเป็นตารางที่ มีแต่ละระเบียนสอดคล้องกันแบบหนึ่งต่อหนึ่งกับระเบียนพื้นฐานและระเบียนที่เปลี่ยนแปลง

ผสานเรกคอร์ดภายนอกแหล่งข้อมูล

ระบุเรกคอร์ดอย่างน้อยสองเรกคอร์ดหรือมากกว่าที่คุณต้องการผสาน เรกคอร์ดจะถูกประมวลผลตามลำดับ จากจุดเริ่มต้นของรายการอาร์กิวเมนต์ไปยังจุดสิ้นสุด โดยมีค่าคุณสมบัติล่าสุดแทนที่ก่อนหน้า

Patch แสดงระเบียนที่ผสานและไม่ปรับเปลี่ยนอาร์กิวเมนต์หรือระเบียนของระเบียนในแหล่งข้อมูลใด ๆ

ไวยากรณ์

ปรับเปลี่ยนหรือสร้างเรกคอร์ดในแหล่งข้อมูล

Patch( DataSource, BaseRecord, ChangeRecord1 [, ChangeRecord2, ... ])

  • DataSource – จำเป็น แหล่งข้อมูลที่ประกอบด้วยเรกคอร์ดที่คุณต้องการปรับเปลี่ยน หรือจะประกอบด้วยเรกคอร์ดที่คุณต้องการจะสร้าง
  • BaseRecord – จำเป็น จำเป็นต้องมี สำหรับปรับเปลี่ยนหรือสร้างขึ้น ถ้าเรกคอร์ดมาจากแหล่งข้อมูล เรกคอร์ดจะถูกพบและปรับเปลี่ยน ถ้าผลลัพธ์ของ Defaults ถูกใช้งาน เรกคอร์ดจะถูกสร้างขึ้น แหล่งข้อมูลของคําสั่งโปรแกรมแก้ไขและแหล่งข้อมูลของฟังก์ชัน Defaults ต้องตรงกันเพื่อสร้างเรกคอร์ดใหม่
  • ChangeRecords – จำเป็น เรกคอร์ดอย่างน้อยหนึ่งหรือมากกว่าที่มีคุณสมบัติ เพื่อปรับเปลี่ยนใน BaseRecord เรกคอร์ดที่เปลี่ยนแปลงจะถูกประมวลผลตามลำดับจากจุดเริ่มต้นของรายการอาร์กิวเมนต์ไปยังจุดสิ้นสุด โดยมีค่าคุณสมบัติล่าสุดแทนที่ก่อนหน้า

ปรับเปลี่ยนหรือสร้างชุดของเรกคอร์ดในแหล่งข้อมูล

Patch( DataSource, BaseRecordsTable, ChangeRecordTable1 [, ChangeRecordTable2, ... ] )

  • DataSource – จำเป็น แหล่งข้อมูลที่ประกอบด้วยเรกคอร์ดที่คุณต้องการปรับเปลี่ยน หรือจะประกอบด้วยเรกคอร์ดที่คุณต้องการจะสร้าง
  • BaseRecordTable – จำเป็น ตารางของเรกคอร์ดสำหรับปรับเปลี่ยนหรือสร้างขึ้น ถ้าเรกคอร์ดมาจากแหล่งข้อมูล เรกคอร์ดจะถูกพบและปรับเปลี่ยน ถ้าผลลัพธ์ของ Defaults ถูกใช้งาน เรกคอร์ดจะถูกสร้างขึ้น แหล่งข้อมูลของคําสั่งโปรแกรมแก้ไขและแหล่งข้อมูลของฟังก์ชัน Defaults ต้องตรงกันเพื่อสร้างเรกคอร์ดใหม่
  • ChangeRecordTables – จำเป็น ตารางของเรกคอร์ดอย่างน้อยหนึ่งหรือมากกว่าที่ประกอบด้วยคุณสมบัติเพื่อปรับเปลี่ยนสำหรับเรกคอร์ดแต่ละเรกคอร์ดของ BaseRecordTable เรกคอร์ดที่เปลี่ยนแปลงจะถูกประมวลผลตามลำดับจากจุดเริ่มต้นของรายการอาร์กิวเมนต์ไปยังจุดสิ้นสุด โดยมีค่าคุณสมบัติล่าสุดแทนที่ก่อนหน้า

การผสานเรกคอร์ด

Patch( Record1, Record2 [, ...] )

  • บันทึก - จำเป็น เรกคอร์ดอย่างน้อยสองเรกคอร์ดหรือมากกว่าที่คุณต้องการผสาน เรกคอร์ดจะถูกประมวลผลตามลำดับ จากจุดเริ่มต้นของรายการอาร์กิวเมนต์ไปยังจุดสิ้นสุด โดยมีค่าคุณสมบัติล่าสุดแทนที่ก่อนหน้า

ตัวอย่าง

ปรับเปลี่ยนหรือสร้างเรกคอร์ด (ในแหล่งข้อมูล)

ในตัวอย่างเหล่านี้ คุณจะปรับเปลี่ยนหรือสร้างเรกคอร์ดในแหล่งข้อมูล มีชื่อว่า IceCream ที่ประกอบด้วยข้อมูลใน ตาราง นี้ และสร้างค่าใน IDคอลัมน์ โดยอัตโนมัติ:

IceCream ตัวอย่าง

สูตร คำอธิบาย Result
Patch( ไอศกรีม,
LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } )
ปรับเปลี่ยนเรกคอร์ดในแหล่งข้อมูล IceCream:
  • คอลัมน์ ID ของเรกคอร์ดที่จะปรับเปลี่ยน ประกอบด้วยค่าของ 1 (ในเรกคอร์ด ช็อกโกแลต มี ID นั้น)
  • ค่าในคอลัมน์ ปริมาณ จะเปลี่ยนแปลงเป็น 400
{ ID: 1, รสชาติ: "ช็อกโกแลต", ปริมาณ: 400 }

รายการ ช็อกโกแลต ในแหล่งข้อมูล IceCream ได้ถูกปรับเปลี่ยนแล้ว
Patch( ไอศกรีม, Defaults( ไอศกรีม ), { รสชาติ: "สตรอเบอรี่" } ) สร้างเรกคอร์ดในแหล่งข้อมูล IceCream:
  • คอลัมน์ ID ประกอบด้วยค่า 3 ซึ่งสร้างแหล่งข้อมูลโดยอัตโนมัติ
  • คอลัมน์ ปริมาณ ประกอบด้วย 0 ซึ่งเป็นค่าเริ่มต้นสำหรับคอลัมน์นั้นในแหล่งข้อมูล IceCream ตามที่ฟังก์ชัน Defaults ระบุไว้
  • คอลัมน์ รสชาติ ประกอบด้วยค่าของ สตรอเบอรี่
{ ID: 3, รสชาติ: "สตรอเบอรี่", ปริมาณ: 0 }

รายการ สตรอเบอรี่ ในแหล่งข้อมูล IceCream ถูกสร้างขึ้นแล้ว

หลังจากสูตรก่อนหน้าได้รับการคำนวณ แหล่งข้อมูลจะลงท้ายด้วยค่าดังต่อไปนี้:

หลังจาก IceCream ตัวอย่าง

ผสานเรกคอร์ด (ภายนอกแหล่งข้อมูล)

สูตร คำอธิบาย Result
Patch( { ชื่อ: "James", Score: 90 }, { Name: "Jim", Passed: true } ) ผสานเรกคอร์ดสองเรกคอร์ดภายนอกแหล่งข้อมูล:
  • ค่าในคอลัมน์ ชื่อ ของแต่ละเรกคอร์ดไม่ตรงกัน ผลลัพธ์จะประกอบด้วยค่า (Jim) ในเรกคอร์ดที่ใกล้กับด้านท้ายของรายการอาร์กิวเมนต์แทนค่า (James) ในเรกคอร์ดที่ใกล้กับจุดเริ่มต้น
  • เรกคอร์ดแรกประกอบด้วยคอลัมน์ (คะแนน) ที่ไม่มีอยู่ในเรกคอร์ดที่สอง ผลลัพธ์ประกอบด้วยคอลัมน์ที่มีค่า (90)
  • เรกคอร์ดที่สองประกอบด้วยคอลัมน์ (Passed) ที่ไม่มีอยู่ในเรกคอร์ดแรก ผลลัพธ์ที่ประกอบด้วยคอลัมน์นั้นที่มีค่า (จริง)
{ ชื่อ: "Jim", Score: 90, Passed: true }

การใช้ As หรือ ThisRecord

การใช้คำสำคัญ As หรือ ThisRecord ในสูตรหลีกเลี่ยงบริบทการประเมินที่ไม่ชัดเจน

ในตัวอย่างด้านล่าง ให้พิจารณาการค้นหาครั้งแรกในคำชี้แจง If (OrderID = A[@OrderID]) คาดว่าจะเปรียบเทียบ OrderId ในขอบเขตการค้นหากับ OrderId ของคอลเลกชัน A ในขอบเขต ForAll ในกรณีนี้ คุณน่าจะต้องการให้ A[@OrderId] แก้ไขเป็นพารามิเตอร์ภายในเครื่อง แต่จะมีความคลุมเครือ

Power Apps ปัจจุบันตีความทั้ง OrderId ด้านซ้ายมือและ A[@OrderId] ด้านขวามือเป็นฟิลด์ในขอบเขตการค้นหา ดังนั้น การค้นหาจะค้นหาแถวแรกใน [dbo].[Orders1] เสมอ เนื่องจากเงื่อนไขเป็นจริงเสมอ (นั่นคือแถว OrderId ใด ๆ เท่ากับตัวมันเอง)

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]',
            OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]',
                OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

การใช้ As หรือ ThisRecord

เมื่อใดก็ตามที่เป็นไปได้ ให้ใช้ตัวดำเนินการ As หรือ ThisRecord เพื่อจำแนกทางด้านซ้ายมือ As ขอแนะนำสำหรับสถานการณ์ข้างต้น

เมื่อสูตรของคุณใช้หลายขอบเขตด้วย ForAll, Filter และ Lookup ในแหล่งข้อมูลหรือตารางเดียวกัน เป็นไปได้ว่าพารามิเตอร์ขอบเขตอาจชนกับฟิลด์เดียวกัน ดังนั้น จึงขอแนะนำให้ใช้ตัวดำเนินการ As หรือ ThisRecord เพื่อแก้ไขชื่อฟิลด์และหลีกเลี่ยงความคลุมเครือ

ตัวอย่างเช่น คุณสามารถใช้ตัวดำเนินการ As เพื่อจำแนกในตัวอย่างด้านล่าง

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]' As B,
            B.OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]' As C,
                C.OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

หรือ คุณสามารถใช้ ThisRecord เพื่อจุดประสงค์เดียวกัน

ClearCollect(
    A,
    Filter(
        '[dbo].[Orders1]',
        OrderId = 8888888
    )
);
ForAll(
    A,
    If(
        LookUp(
            '[dbo].[Orders1]',
            ThisRecord.OrderId = A[@OrderId],
            "OK"
        ) = "OK",
        Patch(
            '[dbo].[Orders1]',
            LookUp(
                '[dbo].[Orders1]',
                ThisRecord.OrderId = A[@OrderId]
            ),
            {
      OrderName: "val1"
       }
   ),
   Patch(
            '[dbo].[Orders1]',
            Defaults('[dbo].[Orders1]'),
            {
      OrderName: "val2"
       }
   )
    )
)

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการใช้ตัวดำเนินการ As และ ThisRecord ดูที่บทความ ตัวดำเนินการ