MS Project中的资源添加:将与服务器相关的资源添加到项目的本地版本

时间:2012-11-27 12:56:52

标签: ms-project ms-project-server-2010 psi

目前我正在为MS Project 2010开发AddIn。

在此AddIn中,用户按几个条件筛选在Project Server上存储为MS Project Resources的所有员工。找到匹配的人力资源后,用户应该能够将此资源添加到选定的任务中。

不幸的是,我没有找到通过

在本地添加资源之间的链接
 _activeProject.Resources.Add("ResourceName") 

并且资源存储在服务器上。 Project中显示的“ResourceName”与服务器上的“ResourceName”没有任何关联。

我尝试通过PSI以某种方式从服务器加载Microsoft.Office.Interop.MSProject.Resource并通过以下方式将其添加到项目团队:

    Dim projectTeamRow As SvcProject.ProjectTeamDataSet.ProjectTeamRow = projectTeamDs.ProjectTeam.NewProjectTeamRow()
    projectTeamRow.PROJ_UID = projectGuid
    projectTeamRow.RES_UID = resGuid
    projectTeamRow.NEW_RES_UID = resGuid
    projectTeamDs.ProjectTeam.AddProjectTeamRow(projectTeamRow)

但那并不是我想要的。我只需要将一个与服务器相关的资源添加到项目的本地版本中。换句话说:我正在寻找一种将SvcProject.ProjectTeamDataSet.ProjectTeamRow转换为Microsoft.Office.Interop.MSProject.Resource的方式。

我真的希望有人可以帮助我,因为我所有的研究都失败了。

1 个答案:

答案 0 :(得分:1)

要将项目服务器中的资源添加到项目中,您需要知道资源的ID(非GUID)。此信息存储在 RES_ID 列中。只需从服务器查询资源并获取ID。

如果您计划添加多个资源 - 我建议在本地缓存资源列表。我正在使用此查询来组织我的附加组件中的几个词典:

ResourceDataSet resourceDs = new ResourceDataSet();

PSLibrary.Filter resourceFilter = new Microsoft.Office.Project.Server.Library.Filter();
resourceFilter.FilterTableName = resourceDs.Resources.TableName;

resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_IDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_UIDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_NAMEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TYPEColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_INITIALSColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_EXTERNAL_IDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_IS_WINDOWS_USERColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.WRES_ACCOUNTColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.WRES_EMAILColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));
resourceFilter.Fields.Add(new PSLibrary.Filter.Field(resourceDs.Resources.TableName, resourceDs.Resources.RES_TIMESHEET_MGR_UIDColumn.ColumnName, PSLibrary.Filter.SortOrderTypeEnum.None));

resourceDs = ReadResources(resourceFilter.GetXml(), false);

查询被定义为PSI中 ResourceClient 类的扩展名。

只要知道资源的ID,就执行:Application.EnterpriseResourceGet(resId, omissing);

申请来自Microsoft.Office.Interop.MSProject

此命令将资源从Project Server加载到Active Project。哦,是的,请不要忘记在调用命令时检查项目是否处于活动状态。