در پروژههای صنعتی، داده در Primavera P6 زندگی میکند، اما تصمیمها در جلسات گرفته میشود. فاصله میان این دو — یعنی نبودِ نمای قابلفهم از وضعیت پروژه در لحظه — یکی از ریشههای اصلی تأخیر و افزایش هزینه است. این مقاله یک راهنمای عملی است برای پل زدن روی این فاصله: از خروجی گرفتن از P6 تا یک داشبورد تعاملی در Power BI که شاخصهای کلیدی را در اختیار مدیریت پروژه میگذارد.
چرا Power BI برای کنترل پروژه؟
P6 ابزار قدرتمندی در برنامهریزی و زمانبندی است، اما در گزارشدهی انعطافپذیر نیست. Power BI با اتصال به منابع داده مختلف، محاسبه شاخصها با DAX و مصورسازی تعاملی، این خلأ را پر میکند. ترکیب این دو یعنی دقت داده P6 بهعلاوه قدرت بصری Power BI.
در پروژههای نفت، گاز، پتروشیمی و نیروگاه که تعداد فعالیتها به دهها هزار میرسد و ذینفعان متعدد گزارشهای متفاوتی میخواهند، یک داشبورد مرکزی میتواند پاسخگوی همه باشد: از مدیر پروژه که شاخصهای SPI و CPI را میخواهد تا ناظر که منحنی S فیزیکی را دنبال میکند.
گام ۱: خروجی گرفتن از Primavera P6
روش سریع: خروجی CSV
سادهترین راه برای شروع، خروجی اکسل/CSV از نمای فعالیتها با ستونهای زیر است:
- Activity ID، Activity Name و WBS
- Original Duration، Remaining Duration، Actual Duration
- Planned Start، Planned Finish، Actual Start، Actual Finish
- Percent Complete فیزیکی و زمانی
- Budgeted Total Units یا Budgeted Total Cost
- Earned Value و Actual Cost (در صورت وجود داده هزینه)
- Total Float و Free Float
برای خروجی: در 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
- Get Data → Blank Query → Advanced Editor
- کدی بنویسید که فایل را بهصورت متن بخواند، بر اساس خطوط %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 در وب موجود است که میتوانید پایه قرار دهید.
گام ۳: مدل داده و روابط
بعد از وارد کردن جداول، روابط را برقرار کنید. مدل پیشنهادی:
- TASK: جدول اصلی فعالیتها با کلید Activity ID
- PROJWBS: ساختار WBS متصل به TASK از طریق کد WBS
- CALENDAR: تقویمهای پروژه
- Date Dimension: جدول تاریخ جداگانه برای تحلیل زمانی
روابط کلیدی:
- TASK.WBS_ID ← PROJWBS.WBS_ID
- TASK.calendar_id ← CALENDAR.calendar_id
- TASK.Planned Start / Actual Start → Date Dimension (بهعنوان رابطه غیرفعال یا از طریق جدول Fact)
برای منحنی 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های کلان (ردیف بالا)
- SPI و CPI: عدد رنگی (سبز بالای ۱، زرد برابر ۱، قرمز زیر ۱)
- SV و CV: انحراف به واحد یا درصد
- EAC: پیشبینی هزینه نهایی
- تعداد فعالیتهای بحرانی و درصد پیشرفت فیزیکی کل
سطح ۲ — روندها و توزیع (ردیف وسط)
- منحنی S: سه خط Planned، Earned و Actual
- روند SPI/CPI: تغییر هفتگی یا ماهانه شاخصها
- توزیع WBS: درصد پیشرفت بهازای هر سطح ۲ WBS (نمودار میلای)
- نقشه فعالیتهای حساس: نمودار پراکندگی Float در برابر Percent Complete
سطح ۳ — جزئیات (ردیف پایین)
- جدول فعالیتهای بحرانی: Activity ID، نام، شناور، درصد تکمیل، تاریخهای آغاز و پایان
- فیلترهای چندبعدی: WBS، تقویم، محدوده تاریخ، وضعیت فعالیت
نکات حرفهای و خطاهای رایج
اعتبارسنجی داده
اولین قانون داشبورد کنترل پروژه: داده کثیف، داشبورد را گمراهکننده میکند. یک اندازه اعتبارسنجی بسازید که باید صفر باشد:
Data Valid = COUNTROWS(FILTER(Task, Task[PlannedStart] < DATE(2020, 1, 1)))
تفاوت تقویم
P6 مدت فعالیت را بر حسب روز کاری ذخیره میکند، نه روز تقویمی. قبل از محاسبه منحنی S و روندها، تاریخها را با تقویم P6 هماهنگ کنید، وگرنه اعداد دقیق نخواهند بود.
Baseline و Data Date
قبل از خروجی مطمئن شوید Baseline پیشفرض پروژه فعال و Data Date (تاریخ وضعیت) درست تنظیم شده است. برای داشبورد حرفهای، مقادیر Baseline و Current را با هم خروجی بگیرید تا مقایسه «برنامه مصوب در برابر واقع اجرا» ممکن شود.
تازهسازی داده
سه رویکرد برای بهروزرسانی:
- دستی (خروجی مجدد CSV) — ساده، برای شروع
- اتصال به پایگاه داده P6 — از طریق ODBC در Power Query، در صورت اجازه DBA
- 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 عوض میشود و داشبورد باید وضعیت جدید را منعکس کند. سه اصل موفقیت:
- اعتبار داده — بدون داده دقیق P6، داشبورد نه تنها بیفایده که گمراهکننده است
- سادگی بصری — یک صفحه که با یک نگاه وضعیت پروژه را بگوید
- تکرارپذیری — فرآیند تازهسازی ساده و قابل اعتماد
با پیادهسازی همین مراحل، از یک برنامهریز با یک نرمافزار به یک کنترلکننده پروژه با «دیدهبان داده» تبدیل میشوید — همان تفاوتی که در پروژههای نفت، گاز، پتروشیمی و نیروگاه نتیجه را میسازد.