none
Campos duplicados en una lista. WSS3 RRS feed

  • Pregunta

  • Hola a todos.

    En nuestra empresa estamos usando un formalario para introducir los datos del inventario informático en una lista de sharepoint (WSS 3.0). Quisiera saber si hay alguna forma de que al salvar la información se detecte si hay algún campo duplicado en una columna, por ejemplo, el numero de serie del equipo. Nos hemos encontrado que se han introducido por error algunos equipos 2 veces o mas.

    Gracias.
    viernes, 12 de febrero de 2010 19:33

Respuestas

Todas las respuestas

  • Puedes crear un event receiver que se ejecute cada vez que se agrega un elemento a la lista, cuando se agregue el elemento tu evento va a verificar que el campo no exista ya en la lista (caml query), si ya existe cancelas el evento para que el elemento no pueda ser agregado, de otra forma se agrega de manera normal
    viernes, 12 de febrero de 2010 20:35
  • Por "formulario" te refieres a uno que has desarrollado tu a través de InfoPath? o a una lista donde has personalizado los campos?... en el primer caso es muy sencillo meter esa validación, simplemente lo metes como una condición de tu campo de número de serie y listo, puedes decir que mande la alerta del error cuando se introduce el dato o hasta que se intenta guardar... para el segundo caso la cosa se complica un poco, ya que tendrías que programar un evento como menciona Karla para que controles eso o también meterte al código que controla el campo de número de serie y meter una validación de campo único, para que los datos que agreguen no se puedan repetir...

    Avisanos en que caso cae tu escenario, para que si es tema de desarrollo, pasemos tu tema al foro de MSDN sobre desarrollo en SharePoint y te puedan ayudar mejor...

    Saludos;
    Vlad Blogs: http://sharepointblogs.com.mx/blogs/medinav/default.aspx & http://vladpoint.wordpress.com/
    viernes, 12 de febrero de 2010 22:54
    Moderador
  • Hola.

    Gracias por vuestras respuestas.

    El formulario que tenemos está realizado con sharepoint. Entiendo que la respuesta de Karla seria la solución.
    No soy muy experto en sharepoint y no se muy bien como hacerlo. Voy a buscar información sobre ello y os comento como me ha ido.

    Saludos.
    sábado, 13 de febrero de 2010 10:48
  • Hola Xavier:

    Efectivamente puedes hacerlo con eventos. Fijate en este post http://surpoint.blogspot.com/2009/12/manejadores-de-eventos-en-sharepoint.html en la sección "Demo 2: validando integridad en un evento de ítem ".

    En Codeplex hay algo: http://www.codeplex.com/features (ver Unique Column Policy). No lo he probado, por lo tanto no puedo recomendarlo.

    Existen algunos componentes comerciales como este: http://www.kwizcom.com/ProductPage.asp?ProductID=811&ProductSubNodeID=812
    Pero realmente no lo he probado ni puedo recomendarlo.

    Espero que te sea útil el link que te pasé. Un evento es una buena solución para este problema.
    Culaquier dudas nos consultás.
    Juan Pablo.
    surpoint.blogspot.com
    geeks.ms/blogs/jpussacq
    hispapoint
    martes, 16 de febrero de 2010 18:15
  • Gracias por tu respuesta Juan Pablo.

    Siguiendo el consejo de Karla y de VladPoint, he encontrado un articulo en el que indica paso a paso "COMO CREAR UN EVENTO EN SHAREPOINT": http://www.mundosharepoint.es/2008/06/12/cmo-crear-eventos-de-sharepoint/ , el cual estaba siguiendo. He revisado por encima los links que me has pasado y creo que me serán de mucha utilidad, por lo que me dispongo a revisarlos a fondo para entender mejor como func¡ona este tema de los eventos.

    Agradezco de nuevo a todos la ayuda que me estais prestando.

    Saludos.
    martes, 16 de febrero de 2010 19:53
  • Hola Juan Pablo.

    Necesitaria un poco de tu ayuda. He estado revisando el post que me enviaste de "manejadores de eventos" y he estado siguiendo los pasos para crear mi evento. No tengo demasiados conocimientos en programación y me he perdido un poco. Te comento la prueba que estoy haciendo:

    He creado una Lista a la que he llamado "Prueba" y a una columna la he llamado "Nº de Serie". Mi intención es que al introducir los datos en un inventario de equipos informáticos, no se pueda repetir el Nº de serie. El codigo que he creado siguiendo tu ejemplo es el siguiente:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using Microsoft.SharePoint;

     

    namespace NumeroSerieDuplicado

    {

        public class NumeroSerieDuplicado : SPItemEventReceiver

        {

            public override void ItemAdding(SPItemEventProperties properties)

            {

                SPWeb Web_Pruebas  = properties.OpenWeb();

                SPList Lista_Pruebas = Web_Pruebas.Lists["Prueba"];

                SPQuery Pruebas_Query = new SPQuery();

                Pruebas_Query.ViewFields = "<FieldRef Name = 'Nº de Serie'/>";

                Pruebas_Query.Query = "<Where>" +

                                        "<Eq>";

     

                Pruebas_Query.Query = "</Eq>" +

                                     "</Where>";

                SPListItemCollection prueba_items = Lista_Pruebas.GetItems(Pruebas_Query);

                if (prueba_items.Count >= 1)

                {

                    properties.Status = SPEventReceiverStatus.CancelWithError;

                    properties.ErrorMessage = "ERROR: Duplicado. Ya existe un Nº de Serie con este código";

                    properties.Cancel = true;

                }

            }

     

        }

    }

    Todo este codigo lo entiendo bién, excepto la parte:

    Pruebas_Query.Query = "<Where>" +

                                        "<Eq>";

     

                Pruebas_Query.Query = "</Eq>" +

                                     "</Where>";


     ... en la que entiendo que deberia introducir código aquí, el cual me haria la comparación de los campos (?). Aunque en el video comentas que el codigo de tu ejemplo aqui introducido esta adaptado a tu pagina, no entiendo el funcionamiento de este.

    Te agradeceria que pudieras orientarme como seguir este codigo y si puede ser explicar un poco el funcionamiento de "<Where>""<Eq>";
    Gracias.

    Saludos.

    miércoles, 24 de febrero de 2010 21:32
  • Hola a todos.

     

    He terminado mi aplicación y la he trasladado al entorno de producción. Os indico los pasos que he seguido:

     

    Para la creación del proyecto con Visual Basic, he seguido los pasos del siguiente “tutorial paso a paso”  http://www.mundosharepoint.es/2008/06/12/cmo-crear-eventos-de-sharepoint/. En el entorno de pruebas, he creado una lista llamada "Prueba" y una columna llamada “Serie”. El código que he creado basándome en las explicaciones del post de Juan Pablo y el post “Preventing Duplicate Items” del blog http://www.mannsoftware.com/blog/Lists/Posts/Post.aspx?ID=14 es el siguiente:

     

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using Microsoft.SharePoint;

     

    namespace NumeroSerieDuplicado

    {

        public class NumeroSerieDuplicado : SPItemEventReceiver

        {

            public override void ItemAdding(SPItemEventProperties properties)

            {           

                SPWeb Web_Informatica = properties.OpenWeb();

                SPList Lista_Prueba = Web_Informatica.Lists["Prueba"];

                SPQuery Prueba_Query = new SPQuery();

                Prueba_Query.ViewFields = "<FieldRef Name = 'Serie'/>";

                string NumeroDeSerie = properties.AfterProperties["Serie"].ToString();

     

                Prueba_Query.Query = "<Where><Eq><FieldRef Name='Serie'/><Value Type='Text'>" + NumeroDeSerie +

                    "</Value></Fieldref></Eq></Where>";

     

                SPListItemCollection Duplicados = Lista_Prueba.GetItems(Prueba_Query);

                if (Duplicados.Count >= 1)

                {

                    properties.Status = SPEventReceiverStatus.CancelWithError;

                    properties.ErrorMessage = "ERROR: Campo Duplicado. El Nº de Serie " + properties.AfterProperties["Serie"].ToString() + " que ha introducido ya existe." +

                        char.ConvertFromUtf32(13) + char.ConvertFromUtf32 (10) + // Salta a la linea inferior

                        "Revise si el equipo ya se encuentra en el inventario";

                    properties.Cancel = true;

                }

            }

     

        }

    }

     

     

    Para asociar el evento a la lista, he seguido los pasos de la segunda parte del mismo tutorial http://www.mundosharepoint.es/2008/07/11/cmo-registrar-eventos-en-sharepoint/  usando el tercer método (el mas fácil),  utilizando la aplicación  Sharepoint Inspector de Codeplex http://www.codeplex.com/spi.

     

    Una vez comprobado el correcto funcionamiento, he modificado el código para que el nombre de la lista y el nombre de la columna coincidieran con la lista de mi entorno de producción, siguiendo los mismos pasos.

     

    Comentaros que para comprender el funcionamiento de los eventos recomiendo el visionado del Webcast de Juan Pablo http://surpoint.blogspot.com/2009/12/manejadores-de-eventos-en-sharepoint.html. Explica muy bien el funcionamiento de los manejadores de  eventos en sharepoint.

     

    Gracias a todos por vuestra ayuda.

     

     

    jueves, 11 de marzo de 2010 13:49
  • Hola Xavier:

    Se me pasó la pregunta que me habías hecho o no me llegó el mail :-(
    Entiemdo que ya lo has resuelto verdad?
    Juan Pablo.
    surpoint.blogspot.com
    geeks.ms/blogs/jpussacq
    ¿Hiciste tu consulta en HispaPoint?
    sábado, 13 de marzo de 2010 3:06
  • Hola Juan Pablo,
    Asi es, ya está resuelto.
    No te preocupes por no haber respondido a la pregunta, ya que al tener que buscar mas información sobre las dudas que tenía también he entendido mejor el funcionamiento.

    También decirte que los links que me comentabas en tu post me han sido de gran utilidad.

    Gracias de nuevo por tu ayuda.

    Saludos.
    sábado, 13 de marzo de 2010 13:07
  • sábado, 13 de marzo de 2010 18:28