miércoles, 3 de septiembre de 2008

Manipulando WorkFlows

Este es el segundo Post que abarca este tema.
En el primer posts Iniciar Automanticamente WorkFlow quedaron algunas dudas.
Como obtener el TemplateID de un workflow asociado a un Document Library.
Para esto haremos uso de una dll llamada Microsoft.SharePoint.dll que obviamente puede ser descargado de la pagina de microsoft.

Los parametros que usaremos seran:
urlSite: La direccion Url absoluta del site, donde estamos trabajando.
Libreria: El Nombre o GUID, de la libreria, donde estamos trabajando.

SPSite _site = new SPSite(urlSite);
SPWeb _Web = _site.OpenWeb();
String GUI = Libreria;//en formato similar a este: {68A5A98D-61AF-4BDF-B1DF-A326EA34460D}
Guid MiGUI = new Guid(GUI);
SPList _List = _Web.Lists[MiGUI];

SPWorkflowAssociationCollection MisWorkFlows=_List.WorkflowAssociations

En esta variable tenemos objetos del tipo SPWorkflowAssociation, que poseen 2 propiedades muy utiles: Name y Id, el primero obviamente si nombre lo dice, es el nombre del workflow y el segundo es el llamado TemplateID.
Pero ojo que se tendria que navegar la variable con un forech de esta manera:
Especificamente deseo conocer el TemplateID de un workflow cuyo nombre es pasado en la variable WFName="Mi WorkFlow".

string WFId="";
string WFName="MiWorkFlow";
foreach (SPWorkflowAssociation WF in _List.WorkflowAssociations)
{
if (WF.Name == WFName)
{
WFId=WF.Id.ToString();
}
}

De esta manera obtener el TemplateID de un WorkFlow, conociendo el nombre, libreria y site donde se encuentra este.

jueves, 8 de mayo de 2008

Nuevo Proyecto: Sistema de Mantenimiento y Planificacion

Disculpando la carencia de entradas de mi blog.
Este post sera para dar inicio a un nuevo proyecto: Sistema de Mantenimiento y Planificacion.
Para el desarrollo de este sistema el equipo desarrollador conformado por:
Cristhian Sifuentes
Edwin Delgado
Marco Diaz
y un cuarto integrante.
Ademas del Jefe de Proyecto
La herramientas que utilizaremos son: Infopath 2007, sharepoint 2007,SQL2005,WorkFlow fundation y Visual Studio 2005.
Los principales temas que veremos son:
Acceso a datos del Sharepoint, a traves de webservices.
Construccion de WebPart para sharepoint.
Analisis de datos Sharepoint.
WorkFlow
Bueno, sin mas que decir me retiro hasta el proximo post.

jueves, 31 de enero de 2008

Iniciar Automaticamente un WORKFLOW

Hola a todos los visitantes, ya llevo mas de un mes sin postear nada.
Pero mas vale tarde que nunca.
Ahora vamos a ver como podemos por medio de programacion arrancar un WorkFlow.
Esto nos serviria en escenarios que el WorkFlow no requera un formulario de inicializacion, o donde de alguna manera se pueda tener acceso a data para el formulario de inicializacion.
Bueno para lo que ya han leido algunos de mis post, se habran dado cuenta que yo uso los webservices propios del Sharepoint, es decir: los famosos: _vti_bin/list.asmx en este caso usaremos el _vti_bin/worklows.asmx.
Y muchos se preguntaran porque usar esto que es un poco mas dificil, menos documentado y mas laborioso, el problema es que para poder hacer el testing o debug, puesto que otros componentes como sharepoint.dll no se puede hacer debug desde otra pc que no sea el servidor, asi que mientras no encuentre una solucion a este problema, seguire usando estos webservices propios del sharepoint.
Ahora si manos a la obra:
Para poder iniciar un workflow, necesitamos cierta informacion.
Tal como:
la url del documento a que vamos a aplicar el workflow.
la estructura del formulario de inicializacion del workflow(dejemos esto como opcional)
el nombre del workFlow o su Template ID(para este ejemplo asumamos que ya conocemos este valor de no se asi, tendremos que buscar la manera de obtenerlo, cosa que lo haremos en otro post)


Hacer una referencia web al webservices _vti_bin/Workflow.asmx, de manera visual.
en codigo hacer ..... mejor vean el codigo:

SiteRaizWF.Workflow WF = null;
WF = new SiteRaizWF.Workflow();
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
CredentialCache cache = new CredentialCache();
WF.Credentials = new System.Net.NetworkCredential("user_admin", "pwd_admin", "Dominio");
WF.PreAuthenticate = true;
XmlNode _ = WF.StartWorkflow(urlNewForm, new Guid(TemplateID), xmlFormInit);


bueno esto en el general todo el codigo necesario para iniciar un work flow por medio de programacion.
Antes que me llenen la bandeja con mail preguntando que son esos paremetros
urlNewForm: es el documento del archivo que desean aplicar el workflow
TemplateID: es el ID del template del workflow asociado, asociado a un documento.
xmlFormInit: es el formulario infopath de inicializacion en XML el tipo de dato es XmlNode.
Y como demonios obtendo este famoso xmlFormInit, hay varias opciones, podemos serializar previamente nuestro formulario a clases y luego pasarlos a XML,esto permitiria llenar los datos tambien por programacion (ojo que esto es una funcionalidad muy importante y que va a sacarlos de apuros como me saco a mi :D)
La otra es tener una string con una cadena representando este esquema XML luego llenar un xmldocument con esta cadena y listo.
Bueno por la premura del caso, dejaremos este post en este punto, si tienen dudas por favor no duden en escribirme:
marcodiazjr@gmail.com
Saludos y buena programacion.
PD: este codigo es parte de un webservice, es decir podemos invocar este metodo desde cualquier lugar, tambien podria ser parte de si documento infopath o simulares.