Question

Je suis un problème avec une colonne de site personnalisé dans SP2007, dont le type champ récemment changé. J'ai défini les caractéristiques des objets suivants, qui sont déployés à la portée de collection de sites:

  1. Une caractéristique contenant plusieurs colonnes de site personnalisé
  2. Une caractéristique contenant un type de contenu personnalisé qui référence les colonnes du site personnalisé à l'aide de l'élément
  3. Une caractéristique contenant un modèle de liste personnalisée (basé sur le modèle intégré Liste personnalisée) qui référence les colonnes du site personnalisé et applique le type de contenu personnalisé.

Nous avons récemment changé le schéma de l'une des colonnes de site personnalisé. Plus précisément, nous avons changé l'attribut « Type » de « texte » à « Note ». Voici le schéma d'origine:

<Field ID="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" SourceID="http://schemas.microsoft.com/sharepoint/v3" Name="CurrentStatus"
StaticName="CurrentStatus" Group="My Site Columns" ColName="CurrentStatus" Type="Text" ShowInEditForm="FALSE" ShowInNewForm="FALSE" ShowInFileDlg="FALSE" DisplayName="Current Status" Description="The current status."> </Field>

Et voici le schéma mis à jour avec le nouveau type 'Note':

<Field ID="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" SourceID="http://schemas.microsoft.com/sharepoint/v3" Name="CurrentStatus" StaticName="CurrentStatus" Group="My Site Columns" ColName="CurrentStatus" Type="Note" RichText="TRUE" IsolateStyles="TRUE" RichTextMode="FullHtml" ShowInEditForm="FALSE" ShowInNewForm="FALSE" ShowInFileDlg="FALSE" DisplayName="Current Status" Description="The current status."> </Field>

Maintenant, je reconnais que ce n'est pas un changement soutenu et je prévois d'éviter à tout prix à l'avenir. Mais dans notre test initial, nous avons constaté que toutes nos listes existantes (créée en utilisant l'ancien schéma de colonne du site) ont été seemlessly à la nouvelle schéma après le déploiement des nouvelles fonctionnalités. Cependant, de temps en temps sur certains systèmes, nous constatons que l'erreur suivante se produit chaque fois que quelqu'un essaie de créer une nouvelle instance d'une liste de notre modèle:

non pris en charge le changement de type de champ.

Le champ ne peut être modifié au nouveau type. S'il vous plaît vérifier le nouveau type et essayez à nouveau. à Microsoft.SharePoint.Library.SPRequestInternalClass.UpdateField (String bstrUrl, String bstrListName, String bstrXML)    à Microsoft.SharePoint.Library.SPRequest.UpdateField (String bstrUrl, String bstrListName, String bstrXML)

Y at-il quelque chose que nous pouvons faire pour résoudre le problème (autre que le schéma revenir sur le terrain), ou sommes-nous coincés?

Était-ce utile?

La solution

Intéressant - J'ai utilisé ce scénario très (mise à niveau d'un champ de texte à la note) dans une démo récemment dans une conférence de conférence, de montrer nouveau cadre Fonctionnalités améliorables de SharePoint 2010. Dans les deux SP2007 et SP2010, le changement est unsuppported le type de champs qui sont en cours d'utilisation, que vous avez découvert.

Ma recommandation serait:

  1. Prenez une sauvegarde en cas de retour fait en quelque sorte rouler les œuvres d'émission.
  2. Revert le schéma champ retour au 'texte'.
  3. Utilisez une approche différente pour changer le type de champ, à savoir:
  4. Mise à disposition le nouveau champ de note
  5. écrire du code pour itérer toutes les listes et copier les données de champ neuf avec du vieux
  6. Marquer ancien champ comme caché

Il est évident que vous aurez quelques choses à penser si vous avez de nombreux sites / toiles / listes / éléments de liste, mais vous auriez le défi à l'échelle même si vous ne l'aviez pas descendu l'itinéraire initial.

Dans le cas où il est utile, voici le code je (dans mon cas, dans un cas FeatureUpgrading SP2010, mais vous pouvez aussi utiliser de façon appropriée dans un événement FeatureActivating ou similaire). Notez que cela était dans une fonction Web qui a été mis à jour (à savoir activé pour SP2007) sur toutes les toiles contenant la liste:

List<SPField> fieldsToUpgrade = new List<SPField>();

// find all the lists in this web using the 'Tourist Activity' content type..
SPListCollection genericLists = parentWeb.GetListsOfType(SPBaseType.GenericList);
foreach (SPList list in genericLists)
{
    if (list.ContentTypes[contentTypeName] != null)
    {
        // copy list data to new field..
        foreach (SPListItem item in list.Items)
        {
            item[newFieldName] = item[oldFieldName];
            item.SystemUpdate();
        }

        // mark old field as hidden..
        SPField oldField = list.Fields.GetField(oldFieldName);
        fieldsToUpgrade.Add(oldField);
    }
}

foreach (SPField field in fieldsToUpgrade)
{
    field.Hidden = true;
    field.Update();
}

Autres conseils

vous pouvez le faire à ma façon.

private static void ChangeFieldType() {
            SPSecurity.RunWithElevatedPrivileges(delegate() {
                using (SPSite site = new SPSite("YourSiteUrl")) {
                    using (SPWeb web = site.OpenWeb("YourWebUrl") {
                        try {
                            web.AllowUnsafeUpdates = true;
                            SPList list = web.Lists["YourListName"];
                            SPField changeTypeField = list.Fields["YourField"];
                            string schema;
                            schema = changeTypeField.SchemaXml;
                            schema = schema.Replace("Type=\"Text\"", "Type=\"Note\"");
                            changeTypeField.SchemaXml = schema;
                            changeTypeField.Update();
                            web.AllowUnsafeUpdates = false;
                        } catch (Exception e) {
                            Console.WriteLine(e.Message);
                        }
                    }
                }
            });
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top