معرفی Calculation Groups
Calculation Groups (گروههای محاسباتی) یک ویژگی جدید در DAX هستند که از ویژگی مشابهی در MDX با نام Calculated Members (اعضای محاسبهشده) الهام گرفته شدهاند.
استفاده از Calculation Groups آسان است؛ اما طراحی صحیح یک مدل که شامل Calculation Groups باشد میتواند چالشبرانگیز شود، به ویژه زمانی که چندین Calculation Group ایجاد میکنید یا وقتی که از Calculation Itemها در Measures استفاده میشود.
پیش از آنکه توضیح دقیقی دربارهی Calculation Groups ارائه دهیم، مفید است که کمی زمان صرف تحلیل نیازهای کسبوکاری کنیم که منجر به معرفی این ویژگی شدهاند.
یک مثال مرتبط با محاسبات زمانی (Time-Related Calculations) کاملاً مناسب این موضوع است.
مدل نمونهی ما شامل Measuresهایی برای محاسبهی مبلغ فروش (Sales Amount)، هزینهی کل (Total Cost)، حاشیه سود (Margin) و مقدار کل فروش (Total Quantity Sold) است که با استفاده از کد DAX زیر ساخته شدهاند:

هر چهار Measure کاربردی هستند و بینشهای متفاوتی دربارهی کسبوکار ارائه میدهند.
علاوه بر این، هر چهار Measure گزینههای مناسبی برای انجام محاسبات Time Intelligence (هوش زمانی) به شمار میآیند.
محاسبهی تجمع سالانه (Year-to-Date) برای تعداد فروش به همان اندازه میتواند جالب باشد که این محاسبه برای مبلغ فروش یا حاشیه سود اهمیت دارد.
این موضوع در مورد بسیاری دیگر از محاسبات Time Intelligence نیز صادق است: مثل دورهی مشابه سال گذشته (Same Period Last Year)، رشد درصدی نسبت به سال قبل (Growth Percentage) و بسیاری موارد دیگر.
با این حال، اگر بخواهیم تمام انواع مختلف محاسبات Time Intelligence را برای تمام Measuresها بسازیم، تعداد Measuresها در مدل داده به سرعت افزایش خواهد یافت.
در دنیای واقعی، مدیریت یک مدل داده با صدها Measure هم برای کاربران و هم برای توسعهدهندگان میتواند کاری طاقتفرسا باشد.
در نهایت، باید در نظر داشت که تمام Measuresهای مختلف برای محاسبات Time Intelligence در واقع تغییراتی ساده از یک الگوی مشترک هستند.
به عنوان مثال، نسخهی Year-to-Date از چهار Measure قبلی چیزی شبیه نمونههای زیر خواهد بود:

تمام Measuresهای قبلی تنها در مبنای Measure خود تفاوت دارند؛
همهی آنها یک فیلتر مشابه یعنی DATESYTD را روی Measuresهای متفاوت اعمال میکنند.
عالی میشد اگر توسعهدهنده این امکان را داشت که یک محاسبهی عمومیتر تعریف کند و در آن، از یک جایگزین (Placeholder) برای Measure استفاده کند.

کد قبلی یک نحو (Syntax) معتبر در DAX نیست،
اما توصیف بسیار خوبی از Calculation Itemها ارائه میدهد.
میتوان کد قبلی را اینطور خواند:
«هرگاه نیاز به اعمال محاسبهی YTD روی یک Measure داشتی، پس از اعمال DATESYTD روی ستون Date[Date]، Measure را فراخوانی کن.»
این همان چیزی است که یک Calculation Item انجام میدهد:
یک Calculation Item، یک عبارت DAX است که شامل یک جایگزین ویژه (Special Placeholder) میشود.
موتور DAX، درست قبل از ارزیابی نتیجه، این Placeholder را با یک Measure جایگزین میکند.
به بیان دیگر، یک Calculation Item نوعی تغییر در یک عبارت است که میتواند روی هر Measure اعمال شود.
علاوه بر این، احتمالاً متوجه خواهی شد که به چندین محاسبهی مختلف در زمینهی هوش زمانی نیاز داری.
در واقع، محاسباتی مانند Year-to-Date، Quarter-to-Date و Same Period Last Year، همگی به نوعی به یک گروه محاسباتی مشترک تعلق دارند.
از این رو، DAX دو مفهوم ارائه میدهد:
Calculation Items و Calculation Groups.
یک Calculation Group مجموعهای از Calculation Itemهاست که به صورت منطقی کنار هم گروهبندی شدهاند، چون همگی تغییراتی بر روی یک موضوع مشترک هستند.
بیایید با شبهکد (Pseudo-code) در DAX ادامه بدهیم:

فقط در چهار خط کد، دهها Measure مختلف تعریف شدهاند؛
زیرا Calculation Itemها تغییرات خود را روی هر Measure موجود در مدل اعمال میکنند.
در نتیجه، به محض اینکه توسعهدهنده یک Measure جدید ایجاد کند، نسخههای CY (سال جاری)، PY (سال گذشته)، QTD (از ابتدای فصل تا کنون)، و YTD (از ابتدای سال تا کنون) به طور خودکار برای آن Measure هم در دسترس خواهند بود، بدون نیاز به تعریف مجدد.
با این حال، همچنان چندین نکتهی جزئی در درک کامل Calculation Groupها باقی مانده است.اما تنها دانستن یک نکته برای شروع استفاده از آنها و تعریف اولین Calculation Group کافی است:
کاربر چگونه یک تغییر (Variation) را انتخاب میکند؟
همانطور که گفتیم، یک Calculation Item خودش یک Measure نیست؛ بلکه تغییری روی یک Measure است.بنابراین کاربر نیاز دارد بتواند در یک گزارش، یک Measure خاص را همراه با یک یا چند تغییر از همان Measure قرار دهد.از آنجا که کاربران عادت دارند ستونهایی را از جداول انتخاب کنند،
Calculation Groupها طوری پیادهسازی شدهاند که گویی ستونهایی از یک جدول هستند،
و Calculation Itemها شبیه به مقادیر (Values) این ستونها رفتار میکنند.
به این ترتیب، کاربر میتواند Calculation Group را در ستونهای یک ماتریس قرار دهد تا تغییرات مختلف یک Measure را در گزارش نمایش دهد.برای مثال، Calculation Itemهای قبلاً معرفی شده به ستونهای یک ماتریس اعمال میشوند
و نسخههای مختلفی از Measure مربوط به Sales Amount (مبلغ فروش) را نشان میدهند.

ایجاد Calculation Group با استفاده از Tabular Editor
Tabular Editor اولین ابزاری است که امکان ایجاد Calculation Groupها را برای توسعهدهندگان فراهم کرده است.از آنجا که Calculation Groupها به نسخهی سازگاری 1470 در مدل Tabular نیاز دارند، تا ژوئن ۲۰۱۹ این ویژگی فقط در Analysis Services 2019 و Azure Analysis Services در دسترس بوده است.
در Tabular Editor، با استفاده از گزینهی منو Model / New Calculation Group میتوان یک Calculation Group جدید ایجاد کرد،
که در مدل به شکل یک جدول با یک آیکون ویژه ظاهر میشود.
در شکل زیر، این Calculation Group به نام Time Intelligence تغییر نام داده شده است.

Calculation Group یک جدول ویژه است که تنها یک ستون دارد،که به طور پیشفرض در Tabular Editor با نام Attribute ایجاد میشود.در مدل نمونهی ما، این ستون را به Time calc تغییر نام دادیم؛سپس با استفاده از گزینهی New Calculation Item که از طریق راستکلیک روی ستون Time calc در دسترس است،
سه آیتم (YTD، QTD و SPLY برای دورهی مشابه سال گذشته) به آن اضافه کردیم.هر Calculation Item شامل یک عبارت DAX مخصوص به خودش است.

توابع SELECTEDMEASURE در DAX معادل placeholder <Measure> است که در شبهکد DAX قبلی از آن استفاده کردیم.
کد DAX برای هر Calculation Item در کد زیر توضیح داده شده است.توضیحاتی که قبل از هر عبارت DAX آمده است، نشاندهندهی Calculation Item متناظر با آن عبارت هستند:

با این تعریف، کاربر یک جدول جدید به نام Time Intelligence میبیند،که ستونی به نام Time calc دارد و شامل سه مقدار: YTD، QTD و SPLY است.
کاربر میتواند یک slicer روی این ستون ایجاد کند یا آن را در ردیفها و ستونهای ویژوالها استفاده کند،
گویی که این ستون یک ستون واقعی در مدل است.
برای مثال، وقتی کاربر YTD را انتخاب میکند، موتور محاسبهی YTD را روی هر Measure که در گزارش باشد اعمال میکند.
شکل بعدی یک ماتریس را نشان میدهد که در آن Measure Sales Amount قرار دارد.
از آنجا که slicer، نسخهی YTD این Measure را انتخاب کرده است،اعدادی که نمایش داده میشوند، مقادیر year-to-date خواهند بود.

اگر در همان گزارش کاربر SPLY را انتخاب کند، نتیجه بسیار متفاوت خواهد بود.

اگر کاربر هیچ مقداری را انتخاب نکند یا اگر کاربر چندین مقدار را به طور همزمان انتخاب کند، در این صورت موتور هیچ تغییراتی به Measure اصلی اعمال نخواهد کرد.

Calculation Groupها میتوانند فراتر از این بروند.در ابتدای این مقاله، چهار Measure مختلف معرفی کردیم: Sales Amount (مبلغ فروش)، Total Cost (هزینه کل)، Margin (حاشیه سود)، و Sales Quantity (مقدار فروش).
بسیار عالی میشد اگر کاربر میتوانست از یک slicer برای انتخاب متریک مورد نظر برای نمایش استفاده کند،
نه فقط برای انتخاب محاسبهی هوش زمانی که باید اعمال شود.
ما قصد داریم یک گزارش عمومی ارائه دهیم که هر چهار متریک را بر اساس ماه و سال تقسیمبندی کند و به کاربر این امکان را بدهد که متریک مورد نظر خود را انتخاب کند.به عبارت دیگر، ما میخواهیم گزارشی به دست آوریم که در شکل زیر نمایش داده شده است.

در مثالی که نشان داده شده است، کاربر در حال مرور مقدار حاشیه با استفاده از نسخهی year-to-date است. با این حال، کاربر میتواند هر ترکیب از slicerهای مرتبط با دو Calculation Group، یعنی Metric و Time calc، را انتخاب کند. برای به دست آوردن این گزارش، ما یک Calculation Group اضافی به نام Metric ایجاد کردیم، که شامل آیتمهای محاسباتی Sales Amount، Total Cost، Margin و Sales Quantity است. عبارت هر Calculation Item تنها مقدار Measure متناظر را ارزیابی میکند.

زمانی که چندین Calculation Group در یک مدل دادهای وجود دارد، مهم است که ترتیب اعمال آنها توسط موتور DAX مشخص شود. ویژگی Precedence در Calculation Groupها ترتیب اعمال آنها را تعیین میکند: اولین Calculation Group که اعمال میشود، آن است که مقدار Precedence بزرگتری دارد. برای به دست آوردن نتیجهی دلخواه، ما مقدار ویژگی Precedence برای Calculation Group Time Intelligence را به 10 افزایش دادیم.

در نتیجه، موتور Calculation Group Time Intelligence را قبل از Calculation Group Metric اعمال میکند، که ویژگی Precedence آن در مقدار پیشفرض صفر باقی میماند. کد DAX زیر شامل تعریف هر Calculation Item در Calculation Group Metric است:

این Calculation Itemها تغییراتی در Measure اصلی ایجاد نمیکنند. بلکه، آنها به طور کامل Measure اصلی را با یک Measure جدید جایگزین میکنند. برای دستیابی به این رفتار، ما ارجاع به SELECTEDMEASURE را در عبارت حذف کردیم.
SELECTEDMEASURE در Calculation Itemها بسیار استفاده میشود، اما الزامی نیست.
گنجاندن و حذف Measures از Calculation Itemها
در برخی موارد، یک Calculation Item یک تغییر را پیادهسازی میکند که بر روی تمام Measures منطقی نیست. به طور پیشفرض، یک Calculation Item اثرات خود را بر روی تمام Measures اعمال میکند. با این حال، توسعهدهنده ممکن است بخواهد محدود کند که کدام Measures تحت تأثیر یک Calculation Item قرار گیرند.
میتوان شرایطی در DAX نوشت که Measure فعلی ارزیابی شده در مدل را با استفاده از توابع ISSELECTEDMEASURE یا SELECTEDMEASURENAME تجزیه و تحلیل کند.
تابع ISSELECTEDMEASURE مقدار TRUE را باز میگرداند اگر Measure ارزیابیشده توسط SELECTEDMEASURE در لیست Measures که در آرگومانها مشخص شده است، گنجانده شده باشد.
برای مثال، کد زیر Calculation Item را بر روی هر Measure اعمال میکند، به جز Measure Margin %:

یک تابع دیگر که میتوان از آن برای تجزیه و تحلیل Measure انتخابشده در عبارت Calculation Item استفاده کرد، SELECTEDMEASURENAME است که یک رشته به جای یک مقدار بولی برمیگرداند. برای مثال، کد قبلی میتواند به این شکل نیز نوشته شود:

ISSELECTEDMEASURE نسبت به SELECTEDMEASURENAME به دلایل مختلفی ترجیح داده میشود:
اگر نام Measure به اشتباه تایپ شود و با SELECTEDMEASURENAME مقایسه شود، کد DAX به سادگی FALSE برمیگرداند بدون اینکه خطایی ایجاد کند.
اگر نام Measure به اشتباه تایپ شود و از ISSELECTEDMEASURE استفاده شود، عبارت با خطای Invalid input arguments for ISSELECTEDMEASURE شکست میخورد.
اگر یک Measure در مدل تغییر نام پیدا کند، تمام عبارات استفادهکننده از ISSELECTEDMEASURE به طور خودکار در ویرایشگر مدل تغییر نام مییابند (اصلاح فرمول)، در حالی که رشتههای مقایسهشده با SELECTEDMEASURENAME باید به صورت دستی بهروزرسانی شوند.
تابع SELECTEDMEASURENAME باید زمانی در نظر گرفته شود که منطق تجاری یک Calculation Item باید بر اساس یک پیکربندی خارجی تغییراتی اعمال کند.
برای مثال، این تابع میتواند زمانی مفید باشد که جدولی با فهرستی از Measures وجود داشته باشد که باید رفتاری را در یک Calculation Item فعال کنند، به طوری که مدل دارای یک پیکربندی خارجی باشد که بدون نیاز به بهروزرسانی کد DAX قابل تغییر باشد.
Calculation Groups ویژگی جدید و هیجانانگیز در DAX هستند. در این مقاله اول فقط Calculation Groups معرفی شدند. مقالات بعدی ویژگیهای موجود، چندین مثال از کاربردهای ممکن و بهترین شیوههای نوشتن کد قابل اعتماد را با جزئیات بیشتری شرح خواهند داد.
دیدگاهتان را بنویسید