Como posso obter o status de um fluxo de trabalho em C#
Pergunta
Preciso obter o status de um fluxo de trabalho programaticamente.Coisas que tentei:
- item[workflowName] - me deu um "8" embora o fluxo de trabalho esteja concluído (parece sempre retornar 8, não sei por que) (não foi útil)
- SPFieldWorkflowStatus.GetFieldValueAsText(item[workflowName]) - retorna uma string vazia
- SPWorfklow.InternalState - foi "bloqueado | em execução | notStarted" no evento WorkflowStarting e WorkflowStarted.Foi "concluído" no evento WorkflowCompleted.Por que foi notStarted durante o evento WorkflowStarted?
Existem outras maneiras de obter o status de um fluxo de trabalho?
O que preciso fazer para um cliente é criar uma coluna em uma lista onde o cliente possa ver o status de um fluxo de trabalho executado em outra lista (como uma pesquisa, que já tentei usar, mas não consegui selecionar o campo do fluxo de trabalho onde está o status).É por isso que agora estou tentando resolver isso com um campo de hiperlink, mas não consigo obter o status correto de um fluxo de trabalho.
Solução
Fluxo de trabalho de status que você pode obter usando o seguinte método
public string GetWorkflowStatus(SPListItem item, String workFlowName)
{
SPWorkflowManager manager = item.Web.Site.WorkflowManager;
foreach (SPWorkflow instance in manager.GetItemWorkflows(item))
{
if (instance.ParentAssociation.Name == workFlowName)
{
foreach (SPField field in instance.ParentList.Fields)
{
if (field is SPFieldWorkflowStatus)
{
SPFieldWorkflowStatus statusField = (SPFieldWorkflowStatus)field;
if (statusField.Title == workFlowName)
{
int statusValue = int.Parse(item[statusField.StaticName].ToString());
return statusField.GetFieldValueAsHtml(statusValue);
}
}
}
}
}
return String.Empty;
}
Outras dicas
A versão simplificada:
public static string GetWorkflowStatus(SPListItem listItem, string workflowTitle)
{
var workflowStatusField = listItem.Fields[workflowTitle] as SPFieldWorkflowStatus;
int statusValue = int.Parse(listItem[workflowStatusField.StaticName].ToString());
return workflowStatusField.GetFieldValueAsHtml(statusValue);
}
Parece ser um problema com a quantidade de fluxos de trabalho em execução nessa lista.Eu li Aqui que o status pode retornar" 8 "se 15 ou mais campos de status de fluxos de trabalho existirem em uma lista.Temos atualmente 26 fluxos de trabalho em execução nessa lista e, portanto, suponho que não seja possível obter o status sem causar um viewQueryoverflow.