zoukankan      html  css  js  c++  java
  • 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,大家一起探讨!

  • 相关阅读:
    mysql 下 计算 两点 经纬度 之间的距离
    富爸爸财务自由之路
    Ubuntu16.04忘记MySQL5.7的root用户密码之解决方案
    Windowns下code: command not found
    Linux下CRMEB环境搭建
    PHP无法使用curl_init()函数
    请在mysql配置文件修sql-mode或sql_mode为NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    apache不能解析php之解决办法
    windows上hexo: command not found
    SyntaxError: Non-ASCII character 'æ' in file csdn.py on line 7, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
  • 原文地址:https://www.cnblogs.com/olay/p/2614423.html
Copyright © 2011-2022 走看看