연산자와 식별자
참고
Microsoft Power Fx는 캔버스 앱 수식 언어의 새 이름입니다. 이러한 문서는 캔버스 앱에서 언어를 추출하고 다른 Microsoft Power Platform 제품과 통합하여 오픈 소스로 제공하는 과정에서 진행중인 작업입니다. 언어에 대한 소개를 위해 Microsoft Power Fx 개요로 시작하십시오.
Microsoft Power Fx의 연산자는 아래에 설명되어 있습니다. 일부 연산자는 제작자의 언어에 따라 달라집니다. 자세한 내용은 글로벌 앱을 참조하세요.
기호 | 형식 | 구문 | 설명 |
---|---|---|---|
. | 속성 선택기 | 슬라이더1.값 Color.Red |
테이블 컨트롤 또는 열거형에서 속성을 추출합니다. 이전 버전과의 호환성을 위해 !를 사용할 수 있습니다. |
. 언어에 따라 다름 |
소수 구분 기호 | 1.23 | 숫자의 정수 부분과 소수 부분 사이의 구분 기호입니다. 이 문자는 언어에 따라 다릅니다. |
( ) | 괄호 | 필터(T, A < 10) (1 + 2) * 3 |
우선 순위를 적용하고 하위 식을 더 큰 식으로 그룹화합니다. |
+ | 산술 연산자 | 1 + 2 | 더하기 |
- | 2 - 1 | 빼기와 부호 | |
* | 2 * 3 | 곱하기 | |
/ | 2 / 3 | 나누기(Mod 함수 참조) | |
^ | 2 ^ 3 | 지수, Power와 같음 | |
% | 20% | 백분율("* 1/100"에 해당) | |
= | 비교 연산자 | 가격 = 100 | 같음 |
> | 가격 > 100 | 보다 큼 | |
>= | 가격 >= 100 | 크거나 같음 | |
< | 가격 < 100 | 보다 작음 | |
<= | 가격 <= 100 | 보다 작거나 같음 | |
<> | 가격 <> 100 | 같지 않음 | |
& | 문자열 연결 연산자 | "안녕하세요" & " " & "세상" | 여러 문자열을 연속하여 표시 |
&& 또는 그리고 | 논리 연산자 | 가격 < 100 && Slider1.Value = 20 또는 Price < 100 And Slider1.Value = 20 |
논리 결합, And 함수와 같음 |
|| 또는 또는 | 가격 < 100 || Slider1.Value = 20 또는 가격 < 100 또는 Slider1.Value = 20 | 논리 분리, Or 함수와 같음 | |
! 또는 Not | !(가격 < 100) 또는 아님(가격 < 100) | 논리 부정, Not 함수와 같음 | |
정확한 | 멤버십 운영자 | Gallery1.Selected exactin저장된 항목 | 컬렉션 또는 테이블에 속함 |
정확한 | "Windows" exactin "Windows 운영 체제에서 창을 표시하려면..." | 부분 문자열 테스트(대/소문자 구분) | |
~에 | Gallery1.Selected in SavedItems | 컬렉션 또는 테이블에 속함 | |
~에 | "키보드와 모니터..."의 "The" | 부분 문자열 테스트(대/소문자 구분 안 함) | |
@ | 동음이의어 운영자 | 내 테이블[@필드이름] | 필드 명확성 |
@ | [@내변수] | 글로벌 명확성 | |
, [언어에 따라 다름] |
목록 구분 기호 | If(X < 10, "낮음", "좋음") { X: 12, Y: 32 } [ 1, 2, 3 ] |
분리: 이 문자는 언어에 따라 다릅니다. |
; [언어에 따라 다름] |
수식 연결 | Collect(T, A); Navigate(S1, "") | 동작 속성에서 함수 호출을 분리합니다. 연결 연산자는 언어에 따라 다릅니다. |
처럼 | 운영자로 | 모든 고객을 고객으로 | 갤러리 및 레코드 범위 함수에서 ThisItem 및 ThisRecord를 재정의합니다. 처럼 더 나은 구체적인 이름을 제공하는 데 유용하며 특히 중첩된 시나리오에서 중요합니다. |
본인 | 자기 부모 | 셀프 필 | 현재 컨트롤의 속성에 액세스 |
부모 | #피이_이이이이이이 | 부모.채우기 | 컨트롤 컨테이너의 속성에 액세스 |
이 항목 | 이 항목 운영자 | 이 항목.이름 | 갤러리 또는 양식 컨트롤의 필드에 액세스 |
이 기록 | 이 항목 운영자 | 이 레코드.이름 | ForAll, Sum, With 및 기타 레코드 범위 함수에서 전체 레코드 및 레코드의 개별 필드에 액세스합니다. As 연산자로 재정의할 수 있습니다. |
in 및 exactin 연산자
in 및 exactin 연산자는 컬렉션이나 가져온 테이블 등의 데이터 원본에서 문자열을 찾는 데 사용합니다. in 연산자는 대소문자에 관계없이, exactin 연산자는 대소문자가 같은 경우에만 일치 항목을 검색합니다. 예를 들어 다음과 같습니다.
갤러리에서 이미지 및 텍스트 표시에 설명된 첫 번째 절차에 따라 재고라는 컬렉션을 만들거나 가져와 갤러리에 표시합니다.
갤러리의 Items 속성을 다음 수식으로 설정합니다.
필터(재고, 제품 이름의 "E")갤러리는 Callisto를 제외한 모든 제품을 표시합니다. 지정한 문자가 없는 제품이 이 제품뿐이기 때문입니다.
갤러리의 Items 속성을 다음 수식으로 변경합니다.
필터(재고, "E" 정확한 제품 이름)갤러리는 Europa만 표시합니다. 이 이름만 지정한 대소문자의 문자를 포함하기 때문입니다.
ThisItem, ThisRecord, As 연산자
테이블의 개별 레코드에 수식을 적용하는 여러 컨트롤과 함수가 있습니다. 수식에서 개별 레코드를 참조하려면 다음 중 하나를 사용하십시오.
연산자 | 적용 대상 | 설명 |
---|---|---|
이 항목 | 갱도 제어 양식 편집 제어 표시 형태 제어 |
Gallery 또는 양식 컨트롤에서 현재 레코드의 기본 이름입니다. |
이 기록 | 모두를 위해, 필터, 와 함께, 합집합 그리고 다른 기록 범위 기능 | ForAll 및 기타 레코드 범위 함수에서 현재 레코드의 기본 이름입니다. |
처럼 이름 | 갱도 제어 ForAll, Filter, With, Sum 및 기타 레코드 범위 함수 |
현재 레코드의 이름을 정의하고 기본 ThisItem 또는 ThisRecord를 교체합니다. As를 사용해 수식을 이해하기 쉽게 만들고 중첩 시 모호함을 해결할 수 있습니다. |
ThisItem 연산자
예를 들어 다음의 갤러리 컨트롤에서 Items 속성은 Employees 데이터 원본으로 설정되었습니다(예: Northwind Traders 샘플에 포함된 Employees):
Employees
갤러리의 첫 번째 항목은 각 직원에 복제된 템플릿입니다. 템플릿에서 사진의 수식은 현재 항목을 참조하기 위해 ThisItem을 사용했습니다.
ThisItem.Picture
비슷하게, 이름의 수식도 ThisItem을 사용합니다.
ThisItem.'First Name' & " " & ThisItem.'Last Name'
ThisRecord 연산자
ThisRecord 는 레코드 범위가 있는 함수에서 사용됩니다. 예를 들어 Filter 함수를 갤러리의 Items 속성과 함께 사용하여 M으로 시작하는 이름만 표시할 수 있습니다.
Filter( Employees, StartsWith( ThisRecord.Employee.'First Name', "M" ) )
ThisRecord 는 선택 사항이며 필드를 직접 사용하면 암시적으로 적용됩니다. 예를 들어 이 경우 다음과 같이 작성할 수 있습니다.
Filter( Employees, StartsWith( 'First Name', "M" ) )
선택 사항이지만 ThisRecord는 수식을 이해하기 쉽게 만들어주며 필드 이름이 관계 이름이기도 한 경우 모호한 상황을 해결하기 위해 사용해야 할 수 있습니다. ThisRecord 는 선택 사항이지만, ThisItem 은 항상 필수입니다.
ThisRecord는 Patch, Collect 및 기타 레코드 범위 함수에서 전체 레코드를 참조하는 데 사용합니다. 예를 들어 다음 수식은 모든 비활성 직원의 상태를 활성으로 설정합니다.
With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
ForAll( InactiveEmployees,
Patch( Employees, ThisRecord, { Status: 'Status (Employees)'.Active } ) ) )
As 연산자
As 연산자는 갤러리 또는 레코드 범위 함수에서 레코드에 이름을 지정하거나 기본 ThisItem 또는 ThisRecord를 재정의하는 데 사용합니다. 레코드 이름을 지정하면 수식을 이해하는 데 도움이 되며 중첩된 상황에서 다른 범위의 레코드에 액세스하려면 이름이 필요할 수 있습니다.
예를 들어 갤러리의 Items 속성을 As를 사용해 수정하여 직원에 대한 작업을 하는 것을 지정할 수 있습니다.
Employees As Employee
사진과 이름에 대한 수식이 현재 레코드에 이 이름을 사용하도록 수정되었습니다.
Employee.Picture
Employee.'First Name' & " " & Employee.'Last Name'
또한 기본 이름인 ThisRecord를 대체하기 위해 레코드 범위 함수와 함께 사용할 수 있습니다. 이를 이전 예제에 적용하여 작업 중인 레코드를 확실히 지정할 수 있습니다.
With( { InactiveEmployees: Filter( Employees, Status = 'Status (Employees)'.Inactive ) },
ForAll( InactiveEmployees As Employee,
Patch( Employees, Employee, { Status: 'Status (Employees)'.Active } ) ) )
갤러리 및 레코드 범위 함수를 중첩할 때 ThisItem 및 ThisRecord는 항상 가장 안쪽의 범위를 참조하며 바깥쪽 범위의 레코드는 사용할 수 없습니다. As를 사용하면 각각에 고유한 이름을 지정하여 모든 레코드 범위를 사용할 수 있습니다.
예를 들어, 이 식은 두 개의 ForAll 함수를 중첩하여 텍스트 문자열로 체스판 패턴을 생성합니다.
Concat(
ForAll( Sequence(8) As Rank,
Concat(
ForAll( Sequence(8) As File,
If( Mod(Rank.Value + File.Value, 2) = 1, " X ", " . " )
),
Value
) & Char(10)
),
Value
)
Label 컨트롤의 Text 속성을 이 수식으로 설정하면 이 내용이 표시됩니다.
여기서 무슨 일이 일어나고 있는지 살펴보겠습니다.
- Sequence 함수에서 번호가 매겨진 레코드 8개를 포함하는 명명되지 않은 테이블을 반복하는 것으로 시작합니다. 이 반복은 흔히 Rank라고 하는 보드의 각 행을 대상으로 수행하며 여기에 이름을 지정합니다.
- 각 행에 대해 8개 열의 명명되지 않은 다른 테이블을 반복하고 공통 이름 File을 지정합니다.
- Rank.Value + File.Value가 홀수이면 정사각형에 X가 표시되고, 그렇지 않으면 점이 표시됩니다. 수식의 이 부분은 As 연산자를 사용하여 두 ForAll 루프를 모두 참조합니다.
- Concat 은 두 번 사용되는데, 먼저 열을 조립하는 데 사용되고 그다음 행을 조립하는 데 사용되며, 새 줄을 만드는 데 Char(10) 이 추가되었습니다.
ForAll 함수 대신 중첩된 Gallery 컨트롤에서도 비슷한 예가 가능합니다. Rank의 수직 갤러리부터 시작해보겠습니다. 이 갤러리 컨트롤은 다음과 같은 수식의 Items를 가집니다.
Sequence(8) as Rank
이 갤러리 내에서 File에 대한 수평 갤러리를 배치하면 다음 항목의 Items 속성과 함께 각 Rank에 대해 복제됩니다.
Sequence(8) as File
마지막으로 이 갤러리 내에서 각 File 및 각 Rank에 속성 대해 복제될 Label 컨트롤을 추가합니다. 전체 공간을 채우도록 크기를 조정하고 Fill 속성을 사용해 이 식으로 색을 지정합니다.
If( Mod( Rank.Value + File.Value, 2 ) = 1, Green, Beige )
셀프 및 상위 항목 운영자
수식 내에서 컨트롤과 해당 속성을 참조하는 세 가지 방법이 있습니다.
방법 | 설명 |
---|---|
컨트롤 이름별 | 컨트롤은 앱 내부의 어디서나 이름을 통해 참조할 수 있습니다. 예를 들어 Label1.Fill은 이름이 Label1인 컨트롤의 채우기 속성을 나타냅니다. |
셀프 운영자 | 수식을 작성할 때 동일한 컨트롤의 다른 속성을 참조하는 것이 편리한 경우가 많습니다. 이름으로 절대 참조를 사용하는 대신 자신에 대한 상대 참조를 사용하는 것이 더 쉽고 더 쉽습니다. Self 연산자는 현재 컨트롤의 속성에 대한 쉬운 액세스를 제공합니다. 예를 들어 Self.Fill은 현재 컨트롤의 채우기 색을 나타냅니다. |
부모 운영자 | 일부 컨트롤에는 Screen 및 Gallery 컨트롤과 같은 다른 컨트롤이 있습니다. 그 안에 있는 컨트롤의 호스팅 컨트롤을 parent라고 합니다. Self 연산자와 마찬가지로 Parent 연산자는 컨테이너 컨트롤에 대한 쉬운 상대 참조를 제공합니다. 예를 들어 Parent.Fill은 현재 컨트롤의 컨테이너인 컨트롤의 채우기 속성을 나타냅니다. |
Self 와 부모 는 연산자이며 컨트롤 자체의 속성이 아닙니다. Parent.Parent, Self.Parent 또는 Parent.Self 참조는 지원되지 않습니다.
식별자 이름
변수, 데이터 원본, 열, 기타 개체의 이름에는 어떤 유니코드도 포함될 수 있습니다.
공백이나 기타 특수 문자가 있는 이름 앞뒤에는 작은따옴표를 사용합니다.
두 개의 작은 따옴표를 함께 사용하면 이름에 하나의 작은따옴표를 넣을 수 있습니다. 특수 문자가 없는 이름에는 작은 따옴표가 필요하지 않습니다.
다음은 표에서 볼 수 있는 몇 가지 열 이름과 이 이름이 수식으로 표현되는 몇 가지 예입니다.
데이터베이스의 열 이름 | 수식의 열 참조 |
---|---|
SimpleName | SimpleName |
NameWith123Numbers | NameWith123Numbers |
공백이 있는 이름 | 'Name with spaces' |
"큰"따옴표가 있는 이름 | 'Name with "double" quotes' |
'작은'따옴표가 있는 이름 | 'Name with ''single'' quotes' |
@ 기호가 있는 이름 | 'Name with an @ at sign' |
큰 따옴표는 텍스트 문자열을 지정하는 데 사용됩니다.
표시 이름 및 논리 이름
SharePoint, Microsoft Dataverse와 같은 일부 데이터 원본에는 동일한 테이블이나 데이터 열을 나타내는 두 가지 이름이 있습니다.
논리적 이름 - 고유성이 보장되고, 생성 후 변경되지 않으며, 일반적으로 공백이나 기타 특수 문자를 허용하지 않으며, 다른 언어로 지역화되지 않는 이름입니다. 이러한 결과로 암호와 같은 이름이 될 수 있습니다. 이 이름들은 전문 개발자들이 사용합니다. 예를 들어 cra3a_customfield와 같은 것이 있습니다. 이 이름을 스키마 이름 또는 그냥 이름이라고도 합니다.
표시 이름 - 사용자 친화적이고 최종 사용자에게 표시되도록 의도된 이름입니다. 이 이름은 고유하지 않을 수 있으며 시간이 지나 변경될 수 있고 공백과 유니코드 문자를 포함할 수 있으며 다른 언어로 번역할 수 있습니다. 위의 예제의 경우 표시 이름은 단어 사이에 공백이 있는 사용자 정의 필드알 수 있습니다.
표시 이름은 이해하기 쉽기 때문에 Power Fx는 논리 이름을 제안하지 않고 선택 항목으로 표시 이름을 제안합니다. 논리적 이름은 추천되지 않지만 간접적으로 입력하면 계속 사용할 수 있습니다.
예를 들어 Dataverse의 엔터티에 Custom Field를 추가했다고 가정해 보겠습니다. 시스템은 필드를 만들 때만 수정할 수 있는 논리 이름을 할당합니다. 결과는 다음과 같을 것입니다.
계정 필드에 대한 참조를 만들 때는 'Custom Field'가 표시 이름이기 때문에 이 필드를 사용하도록 제안합니다. 이 이름에는 공백이 있으므로 작은 따옴표를 사용해야 합니다.
제안을 선택하면 수식 표시줄에 'Custom Field'가 표시되고 데이터가 검색됩니다.
제안되지는 않지만 이 필드에 논리 이름을 사용할 수도 있습니다. 이렇게 해도 동일한 데이터가 검색됩니다. 이 이름에는 공백이나 특수 문자가 포함되지 않으므로 작은 따옴표가 필요하지 않습니다.
백그라운드에서 수식에 표시된 표시 이름과 기반 논리 이름 간의 매핑이 유지됩니다. 데이터 원본과 상호 작용하는 데는 논리적 이름을 사용해야 하므로 이 매핑이 현재 표시 이름을 논리 이름으로 자동 변환하는 데 사용되며, 네트워크 트래픽에 나타납니다. 이 매핑은 논리 이름으로 다시 변환하여 새로운 표시 이름으로 전환하며, 예를 들어 표시 이름이 변경되거나 다른 언어의 제작자가 앱을 편집하는 경우입니다.
노트
논리 이름은 다른 환경으로 앱을 이동할 때도 번역되지 않습니다. Dataverse 시스템 엔터티와 필드 이름의 경우 논리 이름이 전체 환경에서 일관되게 같으므로 문제가 없습니다. 하지만 위의 예에서 cra3a_customfield와 같은 사용자 지정 필드는 다른 환경에 갔을 때 다른 접두사(이 경우 cra3a)를 가질 수 있습니다. 이럴 때는 새 환경에 맞게 바꿀 수 있는 표시 이름이 더 좋습니다.
이름 구분
표시 이름은 고유하지 않으므로 같은 표시 이름이 동일한 엔터티에 두 번 이상 사용될 수 있습니다. 이럴 때는 충돌하는 이름 중 하나 이상의 끝에 논리 이름이 괄호로 묶여 추가됩니다. 위의 예를 다시 들면 논리 이름이 cra3a_customfieldalt인 표시 이름 Custom Field가 또 있다면 두 번째 필드의 표시 이름은 다음과 같이 됩니다.
이름 구분 문자열은 엔터티 이름, 옵션 집합, 기타 Dataverse 항목과 같이 이름 충돌이 발생하는 다른 상황에서도 추가됩니다.
구분 연산자
Filter, AddColumns, Sum과 같은 일부 함수는 각 레코드를 처리하는 동안 테이블 필드에 액세스하기 위해 레코드 범위를 만듭니다. 레코드 범위에 추가된 필드 이름은 앱 어디에서나 동일한 이름을 재정의합니다. 이럴 경우에는 @ 구분 연산자를 사용하여 레코드 범위 외부에서 값에 액세스할 수 있습니다.
- 중첩된 레코드 범위의 값에 액세스하려면 다음 패턴을 사용하여 작업 중인 테이블의 이름에 @ 연산자를 사용합니다.
테이블[@필드 이름] - 데이터 원본, 컬렉션 및 컨텍스트 변수와 같은 전역 값에 액세스하려면 테이블 지정 없이 [@ObjectName] 패턴을 사용합니다.
자세한 내용 및 예제는 레코드 범위를 참조하세요.