ฟังก์ชัน Patch
ใช้กับ: แอป Canvas แอปที่ใช้โมเดล 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 ในลักษณะนี้ ค่าส่งกลับยังเป็นตารางที่ มีแต่ละเรกคอร์ดสอดคล้องกันแบบหนึ่งต่อหนึ่งกับเรกคอร์ดพื้นฐานและเรกคอร์ดที่เปลี่ยนแปลง
ผสานเรกคอร์ดภายนอกแหล่งข้อมูล
ระบุเรกคอร์ดอย่างน้อยสองเรกคอร์ดหรือมากกว่าที่คุณต้องการผสาน เรกคอร์ดจะถูกประมวลผลตามลำดับ จากจุดเริ่มต้นของรายการอาร์กิวเมนต์ไปยังจุดสิ้นสุด โดยมีค่าคุณสมบัติล่าสุดแทนที่ก่อนหน้า
แพตช์ ส่งคืนระเบียนที่ผสานกันและจะไม่แก้ไขอาร์กิวเมนต์หรือระเบียนในแหล่งข้อมูลใดๆ
ไวยากรณ์
ปรับเปลี่ยนหรือสร้างเรกคอร์ดในแหล่งข้อมูล
โปรแกรมแก้ไข( แหล่งข้อมูล, BaseRecord, ChangeRecord1 [, บันทึกการเปลี่ยนแปลง2, … ])
- DataSource – จำเป็น แหล่งข้อมูลที่ประกอบด้วยเรกคอร์ดที่คุณต้องการปรับเปลี่ยน หรือจะประกอบด้วยเรกคอร์ดที่คุณต้องการจะสร้าง
- BaseRecord – จำเป็น จำเป็นต้องมี สำหรับปรับเปลี่ยนหรือสร้างขึ้น ถ้าเรกคอร์ดมาจากแหล่งข้อมูล เรกคอร์ดจะถูกพบและปรับเปลี่ยน ถ้าผลลัพธ์ของ Defaults ถูกใช้งาน เรกคอร์ดจะถูกสร้างขึ้น
- ChangeRecord(s) – จำเป็น เรกคอร์ดอย่างน้อยหนึ่งหรือมากกว่าที่มีคุณสมบัติ เพื่อปรับเปลี่ยนใน BaseRecord เรกคอร์ดที่เปลี่ยนแปลงจะถูกประมวลผลตามลำดับจากจุดเริ่มต้นของรายการอาร์กิวเมนต์ไปยังจุดสิ้นสุด โดยมีค่าคุณสมบัติล่าสุดแทนที่ก่อนหน้า
ปรับเปลี่ยนหรือสร้างชุดของเรกคอร์ดในแหล่งข้อมูล
โปรแกรมแก้ไข( แหล่งข้อมูล, BaseRecordsTable, ChangeRecordTable1 [, ChangeRecordTable2, … ] )
- DataSource – จำเป็น แหล่งข้อมูลที่ประกอบด้วยเรกคอร์ดที่คุณต้องการปรับเปลี่ยน หรือจะประกอบด้วยเรกคอร์ดที่คุณต้องการจะสร้าง
- BaseRecordTable – จำเป็น ตารางของเรกคอร์ดสำหรับปรับเปลี่ยนหรือสร้างขึ้น ถ้าเรกคอร์ดมาจากแหล่งข้อมูล เรกคอร์ดจะถูกพบและปรับเปลี่ยน ถ้าผลลัพธ์ของ Defaults ถูกใช้งาน เรกคอร์ดจะถูกสร้างขึ้น
- ChangeRecordTable(s) – จำเป็น ตารางของเรกคอร์ดอย่างน้อยหนึ่งหรือมากกว่าที่ประกอบด้วยคุณสมบัติเพื่อปรับเปลี่ยนสำหรับเรกคอร์ดแต่ละเรกคอร์ดของ BaseRecordTable เรกคอร์ดที่เปลี่ยนแปลงจะถูกประมวลผลตามลำดับจากจุดเริ่มต้นของรายการอาร์กิวเมนต์ไปยังจุดสิ้นสุด โดยมีค่าคุณสมบัติล่าสุดแทนที่ก่อนหน้า
การผสานเรกคอร์ด
แพตช์( ระเบียน1, ระเบียน2 [, …] )
- บันทึก - จำเป็น เรกคอร์ดอย่างน้อยสองเรกคอร์ดหรือมากกว่าที่คุณต้องการผสาน เรกคอร์ดจะถูกประมวลผลตามลำดับ จากจุดเริ่มต้นของรายการอาร์กิวเมนต์ไปยังจุดสิ้นสุด โดยมีค่าคุณสมบัติล่าสุดแทนที่ก่อนหน้า
ตัวอย่าง
ปรับเปลี่ยนหรือสร้างเรกคอร์ด (ในแหล่งข้อมูล)
ในตัวอย่างเหล่านี้ คุณจะปรับเปลี่ยนหรือสร้างเรกคอร์ดในแหล่งข้อมูล มีชื่อว่า IceCream ที่ประกอบด้วยข้อมูลใน ตาราง นี้ และสร้างค่าใน IDคอลัมน์ โดยอัตโนมัติ:
สูตร | รายละเอียด | Result |
---|---|---|
แพทช์(ไอศกรีม, LookUp( IceCream, Flavor = "Chocolate" ), { Quantity: 400 } ) |
ปรับเปลี่ยนเรกคอร์ดในแหล่งข้อมูล IceCream:
|
{ ID: 1, Flavor: "Chocolate", Quantity: 400 } รายการ ช็อกโกแลต ในแหล่งข้อมูล IceCream ได้ถูกปรับเปลี่ยนแล้ว |
แพทช์(ไอศกรีม, ค่าเริ่มต้น(ไอศกรีม), { รสชาติ: "สตรอเบอร์รี่" } ) | สร้างเรกคอร์ดในแหล่งข้อมูล IceCream:
|
{ ID: 3, Flavor: "Strawberry", Quantity: 0 } รายการ สตรอเบอรี่ ในแหล่งข้อมูล IceCream ถูกสร้างขึ้นแล้ว |
หลังจากสูตรก่อนหน้าได้รับการคำนวณ แหล่งข้อมูลจะลงท้ายด้วยค่าดังต่อไปนี้:
ผสานเรกคอร์ด (ภายนอกแหล่งข้อมูล)
สูตร | รายละเอียด | ผลลัพธ์ |
---|---|---|
แพตช์( { ชื่อ: "เจมส์", คะแนน: 90 }, { ชื่อ: "จิม", ผ่าน: จริง } ) | ผสานเรกคอร์ดสองเรกคอร์ดภายนอกแหล่งข้อมูล:
|
{ 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 ดูที่บทความ ตัวดำเนินการ