پیمایش درخت WBS در پریماورا با SQL-Server
از پاپیروس
پرش به ناوبریپرش به جستجو
این مطلب نیازمند گسترش است.
برای پیمایش ساختارهای درختی در SQL از مفهومی به نام CTE یا (Common Table Expressions) استفاده میشود. یکی از این ساختارهای درختی، WBS یا (Work Breakdown Structure) است. در نرمافزار Primavera اطلاعات WBS در جدولی به نام PROJWBS نگهداری میشود. فیلدهایی از این جدول که در کد زیر از آن استفاده شدهاست به این شرح است:
- wbs_id آیدی WBS
- proj_id آیدی پروژه
- proj_node_flag مشخص میکند آیا این ردیف، نقطه آغاز WBS مربوط به یک پروژه است (Y) یا خیر(N).
- parent_wbs_id سطح بالاتر (parent) سطح فعلی را مشخص میکند.
- wbs_short_name نام کوتاه WBS را برمیگرداند. (مترادف با WBS Code در محیط Primavera ست.)
- seq_num ترتیب قرارگیری اعضای هم سطح را در سطح بالاتر (parent_wbs_id) مشخص میکند.
از پروژههای نمونهی Primavera پروژه MFG00772 با آیدی ۴۰۴۹ (ممکن است در نسخههای مختلف عدد دیگری باشد) برای این مثال انتخاب شدهاست.
جدول شماره ۱
select wbs_id, proj_id, proj_node_flag, parent_wbs_id, wbs_short_name, seq_num from privuser.PROJWBS where proj_id=4049
--Results:
wbs_id proj_id proj_node_flag parent_wbs_id wbs_short_name seq_num
----------- ----------- -------------- ------------- ---------------------------------------- -----------
24042 4049 Y 18133 MFG00772 100
24043 4049 N 24042 Auto 13590
24044 4049 N 24043 SoftEng 13560
24045 4049 N 24043 DesEng 13510
24046 4049 N 24043 SysEng 13520
24047 4049 N 24046 RobotCtl 13540
24048 4049 N 24046 TempCtl 13530
24049 4049 N 24046 SysCtl 13550
24050 4049 N 24043 Train 13570
24051 4049 N 24050 Manual 13580
24052 4049 N 24042 Conv 13592
24053 4049 N 24052 SysDesEng 13600
24054 4049 N 24052 Train 13640
24055 4049 N 24054 OpsManual 13660
24056 4049 N 24052 FieldOps 13610
24057 4049 N 24056 Install 13620
24058 4049 N 24056 OnsiteTest 13630
24059 4049 N 24042 Bldg 13591
24060 4049 N 24059 ExtFinish 13750
24061 4049 N 24060 Roof 13770
24062 4049 N 24060 Brick 13760
24063 4049 N 24060 DoorWin 13780
24064 4049 N 24059 Found 13690
24065 4049 N 24059 DesEng 13680
24066 4049 N 24059 IntFinish 13790
24067 4049 N 24066 Carp 13820
24068 4049 N 24066 Floor 13810
24069 4049 N 24066 Plumb 13800
24070 4049 N 24066 Paint 13830
24071 4049 N 24059 Struct 13700
24072 4049 N 24059 MechSys 13710
24073 4049 N 24072 Plumb 13740
24074 4049 N 24072 HVAC 13730
24075 4049 N 24072 Elev 13720
در نرمافزار Primavera ساختار WBS بالا به این صورت نمایش داده میشود:
جدول شماره ۲
WBS Code
------------------------------------------------
MFG00772
MFG00772.Auto
MFG00772.Auto.DesEng
MFG00772.Auto.SysEng
MFG00772.Auto.SysEng.TempCtl
MFG00772.Auto.SysEng.RobotCtl
MFG00772.Auto.SysEng.SysCtl
MFG00772.Auto.SoftEng
MFG00772.Auto.Train
MFG00772.Auto.Train.Manual
MFG00772.Bldg
MFG00772.Bldg.DesEng
MFG00772.Bldg.Found
MFG00772.Bldg.Struct
MFG00772.Bldg.MechSys
MFG00772.Bldg.MechSys.Elev
MFG00772.Bldg.MechSys.HVAC
MFG00772.Bldg.MechSys.Plumb
MFG00772.Bldg.ExtFinish
MFG00772.Bldg.ExtFinish.Brick
MFG00772.Bldg.ExtFinish.Roof
MFG00772.Bldg.ExtFinish.DoorWin
MFG00772.Bldg.IntFinish
MFG00772.Bldg.IntFinish.Plumb
MFG00772.Bldg.IntFinish.Floor
MFG00772.Bldg.IntFinish.Carp
MFG00772.Bldg.IntFinish.Paint
MFG00772.Conv
MFG00772.Conv.SysDesEng
MFG00772.Conv.FieldOps
MFG00772.Conv.FieldOps.Install
MFG00772.Conv.FieldOps.OnsiteTest
MFG00772.Conv.Train
MFG00772.Conv.Train.OpsManual
با استفاده از کد زیر میتوان خروجی مشابه با نمای فوق داشت.
جدول شماره ۳
declare @iproj int
declare @sepr_tx varchar(MAX)
set @iproj = 4049
set @sepr_tx = '.'
;WITH WBS_TREE(wbs_id, wbs_short_name, parent_wbs_id, levleOfWBS, WBSCode, SO) AS
(
SELECT wbs_id, wbs_short_name, parent_wbs_id,
0 AS initwbslvl,
CAST(INIT_POINT.wbs_short_name AS VARCHAR(MAX)) AS initWBSCode,
CAST(INIT_POINT.seq_num + 1 AS VARBINARY(MAX)) AS initSO
FROM privuser.PROJWBS AS INIT_POINT
WHERE (INIT_POINT.proj_id=@iproj and proj_node_flag = 'Y')
UNION ALL
SELECT top 100 percent LOOP_Q.wbs_id, LOOP_Q.wbs_short_name, LOOP_Q.parent_wbs_id,
FINAL_Q.levleOfWBS + 1 AS loopwbslvl,
CAST(FINAL_Q.WBSCode + @sepr_tx + LOOP_Q.wbs_short_name AS VARCHAR(MAX)) AS loopWBSCode,
CAST(FINAL_Q.SO + CAST(rank() over (partition by LOOP_Q.parent_wbs_id order by LOOP_Q.parent_wbs_id, LOOP_Q.seq_num, LOOP_Q.wbs_id) +1 AS BINARY(4)) AS VARBINARY(MAX)) AS loopSO
FROM privuser.PROJWBS AS LOOP_Q INNER JOIN WBS_TREE AS FINAL_Q ON LOOP_Q.parent_wbs_id = FINAL_Q.wbs_id
order by parent_wbs_id, seq_num, wbs_id
)
SELECT LAST_Q.wbs_id, LAST_Q.wbs_short_name, LAST_Q.parent_wbs_id, LAST_Q.levleOfWBS, LAST_Q.WBSCode, LAST_Q.SO
FROM WBS_TREE AS LAST_Q
order by SO
--Results:
wbs_id wbs_short_name parent_wbs_id levleOfWBS WBSCode SO
----------- ---------------------- ----------------- ----------- --------------------------------------- -----------------------------------
24042 MFG00772 18133 0 MFG00772 0x00000065
24043 Auto 24042 1 MFG00772.Auto 0x0000006500000002
24045 DesEng 24043 2 MFG00772.Auto.DesEng 0x000000650000000200000002
24046 SysEng 24043 2 MFG00772.Auto.SysEng 0x000000650000000200000003
24048 TempCtl 24046 3 MFG00772.Auto.SysEng.TempCtl 0x00000065000000020000000300000002
24047 RobotCtl 24046 3 MFG00772.Auto.SysEng.RobotCtl 0x00000065000000020000000300000003
24049 SysCtl 24046 3 MFG00772.Auto.SysEng.SysCtl 0x00000065000000020000000300000004
24044 SoftEng 24043 2 MFG00772.Auto.SoftEng 0x000000650000000200000004
24050 Train 24043 2 MFG00772.Auto.Train 0x000000650000000200000005
24051 Manual 24050 3 MFG00772.Auto.Train.Manual 0x00000065000000020000000500000002
24059 Bldg 24042 1 MFG00772.Bldg 0x0000006500000003
24065 DesEng 24059 2 MFG00772.Bldg.DesEng 0x000000650000000300000002
24064 Found 24059 2 MFG00772.Bldg.Found 0x000000650000000300000003
24071 Struct 24059 2 MFG00772.Bldg.Struct 0x000000650000000300000004
24072 MechSys 24059 2 MFG00772.Bldg.MechSys 0x000000650000000300000005
24075 Elev 24072 3 MFG00772.Bldg.MechSys.Elev 0x00000065000000030000000500000002
24074 HVAC 24072 3 MFG00772.Bldg.MechSys.HVAC 0x00000065000000030000000500000003
24073 Plumb 24072 3 MFG00772.Bldg.MechSys.Plumb 0x00000065000000030000000500000004
24060 ExtFinish 24059 2 MFG00772.Bldg.ExtFinish 0x000000650000000300000006
24062 Brick 24060 3 MFG00772.Bldg.ExtFinish.Brick 0x00000065000000030000000600000002
24061 Roof 24060 3 MFG00772.Bldg.ExtFinish.Roof 0x00000065000000030000000600000003
24063 DoorWin 24060 3 MFG00772.Bldg.ExtFinish.DoorWin 0x00000065000000030000000600000004
24066 IntFinish 24059 2 MFG00772.Bldg.IntFinish 0x000000650000000300000007
24069 Plumb 24066 3 MFG00772.Bldg.IntFinish.Plumb 0x00000065000000030000000700000002
24068 Floor 24066 3 MFG00772.Bldg.IntFinish.Floor 0x00000065000000030000000700000003
24067 Carp 24066 3 MFG00772.Bldg.IntFinish.Carp 0x00000065000000030000000700000004
24070 Paint 24066 3 MFG00772.Bldg.IntFinish.Paint 0x00000065000000030000000700000005
24052 Conv 24042 1 MFG00772.Conv 0x0000006500000004
24053 SysDesEng 24052 2 MFG00772.Conv.SysDesEng 0x000000650000000400000002
24056 FieldOps 24052 2 MFG00772.Conv.FieldOps 0x000000650000000400000003
24057 Install 24056 3 MFG00772.Conv.FieldOps.Install 0x00000065000000040000000300000002
24058 OnsiteTest 24056 3 MFG00772.Conv.FieldOps.OnsiteTest 0x00000065000000040000000300000003
24054 Train 24052 2 MFG00772.Conv.Train 0x000000650000000400000004
24055 OpsManual 24054 3 MFG00772.Conv.Train.OpsManual 0x00000065000000040000000400000002
در صورتی که نتیجه را به صورت Indent شده (شبیه جدول شماره ۲) میخواهید، به انتهای خط مشخص شده در جدول شماره ۳ عبارت
را بیافزایید. در این صورت به نتیجه جدول فوق این ستون اضافه میشود: (برای مشاهده رو عبارت نمایش کلیک کنید)
, SPACE(5*LAST_Q.levleOfWBS)+LAST_Q.WBSCode indented_WBSCode
جدول شماره ۴
indented_WBSCode
------------------------------------------------
MFG00772
MFG00772.Auto
MFG00772.Auto.DesEng
MFG00772.Auto.SysEng
MFG00772.Auto.SysEng.TempCtl
MFG00772.Auto.SysEng.RobotCtl
MFG00772.Auto.SysEng.SysCtl
MFG00772.Auto.SoftEng
MFG00772.Auto.Train
MFG00772.Auto.Train.Manual
MFG00772.Bldg
MFG00772.Bldg.DesEng
MFG00772.Bldg.Found
MFG00772.Bldg.Struct
MFG00772.Bldg.MechSys
MFG00772.Bldg.MechSys.Elev
MFG00772.Bldg.MechSys.HVAC
MFG00772.Bldg.MechSys.Plumb
MFG00772.Bldg.ExtFinish
MFG00772.Bldg.ExtFinish.Brick
MFG00772.Bldg.ExtFinish.Roof
MFG00772.Bldg.ExtFinish.DoorWin
MFG00772.Bldg.IntFinish
MFG00772.Bldg.IntFinish.Plumb
MFG00772.Bldg.IntFinish.Floor
MFG00772.Bldg.IntFinish.Carp
MFG00772.Bldg.IntFinish.Paint
MFG00772.Conv
MFG00772.Conv.SysDesEng
MFG00772.Conv.FieldOps
MFG00772.Conv.FieldOps.Install
MFG00772.Conv.FieldOps.OnsiteTest
MFG00772.Conv.Train
MFG00772.Conv.Train.OpsManual