Qué son las clasificaciones de Línea en PWA #ProjectServer #ProjectOnline

Dentro de las configuraciones de PWA tenemos la opción de Configuraciones de Línea, donde la descripción de configuración por parte de la plataforma es:

Puede duplicar las líneas del parte de horas para fines comerciales o por razones contables. Para admitirlas, defina las clasificaciones de las líneas del parte de horas, que se convertirán en el identificador exclusivo de una línea del parte de horas.

¿Qué logramos con esta configuración en términos efectivos?

La Configuración de línea permite que las tareas de tipo personal y de asignación de los recursos en el parte de horas tengan una clasificación diferente y por tanto en términos de reportes podamos diferenciarlas de las horas administrativas y de trabajo de proyectos.

Una vez se crea una nueva clasificación de línea, tenga en cuenta lo siguiente:

  • Se puede definir nombre, descripción y el estado.
  • Podrá eliminarla de forma inmediata si está línea no se ha usado nunca.
  • Una vez utilizada al menos una sola vez, NO se podrá eliminar.
  • En caso de no requerir utilizarla, se puede cambiar su estado a inactiva.

Una vez creada la clasificación de línea, ¿Cómo los recursos hacen uso de ella?

  • En el menú lateral de PWA ingresamos Parte de Horas (TimeSheet).
  • En la tabla de registros encontramos los registros de tiempo administrativo y tareas de proyecto para reportes. Si la lista está vacía es porque no tenemos habilitado un periodo del parte de horas.
  • En el menú de agregar fila encontramos dos posibles opciones:
    • Seleccionar entre asignaciones existentes
    • Agregar tarea personal
  • En ambas opciones podremos crear el nuevo registro, pero a su vez identificar la clasificación de línea que se quiere especificar.

Seleccionar Entre Asignaciones Existentes

  • Seleccionamos en la ventana de configuración el proyecto y las tareas que queremos reportar avance e indicamos la clasificación de línea a la que pertenece.
  • Puedo seleccionar más de una tarea y puedo seleccionar tareas de diferentes proyectos al tiempo.
  • Los comentarios con opcionales.
  • Damos clic en Aceptar.

Agregar Tarea Personal

  • Se define el nombre de la tarea por parte del recurso y la clasificación de línea asignada.
  • Los comentarios con opcionales.
    Damos clic en Aceptar.

Una vez realizadas las acciones vemos la tabla de datos del Parte de Horas con la siguiente forma:

  • En la columna Nombre del Proyecto podemos identificar que se diferencias las tareas de proyectos de las tareas personales.
    • En los proyectos indica el nombre del proyecto.
    • En tareas personales indica “Tareas Personales”.
    • En los tiempos administrativos indica “Administrativos”.
  • En la columna Nombre o descripción de la tarea podemos identificar los nombre de las tareas de proyectos, las tareas personales o los nombres de los tiempos administrativos.
  • En la columna Categoría de Facturación de puede identificar la clasificación de línea a la que pertenece. Los tiempos administrativos por defecto no muestran la clasificación, pero pertenecen a la clasificación por defecto (Estándar).

Una vez tenemos en la tabla las asignaciones, el recurso podrá reportan el avance en las horas y días según corresponda.

¿Que pasa si un recurso quiere reportar avance de tareas en 2 clasificaciones de línea al tiempo?

  • Es posible hacerlo. simplemente debe agregar a la tabla dos veces la misma tarea, pero con clasificación diferente.
  • En la tabla se podrá identificar a que línea pertenece la tarea y el reporte.

¿A nivel de reportes, como diferencio las horas reportadas por la clasificación de línea estándar y las otras clasificaciones creadas?

  • En los datos que permite obtener PWA podemos identificar una columna que indica la clasificación del reporte.
  • como obtener este dato, se puede realizar por ODATA, en Excel, en Power BI u otra herramienta de diseño de reportes.
  • No hace parte de este blog mostrarles como realizar el proceso. lo siento.

¿Para que me sirve tener dos o más clasificaciones de línea?

Los recursos normalmente reportan avance de actividades del proyecto lo cual deja por fuera horas que aunque hacen parte del proyecto no están identificadas en el cronograma, como desplazamientos, investigación, valor agregado y más…

Los tiempos administrativos permiten registrar horas adicionales que podrían cubrir la necesidad, pero no identifican a cual tarea del proyecto específicamente se refieren las horas asociadas.

Si un recurso, para ejecutar una actividad de 4 horas, requiere 2 horas de desplazamiento y 1 hora de investigación:

  • En su reporte de avance solo indicará las 4 horas efectivamente trabajadas y estas se cobrarán al proyecto bajo la clasificación de línea estándar.
  • Las otras 3 horas se asignarán a una clasificación de línea diferente y aunque asociadas al proyecto y la tarea, no se cobraran al proyecto.
  • Estas 3 horas no afectarán el cronograma, tiempos, trabajo, costos. solo servirán para una clasificación interna y podrán revisarse en reportes, por ejemplo, en Power BI.

Para más información del parte de horas, puedes consultar la fuente oficial: https://www.microsoft.com/en-us/microsoft-365/blog/2012/10/25/timesheet-improvements-for-end-users-in-project-web-app/

Campos Personalizados Restringidos de #ProjectOnline y #ProjectServer

Cuando tenemos una instancia de PWA nativa, sin personalizaciones, encontramos que la opción de “Campos personalizados de empresa y tablas de búsqueda” contiene una serie de campos predefinidos que debemos configurar, como son:

Campos personalizados de empresa nativos

Cuando creamos nuestros propios campos personalizados, debemos tener en cuenta que Project Online posee una serie de campos por defecto que debemos respetar y no podemos crear nuestros campos con nombres iguales. los campos personalizados restringidos son los siguientes:

Divisa Palabras Clave
Nombre De Autor Asuntos Pendientes
Project Identifier Riesgos Activos
Título Del Proyecto Prioridad
Activo Tipo De Proyecto
Administrador Última Modificación
Cagetoría Compañía
Contacto Detener
Crítico Documentos
Hipervínculo Marcado
Notas Estado

Estos campos ya vienen por defecto, aunque algunos de ellos no podamos personalizarlos. de estos campos, algunos son calculados, como por ejemplo:

Activo Asuntos Pendientes
Administrador Riesgos Activos
Crítico Última Modificación
Estado Tipo De Proyecto

Otras consideraciones son:

  • La divisa del proyecto se puede modificar únicamente desde Project Professional en la pestaña de opciones. Se puede desde PWA limitar una única divisa para todos los proyectos.
  • El autor del proyecto es el mismo propietario.
  • Los campos Categoría, Compañía NO pueden diligenciarse en ninguna pestaña ni en Project Profesional. son como campos para futuros usos.
  • El campo Notas y Contacto , corresponden a la tarea 0 del cronograma aunque a su vez se puede utilizar en las tareas del mismo.

Como nota adicional:

Estos campos también están restringidos en Project Server 2013/2016 y aplican las mismas consideraciones.

Cuando creamos nuestros campos debemos tener en cuenta además:

  • Podemos utilizar tildes y caracteres especiales (Ej. %), pero cuando nos conectamos por ODATA a estos datos, estos caracteres presentaran diferencias, por ejemplo, el carácter % será omitido.
  • Si utilizamos Project Server y configuramos el cubo de BI, NO podremos utilizar tildes ni caracteres especiales. El cubo No podrá construirse o actualizarse.

Para consultar sobre todos los campos de Project y sus descripciones puedes consultar un blog anterior: Campos personalizados de Project Online

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

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