اتصال Primavera P6 به Power BI — راهنمای عملی داشبورد کنترل پروژه

در پروژه‌های صنعتی، داده در Primavera P6 زندگی می‌کند، اما تصمیم‌ها در جلسات گرفته می‌شود. فاصله میان این دو — یعنی نبودِ نمای قابل‌فهم از وضعیت پروژه در لحظه — یکی از ریشه‌های اصلی تأخیر و افزایش هزینه است. این مقاله یک راهنمای عملی است برای پل زدن روی این فاصله: از خروجی گرفتن از P6 تا یک داشبورد تعاملی در Power BI که شاخص‌های کلیدی را در اختیار مدیریت پروژه می‌گذارد.

چرا Power BI برای کنترل پروژه؟

P6 ابزار قدرتمندی در برنامه‌ریزی و زمان‌بندی است، اما در گزارش‌دهی انعطاف‌پذیر نیست. Power BI با اتصال به منابع داده مختلف، محاسبه شاخص‌ها با DAX و مصورسازی تعاملی، این خلأ را پر می‌کند. ترکیب این دو یعنی دقت داده P6 به‌علاوه قدرت بصری Power BI.

در پروژه‌های نفت، گاز، پتروشیمی و نیروگاه که تعداد فعالیت‌ها به ده‌ها هزار می‌رسد و ذینفعان متعدد گزارش‌های متفاوتی می‌خواهند، یک داشبورد مرکزی می‌تواند پاسخگوی همه باشد: از مدیر پروژه که شاخص‌های SPI و CPI را می‌خواهد تا ناظر که منحنی S فیزیکی را دنبال می‌کند.

گام ۱: خروجی گرفتن از Primavera P6

روش سریع: خروجی CSV

ساده‌ترین راه برای شروع، خروجی اکسل/CSV از نمای فعالیت‌ها با ستون‌های زیر است:

برای خروجی: در P6 به بخش فعالیت‌ها بروید، ستون‌های مورد نظر را اضافه کنید، سپس File → Export → Export to Excel/CSV. مزیت این روش سادگی و سرعت است؛ عیب آن نیاز به تکرار دستی در هر به‌روزرسانی.

روش حرفه‌ای: خروجی XER

فایل XER یک فایل متنی با ساختار جدولی است که همه جداول P6 را در بر دارد: TASK، TASKPRED، PROJWBS، PROJECT، CALENDAR و غیره. برای خروجی: File → Export → Primavera XER و انتخاب پروژه جاری.

ساختار XER ساده است و برنامه به‌راحتی می‌تواند آن را بخواند، خط‌به‌خط جدا کند و هر تکه را در جای خودش بگذارد:

%T
TABLE_NAME
%F
FIELD1\tFIELD2\tFIELD3
%R
VALUE1\tVALUE2\tVALUE3
%R
...

هر بخش %T یک جدول جدید را شروع می‌کند، %F هدر ستون‌ها را مشخص می‌کند و %R ردیف‌های داده هستند. این ساختار در Power Query به‌راحتی خوانده می‌شود.

گام ۲: وارد کردن به Power BI

وارد کردن CSV

ساده است: Power BI → Get Data → Text/CSV → انتخاب فایل → Transform Data. در Power Query ستون‌های تاریخ را به نوع Date تبدیل کنید و مطمئن شوید مقادیر عددی (Duration، Percent Complete) درست پارس شده‌اند.

وارد کردن XER

  1. Get Data → Blank Query → Advanced Editor
  2. کدی بنویسید که فایل را به‌صورت متن بخواند، بر اساس خطوط %T جدا کند و برای هر جدول، هدر و ردیف‌ها را استخراج کند.

یک تابع نمونه در M برای خواندن XER:

(filePath as text) as table =>
let
    Source = Lines.FromBinary(File.Contents(filePath)),
    Table1 = Table.FromList(Source, Splitter.SplitByNothing()),
    // صرفاً شروع: فیلتر خطوط کنترل (%T / %F / %R)
    Filtered = Table.SelectRows(Table1, each
        Text.StartsWith([Column1], "%T") or
        Text.StartsWith([Column1], "%F") or
        Text.StartsWith([Column1], "%R"))
in
    Filtered

در عمل این تابع را گسترش می‌دهید تا هر جدول (TASK، PROJWBS، CALENDAR، TASKPRED) به‌صورت یک Query جداگانه دربیاید. چند نمونه پیاده‌سازی کامل XER Parser در وب موجود است که می‌توانید پایه قرار دهید.

گام ۳: مدل داده و روابط

بعد از وارد کردن جداول، روابط را برقرار کنید. مدل پیشنهادی:

روابط کلیدی:

برای منحنی S و تحلیل روند، بهتر است یک جدول Fact Progress داشته باشید که به‌ازای هر فعالیت و هر دوره (هفته/ماه) یک ردیف دارد. در نسخه ساده، مقادیر Current و Plan را مستقیم از جدول TASK می‌خوانید.

گام ۴: شاخص‌ها و اندازه‌ها با DAX

فرض کنید جدولی به نام Task دارید با ستون‌های PlannedUnits، EarnedUnits، ActualUnits، PlannedCost، EarnedCost، ActualCost، DurationDays و PercentComplete.

شاخص‌های پایه

// انحراف زمان (SV) به واحد ساعت یا هزینه
Schedule Variance = SUM(Task[EarnedUnits]) - SUM(Task[PlannedUnits])

// انحراف هزینه (CV)
Cost Variance = SUM(Task[EarnedCost]) - SUM(Task[ActualCost])

// درصد پیشرفت فیزیکی کل
Physical % = DIVIDE(SUM(Task[EarnedUnits]), SUM(Task[PlannedUnits]))

SPI و CPI

// شاخص عملکرد زمان
SPI = DIVIDE(SUM(Task[EarnedUnits]), SUM(Task[PlannedUnits]))

// شاخص عملکرد هزینه
CPI = DIVIDE(SUM(Task[EarnedCost]), SUM(Task[ActualCost]))

برآورد تا پایان و شاخص تکمیل

// برآورد هزینه نهایی (EAC) — ساده شده
EAC = SUM(Task[PlannedCost]) / DIVIDE(SUM(Task[EarnedCost]), SUM(Task[ActualCost]))

// شاخص عملکرد لازم برای تکمیل در بودجه (TCPI)
TCPI = DIVIDE(SUM(Task[PlannedCost]) - SUM(Task[EarnedCost]),
              SUM(Task[PlannedCost]) - SUM(Task[ActualCost]))

فعالیت‌های بحرانی و Look-ahead

// تعداد فعالیت‌های بحرانی (شناور صفر یا منفی)
Critical Count = CALCULATE(COUNTROWS(Task), Task[TotalFloat] <= 0)

// فعالیت‌های در شرف شروع — سه هفته پیش رو
Lookahead Count =
CALCULATE(COUNTROWS(Task),
    Task[PlannedStart] >= TODAY() && Task[PlannedStart] <= TODAY() + 21)

منحنی S (مقادیر تجمعی)

// تجمع برنامه‌ای
Cumul Planned =
CALCULATE(SUM(Task[PlannedUnits]),
    FILTER(ALL(Task[PlannedFinish]), Task[PlannedFinish] <= MAX(DateDim[Date])))

// تجمع ارزش کسب‌شده
Cumul Earned =
CALCULATE(SUM(Task[EarnedUnits]),
    FILTER(ALL(Task[DataDate]), Task[DataDate] <= MAX(DateDim[Date])))

گام ۵: طراحی داشبورد

داشبورد کنترل پروژه باید در یک یا حداکثر دو صفحه جا شود و سه سطح اطلاعات را نشان دهد:

سطح ۱ — KPIهای کلان (ردیف بالا)

سطح ۲ — روندها و توزیع (ردیف وسط)

سطح ۳ — جزئیات (ردیف پایین)

نکات حرفه‌ای و خطاهای رایج

اعتبارسنجی داده

اولین قانون داشبورد کنترل پروژه: داده کثیف، داشبورد را گمراه‌کننده می‌کند. یک اندازه اعتبارسنجی بسازید که باید صفر باشد:

Data Valid = COUNTROWS(FILTER(Task, Task[PlannedStart] < DATE(2020, 1, 1)))

تفاوت تقویم

P6 مدت فعالیت را بر حسب روز کاری ذخیره می‌کند، نه روز تقویمی. قبل از محاسبه منحنی S و روندها، تاریخ‌ها را با تقویم P6 هماهنگ کنید، وگرنه اعداد دقیق نخواهند بود.

Baseline و Data Date

قبل از خروجی مطمئن شوید Baseline پیش‌فرض پروژه فعال و Data Date (تاریخ وضعیت) درست تنظیم شده است. برای داشبورد حرفه‌ای، مقادیر Baseline و Current را با هم خروجی بگیرید تا مقایسه «برنامه مصوب در برابر واقع اجرا» ممکن شود.

تازه‌سازی داده

سه رویکرد برای به‌روزرسانی:

  1. دستی (خروجی مجدد CSV) — ساده، برای شروع
  2. اتصال به پایگاه داده P6 — از طریق ODBC در Power Query، در صورت اجازه DBA
  3. P6 Web Services / EPPM — حرفه‌ای‌ترین مسیر، با Refresh زمان‌بندی‌شده

در پروژه‌های صنعتی، رویکرد ترکیبی رایج است: خروجی هفتگی XER توسط برنامه‌ریز، قرار گرفتن در مسیر مشخص شبکه، و تازه‌سازی شبانه Power BI از همان مسیر.

فعالیت‌های باز و بدون پایان

فعالیت‌هایی که Actual Finish ندارند (در حال اجرا) باید جداگانه رسیدگی شوند؛ پیشرفت آنها به Data Date وابسته است، نه به تاریخ امروز.

اتوماسیون تازه‌سازی

برای تازه‌سازی خودکار، یک اسکریپت ساده می‌تواند فایل XER تازه را در مسیر ورودی Power BI کپی کند و Refresh زمان‌بندی‌شده آن را بخواند:

# PowerShell — کپی XER تازه به مسیر ورودی داشبورد
$source = "\\p6-server\exports\ProjectExport.xer"
$dest   = "C:\PowerBI\ProjectData.xer"
Copy-Item -Path $source -Destination $dest -Force
Write-Output "XER refreshed: $(Get-Date)"

بهتر است این کار از طریق Windows Task Scheduler و با حساب کاربری با حداقل دسترسی انجام شود.

جمع‌بندی

اتصال P6 به Power BI یک کار یک‌باره نیست؛ یک فرآیند است. با هر به‌روزرسانی P6، Data Date عوض می‌شود و داشبورد باید وضعیت جدید را منعکس کند. سه اصل موفقیت:

  1. اعتبار داده — بدون داده دقیق P6، داشبورد نه تنها بی‌فایده که گمراه‌کننده است
  2. سادگی بصری — یک صفحه که با یک نگاه وضعیت پروژه را بگوید
  3. تکرارپذیری — فرآیند تازه‌سازی ساده و قابل اعتماد

با پیاده‌سازی همین مراحل، از یک برنامه‌ریز با یک نرم‌افزار به یک کنترل‌کننده پروژه با «دیده‌بان داده» تبدیل می‌شوید — همان تفاوتی که در پروژه‌های نفت، گاز، پتروشیمی و نیروگاه نتیجه را می‌سازد.

← همه‌ی نوشته‌ها RSS