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

PROJECT SERVER – CREACIÓN DEL SITIO PWA Y LA BASE DE DATOS DE CONTENIDO (INSTANCIA DE PROJECT)

Una vez ha creado la ruta administrada, nuestro siguiente paso será la creación de la colección de sitios de Project Web App. Para esta última actividad utilizaremos la herramienta de SharePoint 2016 Management Shell para crear la base de datos de contenido y colección de sitios PWA respectivamente.

Continue reading

PROJECT SERVER – CREACIÓN DE LA APLICACIÓN DE SERVICIO

Una vez ha realizado la activación de la licencia, su siguiente paso será realizar el aprovisionamiento de la aplicación de servicio de Project Server Service Application.

Desde la aplicación Central Administration en la sección Application Management, se accede al enlaceManage services applications disponible en la subsección Service Applications.

Continue reading