目前我正在为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
的方式。
我真的希望有人可以帮助我,因为我所有的研究都失败了。
答案 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。哦,是的,请不要忘记在调用命令时检查项目是否处于活动状态。