Wednesday, August 03, 2011

SharePoint 2007 y OBAs

Hola de nuevo. En dias pasados había estado desarrollando una solución en SharePoint Server 2007, exactamente una WebPart, que tenía como finalidad tomar datos de SharePoint (KPIs) y los exportaba a un template de Excel donde esos datos terminaban siendo tabulados, aplicados sobre formulas, y en otras páginas del archivo Excel gráficados. Quisiera compartir algunas rutinas de código comunes que se usaron, que quiza puedan ser de utilidad a la comunidad.

Anoto que los ejemplos son fragmentos de toda la solución, así que recibirán parámetros, tendrán nombres específicos, llamados quizá a otros métodos, que ya ustedes deberán modificar según su necesidad.

1. Lo primero que vale la pena aclarar es que para esta solución SharePoint se hace uso de WSPBuilder, se los recomiendo, y aquí pueden ver su uso.

2. Debido a que se utilizó OPEN XML SDK para todo lo que tenía que ver con las operaciones sobre Excel del lado del servidor, para finalmente producir un archivo en formato XLSX, les recomiendo mucho usar el SDK provisto por Microsoft, pero ante todo denle una mirada a esta herramienta (Open XML SDK Tool).

Es una herramienta bastante buena que les acepta un archivo Excel en formato XLSX, y finalmente les genera el código C# que permitiría producirlo. Es una ventaja porque uno puede hacer un archivo de prueba, tal como quiere generarlo, y ahorrarse mucho tiempo de desarrollo desde ceros. Toca ajustarlo a lo dinámico de la solución, pero eso ya es algo que evidentemente debe hacerse, pero la estructura general del desarrollo, estaría lista.

3. Ya en código, tú primer requerimiento puede ser obtener todas las listas genéricas (evitar las listas especiales de SharePoint) del site collection y de todos sus sitios hijos, para que con ese listado llenar un control en la capa de presentación que podría ser un ComboBox, un ListBox, etc

public IList < TGlista > GetListas()
{
SPWeb web = SPContext.Current.Site.RootWeb;
TGLista lista = null;
SPListCollection listasTemp = web.Lists;
IList listas = new List();
try
{
if (listasTemp != null)
{
foreach (SPList listaTemp in listasTemp)
{
if (listaTemp.BaseTemplate == SPListTemplateType.GenericList)
{
lista = new TGLista();
lista.Id = listaTemp.ID;
lista.Titulo = listaTemp.Title;
listas.Add(lista);
}
}
}

SPWebCollection webs = web.Webs;
if (webs != null)
{
foreach (SPWeb webTemp in webs)
{
try
{
listasTemp = webTemp.Lists;
foreach (SPList listaTemp in listasTemp)
{
if (listaTemp.BaseTemplate == SPListTemplateType.GenericList)
{
lista = new TGLista();
lista.Id = listaTemp.ID;
lista.Titulo = listaTemp.Title;
listas.Add(lista);
}
}
}
finally
{
if (webTemp != null)
webTemp.Dispose();
}
}
}

if (listas != null)
{
//Hace un ordenamiento ASCENDENTE de la lista
var list = from temp in listas
orderby temp.Titulo
select temp;
return list.ToList();
}
}
catch (Exception ex)
{
throw;
}
return null;
}
Lo primero que se observa es lo que retorna el método:IList < TGlista > . TGLista no es más que una clase entidad, que sirve como contenedor para generar un listado genérico de tipos TGLista, lo cual es ya una técnica de programación muy sencilla y fácil de pasar datos entre las diferentes capas de la solución .NET. El control de la capa de presentación aceptará el tipo IList sin ningún problema.

Luego en la linea SPWeb web = SPContext.Current.Site.RootWeb; se obtiene un objeto de tipo SPWeb, pero usando la clase SPContext, lo cual es la técnica recomendada cuando se programa una WebPart que estará dentro del contexto del sitio de SharePoint. Super importante, no se hace DISPOSE de la instancia web.

Esta linea if (listaTemp.BaseTemplate == SPListTemplateType.GenericList) es la que evita que en el listado se obtengan las listas especiales de SharePoint.

Ahora bien, el requerimiento incluia las listas de los sitios hijo del SiteCollection. Esta linea obtiene todos los sitios hijo SPWebCollection webs = web.Webs; Ahora con esa colección por cada sitio hijo se obtienen su listas del mismo modo. Importante el DISPOSE que si se debe hacer de cada subsite.

finally
{
if (webTemp != null)
webTemp.Dispose();
}

La razón de lo anterior es que cada subsite obtenido es un nuevo SPWeb que en este caso si debe hacerse DISPOSE formal.

Finalmente un poco de LINQ no hace daño para ordenar la lista generica de elementos.
if (listas != null)
{
//Hace un ordenamiento ASCENDENTE de la lista
var list = from temp in listas
orderby temp.Titulo
select temp;
return list.ToList();
}

Por ahora esto es todo, luego seguiremos compartiendo más TIPs de código .NET para SharePoint.

Felíz Coding!!

No comments: