viernes, 20 de agosto de 2010

ya tenemos academia Sharepoint !

Les dejo el link a la academia de Sharepoint http://www.uspja.com/ , esta academia creada por una iniciativa de Bjorn Thorsmaehlum oferta una serie de programas bastante interesantes para el crecimiento profesional de los que trabajábamos en la plataforma de Sharepoint.

domingo, 15 de agosto de 2010

Gestión de contenidos maestro detalle en listas de sharepoint

En algunas ocasiones se me ha presentado la necesidad en Sharepoint de manejar listas que permitan trabajar el contenido como si fuesen tablas relacionales maestro detalle ejemplo de esto son las facturas en las cuales hay un encabezado y un detalle de productos o en un banco la relación entre un cliente y sus cuentas, una forma interesante de trabajar este requerimiento es la creación de tipos de contenidos custom, la idea es crear un tipo de contenido especial el cual herede su comportamiento del tipo de contenido base Folder y asociando este nuevo contenido a una lista de SharePoint siguiendo los siguientes pasos:

1. Creación de contenidos

Ingrese a la configuración del sitio en la que se creara el nuevo tipo de contenido
y seleccione la opción content types.



A parecera una pantalla con todos los tipos de contenidos en el sitio, seleccione la opción de crear tipo de contenido.



En el siguiente formulario ingrese el nombre del tipo de contenido y seguidamente seleccione el tipo de contenido formulario como se visualiza en la siguiente imagen



En el siguiente formulario seleccione las columnas de metadatada que desea incluir en el nuevo tipo de contenido.



2. Asociación del nuevo tipo de contenido a la lista

En este punto tendremos nuestro tipo de contenido contenedor o maestro, para asociarlo a una lista, creamos una nueva y nos dirigimos a la configuración de la misma, seleccionamos la opción de configuración avanzada y marcamos la opción para permitir manejar tipos de contenido en la lista.



Una vez seleccionada esta opción adicionamos el tipo de contenido que creamos en los pasos anteriores a la lista.






En este punto tendremos asociado nuestro contenido a la lista.



El siguiente paso es crear un nuevo tipo de contenido que herede del contenido base el cual deseamos sea el detalle del contenido maestro que acabamos de crear, para esto seguiremos de nuevo todos los pasos anteriores, al final contaremos con dos tipos de contenidos que nos permitirán trabajar una figura de maestro-detalle en las listas de sharepoint, esta es solo una pequeña muestra de los que se puede lograr con el uso de tipos de contenido, espero esta entrada les sea de ayuda.

miércoles, 11 de agosto de 2010

Que se supone que debería saber un arquitecto sharepoint ?

Hola a todos les dejo un articulo que me pareció interesante escrito por Bjorn Thorsmaehlum sobre lo que se supone debería ser el role de un arquitecto sharepoint.

domingo, 8 de agosto de 2010

Cambio de la MasterPage de un sitio mediante código

Recientemente me encontré con la necesidad de cambiar todas las masterpage de los sitios y subsitios de un servidor Sharepoint en un cliente, si fuese un solo sitio o como máximo unos 10 sitios seria muy sencillo, mi problema era que el total de sitios era superior a 300 con lo cual el proceso manual quedaba descartado, para llevar acabo este requerimiento cree un proceso que leía las url de los sitios a modificar desde un archivo y mediante las siguientes lineas de código ejecutaba el cambio de MasterPage de forma automatica .. espero les sirva de ayuda.

SPSite sitio = new SPSite(urlSite);
SPWeb web = sitio.OpenWeb();
web.CustomMasterUrl = "layout/default.master";
web.MasterUrl = "layout/default.master";
web.Update();

jueves, 29 de julio de 2010

Value does not fall within the expected range !!!!!!

Este error que como lo pueden notar es muy descriptivo me ha hecho perder más de cuatro horas del día de hoy, se me presento al momento de generar de forma dinámica el contenido de un AccordionItem al cuando este se esta expandiendo pero no se preocupen que de igual forma se puede presentar en combobox y cualquier objeto que contenga una colección de objetos hijos de tipo FrameWorkElement que se desee poblar de forma dinámica, bueno regresando al origen del error este se me presentaba en el segundo evento de expansión de cualquier AccordionItem y se da por el hecho de que el árbol de elementos de silverlight no admite objetos con el mismo nombre o más de un objeto sin nombre, finalmente para solucionarlo tuve que poner un nombre dinámico compuesto por la hora actual en la cual se crea el objeto que se va adicionar en la pagina silverlight, realmente el error es ciertamente valido lo que no ayuda mucho es el mensaje del error "Value does not fall within the expected range", no sería mejor que dijese "Duplicate Object Name" o algo así ?

miércoles, 28 de julio de 2010

Debug de webparts silverlight con visual studio 2010 y Sharepoint 2010

En este post mostrare como es posible mediante visual studio 2010 ejecutar un paso a paso del código de los webparts desarrollados en Silverlight, para ello debemos:

Crear nuestro proyecto de tipo silverlight application en el cual crearemos el webpart que deseamos instalar en sharepoint, recordar que para que una aplicación silverlight obtenga acceso al contexto de datos del sitio donde se ejecuta, es decir para que desde nuestro webpart silverlight podamos tener acceso a las listas y sitios debemos adicionar la siguientes lineas en el metodo Application_StartUp del archivo App.Xaml.cs.



Creamos un proyecto de tipo Blank Sharepoint Project.



3. Creamos un modulo al interior de nuestro proyecto sharepoint, basicamente los modulos nos permiten copiar archivos en nuestros sitios al momento de la activación de la solucion que lo contiene, en nuestro caso usaremos un modulo para copiar en una libreria de sharepoint el archivo xap que es lo que resulta de compilar el proyecto de silverlight creado en el punto 1, esto nos permitira al momento de activar la solución desde visual studio atacharnos de forma automatica al proceso de W3P y en consecuencia poder hacer un paso a paso de lo que sucede en nuestro webpart silverlight, para ello seguir los pasos descritos a continuación.

Crear el objeto modulo al interior del proyecto sharpoint creado en el punto anterior.



Eliminar el archivo de prueba que se crea en el modulo por defecto.

Adicionar una referencia desde el modulo al proyecto silverlight que creamos en el punto 1, para ello nos vamos a las propiedades del modulo y seleccionamos la opción proyect output references.



En la ventana de propiedades que se despliega seleccionamos la opción adicionar y seguidamente seleccionamos el proyecto de silverlight que contiene la webpart desarrollada en la propiedad project name y en la opción deployment type element file.



Ingresamos las siguientes lineas en el archivo Elements.xml



Este archivo contiene los archivos que deseamos incluir en nuestro sitio de sharepoint al momento de la instalación de una caracteristica, solución o webpart es muy util ya que mediante el podriamos subir hojas de estilos o archivos necesarios para el funcionamiento de nuestros aplicativos en sharepoint en nuestro caso lo utilizaremos para subir el archivo xap a una libreria de sharepoint y atacharnos automaticamente al proceso de sharepoint al momento de instalar la solución desde visual studio 2010, como pueden ver el tag module contiene una propiedad llamada url, esta propiedad contiene el nombre de la libreria de sharepoint en la cual vamos a hospedar el archivo xap generado por el proyecto de silverlight al momento de su compilacion, la propiedad path debe contener el nombre del modulo seguido del nombre del archivo xap y la propiedad url del tag file debe contener el nombre con el que quedara el archivo cuando sea copiado a la libreria de sharepoint.

Por ultimo debemos activar en el proyecto de sharepoint el debug para aplicaciones silverlight esto lo hacemos dirigiendonos a las propiedades del proyecto de sharepoint al tag que dice sharepoint y marcando el check que dice enable silverlight debuging.



Con esta configuración podremos llevar acabo un paso a paso de nuestras aplicaciones desarrolladas en silverlight para sharepoint, bastaria con ejecutar el proyecto sharepoint una vez lo hacemos visual studio publica el archivo xap del proyecto silverlight en la libreria que definimos en el archivo Elements.xml y nos abre un browser con nuestro sitio sharepoint en este browser podremos adicionar un webpart de tipo silverlight y referenciar desde este el archivo xap que visual studio publico en la libreria, al usar la webpart de silverlight y marcar puntos de interrupción en nuestro codigo de visual studio podremos hacer seguimiento a la ejecución de nuestra webpart.

lunes, 12 de julio de 2010

Silverlight + Sharepoint 2010 + Listas

En esta entrada voy a mostrar como se obtiene una lista dado su nombre en Sharepoint 2010 utilizando silverlight y el nuevo modelo de objetos cliente, me ha resultado bastante interesante la facilidad con la que se pueden crear webparts y aplicaciones para Sharepoint 2010 con silverlight.
Lo primero que se debe tener en cuenta es que las aplicaciones de silverlight que deseen interactuar contra listas y cualquier objeto del modelo de objetos de sharepoint lo deben hacer o mediante la dll Microsoft.Sharepoint.Client.Silverlight o mediante servicios WCF+RIA, ya que no es posible utilizar la dll Microsoft.Sharepoint que se usaba en Mosss2007 con aplicaciones silverlight.
Para trabajar con silverlight en Sharepoint:

1. Crear un proyecto de tipo Silverlight Application y referenciar la dll Microsoft.Sharepoint.Client.Silverlight que se encuentra ubicada en %ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\ClientBin.

2. Incluir los namespaces Microsoft.Sharepoint.Client.Silverlight y Microsoft.Sharepoint.Client.Silverlight.Runtime en los archivos que contendrán clases que harán referencia al modelo de objetos de Sharepoint.

3. Incluir la siguiente linea de código en el método Application_Startup de nuestra solución "ApplicationContext.Init(e.InitParams,SyncronizationContext.Current)", antes de la linea "this.RootVisual = new MainPage()", esto nos permitirá hacer referencia a los parametros que se envian desde sharepoint a nuestra aplicación silverlight al momento de ser instanciada.

4. A continuación hacemos referencia a nuestro sitio y listas mediante los objetos que nos proporciona el namespace Microsoft.Sharepoint.Client.Silverlight:

Web _web = null;
List _lista = null;

ClientContext context = new ClientContext(ApplicationContext.Current.Url);
_web = context.Web;
_lista = _web.Lists.GetByTitle("MyList");
context.Load(_lista);
context.ExecuteQueryAsync(OnSuccedQuery,null);

5. Los llamados al modelo de objetos de Sharepont 2010 para silverlight se ejecutan de forma asincronica, para los que alguna vez trabajaron con php, ajax y el objeto XmlHttpRequest, es la misma figura se ejecuta una consulta asincronica y se espera la respuesta de la consulta en un metodo en nuestro caso el método se llama OnsuccedQuery.

void OnsuccedQuery(object sender, ClientRequestSucceededEventArgs args)
{
Dispatcher.BeginInvoke(() =>
{
MessageBox.Show(_lista.Id);
});
}

Solo en este método podemos hacer referencia a los atributos y los métodos del objeto _lista ya que es solo después de que se ejecuta el llamado asincronico que este objeto se carga, notese que si antes del llamado al método ExecuteQueryAsync trataramos de obtener el nombre de la lista mediante _lista.Name, obtendriamos un error durante la ejecución ya que en ese punto el objeto _lista es nulo.

6. Finalmente para la instalación en sharepoint se debe crear una librería de documentos en Sharepoint y subir el archivo .XAP que obtenemos al compilar nuestra solución silverlight, una vez publicado nuestro XAP procedemos a usar la nueva webpart de Sharepoint 2010 que nos permite visualizar aplicaciones Silverlight la ponemos en la pagina que deseemos y le configuramos la url del archivo xap que subimos previamente a la librería y tendremos nuestro webpart silverlight en nuestros sitios de Sharepoint 2010.

viernes, 9 de julio de 2010

Webparts + Shrepoint 2010 + Visual Studio 2010

Hace un par de meses he tenido un par de requerimientos en los cuales he tenido que migrar una serie de webparts de MOSSS 2007 a Sharepoint 2010, para lo cual he utilizado como entorno de trabajo visual studio 2010 y he de decir que me encontrado con una gran cantidad de mejoras en lo que se relaciona a desarrollo con Sharepoint, esta nueva versión a incluido plantillas para la creación de Features las cuales traen toda la estructura necesaria para desarrollar caracteristicas de una forma amigable algunas de las mejoras que he podido apreciar son las siguientes:

- Mapeo directo a nuestra solución de carpetas como Templates,Layouts y controltemplates las cuales permiten facílmente ubicar archivos como controles ascx en sitios visible desde cualquier pagina en un sitio de sharepoint.

- Ahora mediante las opciones deploy y retract adicionadas en el menu contextual del proyecto instalar o desintalar nuestras features o webparts desde visual studio 2010.

- Es posible en esta nueva versión hacer debug de los webparts sin necesidad de attacharse al proceso de Sharepoint, simplemente con la ejecución del proyecto se hace posible hacer un paso a paso de la ejecución de los webparts.

- La inclusión de codigo administrado para la subscripción a los eventos activacion, deploy y desactivacion de las caracteristicas se logra mediante simple clic derecho sobre la caracteristica en la solucion y luego la selección de la opción de adicionar receptor de evento, obviando la necesidad de tener que crear ensamblados aparte !

Estas son algunas de las mejoras que he podido encontrar en esta nueva versión Sharepoint no he nombrado la facilidad queda para el desarrollo de webparts con Silverlight esto lo haré en el siguiente post, les dejo la primera webpart que migre de 2007 a 2010 es una sencilla pero muy util webpart que permite graficar las respuestas en una encuesta previamente configurada la puedes descargar en el siguiente link, hasta una próxima oportunidad

domingo, 18 de abril de 2010

Envio de correo electronico usando el modelo de objetos de sharepoint

Esto me ha resultado de gran ayuda al momento de construir webparts y flujos de trabajo para sharepoint ya que el envio de notificaciones es una tarea repetitiva en el desarrollo en sharepoint, bueno basicamente lo que usa para el envio de correos es el objeto SPUtility que se encuentra en Microsoft.Sharepoint.Utilities la verdad es bastante simple su uso:

SPUtility.SendEmail(myWeb, false, false, user.emailDestino, Subject, Cuerpo);

myWeb es un objeto de tipo SPWeb el cual puede obtenerse desde el objeto SPSite.

Lectura dinamica de atributos usando reflection

Hace algún tiempo me encontre con la necesidad de leer todos los valores de los atributos de un tipo de dato proporcionado por un tercero y validar si todos tenian algo de data o estaban en null aparentemente esto no plantea ningun problema me valdria la siguiente instrucción para leer cada atributo de clase:

object valor = tipo.atributo;

una vez hecho esto para cada atributo validar si era o no nulo y en dependencia de esto ejecutar alguna acción, bueno hasta ahi todo estaba bien hasta que me di cuenta que el tercero a futuro podría agregar nuevos atributos al tipo, es decir que tendría que leer de forma dinamica los atributos, es aquí donde aparece la magia de reflection, esta clase nos permite leer las entrañas de cualquier tipo de dato de forma dinamica e incluso crear instancias de forma dinamica, en fin el siguiente código me permitio iterar sobre los atributos del tipo sin conocer cuantos ni cuales eran los nombres de los mismos.

//Obteniendo el objeto a leer desde un metodo

FundSig sigFunds = this.GetSigFunds(strProduct, strIdFund);

//Obteniendo todas las propiedades del tipo del objeto obtenido en la linea anterior

PropertyInfo[] properties = sigFunds.GetType().GetProperties();

//Iterando sobre las propiedades obtenidas

foreach (PropertyInfo info in properties)
{

//Obteniendo el valor de cada atributo en el objeto obtenido en el primer punto

if (sigFunds.GetType().GetProperty(info.Name).GetValue(sigFunds, null) == null)
{
return false;
}
}

Esto es solo una pequeña aplicación de lo que se puede hacer con reflection, espero les sea de ayuda !

sábado, 10 de abril de 2010

Concurrencia en formularios infopath web forms

Recientemente me tope con un problema de concurrencia que presentan los formularios de infopath cuando se publican en sharepoint mediante form services, este problema se presenta cada vez que más de un usuario trata de modificar alguno de los campos promovidos desde el formulario hacia la lista de sharepoint en la cual se ha activado el formulario, ya que el contenido xml del formulario es descargado al browser cada vez que un usuario hace un llamado al mismo, si dos usuarios descargan el formulario al tiempo y modifican alguno de los campos promovidos al momento de guardar el formulario este queda con los cambios efectuados por el ultimo usuario que haya hecho submit hacia la lista. Para solucionar este inconveniente cree una clase que permite bloquear el formulario cada vez que un usuario va ha ejecutar alguna actualización sobre el mismo, basicamente el procedimiento a seguir es el siguiente.

1. Validar si el formulario esta siendo modificado.
2. Si no lo esta hacer checkout sobre el formulario para evitar que otros lo puedan modificar.
3. Ejecutar las operaciones de actualización sobre el formulario y guardar los cambios.
4. Hacer check-in del formulario para permitir que otros usuarios lo puedan actualizar.

Parte del código implementado para esta solución aparece a continuación, si desean ver la solución completa me envían un mail.

Antes de ejecutar los pasos mencionados se debe obtener el objeto spitem que apunta al item de la libreria al cual esta asociado el formulario que vamos a modificar mediante el uso de los objetos SPSite, SPWeb y SPList.

//Codigo que permite bloquear el formulario

mySite.AllowUnsafeUpdates = true;
myWeb.AllowUnsafeUpdate = true;
if (!(MyItem.File.CheckOutStatus == SPFile.SPCheckOutStatus.None))
{

MyItem.File.CheckOut();

}

//Codigo que permite desbloquear el formulario

MyItem.File.Checkin("Comentario");


Algo en lo cual se debe pensar es que se va hacer si llega un usuario a modificar el formulario y lo encuentra bloqueado por otro ... aquí básicamente se pueden hacer dos cosas una es simplemente mostrarle un mensaje al usuario diciendo que no puede modificar el formulario por otro usuario lo tiene bloqueado esta seria la salida más fácil, la segunda salida sería ir encolando las solicitudes y una vez un usuario termina de actualizar el formulario lo va tomando el siguiente en la fila, buena esta implementación espero publicarla más adelante ... si alguien se ha topado con este problema y ha encontrado una solución interesante diferente a la que expongo, le agradecería la comentara