ฟังก์ชันที่ผู้ใช้กําหนดเองของ DAX

ฟังก์ชันที่ผู้ใช้กําหนดเอง (UDF) นิพจน์การวิเคราะห์ข้อมูล (DAX) ช่วยให้คุณสามารถจัดแพคเกจตรรกะ DAX ที่มีพารามิเตอร์และนํากลับมาใช้ใหม่ได้ในแบบจําลองของคุณ แทนที่จะทําซ้ําสูตรในหน่วยวัด คอลัมน์จากการคํานวณ และวิชวล UDF จะนําความยืดหยุ่นของรูปแบบการเขียนโปรแกรมมาสู่แบบจําลองความหมายของคุณ ซึ่งช่วยให้คุณสามารถกําหนดฟังก์ชันเพียงครั้งเดียวและใช้ได้ทุกที่ที่รองรับ DAX

โดยทั่วไปแล้ว DAX UDF จะพร้อมใช้งานใน Power BI Desktop และบริการของ Power BI โดยเริ่มจากรุ่นเดือนมิถุนายน 2026 เมื่อต้องการเรียนรู้เพิ่มเติม โปรดดู ฟังก์ชันที่ผู้ใช้กําหนดเองของ DAX

เหตุใดจึงต้องใช้ฟังก์ชันที่ผู้ใช้กําหนด

  • การนํากลับมาใช้ใหม่และความสม่ําเสมอ: กําหนดการคํานวณเพียงครั้งเดียวและนํากลับมาใช้ใหม่ได้ทุกที่
  • ความสามารถในการบํารุงรักษา: อัปเดตตรรกะในที่เดียวเพื่อแก้ไขหรือพัฒนากฎ
  • การเขียนที่ปลอดภัยยิ่งขึ้น: คําแนะนําประเภทเสริมและตัวช่วยตรวจสอบประเภทรองรับโค้ดที่คาดเดาได้และทนต่อข้อผิดพลาด
  • ออบเจ็กต์โมเดลระดับเฟิร์สคลาส: UDF อยู่ในโมเดลและสามารถดูได้ใน Model Explorer

กําหนดฟังก์ชัน

คุณสามารถกําหนดฟังก์ชันที่ผู้ใช้กําหนดเองใน Power BI Desktop โดยใช้มุมมองคิวรี DAX (DQV) หรือมุมมอง TMDL

ไวยากรณ์ทั่วไป

ไวยากรณ์ทั่วไปสําหรับ UDF คือ:

/// Optional description above the function
/// @param {ParameterType} ParameterName - ParameterDescription
/// ...
/// @returns Return description
FUNCTION <FunctionName> = ( [<ParameterName> [: [<ParameterType>] [<ParameterSubtype>] [<ParameterPassingMode>]] [= <DefaultExpression>], ...] ) => <FunctionBody>

ตัวอย่าง: ฟังก์ชันภาษีอย่างง่าย

นี่คือตัวอย่างง่ายๆ ใน DQV ที่เพิ่มภาษีในจํานวนเงินที่กําหนด คุณยังสามารถประเมิน UDF ใน DQV ได้อีกด้วย

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

EVALUATE
{ AddTax ( 10 ) }
// Returns 11

หลังจากกําหนด UDF แล้ว คุณสามารถอัปเดตโมเดลหรือใช้เลนส์โค้ดเพื่อเพิ่มฟังก์ชันให้กับโมเดลของคุณได้

สกรีนช็อตของมุมมองคิวรี DAX ใน Power BI Desktop โดยเน้นตําแหน่งสองตําแหน่งที่คุณสามารถบันทึกฟังก์ชันที่ผู้ใช้กําหนดเองได้ ปุ่มแรกคือปุ่มอัปเดตแบบจําลองที่มีการเปลี่ยนแปลงที่ด้านบนของมุมมอง ประการที่สองคือบรรทัดสถานะในตัวแก้ไขโค้ดที่มีป้ายกํากับว่า Update model: Add new function.

ตัวอย่างเดียวกันนี้สามารถสร้างขึ้นในมุมมอง TMDL

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

หลังจากกําหนด UDF แล้ว คุณสามารถใช้การเปลี่ยนแปลงเพื่อเพิ่มฟังก์ชันให้กับโมเดลของคุณได้

สกรีนช็อตของมุมมอง TMDL ใน Power BI Desktop โดยไฮไลต์ปุ่ม Apply ที่ด้านบนของมุมมอง ปุ่มนี้เป็นตําแหน่งที่คุณสามารถบันทึกฟังก์ชันที่ผู้ใช้กําหนดได้

จัดการฟังก์ชันที่ผู้ใช้กําหนดเอง

เมื่อกําหนดและเพิ่มลงในโมเดลแล้ว คุณสามารถดูและจัดการฟังก์ชันที่ผู้ใช้กําหนดทั้งหมดได้จาก Model explorer ภายใต้โหนด ฟังก์ชัน

สกรีนช็อตของแผง Model Explorer ใน Power BI Desktop ที่แสดงโหนดฟังก์ชันที่ขยาย ฟังก์ชันที่ผู้ใช้กําหนดเองสามฟังก์ชันจะแสดงรายการ: AddTax, AverageOrderValue และ CustomerLifetimeValue.

ใน มุมมองคิวรี DAX (DQV) คุณสามารถใช้ คิวรีด่วน ผ่านตัวสํารวจแบบจําลองเพื่อกําหนดและประเมินฟังก์ชันได้อย่างง่ายดาย

สกรีนช็อตของบานหน้าต่าง Model Explorer ใน Power BI Desktop จะแสดงโหนด ฟังก์ชัน ที่ขยาย เมนูบริบทสองเมนูเปิดอยู่: เมนูแรกมี คิวรีด่วน เปลี่ยนชื่อ ลบออกจากแบบจําลอง ซ่อนในมุมมองรายงาน เลิกซ่อนทั้งหมด ยุบทั้งหมด และ ขยายทั้งหมด คิวรีด่วนจะถูกเน้นและเลือก เมนูที่สองถูกเน้นและมีตัวเลือกการสืบค้นด่วน ประเมิน กําหนดและประเมิน กําหนดฟังก์ชันใหม่ และกําหนดฟังก์ชันทั้งหมดในโมเดลนี้

ใน มุมมอง TMDL คุณสามารถ ลากและวาง ฟังก์ชันลงในพื้นที่ทํางาน หรือใช้ สคริปต์ TMDL เพื่อ ผ่านตัวสํารวจแบบจําลอง

สกรีนช็อตของบานหน้าต่าง Model Explorer ใน Power BI Desktop จะแสดงโหนด ฟังก์ชัน ที่ขยาย เมนูบริบทสองเมนูเปิดอยู่: เมนูแรกให้ Script TMDL to, เปลี่ยนชื่อ, ลบออกจากแบบจําลอง, ซ่อนในมุมมองรายงาน, เลิกซ่อนทั้งหมด, ยุบทั้งหมด และ ขยายทั้งหมด สคริปต์เป็น TMDL ถูกไฮไลต์และเลือก เมนูที่สองถูกเน้นและเสนอตัวเลือกสคริปต์เป็น TMDL แท็บสคริปต์และคลิปบอร์ด

หากใช้ Power BI Project ฟังก์ชันจะถูกเก็บไว้ใน functions.tmdl ภายในโฟลเดอร์ definition

ภาพหน้าจอ Visual Studio Code ของโครงการ Power BI Explorer เปิดไปยังโฟลเดอร์แบบจําลองความหมาย 'functions.tmdl' เปิดอยู่ในโปรแกรมแก้ไขโค้ด ฟังก์ชันสามฟังก์ชันจะปรากฏขึ้น: CustomerLifetimeValue, AverageOrderValue และ AddTax

ใช้ฟังก์ชันที่ผู้ใช้กําหนดเอง

หลังจากเพิ่ม UDF ลงในแบบจําลองแล้ว คุณสามารถใช้ได้ทุกที่ที่รองรับ DAX ที่นี่เราใช้ AddTax เป็นตัวอย่าง

ใช้ UDF ที่มีบริบทตัวกรองเต็มรูปแบบพร้อมหน่วยวัด

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

ใช้ UDF กับทุกแถวในตารางที่มีคอลัมน์จากการคํานวณ

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

ใช้ UDF โดยตรงในวิชวลด้วยการคํานวณด้วยภาพ

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

ซ้อน UDF สําหรับสถานการณ์ขั้นสูง

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 สนับสนุนพารามิเตอร์เป็นศูนย์หรือมากกว่า เพื่อให้ฟังก์ชันของคุณปลอดภัยและคาดเดาได้มากขึ้น คุณสามารถเลือกระบุคําแนะนําประเภทพารามิเตอร์ได้ดังนี้

  • ชนิด: ชนิดของค่าที่พารามิเตอร์ยอมรับ (AnyVal, Scalar, Table, AnyRef, CalendarRef, ColumnRefMeasureRef, หรือ TableRef)
  • ชนิดย่อย (สําหรับชนิดสเกลาร์เท่านั้น): ชนิดข้อมูลสเกลาเฉพาะ (Variant, , Int64, DecimalDouble, StringDateTimeBooleanหรือ )Numeric
  • ParameterMode: เมื่อมีการประเมินอาร์กิวเมนต์ (val สําหรับกระตือรือร้นหรือ expr ขี้เกียจ)

คําแนะนําประเภทเป็นไปตามแบบฟอร์ม: [type] [subtype] [parameterMode]

ตัวอย่าง: การแคสต์ประเภท

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

การตรวจสอบประเภท

ตรวจสอบความถูกต้องของชนิดพารามิเตอร์ภายในฟังก์ชันของคุณโดยใช้ฟังก์ชันการตรวจสอบชนิด DAX ที่มีอยู่แล้วภายใน เช่น:

สําหรับรายการทั้งหมดของฟังก์ชันการตรวจสอบชนิดที่พร้อมใช้งาน โปรดดู ฟังก์ชันที่ผู้ใช้กําหนดเอง DAX

สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการใช้ฟังก์ชันที่ผู้ใช้กําหนดเอง โปรดดูแหล่งข้อมูลต่อไปนี้: