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


 

Listado de Riesgos Centralizado en #ProjectOnline

En mi anterior post vimos como crear una página con un script para realizar búsquedas de sitios de proyectos (enlace aquí). hoy les tengo un script un poco mas básico pero igual muy necesario.

Project Server y Project Online traen una hoja resumen de los riesgos y problemas (asuntos) por proyecto desde donde podemos ir al sitio de proyecto y consultar los datos de detalle. pero de forma nativa no existe una lista completa de los riesgos del todos los proyectos; obvio, la podemos obtener mediante consultas ODATA, pero estos listados los veríamos en Excel o en Power BI, pero no en una página dentro del mismo PWA.

Continue reading