ساخت جدول تاریخ با زبان پویا در Power Query
آیا میخواهید دادههای شما منظم و برای همه قابلدرک باشد، صرفنظر از اینکه به چه زبانی صحبت میکنند؟
در این مقاله، به شما نشان میدهیم چگونه در Power Query یک جدول تاریخ (Date Table) بسازید که بتواند زبان خود را تغییر دهد. یعنی میتوانید زبان دلخواه خود را انتخاب کنید و تمام نام ستونها و مقادیر در این جدول به همان زبان نمایش داده خواهند شد.
این قابلیت بهویژه زمانی مفید است که با تیمهای چندملیتی کار میکنید یا گزارشهایی برای کاربران با زبانهای مختلف تولید مینمایید. با استفاده از این تکنیک، تنها یک تقویم خواهید داشت که برای همه قابل استفاده است — حتی همکاران خارجی شما!
فهرست مطالب
دو بخش کلیدی برای ایجاد انعطافپذیری زبانی در جدول تاریخ
برای اینکه تقویم شما از زبانهای مختلف پشتیبانی کند، باید روی دو بخش مهم تمرکز کنید:
تغییر مقادیر ستونها (Column Values)
تغییر نام ستونها (Column Names)
در ادامه بررسی میکنیم که چگونه میتوان هر دو مورد را با استفاده از Power Query پیادهسازی کرد.
۱. تغییر مقادیر ستونها
جدولهای تاریخ میتوانند شامل مقادیری باشند که به فرهنگ (Culture) یا زبان خاصی وابستهاند. این موضوع معمولاً در مورد مقادیر عددی مثل سال، ماه، هفته و روز صدق نمیکند، اما برای مقادیری مثل نام روزها و نام ماهها اهمیت دارد.
و این مقادیر باید به فرمت و زبان صحیح نمایش داده شوند تا تجربه کاربری بهتری برای کاربران چندزبانه فراهم شود.
۱.۱ استفاده از Culture در توابع تاریخ (Date Functions)
فرض کنید میخواهید ستونی برای نام روز (Day Name) و نام ماه (Month Name) بسازید. اگر از رابط گرافیکی Power Query استفاده کنید و یک ستون سفارشی (Custom Column) اضافه کنید، ممکن است به چنین کدی برسید:
= Date.DayOfWeekName( [Date] ) // "Monday", "Tuesday", "Wednesday", etc
= Date.ToText( [Date], "ddd" ) // "Mon", "Tue", "Wed", etc
= Date.MonthName( [Date] ) // "January", "February", "March"
= Date.ToText( [Date], "MMM" ) // "Jan", "Feb", "Mar" etc
🔔 نکته مهم
بهصورت پیشفرض، Power Query مقادیر ستونها را بر اساس زبان سیستم محلی (local machine) تولید میکند. در بسیاری از موارد، این همان چیزیست که انتظار داریم.
اما تصور کنید که فایل شما روی یک سرور با زبان سیستم متفاوت ریفرش (بهروزرسانی) میشود، یا همکار شما که زبان سیستمش فرق دارد دادهها را بازسازی میکند.
در چنین شرایطی، امکان دارد مقادیر متنی مانند نام ماه یا روز به زبانی متفاوت نمایش داده شوند. این تغییر زبان ممکن است باعث سردرگمی کاربران یا اشتباه در گزارشگیری شود.
راهحل: استفاده از Culture Code
برای جلوگیری از چنین مشکلاتی، بهتر است بهجای تکیه بر زبان سیستم، از Culture Code استفاده کنید.
فرمتدهی مقادیر با استفاده از Culture در Power Query
توابعی مانند Date.ToText
یا DateTime.ToText
معمولاً خروجی را به زبان انگلیسی نمایش میدهند؛ مثلاً نام روزها یا ماهها به صورت «Monday» یا «Jan» نمایش داده میشوند.
اما اگر بخواهی از قالببندی بومی (local formatting conventions) برای نمایش دقیقتر استفاده کنی، باید زبان موردنظر خودت را بهصورت صریح به تابع بدهی.
راهحل: استفاده از آرگومان اختیاری Culture
بسیاری از توابع Power Query دارای آرگومان اختیاری به نام culture
هستند. با استفاده از این پارامتر، میتوانی خروجی تابع را مجبور کنی تا از فرمت خاص یک زبان پیروی کند.
= Date.DayOfWeekName( [Date], "en-US" ) // "Monday", "Tuesday"
= Date.DayOfWeekName( [Date], "nl-NL" ) // "Maandag", "Dinsdag"
= Date.ToText( [Date], "ddd", "en-US" ) // "Mon", "Tue", "Wed"
= Date.ToText( [Date], "ddd", "fr-FR" ) // "lun.", "mar.", "mer"
= Date.ToText( [Date], "ddd", "es-ES" ) // "lu.", "ma.", "mi"
۱.۲ ساخت پارامتر زبان (Language Parameter)
همانطور که دیدیم، بسیاری از توابع در Power Query از Culture Code پشتیبانی میکنند. در مثالهای قبلی، کد زبان (مثل "fr-FR"
یا "es-ES"
) بهصورت ثابت (Hardcoded) نوشته شده بود. اگر فقط به یک زبان نیاز داشته باشی، همین روش کفایت میکند.
اما اگر میخواهی جدول تاریخت چندزبانه و پویا باشد، بهتر است مقدار culture را دینامیک و وابسته به انتخاب کاربر تعریف کنی.
🎛️ ساخت پارامتر زبان توسط کاربر
برای اینکه کاربران بتوانند زبان موردنظرشان را انتخاب کنند، باید یک پارامتر در Power Query بسازی. مراحل ایجاد این پارامتر به شرح زیر است:
به بخش Manage Parameters برو.
یک پارامتر جدید با نام
CalendarLanguage
بساز.مقدار Type را روی
Text
قرار بده.در بخش Suggested Values، گزینهی
List
را انتخاب کن.زبانهای موردنظر را بهصورت کد فرهنگ (culture code) در لیست وارد کن، مثل:
"en-US"
"fa-IR"
"fr-FR"
"de-DE"
مقدار پیشفرض (Default Value) را انتخاب کن. مثلاً
"en-US"
.روی OK کلیک کن تا پارامتر ذخیره شود.
نکته: مطمئن شو که این culture codeها با مقادیر موجود در جدول ترجمه (Translation Table) هماهنگ باشند، چون در مرحلهی بعد برای تغییر نام ستونها به آنها نیاز خواهی داشت.
📜 کد خودکار تولیدشده برای پارامتر:
کدی مشابه کد زیر بهصورت خودکار تولید خواهد شد (اگر نام پارامتر را CalendarLanguage
بگذاری):
// CalendarLanguage
"English"
meta [
IsParameterQuery = true,
List = {"English", "Nederlands"},
DefaultValue = "English",
Type = "Text",
IsParameterQueryRequired = true
]
۱.۳ افزودن Culture Code به عنوان یک مرحله در Query
حالا که پارامتر زبان (CalendarLanguage
) را ایجاد کردهای، نوبت آن است که در جدول تاریخ خود، یک مرحلهی جداگانه به Power Query اضافه کنی که Culture Code را تعیین کند.
نام این مرحله را میتوانی Culture
بگذاری.
🎯 هدف این مرحله چیست؟
هدف این است که بر اساس زبانی که کاربر انتخاب میکند، Culture Code متناظر را برگردانی. اگر فقط چند زبان را پشتیبانی میکنی، میتوانی از یک شرط سادهی if برای انجام این کار استفاده کنی.
= if CalendarLanguage = "English" then "EN-us" else
if CalendarLanguage = "Nederlands" then "nl-NL" else null
پشتیبانی از تعداد بیشتری زبان با استفاده از جدول ترجمه
اگر بخواهی از زبانهای بیشتری پشتیبانی کنی، استفاده از شرطهای متعدد if
دیگر بهینه نیست. در این حالت، بهتر است از یک جدول ترجمه (Translation Table) استفاده کنی که زبانها و Culture Code مربوط به هر زبان را در خود داشته باشد.
برای این کار کافی است یک مرحلهی جدید در Power Query اضافه کنی و در آن یک جدول کوچک بسازی که مقادیر پارامتر زبان را به Culture Code مرتبط میکند.
Table.FromRows(
Json.Document(
Binary.Decompress(
Binary.FromText(
"i45Wcs1Lz8kszlDSUUrN03X1A9LOpUVFqXklSrE60Up+qSmpRT
mJeSnFQIm8HF0/HyDtUZqZkpmeqhQbCwA=",
BinaryEncoding.Base64
),
Compression.Deflate
)
),
let
_t = ( ( type nullable text ) meta [ Serialized.Text = true ] )
in
type table [ Language = _t, Culture = _t, DefaultValue = _t ]
)
حالا که جدول mapping زبانها و Culture Code را ساختی، ممکن است بپرسی:
“چطور میتوانم به مقدار Culture مربوط به زبان انتخابشده دسترسی داشته باشم؟”
برای این کار باید هم اندیس ردیف (row index) و هم نام ستون موردنظر را بدانیم.
در مرحله اول، باید ردیفی را پیدا کنیم که با مقدار پارامتر CalendarLanguage
مطابقت دارد.
= List.PositionOf( LanguageParameters[Language] , CalendarLanguage )
پارامتر CalendarLanguage
که قبلاً ساختیم، به همین مقدار اشاره دارد. با توجه به این موضوع، برای دسترسی به هر مقدار داخل جدول، باید به شکل زیر عمل کنیم:
= LanguageParameters[Culture]
{ List.PositionOf( LanguageParameters[Language] , CalendarLanguage ) }
// Returns the value of the [Culture] column for the relevant language.
= LanguageParameters[DefaultValue]
{ List.PositionOf( LanguageParameters[Language] , CalendarLanguage ) }
// Returns value of the [DefaultValue] column for the relevant language.
یادت باشد که نام مناسبی برای مراحل (Steps) داخل Power Query انتخاب کنی تا در توابع و مراحل بعدی به راحتی بتوانی به آنها ارجاع بدهی و کدها مرتب و خوانا باشند.
۱.۴ ارجاع به مقدار Culture در توابع
به جای اینکه مقدار Culture را به صورت ثابت (Hardcoded) در کد خود وارد کنی، بهتر است از ارجاع به مقدار Culture که در مرحلهی جداگانه تعریف کردهای استفاده کنی.
= Date.DayOfWeekName( [Date], "en-US" ) // "Monday", "Tuesday"
// the above code then becomes:
= Date.DayOfWeekName( [Date], Culture ) // "Monday", "Tuesday"
۲. تغییر نام ستونها (Renaming Columns)
برای پویایی بیشتر تقویم (Calendar) خود، گام بعدی این است که نام ستونها را به زبان انتخابی تغییر دهیم.
⚠️ نکته مهم درباره تغییر نام ستونها
اگر قبلاً مدل دادهای داری که بر پایه جدول تاریخ ساخته شده، باید دقت کنی که تغییر نام ستونها ممکن است باعث شکستن محاسبات (Measures) و روابط (Relationships) شود.
به همین دلیل بهترین کار این است که زبان تقویم را از ابتدای پروژه مشخص کنی.
تغییر مقدارهای ستونها معمولاً مشکلی ایجاد نمیکند، چون این کار نسبتاً بیخطر است. اما تغییر نام ستونها باید با دقت و برنامهریزی انجام شود.
💡 راهحلهای ممکن برای تغییر نام ستونها
روش اول: استفاده از شرط if برای هر ستون و هر زبان
در این روش برای هر ستون باید شرطی بنویسی که بسته به زبان انتخابشده، نام ستون تغییر کند.
معایب این روش:
زمانبر بودن
نگهداری دشوار
اضافه کردن زبان جدید نیاز به تغییر تمام شرطها دارد
روش بهتر: استفاده از جدول ترجمه نام ستونها
به جای شرطهای پیچیده، میتوان یک جدول ترجمه ساخت که در آن:
یک ستون شامل نام پیشفرض ستونها (مثلاً به انگلیسی)
هر ستون دیگر، نامهای ترجمهشده برای هر زبان مختلف
نحوه استفاده از جدول ترجمه برای تغییر نام ستونها:
در مرحلهی آخر Query، میتوانی با ارجاع به این جدول و پارامتر زبان، به صورت داینامیک نام ستونها را تغییر دهی.
مزایای این روش:
افزودن زبان جدید تنها با اضافه کردن یک ستون در جدول ترجمه
بدون نیاز به تغییر در کدهای شرطی
کد تمیزتر و نگهداری سادهتر
۲.۱ ایجاد جدول ترجمه (Create a Translation Table)
اولین گام برای پشتیبانی از چند زبان در نام ستونها، ایجاد یک جدول ترجمه است.
سادهترین روش برای ساخت این جدول، استفاده از گزینه Enter Data در Power Query است، که به تو امکان میدهد به راحتی یک جدول جدید بسازی و برای هر زبان یک ستون جداگانه اضافه کنی.
مراحل ساده برای ساخت جدول ترجمه:
وارد Power Query Editor شو.
گزینه Enter Data را انتخاب کن.
نام ستون اول را به عنوان نام پیشفرض ستونها (مثلاً انگلیسی یا کلید ستونها) بگذار.
برای هر زبان مورد نظر، یک ستون جدید با نام آن زبان ایجاد کن.
در هر سلول، ترجمه متن مربوط به آن ستون را وارد کن.
مزایا:
ساخت سریع و آسان جدول ترجمه
امکان ویرایش و اضافه کردن زبانهای جدید در آینده
استفاده داینامیک از این جدول در فرآیند تغییر نام ستونها
قبل از انجام مراحل تغییر نام ستونها، ابتدا باید تمام نامهای ستونها در جدول تقویم (Calendar) را بازیابی کنیم.
برای این کار میتوانی به آخرین مرحله در Power Query بروی و یک مرحلهی جدید اضافه کنی که به آن مرحله آخر ارجاع دهد.
فرض کنیم آخرین مرحلهی تو با نام LastStepName
است.
برای گرفتن لیست نام ستونها، میتوانی از تابع زیر استفاده کنی:
= Table.ColumnNames( LastStepName )
حالا برای ساخت جدول ترجمه مراحل زیر را انجام بده:
تمام مقادیر لیست نام ستونها را کپی کن.
وارد Enter Data در Power Query شو.
برای هر زبان که میخواهی پشتیبانی کنی، یک ستون جدید بساز و نام آن ستون را دقیقاً همانطور که در پارامتر زبان تعریف کردهای، قرار بده.
در هر ردیف، نام ستون مورد نظر به زبان همان ستون را وارد کن (یعنی معادل ترجمه شده هر ستون را وارد کن).
روی OK کلیک کن تا جدول ساخته شود.
پس از انجام این مراحل، یک جدول مانند نمونه بالا خواهی داشت.
رابط کاربری Power Query به صورت خودکار کد Binary مربوط به این جدول را تولید میکند که میتوانی آن را از نوار فرمول (Formula Bar) کپی کنی.
این کد ممکن است چیزی شبیه به این باشد:
= Table.FromRows(
Json.Document(
Binary.Decompress(
Binary.FromText(
"ZZLBbsIwDIZfxeqZvkXRxFBBE4dpYhw81QU0GqSSbuLtZ7uJ63a9JP7/
L65j53gsKoxUrGQZuuK0GgXYhEhn6rMBLxTxpvYHocivyEuOoaIWh1tM
OhwihoY3zUjwV9a1mPzJTtT6HuKlTNlq5AOl5VQP9i14G34wwALZYUfm
7xC7hQeHy72PMwK2oiywqX4Hzm/BUR/h3oIeY3IUpCg9o9CazzpkfQ0N
LZAKnw+4BmMqPFNQwZDNYQ/vRN9h6L50BlmA3dB11BuU2iNba4zVKQdm
ZaogyNvAEvWSbcy//WUB8ebzJ8i5Nu5y8uS35Qzg++Wx8NW0k58h72aE
DSe702gEyX2cyhTOmulrTXhu0ZxeNi7B+m7/wfp8F/C+bR+U60yBeJrYT
B/5N5zssWbn5yEYYUNwkBZphBbn3M1DL0f8bFY+cF6Dz+z1HJyL0+kP",
BinaryEncoding.Base64
),
Compression.Deflate
)
),
let
_t = ((type nullable text) meta [Serialized.Text = true])
in
type table [English = _t, Nederlands = _t]
)
۲.۲ اضافه کردن جدول ترجمه به کوئری
برای آمادهسازی تغییر نام ستونها، میتوانی کل کد جدول ترجمه (چه کدی که خودت ساختهای یا کد من) را کپی و در کوئری اصلی جایگذاری کنی. من ترجیح میدهم جدول ترجمه داخل کوئری اصلی تاریخ قرار داشته باشد.
مراحل انجام کار:
وارد کوئری جدول تاریخ (Date Table) خود شو.
مرحلهای که میخواهی جدول ترجمه را وارد کنی انتخاب کن.
روی دکمهی
fx
کلیک کن تا یک مرحله جدید ساخته شود.فرمول جدول ترجمه خود را در نوار فرمول پیست (paste) کن.
نام این مرحله جدید را به
TranslateColumnNames
تغییر بده.
۲.۳ تغییر نام ستونها به زبان انتخابی
در مرحله نهایی کوئری، میتوانی تغییر نام ستونها را انجام دهی. به این صورت، بیشتر بخشهای کوئری بدون تغییر باقی میمانند و فقط یک مرحله برای تبدیل نام همه ستونها به زبان مورد نظر کافی است.
با داشتن جدول ترجمه، تنها کاری که لازم است انجام دهیم، آمادهسازی تابع تغییر نام ستونها است.
سادهترین روش برای شروع:
نام یک ستون را به صورت دستی تغییر بده. این کار در Power Query باعث میشود کدی با استفاده از تابع Table.RenameColumns
ساخته شود که میتوانیم آن را ویرایش کنیم.
مثال کد تولید شده به صورت خودکار ممکن است شبیه این باشد:
= Table.RenameColumns(
#"Insert Is Weekday",
{ { "Date", "Datum" } }
)
تابع Table.RenameColumns
نیاز به لیستی از جفتهای نام قدیمی و نام جدید ستونها دارد.
برای ساخت این لیست داینامیک، میتوانی از تابع List.Zip
استفاده کنی که دو لیست (یکی نامهای قدیمی و یکی نامهای جدید) را با هم ترکیب میکند.
= Table.RenameColumns(
#"Insert Is Weekday",
List.Zip(
{ TranslateColumnNames[English], // default column names (list)
Table.Column( // new column names (list)
TranslateColumnNames, // from this table
CalendarLanguage) // and this Column Name
}
),
MissingField.Ignore // prevents throwing an error when columns miss
)
۳. اسکریپت جدول تاریخ (Date Table Script)
تبریک میگویم که تا اینجا همراه بودی! با توجه به تمامی مراحل گفته شده، اکنون میتوانی از جدول تاریخ خود به بهترین شکل استفاده کنی.
برای دیدن تقویم در عمل، ابتدا باید یک کوئری به نام CalendarLanguage
اضافه کنی (که در بخش ۱.۳ به آن اشاره شد):
// CalendarLanguage
"English"
meta [
IsParameterQuery = true,
List = {"English", "Nederlands"},
DefaultValue = "English",
Type = "Text",
IsParameterQueryRequired = true
]
پس از ایجاد کوئری CalendarLanguage
، حالا میتوانی یک کوئری جدید برای ساخت جدول تقویم ایجاد کنی.
کد زیر را در Advanced Editor پیست (Paste) کن:
let
Today = Date.From( DateTime.LocalNow() ),
StartDate = #date( 2021, 1, 1 ),
EndDate = Date.EndOfYear( Today ),
TranslateColumnNames = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("bZLRboMwDEV/xeJ18BdUU1exauKhmqo+eMK01UqQaNjUv58dEidh5QV870lwbnw8FjVaKkp5zUNxKhcBtsbSmaZgwCtZvDn7k1DkN+RXqKGmHueb9Tq0Fk3HH91C8FM1jZj8yJeozWjspfK7NcgLKt3TefA+D1+krpQDZT4OFF3EYeVBexknmxGwE2WFxeYTMD8CV5OFsQe3jMlF+EEDy5oY34arBNxcTUdPwRofd7gaJWs8k3GCgA7Ztns4EH2bkEQQ0jBE8zHKp4aoPcuCrGW3Q2zkY2aDppj37pcFxFv6Fw8lrt5+FT35eZUBfMpwUXzAeE1B10sKbrwiQUKSsTnhYpxJhx4P8eT0OjQPu+H9B7sZXsH7vr9T6NMX4rmN1UyrOGVqLz0nfoheCY0+gVyTSrjmEnd7d4cjHpkyLRKvw0fwJi7Ocbbg5cl8eVETOP0B", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [English = _t, Nederlands = _t]),
LanguageParameters = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45Wcs1Lz8kszlDSUUrN03X1A9LOpUVFqXklSrE60Up+qSmpRTmJeSnFQIm8HF0/HyDtUZqZkpmeqhQbCwA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Language = _t, Culture = _t, DefaultValue = _t]),
CultureCode = LanguageParameters[Culture] { List.PositionOf( LanguageParameters[Language] , CalendarLanguage ) },
Defaultvalue = LanguageParameters[DefaultValue] { List.PositionOf( LanguageParameters[Language] , CalendarLanguage ) },
#"List of Dates" = List.Dates( StartDate, Duration.Days( EndDate - StartDate ) +1, #duration( 1, 0, 0, 0 ) ),
#"Converted to Table" = Table.FromList( #"List of Dates", Splitter.SplitByNothing(), type table[Date = Date.Type] ),
#"Insert Date Integer" = Table.AddColumn(#"Converted to Table", "Date Integer", each Number.From( Date.ToText( [Date], "yyyyMMdd" ) ) , Int64.Type ) ,
#"Insert Year" = Table.AddColumn(#"Insert Date Integer", "Year", each Date.Year([Date]), Int64.Type),
// Creates a dynamic year value called 'Current' that moves with the current date. Put this value in a slicer and it automatically switches to the Current period.
#"Add Year Default" = Table.AddColumn(#"Insert Year", "Year Default", each if Date.Year( Today ) = [Year] then Defaultvalue else Text.From( [Year] ), type text),
#"Insert YYYY-MM" = Table.AddColumn(#"Add Year Default", "YYYY-MM", each Date.ToText( [Date], "yyyy-MM"), type text),
#"Insert Month-Year" = Table.AddColumn(#"Insert YYYY-MM", "Month-Year", each Text.Proper( Date.ToText( [Date], "MMM yyyy", CultureCode ) ), type text),
#"Insert Month Number" = Table.AddColumn(#"Insert Month-Year", "Month Number", each Date.Month([Date]), Int64.Type),
#"Insert Month Name" = Table.AddColumn(#"Insert Month Number", "Month Name", each Text.Proper( Date.MonthName([Date], CultureCode ) ), type text),
#"Insert Month Name Short" = Table.AddColumn(#"Insert Month Name", "Month Name Short", each Text.Proper( Date.ToText( [Date] , "MMM", CultureCode ) ), type text),
// Creates a dynamic year value called 'Current' that moves with the current date. Put this value in a slicer and it automatically switches to the current period.
#"Add Month Name Default" = Table.AddColumn(#"Insert Month Name Short", "Month Name Default", each if Date.Month( Today ) = [Month Number] then Defaultvalue else [Month Name], type text ),
#"Insert Start of Month" = Table.AddColumn(#"Add Month Name Default", "Start of Month", each Date.StartOfMonth([Date]), type date),
#"Inserted End of Month" = Table.AddColumn(#"Insert Start of Month", "End of Month", each Date.EndOfMonth( [Date] ), type date),
#"Inserted Days in Month" = Table.AddColumn(#"Inserted End of Month", "Days in Month", each Date.DaysInMonth([Date]), Int64.Type),
#"Add ISO Week" = Table.AddColumn(#"Inserted Days in Month", "ISO Weeknumber", each let
CurrentThursday = Date.AddDays([Date], 3 - Date.DayOfWeek([Date], Day.Monday ) ),
YearCurrThursday = Date.Year( CurrentThursday ),
FirstThursdayOfYear = Date.AddDays(#date( YearCurrThursday,1,7),- Date.DayOfWeek(#date(YearCurrThursday,1,1), Day.Friday) ),
ISO_Week = Duration.Days( CurrentThursday - FirstThursdayOfYear) / 7 + 1
in ISO_Week, Int64.Type ),
#"Added Custom" = Table.AddColumn(#"Add ISO Week", "ISO W + Weeknumber", each "W" & Text.From( [ISO Weeknumber] ), type text ),
#"Add ISO Year" = Table.AddColumn(#"Added Custom", "ISO Year", each let
CurrentThursday = Date.AddDays([Date], 3 - Date.DayOfWeek([Date], Day.Monday ) ),
YearCurrThursday = Date.Year( CurrentThursday )
in YearCurrThursday, Int64.Type ),
#"Insert Start of Week" = Table.AddColumn(#"Add ISO Year", "Start of Week", each Date.StartOfWeek([Date], Day.Monday ), type date),
#"Insert Quarter Number" = Table.AddColumn(#"Insert Start of Week", "Quarter Number", each Date.QuarterOfYear([Date]), Int64.Type),
#"Added Quarter" = Table.AddColumn(#"Insert Quarter Number", "Quarter", each "Q" & Text.From( Date.QuarterOfYear([Date]) ), type text ),
#"Add Year-Quarter" = Table.AddColumn(#"Added Quarter", "Year-Quarter", each Text.From( Date.Year([Date]) ) & "-Q" & Text.From( Date.QuarterOfYear([Date]) ), type text ),
#"Insert Day Name" = Table.AddColumn(#"Add Year-Quarter", "Day Name", each Text.Proper( Date.DayOfWeekName([Date], CultureCode ) ), type text),
#"Insert Day Name Short" = Table.AddColumn( #"Insert Day Name", "Day Name Short", each Text.Proper( Date.ToText( [Date], "ddd", CultureCode ) ), type text),
#"Insert Day of Month Number" = Table.AddColumn(#"Insert Day Name Short", "Day of Month Number", each Date.Day([Date]), Int64.Type),
#"Insert Day of Week" = Table.AddColumn(#"Insert Day of Month Number", "Day of Week Number", each Date.DayOfWeek([Date]), Int64.Type),
#"Insert Day of Year" = Table.AddColumn(#"Insert Day of Week", "Day of Year Number", each Date.DayOfYear([Date]), Int64.Type),
#"Add Day Offset" = Table.AddColumn(#"Insert Day of Year", "Day Offset", each Number.From( Date.From( Today ) - [Date] ) , Int64.Type ),
#"Add Week Offset" = Table.AddColumn(#"Add Day Offset", "Week Offset", each ( Number.From( Date.StartOfWeek( [Date], Day.Monday) )- Number.From( Date.StartOfWeek( Today, Day.Monday ) ) ) / 7, Int64.Type ),
#"Add Month Offset" = Table.AddColumn(#"Add Week Offset", "Month Offset", each ([Year] - Date.Year( Today ) ) *12 + ( [Month Number] - Date.Month( Today ) ), Int64.Type ),
#"Add Quarter Offset" = Table.AddColumn(#"Add Month Offset", "Quarter Offset", each ( [Year] - Date.Year(Today) ) * 4 + Date.QuarterOfYear( [Date] ) - Date.QuarterOfYear( Today ), Int64.Type ),
#"Add Year Offset" = Table.AddColumn(#"Add Quarter Offset", "Year Offset", each [Year] - Date.Year(Today), Int64.Type ),
#"Insert Is Weekend" = Table.AddColumn(#"Add Year Offset", "Is Weekend", each if Date.DayOfWeek([Date], Day.Monday ) >= 5 then 1 else 0, Int64.Type ),
#"Insert Is Weekday" = Table.AddColumn(#"Insert Is Weekend", "Is Weekday", each if Date.DayOfWeek([Date], Day.Monday ) < 5 then 1 else 0, Int64.Type ),
#"Rename Columns to Language" = Table.RenameColumns(#"Insert Is Weekday", List.Zip( { List.Buffer( TranslateColumnNames[English] ), List.Buffer( Table.Column( TranslateColumnNames, CalendarLanguage ) ) } ), MissingField.Ignore )
in
#"Rename Columns to Language"
نتیجهگیری
حالا یک جدول تاریخ داری که میتواند به صورت داینامیک زبانهای مختلف را پشتیبانی کند. این ویژگی عالی، دادههای شما را برای همه قابل فهم و قابل استفاده میکند.
در این مقاله یاد گرفتی چگونه در Power Query یک جدول تاریخ بسازی که با استفاده از پارامتر زبان، کدهای فرهنگ (Culture Codes) و جدول ترجمه، بتواند زبان خود را به صورت پویا تغییر دهد.
اکنون میتوانی این جدول را در پروژههای خودت استفاده کنی و آن را با دیگران به اشتراک بگذاری تا آنها هم بتوانند زبان مورد علاقه خود را انتخاب کنند.
دیدگاهتان را بنویسید