0

目前我正在为 MS Project 2010 开发一个插件。

在此插件中,用户通过几个标准过滤存储为 Project Server 上 MS 项目资源的所有员工。在找到匹配的人力资源后,用户应该能够将此资源添加到选定的任务中。

不幸的是,我没有找到在本地添加资源之间的链接

 _activeProject.Resources.Add("ResourceName") 

以及存储在服务器上的资源。Project 中显示的“ResourceName”与服务器上的“ResourceName”没有连接。

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

    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)

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

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

4

1 回答 1

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 中。哦,是的,请不要忘记在调用命令时检查您的项目是否处于活动状态。

于 2012-11-28T04:44:19.327 回答