HansBaumann.net
"No se cómo será la tercera guerra mundial, sólo se que la cuarta será con piedras y lanzas" (Albert Einstein)

Como crear un vista con criterios complejos

27/05/2011 18:53:00

Os pongo en situación: Necesito crear una vista de una lista, cuyos elementos sólo le aparezcan a los usuarios del grupo que aparece en un campo de la lista. Como requisito no quiero establecer permisos individuales por cada elemento para no tener un caos de administración en el futuro.

El que ha desarrollado seguro que lo primero que piensa es en picar algún codigo y luego te vuelves loco. En mi caso teníamos dos problemas:

  • No sabía como filtar la información de esa forma o si incluso se puede.
  • Si consigo el filtro, ¿Como creo la vista?.

El primer problema lo encontré navegando por la web en un artículo de Marc Anderson sobre filtros CAML. Básicamente se traduce en esta línea de código CAML.

<Where>  
    <Membership Type="CurrentUserGroups">  
        <FieldRef Name="CampoConElValorDelGrupo"/>  
    </Membership> 
</Where> 

El segundo problema lo resolví de una manera un poco "bestia" pero que me resultó muy efectiva. El problema es que no puedes crear este tipo de criterios de filtros en una vista ni en SharePoint Designer ni con el editor de vista de SharePoint. Así, si SharePoint soporta este criterio, ¿Desde dónde agregamos la vista? La respuesta da miedito pero no encontré otra opción: Utilizando el modelo de objetos directamente. Por una cuestión de estilo prefiero usar los servicios web de SharePoint antes que usar la API. La razones son variopintas pero en general:

  • No tienes que ejecutar el código directamente en el servidor.
  • Puedes, desde un mismo cliente, direccionar el servidor al que quieres "atacar". Por ejemplo desde un mismo ordenador puedes hacer lo mismo en pre y pro.
  • En casos de balanceo de carga, es mas escalable utilizar los servicios web que la API, donde sólo cargar un servidor.
  • Si no tienes el SharePoint en tu ordenador, no importa, puedes probar y depurar el código desde tu ordenador.

El código fuente os lo pego aquí, pero también os dejo a manera de descarga el proyecto en Visual Studio 2010

La lista personalizada está basada en la plantilla de "Anuncios" al que le agregué una columna "GrupoAMostrar"

            //
            //Instanciamos el proxy del web service
            WS_Vistas.Views miproxy = new WS_Vistas.Views();

            //
            //NOTA: CAMBIAR ESTA URL POR LA DEL SITIO QUE SE DESEA MODIFICAR
            miproxy.Url = "http://{ruta del sitio de SharePoint}/_vti_bin/Views.asmx";

            //
            //NOTA: Descomentar esta línea si el servidor de SharePoint está en otro dominio o 
            //      el usuario que ejecuta la aplicación no es administrador del sitio
            //miproxy.Credentials = new System.Net.NetworkCredential(@"dominio\usuario", "password");
            miproxy.UseDefaultCredentials = true;

            //
            //Armo la cláusula de filtro basándome en la columna 'GrupoAMostrar' (nótese las mayúsculas y minúsculas)
            string strconsulta = @"
                <Where>
                    <Or>
                        <Membership Type='CurrentUserGroups'>
                            <FieldRef Name='Grupos'/>
                        </Membership>
                        <IsNull>
                            <FieldRef Name='GrupoAMostrar'/>
                        </IsNull>
                    </Or>
                </Where>
                <OrderBy>
                    
                </OrderBy>";
            
            string strlimitefilas = "50";

            //
            //Especifico los campos de la lista que va a utilizar la vista.
            string strcampos =
                    @"<FieldRef Name='Title' />
                      <FieldRef Name='Body' />
                      <FieldRef Name='Expires' />
                      <FieldRef Name='Author' />
                      <FieldRef Name='Editor' />
                      <FieldRef Name='Modified' />
                      <FieldRef Name='GrupoAMostrar' />";
            //
            //Preparo los parámetros a enviar
            System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();

            xmlcriterios = xmlDoc.CreateNode(XmlNodeType.Element, "Query", "");
            xmllimitedeficheros = xmlDoc.CreateNode(XmlNodeType.Element, "RowLimit", "");
            xmlcampos = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "");

            xmlcriterios.InnerXml = strconsulta;
            xmllimitedeficheros.InnerXml = strlimitefilas;
            xmlcampos.InnerXml = strcampos;
            nombrelista = "Noticias";
            nombrevista = "Por Grupos";

            //
            //Lanzo la llamada para que agregue una vista como yo necesito
            miproxy.AddView(
                nombrelista,
                nombrevista,
                xmlcampos,
                xmlcriterios,
                xmllimitedeficheros,
                "HTML",
                true);
        }

        public static string nombrelista { get; set; }
        public static string nombrevista { get; set; }
        public static System.Xml.XmlNode xmlcampos { get; set; }
        public static System.Xml.XmlNode xmlcriterios { get; set; }
        public static System.Xml.XmlNode xmllimitedeficheros { get; set; }
        public static string tipo { get; set; }
        
        

Ala, a disfrutar.

Comentarios

¿Cual es el resultado de sumar 8 y 6?

Autor :

Correo Electronico (opcional):

Texto:

Agregar comentario
Inicio | Perfil | Publicaciones | Contacto | Mapa del sitio
2009 | webmaster
Valid XHTML 1.0 Transitional    ¡CSS Válido!