viernes, 8 de abril de 2011

Crear una lista programaticamente con vista predeterminada

Con el Api de Sharepoint podemos crear listas de almanamiento de manera programática, haciendo uso de los objetos SPWeb y los metodos del objeto SPList, adicional a esto podemos crear la vista por defecto que toda lista de forma nativa tiene mediante el objeto SPView, el siguiente ejemplo crea una lista en tiempo de ejecucion para mostrar las ventas del día por areas de negocio de una empresa respectiva:

SPWeb web = SPContext.Current.Web;
web.AllowUnsafeUpdates = true;
string listName = "VentasDelDia";


// Adicionar nueva lista.
web.Lists.Add(listName, string.Empty, SPListTemplateType.GenericList);


// Adicionar campos.
web.Lists[listName].Fields.Add("Title", SPFieldType.Text, false);
web.Lists[listName].Fields.Add("VentaDelDia", SPFieldType.Text, false);
web.Lists[listName].Fields.Add("Area", SPFieldType.Text, false);


// Creacion de la vista por defecto con campos nuevos.
SPView defaultView = web.Lists[listName].DefaultView;
defaultView.ViewFields.DeleteAll();
defaultView.ViewFields.Add("VentaDelDia");
defaultView.ViewFields.Add("Area");
defaultView.Update();


// guardar cambios en el sitio web
web.Update();

jueves, 20 de enero de 2011

Consulta CAML con los últimos N elementos

Muchas veces necesitamos consultar una lista cualquiera en Sharepoint, retornando solo los últimos items actualizados, por ejemplo, el famoso carrusel de imágenes con las últmas 5 fotos cargadas, pues bien, si tuvieramos una lista de imágenes y quisieramos desarrollar un webpart con un look and feel ya establecido, la recomendación seria usar el objeto SPQuery para implementar una consulta CAML, con las siguientes características:

Clausula OrderBy:
<OrderBy><FieldRef Name='Modified' Ascending='FALSE'/></OrderBy>

Propiedad RowLimit:
miConsulta.RowLimit = 10;

Adicional a esto, si quisiera solo retornar las columnas o campos específicos, debo indicarlo asi:

Propiedad ViewFields:

miConsulta.ViewFields = "<FieldRef Name=\"Title\"/>" + "<FieldRef Name=\"Description\"/>" + "<FieldRef Name=\"Link\"/>";

El código completo sería asi, suponiendo que se tiene un objeto SPList lista:

SPQuery miConsulta = new SPQuery();

miConsulta.Query = "<OrderBy><FieldRef Name='Modified' Ascending='FALSE'/></OrderBy>";
miConsulta.RowLimit = 5;
miConsulta.ViewFields = "<FieldRef Name=\"Title\"/>" + "<FieldRef Name=\"Description\"/>" + "<FieldRef Name=\"Link\"/>";
SPListItemCollection myColl = lista.GetItems(miConsulta);

De aqui, ya sería recorrer los items de la lista, o llenar un DataTable para continuar con la lógica de nuestro webpart.

Saludos,