کنترل انتخابهای خالی یا چندگانه در Calculation Group ها در Power BI
فهرست مطالب
گروههای محاسباتی (Calculation Groups) در Power BI ابزاری کاربردی برای ایجاد گزینههایی در گزارش هستند که کاربران با انتخاب آنها از طریق slicer میتوانند نحوهی محاسبهی یک Measure را تغییر دهند. اما یک محدودیت مهم وجود دارد: در هر لحظه فقط یک آیتم از گروه محاسباتی میتواند بر یک Measure اعمال شود.
به همین دلیل، زمانی که کاربر دو یا چند آیتم را از یک Calculation Group انتخاب میکند، ممکن است مدل معنایی (Semantic Model) عملکردی غیرمنتظره داشته باشد یا حتی خروجی اشتباهی ارائه دهد.
ویژگیهای جدید: کنترل دقیقتر انتخابها
مایکروسافت برای حل این چالش دو ویژگی جدید به Calculation Group اضافه کرده است:
multipleOrEmptySelectionExpression
noSelectionExpression
این ویژگیها امکان کنترل شرایطی را فراهم میکنند که قبلاً نادیده گرفته میشدند، یعنی وقتی انتخاب خالی یا چندگانهای در Slicer انجام میشد، محاسبه بهطور پیشفرض بدون تغییر اجرا میشد. اما با این ویژگیهای جدید میتوان مقدار پیشفرض یا پیام هشدار مشخص کرد.
نکته: این ویژگیها در حال حاضر فقط از طریق نمای TMDL در Power BI Desktop یا ابزارهای خارجی مانند Tabular Editor قابل تعریف هستند و هنوز رابط گرافیکی مستقیمی در Power BI ندارند.
معرفی انتخابهای چندگانه در Calculation Group
گروههای محاسباتی به کاربران این امکان را میدهند تا نسخههای مختلفی از یک Measure را بر اساس آیتم انتخابی مشاهده کنند. مثلاً در یک Slicer کاربر میتواند بازهی زمانی (مثلاً ماهها) یا واحد مقیاس (مثلاً مقدار اصلی، هزارگان (K) یا میلیون (M)) را انتخاب کند.
اگرچه این آیتمها ممکن است به صورت چندگانه در Slicer انتخاب شوند، اما در سطح سلولهای بصری در Power BI فقط یکی از آیتمها اعمال میشود، بنابراین در اغلب موارد مشکلی ایجاد نمیشود.
مثال: فرض کنید Slicer متریک (Metric) سه گزینه دارد:
Original (مقدار اصلی)
K (تقسیم بر ۱,۰۰۰)
M (تقسیم بر ۱,۰۰۰,۰۰۰)
رفتار Calculation Group هنگام انتخاب چند آیتم یا هیچ آیتمی
اما سؤال مهم اینجاست:
چه اتفاقی میافتد اگر دو آیتم از یک Calculation Group بهصورت همزمان انتخاب شوند و مقدار حاصل در یک سلول نمایش داده شود؟
یا اگر هیچ آیتمی در Slicer انتخاب نشود چه خواهد شد؟
از منظر محاسبهی Measure، چون چند آیتم محاسباتی بهطور همزمان فعال شدهاند، یا هیچ آیتمی انتخاب نشده است، هیچکدام از کدهای موجود در Calculation Group اجرا نمیشوند. این یعنی عملکرد گروه محاسباتی کاملاً نادیده گرفته میشود.
مثالی برای درک بهتر
فرض کنید ستون مربوط به گروه محاسباتی (مثلاً ستون Metric) در ویژوال نمایش داده نمیشود. در این شرایط:
اگر فقط یک آیتم در slicer انتخاب شود، آن آیتم بر تمامی Measures موجود در ویژوال اعمال میشود.
اما اگر چند آیتم انتخاب شوند یا هیچکدام انتخاب نشوند، هیچ تغییری اعمال نمیشود و Measures به شکل اولیه خود بدون اعمال هیچ فرمولی نمایش داده میشوند.
Measure Margin %
مقدار اولیه و بدون تغییر خود را نمایش میدهد،
زیرا آیتم فعالشده در گروه محاسباتی روی Measureهایی که نام آنها شامل “٪” باشد هیچ اثری ندارد.
-- Item
K =
IF (
NOT CONTAINSSTRING ( SELECTEDMEASURENAME(), "%" ),
SELECTEDMEASURE() / 1000,
SELECTEDMEASURE()
)
-- Format String
IF (
NOT CONTAINSSTRING ( SELECTEDMEASURENAME(), "%" ),
"#,0.00k",
SELECTEDMEASUREFORMATSTRING()
)
رفتار Power BI هنگام انتخاب چند آیتم از Calculation Group
هنگامی که چندین آیتم از یک Calculation Group در یک Slicer انتخاب شوند، هیچکدام از آنها بر Measureهای نمایش دادهشده در ویژوال اعمال نمیشوند.
به عبارت دیگر:
اگر در یک سلول از ویژوال بیش از یک Calculation Item فعال باشد،
تمام آنها نادیده گرفته میشوند
و Measure مربوطه بدون هیچگونه تغییر یا تبدیل محاسبه و نمایش داده میشود.
چرا این اتفاق میافتد؟
گروههای محاسباتی در Power BI برای اجرای تنها یک آیتم محاسباتی در هر بار محاسبه طراحی شدهاند. بنابراین، در صورت فعال بودن چند آیتم بهطور همزمان:
موتور محاسبه نمیتواند تصمیم بگیرد کدام آیتم را اعمال کند.
هیچ کدی از Calculation Group اجرا نمیشود.
Measure به حالت اصلی (Original) بدون Transformation برمیگردد.
رفتار مشابه در صورت عدم انتخاب هیچ آیتمی در Calculation Group
رفتاری که در حالت انتخاب چندگانه از یک Calculation Group مشاهده میشود،
در زمان عدم انتخاب هیچ آیتمی نیز اتفاق میافتد.
بهعبارت دیگر:
وقتی هیچ Calculation Item از طریق Slicer انتخاب نشده باشد،
Measureهای گزارش بهصورت اولیه (Original) و بدون اعمال هیچ Transformation اجرا میشوند.
کنترل انتخابهای نامعتبر در Calculation Group
ممکن است این رفتار پیشفرض Power BI برایتان مطلوب نباشد—بهخصوص زمانی که کاربر چند آیتم را بهصورت همزمان انتخاب میکند.
شما ممکن است بخواهید:
کاربر را مجبور به انتخاب تنها یک آیتم معتبر کنید؛ یا
حداقل، هنگام انتخاب ترکیب نامعتبر، هشداری به کاربر نشان دهید یا خروجی را کنترل کنید.
در هر صورت، نیاز دارید تا هنگام محاسبهی Measure، فرآیند ارزیابی را در این حالتها رهگیری (Intercept) کرده و خروجی را بهصورت مدیریتشده نمایش دهید.
رهگیری انتخابهای چندگانه در Calculation Group
در مدل معنایی Power BI، شیء Calculation Group دارای دو ویژگی مهم برای مدیریت این حالات است:
multipleOrEmptySelectionExpression
noSelectionExpression
از می ۲۰۲۵، این ویژگیها هنوز در حالت Preview قرار دارند.
بنابراین در حال حاضر:
Power BI Desktop فقط از طریق نمای TMDL از این ویژگیها پشتیبانی میکند؛
اما میتوانید آنها را با ابزارهای خارجی مانند Tabular Editor نیز ویرایش و پیادهسازی کنید.
پیادهسازی هشدار برای انتخابهای چندگانه
در این مثال، ما یک عبارت DAX سفارشی پیادهسازی میکنیم که در صورت انتخاب بیش از یک آیتم در Slicer مربوط به Metric اجرا شود.
در اولین نسخه از این پیادهسازی:
هیچ مقدار معتبری در ویژوال نمایش داده نمیشود؛
و یک پیام خطای سفارشی مانند:
“Multiple selection of Metric is not allowed”
بهنمایش درمیآید.
این منطق DAX به ویژگی multipleOrEmptySelectionExpression
نسبت داده میشود و زمانی اجرا میگردد که بیش از یک Calculation Item انتخاب شده باشد.
برای انجام این کار، باید در شیء Calculation Group در TMDL View کد مشخصی را بنویسید.
اگر با TMDL آشنایی ندارید، این مراحل را دنبال کنید:
برای اعمال تغییرات و تعریف اسکریپت برای Calculation Group از طریق نمای TMDL در Power BI Desktop، مراحل زیر را انجام دهید:
باز کردن نمای TMDL
ابتدا نمای TMDL را در Power BI Desktop باز کنید.ایجاد اسکریپت برای Calculation Group
اسکریپتی که منطق سفارشی را در آن مینویسید، مربوط به گروه محاسباتی (Calculation Group) است.کلیک راست روی Calculation Group در پنل مدل
در پنل مدل (Model pane)، روی نام Calculation Group کلیک راست کنید.انتخاب گزینه “Script TMDL to”
از منوی باز شده، گزینه “Script TMDL to” را انتخاب کنید.رفتن به تب Script
سپس به تب “Script” بروید تا اسکریپت قابل ویرایش برای گروه محاسباتی را مشاهده و ویرایش کنید.
عبارت زیر را در تعریف CalculationGroup بنویسید:
multipleOrEmptySelectionExpression = ERROR ( "Multiple selection of Metric is not allowed" )
پس از وارد کردن اسکریپت یا تغییرات در Calculation Group، روی دکمه APPLY کلیک کنید تا تغییرات در مدل معنایی اعمال شود.
در این مرحله ممکن است کادر گفتگوی “Compatibility Level Upgrade” ظاهر شود که از شما میخواهد سطح سازگاری (Compatibility Level) مدل معنایی را ارتقاء دهید.
در این صورت کافی است گزینه “Yes” را انتخاب کنید تا بهروزرسانی انجام شود.
کادر گفتگوی “Compatibility Level Upgrade” تنها زمانی ظاهر میشود که سطح سازگاری مدل کمتر از ۱۶۰۵ باشد، که این حداقل سطح مورد نیاز برای استفاده از ویژگیهای جدید Calculation Group مانند multipleOrEmptySelectionExpression
و noSelectionExpression
است.
نکته مهم درباره Tabular Editor
اگر از Tabular Editor استفاده میکنید، زمانی که سطح سازگاری مدل کمتر از ۱۶۰۵ باشد:
ویژگیهایی مانند
multipleOrEmptySelectionExpression
و دیگر خصوصیات Calculation Group نمایش داده نمیشوند.برای دسترسی و ویرایش این ویژگیها، باید ابتدا سطح سازگاری را به ۱۶۰۵ ارتقاء دهید (که این کار را میتوانید در خود Tabular Editor انجام دهید).
پس از ارتقاء، امکان ویرایش کامل همه خصوصیات Calculation Group فراهم خواهد شد.
نتیجه انتخاب چند آیتم در Calculation Group
زمانی که دو یا چند Calculation Item انتخاب شده باشد:
محتوای ویژوال دیگر نمایش داده نمیشود؛
به جای آن، پیغام خطایی که در تابع
ERROR
تعریف کردهاید، نمایش داده میشود.
در تصویر زیر، نمونهای از این پیام خطا که در ویژوال دیده میشود، برجسته شده است.
نمایش پیام خطا سادهترین روش برای نشان دادن قابلیت کنترل انتخابهای چندگانه بود.
اما ممکن است بخواهید بهجای آن، منطق سفارشیتری اعمال کنید؛ مثلاً:
انتخاب یکی از آیتمهای انتخابشده بر اساس اولویتی که خودتان تعریف میکنید.
نمونه پیادهسازی با اولویتبندی
در مثال زیر، پیادهسازی به گونهای است که از میان چندین Calculation Item انتخاب شده در Slicer،
آیتمی انتخاب میشود که بالاترین مقدار Ordinal را داشته باشد؛
یعنی آخرین مقدار انتخابشده در Slicer.
تعریف رفتار نمایش فرمت داینامیک
در قطعه کد TMDL زیر،
خاصیت formatStringDefinition
رفتار نمایش رشته فرمت داینامیک را در شرایط انتخاب چندگانه تعیین میکند.
calculationGroup
multipleOrEmptySelectionExpression = ```
VAR maxSelection = MAX ( 'Unit measure C'[Ordinal] )
VAR selection =
LOOKUPVALUE (
'Unit measure C'[Metric],
'Unit measure C'[Ordinal], maxSelection
)
RETURN CALCULATE (
SELECTEDMEASURE(),
'Unit measure C'[Metric] = selection
)
```
formatStringDefinition = ```
VAR maxSelection = MAX ( 'Unit measure C'[Ordinal] )
VAR selection =
LOOKUPVALUE (
'Unit measure C'[Metric],
'Unit measure C'[Ordinal], maxSelection
)
RETURN CALCULATE (
SELECTEDMEASUREFORMATSTRING(),
'Unit measure C'[Metric] = selection
)
```
عملکرد مفهوممحور کد DAX در رهگیری اجرای Measure
کد DAX نوشته شده به صورت مفهومی،
زمانی که بیش از یک Calculation Item در Filter Context دیده شود،
اجرای Measure را رهگیری (Intercept) میکند.
این کد DAX در Filter Context جاری عمل میکند.
برای بررسی انتخابهای کاربر،
مقادیر موجود در ستونهای Metric و Ordinal (که ترتیب آیتمهای محاسباتی را در مدل حفظ میکند) را مشاهده میکنیم.
لازم به ذکر است که استفاده از ستون Ordinal به جای ستون Metric به دلیل حفظ ترتیب واقعی آیتمها در مدل است،
نه ترتیب حروفی که در صورت استفاده از تابع MAX
روی ستون Metric به دست میآید.
شما میتوانید کدهای پیچیدهتری برای مدیریت حالات مشابه بنویسید؛
فقط به خاطر داشته باشید که:
Calculation Group یک جدول در مدل معنایی است؛
و Calculation Item یک مقدار در ستون این جدول محسوب میشود.
پیچیدگیهای اجرای همزمان چند Calculation Item
یک عملیات پیچیدهتر میتواند این باشد که همه Calculation Itemهای انتخاب شده را به ترتیب و بهصورت زنجیرهای اعمال کنیم.
اما چالش اصلی این است که:
زبان DAX قابلیت بازگشتی (Recursion) ندارد؛
بنابراین نمیتوان لیستی از Calculation Itemها گرفت و به صورت ترتیبی هر کدام را بر نتیجه قبلی اعمال کرد.
با این حال، میتوان فرضیات منطقی در نظر گرفت و یک محاسبه معتبر بر اساس انتخابهای کاربر ساخت.
مثال: Calculation Group زمان (Time Intelligence)
فرض کنید گروه محاسباتی زمان با آیتمهای زیر داریم:
Current: دوره جاری، بدون تغییر
PY: سال گذشته (Previous Year)
YOY: سال به سال (Year-over-Year)
YTD: سال تا تاریخ (Year-to-Date)
PYTD: سال تا تاریخ سال گذشته (Previous Year-to-Date)
YTDOYTD: مقایسه سال تا تاریخ با سال تا تاریخ سال گذشته (Year-to-Date over Year-to-Date)
هر یک از این آیتمها میتوانند به صورت جداگانه در گزارشی که شامل دو یا چند ویژوال است، محاسبه شوند، مانند ستونهای مثال زیر.
نمایش محاسبات زمانی در گزارش با انتخاب یک آیتم محاسباتی خارج از ویژوال
اگر Calculation Item بخشی از ویژوال نباشد و صرفاً از طریق Slicer انتخاب شود،
گزارش شما به صورت نمایش یک ترکیب (Combination) در هر لحظه خواهد بود.
برای مثال، گزارش زیر مقدار فروش سالتاتاریخ (Year-to-Date) را برای سالهای ۲۰۲۳ و ۲۰۲۴ نمایش میدهد.
ما همچنین میتوانیم مقدار سالتاتاریخ سال گذشته را مشاهده کنیم؛ در مثال زیر، دادههای نمایش داده شده برای سال ۲۰۲۴، در واقع مقادیر مربوط به سال ۲۰۲۳ در تصویر قبل هستند.
با این حال، فرض کنیم میخواهیم همان نتیجه را، یعنی مقدار نظری PYTD (سالتاتاریخ سال گذشته)، زمانی که کاربر به صورت همزمان PY (سال گذشته) و YTD (سالتاتاریخ) را انتخاب میکند، به دست آوریم.
تولید مقدار YTDOYTD با انتخاب همزمان YOY و YTD
بهطور مشابه، اگر کاربر همزمان YOY (سال به سال) و YTD (سالتاتاریخ) را انتخاب کند،هدف این است که مقدار ترکیبی YTDOYTD (Year-to-Date over Year-to-Date) محاسبه شود.
روش پیادهسازی
این تکنیک را میتوان با مقایسه مقادیر موجود در Filter Context با فهرست آیتمهایی که قصد داریم رهگیری (Intercept) کنیم،
و سپس اعمال Calculation Item مناسب در همان Filter Context برای اجرای محاسبه درست، پیادهسازی کرد.
calculationGroup
multipleOrEmptySelectionExpression = ```
VAR sel_YTD_PY = { "YTD", "PY" }
VAR sel_YTD_YOY = { "YTD", "YOY" }
VAR selection = VALUES ( 'Time Intelligence'[Name] )
RETURN SWITCH (
TRUE,
COUNTROWS ( INTERSECT ( selection, sel_YTD_PY ) ) == COUNTROWS ( sel_YTD_PY )
&& COUNTROWS ( selection ) == COUNTROWS ( sel_YTD_PY ),
CALCULATE ( SELECTEDMEASURE(), 'Time Intelligence'[Name] = "PYTD" ),
COUNTROWS ( INTERSECT ( selection, sel_YTD_YOY ) ) == COUNTROWS ( sel_YTD_YOY )
&& COUNTROWS ( selection ) == COUNTROWS ( sel_YTD_YOY ),
CALCULATE ( SELECTEDMEASURE(), 'Time Intelligence'[Name] = "YTDOYTD" ),
ERROR ( "Invalid Time Intelligence selection" )
)
```
تفاوت بین انتخاب خالی (Empty Selection) و عدم انتخاب (No Selection) در Calculation Groups
ممکن است متوجه شده باشید که ویژگی multipleOrEmptySelectionExpression که برای رهگیری انتخابهای چندگانه استفاده میشود، نامی شامل «empty» دارد. این نام ممکن است گمراهکننده باشد، زیرا ممکن است فکر کنید این ویژگی وقتی فعال میشود که هیچ آیتمی در اسلایسر انتخاب نشده باشد. اما انتخاب خالی با عدم انتخاب متفاوت است.
در Filter Context و بهویژه در calculation groups،
عدم انتخاب (No Selection) یعنی هیچ فیلتری روی ستون یا جدول مورد بررسی فعال نیست. این شامل هیچ فیلتر مستقیم یا غیرمستقیم (مثلاً پراکندگی فیلترهای متقابل از ستونها یا جداول دیگر) نمیشود. بنابراین، اگر هیچ آیتمی در اسلایسر انتخاب نشده باشد و در هیچ قسمت دیگر گزارش یا پنل فیلترها فیلتر فعال نباشد، در حالت No Filters یا عدم انتخاب هستیم.
انتخاب خالی (Empty Selection) به این معنی است که اگرچه یک فیلتر فعال است، اما پس از اعمال فیلترها، هیچ مقداری برای ستون مربوطه قابل مشاهده نیست. این وضعیت ممکن است در مواردی مثل اسلایسرهای calculation group اتفاق بیفتد. مثلاً در شرایط زیر:
مدل معنایی (semantic model) با یک calculation group زمان (Time Intelligence) منتشر میکنید.
گزارشی متصل به این مدل ایجاد و اسلایسر زمان روی آن قرار میدهید.
“YTD” را در اسلایسر انتخاب و گزارش را ذخیره میکنید.
بعداً در مدل معنایی منتشر شده، نام “YTD” را به “Year-to-Date” تغییر میدهید.
وقتی گزارش ذخیره شده را باز میکنید، فیلتر YTD باعث انتخاب خالی میشود چون دیگر آیتمی به نام “YTD” وجود ندارد.
به همین دلیل است که «Empty» در همان رویدادی که برای انتخاب چندگانه استفاده میشود، رهگیری میشود؛
چون این حالت، فیلتری فعال روی calculation group است که نتیجه آن تعداد آیتمهای محاسباتی غیر از یک (صفر یا بیشتر از یک) است.
مدیریت عدم انتخاب (No Selection) در Calculation Groups
حالت عدم انتخاب متفاوت است و با استفاده از یک عبارت DAX در یک ویژگی متفاوت مدیریت میشود.
شاید فکر کنید برای «عدم انتخاب» میتوان یک انتخاب پیشفرض (default selection) در اسلایسر تعیین کرد،
اما این کار ممکن است گمراهکننده باشد چون کاربر نمیبیند که با وجود عدم انتخاب، عملی خاص انجام میشود.
با این حال، در مورد calculation groups ممکن است بخواهید در این حالت هم محاسبه را رهگیری کنید،
برای مثال در حالت تبدیل ارز (Currency Conversion).
مثال کاربردی: تبدیل ارز در گزارشها
در فایل نمونه، تراکنشها با ارز USD ثبت شدهاند،
اما ارز اصلی تراکنش ممکن است متفاوت باشد.
بنابراین اگر مقدار را بر اساس Currency تفکیک کنیم، مقدارها به صورت USD نشان داده میشوند،
که ارز داخلی (Internal Currency) است که در همه مثالهای قبلی استفاده شده است.
کاربرد noSelectionExpression برای تبدیل ارز در Calculation Groups
وقتی یک ویژوال بر اساس ارز (Currency) فیلتر میشود، لازم است مبلغها به ارز اصلی نمایش داده شوند.
از آنجایی که مقدار ارز اصلی مستقیماً در مدل داده ذخیره نشده است، میتوانیم آن را با استفاده از جدول نرخ تبدیل ارز در زمان اجرای کوئری محاسبه کنیم.
این کار باعث میشود که دادههای اضافی در مدل ذخیره نشود و عملکرد مدل بهتر باقی بماند.
اما مشکل این است که چندین measure مختلف داریم که باید این تبدیل ارز روی همه آنها اعمال شود.
روش سنتی این است که از calculation group با یک calculation item استفاده کنیم که وقتی فعال میشود، تبدیل ارز را اجرا کند.
اما این نیازمند آن است که کاربر همیشه آن calculation item را در گزارش انتخاب کند، که کار سخت و پرخطایی است.
بهترین روش این است که تبدیل ارز به صورت خودکار اعمال شود، هر وقت که هر ستون از جدول Currency در گزارش استفاده شود.
در این حالت، با استفاده از ویژگی noSelectionExpression میتوانیم یک calculation group ایجاد کنیم که فقط یک calculation item دارد که مقدار اصلی را باز میگرداند،
و همزمان یک عبارت DAX در noSelectionExpression تعریف کنیم که وقتی calculation group در گزارش استفاده نشده یا فعال نیست، تبدیل ارز را اجرا کند.
به عبارت دیگر، تبدیل ارز همیشه فعال است، مگر اینکه به صورت صریح غیرفعال شود!
تعریف noSelectionExpression در Calculation Group
ویژگی noSelectionExpression در calculation group، عبارت DAX ای است که وقتی هیچ calculation item فعالی انتخاب نشده باشد، اجرا میشود و تمام ارجاعات به measures را رهگیری میکند.
کاربر میتواند این رفتار را با اعمال فیلتر روی یک calculation item مخفی غیرفعال کند.
calculationGroup
precedence: 60
noSelectionExpression = ```
IF (
ISCROSSFILTERED ( 'Currency' ),
CALCULATE (
VAR SelectedCurrency = SELECTEDVALUE ( 'Currency'[Currency Code], "USD" )
VAR MeasureName = SELECTEDMEASURENAME()
VAR SkipConversion = CONTAINSSTRING ( MeasureName, "#" )
|| CONTAINSSTRING ( MeasureName, "%" )
RETURN
IF (
SkipConversion || SelectedCurrency = "USD",
SELECTEDMEASURE (),
VAR DailyAmount =
CALCULATETABLE(
SUMMARIZECOLUMNS(
'Date'[Date],
Currency[Currency Code],
"@Amount", SELECTEDMEASURE (),
"@ExchangeRate", VALUES(ExchangeRate[Exchange])
),
ExchangeRate[FromCurrency] = "USD",
USERELATIONSHIP (
ExchangeRate[ToCurrency],
'Currency'[Currency Code]
)
)
VAR Result =
SUMX ( DailyAmount, [@Amount] * [@ExchangeRate] )
RETURN
Result
)
),
SELECTEDMEASURE ()
)
```
formatStringDefinition =
IF (
ISCROSSFILTERED ( 'Currency' ),
VAR MeasureName = SELECTEDMEASURENAME()
VAR SkipConversion = CONTAINSSTRING ( MeasureName, "#" )
|| CONTAINSSTRING ( MeasureName, "%" )
RETURN IF (
SkipConversion,
SELECTEDMEASUREFORMATSTRING(),
SELECTEDVALUE (
'Currency'[Currency Format],
SELECTEDMEASUREFORMATSTRING ()
)
),
SELECTEDMEASUREFORMATSTRING ()
)
calculationItem 'No conversion' = SELECTEDMEASURE()
نتیجه نهایی مقدار مبلغ را به همراه یک رشته قالببندی (format string) مناسب نمایش میدهد که نشان میدهد مبلغ به ارز دیگری تبدیل شده است.
توجه به کد محاسبه مقدار و رشته قالببندی (Format String)
کدی که مقدار calculation item و رشته قالببندی را پیادهسازی میکند، شامل تابع اولیه ISCROSSFILTERED
است که در این مثال ساده کمی زائد به نظر میرسد.
با این حال، این تکنیک بهینهسازی مفیدی است که از اجرای محاسبه غیرضروری جلوگیری میکند، به خصوص زمانی که جدول Currency در گزارش استفاده نشده باشد.
نمایش مقدار کل (Total) در گزارش
در این گزارش، مقدار کل به صورت عددی و بدون نمایش نماد ارز (currency symbol) به دلار آمریکا (USD) نشان داده میشود.
چرا که نمایش نماد ارز در مجموع میتواند باعث ظاهر شدن آن در تمام گزارشهای دیگر شود، که ممکن است مطلوب نباشد.
شما میتوانید یکی از دو کار زیر را انجام دهید:
ردیف مجموع (total row) را در گزارش مخفی کنید تا این اطلاعات نمایش داده نشود.
یا رشته قالببندی مقدار اصلی (original measure) را تغییر دهید تا نماد US$ فقط در ردیف مجموع و گزارشهایی که فیلتر یا گروهبندی بر اساس ارز ندارند، نمایش داده شود.
نتیجهگیری
ویژگیهای جدید multipleOrEmptySelectionExpression و noSelectionExpression در Calculation Groups به شما امکان کنترل دقیق محاسبات را میدهند،
چه زمانی که چندین آیتم محاسبه انتخاب شده باشد و چه زمانی که هیچ انتخاب فعالی وجود نداشته باشد.
این ویژگیها استفاده از Calculation Groups را سادهتر کرده و از سردرگمی کاربران درباره نتایج گزارشها جلوگیری میکنند.
توسعهدهندگان مدلهای معنایی (semantic models) میتوانند رفتارهای مشخصی تعریف کنند، حتی امکان نمایش خطا برای ترکیبهای نامعتبر را فراهم آورند.
نکات مهم درباره عملکرد و بهینهسازی
هرچند این ویژگیها بسیار قدرتمند هستند، اما باعث افزایش پیچیدگی اجرای کوئری میشوند که ممکن است عملکرد کلی گزارشها را کاهش دهد.
Calculation Groups به خودی خود بار اضافی بر روی برنامه اجرای کوئری (query plan) وارد میکنند و افزودن این ویژگیها بار بیشتری روی موتور DAX میگذارد.
بنابراین، حتماً قبل از انتشار بهروزرسانی مدل که از این امکانات استفاده میکند، عملکرد گزارشها را تست کنید.
دیدگاهتان را بنویسید