Mostrando las entradas con la etiqueta Project Server 2010. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Project Server 2010. Mostrar todas las entradas

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

domingo, 13 de enero de 2013

Error en fórmula de Project Server versión español

Este error al principio parece no tener sentido pero la solución es muy sencilla solo es necesario cambiar la región del sitio donde esta creado el PWA y con ello la formula es validada correctamente en el idioma que estamos utilizando.

Para ello haga clic en las siguientes opciones: Site Actions, Site Settings, Regional Settings y seleccione la ubicación correcta al idioma seleccionado.

image

image

ProjectServer4Fun!,

Juan Manuel Herrera

lunes, 9 de abril de 2012

Migración de base de datos de Contenido para Project Server 2010 deberá utilizar stsadm en vez de add-SPContentDatabase de PowerShell

 

Un dato curioso aunque Microsoft recomienda para la migración de sus bases de datos de contenido utilizar la línea de comando Add-SPContentDataase de PowerShell para Project Server 2010 no es la mejor práctica de echo fallará en la migración, para evitar los errores y advertencias que generá esta línea de comando lo mejor es utilizar el obsoleto stsadm.exe. 

Escriba la siguiente línea de comando, cuando ya haya restaurado las bases de datos de Project Server 2007 en el servidor de base de datos para SharePoint 2010:

STSADM.EXE -o addcontentDB –url [http://webapplication] –ds [databaseservername] –dn [WSS_Content]

Referencia:

http://technet.microsoft.com/en-us/projectserver/ee691958

Upgrade4Fun!,

Juan Manuel Herrera Ocheita

No se pudo realizar el aprovisionamiento del sitio PWA con error: Microsoft.Office.Project.Server.Administration.ProvisionException: Membership synchronization failed. ---> System.NullReferenceException: Object reference not set to an instance of an object.(Project Server 2010)

 

Este error se produce al momento de intentar aprovisionar las bases de datos restauradas de Project Server 2010.

Detalle del error:

Log Name: Application

Source: Microsoft-SharePoint Products-Project Server

Date: 03/04/2012 11:55:02 p.m.

Event ID: 6971

Task Category: Aprovisionamiento

Level: Error

Keywords:

User: dominio\usuario

Computer: servername.dominio

Description:

No se pudo realizar el aprovisionamiento del sitio PWA con error: Microsoft.Office.Project.Server.Administration.ProvisionException: Membership synchronization failed. ---> System.NullReferenceException: Object reference not set to an instance of an object.

at Microsoft.SharePoint.SPSite.PreinitializeServer(SPRequest request)

at Microsoft.SharePoint.SPWeb.InitializeSPRequest()

at Microsoft.SharePoint.SPWeb.InitWebPublic()

at Microsoft.SharePoint.SPWeb.get_Language()

at Microsoft.Office.Project.Server.BusinessLayer.SharePointSecurityHelper.DeleteRoles(SPWeb web)

at Microsoft.Office.Project.Server.BusinessLayer.SharePointSecurityHelper.ConfigureDefaultPWAWSSSecurityModel(SPSite topSite, SPWeb web)

at Microsoft.Office.Project.Server.BusinessLayer.Admin.<>c__DisplayClass18.<QueueUpdateUsersAddRemoveStatusOnPwaRootsAndWorkspaces>b__17()

at Microsoft.SharePoint.SPSecurity.<>c__DisplayClass4.<RunWithElevatedPrivileges>b__2()

at Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode)

at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode, Object param)

at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode)

at Microsoft.Office.Project.Server.BusinessLayer.Admin.QueueUpdateUsersAddRemoveStatusOnPwaRootsAndWorkspaces(Dictionary`2 deletedUserUidsLoginNames, Guid[] addedUserUids, Boolean isFullSync, Boolean syncWorkspaces)

at Microsoft.Office.Project.Server.BusinessLayer.Admin.SynchronizeMembershipForPwaAppRootSite()

at Microsoft.Office.Project.Server.Administration.PsiServiceApplication.SynchronizePwaMembership(ProjectProvisionSettings provset, ProjectSite projectSite)

--- End of inner exception stack trace ---

at Microsoft.Office.Project.Server.Administration.PsiServiceApplication.SynchronizePwaMembership(ProjectProvisionSettings provset, ProjectSite projectSite)

at Microsoft.Office.Project.Server.Administration.PsiServiceApplication.CreateSite(ProjectProvisionSettings provset)

Event Xml:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">

<System>

<Provider Name="Microsoft-SharePoint Products-Project Server" Guid="{B2178104-1B5B-4C20-8C8F-960678CED9E5}" />

<EventID>6971</EventID>

<Version>14</Version>

<Level>2</Level>

<Task>20</Task>

<Opcode>0</Opcode>

<Keywords>0x4000000000000000</Keywords>

<TimeCreated SystemTime="2012-04-04T05:55:02.295013200Z" />

<EventRecordID>29153</EventRecordID>

<Correlation ActivityID="{022423DC-AE60-4591-B04C-DEB7341DF342}" />

<Execution ProcessID="9204" ThreadID="7496" />

<Channel>Application</Channel>

<Computer>full qualify name of computer name</Computer>

<Security UserID="S-1-5-21-1659004503-796845957-839522115-3677" />

</System>

<EventData>

<Data Name="string0">PWA</Data>

<Data Name="string1">Microsoft.Office.Project.Server.Administration.ProvisionException: Membership synchronization failed. ---&gt; System.NullReferenceException: Object reference not set to an instance of an object.

at Microsoft.SharePoint.SPSite.PreinitializeServer(SPRequest request)

at Microsoft.SharePoint.SPWeb.InitializeSPRequest()

at Microsoft.SharePoint.SPWeb.InitWebPublic()

at Microsoft.SharePoint.SPWeb.get_Language()

at Microsoft.Office.Project.Server.BusinessLayer.SharePointSecurityHelper.DeleteRoles(SPWeb web)

at Microsoft.Office.Project.Server.BusinessLayer.SharePointSecurityHelper.ConfigureDefaultPWAWSSSecurityModel(SPSite topSite, SPWeb web)

at Microsoft.Office.Project.Server.BusinessLayer.Admin.&lt;&gt;c__DisplayClass18.&lt;QueueUpdateUsersAddRemoveStatusOnPwaRootsAndWorkspaces&gt;b__17()

at Microsoft.SharePoint.SPSecurity.&lt;&gt;c__DisplayClass4.&lt;RunWithElevatedPrivileges&gt;b__2()

at Microsoft.SharePoint.Utilities.SecurityContext.RunAsProcess(CodeToRunElevated secureCode)

at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(WaitCallback secureCode, Object param)

at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode)

at Microsoft.Office.Project.Server.BusinessLayer.Admin.QueueUpdateUsersAddRemoveStatusOnPwaRootsAndWorkspaces(Dictionary`2 deletedUserUidsLoginNames, Guid[] addedUserUids, Boolean isFullSync, Boolean syncWorkspaces)

at Microsoft.Office.Project.Server.BusinessLayer.Admin.SynchronizeMembershipForPwaAppRootSite()

at Microsoft.Office.Project.Server.Administration.PsiServiceApplication.SynchronizePwaMembership(ProjectProvisionSettings provset, ProjectSite projectSite)

--- End of inner exception stack trace ---

at Microsoft.Office.Project.Server.Administration.PsiServiceApplication.SynchronizePwaMembership(ProjectProvisionSettings provset, ProjectSite projectSite)

at Microsoft.Office.Project.Server.Administration.PsiServiceApplication.CreateSite(ProjectProvisionSettings provset)</Data>

</EventData>

</Event>

Escenario de Instalación:

Posible Causa:

HotFix Jun 2011 SharePoint Fundation & Server 2010 (For User Profile Fix)

Solución:

Realizar el aprovisonamiento de Project Server 2010 sin el HotFix de Jun 2011.

El Plan:

Desinstalación de Project Server 2010 y SharePoint 2010.

El Procedimiento:

    1. Eliminar la instancia de PWA que no pude finalizar correctamente el aprovisionamiento.
    2. Eliminar el servicio de aplicación Project Server PWA Service.
    3. Desinstalar Project Server 2010.
    4. Desinstalar Paquetes de Idioma para SharePoint Fundation y Office Servers.
    5. Desinstalar SharePoint 2010.
    6. Reiniciar el servidor.
    7. Borrar todas las bases de datos creadas y restauradas.
    8. Restaurar las bases de datos de contenido y de ProjectServer a migrar.
    9. Verificar los pre-requisitos de SharePoint 2010.
    10. Instalar de Nuevo los bits de SharePoint 2010 con SP1 Incluido.
    11. Proceder a la instalación del Central Administration de SharePoint 2010.
    12. Configurar los servicios de BI necesarios para Project Server 2010.
    13. Crear la aplicación Web que hospedará el PWA.
    14. Desconectar al base de datos de contenido recién creada.
    15. Luego Project Server con SP1 Incluido.
    16. Luego Instalar Paquete de Idioma deseado para SharePoint Fundation y Office Servers.
    17. Ejecutar el Asistente de Productos y Tecnologías de SharePoint para cada versión de paquete de Idioma.
    18. Luego instalar el SP1 de cada paquete de idioma.
    19. Ejecutar el Asistente de Productos y Tecnologías de SharePoint para cada SP1 de versión de paquete de Idioma.
    20. Iniciar el proceso de migración de la base de datos de contenido de PWA con la siguiente línea de comando: STSADM.EXE -o addcontentDB -url http://webapplication –ds databaseservername –dn [WSS_Content]
    21. Ejecutar el aprovisionamiento de las bases de datos de ProjectServer restauradas.

Eso es todo, buena suerte!. Funciona solo sea cuidadoso!

Upgrade4Fun!,

Juan Manuel Herrera Ocheita

martes, 21 de febrero de 2012

Sabias que en Project Server puedes mantener versiones de los proyectos

Esta funcionalidad esta disponible desde Project Server 2007, pero es poco conocida sin embargo es muy útil en casos donde necesitamos recuperar el proyecto antes de cambios que no fueron aceptados.

Para la versión 2007 la opción se llama “Schedule Backup”

image

En la versión 2010 la opción se llama acertadamente “Daily Schedule Backup”  (Algo que le hizo falta aclararlo en la versión 2007).

image

Ambas opciones despliegan la misma pantalla que permite definir el número de versiones que retendrá de los proyectos.  Es importante distinguir que la información es almacenada en la base de datos de archivo (Usualmente ProjectServer_Archive) y no la de publicación (ProjectServer_Published) la que usualmente se utiliza en el Centro de Proyectos y es mas de naturaleza transaccional.

clip_image002

Tome en cuenta que este número incrementará considerablemente el tamaño de la base de datos ProjectServer_Archive de Project Server.

Para realizar el respaldo “Administrativo” seleccione la opción “Administrative Backup”

image

Esta opción realizará la copia de respaldo hacia la base de datos ProjectServer_Archive en ese preciso momento cuando presione el botón “Backup”.

image

Para restaurar una versión anterior diríjase a la opción “Administrative Restore”

image

Seleccione la versión que desea restaurar (Esto trasladará la información del proyecto de la base de datos ProjectServer_Archive a la base de datos ProjectServer_Draft; donde están los proyectos borradores) y presione el botón Restore.

image

Nota: Para poder mover los proyectos restaurados de la base de datos de borradores ProjectServer_Draft es necesario ejecutar nuevamente el proceso de publicación.  Un usuario con suficientes permisos puede visualizar este proyecto en borrador desde el MS Project Professional y seleccionar la opción de publicación. Ojo que el que publique el proyecto será el nuevo administrador del mismo.

 

Esta opción nos permitirá depurar los proyectos muy antiguos sin desaparecerlos del todo.  Si deseamos consultarlos podemos utilizar Reporting Services que viene integrado con SharePoint para mostrar la información de estos proyecto que ya no estarán en la base de datos de publicación pero si en la de Archivo.

Hasta la próxima,

Juan Manuel Herrera O.