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 :
Overview
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. Nó cập nhật giá trị của các trường cụ thể 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" } )
Note
Khi bạn vá bộ sưu tập bằng cách sử dụng bản ghi từ nguồn dữ liệu có giá trị mặc định, thao tác vá sẽ cập nhật bộ sưu tập với cả giá trị bản vá được chỉ định và giá trị mặc định từ nguồn dữ liệu. Nguồn dữ liệu của câu lệnh bản vá và Nguồn dữ liệu của hàm Mặc định phải 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" } )
Description
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 đến từ nguồn dữ liệu. Bạn có thể lấy bản ghi cơ sở thông qua thuộc tính Items của thư viện, đặt nó trong biến ngữ cảnh hoặc lấy nó thông qua một số đường dẫn khác. Tuy nhiên, bạn phải có khả năng theo dõi bản ghi cơ sở trở lại nguồn dữ liệu. Yêu cầu này rất quan trọng vì bản ghi bao gồm thông tin bổ sung giúp bạn 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
Bạn cũng có thể sử dụng Patch để tạo hoặc sửa đổi nhiều bản ghi với một cuộc gọi.
Thay vì truyền một bản ghi cơ sở duy nhất, hãy cung cấp bảng các bản ghi cơ sở trong đối số thứ hai. Cung cấp các bản ghi thay đổi trong bảng, tương ứng với các 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 bạn 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 với các bản ghi cơ sở và 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. Hàm xử lý các bản ghi theo thứ tự từ đầu danh sách đối số đến cuối, với các giá trị thuộc tính sau sẽ 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.
Syntax
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. Nếu bản ghi đến từ nguồn dữ liệu, hàm sẽ tìm và sửa đổi bản ghi. Nếu kết quả của Mặc định được sử dụng, hàm sẽ tạo một bản ghi. 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. Hàm xử lý các bản ghi thay đổi theo thứ tự từ đầu danh sách đối số đến cuối, 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. Nếu bản ghi đến từ nguồn dữ liệu, hàm sẽ tìm và sửa đổi bản ghi. Nếu kết quả của Mặc định được sử dụng, hàm sẽ tạo một bản ghi. 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. Hàm xử lý các bản ghi thay đổi theo thứ tự từ đầu danh sách đối số đến cuối, với các giá trị thuộc tính sau đó ghi đè lên các giá trị trước đó.
Merge records
Patch( Record1, Record2 [, ...] )
- Hồ sơ - Bắt buộc. Ít nhất hai bản ghi bạn muốn hợp nhất. Hàm xử lý các bản ghi theo thứ tự từ đầu danh sách đối số đến cuối, với các giá trị thuộc tính sau sẽ ghi đè lên các giá trị trước đó.
Examples
Sửa đổi hoặc tạo bản ghi (trong nguồn dữ liệu)
Trong các ví dụ này, bạn sửa đổi hoặc tạo bản ghi trong nguồn dữ liệu có tên IceCream. Nguồn dữ liệu chứa dữ liệu trong bảng này và tự động tạo các giá trị trong cộtID:
Để tạo phiên bản trong bộ nhớ của nguồn dữ liệu này để bạn có thể thử các ví dụ sau, hãy đánh giá công thức sau:
ClearCollect( IceCream,
{ ID: 1, Flavor: "Chocolate", Quantity: 100 },
{ ID: 2, Flavor: "Vanilla", Quantity: 200 }
)
| Formula | Description | Result |
|---|---|---|
|
Patch(Kem, 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 } Mục nhập Sô cô la 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 } Mục nhập Dâu tây trong nguồn dữ liệu IceCream được tạo. |
Sau khi các công thức trước đó được đánh giá, 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)
| Formula | Description | Result |
|---|---|---|
| Patch( { Tên: "James", Điểm: 90 }, { Tên: "Jim", Đạt: true } ) | Hợp nhất hai bản ghi bên ngoài nguồn dữ liệu:
|
{ Tên: "Jim", Điểm: 90, Đạt: đúng } |
Sửa đổi hoặc tạo một tập hợp các bản ghi (trong nguồn dữ liệu)
Khi bạn sử dụng Patch với các bảng thay vì các bản ghi đơn lẻ, bạn có thể tạo hoặc sửa đổi nhiều bản ghi trong một lệnh gọi. Giá trị trả về là một bảng các bản ghi tương ứng với các bảng đầu vào.
Ví dụ này cập nhật Số lượng cho nhiều hương vị trong nguồn dữ liệu IceCream cùng một lúc:
Patch(
IceCream,
Table(
{ ID: 1, Flavor: "Chocolate", Quantity: 150 },
{ ID: 2, Flavor: "Vanilla", Quantity: 200 }
),
Table(
{ Quantity: 300 },
{ Quantity: 400 }
)
)
Kết quả là một bảng với các bản ghi được cập nhật: { ID: 1, Flavor: "Chocolate", Quantity: 300 } và { ID: 2, Flavor: "Vanilla", Quantity: 400 }.
Ví dụ này tạo nhiều bản ghi mới bằng cách sử dụng Mặc định:
Patch(
IceCream,
Table( Defaults( IceCream ), Defaults( IceCream ) ),
Table(
{ Flavor: "Mint", Quantity: 60 },
{ Flavor: "Peach", Quantity: 80 }
)
)
Note
Khi bạn sử dụng Patch với bảng, số lượng bản ghi trong mỗi bảng thay đổi phải khớp với số lượng bản ghi trong bảng cơ sở. Nếu không, sẽ xảy ra lỗi.
Để phát hiện lỗi khi bạn sửa đổi nhiều bản ghi, hãy sử dụng IfError.
IfError là cơ chế ưu tiên và hoạt động trên các máy chủ Power Fx:
IfError(
Patch(
IceCream,
baseRecords,
changeRecords
),
Notify( "Some records failed to update: " & FirstError.Message, NotificationType.Error )
)
Patch với các loại cột Dataverse
Các ví dụ sau đây áp dụng cụ thể cho các nguồn dữ liệu Microsoft Dataverse. Hình dạng bản ghi khác nhau tùy theo nguồn dữ liệu (ví dụ: SharePoint và SQL Server có các định dạng khác nhau).
Cột lựa chọn: Để đặt cột Lựa chọn, hãy sử dụng trực tiếp giá trị enum. Ví dụ này đặt cột Lựa chọn Trạng thái trên bảng Tài khoản :
Patch(
Accounts,
LookUp( Accounts, 'Account Name' = "Contoso" ),
{ 'Status': 'Status (Accounts)'.Active }
)
Cột tra cứu: Để đặt cột Tra cứu, hãy cung cấp bản ghi có khóa chính của bảng liên quan. Ví dụ này đặt tra cứu Người liên hệ chính trên bản ghi Tài khoản :
Patch(
Accounts,
LookUp( Accounts, 'Account Name' = "Contoso" ),
{ 'Primary Contact': LookUp( Contacts, 'Full Name' = "John Smith" ) }
)
Note
Các ví dụ loại cột này dành riêng cho Dataverse. Các nguồn dữ liệu khác, chẳng hạn như SharePoint hoặc SQL Server, có thể yêu cầu các hình dạng bản ghi khác nhau cho các loại cột tương tự. Tham khảo tài liệu cho nguồn dữ liệu cụ thể của bạn để biết định dạng chính xác.
Ủy quyền trong các công thức sử dụng Patch
Patch Bản thân hàm không phải chịu ủy quyền vì nó ghi vào nguồn dữ liệu thay vì truy vấn nó. Tuy nhiên, cảnh báo ủy quyền có thể xuất hiện trong các công thức sử dụng Patch nếu phần chọn bản ghi của công thức (chẳng hạn như Bộ lọc, Tra cứu hoặc ForAll) liên quan đến truy vấn vượt quá giới hạn ủy quyền nguồn dữ liệu.
Khi bạn thấy cảnh báo ủy quyền trong một công thức bao gồm Patch, hãy kiểm tra xem cảnh báo có áp dụng cho các hàm truy xuất dữ liệu thay vì Patch cho chính nó hay không. Để biết thêm thông tin về ủy quyền, hãy xem Tìm hiểu ủy quyền trong ứng dụng canvas.
Các lỗi thường gặp với Patch hàm
Khi bạn sử dụng chức năng này Patch , lỗi có thể xảy ra do kết nối nguồn dữ liệu, quyền hoặc xung đột dữ liệu. Sử dụng IfError và IsError để phát hiện lỗi và phản hồi thích hợp.
"Lỗi mạng khi sử dụng Patch hàm": Lỗi này thường cho biết ứng dụng không thể truy cập vào nguồn dữ liệu. Các nguyên nhân phổ biến bao gồm mất kết nối internet, nguồn dữ liệu tạm thời không khả dụng hoặc không đủ quyền cho người dùng hiện tại. Bao bọc cuộc Patch gọi trong IfError để cung cấp thông điệp có ý nghĩa cho người dùng.
"Xung đột tồn tại với các thay đổi trên máy chủ": Lỗi này xảy ra khi một người dùng hoặc quy trình khác sửa đổi cùng một bản ghi giữa thời điểm ứng dụng của bạn đọc bản ghi và ghi thay đổi. Làm mới nguồn dữ liệu bằng cách gọi hàm Làm mới và thử lại thao tác.
Lỗi quyền: Nếu người dùng không có quyền tạo hoặc sửa đổi bản ghi trong nguồn dữ liệu, lệnh Patch gọi sẽ không thành công. Sử dụng IfError để phát hiện các lỗi liên quan đến quyền và hướng dẫn người dùng.
Để biết các mẫu xử lý lỗi chung, hãy xem phần Xử lý lỗi.
Sử dụng As hoặc ThisRecord
Sử dụng từ khóa As hoặc ThisRecord trong công thức của bạn để tránh ngữ cảnh đánh giá mơ hồ.
Trong ví dụ sau đây, hãy xem xét câu đầu tiên Lookup trong lời phát biểu If .
(OrderID = A[@OrderID]) dự kiến sẽ so sánh trong OrderIdLookup phạm vi với OrderId bộ sưu tập A trong ForAll phạm vi. Trong trường hợp này, bạn có thể muốn A[@OrderId] phân giải dưới dạng tham số cục bộ. Nhưng nó rất mơ hồ.
Power Apps hiện đang diễn giải cả bên trái OrderId và bên phải A[@OrderId] là một trường trong phạm vi Lookup. Do đó, Lookup luôn tìm hàng đầu tiên vì [dbo].[Orders1] điều kiện luôn đúng (nghĩa là bất kỳ hàng OrderId nào cũng 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 từ khóa ThisRecord để phân biệt phía bên trái. Như được khuyến nghị cho kịch bản trước.
Khi công thức của bạn sử dụng nhiều phạm vi với ForAll, Filtervà Lookup trên cùng một nguồn dữ liệu hoặc bảng, các tham số phạm vi có thể xung đột với cùng một trường ở nơi khác. Do đó, hãy sử dụng toán tử As hoặc ThisRecord để phân giải 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ụ sau.
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 Toán tử .