Frage

Ich habe ein Problem mit einer benutzerdefinierten Site -Spalte in SP2007, deren Feldtyp sich kürzlich geändert hat. Ich habe Funktionen für die folgenden Artefakte definiert, die im Bereich der Site -Sammlung eingesetzt werden:

  1. Eine Funktion mit mehreren benutzerdefinierten Site -Spalten enthält
  2. Eine Funktion mit einem benutzerdefinierten Inhaltstyp, der die benutzerdefinierten Site -Spalten über das Element verweist
  3. Eine Funktion mit einer benutzerdefinierten Listenvorlage (basierend auf der integrierten benutzerdefinierten Listenvorlage), auf die die benutzerdefinierten Site-Spalten verweist und den benutzerdefinierten Inhaltstyp anwendet.

Wir haben kürzlich das Schema einer der Spalten der benutzerdefinierten Site geändert. Insbesondere haben wir das Attribut "Typ" von "Text" in "Note" geändert. Hier ist das ursprüngliche Schema:

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

Und hier ist das aktualisierte Schema mit dem neuen 'Notiz' -Typ:

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

Jetzt erkenne ich, dass dies keine unterstützte Änderung ist und ich plane, sie in Zukunft um jeden Preis zu vermeiden. In unseren ersten Tests stellten wir jedoch fest, dass alle unsere vorhandenen Listen (erstellt mit dem Spaltenschema der alten Site) nach dem Einsatz der neuen Funktionen scheinbar auf das neue Schema aktualisiert wurden. Gelegentlich stellen wir jedoch auf einigen Systemen fest, dass der folgende Fehler auftritt, wenn jemand versucht, eine neue Instanz einer Liste aus unserer Vorlage zu erstellen:

Nicht unterstützte Änderung des Feldtyps.

Das Feld kann nicht in den neuen Typ geändert werden. Bitte überprüfen Sie den neuen Typ und versuchen Sie es erneut. unter microsoft.sharepoint.library.sprequestinternalclass.updateField (String BSTRURL, String BSTRLISTNAME, STRING BSTRXML) unter microsoft.sharePoint.library.sprequest.updateField (String Bstrurl, String BSTRLISTNAME, STRING BSTRXMLML)

Kann wir etwas tun, um das Problem zu beheben (außer das Feldschema zurückzukehren), oder stecken wir fest?

War es hilfreich?

Lösung

Interessant - Ich habe dieses Szenario (das Aufrüsten eines Feldes von Text zu beachten) in kürzlich in einem Konferenzgespräch verwendet, um das neue Upstable -Funktionen von SharePoint 2010 von SharePoint 2010 zu demonstrieren. Sowohl in SP2007 als auch in SP2010 ist die Änderung der verwendeten Felder, wie Sie festgestellt haben, nicht unterstützt.

Meine Empfehlung wäre:

  1. Nehmen Sie ein Backup, falls das Problem irgendwie zurückrollt.
  2. Wechseln Sie das Feldschema zurück in "Text" zurück.
  3. Verwenden Sie einen anderen Ansatz, um den Feldtyp zu ändern, nämlich:
  4. Bereitstellung des neuen Note -Feldes
  5. Schreiben Sie Code, um alle Listen zu iterieren und Daten aus dem alten Feld in neu zu kopieren
  6. Markieren Sie das alte Feld als versteckt

Offensichtlich haben Sie ein paar Dinge, über die Sie nachdenken können, ob Sie viele Websites/Webs/Listen/Listenelemente haben, aber Sie hätten die Skalenherausforderung, auch wenn Sie die ursprüngliche Route nicht unterwegs hätten.

Falls es nützlich ist, hier ist der Code, den ich verwendet habe (in meinem Fall in einem SP2010 -Feature -upgrading -Ereignis, aber Sie könnten ihn genauso angemessen in einem Featurectivating -Ereignis oder ähnlichem verwenden). Beachten Sie, dass dies in einer Webfunktion war, die auf allen Webs, die die Liste enthalten, aktualisiert wurde (dh für SP2007).

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

Andere Tipps

Sie können es auf meine Weise tun.

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);
                        }
                    }
                }
            });
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top