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.
Para empezar vamos a crear una solución vacía de un proyecto de SharePoint 2010 desde Visual Studio 2010/2012.
Ahora vamos agregar las referencias la librería de PSI Microsoft.Office.Project.Server.Library
Luego vamos agregar las referencias Web:
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.
y eso es todo.
ShareProject4Fun!,
Juan Manuel Herrera Ocheita
No hay comentarios.:
Publicar un comentario
Favor dejar su correo electrónico para poder responder el mensaje.
Nota: sólo los miembros de este blog pueden publicar comentarios.