تابعنا

شاهد شروحات ودروس في الاكسل Excel Powerquery

الأربعاء، 4 يونيو 2025

أهم دوال M Code الباور كويري powerquery

 


أهم دوال 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

---

  ## 1️⃣ `Table.SelectRows`

### ✅ **Syntax**

```m
Table.SelectRows(table as table, condition as function) as table
```

### 🎯 **الغرض**

فلترة الجدول عن طريق اختيار صفوف تنطبق عليها شروط معينة.

### 🧠 **أقصى استفادة** * اختيار بيانات من فترة معينة. * تصفية بيانات بناءً على شرط ديناميكي (زي اختيار أكبر من، يساوي، يحتوي على...). * تحضير البيانات للتحليل. ### 💼 **أمثلة تطبيقية** ```m Table.SelectRows(MyTable, each [Amount] > 1000) ``` ✅ كل الصفوف اللي فيها Amount أكبر من 1000 ```m Table.SelectRows(Employees, each Text.Contains([Department], "IT")) ``` ✅ صفوف قسم تكنولوجيا المعلومات بس. --- ## 2️⃣ `Table.AddColumn` ### ✅ **Syntax** ```m Table.AddColumn(table as table, newColumnName as text, columnGenerator as function, optional columnType as nullable type) as table ``` ### 🎯 **الغرض** إضافة عمود جديد بحساب معين (زي نسبة، مجموع، صيغة). ### 🧠 **أقصى استفادة** * توليد أعمدة مشتقة (مثلاً: سعر \* كمية). * حسابات حسب شروط. * استخراج معلومات من أعمدة موجودة. ### 💼 **مثال تطبيقي** ```m Table.AddColumn(Sales, "Total", each [Price] * [Quantity], type number) ``` ✅ يحسب عمود جديد فيه إجمالي السعر. --- ## 3️⃣ `Table.TransformColumns` ### ✅ **Syntax** ```m Table.TransformColumns(table as table, transformOperations as list, optional missingField as nullable number) as table ``` ### 🎯 **الغرض** تعديل قيم الأعمدة (زي تحويلها لتواريخ، أرقام، أو حسابات جديدة). ### 🧠 **أقصى استفادة** * تصحيح البيانات. * تحويل أنواع الأعمدة. * تنظيف البيانات من صيغ خاطئة. ### 💼 **مثال تطبيقي** ```m Table.TransformColumns(MyTable, {{"Amount", each Number.FromText(_), type number}}) ``` ✅ تحويل عمود "Amount" من نص إلى رقم. --- ## 4️⃣ `Table.RemoveColumns` ### ✅ **Syntax** ```m Table.RemoveColumns(table as table, columns as list) as table ``` ### 🎯 **الغرض** حذف أعمدة غير ضرورية. ### 🧠 **أقصى استفادة** * تقليل حجم الجدول. * حذف بيانات حساسة. * تنظيف الجدول قبل التحليل أو التحميل. ### 💼 **مثال تطبيقي** ```m Table.RemoveColumns(MyTable, {"Password", "Notes"}) ``` ✅ حذف أعمدة الباسوورد والملاحظات. --- ## 5️⃣ `Table.Group` ### ✅ **Syntax** ```m Table.Group(table as table, keys as list, aggregatedColumns as list) as table ``` ### 🎯 **الغرض** تجميع الصفوف حسب مفتاح (Group By) وتنفيذ عمليات مثل sum، average، count… ### 🧠 **أقصى استفادة** * تجميع مبيعات حسب العميل. * تجميع مصروفات حسب الشهر. * تحليل البيانات الكلية حسب أي فئة. ### 💼 **مثال تطبيقي** ```m Table.Group(Sales, {"Customer"}, {{"Total Sales", each List.Sum([Amount]), type number}}) ``` ✅ مجموع المبيعات لكل عميل. --- ## 6️⃣ `Table.Join` ### ✅ **Syntax** ```m Table.Join(table1 as table, key1 as any, table2 as table, key2 as any, newColumnName as text, optional joinKind as nullable number) as table ``` ### 🎯 **الغرض** دمج جدولين بناءً على مفتاح مشترك (زي VLOOKUP في Excel). ### 🧠 **أقصى استفادة** * دمج بيانات المبيعات مع بيانات العملاء. * ربط جداول ببيانات من مصادر مختلفة. ### 💼 **مثال تطبيقي** ```m Table.Join(Sales, "CustomerID", Customers, "ID", "CustomerData", JoinKind.Inner) ``` ✅ يعمل Inner Join بين جدولين حسب الـ ID. --- ## 7️⃣ `Table.ExpandTableColumn` ### ✅ **Syntax** ```m Table.ExpandTableColumn(table as table, column as text, columnNames as list, optional newColumnNames as list) as table ``` ### 🎯 **الغرض** تفكيك الأعمدة المدمجة (Nested Tables) إلى أعمدة عادية. ### 🧠 **أقصى استفادة** * تفريغ نتيجة Merge. * فك بيانات Grouped. * التعامل مع بيانات متعددة الأعمدة داخل خلية. ### 💼 **مثال تطبيقي** ```m Table.ExpandTableColumn(MergedTable, "CustomerData", {"Name", "Phone"}) ``` ✅ يفرد أعمدة Name وPhone من عمود مجمّع.
---



## 🔢 دوال القوائم (List Functions)

---

## 1️⃣ `List.Transform`

### ✅ **Syntax**

```m
List.Transform(list as list, transform as function) as list
```

### 🎯 **الغرض**

تطبيق دالة معينة على كل عنصر في الـ list.

### 🧠 **أقصى استفادة**

* تحويل بيانات من شكل لآخر (مثلاً نص لأرقام، تواريخ…).
* تعديل القيم كلها دفعة واحدة.
* استخدامها داخل `Table.TransformColumns`.

### 💼 **مثال تطبيقي**

```m
List.Transform({1, 2, 3}, each _ * 10)
```

⬅️ النتيجة: `{10, 20, 30}`

---

## 2️⃣ `List.Select`

### ✅ **Syntax**

```m
List.Select(list as list, selection as function) as list
```

### 🎯 **الغرض**

اختيار العناصر اللي تحقق شرط معين من الـ list.

### 🧠 **أقصى استفادة**

* تصفية قائمة بأرقام موجبة فقط، أو قيم معينة.
* مفيدة في Grouping أو Validation.

### 💼 **مثال تطبيقي**

```m
List.Select({1, -3, 5, -2}, each _ > 0)
```

⬅️ النتيجة: `{1, 5}`

---

## 3️⃣ `List.Sum` / `List.Average` / `List.Max` / `List.Min`

### ✅ **Syntax**

```m
List.Sum(list as list) as number
List.Average(list as list) as number
```

### 🎯 **الغرض**

حساب القيم الإجمالية أو المتوسطة من الـ list.

### 🧠 **أقصى استفادة**

* تستخدم كتير في Table.Group.
* تلخيص البيانات الرقمية داخل تجميع أو تحليل.

### 💼 **مثال تطبيقي**

```m
List.Sum({10, 20, 30})
```

⬅️ النتيجة: `60`

---

## 4️⃣ `List.Contains`

### ✅ **Syntax**

```m
List.Contains(list as list, value as any, optional equationCriteria as any) as logical
```

### 🎯 **الغرض**

يتحقق إذا كانت القيمة موجودة داخل القائمة.

### 🧠 **أقصى استفادة**

* تستخدم في فلترة صفوف: هل العمود يحتوي على قيمة من مجموعة محددة؟
* تشبه `IN (...)` في SQL.

### 💼 **مثال تطبيقي**

```m
List.Contains({"A", "B", "C"}, "B")
```

⬅️ النتيجة: `true`

---

## 5️⃣ `List.Distinct`

### ✅ **Syntax**

```m
List.Distinct(list as list) as list
```

### 🎯 **الغرض**

إزالة القيم المتكررة.

### 🧠 **أقصى استفادة**

* تجهيز قائمة بقيم فريدة فقط.
* التحضير لـ dropdown lists أو Grouping.

### 💼 **مثال تطبيقي**

```m
List.Distinct({"A", "B", "A", "C"})
```

⬅️ النتيجة: `{ "A", "B", "C" }`

---

## 6️⃣ `List.FirstN` / `List.LastN`

### ✅ **Syntax**

```m
List.FirstN(list as list, count as number) as list
List.LastN(list as list, count as number) as list
```

### 🎯 **الغرض**

يرجع أول أو آخر عدد N من العناصر.

### 🧠 **أقصى استفادة**

* لما تحب تختار القيم الأولى أو الأخيرة.
* تحليل بيانات زمنية.

### 💼 **مثال تطبيقي**

```m
List.FirstN({10, 20, 30, 40}, 2)
```

⬅️ النتيجة: `{10, 20}`

---

## 7️⃣ `List.Combine`

### ✅ **Syntax**

```m
List.Combine(lists as list) as list
```

### 🎯 **الغرض**

دمج أكثر من List في واحدة.

### 🧠 **أقصى استفادة**

* تهيئة بيانات مجمعة من مصادر متعددة.
* استخدامه قبل Group أو مقارنة.

### 💼 **مثال تطبيقي**

```m
List.Combine({{1, 2}, {3, 4}})
```

⬅️ النتيجة: `{1, 2, 3, 4}`

---

## 8️⃣ `List.Zip`

### ✅ **Syntax**

```m
List.Zip(lists as list) as list
```

### 🎯 **الغرض**

دمج عناصر متعددة من Lists مختلفة في شكل Tuple.

### 🧠 **أقصى استفادة**

* تستخدم في دمج عناصر من أعمدة مختلفة في صف واحد.
* مفيدة جدًا في بناء جداول معقدة أو توليد بيانات مخصصة.

### 💼 **مثال تطبيقي**

```m
List.Zip({{1, 2}, {"A", "B"}})
```

⬅️ النتيجة: `{ {1, "A"}, {2, "B"} }`

---


## 📝 دوال النصوص (Text Functions)

بتديك سيطرة مطلقة على الـ strings! سواء تنضيف، استخراج، تحويل، أو حتى تعذيب البيانات 😂
يلا بينا نغوص في أعماق النصوص:

---

## 1️⃣ `Text.Upper` / `Text.Lower`

### ✅ **Syntax**

```m
Text.Upper(text as nullable text) as nullable text  
Text.Lower(text as nullable text) as nullable text
```

### 🎯 **الغرض**

تحويل النص لحروف كابيتال أو سمول.

### 🧠 **أقصى استفادة**

* توحيد البيانات قبل الفلترة أو المقارنة.
* تجهيز النصوص للـ Matching.

### 💼 **مثال**

```m
Text.Upper("excel") ⟶ "EXCEL"  
Text.Lower("Power") ⟶ "power"
```

---

## 2️⃣ `Text.Trim`

### ✅ **Syntax**

```m
Text.Trim(text as nullable text, optional trim as any) as nullable text
```

### 🎯 **الغرض**

يحذف الفراغات من بداية ونهاية النص.

### 🧠 **أقصى استفادة**

* تنضيف الأعمدة النصية.
* تجهيز البيانات للتطابق أو الدمج.

### 💼 **مثال**

```m
Text.Trim("  hello  ") ⟶ "hello"
```

---

## 3️⃣ `Text.Length`

### ✅ **Syntax**

```m
Text.Length(text as nullable text) as number
```

### 🎯 **الغرض**

يرجع عدد الحروف داخل النص.

### 🧠 **أقصى استفادة**

* التحقق من أكواد معينة (مثلاً كود مكون من 10 أرقام).
* فرز أو تصفية حسب الطول.

### 💼 **مثال**

```m
Text.Length("hello") ⟶ 5
```

---

## 4️⃣ `Text.Start` / `Text.End`

### ✅ **Syntax**

```m
Text.Start(text as nullable text, count as number)  
Text.End(text as nullable text, count as number)
```

### 🎯 **الغرض**

استخراج عدد معين من الحروف من أول أو آخر النص.

### 🧠 **أقصى استفادة**

* استخراج أكواد أو تواريخ مخفية.
* تقطيع النصوص المدمجة.

### 💼 **مثال**

```m
Text.Start("AB12345", 2) ⟶ "AB"  
Text.End("AB12345", 3) ⟶ "345"
```

---

## 5️⃣ `Text.Middle`

### ✅ **Syntax**

```m
Text.Middle(text as nullable text, start as number, optional length as nullable number)
```

### 🎯 **الغرض**

استخراج جزء معين من النص، بدءًا من موقع معين.

### 🧠 **أقصى استفادة**

* تحليل النصوص المركبة.
* استخراج أجزاء بينية.

### 💼 **مثال**

```m
Text.Middle("INV2023-001", 3, 4) ⟶ "2023"
```

---

## 6️⃣ `Text.Replace`

### ✅ **Syntax**

```m
Text.Replace(text as nullable text, old as text, new as text)
```

### 🎯 **الغرض**

استبدال جزء من النص بقيمة أخرى.

### 🧠 **أقصى استفادة**

* تصحيح البيانات.
* توحيد صيغ الأكواد.
* إزالة رموز أو إضافتها.

### 💼 **مثال**

```m
Text.Replace("A/B/C", "/", "-") ⟶ "A-B-C"
```

---

## 7️⃣ `Text.Contains`

### ✅ **Syntax**

```m
Text.Contains(text as nullable text, substring as text, optional comparer as nullable function)
```

### 🎯 **الغرض**

يتحقق إذا كان النص يحتوي على جزء معين.

### 🧠 **أقصى استفادة**

* فلترة أعمدة تحتوي على كلمات معينة.
* تحقق من البريد أو التصنيفات.

### 💼 **مثال**

```m
Text.Contains("accounting is fun", "fun") ⟶ true
```

---

## 8️⃣ `Text.Split`

### ✅ **Syntax**

```m
Text.Split(text as nullable text, separator as text) as list
```

### 🎯 **الغرض**

يفصل النص إلى قائمة حسب الفاصل.

### 🧠 **أقصى استفادة**

* تحليل الأعمدة المدمجة.
* تحويل بيانات CSV داخل الخلايا.

### 💼 **مثال**

```m
Text.Split("Jan-Feb-Mar", "-") ⟶ {"Jan", "Feb", "Mar"}
```

---

## 9️⃣ `Text.Combine`

### ✅ **Syntax**

```m
Text.Combine(list as list, optional separator as nullable text) as text
```

### 🎯 **الغرض**

دمج قائمة نصوص إلى نص واحد.

### 🧠 **أقصى استفادة**

* تكوين جمل، عناوين، أكواد ديناميكية.
* توليد تقارير مخصصة.

### 💼 **مثال**

```m
Text.Combine({"A", "B", "C"}, "-") ⟶ "A-B-C"
```

---

## 1️⃣0️⃣ `Text.PadStart` / `Text.PadEnd`

### ✅ **Syntax**

```m
Text.PadStart(text as nullable text, length as number, optional character as nullable text)  
Text.PadEnd(text as nullable text, length as number, optional character as nullable text)
```

### 🎯 **الغرض**

إضافة حروف في البداية أو النهاية للوصول لطول معين.

### 🧠 **أقصى استفادة**

* تنسيق الأكواد والأرقام.
* تجهيز بيانات لتصدير موحد.

### 💼 **مثال**

```m
Text.PadStart("7", 3, "0") ⟶ "007"
```



🗓️ دوال التواريخ (Date/Time Functions)


1️⃣ DateTime.LocalNow & DateTimeZone.FixedUtcNow

Syntax

DateTime.LocalNow()
DateTimeZone.FixedUtcNow()

🎯 الغرض

جلب التاريخ والوقت الحالي حسب المنطقة الزمنية (محلي أو UTC).

🧠 أقصى استفادة

Timestamp لكل عملية تحديث.
تتبع متى آخر مرة اتحدث فيها الـ query.

💼 مثال

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 number
Date.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)

🎯 الغرض

تحويل التاريخ إلى نص بصيغة معينة.

🧠 أقصى استفادة

عمل Export بصيغ مفهومة للناس.
توحيد صيغة التاريخ (dd/MM/yyyy مثلاً).

💼 مثال

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

🎯 الغرض

التحقق إذا كان التاريخ ضمن الشهر الحالي أو السابق أو القادم.

🧠 أقصى استفادة

فلترة تقارير ديناميكية.
تقارير دورية (monthly dashboards).

💼 مثال

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)

🚨 معلومة Bonus
لو بتتعامل مع أوقات بدون تواريخ، استخدم:

Time.From
Time.ToText
Time.Hour
وكلها بنفس منطق دوال التواريخ.


💥 List.Generate & List.Accumulate 💥

الاتنين دول بيفتحوا باب الـ looping في عالم Power Query — حاجة مش بتتعمل بسهولة غير بيهم.
تعال نبدأ بالوحش الأول:


1️⃣ List.Generate – التكرار المُتحكم فيه (Custom Loop)


Syntax

List.Generate(
() => initialState, // القيمة المبدئية
each condition, // شرط التوقف
each nextState, // طريقة التكرار
each optionalSelector // القيمة اللي هترجع (اختياري)
)

🎯 أقصى استفادة

تكرار لحد ما شرط يتحقق.
توليد Lists حسب لوجيك معين (مش بس Range).
بناء تقاويم، أقساط، تواريخ، صفحات API، وغيرهم.

💼 مثال 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
)

🎯 أقصى استفادة

تجميع أي قيمة من عناصر قائمة (sum, multiply, concatenate...)
تنفيذ عمليات حسابية مركبة.
حساب cumulative sums أو aggregate قيم داخل loop.

💼 مثال 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 أمان أكتر وسهل، لو عندك قائمة جاهزة.
لو انت بتجمع بيانات متعددة من API، استخدم List.Generate مع Web.Contents.
لو عايز تتعلم recursion من الآخر... ابدأ بـ 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") // 30
in
age

🔹 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 هو هيكل البيانات الأساسي اللي بتتعامل معاه معظم الوقت.
خليني أديك أهم الدوال اللي بتديك تحكم معقد، سواء تعديل، دمج، فلترة، أو حتى التعامل مع أعمدة معقدة.


🔹 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 (التكرار الذاتي)

ببساطة، الدالة بتنادي نفسها داخل تنفيذها.
تستخدم لما يكون عندك مشكلة تتكرر على نفس النوع من البيانات، زي التعامل مع قوائم متداخلة (Nested Lists) أو بناء تسلسل متكرر.
أهم حاجة: لازم يكون عندك شرط وقف (Base Case) عشان ماتدخلش في حلقة لانهائية.

مثال صغير: حساب مضروب رقم (Factorial) باستخدام Recursion

let
Factorial = (n as number) as number =>
if n = 0 then 1 else n * @Factorial(n - 1)
in
Factorial(5) // النتيجة: 120

تلاحظ علامة @ دي بتعني الرجوع لنفس الدالة داخل تعريفها (وهي ضرورية في M).



2. Lazy Evaluation (التقييم الكسول)

التعبيرات في M ما بتتنفذش إلا لما النتيجة دي مطلوبة فعلًا.
يعني لو كتبت دالة أو تعبير كبير، لكن ما استدعيتش النتيجة، الكود مش هيتنفذ.
ده بيحسن الأداء، خصوصًا مع الجداول الكبيرة، بس لازم تعرف متى تستخدم Table.Buffer لو عايز تحتفظ بنسخة من جدول وتمنع إعادة الحساب.

3. Error Handling (التعامل مع الأخطاء)

بدل ما الكود يتكسر لما يحصل خطأ (زي محاولة قسمة على صفر أو وصول لحقل مش موجود)، تقدر تستخدم try ... otherwise
هيساعدك تلتقط الخطأ وتدي بديل أو تعامل خاص.

مثال:

let
result = try 1 / 0 otherwise "Infinity or Error"
in
result // النتيجة: "Infinity or Error"

4. Parameterized Queries (الدوال ذات المعاملات)

تقدر تبني دوال بتاخد معاملات (parameters) بدل من شغل ثابت.
ده بيدي مرونة عالية في التعامل مع بيانات مختلفة بنفس الدالة.

مثال:

let
GetYearDates = (year as number) as list =>
let
startDate = #date(year, 1, 1),
endDate = #date(year, 12, 31),
dates = List.Generate(
() => startDate,
each _ <= endDate,
each Date.AddDays(_, 1)
)
in
dates
in
GetYearDates

تقدر تستدعي GetYearDates(2023) وهيجيب لك كل تواريخ سنة 2023.


5. Custom Types (أنواع مخصصة)

تقدر تعرف أنواع بيانات خاصة لو حبيت تضبط شكل الداتا بشكل صارم.
غالبًا تستخدم في مشاريع كبيرة لتحكم دقيق.

6. Let Expressions (عبارات let المتداخلة)

ممكن تحط let جوا let عشان تفصل خطوات الكود وتنظمه.
بيساعد على القراءة والصيانة خصوصًا لو عندك كود معقد.

7. Function Composition (تركيب الدوال)

بناء دوال بتعتمد على دوال تانية.
مهم لو عايز تبني حلول modular قابلة لإعادة الاستخدام.

8. Record and Table Manipulation Dynamically

تقدر تبني دوال تتعامل مع حقول مش معروفة مسبقًا (dynamic fields) باستخدام دوال زي 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 وغيره.

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)
in
JsonData

مثال 2: إرسال Header (Authorization مثلاً)

لو الـ API محتاج توكن أو هيدر معين، تستخدم الـ options:

let
url = "https://api.example.com/data",
Source = Web.Contents(
url,
[
Headers = [
#"Authorization" = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
]
]
),
JsonData = Json.Document(Source)
in
JsonData

مثال 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)
in
JsonData

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]]
in
result














ليست هناك تعليقات:

إرسال تعليق