Pregunta

Estoy teniendo un problema con una columna de sitio personalizado en SP2007, cuyo tipo de campo ha cambiado recientemente. He definido características para los siguientes artefactos, que se despliegan en el ámbito de recogida de sitio:

  1. Una característica que contiene varias columnas de sitio personalizadas
  2. característica A que contiene un tipo de contenido personalizado que hace referencia a las columnas de sitio personalizadas utilizando el elemento
  3. Una característica que contiene una plantilla de lista personalizada (basado en el modelo integrado de lista personalizada) que hace referencia a las columnas de sitio personalizadas, y aplica el tipo de contenido personalizado.

Recientemente hemos cambiado el esquema de una de las columnas de sitio personalizado. En concreto, hemos cambiado el atributo "Tipo" de "texto" a "nota". Aquí está el esquema original:

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

Y aquí está el esquema actualizado con el nuevo tipo 'Nota':

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

Ahora, reconozco que esto no es un cambio apoyado y tengo la intención de evitar a toda costa en el futuro. Pero en nuestras pruebas iniciales, se encontró que todas nuestras listas existentes (creados con el esquema de columna de sitio) se mejoraron fichero de tus ajustes al nuevo esquema después de implementar las nuevas características. Sin embargo, de vez en cuando en algunos sistemas nos encontramos con que se produce el siguiente error cada vez que alguien trata de crear una nueva instancia de una lista de nuestra plantilla:

apoyado-Non

cambio tipo de campo.

El campo no puede cambiarse al nuevo tipo. Por favor, compruebe el nuevo tipo y vuelve a intentarlo. en Microsoft.SharePoint.Library.SPRequestInternalClass.UpdateField (String bstrUrl, Cadena bstrListName, Cadena bstrXML) en Microsoft.SharePoint.Library.SPRequest.UpdateField (String bstrUrl, Cadena bstrListName, Cadena bstrXML)

¿Hay algo que podamos hacer para solucionar el problema (aparte de revertir el esquema de campo), o estamos atrapados?

¿Fue útil?

Solución

Interesante - Me usó este mismo escenario (actualizar un campo de texto para la nota) en una demostración recientemente en un discurso de la conferencia, para mostrar nuevo marco Características actualizables de SharePoint 2010. En tanto SP2007 y SP2010, cambiando el tipo de campos que están en uso se unsuppported, como usted ha descubierto.

Mi recomendación sería:

  1. Tome una copia de seguridad en caso de hacer retroceder de alguna manera hace que las obras de emisión.
  2. Recuperar la parte posterior esquema de campo de 'texto'.
  3. Usar un enfoque diferente para cambiar el tipo de campo, a saber:
  4. Provisión del nuevo campo de la nota
  5. Escribir código para recorrer todas las listas y copiar datos de campo viejo en nuevo
  6. Marcar campo antiguo como oculta

Es obvio que va a tener algunas cosas en que pensar si tiene muchos elementos sitios / webs / listas / de la lista, pero que tendría el reto escala aún si no hubiera pasado a la ruta original.

En caso de que sea útil, aquí está el código que utilicé (en mi caso, en un evento SP2010 FeatureUpgrading, pero podría muy apropiada utilizarlo en un evento FeatureActivating o similar). Tenga en cuenta que esto fue en una característica web que fue aumentado (es decir, activado para SP2007) en todas las telas que contienen 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();
}

Otros consejos

Usted puede hacerlo en mi camino.

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);
                        }
                    }
                }
            });
        }
Licenciado bajo: CC-BY-SA con atribución
scroll top