2017-10-10 1 views
0

Ich möchte die Arbeitsstunden aller Tage vom 29/5 bis 30/6 aber im Intervall anzeigen. Es enthält Samstage und Sonntage (arbeitsfreie Tage). Ich benutze TimeScaleData aber es stoppt automatisch, wenn es einen arbeitsfreien Tag sieht. Ich versuche, (1) zum Zieltag hinzuzufügen, aber es hört immer noch auf, sodass ich die Arbeitsstunden nicht korrekt anzeigen kann.Wie kann man das Datum in TimeScaleData (mpp-Datei lesen) überspringen?

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

Antwort

0

Ihr Code trifft auf einen Laufzeitfehler auf dieser Linie: h += tsv.Value weil tsv.Value eine leere Zeichenfolge für Tage ist es keine Arbeit gibt. Überprüfen Sie den Datentyp tsv.Value, bevor Sie versuchen, hinzuzufügen.

MSDN Documentation - Beachten Sie, dass die Value-Eigenschaft eine Variant zurückgibt, keine Double.

+0

es funktioniert. Bugs und Bugs, ich fühle Stress: v: v Vielen Dank Rachel. – gggg

+0

Hi @Rachel, ich forsche und entdecke Val in VBA. Dieser Beitrag sagte: "" tsv.Value gibt eine leere Zeichenfolge ("") für Zeitscheiben außerhalb des Datumsbereichs des Objekts zurück. Val (tsv.Value) wandelt die leere Zeichenfolge in eine Null um, die viel nützlicher ist. "Ich habe Val() wie Convert.ToDouble in C# verstanden, aber wenn ich es verwende, sehe ich den gleichen Fehler oben. – gggg

+0

Überprüfen Sie den Datentyp von 'tsv.Value', bevor Sie ihn verwenden. Siehe [diese SO-Post zur Typprüfung in C#] (https://stackoverflow.com/questions/983030/type-checking-typeof-gettype-or-is). –

0

In meinem Code gab tsv.value eine leere Zeichenfolge beim Iterieren der Zeitskalenwerte zurück. Überprüfung auf IsNumeric funktioniert:

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

Ich überprüfte, aber ich weiß nicht, es funktioniert incoorect.Beispiel, 2 Zeilen haben doppelte Start, Ende Tag und Tag funktioniert. Aber row1 ist richtig reult aber no2 inkorrekt. – gggg

+0

Ich aktualisierte die Beispiel, um einen voll funktionierenden Sub zur Verfügung zu stellen. Vielleicht war etwas in der timescalevalues ​​Sammlung weg? –

+0

Yah, Danke Eric @@ Wegen des Codes, der mehr als 9 Zeitscheiben liest. Ich fügte GC.Collect() hinzu und es ist gut. – gggg

Verwandte Themen