Les vues des champs personnalisés multi valeurs ne sont pas migrées vers Project Server 2013

Bonjour,

Peut-être avez-vous effectué une migration de vos bases Project Server 2010 vers 2013?

Dans ce cas, si vous aviez défini des tables de choix (lookup tables) et des champs personnalisés à choix multiples basés sur ces tables, vous avez dû constater que les Vues SQL associées n’ont pas été transférées.

En effet, lorsque des tables de choix sont créées ainsi que le champ personnalisé associé, une vue SQL est créée dans la base de Project Server :

image

Malheureusement, lors de la migration vers Project Server 2013, les vues relatives aux tables et champs multi-valeurs ne sont pas migrées. De ce fait, des erreurs lors de l’affichage de rapports ou de vues contenant ces champs apparaissent.

Il est possible de corriger ce problème via un script Power Shell qu’il faut exécuter sur le serveur sur lequel Project server est installé. En effet, ce script utilise PSI pour corriger le problème. Il n’écrit pas directement dans la base de données.

Voici ce script :

param
(
$PWAUrl = "https://$env:computername/pwa",
$Suffix = "1"
)
$CustomFieldProxy = New-WebServiceProxy -URI "$PWAUrl/_vti_bin/psi/CustomFields.asmx?wsdl" -Class EventsClass -Namespace ProjectServerInterface -UseDefaultCredential
if($CustomFieldProxy -eq $null)
{
return Write-Error("Check the PWA url. Cannot create proxy")
}
Write-Host("Calling ReadCustomFields...2")
$CustomFieldCollection = $CustomFieldProxy.ReadCustomFields2("",$false)
$OriginalCustomFieldsCollection = $CustomFieldProxy.ReadCustomFields2("",$false)
Write-Host("Found [$($CustomFieldCollection.CustomFields.Count)] custom fields.")
$CustomFieldWithMultiSelectValue = $CustomFieldCollection.CustomFields | ? {$_.MD_PROP_MAX_VALUES -gt 1}
Write-Host("Found [$($CustomFieldWithMultiSelectValue.Count)] with multi value selectable custom fields.")

if($CustomFieldWithMultiSelectValue.Count -eq 0)
{
Write-Host("No need to refresh custom field views. Done.")
return
}
$CheckedOutCustomFields = $CustomFieldWithMultiSelectValue | ? {$_.MD_PROP_CHECKOUTBY.ToString() -ne ""}

#Make sure all the custom fields are checked in state before proceeding.
if($CheckedOutCustomFields.Count -gt 0)
{
Write-Host("Found [$($CheckedOutCustomFields.Count)] custom fields checked out. Checking in the custom fields.")
$customFieldGuids = @($CheckedOutCustomFields | % {$_.MD_PROP_UID.Tostring()})
#force checkin the custom fields
try
{
$CustomFieldProxy.CheckInCustomFields($CustomFieldGuids,$true)
}
catch
{ throw}
}

#Get the custom fields as array and checkout
$customFieldGuids = @($CustomFieldWithMultiSelectValue | % {$_.MD_PROP_UID.Tostring()})
$CustomFieldProxy.CheckOutCustomFields($CustomFieldGuids)

#First rename custom fields.
Foreach($CustomField in $CustomFieldWithMultiSelectValue)
{
$tempCustomFieldName = $CustomField.MD_PROP_NAME + $Suffix
Write-Host("Renaming custom field [$($CustomField.MD_PROP_NAME)] to [$tempCustomFieldName].")
$CustomField.MD_PROP_NAME = $tempCustomFieldName
}
$CustomFieldProxy.UpdateCustomFields2($CustomFieldCollection,$false,$false)

#Revert the name back and checkin
Foreach($CustomField in $CustomFieldWithMultiSelectValue)
{
$tempCustomField = $OriginalCustomFieldsCollection.CustomFields | ? {$_.MD_PROP_UID -eq $CustomField.MD_PROP_UID}
Write-Host("Reverting custom field [$($CustomField.MD_PROP_NAME)] to original name [$($tempCustomField.MD_PROP_NAME)].")
$CustomField.MD_PROP_NAME = $tempCustomField.MD_PROP_NAME
}
#Update the custom fields with its original name and checkin.
$CustomFieldProxy.UpdateCustomFields2($CustomFieldCollection,$false,$true)
Write-Host("Operation completed. Please make sure there is no pending reporting queue jobs that are related to custom fields.")
$CustomFieldProxy = $null

Une fois exécuté, vous devriez voir apparaitre des jobs de synchronisation de la base Reporting dans la Queue de Project Server. Lorsque tous ces jobs ont été exécutés, les vues doivent apparaitre à nouveau dans la base de données.

Bonne journée,

Marc Biarnès