jueves, 25 de febrero de 2010

Tabla de Mejores Prácticas de codificación del Modelo de Objetos de SharePoint 2007

Resumiendo varias referencias en la red de las mejores prácticas elaboré la siguiente tabla para referencia de los desarrolladores en SharePoint.

Aclaración:

Esta es una guía rápida de referencia.  Si no ha desarrollado con el modelo de objetos de SharePoint le será difícil comprenderlo al inicio.  Le recomiendo lea las referencias y experimente con el modelo de objetos primero.

Mala u Obsoleta Práctica Práctica Recomendada Breve Explicación
SPControl.GetContextSite(context)      SPContext.Current.Site

Para  compatibilidad con versiones anteriores WSS V2.0

SPControl.GetContextWeb(context)    SPContext.Current.Web

Para  compatibilidad con versiones anteriores WSS V2.0

SPList.Items.Count

SPList.ItemsCount

Cargará toda la lista de elementos. En vez de ello utilice la propiedad.

SPList.Items[Guid]

SPList.GetItemByUniqueId(Guid)

Cargará toda la lista de elementos. En de Vez obtendrá el elemento que esta buscando.

SPList.Items[Int32]

SPList.GetItemById(Int32)

Cargará toda la lista de elementos. En de Vez obtendrá el elemento que esta buscando.

SPList.Items.GetItemById(Int32)

SPList.GetItemById(Int32)

Cargará toda la lista de elementos. En de Vez obtendrá el elemento que esta buscando.

for(idx){

SPList.Items[idx]

}

SPListItemCollection oListItems = oList.Items;

for(idx){

oListItems[idx]

}

En el for loop carga los elementos una y otra vez. En vez de ello declare SPListItemCollection y carge solo una vez.
SPWeb.Lists [string] SPWeb.GetList(string) Carga toda las listas del sitio. En vez de ello Obtenga la lista especifica.

SPQuery oQuery = new SPQuery();

SPQuery oQuery = new SPQuery();

oQuery.RowLimit = 2000;

Especifique siempre el limite de filas a retornar.  En vez de obtener una lista de quien sabe cuantos elementos.
SPContext.Current.Site NO EXPLICIT DISPOSE REQUIRED
SPContext.Current.Web NO EXPLICIT DISPOSE REQUIRED
new SPSite(url) using(SPSite s = new SPSite(url)){} Utilice Using para hacer el Dispose
SPSite.OpenWeb() using(SPWeb w = s.OpenWeb()){} Utilice Using para hacer el Dispose
foreach(SPWeb w = SPSite.AllWebs){} foreach(SPWeb w = SPSite.AllWebs){
try{}
finally{
if(w != null)w.Dispose();
}
}
Utilice try finally para hacer el Dispose Explicito.
SPSite.RootWeb NO EXPLICIT DISPOSE REQUIRED
SPWeb.ParentWeb NO EXPLICIT DISPOSE REQUIRED
SPWeb nuevo = SPWeb.Webs.Add(); using(SPWeb nuevo = SPWeb.Webs.Add())
{ …}
Utilice Using para hacer el Dispose
foreach(SPWeb w = SPSite.Webs){} foreach(SPWeb w = SPSite.Webs){
try{}
finally{
if(w != null)w.Dispose();
}
}
Utilice try finally para hacer el Dispose Explicito.

Code4Fun!,

Manolo Herrera

Referencias en la Web:

http://blogs.devhorizon.com/blogs/reza_on_blogging/archive/2006/07/16/414.aspx

http://msdn.microsoft.com/en-us/library/aa973248.aspx

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.spcontrol.aspx

http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-2007-and-wss-3-0-dispose-patterns-by-example.aspx

http://blogs.msdn.com/sowmyancs/archive/2008/10/26/best-practices-sharepoint-object-model-for-performance-tuning.aspx

viernes, 19 de febrero de 2010

Optimizando Código: Sabía Ud. que si tiene el Id del Sitio puede accederlo directamente gracias al Modelo de Objetos de SharePoint

Aclaraciones:

El código esta escrito en C# y es para el modelo de objetos de SharePoint 2007.

Es necesario tener alguna básica pero fundamental experiencia escribiendo código para el modelo de objetos de SharePoint para comprender el código.

Recientemente me toco revisar código con el objetivo de optimizarlo y me encontré con ese segmento:

//Como referencia: reunionesWeb es del tipo SPWeb

foreach(SPWeb temp in reunionesWeb.Webs){
               if(temp.ID.Equals(new Guid(ReuWebGuid))){
                   //lblError.Text += "Encontré la Reunión! <br>";
                   reuWebSelected = temp;
               }
           }

Porque hacer esto si podemos hacer lo siguiente:

using (SPWeb reuWebSelected = reunionesWeb.Site.OpenWeb(new Guid(ReuWebGuid)))
{
                      EjecuteCodigoNecesario(reuWebSelected);
}

En vez de recorrer toda la lista de sitios accedemos el mismo por su ID.  Además debemos de ocuparnos del objeto SPWeb que aunque esta dentro del código manejado hay partes que accede haciendo invocaciones a componentes COM + que están fuera del Garbage Collector y por tanto necesitamos indicarle que destruya el objeto en memoria luego  utilizarlo para ello es el using.

Para los mas entendidos reunionesWeb y el Site de reunionesWeb también están en el código optimizado dentro de bloques using para que sean destruidos cuando ya no sean necesarios.

Estaré escribiendo una serie de artículos sobre el tema de optimización de código en SharePoint y las mejores practicas.

Code4Fun!,

Manolo Herrera

jueves, 18 de febrero de 2010

No puede importar una hoja de Excel hacia una lista de SharePoint

Prerrequisitos:

  • Debe de tener instalado Microsoft Office 2003 o 2007.
  • Debe de tener un usuario en SharePoint que tenga permisos para crear listas.

 

Si le sucede este problema.   Aquí puede encontrar la solución:

http://blog.techgalaxy.net/archives/871

Si no encuentra el archivo EXPTOOWS.XLA, puede encontrarlo en esta ruta:

C:\Program Files\Microsoft Web Designer Tools\Office12\1033

Básicamente debe de reemplazar la línea:

lVer = Application.SharePointVersion(URL)

Por

IVer = 2

Guardar el cambio y listo, continuar con la importación.  Si tiene alguna duda como realizarla sigua los siguientes pasos:

  1. Site Actions
  2. Create
  3. Import SpreadSheets
  4. Name (Escriba el nombre de la lista a importar)
  5. Descripción (Lo dejo a su juicio)
  6. Browse (Ubique el archivo)
  7. Leventará una ventana de dialogo donde le solicita seleccione el Rango (Haga clic en el dropdown y le mostrará los disponibles)
  8. Haga clic sobre Import
  9. Levantará una ventana de dialogo para que se autentique. Escriba sus credenciales y listo.

image

Bueno porque repetir el artículo.  Para darle mis impresiones y para evidenciar que probé la solución y me funcionó!.

Hasta la próxima!,

Manolo Herrera

viernes, 12 de febrero de 2010

Comparando procedimiento de creación de Elementos Web Visuales en SharePoint 2007 versus 2010 Parte I

En esta primera parte veremos como se hace en SharePoint 2007 un proceso un tanto manual y en la segunda parte como ha sido automatizado en 2010.

En SharePoint 2010 para ello necesitamos incorporar un control de usuario de las plantillas de una aplicación Web de ASP.Net dentro de la plantilla de solución de SharePoint que no incluye esta clase de plantilla de  elemento dentro de Visual Studio. 

Pero no se preocupe cree una solución Application Web ASP.Net y cree un control de usuario luego copie los 3 archivos de control de usuario la extensión ascx que es donde esta las declaraciones html y Asp.Net, el código de servidor o code behind que si es C# es ascx.cs y las declaraciones correspondientes de los controles dibujados en el archivo ascx es un archivo con extensión ascx.desginer.

Para este ejemplo utilizaré WSPBuldier para crear la solución WSP. Para bajar este programa que se instala en Visual Studio y que es bien liviano vaya a la siguiente dirección:

http://www.codeplex.com/wspbuilder

Luego de instalado WSPBuilder deberá crear un proyecto WSPBuilder como se muestra en la imagen de abajo:

image

Luego sobre el proyecto clic derecho New Item y seleccione Web Part Feature:

image

Le preguntará el nombre, la descripción y el alcance.  Para este ejemplo seleccione el predeterminado Web.  Como se muestra la imagen de abajo:

image

Luego deberá copiar los archivos generados del control de usuario que en WSPBuilder debemos de crear la estructura tal y como quedará instalada en el hive de SharePoint (como se muestra en la siguiente imagen)

Representa la Estructura Real Directorios

debería quedar algo como esto:

12\TEMPLATE\CONTROLTEMPLATES

Dentro del archivo ascx deberá agregar la declaración del ensamblado del proyecto al que pertenece el web part donde copio el control de usuario.   Vea la imagen de abajo.

PrimeraLineaUserControl 

Para obtener esta información puede utilizar Reflector para ver la información del ensamblado generado por Visual Studio.  Puede bajarlo en esta dirección:

http://www.red-gate.com/products/reflector/

Dentro del código WebPart en el directorio WebPartCode deberá declarar el control de usuario para que lo incluya al momento de crear en memoria el WebPart funciona como un patrón de diseño llamado Proxy.

DentroDelWebPart

Eso es todo lo dejo con la imagen de la solución del explorador:

SolutionExplorer

Y con el resultado final del WebPart Visual:Resultado Final

En este artículo vimos el procedimiento para crear un WebPart Visual un proceso manual y tedioso (pero funcional) en la parte II veremos como esto es automatizado en SharePoint 2010.

Hasta pronto!,

Manolo Herrera

Como obtener el código del idioma de un sitio en SharePoint a través del Object Model

Es importante conocer el idioma en que esta creado el sitio porque de ello dependerá los nombres de las listas y columnas estándar.  Por ejemplo las columnas predeterminadas  de las listas cambian según el idioma instalado de SharePoint, en inglés es Title en español es Título.  Para una lista de tareas la lista en la versión en inglés se llama Tasks y sus columnas son Description, Assigned To, Status, Created By y para la versión en español son Tareas, y sus columnas Descripción, Asignado a, Estado, Creado por. 

Por lo tanto si se va instalar una solución para ambas versiones deberá verificarse la versión en la que se esta instalando.  Por ello es útil conocer como hacerlo a través del API de SharePoint u Object Model.  Esto se puede hacer con la siguiente línea de código

SPControl.GetContextWeb(HttpContext.Current).Language

Esta a nivel de Sitio y la propiedad Languague del objeto SPWeb devuelve un entero sin signo “uint”. Que es el código local del lenguaje para Español(España) según la documentación de MSDN SharePoint es 3082 (o según la localización de Microsoft Windows es Spanish (International Sort) – Ver siguiente enlace: http://www.science.co.il/language/Locale-Codes.asp?s=hexadecimal)y para inglés es 1033.  Para un detalle de todos los idiomas que soporta SharePoint visite el sitio de MSDN en la siguiente dirección:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.splocale.lcid.aspx

Para ver el detalle de la propiedad Languague de SPWeb vaya a la siguiente dirección:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spweb.language.aspx

Nota: No se confunda con la tabla de este segundo enlace que da otros códigos, utilice la de primera, créame ya lo comprobé con el código y obedece al primer enlace y no al segundo.

Hasta la próxima amigos!,

Manolo Herrera