MsProject技术交流群207637602

Project Server的Psi汇总

根据模板创建一个项目,返回的ProjectUid就是该项目的唯一标示号。另外由于受项目本身各种状态属性的影响,调用PSI方法时都要用try catch.

try 
{
Guid ProjectUid = projectSvc.CreateProjectFromTemplate(TemplateGuid,ProjectName);
}
catch (Exception ex)
{
	message = "Create project failed. <br />" + ex.Message;
}

 

//如果需要添加项目其他属性,如项目经理

ProjectWebSvc.ProjectDataSet projectDs = new ProjectWebSvc.ProjectDataSet();
projectDs = projectSvc.ReadProject(ProjectUid, ProjectWebSvc.DataStoreEnum.WorkingStore);
private Guid sessionUid = Guid.NewGuid();//迁出项目和迁入都需要这个Guid,必须一致。队列作业用于提交的Session的UID
private string session_desc = "";//对上面字段的描述
                try
                {
                    //迁出项目
                    projectSvc.CheckOutProject(ProjectUid, sessionUid, session_desc);                    
                }
                catch (Exception ex)
                {
                    message = "Create project success,but check out failed. <br />" + ex.Message;
                    return;
                }
//获取刚新建的项目对象
ProjectWebSvc.ProjectDataSet.ProjectRow project = projectDs. Project. FindByPROJ_UID(ProjectUid);
// ProjectOwnerID属性就是项目经理,这个人必须拥有创建项目的全局权限。
project.ProjectOwnerID = new Guid(ProjectOwnerID);

 

然后再checkin项目即可。

//为另外一个自定义域赋值(如:项目状态),这个自定义域在查阅表格中进行了定义,为字符串类型
ProjectWebSvc.ProjectDataSet.ProjectCustomFieldsRow cfRowPStatusText = projectDs.ProjectCustomFields.NewProjectCustomFieldsRow();
cfRowPStatusText.PROJ_UID = DraftProjectUid;
cfRowPStatusText.CUSTOM_FIELD_UID = Guid.NewGuid();
cfRowPStatusText.MD_PROP_UID = new Guid(PStatus);// PStatus是从ProjectServer_Published.dbo.MSP_CUSTOM_FIELDS中找到MD_PROP_NAME为“项目状态”的MD_PROP_UID的值。
cfRowPStatusText.FIELD_TYPE_ENUM = 21; //21 是文本类型
if (NewCreateUID != Guid.Empty)// NewCreateUID
{
    cfRowPStatusText.CODE_VALUE = ProjectStatusItemGuid;// ProjectStatusItemGuid是从ProjectServer_Published.dbo.MSP_LOOKUP_TABLE_VALUES_PUBLISHED_VIEW中找到的LT_VALUE_TEXT='项目状态A'的LT_STRUCT_UID
projectDs.ProjectCustomFields.AddProjectCustomFieldsRow(cfRowPStatusText);
}

 

//更新项目
                    Guid jobId = Guid.NewGuid();
                    projectSvc.QueueUpdateProject(jobId, sessionUid, projectDs, false);
                    this.psiWaitForQueue(queueSystemSvc, jobId);

                    ////Check in the project
                    bool isForceCheckIn = true;
                    Guid jobId1 = Guid.NewGuid();
                    projectSvc.QueueCheckInProject(jobId1, ProjectUid, isForceCheckIn, sessionUid, session_desc);
                    this.psiWaitForQueue(queueSystemSvc, jobId1);

                    //发布项目
                    Guid jobId2 = Guid.NewGuid();
                    projectSvc.QueuePublish(jobId2, ProjectUid, false, String.Empty);
                    this.psiWaitForQueue(queueSystemSvc, jobId2);

 

 

//接下来做一个更新资源属性(时间表审批者)的例子
ResourceWebSvc.ResourceDataSet resourceDs = new ResourceWebSvc.ResourceDataSet();
                    resourceDs = resourceSvc.ReadResource(item.resource);
                    try
                    {
                        resourceSvc.CheckOutResources(uids);
                    }
                    Catch(exception ex)
                    {
                        message = "check out resource failed. <br />" + ex.Message;
                    }
                    ResourceWebSvc.ResourceDataSet.ResourcesRow resource1 = resourceDs.Resources.FindByRES_UID(ResourceUID);
                    resource1.RES_TIMESHEET_MGR_UID =ResourceTimeSheetManagerUID;//为时间表审批者赋值,这个人需要有接受时间表的全局权限
                    //更新成功会自动迁入
                    try
                    {
                        resourceSvc.UpdateResources(resourceDs, false, true);  //auto check in 
                    }
                    Catch(exception ex)
                    {
                        item.message = "update resource property failed.<br>"+ex.Message;
                        resourceSvc.CheckInResources(uids, true);
                    }

 

//在已有项目中插入一条任务
projectDs = projectSvc.ReadProject(new Guid(ProjectUid), ProjectWebSvc.DataStoreEnum.WorkingStore);

//check out the project data
try
{
    projectSvc.CheckOutProject(new Guid(ProjectUid), sessionUid, session_desc);
}
catch (Exception ex)
{
    message = "Check out project failed. <br />" + ex.Message;
                    return;
}
//添加新任务行
ProjectWebSvc.ProjectDataSet.TaskRow taskRow = projectDs.Task.NewTaskRow();
taskRow.PROJ_UID = new Guid(ProjectUid);
taskRow.TASK_UID = TaskUID; //任务UID
taskRow.TASK_NAME = TaskName;//项目名称
taskRow.TASK_DUR_FMT = (int)PSLibrary.Task.DurationFormat.Day;//任务工期的格式化类型(分钟、小时、天 ,等等…)
//限制类型4表示开始时间不得早于(如果TASK_CONSTRAINT_TYPE大于2,则TASK_CONSTRAINT_TYPE 与 TASK_CONSTRAINT_DATE 必须同时指定,修改时也是必须同时修改,例如将TASK_CONSTRAINT_TYPE从4变为3,但是TASK_CONSTRAINT_DATE不变,那么这两个属性也必须同时修改,不过修改后有可能会带来整个项目工期的改变)
taskRow.TASK_CONSTRAINT_TYPE = 4;
//限制日期
taskRow.TASK_CONSTRAINT_DATE = DateTime.Now;
//任务的工期
taskRow.TASK_DUR = 0;

//表示添加任务行是在中间添加,而不是为某个任务添加子级
taskRow.AddPosition = (int)PSLibrary.Task.AddPositionType.Middle;
if (taskRow.AddPosition == (int)PSLibrary.Task.AddPositionType.Middle)
{
    //taskRow.AddAfterTaskUID表示前边任务的Uid,taskRow .TASK_PARENT_UID表示父级UID;两者不是同一概念
    taskRow.AddAfterTaskUID = new Guid(BeforeTaskUid);// BeforeTaskUid是同级任务中前一个任务的UID
   taskRow.TASK_OUTLINE_LEVEL = 3;//WBS的层级

}
projectDs.Task.AddTaskRow(taskRow);

bool isForceCheckIn = true;
Guid jobId3 = Guid.NewGuid();
projectSvc.QueueCheckInProject(jobId3, new Guid(ProjectUid), isForceCheckIn, sessionUid, session_desc);
this.psiWaitForQueue(queueSystemSvc, jobId3);

 

 

/// <summary>
        /// 监控整个队列作业的执行(通用方法)
        /// </summary>
        /// <param name="queueSystemSvc">queueSystem Web Service</param>
        /// <param name="jobId">job guid</param>
        public void psiWaitForQueue(QueueSystemWebSvc.QueueSystem queueSystemSvc, Guid jobId)
        {
            QueueSystemWebSvc.JobState jobState;
            const int QUEUE_WAIT_TIME = 4; // one second
            bool jobDone = false;
            string xmlError = string.Empty;
            int wait = 0;

            //Wait for the project to get through the queue.
            // - Get the estimated wait time in seconds.
            wait = queueSystemSvc.GetJobWaitTime(jobId);

            // - Wait for it.
            //logger.Info("Waiting on queue. Estimate: {0} seconds.\r\n " + wait);

            // - Wait until it is done.

            do
            {
                // - Get the job state.
                jobState = queueSystemSvc.GetJobCompletionState(jobId, out xmlError);

                if (jobState == QueueSystemWebSvc.JobState.Success)
                {
                    jobDone = true;
                }
                else
                {
                    if (jobState == QueueSystemWebSvc.JobState.Unknown
                    || jobState == QueueSystemWebSvc.JobState.Failed
                    || jobState == QueueSystemWebSvc.JobState.FailedNotBlocking
                    || jobState == QueueSystemWebSvc.JobState.CorrelationBlocked
                    || jobState == QueueSystemWebSvc.JobState.Canceled)
                    {
                        // If the job failed, error out.
                        throw (new ApplicationException("Queue request " + jobState + " for Job ID " + jobId + ".\r\n" + xmlError));
                        //logger.Error("Queue request " + jobState + " for Job ID " + jobId + ".\r\n" + xmlError);
                    }
                    else
                    {
                        //Console.WriteLine("Job State: " + jobState + " for Job ID: " + jobId);
                        //Console.Write("~");
                        Thread.Sleep(QUEUE_WAIT_TIME * 1000);
                    }
                }
            }
            while (!jobDone);
            //Console.Write("\r\n");
        }

 

 

研究ProjectServer的可以加我QQ  411033149,大家一起探讨!

posted @ 2012-07-29 23:33  鳄鱼的眼泪  阅读(710)  评论(1编辑  收藏  举报

专业MSProject,QQ411033149