SSD: el síndrome de la Sharepoint dependencia

Sharepoint me proporciona seguridad y me hace sentir más fuerte. Las 10 cosas que más me gustan de Sharepoint.

10 puntos para entender a Project Server 2010

Microsoft Project es quizá la herramienta de gestión de proyectos más conocida y utilizada por los líderes de proyectos...

Diseño Gráfico en SharePoint

Serie de artìculos que nos ayudan a incorporar diseño gráfico en las implementaciones de SharePoint...

Revista CompartiMOSS

Artículos publicados en la revista especializada en SharePoint: CompartiMOSS.

Contacto

Enviame un correo :-)

viernes, 31 de julio de 2009

sharepoint 2010 - documentación para desarrolladores

Gente, les paso información para desarrolladores sobre Sharepoint 2010:

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=94afe886-3b20-4bc9-9a0d-acd8cd232c24

Aún no la he visto en detalle. Que lo disfruten. Contenido:

Customizing the Ribbon in Windows SharePoint Services “14”: The Ribbon is now included in the user interface for Windows SharePoint Services “14” and Microsoft SharePoint Server 2010. This white paper describes how developers extend the Ribbon by using a combination of XML and ECMAScript (JavaScript, JScript). Customizations to the Ribbon in the included example are created by using the Feature infrastructure, and can be deployed by using a solution package (.wsp file). This white paper is provided in both PDF and XPS format.

SharePoint Products and Technologies 2010 Technical Preview Managed Reference SDK: This compiled help (.chm) file contains reference topics focusing on types and members new to the SharePoint Products and Technologies 2010 managed object model that are called by other Microsoft applications. This reference does not reflect the entirety of the SharePoint Products and Technologies 2010 managed object model.

miércoles, 29 de julio de 2009

LookUp fields

Un par de ejemplos acerca de cómo tratar campos de búsqueda (lookup fields) en sharepoint. Cualquier consulta o sugerencia, envíen comentarios:

1) Accediendo a un lookup field desde un Evento

public override void ItemAdded(SPItemEventProperties properties)

{

SPFieldLookupValue Oferta = new SPFieldLookupValue(properties.ListItem["Oferta"] as
string);

properties.ListItem["OfertaID"] = Oferta.LookupId;

2) Leyendo un lookup field desde un SPQuery

SPWeb yq_web = properties.OpenWeb();

SPList articulos_list = yq_web.Lists["Artículos"];

SPQuery articulos_query = new SPQuery();

articulos_query.ViewFields = "<FieldRef Name='ID'/>";

articulos_query.Query = "<Where><Eq>" +

"<FieldRef Name='Actividad' LookupId='TRUE'/><Value Type='Lookup'>" +

Actividad.LookupId + "</Value></Eq></Where>";

SPListItemCollection articulos_items = articulos_list.GetItems(articulos_query);

martes, 28 de julio de 2009

GROUP BY en sharepoint

El problema

¿Es posible hacer una consulta en sharepoint como la que haríamos en SQL?

SELECT SUM(importe) FROM Pedidos GROUP BY Cliente, Producto

La respuesta es NO, al menos en Sharepoint 2007. No he encontrado la forma de hacer un group by en un spquery. La documentación que hay al respecto es un tanto confusa. Existe el tag <GroupBy> en CAML, pero sólo puede ser usado para crear vistas. De hecho las vistas que un usuario puede crear contienen una sección de agrupamiento. Bueno, lo mismo puede hacerse en forma programática, pero sólo para crear una vista, no para hacer un query. Para más información consultar http://msdn.microsoft.com/en-us/library/ms415157.aspx

El work-around

A continuación les muestro una manera de resolver el problema con un work-around. Lo considero work-around, porque es poco práctico y poco escalable, pero será útil en algunas situaciones. Consiste básicamente en realizar la consulta y luego sumar en forma manual.

Ejemplo:


SPWeb web = SPContext.Current.Web;


SPList list = web.Lists["Imputaciones"];



SPQuery query = new SPQuery();

query.ViewFields =

"<FieldRef Name='Importe_x0020_insumido'/>

<FieldRef Name='Importe_x0020_estimado'/>

<FieldRef Name='Importe'/>

<FieldRef Name='Liquidaci_x00f3_n'/>

<FieldRef Name='ContentType'/>";

query.Query =

"<Where>" +

"<Eq>" +

"<FieldRef Name='Proyecto' LookupId='TRUE'/><Value Type='Lookup'>" +

Context.Request["Proyecto"] + "</Value>" +

"</Eq>" +

"</Where>" +

"<OrderBy><FieldRef Name='Title'/></OrderBy>";



SPListItemCollection items = list.GetItems(query);



int sum_equipo_real = 0;


int sum_contra_real = 0;

(...)



foreach (SPListItem imp_item in imp_items)

{


switch (imp_item["Tipo de contenido"].ToString())

{


case
"Horas insumidas" :

if (imp_item["Importe insumido"] != null)

sum_equipo_real += Convert.ToInt32(imp_item["Importe insumido"].ToString()); break;


case
"Horas estimadas" :

if (imp_item["Importe estimado"] != null)

sum_equipo_plan += Convert.ToInt32(imp_item["Importe estimado"].ToString()); break;

(...)

}

}


label_equipo_plan.Text = string.Format("{0:c}", sum_equipo_plan);

label_equipo_real.Text = string.Format("{0:c}", sum_equipo_real);

label_equipo_porc.Text = (sum_equipo_real*100/sum_equipo_plan).ToString() + " %";

label_equipo_desv.Text = string.Format("{0:c}", sum_equipo_plan - sum_equipo_real);


(...)


Como habrán visto, es un poco "manual", pero permite salir del paso. Se aceptan sugerencias. Hasta la próxima.

lunes, 27 de julio de 2009

¿OWC 2003 en Sharepoint 2007?

Para los que no los conocen, los OWC (Office Web Components) constituyen una de las mejores maneras de explotar información que existen debido a que:
- Son componentes web
- Poseen gráficos y pivot tables
- Se pueden conectar sin programación a listas de sharepoint.
- Son dinámicos




En este artículo voy a explicar como instalarlos, ya que no vienen instalados en WSS3, pero les recomiendo que sólo los usen si tienen que migrar una vieja aplicación porque actualmente cuentan con las siguientes limitaciones importantes:

- Han sido discontinuados por Microsoft (http://blogs.msdn.com/excel/archive/2006/07/17/668544.aspx).
- Han sido creados antes que Sharepoint 2007 (en el año 2003), por lo cual pueden fallar.
- Se dejarán de usar, aunque curiosamente son parte de Project Server 2007.

Si luego de estas advertencias, insisten en usarlos, sólo tienen que seguir estos pasos:

1) Almacenar el archivo "Microsoft Office DataParts.Cab" en la carpeta"C:\Program Files\Common Files\Microsoft Shared\web server extensions\60\wppacks"

2) Ejecutar el siguiente comando:
stsadm.exe -o addwppack -filename "C:\Program Files\Common Files\Microsoft Shared\web server extensions\60\wppacks\Microsoft Office DataParts.Cab" -globalinstall
STSADM se encuentra en c:\program files\common files\microsoft shared\web server extensions\12\bin\

3) El resultado debe ser: Operation completed successfully.

4) IISRESET

5) Más información en:

http://msmvps.com/blogs/shane/archive/2006/09/02/How-to-manually-install-the-Office-Web-Parts-in-SharePoint-v3.aspx

http://support.microsoft.com/default.aspx/kb/929320/es

Una vez más, espero haber sido útil.
Nos vemos.

Cambios de estilos en sharepoint

En este breve artículo explicaré como cambiar algunos estilos en sharepoint en forma ordenada. En principio deben saber que existen muchas maneras de cambiar los estilos en sharepoint, principalmente Master pages, Themes y Hojas de estilos. En mi caso elijo hojas de estilos porque es la opción más sencilla para que los cambios apliquen a las páginas del sitio y a las application pages también. Lo mejor es no modificar las hojas de estilo existentes para evitar "romper" algo. La opción más limpia que encontré es una usar una hoja de estilo alternativa, la cual puede asignarse muy sencillamente vía programación:

1) Crear una hoja de estilos

En esta hoja de estilo sólo pondremos lo que queremos "modificar", lo cual hace más sencillo el trabajo. A continuación les muestro un ejemplo de hoja de estilo. Si tienen dudas para encontrar los estilos, les recomiendo que utilicen esta aplicación SharePoint Customizer

.ms-bannerContainer{ display:none; }

.ms-sitemapdirectional{ font-size:10pt; font-weight:bold; }

.ms-searchresultsareaseparator{ display:none; }

.ms-globalbreadcrumb{ padding:2px 10px 2px 18px; }

#ctl00_PlaceHolderGlobalNavigation_TopHelpLink { display:none; }

.ms-pagetitle { margin:15px 0px 4px 0px; }

.ms-titlearea { display:none; }

#ctl00_PlaceHolderPageTitleInTitleArea_ListTitle { display:none; }

#ctl00_PlaceHolderMain_ctl01_ctl02_UploadMultipleLink { display:none; }

.ms-quicklaunchheader { display:none;}

#ctl00_PlaceHolderLeftNavBar_idNavLinkRecycleBin { display:none; }

2) Asignar la hoja de estilo alternativa


En el siguiente paso modifican el evento que se ejecuta al activar una feature y en ese momento asigna la hoja de estilos alternativa:


public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPWeb site = SPContext.Current.Web;

site.ApplyTheme("Wheat");

site.AlternateCssUrl = "/_layouts/1033/Styles/NOBLEBASE/NB.css";

site.Update();
}

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
SPWeb site = (SPWeb)properties.Feature.Parent;
site.ApplyTheme(string.Empty);
site.AlternateCssUrl = (string.Empty);
site.Update();
}


3) Contemplar los resultados



Con estilos:







Sin estilos:





Espero que haya sido útil. Hasta la próxima.

Sharepoint 2010

No parece haber mucha información aún, pero algunos de los temas que debemos manejar para prepararnos para Sharepoint 2010 son:

Más información en:

http://sharepoint.microsoft.com/2010/Sneak_Peek/Pages/Get_Ready.aspx

Hasta la próxima...

viernes, 17 de julio de 2009

Gráficos dinámicos en sharepoint


Amigos del mundo sharepoint: supongo que como yo, habrán notado que no es tan sencillo extraer información de las listas de sharepoint y mostrarla en forma gráfica en un tablero de control. He estado investigando el tema y me he encontrado con demasiadas opciones. Hasta el momento he seleccionada una, que a continuación les presentaré. Espero que alguno de ustedes critique la opción elegida y presente alguna mejor, porque estoy en búsqueda de la luz.
La alternativa que elegí es FusionCharts Free debido a que:

  • Funciona en WSS 3. No requiere MOSS, como Excel Services.

  • No ha sido discontinuada por el fabricante, como los OWC.

  • No existe complicación para extraer datos de las listas, siempre que estemos dispuestos a escribir un spquery en CAML.

  • No requiere instalación de componentes en el cliente, asumiendo que Flash es algo típicamente instalado.

  • Es bonita. Los tableros son para los directivos y a los directivos les gusta ver gráficos bonitos.

  • Es open source (existe una versión no abierta con mayor funcionalidad)

  • Es liviana.
¿Cómo funciona?

Luego de leer el Help de la herramienta, seleccioné una de las tantas maneras que tiene de obtener datos de una fuente para generar un gráfico. La siguiente imagen esquematiza la interacción entre los distintos componentes (en la opción elegida).






Los pasos para implementar la solución son:
  1. Crear una Application Page para extraer datos de las listas de Sharepoint a través de un SPQuery.
  2. Generar como resultado de la Application Page un XML con el esquema que requieren los componentes de FusionCharts para armar el gráfico.
  3. Conectar el XML con los SWF (flash) y hacer el "render" del gráfico vía JavaScript
El resultado se puede ver parcialmente en la siguiente imagen (parcialmente porque no se ve la parte animada)









1. SP Query

Esta es una de las opciones para consultar datos de una lista en sharepoint. A continuación muestro parte del código para una lista en particular llamada "Proyectos".

SPWeb yq_web = SPContext.Current.Web;
SPList list = yq_web.Lists["Proyectos"];
SPQuery query = new SPQuery();
query.ViewFields = "<FieldRef Name='Title' /><FieldRef Name='Referencia' /><FieldRef Name='Cliente' /><FieldRef Name='Jefe_x0020_de_x0020_Proyecto' /><FieldRef Name='Estado' /><FieldRef Name='ID' /><FieldRef Name='Fecha_x0020_de_x0020_inicio' /><FieldRef Name='Fecha_x0020_prevista_x0020_final' />";
query.Query = "<Where><Eq><FieldRef Name='Estado' /><Value Type='Choice'>Activo</Value></Eq></Where>";
query.Query += "<OrderBy><FieldRef Name='Title' /><FieldRef Name='ID' /></OrderBy>";
SPListItemCollection items = list.GetItems(query);

2. XML
La siguiente porción de código muestra como recorrer la lista y generar el XML que necesitan los componentes de FusionCharts para armar un gráfico de barras apiladas en 3D.

string strXML;
strXML = "<graph xaxisname='Costos' yaxisname='Importe' hovercapbg='DEDEBE' hovercapborder='889E6D' rotateNames='0' animation='1' decimalPrecision='0' showNames='1' numberSuffix='$' >";
strXML += "<categories>";

strXML += "<category name='Contrataciones'/>";strXML += "<category name='Otros gastos'/>";strXML += "</categories>";(…)
foreach (SPListItem imp_item in imp_items){strXML += "<dataset seriesname=(…)
strXML += "</graph>";

Response.ContentType = "text/xml";
Response.Write(strXML);
3. JavaScript

Finalmente, tomamos los datos del XML y lo graficamos dentro de un DIV mediante JavaScript.


document.write("<div id='chartdiv' align='left'>The chart will appear within this DIV. This text will be replaced by the chart.</div>");
var myChart = new

FusionCharts("./FusionCharts/FCF_MSColumn3D.swf?XMLLoadingText=Cargando datos. Espere por favor...&ChartNoDataText=No existen datos para mostrar.", "myChartId", "800", "300");

myChart.setDataURL("/_layouts/ProyectoControlChart.aspx);

myChart.render("chartdiv");

Fin
Aquí termina, He simplificado el código con fines didácticos. El Help posee una muy buena referencia del XML a generar (muy sencillo) y varias opciones para llegar al objetivo. Aquí mostré la opción CAML-ASPX-XML-JAVASCRIPT, pero hay otras.
Espero que este haya sido un artículo útil. Si alguien conoce otras opciones para cumplir con este tipo de requerimientos (como FLEX), envíe comentarios por favor. Serán bienvenidos.


Hasta el próximo artículo.