MS Project 2010 PSI: есть ли способ получить пользовательские значения полей без загрузки проекта? - PullRequest
1 голос
/ 11 февраля 2011

Я пытаюсь найти конкретный проект по значению настраиваемого поля. Пока что это лучший способ сделать это:

var targetProjectId = "some_external_reference_ID";
var projIdCustomFieldUid = GetCustomFieldUidByName("ExternalProjectId");
var projectList = base.ProjectClient.ReadProjectList();

foreach (ProjectDataSet.ProjectRow projRow in projectList.Project.Rows)
{
    var fullProj = base.ProjectClient.ReadProject(projRow.PROJ_UID, DataStoreEnum.WorkingStore);
        if (fullProj != null)
        {
            var cf = fullProj.ProjectCustomFields.Where(x => x.MD_PROP_UID == projIdCustomFieldUid && x.TEXT_VALUE == targetProjectId ).FirstOrDefault();
            if (cf != null)
            {
                return fullProj;
            }
        }
    }
    return null;
}

Как вы можете себе представить, цикл по всем проектам и загрузка каждого из них для проверки значения настраиваемого поля ужасно медленная и безобразная. Мне нужно как можно быстрее идентифицировать PROJ_UID по значению настраиваемого поля, таким образом:

Есть ли способ получить значения настраиваемых полей без загрузки всего проекта?

Ответы [ 3 ]

1 голос
/ 15 февраля 2011

Если вам нужны только опубликованные проекты, я бы использовал SQL-запрос к базе данных ProjectServer_Reporting, возможно, представление MSP_EPMProject_UserView. Это представление включает столбцы для большинства типов настраиваемых полей.

SELECT
  ProjectUid
  ,ProjectName
FROM
  MSP_EPMProject_UserView mepuv
WHERE
  mepuv.[My Custom Field] = 'the value I care about'

Если вам действительно нужно вызвать это через PSI, тогда iirc, есть фильтрованный запрос, который вы можете выполнить, чтобы получить только нужные вам проекты, но у меня нет синтаксиса передо мной Дайте мне знать, если вы действительно хотите использовать PSI для этого вместо метода SQL, и я посмотрю на это.

Надеюсь, это поможет ... Джеймс Фрейзер

0 голосов
/ 30 августа 2011

Для загрузки пользовательских полей без загрузки всего проекта вы можете использовать ReadProjectEntities, например, ReadProjectEntities (..., 32, ...), где 32 идентифицирует объекты CustomField

0 голосов
/ 13 февраля 2011

Используя версию PSI 2007 года, мы столкнулись с той же проблемой. Мы решили синхронизировать все пользовательские свойства метаданных со списком SharePoint. Это позволяет очень легко запрашивать и потреблять. Тем не менее, синхронизация требует много усилий.

Я думаю, что альтернативой было бы запросить базу данных отчетов, но я не смог найти хороший источник информации для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...