Archivo

Posts Tagged ‘CAML’

Cómo buscar elementos en listas sin tener que usar CAML


Cuando hacemos desarrollo de componentes para SharePoint (WebParts, Application Pages, etc.) es muy común que tengamos que leer una lista (o biblioteca de documentos, galería de imágenes, etc.) para manipular suselementos. Puede ser, sin embargo, que queramos que la lectura se haga dependiendo de ciertos criterios. En otras palabras, queremos filtrar los elementos de la lista.

Hacer eso a mano (i.e. un foreach hacia SPList.Items) no suele ser una buena práctica, especialmente si nuestra lista contendrá muchos elementos. Naturalmente, la solución consiste en crearnos una consulta con CAML (Collaborative Application Markup Language, si la memoria no me falla) y buscar los elementos llamando a SPList.GetItems, como se muestra a continuación.

SPQuery query = new SPQuery();
query.Query = "[Mi consulta CAML]";

SPList list = SPContext.Current.Web.Lists["Mi Lista"];
SPListItemCollection items = list.GetItems(query);

// y hacer algo con items. 

Hacer consultas con CAML, sin embargo, es algo que lleva tiempo. El esquema de CAML para consultas tiene muchos elementos y la curva de aprendizaje es, en mi opinión, un tanto pronunciada. Por ello, muchas veces tenemos que usar herramientas como el U2U  CAML Query Builder para que nos ayude a generar la consulta.

Un truco que me ha dado resultado, y que incluso me da mucha más flexibilidad para poder configurar mi búsqueda posteriormente, consiste en crear una vista y programáticamente leer el CAML que ésta utiliza. Ya con el CAML, repetimos el paso del código anterior y listo.

Para lograr lo anterior, debemos a) obtener la lista sobre la que haremos la consulta, b) obtener la vista, usualmente por su nombre; c) obtener la consulta CAML de la vista a través de la propiedad Query, y d) con ese CAML crear un objeto SPQuery y ejecutar SPList.GetItems. Easy peasy:

SPList list = SPContext.Current.Web.Lists["Mi Lista"];
SPView view = list.Views["Mi vista"];
// alternativamente, si quieres usar la vista por defecto:
// SPView view = list.DefaultView;

SPQuery query = new SPQuery();
query.Query = view.Query;
// si analizas view.Query con el QuickWatch de Visual Studio
// pordrás ver el CAML de la vista...

SPListItemCollection items = list.GetItems(query);
// y hacer algo con los elementos encontrados. 

Este truco te permitirá, además, que el usuario (o administrador) de la lista modifique la vista en cuestión, sin tener que recompilar. Una buena técnica que últimamente me ha salvado trabajo de codificación y de estar lidiando con CAML…

Anuncios

Buscar los registros creados por el usuario actual


Cuando desarrollamos una solución utilizando SharePoint, al menos en mi experiencia, es común que nuestro cliente, en algún momento, nos haga el siguiente requerimiento: dada una lista o biblioteca determinada, mostrar sólamente los elementos que hayan sido creados por dicho usuario.

Hacer esto en SharePoint, por supuesto, no es problema alguno. Basta crear una vista, o modificar la vista por defecto, irnos a la sección de filtros y seleccionar el campo “Creado por”, es igual a, y en el valor, ponemos “[Yo]” (o “[Me]” en inglés).

Sin embargo, también es común que tengamos que aplicar la misma regla de negocio al momento de desarrollar nuestros componentes (por ejemplo, un WebPart con un SPGridView). Y para ello, ni modo de iterar sobre todos los elementos de una lista… mejor utilizar una consulta con CAML.

En particular, este es el CAML que nos interesa.

<Where>
    <Eq>
        <FieldRef Name="Author" />
        <Value Type="Integer">
            <UserID Type="Integer" />
        </Value>
    </Eq>
</Where>

El Where y el Eq no debe sorprendernos, son normalitos. La etiqueta FieldRef hace referencia al campo Author, que no es más que la columna de “Creado por”. Y en la etiqueta Value, hacemos dos cosas: primero, especificar que el campo será de tipo entero (naturalmente, puesto que se filtrará por el ID del usuario), y segundo, incluímos como etiqueta hija a UserID, también de tipo entero. La etiqueta UserId, por supuesto, hace referencia al usuario actualmente autenticado.

Luego entonces, el código para hacer realidad todo esto quedaría algo así:

SPQuery query = new SPQuery();
query.Query = @"<Where>
                                   <Eq>
                                       <FieldRef Name=""Author"" />
                                       <Value Type=""Integer"">
                                           <UserID Type=""Integer"" />
                                       </Value>
                                   </Eq>
                               </Where>";

SPList list = SPContext.Current.Web.Lists["Mi Lista"];
SPListItemCollection items = list.GetItems(query);

// y hacer lo que sea que hagamos con los elementos, 
// como llamar a GetData para obtener un DataTable
// y hacer un DataBind con un SPGridView... 

 

And be done with it…