有一个列表,批准工作流程与之关联,工作流程在添加项目时启动。列表具有匿名访问权限,因此任何人都可以输入项目,但项目需要得到批准者的批准。项目将具有状态(例如批准,拒绝等)。
现在,我正在创建一个可视webpart。我想在网格中显示列表项。但是我只需要显示那些被批准的项目。我正在使用sharepoint对象模型,如何根据项目过滤项目批准状态。
由于
答案 0 :(得分:2)
“工作流程状态”字段的名称通常是工作流程名称的前8个字母数字字符。 Approved的值为16.因此,仅选择已批准的项目应如下所示:
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 :(得分: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";
}
}
唯一的问题是如何获取工作流列名称;为此,我建议您使用SharePoint Manager 2010工具,浏览到与工作流关联的库,并从那里获取列名称(最多8个字符,对我来说是“AOFWF0”)
答案 2 :(得分:1)
您可以使用此示例代码获取状态
示例代码:
//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);
答案 3 :(得分:0)
我来到页面搜索答案,但发现所有答案都使用静态字段名称或其他一些非常有限的approch。
所以最后做我自己的研究,这就是我如何形成工作流程字段名称
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;
}
}
列名是基于此形成的(名称具有误导性,但它只是列的名称): How to get the SharePoint workflow status for each SP item with a PowerShell script?
然后我在我的CAML查询中使用它
if(WFColumnName != string.Empty)
viewFields += "<FieldRef Name='" + WFColumnName + "' />";
在我的情况下,我只需要检查它是否完成所以我得到字符串值并与“5”进行比较。