أهم دوال M Code الباور كويري powerquery
### 🔧 أولاً: دوال الجداول (Table Functions)
| الدالة | بتعمل إيه؟ |
| `Table.SelectRows` | فلترة صفوف حسب شرط |
| `Table.AddColumn` | تضيف عمود جديد بحساب أو دالة |
| `Table.RemoveColumns` | تمسح أعمدة |
| `Table.TransformColumns` | تعدّل محتوى الأعمدة |
| `Table.Group` | Group By زي ما بتحب |
| `Table.Join` / `Table.NestedJoin` | تعمل Join بين جدولين |
| `Table.ExpandTableColumn` | تفرد أعمدة من جدول متداخل (nested) |
| `Table.Pivot` / `Table.Unpivot` | Pivot & Unpivot |
---
### 📜 دوال الليستات (List Functions)
| الدالة | بتعمل إيه؟ |
| `List.Transform` | تطبّق دالة على كل عنصر في List |
| `List.Select` | ترجع عناصر حسب شرط |
| `List.Sum` / `List.Average` | تجميع أو متوسط أو أقصى/أدنى |
| `List.Contains` | هل الليست فيها العنصر ده؟ |
| `List.Distinct` | تشيل القيم المكررة |
| `List.FirstN` / `List.LastN` | أول أو آخر كام عنصر |
| `List.Combine` | دمج أكتر من List في واحدة |
| `List.Zip` | تدمج أكتر من List بشكل متوازي (like tuples) |
---
### 🔁 دوال التكرار (Recursion / Loops)
| الدالة | بتعمل إيه؟ |
| `List.Generate` | أقوى Loop… تبني List بعقلك أنت |
| `List.Accumulate` | تعمل Fold (زي reduce) لتجميع القيم بخطوات |
---
### 🔤 دوال النصوص (Text Functions)
| الدالة | بتعمل إيه؟ |
| `Text.Contains` | هل النص فيه كلمة معيّنة؟ |
| `Text.StartsWith` | يبدأ بـ؟ |
| `Text.EndsWith` | ينتهي بـ؟ |
| `Text.Replace` | استبدال كلمات |
| `Text.Split` | تقطيع النص |
| `Text.Upper` / `Text.Lower` | تحويل إلى حروف كبيرة/صغيرة |
| `Text.Length` | طول النص |
-
### 📅 دوال التواريخ (Date/Time Functions)
| الدالة | بتعمل إيه؟ |
| `Date.From` | تحوّل القيمة إلى تاريخ |
| `Date.Year` / `Date.Month` / `Date.Day` | ترجع السنة/الشهر/اليوم |
| `Date.AddDays` | تزود/تخصم أيام |
| `DateTime.LocalNow` | الوقت الحالي |
---
### 🧠 دوال شرطية ومنطقية
| الدالة | بتعمل إيه؟ |
| `if ... then ... else` | شرطية كلاسيك |
| `try ... otherwise` | تحاول تشغّل الكود ولو فشل، ترجع بديل |
| `Record.FieldValues` | ترجع القيم من Record (زي صف معين) |
---
### ⚙️ دوال متقدمة ومجردة (Advanced)
| الدالة | بتعمل إيه؟ |
| `Record.ToTable` | تحوّل Record إلى Table |
| `Table.ToRecords` | تحوّل Table إلى List of Records |
| `Value.Is` | تتحقق من نوع القيمة |
| `Value.ReplaceType` | تغيّر نوع القيمة |
| `Expression.Evaluate` | تشغّل نص كأنه كود M |
---
### 🧨 اختصارات لازم تحفظها
* `each` = اختصار لـ function
* `_` = المتغير الافتراضي جوه `each`
* `let ... in` = بنية الكود في M Code
---
🗓️ دوال التواريخ (Date/Time Functions)
1️⃣ DateTime.LocalNow
& DateTimeZone.FixedUtcNow
✅ Syntax
DateTime.LocalNow()
DateTimeZone.FixedUtcNow()
🎯 الغرض
جلب التاريخ والوقت الحالي حسب المنطقة الزمنية (محلي أو UTC).
🧠 أقصى استفادة
💼 مثال
DateTime.LocalNow() ⟶ #datetime(2025, 6, 4, 15, 40, 00)
2️⃣ Date.Year
/ Date.Month
/ Date.Day
✅ Syntax
Date.Year(date as date) as number
Date.Month(date as date) as numberDate.Day(date as date) as number
🎯 الغرض
استخراج السنة أو الشهر أو اليوم من التاريخ.
🧠 أقصى استفادة
💼 مثال
Date.Month(#date(2025, 6, 4)) ⟶ 6
3️⃣ Date.AddDays
/ Date.AddMonths
/ Date.AddYears
✅ Syntax
Date.AddDays(date as date, numberOfDays as number) as date
🎯 الغرض
إضافة أو طرح عدد معين من الأيام أو الشهور أو السنوات.
🧠 أقصى استفادة
💼 مثال
Date.AddDays(#date(2025, 6, 4), 7) ⟶ #date(2025, 6, 11)
4️⃣ Date.DayOfWeek
✅ Syntax
Date.DayOfWeek(date as date, optional firstDayOfWeek as nullable number) as number
🎯 الغرض
يعيد رقم اليوم في الأسبوع (0 للاثنين افتراضيًا).
🧠 أقصى استفادة
💼 مثال
Date.DayOfWeek(#date(2025, 6, 4)) ⟶ 3 // يعني يوم الأربعاء
5️⃣ Date.FromText
✅ Syntax
Date.FromText(text as text) as date
🎯 الغرض
تحويل نص إلى قيمة تاريخ.
🧠 أقصى استفادة
💼 مثال
Date.FromText("2025-06-04") ⟶ #date(2025, 6, 4)
6️⃣ Date.ToText
✅ Syntax
Date.ToText(date as date, optional format as nullable text, optional culture as nullable text)
🎯 الغرض
تحويل التاريخ إلى نص بصيغة معينة.
🧠 أقصى استفادة
💼 مثال
Date.ToText(#date(2025, 6, 4), "dd/MM/yyyy") ⟶ "04/06/2025"
7️⃣ Duration.Days
/ Duration.Hours
✅ Syntax
Duration.Days(duration as duration) as number
Duration.Hours(duration as duration) as number
🎯 الغرض
تحويل الفرق بين تاريخين إلى عدد أيام أو ساعات.
🧠 أقصى استفادة
💼 مثال
Duration.Days(#date(2025,6,10) - #date(2025,6,4)) ⟶ 6
8️⃣ Date.IsInCurrentMonth
/ Date.IsInPreviousMonth
/ Date.IsInNextMonth
✅ Syntax
Date.IsInCurrentMonth(date as date) as logical
🎯 الغرض
التحقق إذا كان التاريخ ضمن الشهر الحالي أو السابق أو القادم.
🧠 أقصى استفادة
💼 مثال
Date.IsInCurrentMonth(DateTime.LocalNow()) ⟶ true
9️⃣ Date.StartOfMonth
/ Date.EndOfMonth
✅ Syntax
Date.StartOfMonth(date as date) as date
Date.EndOfMonth(date as date) as date
🎯 الغرض
جلب أول أو آخر يوم في الشهر من تاريخ معين.
🧠 أقصى استفادة
💼 مثال
Date.StartOfMonth(#date(2025, 6, 15)) ⟶ #date(2025, 6, 1)
1️⃣0️⃣ DateTimeZone.SwitchZone
✅ Syntax
DateTimeZone.SwitchZone(dateTimeZone as datetimezone, timezoneHours as number) as datetimezone
🎯 الغرض
تغيير المنطقة الزمنية للـ datetimezone.
🧠 أقصى استفادة
💼 مثال
DateTimeZone.SwitchZone(DateTimeZone.FixedUtcNow(), 2)
💥 List.Generate & List.Accumulate 💥
1️⃣ List.Generate
– التكرار المُتحكم فيه (Custom Loop)
✅ Syntax
List.Generate(
() => initialState, // القيمة المبدئيةeach condition, // شرط التوقفeach nextState, // طريقة التكرارeach optionalSelector // القيمة اللي هترجع (اختياري))
🎯 أقصى استفادة
💼 مثال 1: توليد قائمة أرقام من 1 إلى 10
List.Generate(
() => 1,each _ <= 10,each _ + 1)// ⟶ {1,2,3,4,5,6,7,8,9,10}
💼 مثال 2: قائمة مضاعفات الرقم 3 أقل من 30
List.Generate(
() => 3,each _ < 30,each _ + 3)// ⟶ {3,6,9,12,...,27}
💼 مثال 3: استخدام record في التكرار (بيانات مركبة)
List.Generate(
() => [i=1, val=100],each [i] <= 5,each [i=[i]+1, val=[val]*2],each [val])// ⟶ {100, 200, 400, 800, 1600}
🧠 السر هنا: ممكن تخزن أكثر من متغير داخل record، وتستخدمهم في كل خطوة!
2️⃣ List.Accumulate
– التجميع / الـ Fold
✅ Syntax
List.Accumulate(
list as list, // القائمة اللي هنمشي عليهاseed as any, // القيمة المبدئية(state, current) => newState)
🎯 أقصى استفادة
💼 مثال 1: جمع كل الأرقام
List.Accumulate({1,2,3,4,5}, 0, (state, current) => state + current)
// ⟶ 15
💼 مثال 2: ضرب كل العناصر
List.Accumulate({2,3,4}, 1, (s, c) => s * c)
// ⟶ 24
💼 مثال 3: دمج كلمات
List.Accumulate({"ش", "ب", "ت"}, "", (s, c) => s & c)
// ⟶ "شبت"
💼 مثال 4: Cumulative Sum
List.Accumulate({1,2,3}, {}, (state, current) =>
state & {if List.Count(state)=0 then current else current + List.Last(state)})// ⟶ {1,3,6}
👑 الفرق بينهم؟
List.Generate | List.Accumulate | |
---|---|---|
🔄 Loop style | انت بتتحكم في التكرار والشرط بنفسك | بتمشي على عناصر قائمة جاهزة |
🧱 Flexible logic | مرن جدًا – يشبه For أو While | يشبه Fold أو Reduce |
🛠️ Use case | توليد بيانات – استدعاء API – بناء مراحل | تجميع – ملخصات – cumulative ops |
⚠️ نصائح الملوك:
List.Generate
بيحتاج منك تكون فاهم لوجيك التكرار كويس.
List.Accumulate
أمان أكتر وسهل، لو عندك قائمة جاهزة.
List.Generate
مع Web.Contents.List.Generate
.1️⃣ دوال Record المتقدمة
الـ Record في Power Query هو عبارة عن مجموعة أزواج مفتاح-قيمة { [Key1 = Value1, Key2 = Value2, ...] }
، زي dictionary في لغات برمجة تانية.
أهم الدوال:
🔹 Record.Field
Syntax
Record.Field(record as record, fieldName as text) as any
الغرض
يجيب قيمة الحقل (العمود) اللي اسمه fieldName
من الـ record.
استخدام عملي
let
r = [Name="Ali", Age=30],age = Record.Field(r, "Age") // 30inage
🔹 Record.FieldNames
Syntax
Record.FieldNames(record as record) as list
الغرض
ترجع كل أسماء الحقول (keys) الموجودة داخل record.
استخدام عملي
Record.FieldNames([Name="Ali", Age=30]) // {"Name", "Age"}
🔹 Record.AddField
Syntax
Record.AddField(record as record, fieldName as text, value as any) as record
الغرض
تضيف حقل جديد للـ record أو تحدث القيمة لو الحقل موجود.
استخدام عملي
Record.AddField([Name="Ali"], "Age", 30)
// [Name="Ali", Age=30]
🔹 Record.RemoveFields
Syntax
Record.RemoveFields(record as record, fields as list) as record
الغرض
تحذف حقول معينة من الـ record.
استخدام عملي
Record.RemoveFields([Name="Ali", Age=30], {"Age"})
// [Name="Ali"]
🔹 Record.TransformFields
Syntax
Record.TransformFields(record as record, transformOperations as list) as record
الغرض
تطبق تحويل معين على حقول محددة.
استخدام عملي
Record.TransformFields([Name="Ali", Age=30], {{"Age", each _ + 1}})
// [Name="Ali", Age=31]
2️⃣ دوال Table المتقدمة
🔹 Table.TransformColumns
Syntax
Table.TransformColumns(table as table, transformations as list, optional defaultTransformation as nullable function) as table
الغرض
تطبيق دالة تحويل على أعمدة محددة.
استخدام عملي
Table.TransformColumns(
Table.FromRecords({[Name="Ali", Age=30], [Name="Sara", Age=25]}),{{"Age", each _ + 1}})// هيزود عمر كل شخص بواحد
🔹 Table.AddColumn
Syntax
Table.AddColumn(table as table, newColumnName as text, columnGenerator as function, optional type as nullable type) as table
الغرض
إضافة عمود جديد بناءً على دالة معينة.
استخدام عملي
Table.AddColumn(
Table.FromRecords({[Name="Ali", Age=30], [Name="Sara", Age=25]}),"IsAdult",each if [Age] >= 18 then true else false)
🔹 Table.SelectRows
Syntax
Table.SelectRows(table as table, condition as function) as table
الغرض
تصفية الصفوف بناءً على شرط معين.
استخدام عملي
Table.SelectRows(
Table.FromRecords({[Name="Ali", Age=30], [Name="Sara", Age=17]}),each [Age] >= 18)// هيرجع بس الصفوف اللي العمر >= 18
🔹 Table.Join
Syntax
Table.Join(leftTable as table, leftKey as any, rightTable as table, rightKey as any, joinKind as nullable number) as table
الغرض
دمج جدولين بناءً على مفتاح مشترك (زي الـ SQL JOIN).
🔹 Table.Group
Syntax
Table.Group(table as table, keys as list, aggregatedColumns as list) as table
الغرض
تجميع البيانات (group by) زي جمع، حساب متوسط، عدد، وغيرهم.
Record.FieldNames
و Record.TransformFields
لأنهم سهلين في تعديل بيانات متغيرة البنية.Table.TransformColumns
و Table.AddColumn
.Table.Join
و Table.SelectRows
هي سلاحك.حاضر يا نجم، نخش على البند 5 اللي هو المفاهيم المتقدمة في لغة M — هنا اللعبة بتختلف، لازم تكون مستعد تحفر أعمق لأن الحاجات دي هي اللي بتفرق بين حد "بيعرف يشتغل" وحد "محترف بيلعبها صح".
5️⃣ المفاهيم المتقدمة في M Language
1. Recursion (التكرار الذاتي)
مثال صغير: حساب مضروب رقم (Factorial) باستخدام Recursion
let
Factorial = (n as number) as number =>if n = 0 then 1 else n * @Factorial(n - 1)inFactorial(5) // النتيجة: 120
تلاحظ علامة @
دي بتعني الرجوع لنفس الدالة داخل تعريفها (وهي ضرورية في M).
2. Lazy Evaluation (التقييم الكسول)
Table.Buffer
لو عايز تحتفظ بنسخة من جدول وتمنع إعادة الحساب.3. Error Handling (التعامل مع الأخطاء)
try ... otherwise
مثال:
let
result = try 1 / 0 otherwise "Infinity or Error"inresult // النتيجة: "Infinity or Error"
4. Parameterized Queries (الدوال ذات المعاملات)
مثال:
let
GetYearDates = (year as number) as list =>letstartDate = #date(year, 1, 1),endDate = #date(year, 12, 31),dates = List.Generate(() => startDate,each _ <= endDate,each Date.AddDays(_, 1))indatesinGetYearDates
تقدر تستدعي GetYearDates(2023)
وهيجيب لك كل تواريخ سنة 2023.
5. Custom Types (أنواع مخصصة)
6. Let Expressions (عبارات let المتداخلة)
let
جوا let
عشان تفصل خطوات الكود وتنظمه.7. Function Composition (تركيب الدوال)
8. Record and Table Manipulation Dynamically
Record.FieldNames
و Table.ColumnNames
.دوال Web.Contents لجلب البيانات من APIs
1. الأساس: Web.Contents
Syntax:
Web.Contents(url as text, optional options as nullable record) as binary
url: رابط الـ API أو الصفحة اللي عايز تجيب منها الداتا.options: record اختياري تقدر من خلاله تضبط headers، query parameters، authentication، والـ timeout وغيره.
Web.Contents(url as text, optional options as nullable record) as binary
2. إزاي تشتغل؟
Web.Contents
بترجع binary data (يعني بيانات خام)، فغالبًا بعد كده هتستخدم دوال تانية لتحويل الباينري لنص أو JSON أو XML حسب نوع البيانات.
3. أمثلة عملية
مثال 1: جلب JSON من API
لو عندك API بيرجع JSON، هتستخدم Json.Document
لتحويل الباينري إلى جدول أو قائمة.
let
Source = Web.Contents("https://jsonplaceholder.typicode.com/posts"),JsonData = Json.Document(Source)inJsonData
مثال 2: إرسال Header (Authorization مثلاً)
لو الـ API محتاج توكن أو هيدر معين، تستخدم الـ options:
let
url = "https://api.example.com/data",Source = Web.Contents(url,[Headers = [#"Authorization" = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."]]),JsonData = Json.Document(Source)inJsonData
مثال 3: إضافة Query Parameters
لو الـ API محتاج parameters في الرابط مش في الـ URL مباشر، تستخدم Query
:
let
url = "https://api.example.com/data",Source = Web.Contents(url,[Query = [param1 = "value1",param2 = "value2"]]),JsonData = Json.Document(Source)inJsonData
4. نصائح شبتية:
دايمًا خلي بالك من الـ rate limits للـ API — يعني عدد مرات الطلب المسموح بيها. لو نزلت جامد هيتقفلوا عليك.
لو الـ API بيحتاج Authentication معقد (OAuth مثلاً)، ساعات بتحتاج تعامل خارجي أو حلول متقدمة.لما تجيب بيانات كبيرة، استغل Table.Buffer أو تخزين مؤقت لتسريع العمليات.دايمًا استخدم الـ try...otherwise مع Web.Contents عشان تتعامل مع الأخطاء زي انقطاع الإنترنت أو الـ 404.
5. مثال عملي (تطبيق كامل)
نفترض إنك عايز تجيب بيانات من API مجاني للطقس، تحللها وتطلع جدول بسيط:
let
url = "https://api.openweathermap.org/data/2.5/weather",Source = Web.Contents(url,[Query = [q = "Cairo",appid = "your_api_key",units = "metric"]]),JsonData = Json.Document(Source),main = JsonData[main],result = [Temperature = main[temp], Humidity = main[humidity]]inresult
ليست هناك تعليقات:
إرسال تعليق