2017-10-10 6 views
0

Je souhaite afficher les heures de travail de tous les jours du 29/5 au 30/6, mais dans l'intervalle. Il contient les samedis et dimanches (jours non ouvrables). J'utilise TimeScaleData mais il s'arrête automatiquement quand il voit un jour chômé. J'essaie d'ajouter (1) au jour de la fin mais il s'arrête toujours, donc je ne peux pas afficher correctement les heures de travail.Comment faire pour passer la date dans TimeScaleData (lire le fichier 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

Répondre

0

Votre code rencontre une erreur d'exécution sur cette ligne: h += tsv.Value parce tsv.Value est une chaîne vide pour les jours il n'y a pas de travail. Vérifiez le type de données de tsv.Value avant d'essayer d'ajouter.

MSDN Documentation -note que la propriété Value renvoie un Variant et non un double.

+0

cela fonctionne. Bugs et bugs, je ressens du stress: v: v Merci beaucoup Rachel. – gggg

+0

Salut @Rachel, je recherche et détecte funtion Val en VBA. Cet article disait: "" tsv.Value renvoie une chaîne vide ("") pour les tranches de temps en dehors de la plage de dates de l'objet. Val (tsv.Value) convertit la chaîne vide à un zéro qui est beaucoup plus utile "" J'ai compris Val() comme Convert.ToDouble en C# mais quand je l'utilise voit l'erreur même ci-dessus. – gggg

+0

Vérifiez le type de données de 'tsv.Value' avant de l'utiliser. Voir [cet article SO pour la vérification de type dans C#] (https://stackoverflow.com/questions/983030/type-checking-typeof-gettype-or-is). –

0

Dans mon code tsv.value a renvoyé une chaîne vide lors de l'itération à travers les valeurs de temps. Vérification de IsNumeric travaillé:

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

J'ai vérifié mais je ne sais pas cela fonctionne incoorect Exemple, 2 lignes ont le début de duplication, finissent le jour et le jour fonctionne.Mais row1 est juste reult mais n ° 2 incorrect – gggg

+0

J'ai mis à jour le exemple, pour fournir un sous fonctionnant entièrement Peut-être quelque chose était hors de la collection timescalevalues? –

+0

Yah, Merci Eric @@ En raison de la lecture du code de plus de 9 tranches de temps.J'ai ajouté GC.Collect() et c'est bien – gggg