VARCHART XGantt_v5.1用戶手冊(cè):如何計(jì)算活動(dòng)結(jié)束日期(ActiveX版)
VARCHART XGantt是一個(gè)交互式的甘特圖控件,其模塊化的設(shè)計(jì)讓您可以創(chuàng)建滿足您和您的客戶所需求的應(yīng)用程序??梢钥焖?、簡(jiǎn)單地集成到您的應(yīng)用程序中,幫助您識(shí)別性能瓶頸、避免延遲以及高效利用資源,使復(fù)雜數(shù)據(jù)變得更加容易理解。
點(diǎn)擊下載VARCHART XGantt免費(fèi)版
本篇文章主要解釋了VARCHART XGantt如何計(jì)算活動(dòng)結(jié)束時(shí)間,感興趣的朋友可以自己動(dòng)手操作一下哦~
結(jié)束日期的表列仍為空??梢栽赩ARCHART XGantt中包含的日歷的幫助下,從“開始”和“持續(xù)時(shí)間”字段計(jì)算活動(dòng)的結(jié)束。
在默認(rèn)日歷中,工作日(星期一到星期五)被定義為活動(dòng)時(shí)間,而周末(星期六和星期日)被定義為非活動(dòng)時(shí)間。
在圖中,您可以通過(guò)灰色背景識(shí)別非活動(dòng)時(shí)間??梢酝ㄟ^(guò)在“節(jié)點(diǎn)”屬性頁(yè)上停用“將日歷分配給節(jié)點(diǎn)”選項(xiàng)來(lái)關(guān)閉日歷。
請(qǐng)注意有無(wú)日歷計(jì)算的差異:
活動(dòng)從星期五開始并持續(xù)3天,如果日歷被激活,活動(dòng)將在星期二結(jié)束。沒(méi)有日歷,活動(dòng)將在周日結(jié)束。
結(jié)束日期通過(guò)對(duì)象VcCalendar的AddDuration(...)方法計(jì)算。因此,需要每項(xiàng)活動(dòng)的開始和持續(xù)時(shí)間??梢酝ㄟ^(guò)索引從相應(yīng)的數(shù)據(jù)字段中檢索它們。在通過(guò)DataField(...)方法設(shè)置結(jié)束日期之后,必須調(diào)用VcNode的UpdateNode方法,以便可以看到數(shù)據(jù)的更改。
示例代碼
Dim tmpCal As VcCalendar Dim tmpDate As Date Set tmpCal = VcGantt1.CalendarCollection.Active tmpDate = tmpCal.AddDuration(node.DataField(2), node.DataField(4)) node.DataField(3) = tmpDate node.UpdateNode
通過(guò)鼠標(biāo)交互創(chuàng)建或修改的活動(dòng)的開始和結(jié)束日期將自動(dòng)置于活動(dòng)時(shí)間。
相反,API或編輯對(duì)話框設(shè)置的日期可以放置在非工作時(shí)間。
通過(guò)計(jì)算生成的日期始終位于工作時(shí)間內(nèi)。為了確保API設(shè)置的日期處于工作時(shí)間,需要從結(jié)束日期和活動(dòng)持續(xù)時(shí)間計(jì)算開始日期。
示例代碼
tmpDate = tmpCal.AddDuration(node.DataField(3), _ (-1) * node.DataField(4)) node.DataField(2) = tmpDate
為了保持?jǐn)?shù)據(jù)的一致性,丟失或負(fù)持續(xù)時(shí)間應(yīng)視為不正確,并重置為0。如果缺少開始日期,則無(wú)法計(jì)算結(jié)束日期。所需的代碼總結(jié)為一個(gè)名為SetNodeEndDate(...)的單獨(dú)方法。
示例代碼
Private Sub SetNodeEndDate(ByVal node As VcNode) 'Avoid empty or negative duration If node.DataField(4) = "" Or node.DataField(4) < 0 Then node.DataField(4) = "0" End If 'Start date empty then end date should also be empty If node.DataField(2) = "31.12.1899 00:00:00" Then node.DataField(3) = "" Else 'Precondition is property page nodes '"Assign calendar to nodes" must be true Dim tmpCal As VcCalendar Dim tmpDate As Date Set tmpCal = VcGantt1.CalendarCollection.Active tmpDate = tmpCal.AddDuration(node.DataField(2), _ node.DataField(4)) node.DataField(3) = tmpDate 'Start date only in active times tmpDate = tmpCal.AddDuration(node.DataField(3), _ (-1) * node.DataField(4)) node.DataField(2) = tmpDate node.UpdateNode End If End Sub
需要計(jì)算日期:
1、活動(dòng)結(jié)束后
2、通過(guò)數(shù)據(jù)編輯對(duì)話框或就地編輯器修改日期或持續(xù)時(shí)間之后
3.、API修改活動(dòng)值后
然而,在通過(guò)鼠標(biāo)交互進(jìn)行修改之后,不必啟動(dòng)計(jì)算,因?yàn)檫@將自動(dòng)執(zhí)行內(nèi)部計(jì)算。
可以通過(guò)VcGantt對(duì)象的屬性NodeCollection來(lái)設(shè)置包括所有節(jié)點(diǎn)的計(jì)算循環(huán)。它的代碼將被添加到事件Form1_Load(...)的末尾。
示例代碼
'Calculate end date for all nodes Dim node As VcNode For Each node In VcGantt1.NodeCollection SetNodeEndDate node Next
可以通過(guò)事件OnNodeModifyComplete捕獲用戶引起的數(shù)據(jù)更改。方法調(diào)用執(zhí)行結(jié)束日期的計(jì)算。
示例代碼
Private Sub VcGantt1_OnNodeModifyComplete _ (ByVal node As VcGanttLib.VcNode, _ ByVal isLastNodeInSeries As Boolean) SetNodeEndDate node End Sub
如果數(shù)據(jù)已通過(guò)API更改,則必須調(diào)用SetNodeEndDate(...)。
想要購(gòu)買VARCHART XGantt正版授權(quán),或了解更多產(chǎn)品信息請(qǐng)點(diǎn)擊“咨詢?cè)诰€客服”