Archive

Posts Tagged ‘SharePoint 2010; Workflow; Visual Studio 2010; State Machine’

WorkFlow State Machine no SharePoint 2010

September 29, 2010 7 comments

Overview

Podemos desenvolver alguns tipos de WorkFlows no SharePoint 2010 para listas, e agora, também para sites. O WorkFlow pode ser Sequential (Sequencial) ou State-Machine (baseado em um “estado”).

Um Sequential WorkFlow pode ser facilmente criado usando o SharePoint Designer 2010, e é bem utilizado por ser muito simples e rápido de contruí-lo.

Informações adicionais de como contruir um WorkFlow via SharePoint Designer: http://office.microsoft.com/en-us/sharepoint-designer-help/create-a-workflow-HA010100591.aspx.

Neste artigo irei abordar a contrução de um WorkFlow State-Machine para SharePoint 2010 usando Visual Studio 2010. Em muitos casos, um WorkFlow simples, sequencial, não consegue atender a necessidade do cenário desejado.

Por exemplo, imaginem uma estrutura de Aprovação de Documentos, onde teremos que basear o WorkFlow em um “estado” de aprovação como: InProgress, Revisão e Finalizado. Sendo que, o documento só passará para o Status Finalizado quando for aprovado na Revisão. Caso seja reprovado, deve voltar para InProgress, assim por diante.

Usando um WorkFlow sequêncial não conseguiríamos alcançar este feito de uma forma legal. Seria possível construir “workarounds” para atender o cenário. Mas, já temos um template de WorkFlow que atende perfeitamente esta causa, por que não utilizá-lo?

Vamos então ao WorkFlow State-Machine!

Solução

Para essa solução vou trabalhar com os seguintes produtos e tecnologias:

· Windows 7 Enterprise;

· SharePoint 2010 Foundation;

· SQL Server 2008;

· Visual Studio 2010 Ultimate.

Hoje na web, é difícil encontrar informações simples de como criar um WorkFlow State-Machine para SharePoint 2010 usando Visual Studio 2010. Por este motivo, resolvi escrever este artigo com o exemplo simples.

1. Criando um projeto de WorkFlow State-Machine no Visual Studio 2010

1.1. Abra o Visual Studio 2010, clique em New > Project;

image

1.2. Na tela de seleção de Templates, escolha a linguagem (no meu caso, usarei C#), então vá até SharePoint > 2010 e escolha State Machine WorkFlow;

1.3. Em Name dê o nome para o seu projeto (“WorkFlowDemo”) e então clica em OK;

image

1.4. No wizard “Specify the site and security level for debugging” especifique o site que iremos trabalhar e clique em Next;

image

1.5. No próximo wizard altere o nome, se necessário. No meu caso, vou alterar para “WorkflowDemo – ApprovalProcess” e mantenha o tipo do WorkFlow em “List WorkFlow”, em seguida, clique em Next;

image

1.6. No próximo wizard mantenha as configurações para associar automaticamente o WorkFlow à lista/biblioteca selecionada. Se preferir, altere a lista ou biblioteca que deseja associar o WorkFlow, e clique em Next;

image

1.7. No próximo wizard podemos especificar as condições em que o WorkFlow irá iniciar. Podemos deixar os valores padrões e clique em Finish.

image

Criamos nosso projeto de WorkFlow State-Machine, agora vamos aos passos que iremos desempenhar nossa atividade de Aprovação de Documentos.

2. Criando o WorkFlow State-Machine

2.1. Ao concluir a criação do projeto, o Visual Studio 2010 nos mostra o Workflow1.cs[Design] com uma ilustração inicial do nosso WorkFlow.

image

2.2. Agora, em Toolbox, iremos adicionar alguns “estados” para o nosso Workflow. Para isso clique e arraste três State para o nosso Workflow. Ficando assim:

image

2.3. Vamos renomear nossos State para: InicialState, StateInProgress, StateRevisao e StateFinalizado.

image

2.4. Vamos designar nosso InitialState e CompletedState. Para isso, clique com o botão direito em cima de InitialSate e selecione Set as Initial State. Faça o mesmo para stateFinalizado, mas agora selecionando Set as Completed State.

image

image

2.5. Agora clique duas vezes em eventDrivenActivity1, dentro de InitialState.

2.6. Vamos fazer com que ao iniciar o WorkFlow, o “estado” vá para InProgress. Para isso, em Toolbox, clique e arraste um SetState logo abaixo de onWorkflowActivated1.

image

2.7. Em Properties do setStateActivity1, em TargetStateName, defina para stateInProgress;

image

2.8. Clique em Workflow1 na barra de navegação (“breadcrumb”) para voltar ao WorkFlow.

2.9. Clique com o botão direito em stateInProgress e selecione Add StateInitialization. Com isso, definiremos o que deverá acontecer sempre que um processo entrar neste passo.

image

2.10. Agora iremos arrastar um tarefa para o nosso WorkFlow. No Toolbox, clique e arraste um CreateTask;

image

2.11. Nas propriedades da Tarefa, em CorrelationToken, insira um novo token InProgressToken e em OwnerActivity, selecione stateInProgress.

image

2.12. Ainda nas propriedades da tarefa, em TaskId e TaskProperties, faça o mesmo procedimento. Clique nos “…” para abrir a janela propriedades, clique na aba Bind to a new member, selecione Create Field e clique Ok.

image

2.13. Agora, clique duas vezes sobre createTask1 para gerar o MethodInvoking event handler. Vamos gerar um novo GUID para nossa tarefa, e adicionar algumas propriedades. Insira o seguinte cógio para o MethodInvoking.

Code Snippet
  1. private void createTask1_MethodInvoking(object sender, EventArgs e)
  2.         {
  3.             createTask1_TaskId1 = Guid.NewGuid();
  4.             createTask1_TaskProperties1.Title = "Finalize o documento";
  5.             createTask1_TaskProperties1.AssignedTo = "notebook01\\Thiago"; //troque para um usuário válido do seu ambiente
  6.             createTask1_TaskProperties1.DueDate = DateTime.Now.AddDays(1.0);
  7.         }

2.14. Agora volte para o Workflow1.cs[Design], clique com botão direito em stateInProgress e selecione Add EventDriven. Clique e arraste uma tarefa OnTaskChanged para que possamos monitorar as mudanças da nossa primeira tarefa criada.

image

2.15. Nas propriedades de onTaskChanged1, em TaskId, selecione o id da tarefa que criamos anteriormente para vinculá-las e clique Ok.

image

2.16. Ainda em propriedades, em AfterProperties e BeforProperties faça o mesmo que no passo 2.12. Clique em “…” depois na tab Bind to a new member, selecione Create Field e depois OK para as duas propriedades.

image

2.17. Ainda em propriedades, em CorrelationToken, selecione o InProgressToken.

image

2.18. Clique duas vezes sobre onTaskChanged1 para gerar o método Invoked, nele iremos assegurar que as mudanças que ocorrerem na tarefa, sejam sincronizadas. Adicione o seguinte trecho de código no método.

Code Snippet
  1. private void onTaskChanged1_Invoked(object sender, ExternalDataEventArgs e)
  2.         {
  3.             onTaskChanged1_AfterProperties1 = onTaskChanged1.AfterProperties;
  4.             onTaskChanged1_BeforeProperties1 = onTaskChanged1.BeforeProperties;
  5.         }

2.19. Agora iremos adicionar uma condição (IfElse) para prosseguirmos com o WorkFlow, caso seja atendida nossa condição. Para isso, no Toolbox, adicione um IfElse.

image

2.20. Esta condição irá utilizar uma Code Condtion, ou seja, iremos colocar uma condição no código para validação. Para isso, voltemos ao código e iremos adicionar um método para validar nossa condição. Adicione o seguinte trecho de código para verificar se a tarefa teve seu status de completude alterado para 100%, ou seja, tarefa completada:

Code Snippet
  1. private void ProntoParaRevisao(object sender, ConditionalEventArgs e)
  2.         {
  3.             if (onTaskChanged1_AfterProperties1.PercentComplete == 1.0)
  4.             {
  5.                 e.Result = true;
  6.             }
  7.             else
  8.             {
  9.                 e.Result = false;
  10.             }
  11.         }

2.21. Voltando para o Design, vamos adicionar nosso método a validação do nosso IfElseBranchActivity1

image

2.22. Então vamos arrastar um SetState para que quando a condição for verdadeira, o estado seja alterado para stateRevisao.

image

2.23. De volta ao Design, veja que agora temos um ligação do stateInProgress para stateRevisao. Em stateRevisao, vamos repitir os passos feitos em stateInProgress (passos 2.9 até 2.13) para criar a inicialização do estado e criar uma tarefa para revisão.

image

image

2.24. Da mesma forma, vamos repetir os passos (2.14 até 2.18) para adicionar um evento para monitorar a tarefa criada no passo anterior.

image

image

2.25. Da mesma forma, vamos repetir os passos (2.19 até 2.22) para adicionar uma condição que irá validar nosso estado de revisão.

Code Snippet
  1. private void RevisaoFinalizada(object sender, ConditionalEventArgs e)
  2.         {
  3.             if (onTaskChanged2_AfterProperties1.PercentComplete == 1.0)
  4.             {
  5.                 if (onTaskChanged2_AfterProperties1.Description.ToLower() == "<div>aprovado</div>")
  6.                 {
  7.                     e.Result = true;
  8.                 }
  9.                 else
  10.                 {
  11.                     e.Result = false;
  12.                 }
  13.             }
  14.         }

image

2.26. Desta vez iremos adicionar um setState para as duas ações. Ou seja, se a tarefa for completada e estiver escrito “Aprovado” na descrição da tarefa, o estado será alterado para stateFinalizado. Caso contrário, o estado voltará para stateInProgress.

image

image

2.27. Finalizamos nosso Workflow. Vamos efetuar o deploy no nosso site e testar nosso workflow State Machine que acabamos de criar. Para isso, clique em Build e depois em Deploy Solution.

image

2.28. Vá até a biblioteca/lista o workflow foi associado, no caso deste artigo, a biblioteca Shared Documents. Faça upload de um novo documento para esta biblioteca, assim, iniciando nosso workflow.

2.29. O workflow só será finalizado, se no estado de Revisão a tarefa criada para revisão, seja concluída (atribuindo 100% a tarefa) e escrevendo na descrição da tarefa, o texto “Aprovado”. Qualquer outra informação, não deixará que o workflow termine, sempre voltando ao estado InProgress.

image

image

image

Conclusão

Nesse artigo nós apresentamos como criar um WorkFlow State Machine para SharePoint 2010 via Visual Studio. Lembrando que ainda podemos criar workflows mais simples, usando a própria interface via browser, ou um pouco mais avançado utilizando o SharePoint Designer 2010.

As vantagens na utilização do WorkFlow via Visual Studio são inúmeras. Podemos aplicar regras de negócios muito mais complexas e também, o workflow é compilado e aplicado no SharePoint usando o modelo de pacotes de solução para SharePoint (.wsp).

Advertisements