DAX מקבל פונקציות
העדכון הגדול של החודש: לוגיקה עסקית נכתבת פעם אחת, מקבלת חתימה וטיפוסים, ונקראת מכל מקום. וגם — DAX Query View, עדכוני הדוח, ורשימת הבאגים הידועים עם דרכי העקיפה.
איך עובד השיעור
מודול העדכונים החודשי: מה חדש ב-Power BI, למה מיקרוסופט בנתה את זה, ואיך משתמשים בזה בפועל.
חמש דקות קריאה שנותנות את התמונה המלאה, לפני הירידה לעומק. גרסה 2.155.756.0.
- פונקציות מוגדרות משתמש ב-DAX בזמינות כללית. לוגיקה עסקית נכתבת פעם אחת כפונקציה עם חתימה, טיפוסים ופרמטרים אופציונליים, ונקראת ממדד, מעמודה מחושבת ומחישוב ויזואל. דורש רמת תאימות 1702.
- מערכת טיפוסים חדשה עם שני מצבי העברה. ההבחנה בין val ל-expr קובעת אילו הקשרים הפונקציה יורשת — וזו הנקודה הטכנית החשובה ביותר בעדכון.
- אזהרת ממשל: אבטחה ברמת אובייקט אינה עוברת לפונקציות. פונקציה שמפנה למדד מוגן אינה מוגנת אוטומטית.
- מיון וסינון ברשת התוצאות של DAX Query View. הרשת אינה ניתנת לעריכה, והסינון פועל רק על תוצאות שכבר הוחזרו — שעלולות להיות קטומות.
- עדכוני דוח שמוחקים תחזוקה ידנית: Date picker לסלייסר שמתגלגל קדימה עם הרענון, טולטיפ במצב משפט בלי מדד DAX, ורוחב עמודה מותנה.
- שינוי שמשפיע על דוחות קיימים: כלי הבחירה ב-Azure Maps דלוקים כעת כברירת מחדל.
- 11 באגים ומגבלות ידועים מתועדים בפרק V, עם דרך עקיפה לכל אחד.
ניווט בין נושאים
הכפתורים הקודם והבא קבועים בראש המסך. אפשר גם בחצי המקלדת, בהחלקת אצבע בטלפון, או לקפוץ לנושא מרשימת הנושאים.
שאלות ותרגול
בסוף השיעור בוחן קצר עם משוב מיידי לכל שאלה, ותרגילי יישום עם פתרון מלא.
ההתקדמות נשמרת
הנושא שבו עצרתם והנושאים שקראתם נשמרים בדפדפן שלכם בלבד. אפשר לסגור ולחזור, ולאפס מתוך רשימת הנושאים.
איך בנוי כל נושא
כל נושא נפתח בהסבר למה הפיצ'ר קיים — הכאב בשטח והחזון מאחוריו — וממשיך לפירוט הטכני עם קוד ודוגמאות. בסוף השיעור: נושא שלם של באגים ידועים עם דרכי עקיפה, בוחן קצר וסיכום.
מה מכסה השיעור
עדכון יוני 2026, גרסה 2.155.756.0.
פונקציות מוגדרות משתמש
היכולת הגדולה של החודש: DAX מקבל פונקציות עם חתימה, טיפוסים ופרמטרים אופציונליים.
DAX Query View
מיון וסינון ברשת התוצאות — ומלכודת אחת שחייבים להכיר.
עדכוני חוויית הדוח
Date picker לסלייסר, טולטיפ במצב משפט, רוחב עמודה מותנה והתאמה למובייל.
באגים ודרכי עקיפה
מה שבור כרגע, למה, ומה עושים עד שזה נסגר.
הכאב שהוליד את הפיצ'ר
לפני התחביר — הבעיה. בלי זה קשה להבין למה זו ההכרזה הגדולה של החודש.
במודל ארגוני בוגר יש מאות מדדים, ובתוכם אותה לוגיקה עסקית חוזרת שוב ושוב: הגדרת לקוח פעיל, שער המרה, כלל ההכרה בהכנסה, נוסחת עמלה. כשהכלל משתנה — וכללים עסקיים משתנים — מישהו צריך למצוא את כל המקומות שבהם הוא מקודד. בפועל הוא מוצא שמונים אחוז מהם. עשרים האחוזים הנותרים הופכים לדוחות שסותרים זה את זה, וזה בדיוק הרגע שבו ההנהלה מפסיקה לסמוך על ה-BI.
מה היה חסר
ל-DAX הייתה יחידת שיתוף אחת: מדד. אבל מדד אינו פונקציה — אי אפשר להעביר לו פרמטרים.
הפתרון המאולתר
קבוצות חישוב, שמעבירות פרמטרים דרך הקשר הסינון. עובד, אבל עקיף, קשה לניפוי, ויקר כשקוראים לאותה לוגיקה כמה פעמים בשאילתה.
החזון
המודל הסמנטי כמוצר תוכנה: פונקציה היא אובייקט מדרגה ראשונה, נשמרת כטקסט, נכנסת ל-Git ועוברת קוד-ריוויו.
מה השתנה בזמינות הכללית
הפיצ'ר יצא מתצוגה מקדימה — ואיתו נכנסו דרישות סף שחייבים להכיר.
| מה | פרטים |
|---|---|
| סטטוס | זמינות כללית ב-Power BI Desktop ובשירות החל מגרסת יוני 2026 |
| רמת תאימות | 1702 ומעלה. מודל שלא שודרג פשוט לא ישמור את הפונקציה |
| איפה כותבים | DAX Query View, TMDL View, ובפורמולה בר של Model Explorer |
| איפה זה חי | צומת Functions ב-Model Explorer, ובפרויקט PBIP בקובץ functions.tmdl |
| כמה פרמטרים | מאפס עד 256 |
הפונקציה הראשונה
שלוש שורות, ואתם כבר מבינים את כל המבנה.
/// מוסיף מע"מ לסכום שהתקבל
FUNCTION AddVat =
( amount : NUMERIC ) =>
amount * 1.18
EVALUATE
{ AddVat ( 100 ) }
// מחזיר 118
מילת המפתח FUNCTION · שם · רשימת פרמטרים · חץ · גוף הפונקציה
- כותבים ב-DAX Query Viewמתחת ל-DEFINE, בדיוק כמו שמגדירים מדד בשאילתה.
- מריצים ובודקיםבלוק EVALUATE עם קריאה לפונקציה מחזיר את התוצאה מיד.
- שומרים למודלכפתור Update model with changes שומר את כל הפונקציות בשאילתה, או השורה Update model: Add new function מעל הגדרה בודדת.
תיעוד וכללי שמות
פונקציה שאיש לא מבין איך לקרוא לה היא פונקציה שאיש לא ישתמש בה.
/// מחשב אחוז רווחיות בצורה בטוחה מחלוקה באפס
/// @param {NUMERIC} revenue - סכום ההכנסה
/// @param {NUMERIC} [cost] - עלות, ברירת מחדל 0
/// @returns אחוז רווחיות כמספר עשרוני
FUNCTION Fin.MarginPct =
( revenue : NUMERIC, cost : NUMERIC = 0 ) =>
DIVIDE ( revenue - cost, revenue )
EVALUATE
{ Fin.MarginPct ( 1000, 400 ) } // 0.6
| כלל | מה מותר ומה אסור |
|---|---|
| ייחודיות | שם ייחודי במודל, שאינו מתנגש בפונקציה מובנית או במילה שמורה כמו measure או function |
| נקודות | מותרות למרחבי שמות כמו Fin.MarginPct — אך לא בהתחלה, לא בסוף ולא ברצף |
| תווים | מלבד נקודות: תווים אלפאנומריים וקו תחתון בלבד. בלי רווחים |
| שמות פרמטרים | נקודות אסורות לגמרי, ואסור להשתמש במילה שמורה |
איפה קוראים לפונקציה
אחרי השמירה למודל, הפונקציה מתנהגת כמו כל פונקציית DAX מובנית.
Total Sales with VAT = AddVat ( [Total Sales] )
-- עמודה מחושבת (שימו לב להמרת הטיפוס)
Sales Amount with VAT =
CONVERT ( AddVat ( Sales[Sales Amount] ), CURRENCY )
-- חישוב ויזואל
Sales Amount with VAT = AddVat ( [Sales Amount] )
DEFINE
FUNCTION AddVat = ( amount : NUMERIC ) => amount * 1.18
FUNCTION AddVatAfterDiscount =
( amount : NUMERIC, discount : NUMERIC ) =>
AddVat ( amount - discount )
EVALUATE
{ AddVatAfterDiscount ( 100, 20 ) } // 94.4
למה DAX צריך טיפוסים
השינוי התפיסתי של העדכון: מזיזים את הכישלון מהדוח לזמן הכתיבה.
ב-DAX קלאסי, מדד שמקבל קלט לא צפוי מחזיר תוצאה שגויה בשקט. במודל של איש אחד זה נסבל. בספריית פונקציות שצוות שלם צורך, קלט לא צפוי הוא באג שמתגלה בדוח הנהלה.
IntelliSense אמין
מי שקורא לפונקציה רואה מה היא מצפה לקבל, לפני שהוא מריץ.
מניעת טעות סוג
אי אפשר להעביר עמודה במקום מדד כשהחתימה דורשת מדד.
המרה מבוקרת
תת-טיפוס כופה המרה צפויה, במקום המרה מקרית של המנוע.
( <Param> : [<Type>] [<Subtype>] [<PassingMode>] [= <Default>], ... )
=> <Body>
הטיפוסים ושתי המשפחות
ההבחנה שקובעת את כל ההתנהגות: ערך מול ביטוי.
| משפחה | טיפוס | מה מקבל | מתי מוערך |
|---|---|---|---|
| טיפוסי ערך | AnyVal | סקלר או טבלה. ברירת המחדל | מיד, לפני הכניסה לפונקציה |
| טיפוסי ערך | Scalar | ערך סקלרי, עם תת-טיפוס אופציונלי | מיד |
| טיפוסי ערך | Table | טבלה | מיד |
| טיפוסי ביטוי | AnyRef | כל הפניה או ביטוי | בתוך גוף הפונקציה |
| טיפוסי ביטוי | ColumnRef | הפניה לעמודה | בתוך גוף הפונקציה |
| טיפוסי ביטוי | MeasureRef | הפניה למדד | בתוך גוף הפונקציה |
| טיפוסי ביטוי | TableRef | הפניה לטבלה | בתוך גוף הפונקציה |
| טיפוסי ביטוי | CalendarRef | הפניה ללוח שנה | בתוך גוף הפונקציה |
תת-טיפוסים לסקלר
FUNCTION CastToInt = ( x : INT64 ) => x
EVALUATE
{ CastToInt ( 3.4 ), CastToInt ( 3.5 ), CastToInt ( "5" ) }
// 3, 4, 5 — מחרוזת לא מספרית תיצור שגיאה
ציון תת-טיפוס מייתר את המילה Scalar — וכופה המרה צפויה
val מול expr
שתי פונקציות עם גוף זהה לחלוטין, ושתי תוצאות שונות. זה הנושא החשוב ביותר בשיעור.
/// טבלה כערך: מקבלת טבלה שכבר חושבה
FUNCTION CountRowsNow = ( t : TABLE VAL ) =>
COUNTROWS ( CALCULATETABLE ( t, ALL ( 'Date' ) ) )
/// טבלה כביטוי: מקבלת ביטוי לא מחושב
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" )
}
| הפונקציה | מה היא מחזירה | למה |
|---|---|---|
| CountRowsNow | רק את שורות FY2020 | הטבלה כבר סוננה לפני הכניסה לפונקציה, ולכן ה-ALL שבפנים כבר לא משנה דבר |
| CountRowsLater | את כל השנים | הפונקציה קיבלה ביטוי לא מחושב והעריכה אותו בעצמה תחת ALL, כלומר הסירה את הסינון החיצוני |
פרמטרים אופציונליים
ברירת מחדל בחתימה הופכת את הפרמטר לאופציונלי — עם ארבעה כללים שחייבים להכיר.
FUNCTION AddNum = ( x : NUMERIC = 1, y : NUMERIC = 2 ) => x + y
EVALUATE
{ AddNum (), AddNum ( 1 ), AddNum ( , 2 ), AddNum ( 5, 5 ) }
// 3, 3, 3, 10
פסיק ריק מדלג על ארגומנט ומשתמש בברירת המחדל
| הכלל | מה זה אומר |
|---|---|
| מיקום | פרמטר אופציונלי יכול להופיע בכל מקום. אבל מספר הארגומנטים המינימלי נקבע לפי הפרמטר הנדרש הימני ביותר — בפונקציה עם שלושה פרמטרים שרק השני אופציונלי, עדיין חייבים למסור שלושה |
| הקשר | ירושת הקשר שורה והקשר סינון נקבעת לפי מצב ההעברה של אותו פרמטר |
| תחום ראייה | ביטוי ברירת המחדל רואה רק שמות שגלויים במקום ההגדרה, לא במקום הקריאה. הוא גם אינו יכול להפנות לפרמטר אופציונלי אחר |
| בדיקת טיפוס | רמז הטיפוס נאכף על ברירת המחדל רק כשמשתמשים בה בפועל. אם הקורא סיפק ארגומנט, הבדיקה מתבצעת מולו |
בדיקת טיפוס בזמן ריצה
כשהפונקציה צריכה לקבל יותר מסוג קלט אחד — בודקים בגוף הפונקציה.
/// מחזיר שם מטבע לפי מפתח מספרי או לפי קוד טקסטואלי
FUNCTION Dim.GetCurrencyName = ( currency ) =>
IF (
ISINT64 ( currency ),
LOOKUPVALUE ( 'Currency'[Currency], 'Currency'[CurrencyKey], currency ),
LOOKUPVALUE ( 'Currency'[Currency], 'Currency'[Code], currency )
)
EVALUATE
{ Dim.GetCurrencyName ( 36 ), Dim.GetCurrencyName ( "USD" ) }
TABLEOF ו-NAMEOF
שתי פונקציות עזר חדשות שמאפשרות לכתוב פונקציות גנריות באמת.
| פונקציה | מה מחזירה |
|---|---|
| TABLEOF | את הטבלה שאליה שייכת עמודה, מדד או לוח שנה |
| NAMEOF | את השם של טבלה, עמודה, מדד או לוח שנה — כטקסט |
/// מחזיר את הערך השכיח ביותר של ביטוי מעל הטבלה שאליה הוא שייך
FUNCTION Stat.ModeX = ( e : ANYREF ) =>
VAR newTable = ADDCOLUMNS ( TABLEOF ( e ), "expr", e )
VAR freqTable = GROUPBY ( newTable, [expr], "count", SUMX ( CURRENTGROUP (), 1 ) )
VAR maxCount = MAXX ( freqTable, [count] )
RETURN
SELECTCOLUMNS ( FILTER ( freqTable, [count] = maxCount ), "expr", [expr] )
EVALUATE Stat.ModeX ( [Total Sales] )
הפונקציה לא מקודדת שם טבלה קשיח — TABLEOF מוצאת אותה מהביטוי שהתקבל
מגבלות וסיכוני ממשל
מה שחייבים לבדוק לפני שפונקציה נכנסת למודל ארגוני.
| מגבלה | ההשלכה המעשית |
|---|---|
| שמות לא מוסמכים | שם ללא קידומת טבלה מפורש כהפניה למדד, ולכן לא נכלל במעקב תלויות. תמיד 'Sales'[Amount] ולעולם לא [Amount] |
| אין רקורסיה | לא במישרין ולא הדדית |
| אין העמסה | אי אפשר לשתי פונקציות לחלוק שם עם חתימות שונות |
| אין טיפוס החזרה מפורש | צריך להבטיח עקביות בגוף הפונקציה עצמה |
| אין תיקיות תצוגה | וגם אי אפשר להסתיר או לחשוף פונקציה |
| אין שילוב עם תרגומים | מודל מתורגם — הפונקציות נשארות בחוץ |
| אין החזרת enum | פונקציה מובנית שמצפה ל-enum לא תקבל UDF |
EVALUATE INFO.USERDEFINEDFUNCTIONS () // מטא-דאטה מלאה, דורש הרשאת כתיבה
EVALUATE INFO.FUNCTIONS ( "ORIGIN", "2" ) // שמות בלבד, בלי הרשאת כתיבה
UDF או קבוצת חישוב
שתי יכולות שנראות דומות ופותרות בעיות שונות לגמרי.
| מתי | הכלי | למה |
|---|---|---|
| לוגיקה עסקית עם פרמטרים משתנים | UDF | העברת פרמטרים דרך חתימה מפורשת חוסכת את התקורה של העברתם דרך הקשר הסינון, במיוחד כשקוראים לאותה לוגיקה כמה פעמים בשאילתה אחת |
| וריאציות תצוגה על כל המדדים | קבוצת חישוב | שנה קודמת, מצטבר מתחילת שנה, אחוז מסך הכול — משהו שצריך לחול על מאה מדדים בלי לכתוב אותם מחדש |
| שילוב | שתיהן | קבוצת חישוב שקוראת בתוכה לפונקציה משותפת — זה הדפוס שמומלץ במודלים גדולים |
באגים ידועים ודרכי עקיפה
מה שבור כרגע לפי סעיפי הבאגים בתיעוד הרשמי ודיווחי קהילה — ומה עושים עד שזה נסגר.
| התופעה | הסיבה | דרך העקיפה |
|---|---|---|
| קווים אדומים ושגיאות ולידציה כשמעבירים עמודה כפרמטר expr | חוסר עקביות ידוע של המנתח בתרחישים מתקדמים | להריץ ולבדוק את התוצאה בפועל; לכתוב הפניות מוסמכות מלאות; לפצל לפונקציית עזר פשוטה יותר |
| רמז טיפוס ColumnRef או MeasureRef נדחה באתר הקריאה | באג ידוע: טיפוסי ההפניה הספציפיים אינם מתקבלים בכל אתרי הקריאה | לרדת ל-AnyRef ולבצע ולידציה בגוף הפונקציה |
| הודעת שגיאה מותאמת עם ERROR לא מוצגת | DAX מייצר שגיאה פנימית משימוש שגוי בפרמטר לפני שקוד הוולידציה רץ | לא להסתמך על הודעות מותאמות בשלב זה; לתעד את הדרישה ב-/// |
| שינוי שם עמודה שובר פונקציה | שם לא מוסמך מפורש כהפניה למדד ולכן אינו נכלל במעקב תלויות | תמיד להשתמש בשם טבלה מלא בתוך פונקציה |
| הפונקציה מסרבת להישמר | רמת תאימות נמוכה מ-1702, או מודל בלי טבלאות | לשדרג רמת תאימות; ב-TMDL View מוצג פרומפט אוטומטי |
| אין IntelliSense בחישוב ויזואל, ב-TMDL או ב-SSMS | תמיכה חלקית בשלב זה | לכתוב ולבדוק ב-DAX Query View ואז להעתיק |
| מדד בדוח עם live connect אינו רואה פונקציה של מודל המקור | מדד ברמת דוח יכול להפנות אך בלי IntelliSense; מדד ברמת מודל במודל מורכב אינו יכול כלל | להגדיר את הלוגיקה במודל המקור גם כמדד ולא רק כפונקציה |
| עמודה מחושבת מחזירה טיפוס לא עקבי | פונקציה שמחזירה טיפוסים שונים לפי הענף שנבחר | לעטוף ב-CONVERT או לפצל לשתי פונקציות עם טיפוס אחיד |
| שאילתות DAX שמורות לא נכנסו ל-Git | הקמת אינטגרציית Git ראשונית מסביבת העבודה אינה כוללת אותן | לשמור שאילתות קריטיות כקובצי טקסט במאגר במקביל |
| מפות התחילו להתנהג אחרת בדוח ותיק | כלי הבחירה ב-Azure Maps דלוקים כעת כברירת מחדל, גם בדוחות קיימים | לכבות את מתג Selection בקטע Controls |
| Date picker לא מופיע אצל עמית בצוות | פיצ'ר בתצוגה מקדימה שמופעל לכל מכשיר בנפרד | לוודא שכולם הפעילו את התצוגה המקדימה, ולא להסתמך עליו בדוח פרודקשן |
מיון וסינון ברשת התוצאות
שיפור קטן בממשק שחוסך סבבי הרצה — עם מלכודת אחת גדולה.
למה מיקרוסופט הכניסה את זה
ניפוי שגיאות ב-DAX הוא לולאה: מריצים, מסתכלים, משנים, מריצים שוב. עד היום כל שאלה קטנה על התוצאה — מה הערך הגבוה ביותר, האם יש שורות שליליות — חייבה לשכתב את השאילתה ולהריץ מחדש. כל סבב עולה זמן וגם משאבי קיבולת.
מה נוסף בפועל
כל כותרת עמודה מציגה אייקון מיון להחלפה בין סדר עולה ליורד בלחיצה. תפריט שלוש הנקודות מוסיף ניקוי המיון, חיפוש ערכים, וסינון לפי בחירת ערכים.
| המגבלה | הערך | מה זה אומר בפועל |
|---|---|---|
| נפח לשאילתה | 15MB | בחריגה השורה הנוכחית מסתיימת ולא נכתבות שורות נוספות |
| ערכים לשאילתה | 1,000,000 | ב-20 עמודות מקבלים לכל היותר 50,000 שורות |
| שורות בדפדפן | 99,999 | ונדרשת הרשאת כתיבה על המודל הסמנטי |
| פורמט תצוגה | לא מוצג | מטבע ומפרידי אלפים לא יופיעו ברשת |
EVALUATE
FILTER (
SUMMARIZECOLUMNS (
'Product'[Category],
'Date'[Month of Year],
"Sales", [Total Sales]
),
[Sales] > 100000
)
ORDER BY [Sales] DESC
עדכוני חוויית הדוח
הקו המשותף: מחיקת עבודה ידנית חוזרת.
למה מיקרוסופט הכניסה את זה
כמעט כל שינוי כאן מוחק תחזוקה: סלייסר תאריכים שצריך לעדכן כל חודש, מדד טקסט שנכתב רק כדי שטולטיפ יהיה קריא, כוונון ידני של טווחי צירים כדי שבועה לא תיחתך. במקביל, הפעלת כלי הבחירה במפות כברירת מחדל מלמדת עיקרון שני: פיצ'ר שקיים אך מוסתר מאחורי מתג כבוי הוא פיצ'ר שלא קיים.
Date picker לסלייסר
בחירה יחסית שמתגלגלת קדימה עם כל רענון. מעוגנת להיום, לתאריך הראשון או לתאריך האחרון בנתונים — וזה מה שמונע דוח שנשבר כשה-ETL מתעכב. בתצוגה מקדימה.
פתיחה אוטומטית במטריצה
מוגדרת בנפרד לשורות ולעמודות. הערך הגדול הוא ב-Personalize this visual: שדה שהקורא מוסיף נפתח מיד.
טולטיפ במצב משפט
משפט חופשי שמפנה לשדות הטולטיפ — בלי מדד DAX ייעודי. חוסך מדדי טקסט מיותרים במודל.
רוחב עמודה מותנה
מפעילים Custom widths ולוחצים fx. הדפוס המעניין: קשירת הרוחב לפרמטר What-If עם סליידר.
Azure Maps
כלי הבחירה דלוקים כברירת מחדל — עיגול, מלבן, פוליגון, זמן נסיעה ומרחק. סגירת פוליגון במקש C.
Shape map
בזמינות כללית, עם העלאת TopoJSON ו-GeoJSON והורדה חוזרת של מפה שהעליתם.
התאמת הדוח למובייל
פריסת מובייל היא לא הקטנה של הדסקטופ — היא דוח אחר.
- בונים את שתי הפריסות יחדשכפול עמוד משכפל את שתי הפריסות, כך שעמוד עם כותרת וניווט משמש תבנית לשאר העמודים.
- בוחרים רק את מה שחשובגודל מינימלי מומלץ: רוחב 323 נקודות לוויזואל גדול, 158 לקטן. גופן לא קטן מתשע נקודות.
- מנקים רעשמסירים כותרות ציר, קווי רשת ומקרא; מסדרים ניווט וסלייסרים אופקית; מצמצמים רווח לבן.
- בודקים אינטראקציהטולטיפים מושבתים בקנבס העריכה אך פועלים באפליקציה. בחירות בסלייסר בקנבס אינן עוברות לפריסת הרשת.
| העדכון החדש | מה הוא נותן במסך קטן |
|---|---|
| Date picker | בחירה יחסית חוסכת הקלדה, ועדיפה על שני סלייסרים נפרדים לטווח |
| רוחב עמודה מותנה | אותה טבלה בשני רוחבים שונים לדסקטופ ולמובייל, בלי לשכפל ויזואל |
| טולטיפ במצב משפט | משפט אחד קריא במקום רשימת שדות שנחתכת במסך צר |
בוחן — 12 שאלות
שאלה אחת בכל פעם. תשובה נכונה נצבעת בירוק, שגויה באדום, והתשובה הנכונה תמיד נחשפת יחד עם הסבר טכני מלא.
פרמטר במצב expr יורש איזה הקשר?
מה קורה כשפונקציה מפנה למדד שמוגן באבטחה ברמת אובייקט?
למה אסור להסתמך על סינון ברשת התוצאות של DAX Query View כדי לאמת נתונים?
רמז הטיפוס MeasureRef נדחה באתר הקריאה. מה הפתרון?
מהי רמת התאימות המינימלית הנדרשת לפונקציות מוגדרות משתמש?
בפונקציה עם שלושה פרמטרים שרק השני אופציונלי — כמה ארגומנטים חייב הקורא למסור?
מה מייחד הערה שמתחילה בשלושה לוכסנים?
מה יקרה אם תשתמשו בתוך פונקציה בהפניה לא מוסמכת בסגנון [Amount] כשהכוונה לעמודה?
איפה מוצגת פריסת המובייל שבניתם לדוח?
מתי בוחרים UDF ולא קבוצת חישוב?
פונקציה שמוגדרת עם ( t : TABLE ) ונקראת בתוך CALCULATE עם סינון שנה — מה היא תחזיר?
טרם ענית על שאלות — 0 מתוך 12
סיכום ומה הלאה
עשר שורות שמסכמות את כל השיעור.
| נושא | מה לזכור |
|---|---|
| הרציונל | לוגיקה עסקית הופכת לספרייה מנוהלת בקוד, לא להעתק-הדבק בין מדדים |
| הגדרה | FUNCTION Name = ( p : TYPE SUBTYPE MODE = default ) => body עם תיעוד ב-/// |
| val מול expr | val אצל הקורא ויורש שורה וסינון; expr בפנים ויורש סינון בלבד |
| טיפוסי הפניה | ColumnRef, MeasureRef, TableRef, CalendarRef — תמיד expr, בלי המרת טיפוס |
| אופציונליים | הארגומנט המינימלי נקבע לפי הפרמטר הנדרש הימני ביותר |
| סיכון עיקרי | OLS אינו עובר לפונקציות |
| כלל זהב | תמיד שמות מוסמכים מלאים בתוך פונקציה |
| DAX Query View | מיון וסינון בלבד, ורק על תוצאות שהוחזרו |
| מובייל | בונים פריסת מובייל יחד עם הדסקטופ, לא אחריה |
| מקור אמת | functions.tmdl בפרויקט PBIP, בסביבת עבודה מחוברת ל-Git |
אפשר לנווט גם בכפתורים שבראש המסך, בחצי המקלדת, ובטלפון בהחלקת אצבע