테이블

노트

Microsoft Power Fx는 캔버스 앱 수식 언어의 새 이름입니다. 이러한 문서는 캔버스 앱에서 언어를 추출하고 다른 Microsoft Power Platform 제품과 통합하여 오픈 소스로 제공하는 과정에서 진행중인 작업입니다. 언어에 대한 소개를 위해 Microsoft Power Fx 개요로 시작하십시오.

Microsoft Power Fx에서는 레코드와 테이블에 데이터를 저장하는 Microsoft Excel, SharePoint, SQL Server 및 기타 여러 소스의 정보에 액세스하는 수식을 작성할 수 있습니다. 이러한 종류의 데이터로 가장 효과적으로 작업하려면 이러한 구조의 기반이 되는 개념을 검토합니다.

  • 레코드는 사람, 장소 또는 사물에 대한 하나 이상의 정보 범주를 포함합니다. 예를 들어 레코드에는 단일 고객의 이름, 이메일 주소 및 전화 번호가 포함될 수 있습니다. 다른 도구에서는 레코드를 "행" 또는 "항목"이라고 합니다.
  • 테이블은 동일한 범주의 정보가 포함된 하나 이상의 레코드를 포함합니다. 예를 들어 테이블에는 50명 고객의 이름, 이메일 주소 및 전화 번호가 포함될 수 있습니다.

Excel 수식에서 하나 이상의 셀 참조를 인수로 사용하는 것처럼 테이블 이름을 인수로 사용하여 다양한 수식을 작성할 수 있습니다. Power Fx의 수식 중 일부는 지정한 다른 인수를 반영하는 테이블을 반환합니다. 예를 들어 다음을 수행하는 수식을 만들 수 있습니다.

  • Patch 함수에 대한 여러 인수 중 하나로 테이블을 지정하여 테이블의 레코드를 업데이트합니다.
  • 테이블을 AddColumns, DropColumns 또는 RenameColumns 함수에 대한 인수로 지정하여 해당 테이블의 열을 추가, 제거 및 이름 변경합니다. 이러한 함수 중 어느 것도 원래 테이블을 수정하지는 않지만, 지정한 다른 인수에 따라 다른 테이블을 반환합니다.

테이블 요소

테이블 요소.

레코드

각 레코드에는 사람, 장소 또는 사물에 대한 정보 범주가 하나 이상 포함됩니다. 위의 예제에서는 각 제품(초콜릿, 음료수)에 대한 레코드와 각 정보 범주에 대한 열(가격, 보유 수량주문 수량)을 표시합니다.

수식에서는 테이블의 컨텍스트 외부에 중괄호를 사용하여 레코드를 단독으로 참조할 수 있습니다. 예를 들어 { Name: "딸기", Price: 7.99 } 레코드는 테이블과 관련이 없습니다. 이 예제에서 이름가격과 같은 필드 이름은 큰따옴표로 묶지 않습니다.

필드

필드는 레코드의 개별 정보 요소입니다. 이러한 종류의 필드를 특정 레코드에 대한 열의 값으로 시각화할 수 있습니다.

컨트롤과 마찬가지로 레코드에서 .연산자를 사용하여 레코드의 필드를 참조합니다. 예를 들어 First(Products).Name제품 테이블의 첫 번째 레코드에 대한 이름 필드를 반환합니다.

필드는 GroupBy 함수의 예제와 같이 다른 레코드 또는 테이블을 포함할 수 있습니다. 많은 수준의 레코드와 테이블을 원하는 만큼 중첩할 수 있습니다.

열은 테이블에 있는 하나 이상의 레코드에 대해 동일한 필드를 참조합니다. 위의 예제에서 각 제품에는 가격 필드가 있으며, 해당 가격은 모든 제품에 대해 동일한 열에 있습니다. 위의 테이블에는 4개의 열이 있으며, 위쪽에서 가로로 표시됩니다.

  • 이름
  • 가격
  • 보유 수량
  • 주문 수량

열의 이름은 해당 열의 필드를 반영합니다.

열 내의 모든 값은 동일한 데이터 형식입니다. 위의 예제에서 "보유 수량"은 항상 숫자를 포함하며, 한 레코드에서 "12 단위"와 같은 문자열은 포함할 수 없습니다. 모든 필드의 값이 공백일 수도 있습니다.

다른 도구에서 열을 "필드"로 참조했을 수도 있습니다.

테이블

테이블은 하나 이상의 레코드로 구성되며, 각 레코드에는 레코드 간에 일관된 이름을 갖는 여러 필드가 있습니다.

데이터 원본 또는 컬렉션에 저장된 모든 테이블에는 테이블을 참조하고 테이블을 인수로 사용하는 함수로 전달하는 데 사용되는 이름이 있습니다. 또한 테이블은 함수 또는 수식의 결과일 수도 있습니다.

다음 예제와 같이 중괄호로 표현된 레코드 집합이 포함된 Table 함수를 사용하여 수식에서 테이블을 표현할 수 있습니다.

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

대괄호가 있는 단일 열 테이블도 정의할 수 있습니다. 위에서 작성한 방법과 동일합니다.

[ "Strawberry", "Vanilla" ]

테이블 수식

Excel 및 Power Fx에서는 수식을 사용하여 숫자와 텍스트 문자열을 비슷한 방식으로 조작합니다.

  • Excel의 경우 A1 셀에 42와 같은 값을 입력한 다음, 다른 셀에 A1+2와 같은 수식을 입력하여 44라는 값을 표시합니다.
  • Power Apps의 경우 Slider1Default 속성을 42로 설정하고, 레이블의 Text 속성을 Slider1.Value + 2로 설정하여 44라는 값을 표시합니다.

두 경우 모두 인수 값(예: A1 셀의 숫자 또는 Slider1의 값)을 변경하면 계산된 값이 자동으로 변경됩니다.

마찬가지로 수식을 사용하여 테이블과 레코드의 데이터에 액세스하고 조작할 수 있습니다. Min(Catalog, Price)와 같은 일부 수식에서는 카탈로그 테이블의 가격 열에 있는 가장 낮은 값을 표시하기 위해 테이블 이름을 인수로 사용할 수 있습니다. RenameColumns(Catalog, "Price", "Cost")와 같은 다른 수식은 전체 테이블을 반환 값으로 사용하여 카탈로그 테이블의 모든 레코드를 반환하지만 Price 열의 이름을 Cost로 변경합니다.

숫자와 마찬가지로 테이블과 레코드를 포함한 수식은 기본 테이블 또는 레코드가 변경되면 자동으로 다시 계산됩니다. 카탈로그 테이블의 제품 원가가 이전 최소값 아래로 낮아지면 Min 수식의 반환 값이 이러한 변경과 일치하도록 자동으로 변경됩니다.

Table 함수 및 컨트롤 속성

Lower 함수를 고려하십시오. welcome 변수에 "Hello, World" 텍스트 문자열을 포함하면 수식 Lower( welcome )"hello, world"를 반환합니다. 이 함수는 어떤 식으로든 해당 변수의 값을 변경하지 않습니다. Lower는 입력만 처리하고 출력을 생성한다는 점에서 순수한 기능입니다. 그게 다입니다. 부작용은 없습니다. Excel의 모든 기능과 대부분의 Power Fx 기능은 통합 문서 또는 앱을 자동으로 다시 계산할 수 있는 순수한 함수입니다.

Power Fx는 동일한 방식으로 테이블에서 작동하는 함수 세트를 제공합니다. 이러한 함수는 테이블을 입력으로 사용하고 전체 데이터 테이블을 필터링, 정렬, 변환, 축소 및 요약합니다. 사실, Lower와 그 외 일반적으로 단일 값을 사용하는 다른 많은 함수도 단일 열 테이블을 입력으로 사용할 수 있습니다.

많은 함수는 단일 열 테이블을 입력으로 사용합니다. 전체 테이블에 열이 하나만 있으면 이름으로 이를 지정할 수 있습니다. 테이블에 여러 열이 있는 경우 Table.Column 구문을 사용하여 해당 열 중 하나를 지정할 수 있습니다. 예를 들어 Products.Name제품 테이블에서 이름 값만의 단일 열 테이블을 반환합니다.

AddColumns, RenameColumns, ShowColumns, 또는 DropColumns 함수를 사용하여 원하는 대로 테이블의 모습을 완전히 재구성할 수 있습니다. 다시 말하지만, 이 함수들은 원본이 아닌 출력만 변경합니다.

동작 수식

기타 기능은 데이터를 수정하고 부작용을 갖도록 특별히 설계되었습니다. 이러한 함수는 순수하지 않으므로 신중하게 작성해야 하며 앱에서 값을 자동으로 다시 계산하는 데 참여할 수 없습니다. 동작 수식 내에서만 이러한 함수를 사용할 수 있습니다.

레코드 범위

일부 함수는 테이블의 모든 레코드에서 수식을 개별적으로 평가하여 작동합니다. 수식 결과는 다음과 같이 다양한 방법으로 사용됩니다.

  • AddColumns - 수식에서 추가된 필드의 값을 제공합니다.
  • Average, Max, Min, Sum, StdevP, VarP - 수식에서 집계할 값을 제공합니다.
  • Filter, Lookup - 수식에서 레코드가 출력에 포함되어야 하는지 여부를 결정합니다.
  • Concat - 수식에서 함께 연결할 문자열을 결정합니다.
  • Distinct - 수식에서 중복된 레코드를 식별하는 데 사용되는 값을 반환합니다.
  • ForAll - 수식에서 잠재적으로 부작용이 있는 모든 값을 반환할 수 있습니다.
  • Sort - 수식에서 레코드를 정렬할 값을 제공합니다.
  • With - 수식에서 잠재적으로 부작용이 있는 모든 값을 반환할 수 있습니다.

이러한 수식 내에서는 처리되는 레코드의 필드를 참조할 수 있습니다. 이러한 각 함수는 수식이 평가되는 "레코드 범위"를 만들어 레코드의 필드를 최상위 식별자로 사용할 수 있습니다. 앱 전체에서 컨트롤 속성 및 기타 값을 참조할 수도 있습니다.

예를 들어 전역 변수에 배치된 제품 테이블을 가져옵니다.

요청된 테이블.

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

이러한 제품 중 하나라도 사용 가능한 것 보다 더 많은 요청이 있었는지 확인하려면 다음을 수행합니다.

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

Filter의 첫 번째 인수는 작업할 레코드의 테이블이고, 두 번째 인수는 수식입니다. Filter는 각 레코드의 필드를 사용할 수 있는 이 수식을 평가할 레코드 범위를 만듭니다. 이 경우에는 Product, Quantity RequestedQuantity Available입니다. 비교 결과는 각 레코드가 함수의 결과에 포함되어야 하는지 여부를 결정합니다.

필요한 테이블.

이 예제에 추가하여 주문할 각 제품의 양을 계산할 수 있습니다.

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

여기서는 계산 열을 결과에 추가합니다. AddColumns에는 요청된 항목과 사용 가능한 항목 간의 차이를 계산하는 데 사용하는 자체의 레코드 범위가 있습니다.

열 추가.

마지막으로 결과 테이블을 원하는 열만으로 줄일 수 있습니다.

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

주문 전용.

위의 예제에서 일부 항목에는 큰따옴표(")를 사용하고 다른 항목에는 작은따옴표(')를 사용했습니다. 개체 이름에 공백이 포함된 개체(예: 필드 또는 테이블)의 값을 참조할 때는 작은따옴표가 필요합니다. 큰따옴표는 AddColumns의 경우와 같이 개체의 값을 참조하지 않고 해당 개체에 대해 언급하는 경우, 특히 개체가 아직 없는 상황에서 사용됩니다.

명확성

레코드 범위에 추가된 필드 이름은 앱 어디에서나 동일한 이름을 재정의합니다. 이 경우 @ 명확성 연산자를 사용하여 레코드 범위 외부의 값에 계속 액세스할 수 있습니다.

  • 중첩된 레코드 범위의 값에 액세스하려면 다음 패턴을 사용하여 작업 중인 테이블의 이름에 @ 연산자를 사용합니다.
    Table[@FieldName]
  • 데이터 원본, 컬렉션 및 컨텍스트 변수와 같은 전역 값에 액세스하려면 테이블 지정 없이 [@ObjectName] 패턴을 사용합니다.

작업 중인 테이블이 Filter(Table, ... )과 같은 식이면 명확성 연산자를 사용할 수 없습니다. 가장 안쪽의 레코드 범위만 명확성 연산자를 사용하지 않고 이 테이블 식의 필드에 액세스할 수 있습니다.

예를 들어 X 컬렉션이 있다고 가정해 보겠습니다.

X 값.

ClearCollect( X, [1, 2] )를 사용하여 이 컬렉션을 만들 수 있습니다.

그리고 또 다른 Y 컬렉션이 있습니다.

Y 값.

ClearCollect( Y, ["A", "B"] )를 사용하여 이 컬렉션을 만들 수 있습니다.

또한 UpdateContext( {Value: "!"} ) 수식을 사용하여 Value라는 컨텍스트 변수를 정의합니다.

이제 모두 정리해 보겠습니다. 이 컨텍스트에서 수식은 다음과 같습니다.

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

다음 테이블이 생성됩니다.

XY 값.

여기서는 무슨 일이 발생하나요? 가장 바깥쪽의 ForAll 함수는 X에 대한 레코드 범위를 정의하므로 처리되는 각 레코드의 Value 필드에 대한 액세스를 허용합니다. 단순히 Value라는 단어를 사용하거나 X[@Value]를 사용하여 액세스할 수 있습니다.

가장 안쪽의 ForAll 함수는 Y에 대한 다른 레코드 범위를 정의합니다. 이 테이블에는 Value 필드가 정의되어 있으므로 여기서 Value를 사용하면 Y 레코드의 필드를 참조하고 더 이상 X의 필드는 참조하지 않습니다. 여기서 XValue 필드에 액세스하려면 명확성 연산자와 함께 더 긴 버전을 사용해야 합니다.

Y가 가장 안쪽의 레코드 범위이므로 이 테이블의 필드에 액세스하는 데 명확성이 필요하지 않습니다. 따라서 다음 수식을 사용하여 동일한 결과를 얻을 수 있습니다.

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

모든 ForAll 레코드 범위는 전역 범위를 재정의합니다. 정의한 Value 컨텍스트 변수는 명확성 연산자가 없이 이름으로 사용할 수 없습니다. 이 값에 액세스하려면 [@Value]를 사용합니다.

중첩된 ForAll 함수에서 중첩된 결과 테이블을 생성하므로 Ungroup은 결과를 평면화합니다.

단일 열 테이블

테이블에서 단일 열을 작동시키려면 이 예에서와 같이 ShowColumns 함수를 사용하십시오.

ShowColumns( Products, "Product" )

이 수식은 이 단일 열 테이블을 생성합니다.

단일 열.

더 짧은 대안으로는 Table에서 Column만의 단일 열 테이블을 추출하는 Table.Column을 지정합니다. 예를 들어 이 수식은 ShowColumns를 사용하는 것과 동일한 결과를 생성합니다.

Products.Product

인라인 레코드

레코드는 명명된 필드 값이 포함된 중괄호를 사용하여 표현합니다. 예를 들어 다음 수식을 사용하여 이 항목의 시작 부분에 테이블의 첫 번째 레코드를 표현할 수 있습니다.

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

다음 예제와 같이 다른 수식 내에 수식을 포함할 수도 있습니다.

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

다음 예제와 같이 중괄호를 중첩하여 레코드를 중첩할 수 있습니다.

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

공백이나 콜론과 같은 특수 문자가 포함된 각각의 열 이름은 작은따옴표로 묶습니다. 열 이름 내에서 작은따옴표를 사용하려면 작은따옴표를 두 번 지정합니다.

Price 열의 값에는 $ 기호와 같은 통화 기호가 포함되지 않습니다. 값이 표시될 때 해당 형식이 적용됩니다.

인라인 테이블

Table 함수와 레코드 집합을 사용하여 테이블을 만들 수 있습니다. 다음 수식을 사용하여 이 항목의 시작 부분에 테이블을 표현할 수 있습니다.

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

테이블을 중첩할 수도 있습니다.

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

인라인 값 테이블

대괄호 안에 값을 지정하여 단일 열 테이블을 만들 수 있습니다. 결과 테이블에는 Value라는 단일 열이 있습니다.

예를 들어 [ 1, 2, 3, 4 ]Table( { Value: 1 }, { Value: 2 }, { Value: 3 }, { Value: 4 } )와 같으며 다음 테이블을 반환합니다.

인라인 테이블