O Service Pack 2 impede que um fluxo de trabalho ao alterar inicie a si mesmo

Olá a todos, aqui é o Stephen novamente. Trabalho como escritor para o SharePoint Designer. Queria informá-los de uma correção que foi incluída no Service Pack 2 para Office SharePoint Server 2007 e no Windows SharePoint Services 3.0. Essa correção afeta fluxos de trabalho projetados no SharePoint Designer 2007. Em seguida, vou lhes mostrar como criar intencionalmente um loop de fluxo de trabalho usando dois fluxos em vez de um.

Antes do Service Pack 2, era muito fácil criar inadvertidamente um fluxo de trabalho que disparava a si mesmo e criava um loop infinito. Por exemplo, considere este cenário:

1) Um fluxo de trabalho é iniciado quando um item é alterado.

2) O fluxo de trabalho atualiza (ou altera) o item atual (por exemplo, usando a ação Definir Campo no Item Atual).

3) Como o fluxo de trabalho altera o item, ele dispara a si mesmo.

Então, se você tivesse um fluxo de trabalho ao alterar que lhe enviasse um email e, em seguida, atualizasse o item atual, poderia receber rapidamente centenas de emails na Caixa de Entrada.

Depois de instalar o Service Pack 2 no servidor, não é mais possível que um fluxo de trabalho que é iniciado quando um item é alterado dispare a si mesmo alterando/atualizando o item atual. Esse cenário de loop infinito não é possível:

clip_image002

No entanto, muitas pessoas projetaram fluxos de trabalho que, na verdade, tiram proveito dos loops infinitos. Por exemplo, você pode projetar um fluxo de trabalho ao alterar que excute um loop ininterrupto em um item de tarefa e envie um lembrete diário até que a tarefa seja marcada como concluída. O fluxo de trabalho dispara a si mesmo atualizando uma coluna Contador (Counter) que foi adicionada à lista apenas para essa finalidade. E o fluxo de trabalho tem uma regra que interrompe ou causa um "curto-circuito" no fluxo de trabalho caso alguma condição seja atendida — nesse caso, o fluxo para sem alterar o item atual se o Status da tarefa for Concluído. Após o SP2, esse fluxo de trabalho será desfeito, pois não poderá disparar a si mesmo.

O SP2 não bloqueia loops infinitos, que podem ser úteis, mas, para recriar o que funcionava antes, você deve projetar dois (ou mais) fluxos de trabalho ao alterar que disparem um ao outro. Dois fluxos de trabalho ao alterar que disparam um ao outro atualizando/alterando o item atual consistem em um cenário de "correcursão":

clip_image004

Além disso, é muito comum implementar um fluxo de trabalho baseado em estado com o uso de vários fluxos de trabalho mais curtos que disparam uns aos outros. Por exemplo, você pode ter uma lista com um campo Status e vários fluxos de trabalho ao alterar anexados à lista. Todos esses fluxos de trabalho incluem uma etapa no final que atualiza o campo Status. Assim, um fluxo de trabalho dispara vários outros atualizando o Status e, em seguida, esses fluxos de trabalho verificam o valor no campo Status para determinar se devem continuar sendo executados ou se devem parar. Esse fluxo de trabalho baseado em estado também é um cenário de "correcursão", pois um fluxo de trabalho inicia muitos outros fluxos ao alterar por meio da alteração/atualização do item atual. O Service Pack 2 não bloqueia esse tipo de fluxo de trabalho baseado em estado que depende de correcursão.

Recapitulando

· Antes do SP2, um único fluxo de trabalho ao alterar podia entrar em um loop infinito atualizando o item atual e, assim, disparando a si mesmo.

· Após o SP2, um fluxo de trabalho ao alterar pode disparar qualquer outro fluxo de trabalho ao alterar atualizando o item atual, mas um fluxo de trabalho ao alterar não pode disparar a si mesmo. Assim, cenários de correcursão (inclusive qualquer cenário que implemente um fluxo de trabalho baseado em estado usando muitos fluxos de trabalho ao alterar menores) não estão bloqueados.

· Como lembrete, nunca foi possível criar um loop infinito fazendo com que um fluxo de trabalho ao alterar criasse um item na lista atual. Cada fluxo de trabalho tem uma propriedade que contém os "fluxos de trabalho que não posso iniciar". Essa propriedade é usada para impedir loops para fluxos de trabalho que são iniciados quando um item é criado.

· Também como lembrete, todos os cenários anteriores envolvem apenas fluxos de trabalho anexados a uma única lista ou biblioteca. Loops infinitos em cenários entre listas nunca foram bloqueados para fluxos de trabalho ao alterar ou ao criar .

Criando loops antes do Service Pack 2

Esta seção apresenta um exemplo de como um único fluxo de trabalho ao alterar podia tirar proveito de loops infinitos antes do SP2. Após o SP2, esse fluxo de trabalho não disparará a si mesmo. Portanto, a próxima seção apresenta um exemplo de como criar um loop usando dois fluxos de trabalho separados.

Suponha que você tenha uma lista de tarefas chamada Tarefas da Equipe e deseje criar um fluxo de trabalho que enviará um lembrete diariamente até que a tarefa seja marcada como concluída.

Primeiro, adicione à lista uma coluna chamada Contador (Counter), com o valor padrão 0.

clip_image006

Você precisa ocultar as colunas Contador (Counter) dos formulários de lista (Novo Item, Editar Item), de modo que apenas o fluxo de trabalho possa acessá-las/atualizá-las. Primeiro, na página de configurações da lista, clique em Configurações Avançadas e, em seguida, permita o gerenciamento dos tipos de conteúdo.

clip_image008

Na página de configurações da lista, clique em cada tipo de conteúdo e, na próxima página, clique na coluna Contador (Counter). Oculte essa coluna. Faça isso para cada tipo de conteúdo na lista.

clip_image010

Após criar e ocultar a coluna Contador (Counter) para que ela não apareça em formulários, você está pronto para projetar o fluxo de trabalho.

O fluxo de trabalho Lembrete Diário deverá ser iniciado sempre que um item for criado ou alterado.

clip_image012

A primeira etapa verifica dois itens: (1) se a tarefa já foi marcada como concluída, o fluxo para. Essa regra causa um "curto-circuito" no loop sempre que a tarefa é finalmente marcada como concluída. (2) Se a tarefa não estiver concluída, o fluxo de trabalho verificará se a data de conclusão está no futuro (maior do que hoje). Se isso for verdadeiro, o fluxo será pausado até a data de conclusão, pois você não deseja enviar lembretes até que a data de conclusão seja atingida.

clip_image014

A segunda etapa verifica novamente se a tarefa foi concluída (caso o fluxo de trabalho tenha sido pausado até uma data de conclusão na etapa anterior, e a tarefa tenha sido concluída enquanto isso). Se a tarefa ainda não tiver sido concluída, o fluxo será pausado por um dia.

clip_image016

A terceira etapa verifica novamente se a tarefa foi concluída enquanto o fluxo de trabalho estava pausado. Em caso afirmativo, o fluxo de trabalho será interrompido.

Se a tarefa não tiver sido concluída, o fluxo de trabalho (1) enviará o lembrete por email; (2) definirá a variável CurrentCount fazendo uma pesquisa no campo Item Atual/Contador; (3) adicionará 1 a CurrentCount e armazenará esse valor em uma variável NewCount; e (4) definirá a coluna Contador (Counter) com o valor armazenado na variável NewCount.

Basicamente, essa etapa incrementa a coluna Contador (Counter) em 1 sempre que o fluxo de trabalho é executado, assim, você pode consultar a coluna Contador (Counter) para ver quantos lembretes foram enviados. E, o que é mais importante, a ação “Definir Campo no Item Atual” ao final desta etapa é o que “altera” o item atual, fazendo assim com que o fluxo de trabalho dispare a si mesmo e crie o loop.

clip_image018

Criando loops após o Service Pack 2

Após o SP2, você ainda pode obter esse efeito de loop, mas é necessário projetar dois fluxos de trabalho que disparam um ao outro (correcursão) em vez de um único fluxo de trabalho que dispara a si mesmo.

Aqui você usará (1) um fluxo de trabalho Contador (Counter), que incrementa a contagem, e (2) um fluxo de trabalho Trabalhador (Worker), que na verdade envia o email de lembrete.

Primeiro fluxo de trabalho — o fluxo de trabalho Contador (Counter)

Conforme explicado anteriormente, você precisa criar uma coluna Contador (Counter) na lista com o valor padrão 0, permitir o gerenciamento de tipos de conteúdo e ocultar esse campo para todos os tipos de conteúdo na lista.

clip_image006[1]

Esse design de dois fluxos de trabalho requer uma segunda coluna, SendMail, que funcionará como um sinalizador para o fluxo de trabalho Trabalhador (Worker). O valor padrão deve ser Não (No); caso contrário, qualquer alteração em um item de tarefa fará com que o email de lembrete seja enviado.

clip_image020

O fluxo de trabalho Contador (Counter) será iniciado quando um item for criado ou alterado.

clip_image022

A primeira etapa verifica o status da tarefa. Se a tarefa for concluída, o fluxo de trabalho Contador (Counter) será interrompido.

clip_image024

Se a data de conclusão da tarefa estiver no futuro (maior do que hoje), a segunda etapa será pausada até a data de conclusão, pois você não deseja enviar lembretes até depois da data de conclusão da tarefa.

clip_image026

A terceira etapa verifica novamente a conclusão da tarefa, caso, ela tenha sido concluída enquanto o fluxo de trabalho estava pausado na etapa anterior. Se a tarefa ainda não tiver sido concluída, o fluxo será pausado por um dia.

clip_image028

A etapa final verifica o status novamente para determinar se a tarefa foi concluída durante a pausa anterior de um dia de duração. Caso não tenha sido, o fluxo de trabalho atualizará o item atual (1) incrementando o valor da coluna Contador (Counter) em um e (2) definindo o sinalizador SendMail como Sim (Yes) (o valor padrão é Não - No).

clip_image030

Segundo fluxo de trabalho — o fluxo de trabalho Trabalhador (Worker)

O fluxo de trabalho Contador (Counter) acima termina atualizando (alterando) o item atual. Essas atualizações disparam o fluxo de trabalho Trabalhador (Worker), que é definido para ser iniciado quando um item é alterado.

clip_image032

O fluxo de trabalho Trabalhador (Worker) simplesmente verifica se o sinalizador SendMail está definido como Sim; em caso afirmativo, o fluxo de trabalho envia a mensagem de lembrete e define o sinalizador novamente como Não.

A definição do sinalizador SendMail como Não é a alteração que dispara o fluxo de trabalho Contador (Counter) acima. Os fluxos de trabalho Contador (Counter) e Trabalhador (Worker) dispararão um ao outro, enviando lembretes diários até que a tarefa seja marcada como concluída.

clip_image034

Como alternativa, em vez de um loop infinito, você pode fazer com que o fluxo de trabalho Trabalhador (Worker) escalone a notificação de tarefa quando a coluna Contador (Counter) atingir um determinado valor — digamos, cinco lembretes. A etapa seguinte executa ramificações diferentes, dependendo da contagem de lembretes. Quando a contagem atinge cinco, o fluxo de trabalho envia uma mensagem a um gerente, cujo endereço de email você pode “embutir” na ação Enviar um Email ou recuperar de uma lista usando uma pesquisa de fluxo de trabalho.

clip_image036

Você também pode fazer com que o fluxo de trabalho Trabalhador (Worker) reatribua a tarefa a um indivíduo ou grupo diferente depois que um determinado número de avisos tiver sido enviado. Para essa etapa, o fluxo de trabalho reatribui a tarefa a um grupo do SharePoint composto de membros da equipe que são responsáveis pelo acompanhamento das tarefas escalonadas.

clip_image038

Se você desejar terminar o loop quando a contagem atingir um determinado número, também adicione uma ramificação para a primeira etapa do fluxo de trabalho Contador (Counter) – não o fluxo de trabalho Trabalhador (Worker). Essa ramificação interrompe o loop quando a coluna Contador (Counter) atinge o valor seis.

clip_image040

Espero que essas informações sejam úteis para você.

—Stephen

Esta é uma postagem de blog traduzida. Consulte o artigo original Service Pack 2 prevents an on-change workflow from starting itself