Ресурсы в надстройке MSProject: добавьте ресурс, связанный с сервером, в локальную версию проекта.

В настоящее время я занимаюсь разработкой AddIn для MS Project 2010.

В этой надстройке пользователь фильтрует всех сотрудников, хранящихся в виде ресурсов MS Project на Project Server, по нескольким критериям. После нахождения подходящего человеческого ресурса пользователь должен иметь возможность добавить этот ресурс к выбранной задаче.

К сожалению, я не нахожу связь между добавлением ресурса локально

 _activeProject.Resources.Add("ResourceName") 

и ресурс хранится на сервере. "ResourceName", показанное в Project, не имеет связи с "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)

Но это не совсем то, чего я хочу. Мне просто нужно добавить ресурс, связанный с сервером, в локальную версию проекта. Другими словами: я ищу способ преобразовать SvcProject.ProjectTeamDataSet.ProjectTeamRow к Microsoft.Office.Interop.MSProject.Resource,

Я действительно надеюсь, что кто-нибудь сможет мне помочь, так как все мои исследования провалились.

1 ответ

Решение

Чтобы добавить ресурс с сервера Project в ваш проект, вам нужно знать идентификатор ресурса (не GUID). Эта информация хранится в столбце RES_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);

Запрос определяется как расширение класса ResourceClient из PSI.

Как только вы узнаете идентификатор ресурса, просто выполните: Application.EnterpriseResourceGet(resId, omissing);

Приложение от Microsoft.Office.Interop.MSProject,

Эта команда загрузит ресурс из Project Server в активный проект. О да, пожалуйста, не забудьте проверить, что ваш проект активен, когда вы вызываете команду.

Другие вопросы по тегам