# أكواد بناء لوحة متابعة ملفات الإدارات التعليمية — اتصال مباشر بـ SharePoint

**موقعك:** `https://saudimoe.sharepoint.com/sites/L-center` · المكتبة: `Shared Documents`
**الطريقة:** Power BI Desktop ← Get Data ← **Blank Query** ← **Advanced Editor** ← الصق ← غيّر اسم الاستعلام. كرّر لكل استعلام، ثم Close & Apply، ثم أضف المقاييس، ثم Save As بصيغة pbix وارفعه.

---

## الاستعلام 1: «الملفات» — يقرأ ملفاتك الحيّة من SharePoint مباشرة

```
let
    SiteURL = "https://saudimoe.sharepoint.com/sites/L-center",
    Source = SharePoint.Files(SiteURL, [ApiVersion = 15]),
    Docs = Table.SelectRows(Source, each Text.Contains([Folder Path], "/Shared Documents/")),
    AddRel = Table.AddColumn(Docs, "نسبي", each Text.AfterDelimiter([Folder Path], "/Shared Documents/"), type text),
    AddAdmin = Table.AddColumn(AddRel, "الإدارة", each Text.BeforeDelimiter([نسبي], "/"), type text),
    KeepAdmins = Table.SelectRows(AddAdmin, each Text.StartsWith([الإدارة], "الإدارة العامة للتعليم")),
    AddRest = Table.AddColumn(KeepAdmins, "بقية", each Text.AfterDelimiter([نسبي], "/"), type text),
    AddFolder = Table.AddColumn(AddRest, "المجلد الرئيسي", each
        let f = Text.BeforeDelimiter([بقية], "/")
        in  if [بقية] = "" then "المجلد الرئيسي للإدارة"
            else if List.Contains({"التقارير","التمارين الفرضية","الخطط"}, f) then f
            else "مجلدات أخرى", type text),
    AddSub = Table.AddColumn(AddFolder, "المجلد الفرعي", each Text.TrimEnd(Text.AfterDelimiter([بقية], "/"), "/"), type text),
    Renamed = Table.RenameColumns(AddSub, {{"Name","اسم الملف"}, {"Date modified","تاريخ التعديل"}}),
    Result = Table.SelectColumns(Renamed, {"اسم الملف","الإدارة","المجلد الرئيسي","المجلد الفرعي","تاريخ التعديل"})
in
    Result
```

> عند أول تشغيل سيطلب Power BI تسجيل الدخول: اختر **Organizational account** وسجّل بحساب الوزارة.
> العد يشمل المجلدات الفرعية تلقائيًا. الملفات خارج المجلدات الثلاثة (مثل المخاطر/التدريب/الالتزام) تُحسب ضمن «مجلدات أخرى».

## الاستعلام 2: «الإدارات» — يضمن ظهور الإدارات الفارغة بالأحمر

```
let
    Source = #table(type table [الإدارة = text], {
        {"الإدارة العامة للتعليم بمنطقة الرياض"},
        {"الإدارة العامة للتعليم بمنطقة مكة المكرمة"},
        {"الإدارة العامة للتعليم بمحافظة جدة"},
        {"الإدارة العامة للتعليم بمحافظة الطائف"},
        {"الإدارة العامة للتعليم بمنطقة المدينة المنورة"},
        {"الإدارة العامة للتعليم بالمنطقة الشرقية"},
        {"الإدارة العامة للتعليم بمحافظة الأحساء"},
        {"الإدارة العامة للتعليم بمنطقة القصيم"},
        {"الإدارة العامة للتعليم بمنطقة عسير"},
        {"الإدارة العامة للتعليم بمنطقة تبوك"},
        {"الإدارة العامة للتعليم بمنطقة حائل"},
        {"الإدارة العامة للتعليم بمنطقة الحدود الشمالية"},
        {"الإدارة العامة للتعليم بمنطقة جازان"},
        {"الإدارة العامة للتعليم بمنطقة نجران"},
        {"الإدارة العامة للتعليم بمنطقة الباحة"},
        {"الإدارة العامة للتعليم بمنطقة الجوف"}
    })
in
    Source
```
بعد التحميل: Model view ← اربط **الإدارات[الإدارة] ← الملفات[الإدارة]** (واحد إلى متعدد).

## الاستعلام 3: «المستهدفات» — المعيار المستقل لكل مجلد

```
let
    Source = #table(type table [المجلد = text, المستهدف = Int64.Type], {
        {"التقارير", 2},
        {"التمارين الفرضية", 3},
        {"الخطط", 2}
    })
in
    Source
```
> **القاعدة:** أحمر = 0 · أصفر = أقل من المستهدف · أخضر = المستهدف فأكثر. لا تربط هذا الجدول بأي علاقة.

---

## مقاييس DAX (Modeling ← New Measure — أنشئها داخل جدول «الملفات»)

```
عدد الملفات = COUNTROWS ( الملفات )
```
```
المستهدف =
LOOKUPVALUE ( المستهدفات[المستهدف], المستهدفات[المجلد], SELECTEDVALUE ( الملفات[المجلد الرئيسي] ) )
```
```
الحالة =
VAR n = COUNTROWS ( الملفات ) + 0
VAR t = [المستهدف]
RETURN IF ( NOT ISBLANK ( t ), SWITCH ( TRUE (), n = 0, "أحمر", n >= t, "أخضر", "أصفر" ) )
```
```
لون الحالة =
SWITCH ( [الحالة], "أحمر", "#E74856", "أصفر", "#E8A33D", "أخضر", "#2E9E5B" )
```
```
مجلدات فارغة =
COUNTROWS (
    FILTER (
        CROSSJOIN ( ALL ( الإدارات[الإدارة] ), ALL ( المستهدفات[المجلد] ) ),
        CALCULATE ( COUNTROWS ( الملفات ), TREATAS ( { المستهدفات[المجلد] }, الملفات[المجلد الرئيسي] ) ) + 0 = 0
    )
)
```

## بناء الصفحة

1. **Matrix**: الصفوف = الإدارات[الإدارة] · الأعمدة = الملفات[المجلد الرئيسي] · القيم = [عدد الملفات].
2. **تلوين الخلايا**: حدّد [عدد الملفات] في Values ← السهم ← Conditional formatting ← **Background color** ← Format style = **Field value** ← المقياس **[لون الحالة]**.
3. **Slicers**: الإدارات[الإدارة] + الملفات[المجلد الرئيسي].
4. **Cards**: `DISTINCTCOUNT(الإدارات[الإدارة])` · [عدد الملفات] · [مجلدات فارغة].
5. **Bar chart**: المحور = الإدارة، القيم = [عدد الملفات].
6. File ← Save As ← **pbix** ← ثم ارفعه على app.powerbi.com.

## فلترة بالبريد الإلكتروني (لاحقًا)

`SharePoint.Files` لا يُرجع البريد. لتفعيله: استعلام إضافي
`SharePoint.Tables("https://saudimoe.sharepoint.com/sites/L-center")` ← قائمة **Documents** ← وسّع حقل **Editor** (يحوي الاسم والبريد) ← ادمجه مع «الملفات» عبر المسار. بعدها يعمل فلتر البريد مباشرة.
