【问题标题】:Is creating an EPT (MS PS Enteprise Project Type) via PSI/CSOM possible?是否可以通过 PSI/CSOM 创建 EPT(MS PS 企业项目类型)?
【发布时间】:2015-11-03 18:41:04
【问题描述】:

以下代码不会引发任何异常,但也不会创建新的 EPT:

public void CreateEnterpriseProjectType(Guid eptGuid, string eptName, string eptDescription)
    {
        ProjectContext pwaContext = new ProjectContext("http://serverName/pwaName");
        pwaContext.Credentials = new NetworkCredential("adminUsername", "adminPassword", "domainName");

        EnterpriseProjectTypeCreationInformation eptData = new EnterpriseProjectTypeCreationInformation();

        eptData.Id = eptGuid;
        eptData.Name = eptName;
        eptData.Description = eptDescription;
        eptData.IsDefault = false;
        eptData.IsManaged = true;
        eptData.WorkspaceTemplateName = "PROJECTSITE#0";
        eptData.ProjectPlanTemplateId = Guid.Empty;
        eptData.WorkflowAssociationId = Guid.Empty;

        // Get the maximum order of the existing EPTs and increment by 1 in order to use an order that does not already exist
        eptData.Order = Convert.ToInt32(Database.GetValue("SELECT MAX(ENTERPRISE_PROJECT_TYPE_ORDER) FROM [ProjectWebApp].[pub].[MSP_ENTERPRISE_PROJECT_TYPES]")) + 1;

        pwaContext.Load(pwaContext.ProjectDetailPages);
        pwaContext.ExecuteQuery();
        List<ProjectDetailPageCreationInformation> projectDetailPages = new List<ProjectDetailPageCreationInformation>() {new ProjectDetailPageCreationInformation() { Id = pwaContext.ProjectDetailPages[1].Id, IsCreate = false }};
        eptData.ProjectDetailPages = projectDetailPages;

        EnterpriseProjectType newEpt = pwaContext.EnterpriseProjectTypes.Add(eptData);
        pwaContext.EnterpriseProjectTypes.Update();
    }

对我做错了什么或缺少什么有任何想法吗?是否可以通过编程方式创建 EPT?

【问题讨论】:

    标签: c# ms-project ms-project-server-2013


    【解决方案1】:

    是的,可以通过编程方式创建 EPT。结果发现缺少了三件事:

    1. 第二个 PDP 具有 IsCreate = true(至少需要一个具有 IsCreate = true 和一个具有 IsCreate = false 的 PDP 才能成功创建 EPT)

    2. 在添加新 EPT 之前迭代现有 EPT 的查询:

    pwaContext.Load(pwaContext.EnterpriseProjectTypes); pwaContext.ExecuteQuery();

    1. pwaContext.ExecuteQuery();pwaContext.EnterpriseProjectTypes.Update(); 命令之后。

    【讨论】:

      【解决方案2】:

      以下代码对我来说很好用:

      public class PSI
      {
          private ProjectContext _context;
      
          private string basicEpt = "Enterprise Project";   // Basic enterprise project type.
          private static readonly PSI psi = new PSI();
          private int timeoutSeconds = 60;
          SvcProject.ProjectClient _prClient;
      
          private PSI ()
          {
              _context = new ProjectContext(System.Configuration.ConfigurationManager.AppSettings["PwaUrl"]);
              //credentials of currently running acount or enable line below
              //_context.Credentials = new System.Net.NetworkCredential("user", "pass", "domain");
      
              timeoutSeconds = int.Parse(System.Configuration.ConfigurationManager.AppSettings["DefaultTimeoutPwa"]);
              _prClient = new SvcProject.ProjectClient("basicHttp_Project");
          }
      
          public static PSI Instance
          {
              get{ return psi; }
          }
      
          public Guid GetEptUid(string eptName)
          {
              Guid eptUid = Guid.Empty;
      
              try
              {
                  var eptList = _context.LoadQuery( _context.EnterpriseProjectTypes.Where(ept => ept.Name == eptName));
                  _context.ExecuteQuery();
      
                  eptUid = eptList.First().Id;
              }
              catch (Exception ex)
              {
                  string msg = string.Format("GetEptUid: eptName = \"{0}\"\n\n{1}", eptName, ex.GetBaseException().ToString());
                  throw new ArgumentException(msg);
              }
              return eptUid;
          }
      
          public PublishedProject CreateProject(string prName, string description, DateTime startDate)
          {
              try
              {
                  System.Console.Write("\nCreating project: {0} ...", prName);
                  ProjectCreationInformation newProj = new ProjectCreationInformation();
      
                  newProj.Id = Guid.NewGuid();
                  newProj.Name = prName;
                  newProj.Description = description;
                  newProj.Start = startDate;
      
                  newProj.EnterpriseProjectTypeId = GetEptUid(basicEpt);
      
                  PublishedProject newPublishedProj = _context.Projects.Add(newProj);
                  QueueJob qJob = _context.Projects.Update();
                  JobState jobState = _context.WaitForQueue(qJob, timeoutSeconds);
      
                  if (jobState == JobState.Success)
                      return newPublishedProj;
                  else
                      return null;
              }
              catch (Exception ex)
              {
                  System.Console.ForegroundColor = ConsoleColor.Red;
                  System.Console.WriteLine("\nError: {0}", ex.Message);
                  System.Console.ResetColor();
                  return null;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 2014-09-23
        • 2016-10-14
        • 1970-01-01
        • 2018-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多