مفهوم Context و انواع آن در زبان DAX
در این مطلب به معرفی مفهوم Context و انواع آن در زبان DAX پرداخته شده است. به طور کلی در زبان DAX مفهومی به نام Evaluation Context وجود دارد که خود شامل 2 مفهوم می شود: Row Context و Filter Context
این دو مفهوم از مهم ترین پایه های زبان DAX به شمار می روند. به طور خلاصه باید بدانید Filter Context وظیفه فیلتر کردن داده ها و Row Context وظیفه پیمایش (Iterating) جداول را به عهده دارد، که به طور کلی دو وظیفه و مفهوم جدا از هم به شمار می روند.
Evaluation Context
برای معرفی مفهوم Context و انواع آن در زبان DAX ابتدا به بررسی Evaluation Context می پردازیم.
منظور از Evaluation Context چیست؟ اگر چه هیچ ترجمه ای نمی تواند بیانگر مفهوم این عبارت باشد، اما به طور کلی منظور از این عبارت زمینه، شرایط یا محیطی است که یک عبارت DAX در آن مورد ارزیابی قرار می گیرد.
اگر مخاطب این مطلب هستید احتمالا فردی تازه کار در زمینه کار با Power BI و زبان DAX نیستید. حتما می دانید که هر عبارت DAX با توجه به شرایط و زمینه ها (همان Context) مختلف نتایج مختلفی به همراه خواهد داشت.
شما بدون خواندن این مطلب نیز به طور خودکار از این مفاهیم استفاده می کنید، اما ممکن است بعد از خواندن این مطلب بتوانید با علم و آگاهی بیشتری کد های خود را ایجاد کنید.
Filter Context
در ادامه معرفی مفهوم Context و انواع آن در زبان DAX به بررسی مفهوم Filter Context می پردازیم. بیایید از همین جا قرار بگذاریم هیچ ترجمه ای برای این مفاهیم استفاده نکنیم. هر فرمول DAX در یک Context مورد ارزیابی قرار می گیرد. در واقع Context محیط و شرایطی است که کد های DAX در آن مورد ارزیابی قرار گرفته و اجرا می شوند.
به مژر زیر دقت کنید.
SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
این کد میزان فروش را محاسبه می کند. حال این مژر را در یک ویژوال Card مورد استفاده قرار می دهیم.
عدد نمایش داده شده 33.69 میلیون دلار است. این عدد معادل کل فروش است. چرا مژر نوشته شده عدد کل را نمایش می دهد؟ چرا که هیچ گونه Context برای آن در نظر گرفته نشده است. هیچ شرایط و محیط خاصی برای این مژر در نظر گرفته نشده است.
حال بیاید یک Context یا شرایط دیگری برای این مژر در نظر بگیریم. می خواهیم در یک جدول میزان فروش هر برند را نمایش دهیم.
همان طور که مشاهده می کنید بدون هیچ تغییری در کد DAX نتایج تغییر می کند. حال اعداد نمایانگر فروش هر برند هستند. در واقع بدون هیچ دستکاری در فرمول اعداد و ارقام به طور کلی تغییر می کنند، چرا که Context یا همان شرایط حاکم بر محاسبات تغییر کرده است.
همان طور که مشاهده می کنید در ردیف Total کماکان عدد 33.69 میلیون دلار نمایش داده می شود، عددی که در Card هم پیش از این دیده شد.
در واقع Context از بیرون از فرمول فراهم می شود. شما تنها یک کد می نویسید و این کد با Context های مختلف نتایج مختلفی به شما رائه می دهد.
Context حاکم بر هر سلول با سلول دیگر متفاوت است و منجر به نتایج مختلف می شود. در واقع این نوع از Context با نام Filter Context شناخته می شود و وظیفه آن Filter کردن جداول است.
همان طور که در تصویر مشاهده می کنید به طور مثال Filter Context برای ردیف اول A.Datum است، برای برای ردیف دوم Adventure Works، برای ردیف با رنگ بنفش Litware است. در واقع در هر ردیف جدول فروش تنها برای مقادیر همان ردیف فیلتر شده و محاسبه را انجام می دهد.
توجه داشته باشید برای ردیف آخر عدد نمایش شده جمع اعداد موجود در ویژوال نیست بلکه محاسبه تمامی مقادیر بدون وجود Filter Context است. پس گمان نکنید که ابتدا ردیف های مربوط به هر برند محاسبه شده و در نهایت جمع می شوند! بلکه کلیه مقادیر موجود در جدول بدون هیچ گونه فیلتری جمع می شوند.
حال بیایید Filter Context را تغییر دهیم. برای این منظور یک ماتریس ایجاد می کنیم و برند را در سطر و سال را در ستون قرار می دهیم.
همان طور که مشاهده می کنید اعداد به کلی تغییر می کنند. در این ماتریس Filter Context برای سلول مشخص شده با شماره 1 چیست؟ آفرین! برند A.Datum و سال 2007
Filter Context برای سلول مشخص شده با عدد شماره 2، برند Proseware و سال 2008 است. برای عدد شماره 3، Filter Context تنها شامل برند Fabrikam است و هیج فیلتری روی سال وجود ندارد.
برای عدد شماره 4، Filter Context سال 2009 و هیچ فیلتری روی برند وجود ندارد. برای عدد شماره 5، هیچ گونه Filter Context وجود ندارد و عدد محاسبه شده برابر با جمع کل است.
به مثال زیر توجه کنید.
به گزارش های ایجاد شده دقت کنید. Filter Contextبرای عدد شماره 1، برند Fabrikam، سال 2008 و کشور United States است. در واقع مجموعه این فیلترها، Filter Context را تشکیل می دهد.
برای عدد شماره 2، Filter Context، کشور United States و سال 2008 است.
برای محاسبه هر یک از اعداد موجود در گزارشات ابتدا Filter Context مهیا می شود، سپس جداول محدود به مقادیر موجود در Filter Context می شوند و در نهایت فرمول با توجه به این شرایط محاسبه می شود.
پس Filter Context به شرایط و محیط فراهم شده توسط ویژوال ها، اسلایسر ها و … اطلاق می شود که نحوه محاسبه فرمول ها را دستخوش تغییر قرار می دهد.
Row Context
در ادامه معرفی مفهوم Context و انواع آن در زبان DAX به مفهوم Row Context می رسیم. یکی از مفاهیم دیگری که در زیر مجموعه Evaluation Context قرار می گیرد، مفهوم Row Context است که به طور کلی با Filter Context متفاوت است.
چنان چه پیشتر گفته شد، Filter Context وظیفه محدود کردن جداول را به عهده دارد، در حالی که Row Context پیمایش جداول را به عهده می گیرد.
فرض کنید می خواهیم ستون محاسباتی در جدول فروش ایجاد کنیم که برای هر ردیف، تعداد را در قیمت ضرب کند. به طریق زیر این فرمول را می نویسیم.
همان طور که مشاهده می کنید برای هر ردیف، تعداد در قیمت ضرب شده است و عدد متفاوتی برای هر ردیف درج شده است. این نتایج توسط Row Context ایجاد شده است.
Row Context در واقع جدول فروش را ردیف به ردیف پیمایش می کند و برای هر ردیف قیمت را در تعداد ضرب می کند. در واقع برای این محاسبه هیچ فیلتری انجام نمی شود بلکه این پیمایش جدول (iterate) است که نتیجه نهایی و متفاوت را ایجاد می کند.
در واقع وقتی یک ستون محاسباتی (Calculated Column) در یک جدول ایجاد می کنیم، به طور خودکار یک Row Context روی این جدول ایجاد می شود و محاسبه مورد نظر را ردیف به ردیف، انجام داده و نتیجه را در ستون جدید برای هر ردیف درج می کند.
آیا همیشه مانند ستون محاسباتی، Row Context به طور خودکار ایجاد می شود؟ آیا ستون محاسباتی تنها موردی است که در آن Row Context ایجاد می شود؟
جواب هر دو سوال منفی است. در مژر نیز می توان Row Context ایجاد کرد. گاهی اوقات باید خودمان Row Context را ایجاد کنیم.
سعی کنید مژری به صورت روبرو ایجاد کنید.
Sales[Quantity] * Sales[Unit Price]
این مژر با خطا مواجه خواهد شد. در واقع این مژر نمی تواند تشخیص دهد منظور شما محاسبه این فرمول برای کدام ردیف است؟ تا زمانی که شما Row Context ایجاد نکنید، محاسبه ای صورت نخواهد پذیرفت. شما باید به صورت دستی و با انتخاب توابع صحیح این Row Context را ایجاد کنید، این در حالیست که همین فرمول برای ستون محاسباتی به درستی عمل می کند چرا که در ایجاد ستون محاسباتی Row Context به طور خودکار ایجاد می شود.
برخی از توابع مانند SUMX جز توابع iterator به شمار می آیند. این توابع جدولی را به عنوان ورودی می گیرند و عملیاتی را روی ردیف به ردیف جدول انجام می دهند. در واقع این توابع این توانایی را دارند که در جدول شما یک Row Context ایجاد کنند.
به مثال زیر توجه کنید.
SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
در این مثال جدول Sales به عنوان ورودی به تابع SUMX معرفی می شود و ردیف به ردیف عملیات ضرب تعداد در قیمت برای این جدول انجام شده و در نهایت عملیات جمع روی این مقادیر صورت می پذیرد. در واقع با انتخاب تابع SUMX، به صورت دستی یک Row Context بر روی جدول Sales ایجاد می کنیم.
جمع بندی
در این مطلب به بررسی مفهوم بسیار مهم Context و انواع آن در زبان DAX پرداختیم. اگر چه عدم آگاهی شما از این مفاهیم خللی در کار شما به وجود نمی آورد، اما آگاهی از آن بسیار راه گشاست.
به خاطر بسپارید که مفهوم Filter Context به طور کلی از Row Context جداست. Filter Context عملیات فیلتر کردن و محدود کردن جداول را به عهده دارد در حالی که Row Context عملیات پیمایش جداول را به عهده دارد.
همچنین می توانید از طریق ویدئوری زیر به مشاهده محتوای ویدئویی این مطلب بپردازید.
درباره حسین وثوقی
دانش آموخته مهندسی صنایع و مدیریت فناوری اطلاعات دانشگاه تهران، علاقه مند به تحلیل و ارائه راه حل برای مسائل و بهینه سازی راه حل ها هستم ...
نوشته های بیشتر از حسین وثوقی
عالی
ممنون از همراهی شما
عالی سپاس
ممنون از توضیحاتتون درباره این دو مفهوم که واقعا می بایست مورد توجه قرار بگیرد
عالی بود 🙏🏻
جناب مهندس وثوقی
بسیار سپاسگزارم از شما بابت مطالب علمی، کاربردی و مفهومی که به زبان ساده داخل سایت می ذارین
با سلام و احترام و تشکر از جناب آقای مهندس وثوقی بزرگوار. من واقعا نمی توانستم مفهوم row context و filter context را درک کنم و در ابتدا گمان می کردم این دو مفهوم خاصیت های توایع DAX هستند. به طوریکه برخی توابع از نوع row context و برخی دیگر از نوع filter context هستند. ولی با مطالعه آموزش جامع و به زبان گویا و ساده شما متوجه معنای اصلی این مفاهیم شدم. با تجدید احترام
ممنون از توضیحاتتون.