none
Sharepoint 2010: Lista rota tras eliminar columna RRS feed

  • Pregunta

  • Os explico mi problemón. Tenía una lista en Sharepoint Foundation 2010 funcionando perfectamente, con unos cuantos elementos. Cree una nueva columna en la lista, todo perfecto. A continuación intenté eliminar una columna existente, desde Sharepoint Designer, pero al guardar los cambios me da el siguiente mensaje: "No se pudieron guardar los cambios de campo en el servidor. Índice fuera de los límites de la matriz."

    También he intentando eliminarla desde el navegador web, pinchando en Configuración de la lista pinchando en la columna en cuestión y a continuación en eliminar, pero me da un mensaje de error: "Error inesperado. Identificador de correlación ..."

    Si con UlsViewer busco el identificador de correlación obtengo:

    System.IndexOutOfRangeException: Índice fuera de los límites de la matriz. en Microsoft.SharePoint.SPBusinessDataField.DeleteUnneededSecondaryFields(String wssNames, String[] oldNames, String[] newNames) en Microsoft.SharePoint.SPBusinessDataField.OnDeleting() en Microsoft.SharePoint.SPFieldCollection.Delete(String strName) en Microsoft.SharePoint.ApplicationPages.FieldEditPage.BtnDelete_Click(Object sender, EventArgs e) en System.Web.UI.WebControls.Button.OnClick(EventArgs e) en System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) en System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) en System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

    Total, que parece que no elimina la columna pero algo ha hecho, porque ahora puedo ver el listado de elementos de la lista pero no puedo editar ningún elemento ni crear ningún elemento. En ambos casos: "Error inesperado. Identificador de correlación..."

    Si con UlsViewer busco el identificador de correlación (para el intento de edición) obtengo:

    System.ArgumentException: La columna 'nombre_del_campo' no existe. Puede que otro usuario la haya eliminado. en Microsoft.SharePoint.SPFieldCollection.GetField(String strName, Boolean bThrowException) en Microsoft.SharePoint.SPListItem.GetValue(String strName, Boolean bThrowException) en Microsoft.SharePoint.SPListItem.get_Item(String fieldName) en Microsoft.SharePoint.WebControls.BusinessDataFieldControl.set_Value(Object value) en Microsoft.SharePoint.WebControls.BusinessDataFieldControl.CreateChildControls() en System.Web.UI.Control.EnsureChildControls() en Microsoft.SharePoint.WebControls.BaseFieldControl.OnLoad(EventArgs e) en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Control.LoadRecursive() en System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

     

    ¿Cómo puedo solucionar esto? Es como si la columna hubiese desaparecido de la base de datos pero sharepoint todavía pensase que existe. Me crearía una nueva lista, pero en esta tengo muchos elementos con flujos de trabajo asociados.

     

    • Editado Tomás Crespo jueves, 25 de abril de 2013 9:41 Cosas de formato
    jueves, 25 de abril de 2013 9:34

Todas las respuestas

  • Hola Tomas,

    Has realizado alguna restauración de la base de datos de contenido sitio previamente? 


    MCPD SharePoint 2010 Mi blog: http://blogs.encamina.com/desarrollandosobresharepoint Twitter: @AdrianDiaz81

    jueves, 25 de abril de 2013 9:36
  • Para nada. Aunque quisiera no sabría, soy muy nuevo en Sharepoint. :)

    Estaba funcionando ok y el único cambio ha sido añadir una columna nueva y eliminar una vieja.
     

    He probado incluso a eliminar la columna mediante la consolar PowerShell de Sharepoint, siguiendo estos pasos, pero me dice lo mismo al hacer Update(), "Indice fuera de los límites de la matriz"

    Supongo que intenta eliminar la columna de la base de datos pero allí ya no está.

    ¿Cómo puedo eliminarla de Sharepoint?


    jueves, 25 de abril de 2013 9:57
  • Uff es que los temas de indices y demás es muy muy raro que pase sin hacer nada extra. Pero en esto de la informática ya sabes que nunca digas eso es imposible.

    A ver lo que se me ocurre es que intentes eliminar el campo utilizando los comandos de PowerShell, mediante programación lo puedes hacer con los siguientes comandos:

    Add-PsSnapin Microsoft.SharePoint.PowerShell -ErrorAction "SilentlyContinue"
    $oWeb = Get-SPWeb http://sitio;
    $list = $oWeb.Lists["lista"];
    $list.Fields["campo"].Delete();
    $list.Update();

    y si aun con eso no puedas pues intentaria seguir los pasos que el maestro Alberto Díaz indica en este post:

    http://geeks.ms/blogs/adiazmartin/archive/2011/07/12/sharepoint-2010-no-se-puede-borrar-una-columna-de-sitio-salvo-que-utilicemos-el-sql-server.aspx

    Pero mucho ojo y antes de hacerlo aseguraros bien de las copias de seguridad y demas :)

    Saludos,


    MCPD SharePoint 2010 Mi blog: http://blogs.encamina.com/desarrollandosobresharepoint Twitter: @AdrianDiaz81

    jueves, 25 de abril de 2013 10:44
  • Gracias por el intento, pero al hacer $list.Fields["xxxxx"].Delete(); me dice:

    Excepción al llamar a "Delete" con los argumentos "0": "Índice fuera de los límites de la matriz."

    :(


    Voy a intentarlo tocando directamente la base de datos SQL como indica Alberto Diaz, a ver si hay suerte
    jueves, 25 de abril de 2013 10:55
  • Puffff...

    Siguiendo los pasos de Alberto, no encuentro la columna que quiero eliminar en la tabla ContentTypes de la base de datos WSS_Content.

    Es una columna de una lista ¿en qué tabla la encuentro?

    Gracias

    jueves, 25 de abril de 2013 11:38
  • Hola Tomás,

    Si ni con ninguna de estas opciones lo puedes hacer, creo que el campo lo tienes eliminado, lo que creo que esta sucediendo es que hay algo en el formulario de la lista que esta estropeado. Lo logico es que al eliminar el campo con Designer se haya estropeado, yo intentaria abrir esta lista con designer y ver si puedo restablecer alguno de los formularios/vistas que es donde se produce este error.

    No se me ocurre otra cosa :(


    MCPD SharePoint 2010 Mi blog: http://blogs.encamina.com/desarrollandosobresharepoint Twitter: @AdrianDiaz81

    jueves, 25 de abril de 2013 11:57
  • Hola Tomas, la lista en cuestión tiene habilitados los Content Type? Si es así puede pasar que estes tratando de eliminar una columna de sitio pero para poder hacer eso primero debes eliminarla de todos los tipos de contenido.

    Saludos


    Msorli

    jueves, 25 de abril de 2013 14:47
  • ¿la lista en cuestión tiene habilitados los Content Type? 

    Saludos


    Msorli

    ¿Cómo compruebo eso? No es una columna de sitio, es una columna de una lista, simplemente
    jueves, 25 de abril de 2013 18:20
  • Hola Tomás,

    Si ni con ninguna de estas opciones lo puedes hacer, creo que el campo lo tienes eliminado, lo que creo que esta sucediendo es que hay algo en el formulario de la lista que esta estropeado. Lo logico es que al eliminar el campo con Designer se haya estropeado, yo intentaria abrir esta lista con designer y ver si puedo restablecer alguno de los formularios/vistas que es donde se produce este error.

    No se me ocurre otra cosa :(


    MCPD SharePoint 2010 Mi blog: http://blogs.encamina.com/desarrollandosobresharepoint Twitter: @AdrianDiaz81

    Hola Adrián, todo indica que el campo no está eliminado. Me sigue saliendo en la vista de lista de elementos, con sus diferentes valores para cada elemento, por lo que el campo está todavía en la base de datos. Lo que no sé es como en contrarlo en la base de datos SQL SERVER de contenido de Sharepoint (WSS_Content) para poder eliminarlo a mano. ¿En qué tabla debería estar?

    jueves, 25 de abril de 2013 18:25
  • Cuando están habilitados en la página de configuración de la lista visualizas la sección

    Igualmente si es una columna de lista y no de sitio no pasa lo que expuse anteriormente.


    Msorli

    jueves, 25 de abril de 2013 18:27
  • ¿Cuántas columnas tiene la lista? cuidado con el sql server y lo que tocamos, ¿no tienes un backup para restaurar?


    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server

    jueves, 25 de abril de 2013 18:28
  • Porque no prubas lo siguiente:

    1. Guardas la lista como plantillas
    2. Creas una nueva lista a partir de esa plantilla
    3. Pruebas si el campo está y si se puede eliminar
    4. Si lo puedes borrar, a lo mejor puedes pensar en copiar los datos de una lista a la otra desde la vista de hoja de datos.

    Saludos


    Msorli

    jueves, 25 de abril de 2013 18:29
  • La metadata de listas y bibliotecas se almacena en la tabla AllDocs. Por default, un elemento de lista o biblioteca puede ocupar hasta 6 registros de esa tabla si la cantidad de campos de un tipo supera al maximo que tiene la tabla, es decir, si la tablar tiene 18 campos tipo fecha y un elemento de lista tiene 19, entonces ese elemento utiliza dos registro de la tabla en el SQL.

    Para poder identificar que columna de la tabla utiliza para una lista podés filtrar los registros utilizando los campos SiteId, ListId y WebId. Ahi está laestructura de la tabla

    http://msdn.microsoft.com/en-us/library/hh656481(v=office.12).aspx

    Igual no te recomiento tocar la BD a menos que realmente no quede otra opción.

    Otra prueba que se me ocurre hacer es quitarla de la web app y luego volverla a adjuntar. Para eso hay que tener presente que se ejecutará un full crawl la próxima vez que se indexe. En este caso creo que lo más sano sería hacer un backup de la base de producción y llevarla a Testing o desarrollo para poder jugar tranquilo.

    Saludos


    Msorli

    jueves, 25 de abril de 2013 18:50
  • ¿Cuántas columnas tiene la lista? cuidado con el sql server y lo que tocamos, ¿no tienes un backup para restaurar?

    La lista tiene 8 columnas sólo, es una triste lista de facturas, con columnas tales como fecha de expedición, proveedor, importe total, fecha de vencimiento, número de registro... De hecho puedo añadir una nueva columna y a continuación eliminarla sin problemas, pero lo que no puedo es eliminar la columna en cuestión (columna de tipo string).

    Por supuesto, antes de tocar nada en el SQL haré un backup de la base de datos, pero me gustaría encontrar la tabla que define las columnas de mi lista, para probar si se soluciona eliminándola de ahí.


    jueves, 25 de abril de 2013 18:53
  • Porque no prubas lo siguiente:

    1. Guardas la lista como plantillas
    2. Creas una nueva lista a partir de esa plantilla
    3. Pruebas si el campo está y si se puede eliminar
    4. Si lo puedes borrar, a lo mejor puedes pensar en copiar los datos de una lista a la otra desde la vista de hoja de datos.


    Me parece buena idea, el problema es que algunos elementos tienen asociados flujos de trabajo y documentos adjuntos. No sé si eso se copiará a la nueva lista también, pero es una opción, lo probaré.

    Tic, tac, tic, tac...

    Pues nada, lo he probado y el mismo resultado. Creo una plantilla y luego creo una nueva lista a partir de la plantilla, pero tengo el mismo problema, no me deja eliminar el maldito campo, y tampoco funcionan los formularios de editar elemento y añadir nuevo elemento.

    jueves, 25 de abril de 2013 18:55
  • Por lo que te comenté anteriormente, no creo que puedas eliminar la columna, yo no lo haría :).

    Msorli

    jueves, 25 de abril de 2013 18:56
  • Cuando están habilitados en la página de configuración de la lista visualizas la sección

    Igualmente si es una columna de lista y no de sitio no pasa lo que expuse anteriormente.


    Msorli


    No es una columna de sitio Msorli, no me sale nada de eso.
    jueves, 25 de abril de 2013 19:01
  • Por lo que te comenté anteriormente, no creo que puedas eliminar la columna, yo no lo haría :).

    Msorli


    En esa misma lista he creado y he eliminado columnas similares. Es la columna proveedor, que es un simple String. El caso es que hice tres columnas proveedor, y ahora me interesa quedarme con sólo una de ellas (todas tienen datos). Eliminé una perfectamente, pero al eliminar la siguiente me surgió este fallo. Sin embargo puedo crear otra columna 'proveedor' de tipo String, añadir datos, y luego eliminarla sin problemas. Así son las cosas.
    jueves, 25 de abril de 2013 19:06
  • Me refería a que no eliminaría una columna de la tabla del SQL.

    Msorli

    jueves, 25 de abril de 2013 19:09
  • Me refería a que no eliminaría una columna de la tabla del SQL.

    Msorli


    Yo en condiciones normales tampoco, pero no me queda otra. Ahora mismo no pueden añadir nuevas facturas a la lista. Supongo que cuando consiga eliminar ese campo definitivamente volverán a funcionar los formularios de Editar Elemento y Añadir nuevo elemento.
    jueves, 25 de abril de 2013 19:12
  • Por que no pruebas esta herramienta de Codeplex SharePoint Manager. Yo utilice la versión 2007 y 2010 (estaba mucho mejor) para tocar algunas propiedades internas de los campos. Te expone todo el modelo de objetos, a lo mejor desde ahi lo puedes eliminar.

    Msorli

    jueves, 25 de abril de 2013 19:16
  • Un tema más, esa columna seguramente no solo almacena el dato conflictivo de tu lista. Esa misma columna podría almacenar datos de otras listas o sitios de la misma base.

    Una base puede tener varios site collection, la tabla AllDocs la comparten todos los site collection. Si por ejemplo encuentras tu columna y es la nvarchar4, esa misma columna puede guardar datos de otras listas e incluso de otros sitios.


    Msorli

    jueves, 25 de abril de 2013 19:30
  • Por que no pruebas esta herramienta de Codeplex SharePoint Manager. Yo utilice la versión 2007 y 2010 (estaba mucho mejor) para tocar algunas propiedades internas de los campos. Te expone todo el modelo de objetos, a lo mejor desde ahi lo puedes eliminar.

    Msorli


    Jejeje, también la he probado, pero el tema aquí es que con Sharepoint Manager 2010 me sale el sitio principal, pero no me salen los subsitios, y la lista en cuestión está en un subsitio. :(
    jueves, 25 de abril de 2013 19:42
  • Un tema más, esa columna seguramente no solo almacena el dato conflictivo de tu lista. Esa misma columna podría almacenar datos de otras listas o sitios de la misma base.

    Una base puede tener varios site collection, la tabla AllDocs la comparten todos los site collection. Si por ejemplo encuentras tu columna y es la nvarchar4, esa misma columna puede guardar datos de otras listas e incluso de otros sitios.


    Msorli


    Para nada. Es una lista totalmente nueva que cree hace unos dias y le puse ese campo que no tiene más relaciones.
    jueves, 25 de abril de 2013 19:43
  • Perdón, nuevamente hablaba de la columna en el SQL.

    Msorli

    jueves, 25 de abril de 2013 19:44
  • Tienes un problema de inconsistencia de los metadatos, entre el SQL Server del SharePoint y la definición de la lista.

    Puede ser por muchos motivos, pero si esa columna se está utilizando en un workflow, puede fallar, me extraña que al intentar eliminarla se haya quedado el proceso a medias y se haya quedado algo a medias.

    Cualquier cosa que intentes y utilice el modelo de objetos, va a fallar, con lo que o recuperas una copia de seguridad, en otro servidor y restauras sólo esa lista o te peleas con el sql server (cosa que no te recomiendo)


    Alberto Diaz Martin twitter://@adiazcan | http://geeks.ms/blogs/adiazmartin | MVP SharePoint Server

    jueves, 25 de abril de 2013 19:50
  • Tienes un problema de inconsistencia de los metadatos, entre el SQL Server del SharePoint y la definición de la lista.

    ¿Y no puedo modificar la definición de la lista de forma manual para que no incluya ese campo?

    ¿Cómo encuentro el campo problemático en SQL? Siempre puedo probar a eliminarlo de SQL (previo backup) y si no funciona restaurar el backup.

    jueves, 25 de abril de 2013 19:56
  • No, no puedes eliminar un campo de la base de contenido del SQL por lo que te expliqué anteriormente. Ese campo no solo lo utiliza tu lista, otras listas del sitio y de otros site collection puede ser que lo utilicen también.

    Msorli

    viernes, 26 de abril de 2013 12:47
  • Otra prueba que se me ocurre hacer es quitarla de la web app y luego volverla a adjuntar. Para eso hay que tener presente que se ejecutará un full crawl la próxima vez que se indexe. En este caso creo que lo más sano sería hacer un backup de la base de producción y llevarla a Testing o desarrollo para poder jugar tranquilo.


    ¿Puedes explicar un poco más eso o indicarme algún enlace? 
    viernes, 26 de abril de 2013 13:57
  • Puedes hacerlo por la interfaz de usuario pero te recomiendo que lo hagas por PowerShell.

    Dismount-SPContentDatabase

    Mount-SPContentDatabase

    Saludos


    Msorli

    viernes, 26 de abril de 2013 18:02
  • Hola Tomas, pudiste resolver el problema?


    Saludos


    Msorli

    viernes, 3 de mayo de 2013 12:44