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

sábado, 30 de enero de 2010

Windows Server 2008 R2 es sinónimo de 64 bits y SharePoint Server 2007 solo puede ser instalado incluyendo el SP2

Pareciera que SharePoint 2010 que solo corre en 64 bits nos hizo descubrir que SharePoint corre mejor en 64 bits.  Últimamente me ha tocado hacer instalaciones en 64 bits todavía con las versiones 2007 SharePoint y Project Server.  Y realmente hay una mejora en el rendimiento de dichas instalaciones.

Ahora para instalar SharePoint Server 2007 en Windows Server  2008 R2 o en Windows Server 2008 Service Pack 2.0. Necesitamos preparar los bits de SharePoint 2007 o descargar la versión que ya esta preparada.

Si quiere descargar SharePoint Server 2007 incluyendo el SP 2.0. Versión en Español hágalo en la siguiente dirección:

http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=3015fde4-85f6-4cbc-812d-55701fbfb563

Nota: No se preocupe par la versión de prueba.  Recuerde que la versión original es sin SP 2.0.  Microsoft quiere dejar eso en claro nada mas.

O Sino puede usted mismo crear su versión slipstream.  En mi caso así lo hizo por cuestión de ancho de banda y porque solo me faltaba bajar el SP 2.0 en español de Server y Services, al rededor de 350 MB. en vez de 511MB. del enlace anterior.

Para seguir las instrucciones visite el blog del equipo de SharePoint.

http://blogs.msdn.com/sharepoint/archive/2009/10/02/install-sharepoint-server-2007-on-windows-server-2008-r2.aspxhttp://blogs.msdn.com/sharepoint/archive/2009/10/02/install-sharepoint-server-2007-on-windows-server-2008-r2.aspx

Los dejo con los enlaces, disfruten la espera con un buen café de Guatemala ;).

Hasta la próxima!,

Manolo Herrera

miércoles, 6 de enero de 2010

Instalando Project Server 2007 sobre Windows Server 2008 R2

A manera de resumen indicando los puntos vulnerables o importantes en el proceso de la instalación describiré el procedimiento para instalarlo.

Fundamentalmente el mismo procedimiento que se utiliza para instalarlo sobre Windows Server 2003 de 32 bits pero con algunas variantes por la versión reciente del sistema operativo comparado con la versión de Project Server 2007 cuando salió al mercado.

Para continuar con los pasos de instalación debe de tener experiencia mínima configurando Roles y Features en Windows Server 2008 y experiencia en instalación de SQL Server y Project Server 2007, de lo contrario será muy difícil (aunque no imposible) para usted amigo lector seguir los pasos que se presentan de forma resumida.

Configuración

Primero lo primero describamos la configuración física o del hardware:

Sobre una laptop de 4GB de RAM Hp 6710b con un procesador Core 2 Duo de 2 Ghz y un disco duro de 500Gb de 7200 rpm, corriendo Windows 7 Ultimate de 64 bits.  En una máquina virtual de VMWare Workstation 7.0.0 build-203739.  Asigne una memoria de 1.5GB de RAM y un disco de 40 GB de RAM.

Deberá contar con una cuenta de dominio de Windows con permisos de administrador local en la máquina donde hará las instalaciones si su caso es como el mío que es para efectos de prueba y no de producción requerirá instalar el Active Directory de Window Server 2008 no recomendado para ambientes productivos. Para ello vaya a Server Manager y seleccione el Role Active Directory Domain Services, siga el asistente para configurarlo y reinicie el servidor.

 

Instalación de Windows Server 2008R2

Lo primero fue instalar obviamente el Sistema Operativo Windows Server 2008 R2 Standard English Version (Para los que no sepan esa versión solo corre en 64bits). 

Tip: Por motivos de soporte con Microsoft instalen el producto en inglés para que no tengan la barrera del idioma para ayudarlos en los foros de soporte de Microsoft.

Segundo activar el Windows Update por medio del Server Manager de WS2008 para que actualizará drivers y hot fixes del sistema operativo.  Abajo listado de actualizaciones:

image

Luego deberá instalar el Net Framework 3.5 SP1 que se encuentra dentro del Server Manager en la sección de Features ya que es un prerrequisito para SQL Server 2008.  Para mas información puede ver en: http://technet.microsoft.com/en-us/library/ms143506.aspx.

 

Instalación de SQL Server 2008

Luego preparar la media para instalar SQL Server 2008 Standard y sugiero incluyan el Service Pack 1.0 de una vez en la instalación inicial para evitar el mensaje de error que da al inicio por instalarlo sobre WS2008 R2 para ello sigan el siguiente procedimiento:

http://support.microsoft.com/kb/955392

Específicamente en al sección que dice:

Procedure 2: Create a merged drop:

Recuerde bajar el Service Pack de 64 bits English Version.

Deberán instalar el producto completo ya que se requiere de Analisys Services, Integration Services y Reporting Services para una instalación típica de Project Sever 2007.  Para mayor información visite: http://technet.microsoft.com/en-us/library/cc197379.aspx.

Instalación de Project Server 2007

Luego deberá instalar el Internet Information Services de Windows Server 2008 que es un prerrequisito de Project Server 2007.  Siga este enlace:

http://technet.microsoft.com/en-us/library/cc531331.aspx

Luego de finalizar con éxito la instalación deberemos preparar la media para Project Server 2007 para incluir el Service Pack 2.0 dentro de la instalación para ello sigua el siguiente procedimiento:

http://technet.microsoft.com/en-us/library/cc261890.aspx

Solo reemplace los valores de x86 por x64 y recuerde bajar el Service pack de 64 bits.

Luego haga la instalación Avanzada y Completa Indicando el nombre del servidor y la cuenta de dominio de Windows con permisos de administrador local.

Al finalizar de instalar los bits de Project Server.  Le indicará que va abrir el Asitente de Configuración de SharePoint Products and Tecnologies allí indíquele que es una nueva granja de servidores (Farm) y tenga paciencia a que se completen los 9 pasos de la instalación del Central Administration de SharePoint.  Cuando termine, lo llevará al  Central Administration.

Configuración de Project Server 2007

Dentro de Central Administration asegúrese que los los servicios de Búsqueda y el Project Application estén levantados.  Como se muestra abajo en la imagen:

image

Y luego crea una Aplicación en el puerto 80 y crea un sitio de colección (Team Site, estará bien) es para hospedar el Project Web Access.  Luego cree una segunda Web App sin crear el sitio de colección donde hospedará el SSP donde se crea la instancia de Project Application. Cree el SSP asigne la Web Application que de ultimo creo, luego en la creación del PWA asegúrese de haber seleccionado la Web App del puerto 80 donde va a crear el PWA.  Espere un momento a que le indique el mensaje Data bases provisioned, luego abra la aplicación para asegurar que todo va sobre ruedas.

Configuración de los Cubos de Project Server 2007

Ahora es hora para configurar el funcionamiento de los cubos de Project Server para ello sigua la siguiente guía:

http://technet.microsoft.com/en-us/library/dd285466.aspx

Realice cautelosamente cada paso sin pasar el mas mínimo detalle verifique las cuentas que esta utilizando para que no tenga problema. Configure un cubo y créelo espera para ver que no le indique ningún error.  Si no inicia revise la cola de trabajos de PS en Manage Queue y si tiene en espera reinicie el servicio Microsoft Office Project Server Queue.  Esto debería ejecutar los trabajos de la cola. 

Publicación de un proyecto dummy

Por ultimo la prueba mas importante y crítica publique un Project Dummy para ello necesitará instalar Project Professional 2007 y le recomiendo instale el último Service Pack (Por ahora el 2.0).  Configure el Project Professional para que se conecte a la instancia PWA. Y luego guarde y publique un Proyecto con el recurso administrador por lo menos.  Vaya al Navegador ejecute el PWA y seleccione la opción Project Center le pedirá que instale los Activex Control, coloque el sitio como un sitio seguro y configure el funcionamiento de los Activex Control en el IE.

Si no le muestra ningún proyecto y le indica un problema de permisos muy probablemente tenga el mismo problema que me sucedió a mí favor vea este artículo:

http://jmhogua.blogspot.com/2010/01/error-project-center-cannot-access.html

Si ya puede ver el proyecto, felicitaciones amigo hemos llegado al final de la configuración de las funciones básicas de Project Server 2007. 

Hasta la próxima,

Manolo Herrera