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

2 comentarios:

  1. Estimado,

    Me ocurre el mismo problema, me puedes dar apoyo por favor.

    No quiero que el usuario tenga que desproteger y proteger el documento, la idea es que se vaya controlando en el formulario infopath.

    Espero tus respuestas a la brevedad.

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar