miércoles, 6 de febrero de 2013

Un segmento de código en SharePoint 2010 que actualiza información en Project Server 2010

Es posible actualizar la información de Project Server desde una solución en SharePoint 2010 a través de la interfaz de Project PSI, esta puede ser a través de los servicios de WCF o ASMX sobre SOAP/HTTP.  Sinceramente creí que en WCF iba a ser más sencillo y que equivocado estaba, por lo que decidí irme por la conocida interfaz Servicios Web por ASMX.

image

Para empezar vamos a crear una solución vacía de un proyecto de SharePoint 2010 desde Visual Studio 2010/2012.

image

Ahora vamos agregar las referencias la librería de PSI Microsoft.Office.Project.Server.Library

Luego vamos agregar las referencias Web:

http://servername/pwa/_vti_bin/psi/project.asmx?wsdl

http://servername/pwa/_vti_bin/psi/LoginWindows.asmx?wsdl

Ahora vamos a crear una intefase para abstraer el servicio:

using System;
using System.Collections.Generic;
namespace MiCodigo.Dominio.Interfases
{
public interface IProyectoTareaServicio
{
void ConsumirServicio(Guid projectID, Guid taskId, DateTime fechaInicio, DateTime fechaFin);

void ActualizarAvance(Guid projectID, Guid taskId, int porcentajeAvance);

}
}

Luego vamos a crear una clase ProyectoTareaServicio y vamos a agregar los siguientes espacios de nombre de los ensamblados:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Net;
using System.Security.Principal; // Required for the TokenImpersonation Level enumeration.
using System.ServiceModel.Web;
using System.Web;
using System.ServiceModel;

using PSLib = Microsoft.Office.Project.Server.Library;

Luego declaramos la clase con el constructor y los dos métodos de la interfase.

    public class ProyectoTareaServicio:IProyectoTareaServicio
{

private static string _pwaUrl;

public ProyectoTareaServicio(string pwaURL)
{
_pwaUrl = pwaURL;
}

public void ConsumirServicio(Guid projectID, Guid taskId, DateTime fechaInicio, DateTime fechaFin)
{

string projectServerURL = _pwaUrl;

//Accediendo el servicio web Project

ProjectService.Project project = new ProjectService.Project();

project.Url = projectServerURL +
"/_vti_bin/psi/Project.asmx";

project.Credentials =
CredentialCache.DefaultCredentials;

//Accediendo el servicio Web LoginWindows

LoginWindowsService.LoginWindows loginWindows = new LoginWindowsService.LoginWindows();

loginWindows.Url = projectServerURL +
"/_vti_bin/psi/LoginWindows.asmx";

loginWindows.Credentials =
CredentialCache.DefaultCredentials;

//Poblando el CookieContainer del servicio Web Project

loginWindows.CookieContainer = new CookieContainer();

project.CookieContainer = loginWindows.CookieContainer;

//Obteniendo la información del proyecto de la base de datos de publicación
ProjectService.ProjectDataSet publishedProjectDataSet = project.ReadProject(projectID, ProjectService.DataStoreEnum.PublishedStore);

// Obteniendo la tarea por medio del ID de la tarea y el proyecto
var miFila = publishedProjectDataSet.Task.FindByTASK_UIDPROJ_UID(taskId, projectID);
// actualizando las columnas de la tarea que se desean modificar
miFila.TASK_START_DATE = fechaInicio;
miFila.TASK_FINISH_DATE = fechaFin;
miFila.TASK_DUR_FMT =
Convert.ToInt32(PSLib.Task.DurationFormat.Day);
// Se crea el trabajo y la sesión que actualizará el cambio
var miJob = Guid.NewGuid();
var miSession = Guid.NewGuid();
string descripcionSesion = "Actualizacion duracion de tarea de proceso de adquisición";

//Se retira el proyecto para modificarlo
project.CheckOutProject(projectID, miSession, descripcionSesion);
//Se actualiza el proyecto enviando el DataSet del Proyecto modificado
project.QueueUpdateProject(miJob, miSession, publishedProjectDataSet, false);
//Se Publica el proyecto
project.QueuePublish(miJob, projectID, true, null);
//Se ingresa el proyecto al servidor nuevamente
project.QueueCheckInProject(miJob, projectID, true, miSession, descripcionSesion);
}

public void ActualizarAvance(Guid projectID, Guid taskId, int porcentajeAvance)
{
string projectServerURL = _pwaUrl;

//Accediendo el servicio web Project

ProjectService.Project project = new ProjectService.Project();

project.Url = projectServerURL +
"/_vti_bin/psi/Project.asmx";

project.Credentials =
CredentialCache.DefaultCredentials;

//Access the out of box LoginWindows web servcie

LoginWindowsService.LoginWindows loginWindows = new LoginWindowsService.LoginWindows();

loginWindows.Url = projectServerURL +
"/_vti_bin/psi/LoginWindows.asmx";

loginWindows.Credentials =
CredentialCache.DefaultCredentials;

//Accediendo el servicio Web LoginWindows

loginWindows.CookieContainer = new CookieContainer();

project.CookieContainer = loginWindows.CookieContainer;

//Obteniendo el proyecto de la base de datos de publicación

ProjectService.ProjectDataSet publishedProjectDataSet = project.ReadProject(projectID, ProjectService.DataStoreEnum.PublishedStore);
if (publishedProjectDataSet != null)
{
var miFila = publishedProjectDataSet.Task.FindByTASK_UIDPROJ_UID(taskId, projectID);
miFila.TASK_PCT_COMP = porcentajeAvance;

var miJob = Guid.NewGuid();
var miSession = Guid.NewGuid();
string descripcionSesion = "Actualizacion duracion de tarea de proceso de adquisición";

project.QueueCheckInProject(miJob, projectID,
true, miSession, descripcionSesion);
project.CheckOutProject(projectID, miSession, descripcionSesion);
project.QueueUpdateProject(miJob, miSession, publishedProjectDataSet,
false);
project.QueuePublish(miJob, projectID,
true, null);
project.QueueCheckInProject(miJob, projectID,
true, miSession, descripcionSesion);
}
}

}
Luego desde un elemento Web se instancia la servicio que se definió arriba y luego se consume
Instancia del cervicio
            string urlPWA = UtilidadWeb.ServerHostName() + "/PWA";
IProyectoTareaServicio _proyectoTareaServicio = new ProyectoTareaServicio(urlPWA);
Consumiendo el servicio 
                    _proyectoTareaServicio.ActualizarAvance(
miProceso.ProyectoAsignado.ID
, miProceso.TareaAsignada.ID
, avance);
Ejemplo de la interfaz gráfica que actualiza esta información desde SharePoint.

image


y eso es todo.


ShareProject4Fun!,


Juan Manuel Herrera Ocheita

No hay comentarios.: