Bảng

Lưu ý

Microsoft Power Fx là tên mới của ngôn ngữ công thức ứng dụng canvas. Những bài viết này được thực hiện khi chúng tôi trích xuất ngôn ngữ từ các ứng dụng canvas, tích hợp ngôn ngữ đó với các sản phẩm khác của Microsoft Power Platform và hiển thị dưới dạng nguồn mở. Bắt đầu với Tổng quan về Microsoft Power Fx để được giới thiệu về ngôn ngữ.

Trong Microsoft Power Fx, bạn có thể viết một công thức truy cập thông tin trong Microsoft Excel, SharePoint, SQL Server và một số nguồn khác lưu trữ dữ liệu trong bản ghi và bảng. Để làm việc hiệu quả nhất với loại dữ liệu này, hãy xem lại các khái niệm làm nền tảng cho các cấu trúc này.

  • Một bản ghi chứa một hoặc nhiều loại thông tin về một người, địa điểm hoặc sự vật. Ví dụ: bản ghi có thể chứa tên, địa chỉ email và số điện thoại của một khách hàng. Các công cụ khác đề cập đến bản ghi là "hàng" hoặc "mục".
  • Bảng chứa một hoặc nhiều bản ghi có chứa cùng loại thông tin. Ví dụ: bảng có thể chứa tên, địa chỉ email và số điện thoại của 50 khách hàng.

Bạn có thể xây dựng các công thức lấy tên của một bảng làm đối số, giống như một công thức trong Excel lấy một hoặc nhiều tham chiếu ô làm đối số. Một số công thức trong Power Fx trả về một bảng phản ánh các đối số khác mà bạn chỉ định. Ví dụ: bạn có thể tạo công thức:

  • để cập nhật bản ghi trong bảng bằng cách chỉ định bảng đó là một trong nhiều đối số cho hàm Patch
  • để thêm, xóa và đổi tên cột trong bảng bằng cách chỉ định bảng đó làm đối số cho hàm AddColumns, DropColumns hoặc RenameColumns. Không có hàm nào trong số đó sửa đổi bảng gốc. Thay vào đó, hàm trả về một bảng khác dựa trên các đối số khác mà bạn chỉ định.

Thành phần của bảng

Các phần tử của bảng.

Bản ghi

Mỗi bản ghi chứa ít nhất một hoặc nhiều loại thông tin về một người, địa điểm hoặc sự vật. Ví dụ trên cho thấy bản ghi cho mỗi sản phẩm (Chocolate, BreadWater) và một cột cho mỗi loại thông tin (Price, Quantity on HandQuantity on Order).

Trong một công thức, bạn có thể tự tham chiếu bản ghi, bên ngoài ngữ cảnh của bảng, bằng cách sử dụng dấu ngoặc nhọn. Ví dụ: bản ghi này { Tên: "Strawberries", Giá: 7,99 } không liên kết với bảng. Lưu ý rằng tên trường, chẳng hạn như TênGiá trong ví dụ đó, không được đặt trong dấu ngoặc kép.

Trường

Trường là một phần thông tin riêng trong bản ghi. Bạn có thể hình dung loại trường này như một giá trị trong cột cho một bản ghi cụ thể.

Cũng giống như với điều khiển, bạn tham chiếu đến một trường trường của bản ghi bằng cách sử dụng toán tử. trên bản ghi. Ví dụ, First(Products).Name trả về trường Tên cho bản ghi đầu tiên trong bảng sản phẩm.

Một trường có thể chứa một bản ghi hoặc bảng khác, như trong ví dụ về hàm GroupBy. Bạn có thể lồng nhiều cấp độ của bản ghi và bảng theo ý muốn.

Số cột

Cột đề cập đến cùng một trường cho một hoặc nhiều bản ghi trong bảng. Trong ví dụ trên, mỗi sản phẩm có một trường giá và giá đó nằm trong cùng một cột cho tất cả các sản phẩm. Bảng trên có bốn cột, được hiển thị theo chiều ngang trên cùng:

  • Tên
  • Giá
  • Số lượng có sẵn
  • Số lượng trên Đơn hàng

Tên của cột phản ánh các trường trong cột đó.

Tất cả các giá trị trong một cột có cùng kiểu dữ liệu. Trong ví dụ trên, cột "Số lượng có sẵn" luôn chứa một số và không thể chứa chuỗi, chẳng hạn như "12 đơn vị" cho một bản ghi. Giá trị của bất kỳ trường nào cũng có thể là trống.

Bạn có thể đã đề cập các cột là "trường" trong những công cụ khác.

Bảng

Một bảng bao gồm một hoặc nhiều bản ghi, mỗi bản ghi có nhiều trường có tên nhất quán trong các bản ghi.

Bất kỳ bảng nào được lưu trữ trong nguồn dữ liệu hoặc bộ sưu tập đều có tên, mà bạn sử dụng để tham chiếu bảng và chuyển nó tới các hàm lấy bảng làm đối số. Bảng cũng có thể là kết quả của hàm hoặc công thức.

Như trong ví dụ sau, bạn có thể biểu diễn bảng trong công thức bằng cách sử dụng hàm Table với một tập hợp các bản ghi mà bạn thể hiện trong dấu ngoặc nhọn:

Table( { Value: "Strawberry" }, { Value: "Vanilla" } )

Bạn cũng có thể xác định bảng một cột với dấu ngoặc vuông. Cách tương đương để viết nội dung trên:

[ "Strawberry", "Vanilla" ]

Công thức bảng

Trong Excel và Power Fx, bạn sử dụng các công thức để thao tác số và chuỗi văn bản theo cách tương tự:

  • Trong Excel, nhập một giá trị, chẳng hạn như 42, trong ô A1 và sau đó nhập một công thức, chẳng hạn như A1+2, trong một ô khác để hiển thị giá trị của 44.
  • Trong Power Apps, đặt thuộc tính Default của Slider1 thành 42 rồi đặt thuộc tính Text của nhãn thành Slider1.Value + 2 để hiển thị giá trị 44.

Trong cả hai trường hợp, giá trị được tính sẽ tự động thay đổi nếu bạn thay đổi giá trị của các đối số (ví dụ: số trong ô A1 hoặc giá trị của Slider1).

Tương tự, bạn có thể sử dụng các công thức để truy cập và thao tác dữ liệu trong bảng và bản ghi. Bạn có thể sử dụng tên của các bảng làm đối số trong một số công thức, chẳng hạn như Min(Catalog, Price) để hiển thị giá trị thấp nhất trong cột Giá của bảng Danh mục. Các công thức khác cung cấp toàn bộ bảng dưới dạng giá trị trả về, chẳng hạn như RenameColumns(Catalog, "Price", "Cost"), trả về tất cả các hồ sơ từ bảng Danh mục nhưng thay đổi tên của cột Giá thành Chi phí.

Cũng giống như với các số, các công thức liên quan đến bảng và bản ghi sẽ được tự động tính toán lại khi bảng cơ sở hoặc bản ghi thay đổi. Nếu chi phí của một sản phẩm trong bảng Danh mục được hạ xuống dưới mức tối thiểu trước đó, giá trị trả về của công thức Min sẽ tự động thay đổi để phù hợp với nó.

Các hàm và thuộc tính điều khiển bảng

Hãy xem xét hàm Lower. Nếu biến welcome chứa chuỗi văn bản "Hello, World", công thức Lower( welcome) sẽ trả về "hello, world". Hàm này không, theo bất kỳ cách nào, thay đổi giá trị trong biến đó. Lower là một hàm thuần túy ở chỗ nó chỉ xử lý đầu vào và tạo đầu ra. Chỉ có vậy và không có tác dụng phụ. Tất cả các hàm trong Excel và hầu hết các hàm trong Power Fx là các hàm thuần túy, cho phép tự động tính toán lại sổ làm việc hoặc ứng dụng.

Power Fx cung cấp một tập hợp các hàm hoạt động trên bảng theo cách tương tự. Các hàm này lấy các bảng làm đầu vào và bộ lọc, sắp xếp, biến đổi, giảm và tóm tắt toàn bộ các bảng dữ liệu. Trong thực tế, Lower và nhiều hàm khác thường lấy một giá trị đơn lẻ cũng có thể lấy bảng một cột làm đầu vào.

Nhiều hàm lấy bảng một cột làm đầu vào của chúng. Nếu toàn bộ bảng chỉ có một cột, bạn có thể chỉ định nó theo tên. Nếu một bảng có nhiều cột, bạn có thể chỉ định một trong các cột đó bằng cách sử dụng cú pháp Table.Column. Ví dụ: Products.Name trả về bảng một cột chỉ gồm các giá trị Name từ bảng Products.

Bạn cũng có thể định hình lại bảng theo ý muốn bằng cách sử dụng hàm AddColumns, RenameColumns, ShowColumns hoặc DropColumns. Một lần nữa, các hàm này chỉ thay đổi đầu ra chứ không thay đổi nguồn.

Công thức hành vi

Các hàm khác được thiết kế đặc biệt để sửa đổi dữ liệu và có tác dụng phụ. Vì các hàm này không thuần túy, bạn phải xây dựng chúng cẩn thận và chúng không thể tham gia tự động tính toán lại các giá trị trong ứng dụng. Bạn chỉ có thể sử dụng các hàm này trong công thức hành vi.

Phạm vi bản ghi

Một số hàm hoạt động bằng cách đánh giá một công thức trên tất cả các bản ghi của một bảng riêng lẻ. Kết quả của công thức được sử dụng theo nhiều cách khác nhau:

  • AddColumns - Công thức cung cấp giá trị của trường được thêm vào.
  • Average, Max, Min, Sum, StdevP, VarP - Công thức cung cấp giá trị để tổng hợp.
  • Filter, Lookup - Công thức xác định nếu bản ghi nên được bao gồm trong đầu ra.
  • Concat - Công thức xác định các chuỗi để nối với nhau.
  • Distinct - Công thức trả về một giá trị, được sử dụng để xác định các bản ghi trùng lặp.
  • ForAll - Công thức có thể trả về bất kỳ giá trị nào, có khả năng có tác dụng phụ.
  • Sort - Công thức cung cấp giá trị để sắp xếp các bản ghi.
  • With - Công thức có thể trả về bất kỳ giá trị nào, có khả năng có tác dụng phụ.

Bên trong các công thức này, bạn có thể tham chiếu các trường của bản ghi đang được xử lý. Mỗi hàm này tạo ra một "phạm vi bản ghi" trong đó công thức được ước tính, trong đó các trường của bản ghi có sẵn dưới dạng mã định danh cấp cao nhất. Bạn cũng có thể tham chiếu các thuộc tính kiểm soát và các giá trị khác từ ứng dụng.

Ví dụ: lấy một bảng Sản phẩm được đặt trong một biến toàn cầu:

Các bảng được yêu cầu.

Set( 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 }
    )
)

Để xác định xem có bất kỳ sản phẩm nào trong số những sản phẩm này được yêu cầu nhiều hơn không:

Filter( Products, 'Quantity Requested' > 'Quantity Available' )

Đối số đầu tiên cho Bộ lọc là bảng để các bản ghi hoạt động và đối số thứ hai là một công thức. Filter tạo một phạm vi bản ghi để đánh giá công thức này trong đó các trường của mỗi bản ghi đều có sẵn, trong trường hợp này là Sản phẩm, Số lượng yêu cầuSố lượng sẵn có. Kết quả so sánh xác định nếu mỗi bản ghi nên được đưa vào kết quả của hàm:

Bàn cần thiết.

Thêm vào ví dụ này, chúng tôi có thể tính toán số lượng của mỗi sản phẩm để đặt hàng:

AddColumns( 
    Filter( Products, 'Quantity Requested' > 'Quantity Available' ), 
    "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
)

Ở đây, ta thêm cột được tính vào kết quả. AddColumns có phạm vi bản ghi riêng để tính toán sự khác biệt giữa những gì đã được yêu cầu và những gì có sẵn.

Thêm cột.

Cuối cùng, chúng ta có thể giảm bảng kết quả xuống chỉ còn các cột mà chúng ta muốn:

ShowColumns(
    AddColumns(
        Filter( Products, 'Quantity Requested' > 'Quantity Available' ),
        "Quantity To Order", 'Quantity Requested' - 'Quantity Available'
    ),
    "Product",
    "Quantity To Order"
)

Chỉ để đặt hàng.

Lưu ý rằng ở trên, chúng tôi đã sử dụng dấu ngoặc kép (") ở một số nơi và dấu ngoặc đơn (') ở những nơi khác. Dấu ngoặc đơn là bắt buộc khi tham chiếu giá trị của một đối tượng, chẳng hạn như trường hoặc bảng, trong đó tên của đối tượng chứa một khoảng trắng. Dấu ngoặc kép được sử dụng khi chúng ta không tham chiếu giá trị của một đối tượng mà nói về nó, đặc biệt là trong các tình huống mà đối tượng chưa tồn tại, như trong trường hợp AddColumns.

Định hướng

Tên trường được thêm vào với phạm vi bản ghi ghi đè cùng tên từ nơi khác trong ứng dụng. Khi điều này xảy ra, bạn vẫn có thể truy cập các giá trị từ bên ngoài phạm vi bản ghi với toán tử @ định hướng:

  • Để truy cập các giá trị từ phạm vi bản ghi lồng nhau, sử dụng toán tử @ với tên của bảng được vận hành khi sử dụng mẫu này:
    Bảng[@FieldName]
  • Để truy cập các giá trị toàn cầu, chẳng hạn như nguồn dữ liệu, bộ sưu tập và biến bối cảnh, hãy sử dụng mẫu [@ObjectName] (không có bảng chỉ định).

Nếu bảng đang được vận hành là một biểu thức, chẳng hạn như Filter(Table, ... ), thì toán tử định hướng không thể sử dụng được. Chỉ phạm vi bản ghi trong cùng mới có thể truy cập các trường từ biểu thức bảng này, bằng cách không sử dụng toán tử định hướng.

Giả sử có tập hợp X:

Giá trị X.

Bạn có thể tạo tập hợp này với ClearCollect( X, [1, 2] ).

Và tập hợp tác là Y:

Giá trị Y.

Bạn có thể tạo tập hợp này với ClearCollect( Y, ["A", "B"] ).

Ngoài ra, xác định một biến ngữ cảnh có tên Value với công thức này: UpdateContext( {Value: "!"} )

Chúng ta hãy kết hợp tất cả lại. Trong ngữ cảnh này, công thức sau đây:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Y[@Value] & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

tạo ra bảng này:

Giá trị XY.

Chuyện gì đang xảy ra ở đây? Hàm ForAll ngoài cùng xác định phạm vi bản ghi cho X, cho phép truy cập vào trường Value của từng bản ghi mà nó xử lý. Nó có thể được truy cập bằng cách sử dụng từ Value hoặc bằng cách sử dụng X[@Value].

Hàm ForAll trong cùng xác định một phạm vi bản ghi khác cho Y. Vì bảng này cũng có một trường Giá trị được xác định nên việc sử dụng Giá trị ở đây tham chiếu đến trường trong bản ghi của Y và không còn là bản ghi từ X nữa. Tại đây, để truy cập trường Giá trị của X, chúng ta phải sử dụng phiên bản dài hơn với toán tử định hướng.

Y là phạm vi bản ghi trong cùng, việc truy cập các trường của bảng này không yêu cầu định hướng, cho phép chúng tôi sử dụng công thức này với cùng kết quả:

Ungroup(
    ForAll( X,
        ForAll( Y,
            Value & Text( X[@Value] ) & [@Value]
        )
    ),
    "Value"
)

Tất cả bản ghi ForAll ghi đè phạm vi toàn cầu. Ngữ cảnh Giá trị mà chúng tôi xác định không có sẵn theo tên mà không có toán tử định hướng. Để truy cập giá trị này, hãy sử dụng [@Value].

Ungroup cân bằng kết quả vì hàm ForAll được lồng sẽ dẫn đến bảng kết quả được lồng.

Bảng một cột

Để hoạt động trên một cột từ bảng, hãy sử dụng hàm ShowColumns như trong ví dụ này:

ShowColumns( Products, "Product" )

Công thức này tạo ra bảng một cột sau:

Cột đơn.

Một cách ngắn hơn là chỉ định Table.Column trích xuất bảng một cột của riêng Cột từ Bảng. Ví dụ: công thức này tạo ra kết quả chính xác như khi sử dụng ShowColumns.

Products.Product

Bản ghi nội tuyến

Bạn thể hiện các bản ghi bằng cách sử dụng dấu ngoặc nhọn chứa các giá trị trường được đặt tên. Ví dụ: bạn có thể biểu diễn bản ghi đầu tiên trong bảng khi bắt đầu chủ đề này bằng cách sử dụng công thức sau:

{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 }

Bạn cũng có thể nhúng các công thức trong các công thức khác, như trong ví dụ sau:

{ Name: First(Products).Name, Price: First(Products).Price * 1.095 }

Bạn có thể lồng bản ghi bằng cách lồng các dấu ngoặc nhọn, như trong ví dụ sau:

{ 'Quantity': { 'OnHand': ThisItem.QuantOnHand, 'OnOrder': ThisItem.QuantOnOrder } }

Đặt từng tên cột có chứa ký tự đặc biệt, như khoảng trống hoặc dấu phẩy, trong ngoặc đơn. Để sử dụng ngoặc đơn trong tên cột, hãy nhân đôi nó.

Lưu ý rằng giá trị trong cột Giá không bao gồm ký hiệu tiền tệ, chẳng hạn như ký hiệu đô la. Định dạng đó sẽ được áp dụng khi giá trị được hiển thị.

Bảng nội tuyến

Bạn có thể tạo bảng bằng cách sử dụng hàm Table và một bộ bản ghi. Bạn có thể biểu diễn bảng ở đầu chủ đề này bằng cách sử dụng công thức sau:

Table( 
	{ Name: "Chocolate", Price: 3.95, 'Quantity on Hand': 12, 'Quantity on Order': 10 },
	{ Name: "Bread", Price: 4.95, 'Quantity on Hand': 34, 'Quantity on Order': 0 },
	{ Name: "Water", Price: 4.95, 'Quantity on Hand': 10, 'Quantity on Order': 0 } 
)

Bạn cũng có thể lồng bảng:

Table( 
	{ Name: "Chocolate", 
	  'Quantity History': Table( { Quarter: "Q1", OnHand: 10, OnOrder: 10 },
	                             { Quarter: "Q2", OnHand: 18, OnOrder: 0 } ) 
	}
)

Bảng giá trị nội tuyến

Bạn có thể tạo các bảng cột đơn bằng cách chỉ định các giá trị trong ngoặc vuông. Bảng kết quả có một cột duy nhất, được đặt tên là Giá trị.

Ví dụ: [ 1, 2, 3, 4 ] tương đương với Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } ) và trả về bảng sau:

Bảng nội tuyến.