ฟังก์ชัน Patch

ใช้กับ: แอปพื้นที่ทำงาน แอปแบบจำลอง Power Platform CLI โฟลว์เดสก์ท็อป

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

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

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

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

ภาพรวม

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

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

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

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

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

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

คำอธิบาย

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

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

  • เมื่อต้องการปรับเปลี่ยนเรกคอร์ด เรกคอร์ดพื้นฐานต้องมีมาจากแหล่งข้อมูล เรกคอร์ดพื้นฐานอาจผ่านมาทางคุณสมบัติ Items ของแกลเลอรี ที่ถูกวางใน ตัวแปรบริบท หรือมาทางพาธอื่นก็ได้ แต่คุณงสามารถติดตามเรกคอร์ดพื้นฐานกลับไปยังแหล่งข้อมูลได้ ซึ่งมีความสำคัญ เนื่องจากเรกคอร์ดจะรวมข้อมูลเพิ่มเติมสำหรับช่วยในการค้นหาเรกคอร์ดสำหรับการปรับเปลี่ยนอีกครั้งได้
  • การสร้างเรกคอร์ด ใช้ฟังก์ชัน 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 ถูกใช้งาน เรกคอร์ดจะถูกสร้างขึ้น
  • ChangeRecord(s) - จำเป็นต้องมี เรกคอร์ดอย่างน้อยหนึ่งหรือมากกว่าที่มีคุณสมบัติ เพื่อปรับเปลี่ยนใน BaseRecord เรกคอร์ดที่เปลี่ยนแปลงจะถูกประมวลผลตามลำดับจากจุดเริ่มต้นของรายการอาร์กิวเมนต์ไปยังจุดสิ้นสุด โดยมีค่าคุณสมบัติล่าสุดแทนที่ก่อนหน้า

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

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

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

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

Patch( Record1, Record2 [, …] )

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

ตัวอย่าง

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

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

IceCream ตัวอย่าง

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

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

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

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

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

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

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