다음을 통해 공유


DAX 사용자 정의 함수(미리 보기)

비고

DAX 사용자 정의 함수는 현재 미리 보기로 제공됩니다.

DAX 사용자 정의 함수(UDF)를 사용하면 논리를 패키징하여 다른 DAX 함수처럼 다시 사용할 수 있습니다. UDF에는 새 FUNCTION 키워드, 선택적 매개 변수 (스칼라, 테이블 및 참조) 및 작성을 더 안전하고 명확하게 만드는 형식 검사 도우미가 도입되었습니다. UDF를 정의한 후에는 측정값, 계산 열, 시각적 계산 또는 다른 사용자 정의 함수에서 사용할 수 있습니다. 사용자는 비즈니스 규칙을 중앙 집중화하고 유지 관리 가능성을 개선하며 시간이 지남에 따라 계산을 안전하게 발전시킬 수 있습니다. 함수는 쿼리 뷰 및 DAX에서 만들고 관리할 수 있는 일류 모델 개체이며 함수 노드 아래의 모델 탐색기에서 볼 수 있습니다.

사용자 정의 함수 사용

데스크톱에서 UDF를 시도하려면 다음을 수행합니다.

  1. 파일 > 옵션 및 설정 > 옵션으로 이동합니다.
  2. 미리 보기 기능을 선택하고 사용자 정의 함수를 확인DAX합니다.
  3. 확인을 선택하고 Power BI Desktop을 다시 시작합니다.

사용자 정의 함수 정의 및 관리

함수를 정의하고 관리하는 여러 위치가 있습니다.

  • DAX 쿼리 뷰 (DQV). DQV에서 함수를 정의하고 수정합니다. DQV에는 UDF를 빠르게 테스트하고 관리할 수 있도록 돕는 컨텍스트 메뉴 빠른 쿼리 (평가, 정의 및 평가, 그리고 이 모델의 모든 함수 정의)이 포함되어 있습니다.
  • TMDL 보기. UDF는 TMDL에서 작성 및 편집할 수도 있습니다. TMDL 보기에는 상황에 맞는 메뉴 스크립트 TMDL도 포함됩니다.
  • 모델 탐색기. 모델 탐색기의 함수 노드 아래에서 기존 함수를 볼 수 있습니다.

UDF를 정의할 때 다음 명명 요구 사항을 따르세요.

함수 이름:

  • 모델 내에서 형식이 잘 지정되고 고유해야 합니다.
  • 이름 간격에 대한 마침표(점)를 포함할 수 있습니다(예: Microsoft.PowerBI.MyFunc). 마침표로 시작하거나 끝날 수 없으며, 연속된 마침표를 포함할 수 없습니다.
  • 마침표 이외의 이름에는 영숫자 또는 밑줄만 포함될 수 있습니다. 공백이나 특수 문자가 허용되지 않습니다.
  • 기본 제공 DAX 함수 또는 예약어(예: measure, function, define)와 충돌해서는 안 됩니다.

매개 변수 이름:

  • 영숫자 또는 밑줄만 포함할 수 있습니다. 마침표는 허용되지 않습니다.
  • 예약어가 아니어야 합니다.

DAX 쿼리 뷰 사용

쿼리 뷰에서 DAX 사용자 정의 함수를 정의, 업데이트 및 평가할 수 있습니다. 쿼리 뷰에 대한 DAX 자세한 내용은 쿼리 보기를 참조DAX하세요.

일반 양식

DEFINE
    /// Optional description above the function
    FUNCTION <FunctionName> = ( [ParameterName]: [ParameterType], ... ) => <FunctionBody>

팁 (조언)

함수 설명에 사용합니다 /// . IntelliSense 함수 설명에는 한 줄(//) 또는 여러 줄(/* */) 주석이 표시되지 않습니다.

예: 단순 세금 함수

DEFINE
    /// AddTax takes in amount and returns amount including tax
    FUNCTION AddTax = 
        ( amount : NUMERIC ) =>
            amount * 1.1

EVALUATE
{ AddTax ( 10 ) }
// Returns 11

모델에 저장

쿼리 뷰에서 DAX 모델에 UDF를 저장하려면 다음을 수행합니다.

  • 변경 내용이 포함된 모델 업데이트를 클릭하여 쿼리에 모든 UDF를 저장합니다.
  • 또는 모델 업데이트: 정의된 함수 위에 새 함수를 추가하여 단일 UDF를 저장합니다.

DAX 사용자 정의 함수를 저장할 수 있는 두 위치를 강조 표시하는 Power BI Desktop의 쿼리 보기 스크린샷 첫 번째는 보기 맨 위에 변경 내용 단추가 있는 업데이트 모델입니다. 두 번째는 업데이트 모델이라는 레이블이 지정된 코드 편집기에서 상태 줄입니다. 새 함수 추가

TMDL 보기 사용

TMDL 보기에서 사용자 정의 함수를 정의 및/또는 업데이트할 수 있습니다. TMDL 보기에 대한 자세한 내용은 TMDL 보기를 참조하세요.

일반 양식

createOrReplace
    /// Optional description above the function
    function <FunctionName> = ( [ParameterName]: [ParameterType], ... ) => <FunctionBody>

예: 단순 세금 함수

createOrReplace
    /// AddTax takes in amount and returns amount including tax
    function AddTax = 
        (amount : NUMERIC) =>
            amount * 1.1

모델에 저장

보기 맨 위에 있는 적용 단추를 클릭하여 스크립트의 모든 UDF를 모델에 저장합니다.

보기 맨 위에 있는 적용 단추를 강조 표시하는 Power BI Desktop의 TMDL 보기 스크린샷 사용자 정의 함수를 저장할 수 있는 위치입니다.

Power BI 프로젝트에서 TMDL 스크립트 사용

UDF는 Power BI 프로젝트를 사용할 때 의미 체계 모델 TMDL 스크립트에도 포함됩니다. functions.tmdl 폴더 내에서 찾을 수 있습니다.

Power BI 프로젝트의 Visual Studio Code 스크린샷 탐색기가 의미 체계 모델 폴더에 열려 있습니다. 'functions.tmdl'이 코드 편집기에서 열립니다. CustomerLifetimeValue, AverageOrderValue 및 AddTax의 세 가지 함수가 표시됩니다.

모델 탐색기 사용

모델 탐색기에서 Functions 노드 아래의 모델에서 모든 사용자 정의 함수를 볼 수 있습니다 . 모델 탐색기에 대한 자세한 내용은 모델 탐색기를 참조하세요.

확장된 함수 노드를 보여 주는 Power BI Desktop의 모델 탐색기 패널입니다. AddTax, AverageOrderValue 및 CustomerLifetimeValue의 세 가지 사용자 정의 함수가 나열됩니다.

쿼리 보기에서DAX 모델 탐색기 내 UDF의 오른쪽 클릭 메뉴에서 빠른 쿼리를 사용하여 함수를 쉽게 정의하고 평가할 수 있습니다.

Power BI Desktop의 모델 탐색기 창에는 확장된 함수 노드가 표시됩니다. 두 개의 상황에 맞는 메뉴가 열립니다. 첫 번째 메뉴는 빠른 쿼리, 이름 바꾸기, 모델에서 삭제, 보고서 보기에서 숨기기, 모두 숨기기 취소, 모두 축소 및 모두 확장 기능을 제공합니다. 빠른 쿼리가 강조 표시되고 선택됩니다. 두 번째 메뉴가 강조 표시되며 빠른 쿼리 옵션 평가, 정의 및 평가, 새 함수 정의 및 이 모델의 모든 함수 정의 옵션을 제공합니다.

TMDL 보기에서 함수를 캔버스로 끌어서 놓거나 스크립트 TMDL을 사용하여 모델 탐색기 내 UDF의 오른쪽 클릭 메뉴에서 스크립트를 생성할 수 있습니다.

Power BI Desktop의 모델 탐색기 창에는 확장된 함수 노드가 표시됩니다. 두 개의 상황에 맞는 메뉴가 열립니다. 첫 번째 메뉴는 TMDL 스크립트를 제공하여 이름 바꾸기, 모델에서 삭제, 보고서 보기에서 숨기기, 모두 숨기기 취소, 모두 축소 및 모두 확장합니다. TMDL에 대한 스크립트가 강조 표시되고 선택됩니다. 두 번째 메뉴가 강조 표시되고 TMDL 옵션 스크립트 탭 및 클립보드에 스크립트를 제공합니다.

DMV를 사용하여 UDF를 검사하기

DMV( 동적 관리 뷰 )를 사용하여 모델에서 UDF를 검사할 수 있습니다. 이러한 뷰를 사용하면 UDF를 비롯한 함수에 대한 정보를 쿼리할 수 있습니다.

모델에서 UDF를 검사하기 위해 INFO.FUNCTIONS 함수를 사용할 수 있습니다. 결과를 UDF로만 제한하려면 매개 변수를 ORIGIN .로 2지정합니다.

EVALUATE INFO.FUNCTIONS("ORIGIN", "2")

이 쿼리는 이름, 설명 및 관련 메타데이터를 포함하여 현재 모델에 있는 모든 UDF의 테이블을 반환합니다.

사용자 정의 함수 사용

UDF가 정의되고 모델에 저장되면 측정값, 계산 열, 시각적 계산 및 기타 UDF에서 호출할 수 있습니다. 이는 기본 제공 DAX 함수를 호출하는 것과 동일하게 작동합니다.

측정값에서 사용자 정의 함수(UDF) 호출하기

측정값에서 UDF를 사용하여 전체 필터 컨텍스트에서 재사용 가능한 논리를 적용합니다.

Total Sales with Tax = AddTax ( [Total Sales] )

예제 측정값은 아래 표에 나와 있습니다.

세금이 있는 총 판매액 및 총 판매액을 보여 주는 표입니다. 세금이 포함된 총 판매액이 강조 표시되어 있습니다. 시각화 창이 열려 있습니다. 열 필드에 세금이 있는 총 판매액이 강조 표시되어 있습니다.

계산 열에서 UDF 호출

계산 열에서 UDF를 사용하여 테이블의 모든 행에 재사용 가능한 논리를 적용할 수 있습니다.

비고

계산 열에서 UDF를 사용하는 경우 함수가 일관된 형식의 스칼라를 반환하는지 확인합니다. 자세한 내용은 매개 변수 를 참조하세요. 필요한 경우 CONVERT 또는 유사한 함수를 사용하여 결과를 원하는 형식으로 변환합니다.

Sales Amount with Tax = CONVERT ( AddTax ( 'Sales'[Sales Amount] ), CURRENCY )

아래 표에서 사용된 이 예제 측정값을 확인할 수 있습니다.

세금이 있는 판매액 및 판매액을 보여 주는 표입니다. 세금이 포함된 판매액이 강조 표시되어 있습니다. 시각화 창이 열려 있습니다. 세금이 있는 판매액은 열 필드에 잘 강조 표시되어 있습니다.

시각적 계산에서 UDF 호출

시각적 계산에서 UDF를 사용하여 시각적 개체에 논리를 직접 적용할 수 있습니다. 시각적 계산에 대한 자세한 내용은 시각적 계산을 참조하세요.

비고

시각적 계산은 시각적 개체에 있는 필드에만 작동합니다. 시각적 개체의 일부가 아닌 모델 개체에 액세스할 수 없으며, 모델 개체(예: 시각적 개체에 없는 열 또는 측정값)를 이 컨텍스트의 UDF에 전달할 수 없습니다.

Sales Amount with Tax = AddTax ( [Sales Amount] )

아래 표에서 이 예제 측정값을 확인할 수 있습니다.

시각적 계산 편집 모드에서 세금이 있는 판매액 및 판매액을 보여 주는 표입니다. 세금이 포함된 판매액이 강조 표시되어 있습니다. 세금이 있는 판매액에 대한 시각적 계산 수식이 강조 표시됩니다.

다른 UDF 내에서 UDF 호출하기

다른 함수에서 함수를 호출하여 UDF를 중첩할 수 있습니다. 이 예제에서는 간단한 AddTax UDF를 정의하고 다른 UDF AddTaxAndDiscount에서 호출합니다.

DEFINE
    /// AddTax takes in amount and returns amount including tax
    FUNCTION AddTax = 
        ( amount : NUMERIC ) =>
            amount * 1.1

	FUNCTION AddTaxAndDiscount = 
        (
			amount : NUMERIC,
			discount : NUMERIC
		) =>
		    AddTax ( amount - discount )

EVALUATE
{ AddTaxAndDiscount ( 10, 2 ) }
// Returns 8.8

매개 변수

DAX UDF는 0개 이상의 매개 변수를 수락할 수 있습니다. UDF에 대한 매개 변수를 정의할 때 필요에 따라 각 매개 변수에 대한 형식 힌트를 지정할 수 있습니다.

  • 형식: 매개 변수가 허용하는 값 형식(AnyVal, Scalar, Table또는 AnyRef)입니다.
  • 하위 형식(스칼라 형식에만 해당): 특정 스칼라 데이터 형식(Variant,, Int64, Decimal, Double, String, DateTimeBoolean또는 Numeric)입니다.
  • ParameterMode: 인수가 평가되는 경우(val 또는 expr).

형식 힌트는 다음과 같은 형식입니다. [type] [subtype] [parameterMode]

호출 사이트에서 함수를 더 안전하고 예측 가능하게 만들기 위해 각 매개 변수에 대해 이러한 형식 힌트를 모두 포함하거나 일부 또는 전혀 포함할 수 없습니다. 모든 항목을 생략하고 매개 변수 이름을 작성하면 인수가 AnyVal val호출 시 즉시 평가됨을 의미합니다. 이는 간단한 함수에 유용합니다.

유형

형식은 매개 변수가 허용하는 인수의 범주와 매개 변수가 또는 으로 전달되는지 여부를 정의합니다.

UDF 매개 변수에는 DAX과 식 형식이라는 두 가지 유형 계열이 있습니다.

  • 값 형식: 이 인수는 함수가 호출되고 결과 값이 함수에 전달될 때 즉시 평가 됩니다(즉시 계산).
    • AnyVal: 스칼라 또는 테이블을 허용합니다. 매개 변수에 대한 형식을 생략하는 경우 기본값입니다.
    • Scalar: 스칼라 값을 허용합니다(하위 형식을 추가할 수 있습니다).
    • Table: 테이블을 허용합니다.
  • 식 형식: 이 인수는 평가되지 않은 식 (지연 계산)을 전달합니다. 함수는 평가할 시기와 컨텍스트를 결정합니다. 이는 참조 매개 변수에 필요하며 필터 컨텍스트(예: 내부 CALCULATE)를 제어해야 하는 경우에 유용합니다. expr 형식은 열, 테이블, 달력 또는 측정값에 대한 참조일 수 있습니다.
    • AnyRef: 참조(열, 테이블, 달력 또는 측정값)를 허용합니다.

서브타입

하위 형식을 사용하면 특정 Scalar 데이터 형식을 정의할 수 있습니다. 하위 형식을 정의하는 경우 매개 변수를 형식으로 Scalar 명시적으로 정의할 필요가 없으므로 자동으로 가정됩니다.

하위 형식은 다음과 같습니다.

  • Variant: 스칼라를 허용합니다.
  • Int64: 전체 numner를 허용합니다.
  • Decimal: 고정 정밀도 10진수(예: 통화 또는 돈)를 허용합니다.
  • Double: 부동 소수점을 허용합니다.
  • String: 텍스트를 허용합니다.
  • DateTime: 날짜/시간을 허용합니다.
  • Boolean: 수락 /TRUEFALSE.
  • Numeric: 숫자 값(Int64, Decimal또는 Double 하위 형식)을 허용합니다.

ParameterMode

ParameterMode는 매개 변수 식이 계산되는 시기와 위치를 제어합니다. 이는 다음과 같습니다.

  • val (즉시 계산): 함수를 호출하기 전에 식이 한 번 평가됩니다. 그런 다음 결과 값이 함수에 전달됩니다. 이는 간단한 스칼라 또는 테이블 입력에 일반적입니다. 매개 변수에 대해 parameterMode를 생략하는 경우 기본값입니다.
  • expr (지연 평가): 식은 함수 내에서 계산되며, 잠재적으로 다른 컨텍스트(예: 행 컨텍스트 또는 필터 컨텍스트)에서 계산되며, 여러 번 또는 반복 내에서 참조되는 경우 여러 번 계산될 수 있습니다. 이는 참조 매개 변수에 필요하며 평가 컨텍스트를 제어해야 하는 경우에 유용합니다.

Scalar 유형은 val 또는 expr를 사용할 수 있습니다. 호출자의 컨텍스트에서 스칼라를 한 번 평가하려는 경우에 사용합니다 val . 평가를 연기하고 함수 내에서 컨텍스트를 적용하려는 경우에 사용합니다 expr . 예제: 테이블 매개 변수를 예로 참조하세요.

형식 AnyRefexpr 함수의 컨텍스트에서 해당 참조(열, 테이블, 측정값 등)를 평가해야 합니다.

예: 형 변환

DEFINE
    /// returns x cast to an Int64
    FUNCTION CastToInt = (
            x : SCALAR INT64 VAL
        ) =>
        x

EVALUATE
{ CastToInt ( 3.4 ), CastToInt ( 3.5 ), CastToInt ( "5" ) }
// returns 3, 4, 5

이렇게 하면 예측 가능한 반올림 및 텍스트 대 숫자 강제 변환에 Scalar 형식, Int64 하위 형식 및 val parameterMode를 사용하며, 모든 식이 즉시 평가되도록 보장합니다. 아래 예제처럼 Int64 하위 형식만 포함하면 쉽게 이 작업을 완료할 수 있습니다. 숫자가 아닌 문자열은 오류가 발생합니다.

DEFINE
    /// returns x as an Int64
    FUNCTION CastToInt = (
            x : INT64
        ) =>
        x

EVALUATE
{ CastToInt ( 3.4 ), CastToInt ( 3.5 ), CastToInt ( "5" ) }
// returns 3, 4, 5

예: 테이블 매개 변수(값 및 식)

UDF parameterMode가 필터 컨텍스트에 미치는 영향을 설명하기 위해 'Sales' 테이블의 행을 모두 계산하는 두 가지 함수를 고려합니다. 둘 다 본문에서 CALCULATETABLE(t, ALL('Date'))를 사용하지만, 하나의 매개 변수는 val (즉시 평가)로 선언되고, 다른 매개 변수는 expr (지연 평가)로 선언됩니다.

DEFINE
    /// Table val: receives a materialized table, context can't be changed
    FUNCTION CountRowsNow = (
            t : TABLE VAL
        ) =>
        COUNTROWS ( CALCULATETABLE ( t, ALL ( 'Date' ) ) )
    
    /// Table expr: receives an unevaluated expression, context CAN be changed
    FUNCTION CountRowsLater = (
            t : TABLE EXPR
        ) =>
        COUNTROWS ( CALCULATETABLE ( t, ALL ( 'Date' ) ) )

EVALUATE
{
    CALCULATE ( CountRowsNow ( 'Sales' ), 'Date'[Fiscal Year] = "FY2020" ),
    CALCULATE ( CountRowsLater ( 'Sales' ), 'Date'[Fiscal Year] = "FY2020" )
}
// returns 84285, 121253

CountRowsNow는 FY2020에 대한 판매 횟수만 반환합니다. 'Sales' 테이블은 함수를 입력하기 전에 연도별로 이미 필터링되었으므로 ALL('Date') 함수 내부에는 효과가 없습니다.

CountRowsLater는 모든 연도의 판매 수를 반환합니다. 이 함수는 평가되지 않은 테이블 식을 수신하여 외부 ALL('Date')연도 필터를 제거하여 평가합니다.

형식 검사

UDF의 형식 검사는 함수 본문 내에서 호출하여 전달된 매개 변수의 런타임 형식을 확인할 수 있는 새로운 기존 형식 검사 함수를 사용하여 수행할 수 있습니다. 이를 통해 UDF는 컨텍스트 제어를 사용하고, 매개 변수의 유효성을 미리 검사하고, 계산 전에 입력을 정규화할 수 있습니다.

비고

parameterMode 매개 변수의 경우 expr 함수 본문에서 매개 변수를 참조할 때 형식 검사가 수행됩니다(함수 호출 시간이 아님).

사용 가능한 형식 검사 함수

UDF는 다음 함수를 사용하여 스칼라 값을 테스트할 수 있습니다. 제공된 값이 해당 형식인지 여부에 따라 각 반환 TRUE/FALSE 됩니다.

카테고리 Functions
Numeric ISNUMERIC, ISNUMBER
Double ISDOUBLE
정수 ISINT64, ISINTEGER
Decimal ISDECIMAL (십진수 여부 확인), ISCURRENCY (통화 형식 여부 확인)
String ISSTRING, ISTEXT
불리언 (Boolean) ISBOOLEAN, ISLOGICAL
날짜 및 시간 ISDATETIME

예: 매개 변수가 문자열인지 확인

DEFINE
    /// Returns the length of a string, or BLANK if not a string
    FUNCTION StringLength = (
            s
        ) =>
        IF ( ISSTRING ( s ), LEN ( s ), BLANK () )

EVALUATE
{ StringLength ( "hello" ), StringLength ( 123 ) }
// Returns: 5, BLANK

이렇게 하면 오류가 방지되고 함수에 대한 문자열이 아닌 입력을 처리하는 방법을 결정할 수 있습니다(이 예제에서는 반환 BLANK).

예: 여러 매개 변수 형식 허용

DEFINE
    /// Helper 1: get currency name by int64 key
    FUNCTION GetCurrencyNameByKey = (
            k : INT64
        ) =>
        LOOKUPVALUE ( 'Currency'[Currency], 'Currency'[CurrencyKey], k )
    
    /// Helper 2: get currency name by string code
    FUNCTION GetCurrencyNameByCode = (
            code : STRING
        ) =>
        LOOKUPVALUE ( 'Currency'[Currency], 'Currency'[Code], code )
    
    /// Accepts key (int64) or code (string) and returns the currency name
    FUNCTION GetCurrencyName = (
            currency
        ) =>
        IF (
            ISINT64 ( currency ),
            GetCurrencyNameByKey ( currency ),
            GetCurrencyNameByCode ( currency )
        )

EVALUATE
{ GetCurrencyName ( 36 ), GetCurrencyName ( "USD" ) }
// returns "Euro", "US Dollar"

이 예제에서는 UDF에서 형식 검사를 사용하여 여러 입력 형식을 안전하게 수락하고 예측 가능한 단일 결과를 반환하는 방법을 보여 줍니다. GetCurrencyName 는 정수 통화 키 또는 텍스트 통화 코드일 수 있는 하나의 인수 currency를 사용합니다. 함수는 인수 형식을 .로 ISINT64확인합니다. 입력이 정수인 경우 통화 키를 기반으로 통화 이름을 조회하는 도우미 GetCurrencyNameByKey 를 호출합니다. 입력이 정수가 아니면 통화 코드를 기반으로 통화 이름을 조회하는 도우미 GetCurrencyNameByCode 를 호출합니다.

한 번에 여러 함수 정의

UDF를 사용하면 단일 쿼리 또는 스크립트에서 여러 함수를 정의할 수 있으므로 재사용 가능한 논리를 쉽게 구성할 수 있습니다. 관련 계산 또는 도우미 루틴을 함께 캡슐화하려는 경우에 특히 유용합니다. 함수는 함께 또는 개별적으로 평가할 수 있습니다.

DEFINE
    /// Multiplies two numbers
    FUNCTION Multiply = (
            a,
            b
        ) =>
        a * b

    /// Adds two numbers and 1
    FUNCTION AddOne = (
            x,
            y
        ) =>
        x + y + 1

    /// Returns a random integer between 10 and 100
    FUNCTION RandomInt = () =>
        RANDBETWEEN ( 10, 100 )

EVALUATE
{ Multiply ( 3, 5 ), AddOne ( 1, 2 ), RandomInt () }
// returns 15, 4, 98

고급 예제: 유연한 통화 변환

UDF가 더 복잡한 논리를 처리할 수 있는 방법을 DAX 보여주기 위해 통화 변환 시나리오를 살펴보겠습니다. 이 예제에서는 형식 검사 및 중첩 함수를 사용하여 지정된 날짜의 평균 또는 종료 날짜 환율을 사용하여 지정된 금액을 대상 통화로 변환합니다.

createOrReplace
	function ConvertDateToDateKey =  
		( 
			pDate: scalar variant 
		) => 
		YEAR ( pDate ) * 10000 + MONTH ( pDate ) * 100 + DAY ( pDate ) 
	
	function ConvertToCurrency = 
		( 
			pCurrency:scalar variant, 
			pDate: scalar variant, 
			pUseAverageRate: scalar boolean, 
			pAmount: scalar decimal 
		) => 
		var CurrencyKey = 
			EVALUATEANDLOG ( 
				IF ( 
					ISINT64 ( pCurrency ), 
					pCurrency, 
					CALCULATE ( 
						MAX ( 'Currency'[CurrencyKey] ), 
						'Currency'[Code] == pCurrency 
					) 
				) 
				, "CurrencyKey" 
			) 

		var DateKey = 
			EVALUATEANDLOG ( 
				SWITCH ( 
					TRUE, 
					ISINT64 ( pDate ), pDate, 
					ConvertDateToDateKey ( pDate ) 
				) 
				, "DateKey" 
			) 

		var ExchangeRate = 
			EVALUATEANDLOG ( 
				IF ( 
					pUseAverageRate, 
					CALCULATE ( 
						MAX ( 'Currency Rate'[Average Rate] ), 
						'Currency Rate'[DateKey] == DateKey, 
						'Currency Rate'[CurrencyKey] == CurrencyKey 
					), 
					CALCULATE ( 
					MAX ( 'Currency Rate'[End Of Day Rate] ), 
						'Currency Rate'[DateKey] == DateKey, 
						'Currency Rate'[CurrencyKey] == CurrencyKey 
					) 
				) 
				, "ExchangeRate" 
			) 

		var Result = 
			IF ( 
				ISBLANK ( pCurrency ) || ISBLANK ( pDate ) || ISBLANK ( pAmount ), 
				BLANK (), 
				IF ( 
					ISBLANK ( ExchangeRate ) , 
					"no exchange rate available", 
					ExchangeRate * pAmount 
				) 
			) 

		RETURN Result

이 함수는 ConvertToCurrency 통화 및 날짜 모두에 대해 유연한 입력 형식을 허용합니다. 사용자는 통화 키 또는 날짜 키를 직접 제공하거나 통화 코드 또는 표준 날짜 값을 제공할 수 있습니다. 함수는 각 입력의 형식을 확인하고 그에 따라 처리합니다. 정수인 경우 pCurrency 통화 키로 처리되고, 그렇지 않으면 함수는 통화 코드를 가정하고 해당 키를 확인하려고 시도합니다. pDate 는 비슷한 패턴을 따릅니다. 정수인 경우 날짜 키로 처리됩니다. 그렇지 않으면 함수는 표준 날짜 값이며 도우미 함수를 사용하여 ConvertDateToDateKey 날짜 키로 변환된다고 가정합니다. 함수가 유효한 exchnage 비율을 확인할 수 없는 경우 "사용 가능한 환율 없음" 메시지가 반환됩니다.

그런 다음 이 논리를 사용하여 현지 통화의 Total Sales와 같은 측정값을 정의할 수 있습니다.

Total Sales in Local Currency = 
ConvertToCurrency (
    SELECTEDVALUE ( 'Currency'[Code] ),
    SELECTEDVALUE ( 'Date'[DateKey] ),
    TRUE,
    [Total Sales]
)

필요에 따라 동적 형식 문자열 과 페어링하여 결과를 적절한 통화 형식으로 표시할 수 있습니다.

CALCULATE (
    MAX ( 'Currency'[Format String] ),
    'Currency'[Code] == SELECTEDVALUE ( 'Currency'[Code] )
)

예제 결과는 아래 스크린샷에서 볼 수 있습니다.

전체 날짜, 통화, 현지 통화의 총 판매액 및 총 판매액을 보여 주는 테이블입니다.

고려사항 및 제한사항

사용자 정의 함수는 현재 미리 보기로 제공되며 미리 보기 중에는 다음과 같은 고려 사항 및 제한 사항에 유의하세요.

일반:

  • 서비스에서 UDF를 작성하거나 모델링 DAX 할 수 없습니다.

  • 모델에서 UDF를 숨기거나 숨기기 취소할 수 없습니다.

  • UDF를 표시 폴더에 넣을 수 없습니다.

  • 리본에 '함수 만들기' 단추가 없습니다.

  • UDF를 번역과 결합할 수 없습니다.

  • UDF는 테이블이 없는 모델에서 지원되지 않습니다.

  • 쿼리 뷰에 '참조를 사용하여 정의' 빠른 쿼리가 DAX 없습니다.

  • OLS(Object-Level Security) 는 함수로 전송되거나 그 반대로 전송되지 않습니다. 예를 들어 보안 측정F값을 참조하는 다음 함수 MyMeasure 를 고려합니다.

    function F = () => [MyMeasure] + 42
    

    MyMeasure 개체 수준 보안을 사용하여 보안이 설정되면 함수 F가 자동으로 보호되지 않습니다. F이(가) MyMeasure에 대한 액세스 없이 특정 ID로 실행될 경우, MyMeasure는 존재하지 않는 것처럼 작동합니다. 함수 이름 및 설명에 보안 개체가 노출되는 것을 방지하는 것이 좋습니다.

UDF 정의:

  • 재귀 또는 상호 재귀는 지원되지 않습니다.
  • 함수 오버로드가 지원되지 않습니다.
  • 명시적 반환 형식은 지원되지 않습니다.

UDF 매개 변수:

  • 선택적 매개 변수는 지원되지 않습니다.
  • 매개 변수 설명은 지원되지 않습니다.
  • UDF는 값을 반환할 enum 수 없습니다. 값을 함수 매개 변수로 허용하는 enum 기본 제공 함수는 해당 컨텍스트에서 UDF를 사용할 수 없습니다.
  • 형식 힌트 expr 의 언바운드 매개 변수는 평가되지 않습니다.

IntelliSense 지원:

  • UDF는 라이브 연결 또는 복합 모델에서 사용할 수 있지만 IntelliSense 지원은 없습니다.
  • 시각적 계산에 UDF를 사용할 수 있지만 시각적 계산 수식 표시줄에는 UDF에 대한 IntelliSense 지원이 없습니다.
  • TMDL 보기에는 UDF에 대한 적절한 IntelliSense 지원이 없습니다.

알려진 버그

다음 문제는 현재 알려져 있으며 기능에 영향을 미칠 수 있습니다.

  • UDF의 테이블 형식 모델 개체(예: 측정값, 테이블, 열)에 대한 참조는 해당 개체의 이름을 바꿀 때 자동으로 업데이트되지 않습니다. UDF가 의존하는 개체의 이름을 바꾸면 함수 본문에 이전 이름이 계속 포함됩니다. UDF 식을 수동으로 편집하여 이름이 바뀐 개체에 대한 모든 참조를 업데이트해야 합니다.
  • UDF와 관련된 특정 고급 시나리오는 파서 불일치를 초래할 수 있습니다. 예를 들어 열을 매개 변수로 expr 전달하거나 정규화되지 않은 열 참조를 사용하는 경우 사용자에게 빨간색 밑줄 또는 유효성 검사 오류가 표시될 수 있습니다.