2017-10-10 121 views
0

我想显示从29/5到30/6但是在间隔中的所有日子的工作时间。它包含星期六和星期日(非工作日)。我使用TimeScaleData,但它在看到非工作日时自动停止。我尝试将(1)添加到结束日,但仍然停止,所以我无法正确显示工作时间。如何在TimeScaleData中跳过日期(读取mpp文件)?

Microsoft.Office.Interop.MSProject.Application app = new Microsoft.Office.Interop.MSProject.Application(); 
app.FileOpenEx(Path, false, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    PjPoolOpen.pjPoolReadWrite, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 
Microsoft.Office.Interop.MSProject.Project pj = app.ActiveProject; 
foreach(Resource re in pj.Resources) 
{ 
    foreach (Assignment assign in re.Assignments) 
    { 
     double h = 0; 
     var tsvs = assign.TimeScaleData("5/29/2017", "7/1/2017", MSProject.PjAssignmentTimescaledData.pjAssignmentTimescaledWork, MSProject.PjTimescaleUnit.pjTimescaleDays, 1); 
     try 
     { 
      foreach (TimeScaleValue tsv in tsvs) 
      { 
       for (int i = 0; i < totalday ; i++) 
       { 
        h += Convert.ToDouble(tsv.Value); //sum all value 
       }  
      } 

     } 
     catch { } 
    } 
} 

enter image description here

回答

0

你的代码遇到这条线运行时错误:h += tsv.Value因为tsv.Value是天空字符串没有工作。尝试添加前请检查数据类型tsv.Value

MSDN Documentation -note Value属性返回Variant而不是double。

+0

它的工作原理。臭虫和臭虫,我感到压力:v:v非常感谢瑞秋。 – gggg

+0

嗨@Rachel,我在VBA中研究和检测函数Val。该帖子说:“”tsv.Value为对象日期范围外的时间片返回一个空字符串(“”)。 Val(tsv.Value)将空字符串转换为零,这更有用“”。我理解Val()类似于C#中的Convert.ToDouble,但是当我使用它时会看到上面的错误。 – gggg

+0

使用前检查'tsv.Value'的数据类型。看到[这个SO帖子的类型检查在C#](https://stackoverflow.com/questions/983030/type-checking-typeof-gettype-oris)。 –

0

在我的代码tsv.value遍历时间刻度值时返回一个空字符串。检查IsNumeric工作:

Private Sub ProcessAssignments(T As Task) 

    Dim A As Assignment 
    Dim tsvsHours As TimeScaleValues 
    Dim tsvsCosts0 As TimeScaleValues 
    Dim dblWork As Double 
    Dim curCostClassA As Double 


    ' Process assignments 
    For Each A In T.Assignments 
     ' Get the timescale collection objects for Hours and Costs 
     tsvsHours = A.TimeScaleData(
      StartDate:=T.BaselineStart, 
      EndDate:=T.BaselineFinish, 
      Type:=PjAssignmentTimescaledData.pjAssignmentTimescaledBaselineWork, 
      TimeScaleUnit:=PjTimescaleUnit.pjTimescaleMonths, 
      Count:=1) 

     tsvsCosts0 = A.TimeScaleData(
      StartDate:=T.BaselneStart, 
      EndDate:=T.BaselineFinish, 
      Type:=PjAssignmentTimescaledData.pjAssignmentTimescaledBaselineCost, 
      TimeScaleUnit:=PjTimescaleUnit.pjTimescaleMonths, 
      Count:=1) 

     ' Iterate through the assignment timescalevalues 
     For i As Integer = 1 To tsvsCosts0.Count 
      If IsNumeric(tsvsCosts0(i).Value) = True Then 'Cannot process non-working times with an empty string value 

       ' Get the hours from the tsvsHours collection 
       If IsNumeric(tsvsHours(i).Value) Then 
        dblWork = CDbl(tsvsHours(i).Value/60) 
       Else 
        dblWork = 0 
       End If 

       ' Get the costs from the Baseline collection 
       If IsNumeric(tsvsCosts0(i).Value) Then 
        curCostClassA = tsvsCosts0(i).Value 
       Else 
        curCostClassA = 0 
       End If 


       ' Do stuff here 

      End If 
     Next i 

     tsvsHours = Nothing 
     tsvsCosts0 = Nothing 

    Next A 
End Sub 
+0

我检查过,但我不知道它是否适用于incoorect。例如,2行有重复的开始,完成日期和日期的工作,但是row1是正确的,但no2不正确 – gggg

+0

我更新了例如提供一个完整的工作子集,也许在时间刻度集合中有些东西是关闭的 –

+0

Yah,谢谢Eric @@由于代码读取了9次以上的时间片,我添加了GC.Collect(),并且没问题 – gggg