Compartir a través de


del método ResourcePlan.ReadResourcePlan

Lee datos del plan de recursos para el proyecto especificado mediante el uso de un filtro opcional o un intervalo de fechas. De forma opcional, se desprotege el plan de recursos para su modificación.

Espacio de nombres:  WebSvcResourcePlan
Ensamblado:  ProjectServerServices (en ProjectServerServices.dll)

Sintaxis

'Declaración
<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
'Uso
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
)

Parámetros

  • filter
    Tipo: System.String

    Contiene el filtro XML para limitar los datos que se devuelven.

  • projectUid
    Tipo: System.Guid

    Contiene el GUID de proyecto.

  • timephasedFTE
    Tipo: System.Boolean

    Si true, convierte los valores de tiempo en un recurso equivalente a tiempo completo.

  • autoCheckOut
    Tipo: System.Boolean

    Si true, desprotege el plan de recursos para su edición.

Valor devuelto

Tipo: WebSvcResourcePlan.ResourcePlanDataSet
El ResourcePlanDataSet.PlanResourcesDataTable incluye los datos que se especifican mediante los parámetros filter o fecha.

Comentarios

La principal DataTable en un ResoucePlanDataSet es la PlanResourcesDataTable.

Nota

El parámetro filter funciona con los operadores de Criteria para filtrar filas únicamente en el principal PlanResourcesDataTable. Por ejemplo, no puede usar filter con el método ReadResourcePlan para filtrar filas en la PlanAssignmentCustomFieldsDataTable. Si intenta filtrar filas en un secundario DataTable, la interfaz PSI devuelve una excepción FilterInvalid .

Sin embargo, puede usar el método Fields.Add para filtrar columnas en el principal CalendarsDataTable y en cualquier secundario DataTable.

Ejemplos

En el ejemplo se usa el espacio de nombres SvcResourcePlan en el archivo de proxy projectserverservices.dll. El método ConfigClientEndpoints usa un archivo app.config para establecer el enlace WCF, el comportamiento y el extremo para los objetos resourcePlanClient , resourceClient y projectClient . Para obtener información sobre cómo crear y usar un ensamblado de proxy PSI y un archivo app.config, vea Prerequisites for WCF-Based Code Samples.

Nota

En el ejemplo siguiente se muestra el uso del método ReadResourcePlan ; no es una solución completa.

Para el código de ejemplo sobre cómo crear un plan de recursos, consulte QueueCreateResourcePlan. Para utilizar el ejemplo ReadResourcePlan , cree un proyecto, genere el equipo de proyecto de los recursos de empresa y, a continuación, crear y publicar un plan de recursos mediante el uso de Project Web App.

Después de crea el plan de recursos y se publica el proyecto, compile y ejecute el ejemplo. Por ejemplo, el comando siguiente lee el plan de recursos para un proyecto denominado Proyecto de aumentar mi y, a continuación, escribe el contenido de ResourcePlanDataSet en el archivo C:\Project\Samples\Output\ReadResourcePlanDS.xml .

ReadResourcePlan -project "My Swell Project"

El código de ejemplo es el siguiente:

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;
        }
    }
}

Para un proyecto que se extiende a más de dos semanas, con el método de ReadResourcePlan con la escala temporal en semanas muestra dos intervalos denominados Interval0 y Interval1 en el plan de recursos. En este ejemplo, los intervalos de plan de recursos contienen 0 horas de tiempo. A continuación se muestra un ejemplo de salida en el archivo 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>

Vea también

Referencia

clase ResourcePlan

Miembros ResourcePlan

Espacio de nombres WebSvcResourcePlan

Otros recursos

How to: Use a Filter Parameter with PSI Methods