• PROJECT SERVER 2010. PRACTICAS RECOMENDADAS PARA ADMINISTRAR UN ELEVADO NUMERO DE RECURSOS.

    Buenas,

    En el post de hoy queríamos tratar un tema que nos ha parecido interesante, acerca de cómo administrar un elevado número de usuarios, en un entorno de Project Server 2010, y tratar de evitar problemas de rendimiento, causados precisamente por este número elevado . El artículo oficial de Technet puede encontrarse en este enlace:

    http://technet.microsoft.com/es-es/library/hh670402.aspx

    Cuando tenemos que tratar con muchos usuarios en nuestro entorno de Project Server 2010, es conveniente que tengamos determinados conceptos muy claros, para evitar que el rendimiento sea un contratiempo. Dichos conceptos son los siguientes:

    • Permisos en los sitios de Project Server 2010: Project Server 2010 usa la infraestructura de servicios de SharePoint para controlar quién y cómo accede al sitio PWA. Este mismo criterio aplica para cualquier sitio de Project (antes mencionados como “espacios de trabajo”) que se haya creado para cada plan de proyecto que exista en Project Server.
    • Permisos de Microsoft SharePoint Server 2010 aplicados a usuarios de Project Server 2010: Otorgamos a los usuarios de Project Server 2010 con permisos de SharePoint Server 2010. Tenemos que tener claros los dos “sitios” de Project Server 2010 que podemos tener:
      • Sitios PWA (página inicial de PWA, Centro de Proyectos, etc)
      • Sitios de Project (lo que nombrábamos en Project Server 2007 como “espacio de trabajo”.)
    • Problemas de rendimiento cuando se supera el límite recomendado de usuarios en sitios de proyecto: Esto nos causó comportamientos no esperados en la versión anterior del producto; en la versión 2010, se introdujeron un par de cambios, para mejorar esto:
      • Los usuariosque accedan sitios PWA serán añadidos a grupos de SharePoint, en vez de individualmente.
      • Cuando se realiza la sincronización de usuarios, se eliminan las referencias a los usuarios de manera individual, se añaden posteriormente al sitio, uno cada vez (en vez de quitar todos los usuarios, y añadirlos posteriormente uno a uno.)
    • Herencia de permisos del sitio primario PWA: Una manera rápida de quitar usuarios de manera rápida, sin generar la eliminación individual que puede generar problemas de rendimiento, implica jugar con “heredar permisos del sitio padre.”
    • Deshabilitar el parámetro de los permisos del sitio de Project: Otra opción a tener en cuenta implica deshabilitar que se añadan automáticamente los usuarios a los sitios de los proyectos.
    • Errores asociados al exceder los límites recomendados de usuarios asignados a un sitio de proyecto:

     

    Hemos realizado aquí un breve resumen de los distintos puntos que se mencionan en el artículo, pero la recomendación es que os lo leais entero, y no nos perdamos nada de lo que se indica en él, ya que se mencionan conceptos claves para evitar problemas de rendimiento al trabajar con números elevados de usuarios.

     

    Esperamos os resulte de interés, un saludo

     

    Jorge Puig

  • PROJECT SERVER 2010. ACLARACIONES SOBRE TRABAJO ACTUAL Y PARTES DE HORAS.

    Buenas,

    En el post de hoy queríamos volver a hablar del post que publicamos en su día, acerca de las prácticas recomendadas para mantener la integridad del trabajo actual:

    http://blogs.technet.com/b/elfarodeprojectserver/archive/2011/12/15/project-server-2010-documentacion-practicas-recomendadas-para-mantener-la-integridad-del-trabajo-actual.aspx

    Donde apuntábamos al enlace de Technet donde se habla de estas cuestiones:

    http://technet.microsoft.com/en-us/library/hh694531.aspx

    Ha habido varias consultas, acerca de cómo estaba funcionando esto ahora, y si había habido cambios relevantes desde la aparición de varias actualiazciones acumulativas que han introducido cambios relevantes; se han escuchado también comentarios del tipo “esto antes funcionaba de otra manera”, etc

    Nos gustaría tratar de aclarar esto, e indicar cómo funciona en la actualidad:

    La información que indiquemos desde Project PRO será añadido al parte de horas, sólo cuando éste sea creado, y no se añadirá más información de manera automática después de esto.

    Para que la información que hayamos añadido posteriormente en Project PRO, aparezca en el parte de horas, debemos utilizar el botón”Importar” en la cinta del parte de horas, y seleccionar Importar progreso de la tarea. Deberemos saber el período en el tiempo que introducimos el trabajo actual en el proyecto y tarea. Después deberemos seleccionar el parte de horas y seleccionar la casilla de verificación junto a la tarea, y pinchar sobre Importar \ Importar Progreso de Tarea. Una vez hecho esto, debiéramos ser capaces de ver los valores mencionados en el parte de horas.

     

    Esperamos os resulte de utilidad, un saludo

     

    Jorge Puig

  • PROJECT SERVER 2010. INFORMES DE PREVISIONES Y COSTOS.

    Buenas,

    En este post os queríamos hacer llegar una serie de informes que se han publicado en Technet, y que consideramos os puedan resultar interesantes.

    Project Spend Report

    http://gallery.technet.microsoft.com/Spend-Report-86e15e11

    Project Burn and Forecast Report

    http://gallery.technet.microsoft.com/Burn-and-Forecast-Report-5e0f4b89

    Ambas soluciones pueden ser desplegadas y probadas con la máquina virtual de demo para Project Server 2010:

    http://blogs.msdn.com/b/jkalis/archive/2011/10/26/project-2010-demo-pack-version-2-now-available-to-partners.aspx

    Con ellas podemos hacer estimaciones de costos, basándonos en el plan de costos, y permiten estimar lo que vamos a gastar en el futuro, o incluso hacer estimaciones en el supuesto de que nuestro presupuesto se viera afectado.

    Estas soluciones intentan mostrarnos la extensa capacidad de información que podemos generar con informes en Project server 2010. Debemos tener en cuenta que no están soportadas por el Soporte Premier de Microsoft.

    Si quisiéramos modificarlas, lo recomendable es que contacteis con MCS, o algún partner, que pueda ayudaros a alcanzar los objetivos que querais alcanzar con ellas

    Nos permitimos mostraros algunas capturas de pantalla:

    Microsoft Project Server: Burn and Forecast Report

    clip_image001

     

    Microsoft Project Server: Project Spend Report

    clip_image001[5]

     

    Bueno, esperamos os resulte de interés.

    Un saludo

     

    Jorge Puig

  • PROJECT SERVER 2010. PROBLEMAS DE RENDIMIENTO EN PROJECT SERVER 2010 CUANDO AUMENTA EL NUMERO DE REGISTROS DE LAS SHADOW TABLES.

    Hola, buenas

    en este post queremos haceros partícipes del siguiente artículo:

    http://support.microsoft.com/kb/2598007

    Donde se mencionan los problemas de rendimiento que podemos tener cuando aumentan rápidamente el número de registros de las Shadow Tables.

    Este hotfix administra el número de registros de la “tabla de sombra”, para que el número de registros no aumente demasiado.

    Independientemente, nos indican la posibilidad de usar el siguiente script para  limpiar los registros de las “shadow tables” de manera genérica.

    Antes de ejecutar el script, es conveniente tener en cuanta los siguientes puntos:

    • Realizar una copia de seguridad de las bases de datos de Project Server.
    • Para evitar problemas inesperados, relacionados con los datos de las bases de datos, es conveniente parar el Servicio de Cola de Project Server en los servidores de aplicación, cuando no haya habido actividad durante varias horas.
    • Es conveniente validar el script en un entorno de desarrollo o pruebas, usando una copia de seguridad restaurada de las bases de datos de Producción.
    • Monitorizar cuanto tiempo pasa para que se ejecute el script en el entorno mencionado anteriormente. El tiempo necesario para completar esto depende del servidor SQL Server y del número de registros que tengan que ser eliminados. Esto nos resultará útil para preparar la ventana de mantenimiento donde ejecutemos este plan de acción.

     

    El script que mencionamos anteriomente es el siguiente:

          1.- Debemos ejecutar el siguiente script en las bases de datos de Draft y Published:

    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    --Clean up       MSP_TASK_CUSTOM_FIELD_VALUES_SHADOW
          IF object_id('tempdb..#TempTaskCFShadow') IS NOT NULL
          BEGIN 
          drop table #TempTaskCFShadow 
          END 
     
        CREATE table #TempTaskCFShadow (pid uniqueidentifier, tid uniqueidentifier, revCount int, mdpid uniqueidentifier)
         
          INSERT #TempTaskCFShadow (pid, tid, revCount, mdpid)
          SELECT PROJ_UID, TASK_UID, MAX(DELETED_REV_COUNTER), MD_PROP_UID
                            FROM MSP_TASK_CUSTOM_FIELD_VALUES_SHADOW
                            GROUP BY PROJ_UID , TASK_UID, MD_PROP_UID
         
          DELETE
          FROM MSP_TASK_CUSTOM_FIELD_VALUES_SHADOW
            FROM MSP_TASK_CUSTOM_FIELD_VALUES_SHADOW as originalTable, #TempTaskCFShadow AS newtable
          where originalTable.MD_PROP_UID = newtable.mdpid AND
          originalTable.PROJ_UID = newtable.pid AND
          originalTable.TASK_UID = newtable.tid AND
          originalTable.DELETED_REV_COUNTER <> newtable.revCount
                            
            DROP TABLE #TempTaskCFShadow
     
    --Clean up MSP_ASSN_CUSTOM_FIELD_VALUES_SHADOW
          IF object_id('tempdb..#TempAssnCFShadow') IS NOT NULL
          BEGIN 
          drop table #TempAssnCFShadow 
          END
     
          CREATE table #TempAssnCFShadow (pid uniqueidentifier, asid uniqueidentifier, revCount int, mdpid uniqueidentifier)
         
          INSERT #TempAssnCFShadow (pid, asid, revCount, mdpid)
          SELECT PROJ_UID, assn_uid, MAX(DELETED_REV_COUNTER), MD_PROP_UID
                            FROM MSP_ASSN_CUSTOM_FIELD_VALUES_SHADOW
                            GROUP BY PROJ_UID , ASSN_UID, MD_PROP_UID
         
          DELETE
          FROM MSP_ASSN_CUSTOM_FIELD_VALUES_SHADOW
            FROM MSP_ASSN_CUSTOM_FIELD_VALUES_SHADOW as originalTable, #TempAssnCFShadow AS newtable
          where originalTable.MD_PROP_UID = newtable.mdpid AND
          originalTable.PROJ_UID = newtable.pid AND
          originalTable.ASSN_UID= newtable.asid AND
          originalTable.DELETED_REV_COUNTER <> newtable.revCount
                            
            DROP TABLE #TempAssnCFShadow
     
     
    --Clean up       MSP_PROJ_RES_CUSTOM_FIELD_VALUES_SHADOW
          IF object_id('tempdb..#TempProjResCFShadow') IS NOT NULL
          BEGIN 
          drop table #TempProjResCFShadow 
          END 
     
          CREATE table #TempProjResCFShadow (pid uniqueidentifier, resid uniqueidentifier, revCount int, mdpid uniqueidentifier)
         
          INSERT #TempProjResCFShadow (pid, resid, revCount, mdpid)
          SELECT PROJ_UID, RES_UID, MAX(DELETED_REV_COUNTER), MD_PROP_UID
                            FROM MSP_PROJ_RES_CUSTOM_FIELD_VALUES_SHADOW
                            GROUP BY PROJ_UID , RES_UID, MD_PROP_UID
         
          DELETE
          FROM MSP_PROJ_RES_CUSTOM_FIELD_VALUES_SHADOW
            FROM MSP_PROJ_RES_CUSTOM_FIELD_VALUES_SHADOW as originalTable, #TempProjResCFShadow AS newtable
          where originalTable.MD_PROP_UID = newtable.mdpid AND
          originalTable.PROJ_UID = newtable.pid AND
          originalTable.RES_UID = newtable.resid AND
          originalTable.DELETED_REV_COUNTER <> newtable.revCount
                            
          DROP TABLE #TempProjResCFShadow
         
     
    --Clean up MSP_PROJ_CUSTOM_FIELD_VALUES_SHADOW
          IF object_id('tempdb..#TempProjCFShadow') IS NOT NULL
          BEGIN 
          drop table #TempProjCFShadow 
          END 
     
          CREATE table #TempProjCFShadow (pid uniqueidentifier, revCount int, mdpid uniqueidentifier)
         
          INSERT #TempProjCFShadow (pid, revCount, mdpid)
          SELECT PROJ_UID, MAX(DELETED_REV_COUNTER), MD_PROP_UID
                            FROM MSP_PROJ_CUSTOM_FIELD_VALUES_SHADOW
                            GROUP BY PROJ_UID , MD_PROP_UID   
         
          DELETE
          FROM MSP_PROJ_CUSTOM_FIELD_VALUES_SHADOW
            FROM MSP_PROJ_CUSTOM_FIELD_VALUES_SHADOW as originalTable, #TempProjCFShadow AS newtable
          where originalTable.MD_PROP_UID = newtable.mdpid AND
          originalTable.PROJ_UID = newtable.pid AND
          originalTable.DELETED_REV_COUNTER <> newtable.revCount
                
            DROP TABLE #TempProjCFShadow

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

           2.- Después de ejecutar el script 1 en las bases de datos Draft y Published, debemos ejecutar el siguiente script, sólo en la base de datos Published:

    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

    --Clean up MSP_RES_CUSTOM_FIELD_VALUES_SHADOW
     
          IF object_id('tempdb..#TempResCFShadow') IS NOT NULL
          BEGIN 
          drop table #TempResCFShadow 
          END 
     
          CREATE table #TempResCFShadow (resid uniqueidentifier, revCount int, mdpid uniqueidentifier)
         
          INSERT #TempResCFShadow (resid, revCount, mdpid)
          SELECT RES_UID, MAX(DELETED_REV_COUNTER), MD_PROP_UID
                            FROM MSP_RES_CUSTOM_FIELD_VALUES_SHADOW
                            GROUP BY RES_UID, MD_PROP_UID
         
          DELETE
          FROM MSP_RES_CUSTOM_FIELD_VALUES_SHADOW
            FROM MSP_RES_CUSTOM_FIELD_VALUES_SHADOW as originalTable, #TempResCFShadow AS newtable
          where originalTable.MD_PROP_UID = newtable.mdpid AND
          originalTable.RES_UID = newtable.resid AND
          originalTable.DELETED_REV_COUNTER <> newtable.revCount
                
            DROP TABLE #TempResCFShadow

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

     

    Esperamos os resulte de interés, un saludo

     

    Jorge Puig