2010-10-19 25 views
6

Hay una lista en la que se asocia un flujo de trabajo de aprobación, el flujo de trabajo comienza cuando se agrega un elemento. La lista tiene acceso anónimo para que cualquiera pueda ingresar un elemento, pero el elemento debe ser aprobado por un aprobador. tendrá un estado (por ejemplo, aprobado, rechazado, etc.).cómo obtener el estado de un flujo de trabajo de aprobación del artículo utilizando el modelo de objetos sharepoint?

Ahora, estoy creando un elemento web visual. Quiero mostrar los elementos de la lista en una cuadrícula. Pero necesito mostrar solo los elementos que están aprobados. Estoy usando el modelo de objetos Sharepoint, ¿Cómo puedo filtrar los elementos basados ​​en en el estado de aprobación

Gracias

Respuesta

2

El nombre del campo de flujo de trabajo de estado es por lo general los primeros 8 caracteres alfanuméricos del nombre de su flujo de trabajo. El valor de Aprobado es 16. Por lo tanto la selección de elementos, solo se puede ver algo como esto:

string caml = @"<Where><Eq><FieldRef Name='MyApprov' /><Value Type='WorkflowStatus'>16</Value></Eq></Where>"; 
SPQuery query = new SPQuery(); 
query.Query = caml; 
SPListItemCollection items = list.GetItems(query); 
1

, usted puede obtener el estado utilizando este código de ejemplo

Código de ejemplo:

//Obtain a list item 
SPListItem currItem = currList.Items[0]; 
//Get the workflow status value 
int wFlowStatusnum= (int)currItem ["WorkFlowName"]; 
//this will give you the one you see in the List view 
string wFlowStatus= System.Enum.GetName(typeof(SPWorkflowStatus), wFlowStatusnum); 
2
private static void ListWorkflowStatus() 
{ 
    string siteUrl = ConfigurationManager.AppSettings["SiteUrl"]; 

    // Get the site in impersonated context 
    using (SPSite site = new SPSite(siteUrl)) 
    using (SPWeb web = site.OpenWeb()) 
    { 
     SPList lib = web.Lists[ConfigurationManager.AppSettings["LibraryName"]]; 

     foreach (SPListItem item in lib.Items) 
     { 
      string titleColumn = ConfigurationManager.AppSettings["TitleColumn"]; 
      string workflowColumn = ConfigurationManager.AppSettings["WorkflowColumn"]; 

      string workflowStatus = item[workflowColumn] as string; 
      Console.WriteLine(string.Format("{0}\t{1} ({2})", item[titleColumn], GetStatusName(workflowStatus), workflowStatus)); 
     } 
    } 
} 

private static string GetStatusName(string value) 
{ 
    if (string.IsNullOrEmpty(value)) 
    { 
     return "N/A"; 
    } 

    switch (value) 
    { 
     case "0": 
      return "Not Started"; 
     case "1": 
      return "Failed On Start"; 
     case "2": 
      return "In Progress"; 
     case "3": 
      return "Error Occurred"; 
     case "4": 
      return "Canceled"; 
     case "5": 
      return "Completed"; 
     case "6": 
      return "Failed On Start (retrying)"; 
     case "7": 
      return "Error Occurred (retrying)"; 
     case "15": 
      return "Canceled"; 
     case "16": 
      return "Approved"; 
     case "17": 
      return "Rejected"; 
     default: 
      return "N/A"; 
    } 
} 

El único problema es cómo obtener el nombre de columna de flujo de trabajo; para esto, sugiero que use la herramienta SharePoint Manager 2010, busque la biblioteca a la que está asociado el flujo de trabajo y obtenga el nombre de columna desde allí (será de 8 caracteres como máximo, para mí era "AOFWF0")

0

I Llegó a la página buscando la respuesta, pero descubrió que todas las respuestas usan un nombre de campo estático o alguna otra aproximación que es muy limitante.

Así terminan haciendo mi propia práctica investigadora y así es como se formo el nombre del campo de flujo de trabajo

string WFColumnName = string.Empty; 
foreach (SPWorkflowAssociation assoc_wf in ReqList.WorkflowAssociations) 
     { 
      if (assoc_wf.BaseTemplate.Id.ToString() == "63e32cd3-2002-4b2f-81b0-4a2b4c3ccafa") 
      { 
       string str_workflowName = assoc_wf.Name; 
       Regex rgx = new Regex("[^a-zA-Z0-9]"); 
       str_workflowName = rgx.Replace(str_workflowName, ""); 
       if (str_workflowName.Trim().Length >= 8) 
        WFColumnName = str_workflowName.Substring(0, 8); 
       else 
        WFColumnName = str_workflowName.Substring(0, str_workflowName.Length); 

       break; 
      } 
      } 

El nombre de la columna se forman en base a esto (nombre es engañoso, pero es sólo por el nombre de la columna) : How to get the SharePoint workflow status for each SP item with a PowerShell script?

y luego lo uso en mi consulta CAML

if(WFColumnName != string.Empty) 
      viewFields += "<FieldRef Name='" + WFColumnName + "' />"; 

y en mi caso sólo hay que comprobar si se ha completado o no, obtengo valor de cadena y lo comparo con "5".

Cuestiones relacionadas