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