Lưu ý
Cần có ủy quyền mới truy nhập được vào trang này. Bạn có thể thử đăng nhập hoặc thay đổi thư mục.
Cần có ủy quyền mới truy nhập được vào trang này. Bạn có thể thử thay đổi thư mục.
Áp dụng cho: Ứng dụng
Canvas Copilot Studio Desktop
dòng ứng
dụng dựa trên mô
hình Power Platform CLI
Dataverse chức năng
Sửa đổi/tạo một hoặc nhiều bản ghi trong nguồn dữ liệu hoặc hợp nhất các bản ghi bên ngoài nguồn dữ liệu.
Sử dụng hàm để Patch sửa đổi bản ghi trong các tình huống phức tạp, chẳng hạn như khi bạn thực hiện các bản cập nhật không yêu cầu tương tác người dùng hoặc sử dụng biểu mẫu trải rộng trên nhiều màn hình.
Để cập nhật các thay đổi đơn giản cho bản ghi trong nguồn dữ liệu dễ dàng hơn, hãy sử dụng công cụ điều khiển Edit form (Chỉnh sửa biểu mẫu). Khi thêm công cụ điều khiển Edit form, bạn cung cấp cho người dùng một biểu mẫu để điền vào rồi lưu các thay đổi vào nguồn dữ liệu. Để biết thêm thông tin, hãy xem phần Tìm hiểu biểu mẫu dữ liệu.
Xem video này để tìm hiểu cách sử dụng hàm Patch :
Tổng quan
Sử dụng hàm Patch để sửa đổi một hoặc nhiều bản ghi của nguồn dữ liệu. Các giá trị của những trường cụ thể được sửa đổi mà không ảnh hưởng đến các thuộc tính khác. Ví dụ: công thức sau thay đổi số điện thoại của một khách hàng tên là Contoso:
Patch( Customers, LookUp( Customers, Name = "Contoso" ), { Phone: "1-212-555-1234" } )
Sử Patch dụng với hàm Defaults để tạo bản ghi. Sử dụng thao tác này để xây dựng một màn hình nhằm mục đích vừa tạo vừa chỉnh sửa bản ghi. Ví dụ: công thức sau tạo bản ghi cho một khách hàng tên là Contoso:
Patch( Customers, Defaults( Customers ), { Name: "Contoso" } )
Lưu ý
Khi bạn vá một bộ sưu tập sử dụng một bản ghi từ một nguồn dữ liệu với các giá trị mặc định, hoạt động vá lỗi cập nhật bộ sưu tập với cả giá trị bản vá được chỉ định và các giá trị mặc định từ nguồn dữ liệu. DataSource của câu lệnh patch và DataSource của hàm Defaults phải trùng khớp để tạo bản ghi mới.
Ngay cả khi bạn không làm việc với nguồn dữ liệu, bạn vẫn có thể sử dụng để Patch phối hai hoặc nhiều bản ghi. Ví dụ: công thức sau hợp nhất hai bản ghi thành một bản xác định cả số điện thoại và vị trí của Contoso:
Patch( { Name: "Contoso", Phone: "1-212-555-1234" }, { Name: "Contoso", Location: "Midtown" } )
Mô tả
Sửa đổi hoặc tạo bản ghi trong nguồn dữ liệu
Để sử dụng hàm này với nguồn dữ liệu, hãy chỉ định nguồn dữ liệu, sau đó chỉ định bản ghi cơ sở:
- Để sửa đổi bản ghi, bản ghi cơ sở cần phải đến từ nguồn dữ liệu. Bản ghi cơ sở có thể đi qua thuộc tính Items của bộ sưu tập, được đặt trong biến ngữ cảnh hoặc đi qua một số đường dẫn khác. Tuy nhiên, bạn có thể truy vết bản ghi cơ sở trở lại nguồn dữ liệu. Điều này rất quan trọng vì bản ghi bao gồm thông tin bổ sung để giúp tìm lại bản ghi để sửa đổi.
- Để tạo bản ghi, hãy sử dụng hàm Defaults để tạo bản ghi cơ sở với các giá trị mặc định.
Sau đó, chỉ định một hoặc nhiều bản ghi thay đổi, mỗi bản ghi chứa giá trị thuộc tính mới ghi đè giá trị thuộc tính trong bản ghi cơ sở. Các bản ghi thay đổi được xử lý theo thứ tự từ đầu đến cuối danh sách đối số, với các giá trị thuộc tính sau ghi đè lên các giá trị trước đó.
Giá trị trả về là Patch bản ghi mà bạn đã sửa đổi hoặc tạo. Nếu bạn đã tạo một bản ghi, giá trị trả về có thể bao gồm các thuộc tính mà nguồn dữ liệu được tạo tự động. Tuy nhiên, giá trị trả về không cung cấp giá trị cho các trường của bảng có liên quan.
Ví dụ: bạn sử dụng Set(MyAccount, Patch(Accounts, First(Account), 'Account Name': "Example name")); rồi dùng MyAccount.'Primary Contact'.'Full Name'. Trong trường hợp này, bạn sẽ không có được tên đầy đủ. Thay vào đó, để truy cập các trường của bảng có liên quan, hãy sử dụng tra cứu riêng biệt như:
LookUp(Accounts, Account = MyAccount.Account).'Primary Contact'.'Full Name'
Khi bạn cập nhật nguồn dữ liệu, một hoặc nhiều sự cố có thể phát sinh. Sử dụng IfError và IsErrorPatch với giá trị trả về để phát hiện và phản hồi lỗi, như Xử lý Lỗi mô tả. Bạn cũng có thể sử dụng hàm Errors xác định và kiểm tra các vấn đề, như mô tả trong Làm việc với các nguồn dữ liệu.
Các hàm liên quan bao gồm hàm Update để thay thế toàn bộ bản ghi và hàm Collect để tạo bản ghi. DÙng hàm UpdateIf để sửa đổi các thuộc tính cụ thể của nhiều bản ghi dựa trên một điều kiện.
Sửa đổi hoặc tạo một tập hợp bản ghi trong nguồn dữ liệu
Patch cũng có thể được sử dụng để tạo hoặc sửa đổi nhiều bản ghi chỉ với một cuộc gọi.
Thay vì sử dụng một bản ghi cơ sở duy nhất, bạn có thể cung cấp đối số thứ hai là một bảng các bản ghi cơ sở. Các bản ghi thay đổi cũng được cung cấp trong bảng, tương ứng với bản ghi cơ sở. Số lượng bản ghi trong mỗi bảng thay đổi phải giống với số lượng bản ghi trong bảng cơ sở.
Khi sử dụng Patch theo cách này, giá trị trả về cũng là một bảng với mỗi bản ghi tương ứng một đối một với cơ số và bản ghi thay đổi.
Hợp nhất các bản ghi bên ngoài nguồn dữ liệu
Chỉ định hai hoặc nhiều bản ghi mà bạn muốn hợp nhất. Các bản ghi được xử lý theo thứ tự từ đầu đến cuối danh sách đối số, với các giá trị thuộc tính sau ghi đè lên các giá trị trước đó.
Patch trả về bản ghi đã phối và không sửa đổi đối số hoặc bản ghi của nó trong bất kỳ nguồn dữ liệu nào.
Cú pháp
Sửa đổi hoặc tạo bản ghi trong nguồn dữ liệu
Patch( DataSource, BaseRecord, ChangeRecord1 [, ChangeRecord2, ... ])
- Nguồn dữ liệu – Bắt buộc. Nguồn dữ liệu có chứa bản ghi mà bạn muốn sửa đổi hoặc sẽ chứa bản ghi mà bạn muốn tạo.
- BaseRecord – Bắt buộc. Bản ghi cần sửa đổi hoặc tạo. Hàm sẽ tìm thấy và sửa đổi bản ghi nếu bản ghi này đến từ nguồn dữ liệu. Nếu kết quả của hàm Defaults được sử dụng, một bản ghi sẽ được tạo. DataSource của câu lệnh patch và DataSource của hàm Defaults phải trùng khớp để tạo bản ghi mới.
- ChangeRecords – Bắt buộc. Một hoặc nhiều bản ghi có chứa các thuộc tính cần sửa đổi trong BaseRecord. Các bản ghi thay đổi được xử lý theo thứ tự từ đầu đến cuối danh sách đối số, với các giá trị thuộc tính sau ghi đè lên các giá trị trước đó.
Sửa đổi hoặc tạo một tập hợp bản ghi trong nguồn dữ liệu
Patch( DataSource, BaseRecordsTable, ChangeRecordTable1 [, ChangeRecordTable2, ... ] )
- Nguồn dữ liệu – Bắt buộc. Nguồn dữ liệu có chứa các bản ghi mà bạn muốn sửa đổi hoặc sẽ chứa các bản ghi mà bạn muốn tạo.
- BaseRecordTable – Bắt buộc. Một bảng chứa các bản ghi cần sửa đổi hoặc tạo. Hàm sẽ tìm thấy và sửa đổi bản ghi nếu bản ghi này đến từ nguồn dữ liệu. Nếu kết quả của hàm Defaults được sử dụng, một bản ghi sẽ được tạo. DataSource của câu lệnh patch và DataSource của hàm Defaults phải trùng khớp để tạo bản ghi mới.
- ChangeRecordTables – Bắt buộc. Một hoặc nhiều bảng có một số thuộc tính nhất định cần sửa đổi cho mỗi bản ghi của BaseRecordTable. Các bản ghi thay đổi được xử lý theo thứ tự từ đầu đến cuối danh sách đối số, với các giá trị thuộc tính sau ghi đè lên các giá trị trước đó.
Hợp nhất bản ghi
Patch( Record1, Record2 [, ...] )
- Hồ sơ - Bắt buộc. Ít nhất hai bản ghi bạn muốn hợp nhất. Các bản ghi được xử lý theo thứ tự từ đầu đến cuối danh sách đối số, với các giá trị thuộc tính sau ghi đè lên các giá trị trước đó.
Ví dụ
Sửa đổi hoặc tạo bản ghi (trong nguồn dữ liệu)
Trong các ví dụ sau, bạn sẽ sửa đổi hoặc tạo bản ghi trong nguồn dữ liệu có tên IceCream, chứa dữ liệu trong bảng sau và tự động tạo các giá trị trong cộtID:
| Công thức | Mô tả | Kết quả |
|---|---|---|
|
Patch( IceCream, LookUp( IceCream, Hương vị = "Chocolate" ), { Số lượng: 400 } ) |
Sửa đổi một bản ghi trong nguồn dữ liệu IceCream:
|
{ ID: 1, Hương vị: "Chocolate", Số lượng: 400 } Cột Chocolate trong nguồn dữ liệu IceCream đã được sửa đổi. |
| Patch( IceCream, Defaults( IceCream ), { Flavor: "Dâu tây" } ) | Tạo một bản ghi trong nguồn dữ liệu IceCream:
|
{ ID: 3, Hương vị: "Dâu tây", Số lượng: 0 } Cột Strawberry (Dâu) trong nguồn dữ liệu IceCream (Kem) đã được tạo. |
Sau khi các công thức trước đó đã được ước tính, nguồn dữ liệu kết thúc với các giá trị sau:
Hợp nhất các bản ghi (bên ngoài nguồn dữ liệu)
| Công thức | Mô tả | Kết quả |
|---|---|---|
| Patch( { Name: "James", Score: 90 }, { Name: "Jim", Passed: true } ) | Hợp nhất hai bản ghi bên ngoài nguồn dữ liệu:
|
{ Name: "Jim", Score: 90, Passed: true } |
Sử dụng As hoặc ThisRecord
Sử dụng từ khóa As hoặc ThisRecord trong công thức tránh ngữ cảnh đánh giá không rõ ràng.
Trong ví dụ dưới đây, hãy xem xét lần tra cứu đầu tiên trong câu If.
(OrderID = A[@OrderID]) dự kiến sẽ so sánh OrderId trong phạm vi tra cứu với OrderId của bộ sưu tập A trong phạm vi ForAll . Trong trường hợp này, bạn có thể muốn A[@OrderId] được giải quyết như một tham số cục bộ. Tuy nhiên, việc này hơi mơ hồ.
Power Apps hiện đang diễn giải cả bên trái OrderId và bên tay phải A[@OrderId] dưới dạng một trường trong phạm vi tra cứu. Do đó, tra cứu sẽ luôn tìm thấy hàng đầu tiên trong [dbo].[Orders1] bởi vì điều kiện luôn đúng (nghĩa là OrderId của bất kỳ hàng nào bằng chính nó.)
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"
}
)
)
)
Sử dụng As hoặc ThisRecord
Bất cứ khi nào có thể, hãy sử dụng toán tử As hoặc ThisRecord để phân biệt phía bên trái. Như được khuyến nghị cho tình huống trên.
Khi công thức của bạn sử dụng nhiều phạm vi với ForAll, Filter và Lookup trên cùng một bảng hoặc nguồn dữ liệu, có thể các tham số phạm vi có thể xung đột với cùng một trường ở nơi khác. Do đó, bạn nên sử dụng toán tử As hoặc ThisRecord để giải quyết tên trường và tránh sự mơ hồ.
Ví dụ, bạn có thể sử dụng toán tử As để phân biệt trong ví dụ dưới đây.
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"
}
)
)
)
Ngoài ra, bạn có thể sử dụng ThisRecord cho cùng một mục đích.
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"
}
)
)
)
Để tìm hiểu thêm về cách sử dụng toán tử As và ThisRecord, hãy xem bài viết về Toán tử.