Esquema de tablas de #ProjectServer y #ProjectOnline

Cuando necesitamos revisar las tablas, campos, llaves primarias y relaciones entre tablas de las plataforma de Project Server o Project Online para generar reportes sobre los datos del mismo se hace necesario tener establecido de una forma muy clara la estructura de las tablas y como la plataforma establece los campos personalizados, las relaciones de tablas con más de un campo campo y que contiene o guarda cada tabla.

A continuación les relaciono los siguientes elementos que pueden ser de mucho interés:

  1. ODATA Service References:

Página web oficial de Microsoft que permite identificar las tablas que tiene la plataforma cuando se consulta por ODATA, además de las limitaciones en cantidad de registros que devuelve su consulta y algunos ejemplos de como hacer consultas.

https://docs.microsoft.com/en-us/previous-versions/office/project-odata/jj163015(v=office.15)

  1. Esquema de Tablas para Reportes para Project Server 2013:

Página oficial de Microsoft que nos muestra una ayudo oficial de la plataforma para Server que podemos descargar y consultar y nos presenta:

  • Tablas y campos nativos y sus descripciones para consultas ODATA
  • Tablas, Vistas, Procedimientos y campos del cubo de BI de Project Server 2013
  • Los campos nativos incluyen tipos de datos, descripciones y referencias.
  • las relaciones entre tablas, vistas, procedimientos almacenados y otros elementos se muestran de forma grafica para facilitar el entendimiento de los mismos.
  • Se puede descargar el archivo de ayuda en el siguiente link.
    • Lo descargas y descomprimes y encuentras dos archivos:
      • OLAPCubeSchemas2013: Archivo de Excel
      • ProjectServer2013_ReportingDB: Archivo de Ayuda en formato HTML

Se debe tener en cuenta que esta aplicación de ayuda y definiciones solo contiene información actualizada para Project Server 2013. No contiene las tablas adicionales de Project Online y no tiene las definiciones de campos personalizados.

  1. Consultar los metadatos mediante ODATA

Mediante ODATA podemos obtener la lista completa de tablas y campos nativos y personalizados, los tipos de datos, las relaciones y las llaves primarias de cada tabla.

La forma como debemos realizar la consulta de los metadatos y entender su resultado es la siguiente:

  • Es nuestro navegador escribir la siguiente instrucción: https://<<MIDOMINIO>&gt;.sharepoint.com/sites/pwa/_api/ProjectData/$metadata
  • La consulta ODATA devuelve un archivo XML con la estructura del esquema de base de datos de Project Online.
  • Cada una de las tablas del esquema se definen con el TAG EntityType
  • Los campos de llave primaria de las tablas se definen dentro del TAG KEY PropertyRef
  • Los campos nativos o personalizados de la tabla se definen con el TAG Property Name
  • Las relaciones entre tablas se definen con el TAG NavigationProperty

Los campos personalizados de Project Online No tienen espacios o caracteres especiales en el nombre del campo. Si admiten tildes, pero si utilizamos esos campos en los filtros de la consulta ODATA debemos reemplazar las tildes por caracteres ASCII-HTML.

Cuando nos conectamos a las tablas de Project mediante ODATA notamos que los nombres de las tablas cambian según el idioma o convenciones. Para obtener los nombres reales de las tablas con el mismo comando podemos obtener lo siguiente:

  • Contraemos el Schema de ReportingData y expandimos el Schema de Project.Server
  • Las tablas con su nombre interno las identificamos con el TAG EntityType
  • Los nombres definidos para consulta o visualización según idioma o visualización se identifican con el TAG EntitySet
  • La mayor diferencia entre los dos corresponde a los nombres en plural de las tablas.
  1. Resumen de tablas y llaves primarias

De la consulta anterior de metadatos en ODATA y para facilitar la obtención de tablas y llaves primarias se relaciona la siguiente tabla resumen:

Nombre de Visualización de la Tabla Nombre Interno de la Tabla Llave Primaria
Proyecto De Análisis De Cartera ProyectoDeAnálisisDeCartera IdDeAnálisis, IdDelProyecto
Análisis De Cartera AnálisisDeCarteras IdDeAnálisis
Departamentos Del Impulsor De Negocio DepartamentoDelImpulsorDeNegocio IdDelDepartamento, IdDelImpulsorDeNegocio
Escenarios De Restricción De Costo EscenarioDeRestricciónDeCoste IdDelEscenario
Escenarios De Restricción Del Recurso EscenarioDeRestricciónDelRecurso IdDelEscenario
Impulsores De Negocio ImpulsorDePriorización IdDelImpulsorDeNegocio
Impulsores De Priorización ImpulsorDePriorización IdDeLaPriorización, IdDelImpulsorDeNegocio
Priorizaciones Priorización IdDeLaPriorización
Proyectos De Escenario De Coste ProyectoDeEscenarioDeCoste IdDelEscenario, IdDelProyecto
Proyectos De Escenario De Recursos ProyectoDeEscenarioDeRecursos IdDelEscenario,IdDelProyecto
Relaciones Del Impulsor De Priorización RelaciónDelImpulsorDePriorización IdDeLaPriorización, IdDelImpulsorDelNegocio1, IdDelImpulsorDelNegocio2
Asignaciones Asignación IdDeLaAsignación, IdDelProyecto
Conjunto De Datos Con Fase Temporal Previsto De La Asignación DatosDeFaseTemporalPrevistaDeLaAsignación Día,IdDeLaAsignación,IdDelProyecto,NúmeroDePrevisión
Conjunto De Datos Con Fase Temporal De La Asignación DatosDeFasesTemporalesDeLaAsignación Día,IdDeLaAsignación,IdDelProyecto
Previsiones De La Asignación PrevisiónDeLaAsignación IdDeLaAsignación, IdDelProyecto, NúmeroDePrevisión
Conjunto De Datos Con Fase Temporal Previsto De La Tarea DatosDeFasesTemporalesPrevistasDeLaTarea Día, IdDelProyecto, IdDeTarea, NúmeroDePrevisión
Previsiones Del Proyecto PrevisiónDelProyecto IdDelProyecto, NúmeroDePrevisión
Proyectos Proyecto IdDelProyecto
Conjunto De Datos Con Fase Temporal Del Flujo De Trabajo Del Proyecto DatosDeFaseDeFlujoDeTrabajoDelProyecto IdDeLaFase, IdDelProyecto
Tareas Tarea IdDelProyecto, IdDeTarea
Previsiones De La Tarea PrevisiónDeLaTarea IdDelProyecto, IdDeTarea, NúmeroDePrevisión
Conjunto De Datos Con Fase Temporal De La Tarea DatosConFasesTemporalesDeLaTarea Día, IdDelProyecto, IdDeTarea
Asociaciones De La Tarea Con El Riesgo AsociaciónDeLaTareaConElRiesgo IdDelProyecto, IdDelRiesgo, IdDeTarea, TipoDeRelación
Asociaciones De La Tarea Del Asunto AsociaciónDeLaTareaDelAsunto IdDelProyecto, IdDeAsunto, IdDeTarea, TipoDeRelación
Asuntos Asunto IdDeAsunto, IdDelProyecto
Resultados Resultado IdDelProyecto, IdDeResultado
Riesgos Riesgo IdDelProyecto, IdDelRiesgo
Afiliaciones Afiliación IdDeLaAfiliación
Comentarios De Las Afiliaciones ComentarioDeLasAfiliaciones IdDelComentario
Conjunto De Datos Con Fase Temporal De Las Afiliaciones DatosConFasesTemporalesDeLasAfiliaciones Día, IdDeLaAfiliación
Conjunto De Datos Con Fases Temporales Del Recurso DatosDeFasesTemporalesDelRecurso Día, IdDelrecurso
Recursos Recurso IdDelrecurso
ResourceDemandTimephasedDataSet ResourceDemandTimephasedData Día, IdDelProyecto, IdDelrecurso
Clases Del Parte De Horas ClaseDeParteDeHoras IdDeLaClaseDelParteDeHoras, IdDelDepartamento
Conjunto De Datos Reales De La Línea Del Parte De Horas DatosRealesDeLíneaDeParteDeHoras Día, IdDeLaLíneaDelParteDeHoras, ÍndiceDeAjuste
Tabla de Fechas HoraEstablecida Día
Líneas Del Parte De Horas LíneaDelParteDeHoras IdDeLaLíneaDelParteDeHoras
Partes De Horas ParteDeHoras IdDeLaLíneaDelParteDeHoras
Períodos Del Parte De Horas PeriodoDelParteDeHoras IdDelPeríodo

Para herramientas como Power BI que solo permiten hacer relaciones con un único campo entre las tablas se hace necesario crear campos concatenados para crear las relaciones en aquellas tablas que tengan más de un campo de llave primaria.


Publicación Original: https://myprojectserver.wordpress.com/2019/01/21/esquema-de-tablas-de-projectserver-y-projectonline/

Para que sirve activar “Cargar asignaciones de recursos de resumen” al iniciar Project Professional conectado a PWA

Cuando se configura Project Professional para que se conecte a una instancia de PWA ya sea en Project Server o Project Online se nos permite definir si queremos “Cargar asignaciones de recursos de resumen” según se muestra en la grafica:

Imagen1

Si activamos esta funcionalidad, la pregunta siempre es ¿Para que sirve activar “Cargar asignaciones de recursos de resumen”?. Si lo activo o no, no veo ningún cambio en mi Project Professional.

existen 4 características principales que Project Professional nos permite cuando activamos esta funcionalidad:

1. Permite que se identifiquen sobreasignaciones de recursos no solo en el proyecto activo, sino en todos los proyectos:

Imagen2
Funcionalidad activada
Imagen3
Funcionalidad No Activada
  • Como se visualiza en las graficas, cuando la opción “Cargar asignaciones de recursos de resumen” está activada en la sesión, el cronograma nos muestra las sobreasignaciones en algunas tareas donde los recursos tienen asignadas tareas en varios proyectos, no solo en el proyecto actual.

2. En la vista de “Uso de Recursos” nos muestra las fechas y horas de trabajo asignadas en otros proyectos a los recursos y se identifican en rojo las sobreasignaciones:

Imagen4

  • La grafica muestra la agrupación “Otros proyectos y compromisos” con las horas y fechas asignadas en otros proyectos. si se despliega la información vamos a encontrar los nombres de proyectos y los tiempos administrativos (si los hay) de ese recurso.

3. En la vista de “Organizador de Equipo” se visualizan las cajas de tareas relacionadas con “Otros proyectos y compromisos” en modo de solo lectura para que se pueda interpretar cuando el recurso esta asignado en tareas de otros proyectos:

Imagen5.png

  • En esta vista podemos realizar cambios sobre tareas, fechas y asignaciones solo a las tareas del proyecto actual.

4. La vista de “Grafico de recursos” incluye las horas asignadas de otros proyectos:

Imagen6

según estas graficas vemos que activar esta funcionalidad tiene grandes beneficios para nuestros proyectos, pero también tiene una serie de inconvenientes:

  • Si nuestro proyecto usa una gran cantidad de recursos compartidos, el performance de Project Professional se verá comprometido debido a los cálculos y validaciones que requiere realizar por cada recurso.
  • Si la empresa tiene una gran cantidad de proyectos activos al tiempo y con un volumen de tareas de gran tamaño (> mil tareas por proyecto) también afectará al performance del proyecto.
  • Si nuestra conectividad es lenta o limitada, es posible que Project se paralice e incluso se bloquee y se cierre sin avisarnos.

Según estos inconvenientes, cuando sería buena idea activar esta funcionalidad:

Cuando requerimos realizar ajustes de asignaciones de recursos en la planeación o seguimiento SI se recomienda activar esta funcionalidad. 

Por defecto no debemos tener esta funcionalidad activada.

si existe otra característica de Project que se vea afectada por activar esta opción agradezco su colaboración dejando sus comentarios.

 


Publicación Original: https://myprojectserver.wordpress.com/2018/08/20/para-que-sirve-activar-cargar-asignaciones-de-recursos-de-resumen-al-iniciar-project-professional-conectado-a-pwa/

Mejorar el Rendimiento de Project Online

Cuando configuramos Project Online y Project Server (2013 o 2016) se hace necesario tener en cuenta elementos de rendimiento en la configuración.

Microsoft tiene una página oficial (Rendimiento de Project Online) donde nos presenta recomendaciones de rendimiento de los siguientes temas:

  • Modos de los permisos de seguridad
  • Crear un tipo de proyecto empresarial personalizado
    • Configuración del sitio de proyecto
    • Mecanismos de sincronización entre Project Online y SharePoint Online
  • Sincronización de Active Directory de recursos
  • Personalización y apariencia de la interfaz
  • Páginas de detalles del proyecto (PDP) y flujos de trabajo
  • OData y elaboración de informes
  • Cuota de Project Online

En mi Experiencia personal les recomiendo tener especial atención a los siguientes componentes de rendimiento:

  • No configurar la sincronización del cronograma del proyecto con la lista de tareas del sitio del proyecto a menos que este sea pequeño (menos de 500 actividades) y que realmente tenga un uso importante en el sitio.
  • No configurar la sincronización de permisos de usuario si el equipo de trabajo es muy grande (más de 100) o si siempre son los mismos recursos para todos los proyectos. Es mejor en ese caso usar herencia de permisos desde la colección primaria hacia los sub sitios.
  • No crear vistas de centro de proyectos con demasiados campos e indicadores. Es mejor crear varias vistas con los campos necesarios.
  • Considerar la posibilidad de crear varias instancias de PWA cuando la cantidad de proyectos sea muy grande (más de 1.000) y la configuración de campos, indicadores, calendarios, sitios y permisos sean diferentes según el departamento, el proceso, la metodologia, entre otros aspectos.
  • Crear Páginas de Detalle (PDP) con campos especializados que no implique que con cada cambio realizado Project deba recalcular todos los datos del proyecto.

Consulta a detalle cada una de las recomendaciones en Rendimiento de Project Online

Cambiar el método de seguimiento o avance de las tareas en PWA #ProjectOnline #ProjectServer

El método de seguimiento en Project Online o Project Server permite definir como los recursos reportaran el avance de sus actividades. para realizar esta configuración de forma adecuada siga los siguientes pasos:

  • En la configuración del Servidor seleccione la opción Configuración y Presentación de Tarea:

tareasIngresamos a la opción y vemos la siguiente sección de configuración:

tareas1

  1. Porcentaje Completado del Trabajo: El recurso reporta su avance en porcentajes del 0 al 100%.
  2. Trabajo Real realizado y Trabajo Pendiente: El recurso reporta cuantas horas ha ejecutado de la tarea y cuantas horas cree que le hacen falta para terminar.
  3. Horas Trabajadas por Periodo: El recurso reporta día a día (o por semana, según se configure) las horas reales de ejecución y las horas restante de la tarea
  4. Forma Libre: Los recursos reportan el avance de sus tareas con el método que más les guste según el proyecto.

Se recomienda que los proyectos unifiquen la forma como los recursos reportan el avance de sus tareas, ya sea mediante porcentajes u horas.

En algunos casos esta opción esta inhabilitada para edición, todas las opciones aparecen en gris y no se puede modificar el método de seguimiento.

Si ese es tu caso y quieres poder realizar el cambio de método, sigue los siguientes pasos:

  • En la configuración del Servidor seleccione la opción Configuración y Valores Predeterminados del Parte de Horas:

tareas

  • En la página de configuración buscamos la opción de Modo de Entrada Único y la desactivamos (quitamos el Check)

tareas1

  • Aceptamos el cambio y volvemos a la opción de Configuración Y Presentación de Tareas y la sección de Método de Seguimiento ya debe estar habilitada para realizar cambios.

Pero, ¿qué implicaciones tiene desactivar la opción de Modo de Entrada Único?

  • Habilitar esta opción hace que los recursos reportes sus avances de tareas en la opción de Parte de Horas en lugar de la opción de Tareas en el menú lateral de PWA.
  • Si se usa este modo único, se recomienda ocultar del menú lateral la opción de Tareas para evitar confusión por parte de los recursos.
  • En la ventana de Parte de horas aparecerán las tareas pendientes del recurso de forma automática y podrá agregar los tiempos administrativos adicionales.

Si el modo de entrada único no está habilitado, el recurso podrá reportar las tareas y el parte de horas en opciones diferentes.

Si se quiere bloquear el método de seguimiento para impedir su cambio, se puede habilitar el modo de entrada único para bloquear la opción, aún cuando los recursos no reporten parte de horas, es decir, siguen usando la opción de tareas.


Publicación Original: https://myprojectserver.wordpress.com/2018/07/16/cambiar-el-metodo-de-seguimiento-o-avance-de-las-tareas-en-pwa-projectonline-projectserver/ 

Error de ReportingWssSyncListFailed después de cambiar las listas integradas en Project Server

Cuando las listas de riesgos y problemas en Project Server 2013/2016 son personalizadas realizando cambios como eliminación de campos, renombramientos o cambios en los tipos de datos, se genera el siguiente error:

ReportingWssSyncListFailed (24018) – Error al preparar la transferencia de la lista de SP 1100 para el proyecto ‘ProjectUID’. El Nombre_de_campo campo era falta en la lista de SP y se omitió.. Detalles: id = ‘24018’
name=’ReportingWssSyncListFailed’
uid=’uid’
ProjectUID=’ProjectUID’
SPListType=’1101′

Donde el campo de SPListType identifica al 1100 a problemas, 1101 a riesgos y 1104 a entregables.

Para solucionar este error se debe realizar los siguientes pasos:

  • Iniciar sesión en Power Shell de SharePoint Server con usuario administrador

Add-PsSnapin Microsoft.SharePoint.PowerShell

function Repair-ListFields
{
param
(
[Parameter(Mandatory=$true)][String]$ReferenceWebUrl,
[Parameter(Mandatory=$true)][String]$WebUrl,
[Parameter(Mandatory=$true)][String]$ListTitle
)
$currentVerbosePreferenceValue = $VerbosePreference
$VerbosePreference = “SilentlyContinue”
try
{
$SourceWeb = Get-SPWeb $ReferenceWebUrl -ErrorAction Stop
$web = Get-SPWeb $WebUrl -ErrorAction Stop
$SourceList = $SourceWeb.Lists[$ListTitle]
$List = $web.Lists[$listTitle]
if ( $SourceList -eq $null -or $list -eq $null )
{
throw “Source List or TargetList not found”
}
}
catch
{
Write-host $_.exception.Message -ForegroundColor Red
Break
}
$VerbosePreference = $currentVerbosePreferenceValue
function Delete-Field
{
param
(
[Parameter(Mandatory=$true)][Object]$fld
)
try
{
[xml]$schema = $fld.SchemaXml
$schema.Field.SetAttribute(‘AllowDeletion’,’TRUE’)
$schema.Field.SetAttribute(‘CanToggleHidden’,’TRUE’)
$fld.SchemaXml = $schema.OuterXml
$fld.Delete()
return $true
}
catch
{
Write-host “Delete Field: $($fld.Title) failed. Exception $_”
return $false
}
}
#Get all the customFields, leave out OOB fields (From GenericList template)
$SourceFields = $SourceList.Fields | where { $_.SourceID -notmatch “http” }
$schemas = @{}
$DisplayNameDict = @{}
#Build Schema dictionary and dictionary for Title & internalname mismatch
foreach ($sourceField in $SourceFields)
{
[xml]$FieldSchema = $sourceField.schemaxml
$FieldSchema.Field.RemoveAttribute(‘ColName’)
$FieldSchema.Field.RemoveAttribute(‘SourceID’)
$DisplayName = [System.Xml.XmlConvert]::DecodeName($FieldSchema.Field.Name)
if ( $FieldSchema.field.DisplayName -cne $DisplayName )
{
$FieldSchema.field.SetAttribute(‘DisplayName’, $DisplayName)
$DisplayNameDict.Add($sourceField.InternalName, $SourceField.Title)
}
$schemas.Add($sourcefield.InternalName, $FieldSchema.OuterXml)
}
$FieldsToCreate = New-Object system.collections.arraylist
#Identify and delete fields with Wrong id, if Title and internal names are wrong, fix them without deleting the fields
foreach ($SourceField in $SourceFields)
{
try
{
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Processing Field:–>” $sourceField.Title -ForegroundColor Green }
$field = $null
$field = $list.Fields.GetFieldByInternalName($sourceField.InternalName)
if ( $field.id -ne $sourceField.id )
{
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Field found by internalName but Id does not match:” $field.title }
$FieldsToCreate.Add($sourceField.InternalName) | Out-Null
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Deleting Field:” $Field.Title }
$result = delete-Field $Field
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Deleted:” $result }
}
}
catch
{
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Field not found by InternalName:” $sourceField.InternalName }
$field = $list.Fields[$SourceField.Id]
if ( $field -eq $null )
{
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Field not found by id:” $sourceField.Title }
$field = $list.Fields[$SourceField.Title]
if ( $field -ne $null )
{
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Field found by Title:” $sourceField.Title }
$FieldsToCreate.Add($sourceField.InternalName) | Out-Null
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Deleting Field:” $Field.Title }
$result = delete-Field $Field
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Field Deleted:” $true }
}
else
{
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Field not found by Title:” $SourceField.Title }
$FieldsToCreate.Add($sourceField.InternalName) | Out-Null
}
}
else
{
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Fixing Field:” $sourceField.Title }
$field.sealed = $false
$field.update()
[xml]$Schema = $field.Schemaxml
$schema.field.SetAttribute(‘Name’,$SourceField.InternalName)
$schema.field.SetAttribute(‘DisplayName’,$SourceField.Title)
$field.schemaXml = $Schema.OuterXml
$field.update()
}
}
}
#create deleted or missing fields
foreach ( $field in $FieldsToCreate )
{
$list.Fields.AddFieldAsXml($schemas[$field]) | Out-Null
$DisplayName = $null
if ( $VerbosePreference.value__ -eq 2 ) { Write-host “Created field:” $field }
if ( $DisplayNameDict.ContainsKey($field))
{
$DisplayName = $DisplayNameDict[$field]
$NewField = $list.Fields.GetFieldByInternalName($field)
$NewField.Title = $DisplayName
$NewField.Update()
if ( $VerbosePreference.value__ -eq 2 ) { Write-host `t “Updated Title of field:” $DisplayName }
}
}
}

  • Ejecutamos el siguiente comando para reparar la lista de riesgos del sitio seleccionado:

Repair-Listfields -ReferenceWebUrl <RefSite_URL> -WebUrl <site_URL> -ListTitle “Risks” -Verbose

  • Ejecutamos el siguiente comando para reparar la lista de problemas del sitio seleccionado:

Repair-Listfields -ReferenceWebUrl <RefSite_URL> -WebUrl <site_URL> -ListTitle “Issues” -Verbose

Los parámetros utilizados corresponden a:

  1. <RefSite_URL> es la URL es la referencia al sitio de proyecto que no tiene problemas.
  2. <site_URL> es la URL al sitio que tiene errores.

Una vez se ejecuta el comando se vuelve a publicar el proyecto y no debería salir nuevamente el error de sincronización.


publicación original en: Error de ReportingWssSyncListFailed después de cambiar las listas integradas en Project Server


 

Que permisos de sitio de proyecto tiene un usuario visor de cartera o jefe de cartera de proyectos en Project Online

Un usuario en Project Online puede pertenecer a más de un grupo de seguridad en Project Online y en ocasiones es difícil determinar que permisos efectivos tiene sobre diferentes proyectos y sitios de proyectos asociados.

Continue reading