Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original.
Traducción
Original

Realizar consultas a fuentes de OData para datos de informes de Project Server 2013

Office 2013

Aprenda distintas formas de hacer consultas OData del servicio ProjectData en Project Server 2013.

Última modificación: viernes, 31 de enero de 2014

Hace referencia a: Project Server 2013

En este artículo
Creación de consultas REST
Creación de consultas LINQ
Consulta de campos personalizados
Recursos adicionales

Para leer los datos de informes en Project Server 2013, existen varias formas de hacer consultas OData del servicio ProjectData. El Centro de inteligencia empresarial de Project Web App incluye la página Conexiones de datos, donde puede seleccionar la conexión de datos de Office (ODC) para los informes OData de Project Server. Al elegir la ODC predeterminada, se abre un libro de Excel 2013, donde puede crear tablas dinámicas, gráficos dinámicos e informes de Power View. Se incluyen varios informes predeterminados en Project Server 2013.

Puede crear aplicaciones personalizadas que estén desarrolladas con Microsoft .NET Framework 4, como aplicaciones para informes locales o informes remotos, o bien un elemento web de Silverlight. Para una aplicación de Windows Phone, puede usar la sintaxis de consulta LINQ en instrucciones de Visual C#, instrucciones de Visual Basic u otros lenguajes de .NET Framework. Si lo desea, puede usar la sintaxis Lambda con métodos LINQ para hacer las mismas consultas. Para las aplicaciones que desarrolle para la Web u otros dispositivos, puede usar consultas REST o instrucciones de JavaScript .

La descarga del SDK de Project 2013 incluye la aplicación para Office de ejemplo HelloProject_OData, que usa una consulta REST con JavaScript y JQuery para resumir la información del servicio ProjectData en un panel de tareas en Project Profesional 2013.

Muchas herramientas de terceros y las aplicaciones de consumidor de OData están disponibles que pueden ayudarle a crear y probar consultas con rapidez. Puede pegar la dirección URL de REST en un explorador y ver los datos en el origen de la página o en un web herramienta como Fiddler (http://www.fiddler2.com) de depuración. Para obtener vínculos a herramientas como el Explorador de OData y LINQPad, elija los consumidores en el ecosistema de Open Data Protocol (http://msopentech.com/odataorg/ecosystem).

Para obtener más información acerca de las consultas de OData en SharePoint 2013, consulte Usar operaciones de consulta de OData en solicitudes REST de SharePoint.

El contenido XML de un modelo de datos de entidades (Entity Data Model) también se conoce como documento de metadatos del servicio (Service Metadata Document) o esquema OData. El documento de metadatos del servicio ProjectData especifica las entidades y relaciones que están disponibles en los datos de informes de Project Server. En el Procedimiento 1, se muestra cómo usar el esquema OData del servicio ProjectData para ayudar a crear consultas REST de los datos de informes de Project Server.

Procedimiento 1. Para usar el esquema OData y crear consultas REST de los datos de informes de Project Server

  1. La URL del servicio ProjectData es http://ServerName/ProjectServerName/_api/ProjectData. Por ejemplo, si el sitio de Project Web App es http://MyServer/pwa, para obtener el documento de metadatos del servicio, introduzca la siguiente URL en un explorador: http://MyServer/pwa/_api/ProjectData/$metadata.

  2. Guarde los datos XML en un archivo. Por ejemplo, guárdelos en un archivo con el nombre ProjectData.xml. El elemento Schema ReportingData contiene elementos EntityType y elementos Association. El elemento EntityContainer ReportingData contiene elementos EntitySet y elementos AssociationSet.

  3. Para dar formato al archivo ProjectData.xml para una lectura más fácil, abra el archivo en Visual Studio, elija Avanzadas en el menú Editar y luego elija Dar formato al documento. O bien, elija el icono Dar formato al documento en la barra de herramientas Editor XML.

  4. Para mostrar directamente los datos XML de consultas REST en el explorador, desactive la vista de lectura de fuentes. Por ejemplo, en Internet Explorer, siga estos pasos:

    1. Abra el cuadro de diálogo Opciones de Internet.

    2. Elija la pestaña Contenido.

    3. En la sección Fuentes y Web Slices, elija Configuración.

    4. En la sección Opciones avanzadas del cuadro de dialogo Configuración de fuente y Web Slice, desactive la casilla Activar la vista de lectura de fuentes.

    5. Elija Aceptar y reinicie Internet Explorer.

  5. Para obtener la lista de elementos EntitySet, que son las colecciones de entidades principales que están disponibles en el servicio ProjectData, use la siguiente URL en el explorador: http://ServerName/ProjectServerName/_api/ProjectData

    En el resultado XML, por ejemplo, los elementos collection muestran que puede hacer directamente una consulta sobre Projects y ProjectBaselines.

    <collection href="Projects">
      <atom:title>Projects</atom:title> 
    </collection>
    <collection href="ProjectBaselines">
      <atom:title>ProjectBaselines</atom:title> 
    </collection>
    

    Para más información sobre estos conjuntos de entidades, vea Elemento EntitySet: Projects y Elemento EntitySet: ProjectBaselines.

  6. Para obtener la colección de proyectos, además de las asociaciones y propiedades de cada proyecto, use http://ServerName/ProjectServerName/_api/ProjectData/Projects.

  7. Para obtener las asociaciones y propiedades de un proyecto determinado, especifique la clave principal del tipo de entidad Project (vea el elemento Key en Elemento EntityType: Project). Por ejemplo, la propiedad ProjectId es la clave principal de la entidad Project. ProjectId es del tipo Edm.Guid. La consulta sobre un proyecto específico puede expresarse como http://ServerName/ProjectServerName/_api/ProjectData/Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208').

    Los elementos link en los resultados XML muestran las extensiones URL para las asociaciones de ese proyecto. Por ejemplo, los atributos href en los siguientes elementos link muestran cómo obtener la colección de asignaciones y tareas del proyecto.

    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Assignments"
        type="application/atom+xml;type=feed" 
        title="Assignments" href="Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208')/Assignments" />
    . . .
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Tasks" 
        type="application/atom+xml;type=feed" 
        title="Tasks" href="Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208')/Tasks" />
    . . .
    

    El tema de referencia Elemento EntityType: Project muestra todas las asociaciones y propiedades disponibles para el tipo de entidad Project. Por ejemplo, los resultados de la consulta incluyen la fecha de inicio real y el número de horas de trabajo real completadas en el proyecto, de la siguiente manera:

    . . .
    <content type="application/xml">
      <m:properties>
        <d:ProjectId m:type="Edm.Guid">263fc8d7-427c-e111-92fc-00155d3ba208</d:ProjectId>
        . . .
        <d:ProjectActualStartDate m:type="Edm.DateTime">2012-04-02T08:00:00</d:ProjectActualStartDate>
        <d:ProjectActualWork m:type="Edm.Decimal">32.000000</d:ProjectActualWork>
        . . .
      </m:properties>
    </content>
    
  8. Para hacer una consulta sobre una sola propiedad del proyecto, por ejemplo, el nombre del proyecto, use la siguiente consulta: http://ServerName/ProjectServerName/_api/ProjectData/Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208')/ProjectName

  9. Para hacer una consulta sobre varias propiedades del proyecto, por ejemplo, el nombre, el costo y la moneda del proyecto, use la siguiente consulta: http://ServerName/ProjectServerName/_api/ProjectData/Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208')?$select=ProjectName,ProjectCost,ProjectCurrency. Los resultados incluyen:

    <id>http://ServerName/ProjectServerName/_api/ProjectData
        /Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208')</id>
    <category term="ReportingData.Project" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <link rel="edit" title="Project" href="Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208')" />
    . . .
    <content type="application/xml">
      <m:properties>
        <d:ProjectCost m:type="Edm.Decimal">3600.000000</d:ProjectCost>
        <d:ProjectCurrency>USD</d:ProjectCurrency>
        <d:ProjectName>My project name</d:ProjectName>
      </m:properties>
    </content>
    
  10. Como uno de los elementos NavigationProperty del elemento EntityType: Project usa la relación del elemento Association: Project_Tasks_Task_Project, puede usar la siguiente consulta para obtener todas las tareas del proyecto: http://ServerName/ProjectServerName/_api/ProjectData/Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208')/Tasks. Los resultados incluyen los elementos link para las asociaciones de entidades de cada tarea, además de las propiedades de cada tarea. La tarea de resumen del proyecto es la primera tarea que aparece en los resultados, donde TaskIndex = 0.

    En una consulta que empieza con un proyecto, el resultado XML muestra una clave principal y una clave externa para cada asociación de tareas. Por ejemplo, los datos XML incluyen la asociación de una tarea determinada y la asociación de las asignaciones de esa tarea. En los siguientes resultados XML de la consulta, ProjectId es la clave principal, mientras que TaskId es la clave externa. En el tema Elemento EntityType: Task, se muestran ambas claves.

    . . .
    <link rel="edit" title="Task" 
        href="Tasks(ProjectId=guid'263fc8d7-427c-e111-92fc-00155d3ba208', 
        TaskId=guid'3631bf8b-427c-e111-92fc-00155d3ba208')" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Assignments" 
        type="application/atom+xml;type=feed" title="Assignments" 
        href="Tasks(ProjectId=guid'263fc8d7-427c-e111-92fc-00155d3ba208', 
        TaskId=guid'3631bf8b-427c-e111-92fc-00155d3ba208')/Assignments" />
    . . .
    

Puede recorrer el modelo de datos de entidades con las consultas REST. Cada elemento EntityType del elemento Schema ReportingData muestra las propiedades y asociaciones que están disponibles para esa entidad.

Además de las consultas básicas, puede utilizar las opciones de cadena de consulta como $select, $skip, $top, $filtery $orderby. La consulta $links y la opción de consulta de $expand no se implementan en el servicio de ProjectData . Para obtener más información, vea Opciones de cadena de consulta en la documentación de Odata.org.

Nota Nota

El servicio de ProjectData implementa la paginación para los conjuntos de entidades, para limitar el número de entidades que pueden devolverse en una consulta. Puede utilizar el comando Get-SPProjectOdataConfiguration o el conjunto SPProjectOdataConfiguration en el Shell de administración de SharePoint de 2013 para obtener o establecer los límites para una entidad especificada como Tasks, o para todas las entidades de 33. Para obtener más información, consulte ProjectData - OData service reference.

A continuación, se incluyen más ejemplos de consultas REST (los ejemplos no muestran la primera parte de la URL, que es http://ServerName/ProjectServerName/_api/ProjectData):

  • Obtenga todas las asignaciones de la instancia de Project Web App: ~/Assignments

    Nota Nota

    En el caso de las consultas que devuelven una gran cantidad de datos, pueda usar una opción de URL $filter para reducir los datos. Para conocer otras formas de limitar la cantidad de datos, vea ProjectData: referencia de servicio OData de Project 2013.

  • Para obtener todas las asignaciones de un proyecto determinado, cualquiera de las siguientes consultas logra los mismos resultados:

    ~/Assignments?$filter=ProjectId eq guid'263fc8d7-427c-e111-92fc-00155d3ba208'

    O bien:

    ~/Assignments?$filter=ProjectName eq 'My project name'

    ProjectId es la clave principal de la entidad Assignment, pero la opción $filter puede usar cualquier propiedad de la entidad Assignment.

  • Aquí se muestra otra consulta para obtener las asignaciones de un proyecto determinado: ~/Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208')/Assignments

  • Obtenga el nombre del recurso de una asignación determinada: ~/Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208')/Assignments(ProjectId=guid'263fc8d7-427c-e111-92fc-00155d3ba208',AssignmentId=guid'a0eafeb5-437c-e111-92fc-00155d3ba208')/ResourceName

  • Como los elementos NavigationProperty se relacionan con un elemento Association que tiene dos extremos, también puede navegar hacia atrás mediante una URL de REST. Por ejemplo, para obtener el proyecto de una asignación determinada, cualquiera de las siguientes consultas logra los mismos resultados:

    ~/Assignments(ProjectId=guid'263fc8d7-427c-e111-92fc-00155d3ba208',AssignmentId=guid'a0eafeb5-437c-e111-92fc-00155d3ba208')/Project

    O bien:

    ~/Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208')/Assignments(ProjectId=guid'263fc8d7-427c-e111-92fc-00155d3ba208',AssignmentId=guid'a0eafeb5-437c-e111-92fc-00155d3ba208')/Project

Nota Nota

Debido a que algunos exploradores usan un valor predeterminado de unos 2.000 caracteres como longitud máxima para las URL, es posible que un explorador limite las consultas REST del servicio ProjectData para que devuelvan un elemento (una propiedad o una colección) hasta dos pasos de colección de elementos primarios a secundarios. Por ejemplo, una consulta de dos pasos de Projects a Tasks se puede expresar como ~/Projects(projectId)/Tasks(projectId, taskId)/Assignments. Esta consulta obtiene la colección de asignaciones de un proyecto y tarea determinados.

Pero es posible que una consulta de tres pasos para obtener un elemento de asignación determinado exceda la longitud máxima predeterminada para las URL. Por ejemplo, es posible que ~/Projects(projectId)/Tasks(projectId, taskId)/Assignments(assignmentId, projectId,) no funcione. Para que una URL más corta obtenga una asignación determinada o una propiedad de asignación, use una consulta de un paso o de dos pasos, como ~/Assignments(projectId, assignmentId) o ~/Tasks(projectId, taskId)/Assignments(projectId, assignmentId)/ResourceName.

También puede aumentar el valor del atributo maxUrlLength en el elemento httpRuntime del archivo web.config para Project Web App (en el directorio [Program Files]\Microsoft Office Servers\15.0\WebServices\Shared\ProjectServer\PSI). Para más información, vea Elemento httpRuntime (Esquema de configuración de ASP.NET).

En el Procedimiento 2, se muestra cómo crear consultas LINQ en Visual C# mediante expresiones en la sintaxis de consulta LINQ declarativa y mediante la sintaxis de método con expresiones lambda. Puede usar Visual Studio 2010 o Visual Studio 2012.

Procedimiento 2. Para crear una aplicación sencilla para las consultas LINQ de los datos de informes de Project Server

  1. Cree un proyecto de Visual Studio que use la plantilla de aplicación de consola de Windows. Seleccione el .NET Framework 4 de destino. Por ejemplo, cree un proyecto con el nombre TestProjectData.

  2. Agregue una referencia al servicio ProjectData, cuya dirección es http://ServerName/ProjectServername/_api/ProjectData/$metadata. En el cuadro de diálogo Agregar referencia de servicio, elija Ir para resolver la dirección, seleccione el servicio ReportingData y luego asigne un nombre al espacio de nombres de la referencia de servicio. Por ejemplo, asigne el nombre ProjectOData al espacio de nombres. Si expande el nodo ReportingData, podrá ver todos los conjuntos de entidades definidos en el servicio ProjectData (vea la Figura 1).

    Figura 1. Configuración de una referencia de servicio OData

    Configuración de una referencia de servicio OData

    Visual Studio agrega la referencia System.Data.Services.Client necesaria cuando crea la referencia de servicio ProjectOData.

  3. Agregue el siguiente código al archivo Program.cs. La variable context se inicializa con los metadatos del EDM ProjectData, que estableció al agregar la referencia de servicio ProjectOData.

    La variable projectQuery1 se establece en una expresión de consulta LINQ para los proyectos, donde la fecha de inicio del proyecto es posterior al 1 de enero de 2012, y los resultados se clasifican por nombre del proyecto. La variable projectQuery1 es del tipo IOrderedQueryable<ProjectOData.Project>.

    La variable projectQuery2 produce los mismos resultados de consulta con expresiones lambda. La variable projectQuery2 es del tipo IQueryable<ProjectOData.Project>. .NET Framework convierte internamente projectQuery1 para usar la sintaxis de método de projectQuery2.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Data.Services.Client;
    
    namespace TestProjectData
    {
        class Program
        {
            private const string PSDATA = "http://ServerName/ProjectServername/_api/ProjectData";
            
            static void Main(string[] args)
            {
                ProjectOData.ReportingData context = 
                    new ProjectOData.ReportingData(new Uri(PSDATA, UriKind.Absolute));
                context.Credentials = CredentialCache.DefaultCredentials;
    
                var projectQuery1 = from p in context.Projects
                                    where p.ProjectStartDate > new DateTime(2012, 1, 1)
                                    orderby p.ProjectName
                                    select p;
    
                Console.WriteLine("Using declarative LINQ query syntax:\n");
                foreach (ProjectOData.Project proj in projectQuery1)
                {
                    Console.WriteLine(proj.ProjectName + " :\tStart date: " + proj.ProjectStartDate.ToString());
                }
    
                var projectQuery2 = context.Projects
                                       .Where(p => (p.ProjectStartDate > new DateTime(2012, 1, 1)))
                                       .OrderBy(p => p.ProjectName)
                                       .Select(p => p);
    
                Console.WriteLine("\n\nUsing lambda expressions for a LINQ query:\n");
                foreach (ProjectOData.Project proj in projectQuery2)
                {
                    Console.WriteLine(proj.ProjectName + " :\tStart date: " + proj.ProjectStartDate.ToString());
                }
    
                Console.Write("\nPress any key to exit: ");
                Console.ReadKey(true);
            }
        }
    }
    
  4. Defina un punto de interrupción tras inicializar la variable projectQuery1 y ejecute la aplicación. Internamente, Visual Studio convierte primero la consulta en sintaxis de método OData con expresiones lambda y luego en una consulta REST para el servicio OData. A continuación, se muestra la consulta REST para projectQuery1 (todo en una línea):

    http://ServerName/ProjectServerName/_api/ProjectData/Projects()
        ?$filter=ProjectStartDate gt datetime'2012-01-01T00:00:00'
        &$orderby=ProjectName}
    

Al ejecutar la aplicación TestProjectData, la consola muestra el siguiente resultado para tres proyectos de ejemplo publicados en Project Web App:

Using declarative LINQ query syntax:

Imported from SharePoint :      Start date: 4/2/2012 8:00:00 AM
Test Proj 1 :   Start date: 4/5/2012 12:00:00 AM
WinProj test 1 :     Start date: 4/1/2012 8:00:00 AM

Using lambda expressions for a LINQ query:

Imported from SharePoint :      Start date: 4/2/2012 8:00:00 AM
Test Proj 1 :   Start date: 4/5/2012 12:00:00 AM
WinProj test 1 :     Start date: 4/1/2012 8:00:00 AM

Press any key to exit:

Debido a que el servicio ProjectData no implementa la opción de consulta $links ni la opción de consulta $expand, no es posible consultar directamente un tipo de entidad como elemento secundario de otro tipo de entidad. Por ejemplo, para obtener las tareas de un proyecto, no puede usar el conjunto de entidades Projects en una expresión como context.Projects(guid'263fc8d7-427c-e111-92fc-00155d3ba208').Tasks. Puede obtener las tareas de un proyecto con el conjunto de entidades Tasks, por ejemplo:

var taskQuery = context.Tasks
                        .Where(t => (t.ProjectId == 
                            new Guid("263fc8d7-427c-e111-92fc-00155d3ba208")))
                        .OrderBy(t => t.TaskIndex)
                        .Select(t => t);

Cuando define una referencia de servicio a ProjectData o la consulta ~/ProjectData/$metadata, el modelo de datos de entidades (EDM o esquema OData) incluye propiedades de campos personalizados en el momento en que se realiza la referencia. Por ejemplo, los campos personalizados predeterminados en Project Web App incluyen el campo personalizado de texto RBS para la entidad Resource, el campo personalizado Health para la entidad Task y el campo personalizado Project Departments para la entidad Project. Debido a que RBS y Health se propagan a las asignaciones, la entidad Assignment incluye la propiedad Health_T y la propiedad RBS_R, como se muestra a continuación:

<EntityType Name="Assignment">
  . . .
  <Property Name="Health_T" Type="Edm.String" />
  <Property Name="RBS_R" Type="Edm.String" />
  . . .
</EntityType>
<EntityType Name="Project">
    . . .
    <Property Name="ProjectDepartments" Type="Edm.String" />
    . . .
</EntityType>
<EntityType Name="Resource">
    . . .
    <Property Name="RBS" Type="Edm.String" />
    . . .
</EntityType>
<EntityType Name="Task">
    . . .
    <Property Name="Health" Type="Edm.String" />
    . . .
</EntityType>

Si el nombre del campo personalizado incluye uno o varios espacios, como Project Departments, el nombre de la propiedad ProjectDepartments omite los espacios. Al crear un campo personalizado, la propiedad de este campo se agrega al tipo de entidad. Por ejemplo, cree los campos personalizados que se muestran en la Tabla 1.

Tabla 1. Campos personalizados creados para pruebas

Nombre del campo personalizado

Entidad

Tipo

Propagar a
asignaciones

Test Proj Text

Project

Texto

N/D

Test Res Dur

Resource

Duración

Test Task Text

Task

Texto

Si actualiza la consulta ~/ProjectData/$metadata, EDM incluye ahora las propiedades de los nuevos campos personalizados.

<EntityType Name="Assignment">
    . . .
    <Property Name="Health_T" Type="Edm.String" />
    <Property Name="RBS_R" Type="Edm.String" />
    <Property Name="TestResDur_R" Type="Edm.Decimal" />
    <Property Name="TestTaskText_T" Type="Edm.String" />
    . . .
</EntityType>
<EntityType Name="Project">
    . . .
    <Property Name="ProjectDepartments" Type="Edm.String" />
    <Property Name="TestProjText" Type="Edm.String" />
    . . .
</EntityType>
<EntityType Name="Resource">
    . . .
    <Property Name="RBS" Type="Edm.String" />
    <Property Name="TestResDur" Type="Edm.Decimal" />
    . . .
</EntityType>
<EntityType Name="Task">
    . . .
    <Property Name="Health" Type="Edm.String" />
    <Property Name="TestTaskText" Type="Edm.String" />
    . . .
</EntityType>
Nota importanteImportante

Cuando crea un campo personalizado de empresa, la referencia de servicio o EDM realizado anteriormente a partir de una consulta de metadatos no contiene las nuevas propiedades del campo personalizado. Debe actualizar la referencia de servicio o la consulta ~/ProjectData/$metadata para obtener las nuevas propiedades.

Abra el Centro de recursos en Project Web App, modifique un recurso y luego defina el valor del campo personalizado Test Res Dur en 3d. Cree una consulta para el valor del campo personalizado (reemplace la propiedad ResourceId con el GUID del recurso), por ejemplo: ~/ProjectData/Resources(guid'4941e174-1596-e111-b0b9-00155d144b20')/TestResDur. El resultado XML muestra la duración en horas de trabajo, de la siguiente manera:

<d:TestResDur xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" 
    m:type="Edm.Decimal">24</d:TestResDur>
Mostrar:
© 2014 Microsoft