Domanda

Sto avendo un problema con una colonna del sito personalizzato in SP2007, il cui tipo di campo recentemente cambiato. Ho definito le caratteristiche per le seguenti manufatti, che sono dispiegati presso il campo di applicazione della raccolta siti:

  1. Una caratteristica che contiene diverse colonne del sito personalizzato
  2. Un caratteristica che contiene un tipo di contenuto personalizzato che fa riferimento al colonne del sito personalizzato utilizzando l'elemento
  3. Una caratteristica che contiene un modello di elenco personalizzato (basato sul modello integrato Elenco personalizzato) che fa riferimento al colonne del sito personalizzato, e si applica il tipo di contenuto personalizzato.

Recentemente abbiamo cambiato lo schema di una delle colonne del sito personalizzato. In particolare, abbiamo cambiato l'attributo "Tipo" da "Testo" a "Note". Ecco lo schema originale:

<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>

E qui è lo schema aggiornato con il nuovo 'Nota' Tipo:

<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>

Ora, mi rendo conto che questo non è un cambiamento supportato e ho intenzione di evitare a tutti i costi in futuro. Ma nel nostro test iniziali, abbiamo scoperto che tutti i nostri elenchi esistenti (creato utilizzando il vecchio schema di colonna del sito) sono stati seemlessly aggiornati al nuovo schema dopo la distribuzione delle nuove funzionalità. Tuttavia, di tanto in tanto su alcuni sistemi si stanno scoprendo che il seguente errore si verifica ogni volta che qualcuno tenta di creare una nuova istanza di un elenco dal nostro template:

Non supportato cambiamento tipo di campo.

Il campo non può essere modificato al nuovo tipo. Si prega di verificare il nuovo tipo e riprovare. a Microsoft.SharePoint.Library.SPRequestInternalClass.UpdateField (String bstrUrl, String bstrListName, String bstrXML) a Microsoft.SharePoint.Library.SPRequest.UpdateField (String bstrUrl, String bstrListName, String bstrXML)

C'è qualcosa che possiamo fare per risolvere il problema (diverso da quello di ritornare allo schema campo), o siamo bloccati?

È stato utile?

Soluzione

Interessante - ho usato questo scenario (aggiornamento di un campo da testo a nota) in una demo di recente in un discorso della conferenza, per mostrare il nuovo quadro Caratteristiche aggiornabili SharePoint 2010. In entrambi SP2007 e SP2010, cambiando il tipo di campi che sono in uso è unsuppported, come hai scoperto.

La mia raccomandazione sarebbe:

  1. Fate un backup nel caso in cui il rollback in qualche modo rende le opere di emissione.
  2. Ripristina il campo dello schema del 'testo'.
  3. Usa un approccio diverso per cambiare il tipo di campo, vale a dire:
  4. il provisioning del nuovo campo nota
  5. scrivere il codice per iterare tutti gli elenchi e copiare i dati dal vecchio campo in un nuovo
  6. Mark vecchio campo come nascosto

Ovviamente avrete un paio di cose a cui pensare se si dispone di molti elementi siti / reti / lists / lista, ma si avrebbe la sfida di scala, anche se non era andato giù il percorso originale.

Nel caso in cui è utile, ecco il codice che ho usato (nel mio caso, in un evento SP2010 FeatureUpgrading, ma si potrebbe altrettanto opportunamente utilizzarlo in un evento FeatureActivating o simili). Si noti che questo è stato in una Feature web che è stato aggiornato (cioè attivato per SP2007) su tutte le reti che contengono la lista:

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();
}

Altri suggerimenti

Si può fare a modo mio.

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);
                        }
                    }
                }
            });
        }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top