Hàm ForAll
Áp dụng cho: Ứng dụng Canvas Luồng máy tính để bàn Ứng dụng dựa trên mô hình Power Pages Power Platform CLI
Tính toán giá trị và thực hiện các hành động cho tất cả bản ghi trong một bảng.
Mô tả
Hàm ForAll đánh giá công thức cho tất cả bản ghi trong một bảng. Công thức có thể tính toán một giá trị và/hoặc thực hiện các hành động, chẳng hạn như sửa đổi dữ liệu hoặc xử lý kết nối. Sử dụng hàm With để đánh giá công thức cho một bản ghi.
Sử dụng hàm Sequence với hàm ForAll để lặp lại theo số lượng.
Các trường bản ghi hiện đang được xử lý đều có sẵn trong công thức. Sử dụng toán tử ThisRecord hoặc chỉ đơn giản là tham chiếu các trường theo tên như khi làm với bất kỳ giá trị nào khác. Bạn cũng có thể dùng toán tử As để đặt tên cho bản ghi đang được xử lý, điều này có thể giúp cho công thức của bạn dễ hiểu hơn và làm cho các bản ghi lồng nhau có thể truy cập được. Để biết thêm thông tin, hãy xem ví dụ bên dưới và xử lý phạm vi bản ghi.
Giá trị trả về
Sau mỗi lần đánh giá công thức, hàm sẽ trả về kết quả trong bảng, theo thứ tự như bảng nhập vào.
Nếu kết quả của công thức là 1 giá trị, bảng kết quả sẽ là bảng gồm 1 cột. Nếu kết quả của công thức là một bản ghi, bảng kết quả chứa các bản ghi có cùng cột với bản ghi kết quả.
Nếu kết quả của công thức là một giá trị trống, sau đó không có bản ghi trong bảng kết quả cho bản ghi đầu vào đó. Trong trường hợp này, sẽ có ít bản ghi trong bảng kết quả hơn so với bảng nhập vào.
Hành động
Công thức có thể bao gồm các hàm thực hiện hành động, chẳng hạn như sửa đổi các bản ghi của nguồn dữ liệu bằng hàm Patch và Collect. Công thức cũng có thể gọi các phương thức xử lý kết nối. Có thể thực hiện nhiều hành động trên mỗi bản ghi bằng cách sử dụng toán tử ;. Bạn không thể sửa đổi bảng là chủ đề của hàm ForAll.
Khi viết công thức, hãy nhớ rằng các bản ghi có thể được xử lý theo bất kỳ thứ tự nào và có thể được xử lý song song khi có thể. Bản ghi đầu tiên của bảng có thể được xử lý sau bản ghi cuối cùng.
Hãy cẩn trọng để tránh sắp xếp các quan hệ phụ thuộc. Vì lý do này, bạn không thể sử dụng các hàm UpdateContext, Clear và ClearCollect trong hàm ForAll vì các hàm này có thể dễ dàng được dùng để giữ các biến có thể bị ảnh hưởng từ hiệu ứng này. Bạn có thể dùng hàm Collect nhưng thứ tự thêm các bản ghi là không xác định.
Một số hàm sửa đổi nguồn dữ liệu, bao gồm Collect, Remove, and Update, trả về gia trị là nguồn dữ liệu đã thay đổi. Các giá trị trả về này có thể lớn và tiêu tốn đáng kể dung lượng nếu được trả về cho mỗi bản ghi của bảng ForAll. Bạn cũng có thể thấy rằng các giá trị trả về này không như mình mong đợi bởi vì hàm ForAll có thể hoạt động song song và ngăn chặn các tác dụng không mong muốn của những hàm này và vẫn thu được kết quả. Nếu giá trị trả về từ ForAll không được sử dụng, thường là trường hợp với các hàm sửa đổi dữ liệu, sau đó giá trị trả về sẽ không được tạo và không có mối quan tâm về tài nguyên hoặc đơn hàng. Nhưng nếu bạn đang sử dụng kết quả của hàm ForAll và một trong các hàm trả về nguồn dữ liệu, hãy cân nhắc cẩn thận về cách cấu trúc kết quả và trước trên, hãy thử trên các tập dữ liệu nhỏ.
Lựa chọn thay thế
Nhiều hàm trong Power Apps có thể xử lý nhiều giá trị cùng lúc nhờ sử dụng bảng một cột. Ví dụ: hàm Len có thể xử lý bảng chứa các giá trị văn bản, trả về bảng chứa các độ dài, theo cách tương tự như hàm ForAll. Điều này có thể giúp không phải dùng hàm ForAll trong nhiều trường hợp, đạt được hiệu quả cao hơn và dễ đọc hơn.
Một điểm lưu ý khác là hàm ForAll không thể ủy nhiệm, trong khi các hàm khác thì có thể, chẳng hạn như hàm Filter.
Đại diện
Khi được dùng với một nguồn dữ liệu, bạn không thể ủy nhiệm chức năng này. Chỉ có phần đầu tiên của nguồn dữ liệu mới được truy xuất và sau đó áp dụng chức năng. Kết quả có thể không thể hiện toàn bộ câu chuyện. Một cảnh báo có thể xuất hiện vào lúc biên soạn để nhắc bạn về hạn chế này và gợi ý chuyển sang dùng các hình thức ủy nhiệm thay thế khi có thể. Để biết thêm thông tin, xem bản tổng quan ủy nhiệm.
Cú pháp
ForAll(Bảng, Công thức)
- Bảng - Bắt buộc. Bảng cần xử lý.
- Công thức - Bắt buộc. Công thức để đánh giá tất cả bản ghi của Table (Bảng).
Ví dụ
Tính toán
Dưới đây là các ví dụ sử dụng nguồn dữ liệu Squares:
Để tạo nguồn dữ liệu này dưới dạng bộ sưu tập, hãy đặt thuộc tính OnSelect của kiểm soát Button thành công thức này, mở chế độ Bản xem trước, sau đó chọn nút:
ClearCollect( Squares, [ "1", "4", "9" ] )
Công thức | Mô tả | Kết quả |
---|---|---|
ForAll( Bình phương, Sqrt( Giá trị ) ) Sqrt( Hình vuông ) |
Đối với tất cả các bản ghi của bảng nhập vào, tính căn bậc hai của cột Value (Giá trị). Hàm Sqrt cũng có thể được sử dụng với bảng một cột, giúp có thể thực hiện ví dụ này mà không cần sử dụng ForAll. | |
ForAll( Bình phương, Power( Giá trị, 3 ) ) | Đối với tất cả các bản ghi của bảng nhập vào, tính lũy thừa bậc 3 của cột Value. Hàm Power không hỗ trợ các bảng chỉ chứa một cột. Vì thế, phải sử dụng hàm ForAll trong trường hợp này. |
Sử dụng kết nối
Dưới đây là các ví dụ sử dụng nguồn dữ liệu Expressions:
Để tạo nguồn dữ liệu này dưới dạng bộ sưu tập, hãy đặt thuộc tính OnSelect của kiểm soát Button thành công thức này, mở chế độ Bản xem trước, sau đó chọn nút:
ClearCollect( Expressions, [ "Hello", "Good morning", "Thank you", "Goodbye" ] )
Ví dụ này cũng sử dụng kết nối Microsoft Translator . Để thêm kết nối này vào ứng dụng của bạn, hãy xem bài viết về cách quản lý kết nối.
Công thức | Mô tả | Kết quả |
---|---|---|
ForAll(Biểu thức, MicrosoftTranslator.Translate(Giá trị, "es")) | Đối với tất cả các bản ghi trong bảng Biểu thức, hãy dịch nội dung của cột Value (Giá trị) sang tiếng Tây Ban Nha (viết tắt là "es"). | |
ForAll(Biểu thức, MicrosoftTranslator.Translate(Giá trị, "fr")) | Đối với tất cả các bản ghi trong bảng Biểu thức, hãy dịch nội dung của cột Value (Giá trị) sang tiếng Pháp (viết tắt là "fr"). |
Sao chép bảng
Đôi khi, bạn cần lọc, định hình, sắp xếp và thao tác với dữ liệu. Power Apps cung cấp nhiều hàm để thực hiện việc này, chẳng hạn như Filter, AddColumns và Sort. Power Apps coi mỗi bảng là một giá trị, cho phép nó chảy qua các công thức và được sử dụng dễ dàng.
Và đôi khi bạn muốn tạo một bản sao của kết quả này để sử dụng sau này hoặc bạn muốn di chuyển thông tin từ nguồn dữ liệu này sang nguồn dữ liệu khác. Power Apps có hàm Collect để sao chép dữ liệu.
Nhưng trước khi bạn tạo bản sao đó, hãy suy nghĩ cẩn thận nếu cần thiết. Bạn có thể giải quyết nhiều trường hợp bằng cách lọc và định hình nguồn dữ liệu cơ bản theo yêu cầu bằng một công thức. Sau đây là một số nhược điểm khi sao chép:
- Hai bản sao của cùng một thông tin có nghĩa là một trong số chúng có thể không đồng bộ.
- Tạo một bản sao có thể tiêu tốn nhiều bộ nhớ máy tính, băng thông mạng và/hoặc thời gian.
- Đối với hầu hết các nguồn dữ liệu, hệ thống có thể không cho phép sao chép hoặc giới hạn lượng dữ liệu có thể di chuyển.
Dưới đây là các ví dụ sử dụng nguồn dữ liệu Products:
Để tạo nguồn dữ liệu này dưới dạng bộ sưu tập, hãy đặt thuộc tính OnSelect của kiểm soát Button thành công thức này, mở chế độ Bản xem trước, sau đó chọn nút:
ClearCollect( Products,
Table(
{ Product: "Widget", 'Quantity Requested': 6, 'Quantity Available': 3 },
{ Product: "Gadget", 'Quantity Requested': 10, 'Quantity Available': 20 },
{ Product: "Gizmo", 'Quantity Requested': 4, 'Quantity Available': 11 },
{ Product: "Apparatus", 'Quantity Requested': 7, 'Quantity Available': 6 }
)
)
Mục tiêu của chúng tôi là xử lý bảng phái sinh chỉ bao gồm các mặt hàng được yêu cầu nhiều hơn mức có sẵn và chúng tôi cần phải đặt hàng những mặt hàng đó:
Chúng ta có thể thực hiện nhiệm vụ này bằng một vài cách khác nhau, tất cả đều mang đến cùng một kết quả, với những ưu và nhược điểm khác nhau.
Bảng định hình theo yêu cầu
Không sao chép! Chúng tôi có thể sử dụng công thức sau đây trong mọi trường hợp:
// Table shaping on demand, no need for a copy of the result
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
Phạm vi bản ghi được tạo bằng các hàm Filter và AddColumns để thực hiện các phép toán so sánh và phép trừ tương ứng với các trường 'Quantity Requested' và 'Quantity Available' của từng bản ghi.
Trong ví dụ này, có thể chỉ định hàm Filter. Điều này rất quan trọng, vì hàm này có thể tìm thấy tất cả các sản phẩm đáp ứng tiêu chí, ngay cả khi đó chỉ là một vài bản ghi trong số hàng triệu bảng. Tại thời điểm này, ShowColumns và AddColumns không thể ủy nhiệm, vì vậy, số lượng sản phẩm thực tế cần đặt hàng sẽ có hạn. Nếu bạn biết quy mô của kết quả này sẽ luôn tương đối nhỏ, đây là phương pháp hiệu quả.
Vì chúng tôi không sao chép nên thông tin sẽ không có bản sao nào khác cần quản lý hoặc lỗi thời.
Hàm ForAll theo yêu cầu
Một cách khác là sử dụng hàm ForAll thay cho các hàm định hình bảng:
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
Một số người có thể thấy công thức này dễ đọc và viết hơn.
Không có phần nào của hàm ForAll được chỉ định. Chỉ phần đầu tiên của bảng Các sản phẩm được đánh giá, có thể là vấn đề nếu bảng này lớn. Vì có thể chỉ định hàm Filter trong ví dụ trước, nên hàm này có thể hoạt động hiệu quả hơn với các tập dữ liệu lớn.
Thu thập kết quả
Trong một số tình huống, có thể cần bản sao của dữ liệu. Bạn có thể cần chuyển thông tin từ nguồn dữ liệu này sang nguồn dữ liệu khác. Trong ví dụ này, các đơn hàng được đặt thông qua bảng NewOrder trên hệ thống của nhà cung cấp. Đối với các tương tác tốc độ cao của người dùng, bạn có thể cần lưu trữ bản sao cục bộ của bảng để máy chủ không bị trễ.
Chúng tôi sử dụng cùng một bảng định hình như 2 ví dụ trước nhưng đưa kết quả vào một bộ sưu tập:
ClearCollect( NewOrder,
ShowColumns(
AddColumns(
Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
"Quantity To Order", 'Quantity Requested' - 'Quantity Available'
),
"Product",
"Quantity To Order"
)
)
ClearCollect( NewOrder,
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
)
ClearCollect và Collect không thể được ủy quyền. Do đó, lượng dữ liệu có thể di chuyển theo cách này bị hạn chế.
Thu thập trong hàm ForAll
Cuối cùng, chúng tôi có thể triển khai hàm Collect ngay trong hàm ForAll:
Clear( NewOrder );
ForAll( Products,
If( 'Quantity Requested' > 'Quantity Available',
Collect( NewOrder,
{
Product: Product,
'Quantity To Order': 'Quantity Requested' - 'Quantity Available'
}
)
)
)
Xin nhắc lại là hiện chưa thể chỉ định hàm ForAll. Nếu bảng Products lớn, thì hàm ForAll sẽ chỉ xem xét tập bản ghi đầu tiên và chúng tôi có thể bỏ lỡ một số sản phẩm cần đặt hàng. Tuy nhiên, đối với những bảng như chúng tôi biết là luôn nhỏ thì đây là một giải pháp hiệu quả.
Lưu ý rằng chúng tôi không thu thập kết quả của hàm ForAll. Các lệnh gọi hàm Collect được thực hiện từ trong sẽ trả về nguồn dữ liệu NewOrder cho tất cả bản ghi, có thể thêm vô số dữ liệu nếu chúng tôi đang thu thập.
Ánh xạ bảng trong một thành phần
Xem phần Ánh xạ bảng.