Поделиться через


Метод ResourcePlan.ReadResourcePlan

Считывает данные плана ресурсов для указанного проекта с помощью необязательный фильтр или диапазон дат. При необходимости извлекает плана ресурсов для внесения изменений.

Пространство имен:  WebSvcResourcePlan
Сборка:  ProjectServerServices (в ProjectServerServices.dll)

Синтаксис

'Декларация
<SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/ReadResourcePlan", RequestNamespace := "https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/",  _
    ResponseNamespace := "https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/",  _
    Use := SoapBindingUse.Literal, ParameterStyle := SoapParameterStyle.Wrapped)> _
Public Function ReadResourcePlan ( _
    filter As String, _
    projectUid As Guid, _
    startDate As DateTime, _
    endDate As DateTime, _
    timeScale As Short, _
    timephasedFTE As Boolean, _
    autoCheckOut As Boolean _
) As ResourcePlanDataSet
'Применение
Dim instance As ResourcePlan
Dim filter As String
Dim projectUid As Guid
Dim startDate As DateTime
Dim endDate As DateTime
Dim timeScale As Short
Dim timephasedFTE As Boolean
Dim autoCheckOut As Boolean
Dim returnValue As ResourcePlanDataSet

returnValue = instance.ReadResourcePlan(filter, _
    projectUid, startDate, endDate, timeScale, _
    timephasedFTE, autoCheckOut)
[SoapDocumentMethodAttribute("https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/ReadResourcePlan", RequestNamespace = "https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/", 
    ResponseNamespace = "https://schemas.microsoft.com/office/project/server/webservices/ResourcePlan/", 
    Use = SoapBindingUse.Literal, ParameterStyle = SoapParameterStyle.Wrapped)]
public ResourcePlanDataSet ReadResourcePlan(
    string filter,
    Guid projectUid,
    DateTime startDate,
    DateTime endDate,
    short timeScale,
    bool timephasedFTE,
    bool autoCheckOut
)

Параметры

  • filter
    Тип: System.String

    Содержит XML-фильтром для ограничения возвращаемых данных.

  • projectUid
    Тип: System.Guid

    Содержит идентификатор GUID проекта.

  • startDate
    Тип: System.DateTime

    Содержит дату начала.

  • endDate
    Тип: System.DateTime

    Содержит дату окончания.

  • timephasedFTE
    Тип: System.Boolean

    Если trueзначения времени преобразуются в вычислять эквивалент ресурсов.

  • autoCheckOut
    Тип: System.Boolean

    Если trueизвлекает плана ресурсов для редактирования.

Возвращаемое значение

Тип: WebSvcResourcePlan.ResourcePlanDataSet
ResourcePlanDataSet.PlanResourcesDataTable включает в себя данные, заданные с помощью filter или даты.

Замечания

Основной DataTable в ResoucePlanDataSet — это PlanResourcesDataTable.

Примечание

Параметр filter для работы с Criteria операторы для фильтрации строк только в основной PlanResourcesDataTable. Например нельзя использовать filter с помощью метода ReadResourcePlan для фильтрации строк в PlanAssignmentCustomFieldsDataTable. При попытке фильтрации строк в дополнительного DataTablePSI возвращает исключение FilterInvalid .

Тем не менее можно использовать метод Fields.Add для фильтрации столбцов в основной CalendarsDataTable и в любой дополнительного DataTable.

Примеры

В примере используется пространство имен SvcResourcePlan в сборке ProjectServerServices.dll прокси-сервера. Метод ConfigClientEndpoints используется файл app.config для определения привязки WCF, поведение и конечной точки для объекта resourcePlanClient , resourceClient и projectClient объектов. Сведения о создании и использовании Необходимые условия для примеров кода на основе WCF в Project 2013просматривать сборкой PSI прокси-сервера и файл app.config.

Примечание

В следующем примере показано использование метода ReadResourcePlan ; Это не полное решение.

Пример кода, о создании плана ресурсов в разделе QueueCreateResourcePlan. При использовании примера ReadResourcePlan , создайте проект, формирование рабочей группы проекта из корпоративных ресурсов и затем создание и публикация план ресурсов с помощью Project Web App.

После создания плана ресурсов и публикации проекта, скомпилируйте и запустите пример. Например следующую команду считывает плана ресурсов проекта с именем My резко проекта и затем записывает содержимое ResourcePlanDataSet в файле C:\Project\Samples\Output\ReadResourcePlanDS.xml .

ReadResourcePlan -project "My Swell Project"

Пример кода выглядит следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.ServiceModel;
using System.Data;
using System.Xml;
using PSLibrary = Microsoft.Office.Project.Server.Library;

namespace Microsoft.SDK.Project.Samples.ReadResourcePlan
{
    class ReadResourcePlan
    {

        private const string ENDPOINT_RESPLAN = "basicHttp_ResourcePlan";
        private const string ENDPOINT_R = "basicHttp_Resource";
        private const string ENDPOINT_P = "basicHttp_Project";
        private const string OUTPUT_FILES = @"C:\Project\Samples\Output\";
        private const string XML_FILE = "ReadResourcePlanDS.xml";

        private static SvcResourcePlan.ResourcePlanClient resourcePlanClient;
        private static SvcResource.ResourceClient resourceClient;
        private static SvcProject.ProjectClient projectClient;
        private static string outFile_ResourcePlanDS;

        static void Main(string[] args)
        {
            string projName = string.Empty;
            bool badNews = false;

            try
            {
                if (args.Length == 2)
                {
                    if (args[0].ToLower() == "-project")
                        projName = args[1];
                    else
                    {
                        Console.WriteLine("Incorrect argument: {0}", args[0]);
                        badNews = true;
                    }
                }
                else
                {
                    badNews = true;
                }

                if (badNews) throw new ApplicationException(
                    @"Usage: ReadResourcePlan -project ""Project Name""");

                // Configure the endpoints.
                bool configResult = false;
                configResult = ConfigClientEndpoints(ENDPOINT_RESPLAN);
                configResult = ConfigClientEndpoints(ENDPOINT_P);
                configResult = ConfigClientEndpoints(ENDPOINT_R);

                if (!configResult) throw new ApplicationException(
                    "Error(s) in WCF client configuration");

                // If output directory does not exist, create it.
                if (!Directory.Exists(OUTPUT_FILES))
                {
                    Directory.CreateDirectory(OUTPUT_FILES);
                }

                // Set the output file path.
                outFile_ResourcePlanDS = OUTPUT_FILES + XML_FILE;

                try
                {
                    GetResourcePlan(projName);
                }
                catch (FaultException fault)
                {
                    // Use the WCF FaultException, because the ASMX SoapException does not 
                    // exist in a WCF-based application.
                    WriteFaultOutput(fault);
                }
                catch (CommunicationException e)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(
                        "\n***System.ServiceModel.CommunicationException\n{0}:", e.Message);
                    Console.ResetColor();
                }
            }
            catch (Exception ex)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("\n\n***Exception:\n{0}", ex.Message);
                Console.ResetColor();
            }
            Console.Write("\nPress any key to exit: ");
            Console.ReadKey(true);
        }

        // Extract a PSClientError object from the WCF FaultException object, and
        // then display the exception details and each error in the PSClientError stack.
        private static void WriteFaultOutput(FaultException fault)
        {
            string errAttributeName;
            string errAttribute;
            string errOut;
            string errMess = "".PadRight(30, '=') + "\r\n"
                + "Error details: " + "\r\n";

            PSLibrary.PSClientError error = Helpers.GetPSClientError(fault, out errOut);
            errMess += errOut;

            if (error != null)
            {
                PSLibrary.PSErrorInfo[] errors = error.GetAllErrors();
                PSLibrary.PSErrorInfo thisError;

                for (int i = 0; i < errors.Length; i++)
                {
                    thisError = errors[i];
                    errMess += "\r\n".PadRight(30, '=') + "\r\nPSClientError output:\r\n";
                    errMess += thisError.ErrId.ToString() + "\n";

                    for (int j = 0; j < thisError.ErrorAttributes.Length; j++)
                    {
                        errAttributeName = thisError.ErrorAttributeNames()[j];
                        errAttribute = thisError.ErrorAttributes[j];
                        errMess += "\r\n\t" + errAttributeName
                            + ": " + errAttribute;
                    }
                }
            }
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(errMess);
            Console.ResetColor();
        }

        // Get the resource plan for the specified project.
        public static void GetResourcePlan(string projName)
        {
            Guid projUid = GetProjectUid(projName);

            // Get project start date and end date.
            List<DateTime> startFinishDates = GetStartFinishDates(projUid);
            if (startFinishDates.Count != 2) 
                throw new ApplicationException("Invalid project start and finish dates.");

            DateTime startDate = startFinishDates[0];
            DateTime endDate = startFinishDates[1];

            // Read the resource plan.
            Console.WriteLine("Reading the resource plan of the project: \n\t{0}\n\t{1}",
                projName, projUid.ToString());

            string resPlanFilter = string.Empty;
            bool fteTime = false;
            bool autoCheckOut = false;

            SvcResourcePlan.ResourcePlanDataSet resPlanDs = resourcePlanClient.ReadResourcePlan(
                resPlanFilter, projUid, startDate, endDate,
                (short)PSLibrary.ResourcePlan.TimeScale.Days, fteTime, autoCheckOut);

            // Write the ResourcePlan DataSet to an XML file.
            resPlanDs.WriteXml(outFile_ResourcePlanDS);
            Console.WriteLine("\nSee XML output of resource plan DataSet at {0}",
                outFile_ResourcePlanDS);
        }
   
        // Get the project GUID.
        public static Guid GetProjectUid(string projName)
        {
            Guid projUid = Guid.Empty;

            SvcProject.ProjectDataSet projectDs = projectClient.ReadProjectStatus(
                Guid.Empty, SvcProject.DataStoreEnum.PublishedStore, 
                projName, (int)PSLibrary.Project.ProjectType.Project);

            foreach (SvcProject.ProjectDataSet.ProjectRow project in projectDs.Project)
            {
                if (project.PROJ_NAME == projName)
                {
                    projUid = project.PROJ_UID;
                    break;
                }
            }
            if (projUid == Guid.Empty)
                throw new ApplicationException(string.Format("No project name: {0}", projName));

            return projUid;
        }

        // Get the project start date and finish date.
        public static List<DateTime> GetStartFinishDates(Guid projUid)
        {
            List<DateTime> dates = new List<DateTime>();

            SvcProject.ProjectDataSet projectDs = projectClient.ReadProject(
                projUid, SvcProject.DataStoreEnum.PublishedStore);

            dates.Add(projectDs.Project.Rows[0].Field<DateTime>("PROJ_INFO_START_DATE"));
            dates.Add(projectDs.Project.Rows[0].Field<DateTime>("PROJ_INFO_FINISH_DATE"));
            return dates;
        }

        // Configure the PSI client endpoints.
        public static bool ConfigClientEndpoints(string endpt)
        {
            bool result = true;

            switch (endpt)
            {
                case ENDPOINT_RESPLAN:
                    resourcePlanClient = new SvcResourcePlan.ResourcePlanClient(endpt);
                    break;
                case ENDPOINT_P:
                    projectClient = new SvcProject.ProjectClient(endpt);
                    break;
                case ENDPOINT_R:
                    resourceClient = new SvcResource.ResourceClient(endpt);
                    break;
                default:
                    result = false;
                    Console.WriteLine("Invalid endpoint: {0}", endpt);
                    break;
            }
            return result;
        }        
    }
    class Helpers
    {
        /// <summary>
        /// Extract a PSClientError object from the ServiceModel.FaultException,
        /// for use in output of the GetPSClientError stack of errors.
        /// </summary>
        /// <param name="e"></param>
        /// <param name="errOut">Shows that FaultException has more information 
        /// about the errors than PSClientError has. FaultException can also contain 
        /// other types of errors, such as failure to connect to the server.</param>
        /// <returns>PSClientError object, for enumerating errors.</returns>
        public static PSLibrary.PSClientError GetPSClientError(FaultException e,
                                                               out string errOut)
        {
            const string PREFIX = "GetPSClientError() returns null: ";
            errOut = string.Empty;
            PSLibrary.PSClientError psClientError = null;

            if (e == null)
            {
                errOut = PREFIX + "Null parameter (FaultException e) passed in.";
                psClientError = null;
            }
            else
            {
                // Get a ServiceModel.MessageFault object.
                var messageFault = e.CreateMessageFault();

                if (messageFault.HasDetail)
                {
                    using (var xmlReader = messageFault.GetReaderAtDetailContents())
                    {
                        var xml = new XmlDocument();
                        xml.Load(xmlReader);

                        var serverExecutionFault = xml["ServerExecutionFault"];
                        if (serverExecutionFault != null)
                        {
                            var exceptionDetails = serverExecutionFault["ExceptionDetails"];
                            if (exceptionDetails != null)
                            {
                                try
                                {
                                    errOut = exceptionDetails.InnerXml + "\r\n";
                                    psClientError =
                                        new PSLibrary.PSClientError(exceptionDetails.InnerXml);
                                }
                                catch (InvalidOperationException ex)
                                {
                                    errOut = PREFIX + "Unable to convert fault exception info ";
                                    errOut += "a valid Project Server error message. Message: \n\t";
                                    errOut += ex.Message;
                                    psClientError = null;
                                }
                            }
                            else
                            {
                                errOut = PREFIX + "The FaultException e is a ServerExecutionFault, "
                                    + "but does not have ExceptionDetails.";
                            }
                        }
                        else
                        {
                            errOut = PREFIX + "The FaultException e is not a ServerExecutionFault.";
                        }
                    }
                }
                else // No detail in the MessageFault.
                {
                    errOut = PREFIX + "The FaultException e does not have any detail.";
                }
            }
            errOut += "\r\n" + e.ToString() + "\r\n";
            return psClientError;
        }
    }
}

Для проекта, который расширяет за две недели с помощью метода ReadResourcePlan с шкалы времени в недель показаны два интервалов с именем Interval0 и Interval1 в плане ресурсов. В этом примере интервалов плана ресурсов отображается нулевое значение времени. Ниже приведен пример выходных данных в файле ReadResourcePlanDS.xml.

<?xml version="1.0" standalone="yes"?>
<ResourcePlanDataSet xmlns="https://schemas.microsoft.com/office/project/server/webservices/ResourcePlanDataSet/">
  <Utilization>
    <PROJ_UID>4f4b5ffb-e143-4c84-9cf4-299d316c7d8e</PROJ_UID>
    <RESPLAN_UTILIZATION_TYPE>0</RESPLAN_UTILIZATION_TYPE>
  </Utilization>
  <PlanResources>
    <RES_UID>0285a4e6-53f8-459a-945a-62f7ca465400</RES_UID>
    <PROJ_UID>4f4b5ffb-e143-4c84-9cf4-299d316c7d8e</PROJ_UID>
    <ASSN_UID>cc3f29ec-d033-473e-a6c4-5604c2e84601</ASSN_UID>
    <RES_NAME>Resource Name1</RES_NAME>
    <RES_TYPE>2</RES_TYPE>
    <RES_CAN_LEVEL>true</RES_CAN_LEVEL>
    <RES_TIMESHEET_MGR_UID>0285a4e6-53f8-459a-945a-62f7ca465400</RES_TIMESHEET_MGR_UID>
    <RES_DEF_ASSN_OWNER>0285a4e6-53f8-459a-945a-62f7ca465400</RES_DEF_ASSN_OWNER>
    <RES_INITIALS>R1</RES_INITIALS>
    <RES_ID>71</RES_ID>
    <ASSN_BOOKING_TYPE>0</ASSN_BOOKING_TYPE>
    <RES_IS_TEAM>false</RES_IS_TEAM>
    <RES_CHECKOUTDATE>2010-10-06T16:08:23.17-07:00</RES_CHECKOUTDATE>
    <Interval0>0</Interval0>
    <Interval1>0</Interval1>
  </PlanResources>
  <PlanResources>
    <RES_UID>009380d1-29ad-40df-9511-f82adb874834</RES_UID>
    <PROJ_UID>4f4b5ffb-e143-4c84-9cf4-299d316c7d8e</PROJ_UID>
    <ASSN_UID>ad15c911-ac55-4463-9d1c-cf29d9b6938a</ASSN_UID>
    <RES_NAME>Resource Name2</RES_NAME>
    <RES_TYPE>2</RES_TYPE>
    <RES_CAN_LEVEL>true</RES_CAN_LEVEL>
    <RES_TIMESHEET_MGR_UID>009380d1-29ad-40df-9511-f82adb874834</RES_TIMESHEET_MGR_UID>
    <RES_DEF_ASSN_OWNER>009380d1-29ad-40df-9511-f82adb874834</RES_DEF_ASSN_OWNER>
    <RES_INITIALS>R2</RES_INITIALS>
    <RES_ID>24</RES_ID>
    <ASSN_BOOKING_TYPE>0</ASSN_BOOKING_TYPE>
    <RES_HIRE_DATE>2010-09-21T00:00:00-07:00</RES_HIRE_DATE>
    <RES_TERMINATION_DATE>2011-09-25T00:00:00-07:00</RES_TERMINATION_DATE>
    <RES_IS_TEAM>false</RES_IS_TEAM>
    <RES_CHECKOUTDATE>2010-10-06T15:43:12.73-07:00</RES_CHECKOUTDATE>
    <Interval0>0</Interval0>
    <Interval1>0</Interval1>
  </PlanResources>
  <Dates>
    <StartDate>2010-10-27T00:00:00-07:00</StartDate>
    <EndDate>2010-11-01T00:00:00-07:00</EndDate>
    <IntervalName>Interval0</IntervalName>
  </Dates>
  <Dates>
    <StartDate>2010-11-01T00:00:00-07:00</StartDate>
    <EndDate>2010-11-05T00:00:00-07:00</EndDate>
    <IntervalName>Interval1</IntervalName>
  </Dates>
</ResourcePlanDataSet>

См. также

Справочные материалы

ResourcePlan класс

Элементы ResourcePlan

Пространство имен WebSvcResourcePlan

Другие ресурсы

How to: Use a Filter Parameter with PSI Methods