K2 BlackPearl 4.5 Server Event Code Snips
Get count of a specific user's worklist items for a given process - within a K2 Server Code event.
Use a new workflow client connection to the server to do all the work.
using (Connection c = new Connection())
{
// Using ConnectionSetup as connection string
ConnectionSetup cs = new ConnectionSetup();
// From a server code event in a K2 process we can use K2 environment variables for connection strings
cs.ConnectionString = K2.StringTable["Workflow Server"].ToString();
// Open server connection using ConnectionSetup
c.Open(cs);
// Impersonate Bryan so we can get at his worklist >_>
c.ImpersonateUser(@"BryansDomain\Bryan");
// Build worklist filter criteria
// We only want to return work items that match a given process
WorklistCriteria wc = new WorklistCriteria();
wc.Platform = "ASP";
wc.AddFilterField(SourceCode.Workflow.Client.WCField.ProcessName, WCCompare.Equal, "BryansTestProcess");
// dump resulting count of Bryans worklist items for the BryanTestProcess to a K2 Data Field
int itemCount = c.OpenWorklist(wc).TotalCount;
K2.ProcessInstance.DataFields["BryansWorklistCount"].Value = itemCount;
}
Get distinct count of process instances for a given process pending a specific activity - within a K2 Server Code event.
Use a K2 SmartObject to do all the work.
// Use SmartObjectClientServer for accessing SmartObjects
SmartObjectClientServer sos = new SmartObjectClientServer();
// Prep the connection
sos.CreateConnection();
// From within a K2 process Server Code event, use K2 environment variables for connection strings
sos.Connection.Open(K2.StringTable["SmartObject Server"]);
// Get an "Activity Instance Destination" SmartObject (an OotB K2 SmartObject)
SmartObject so = sos.GetSmartObject("Activity_Instance_Destination");
// Tell the SmartObject to return a list of results
so.MethodToExecute = "List";
// Set filter for results - return active items pending "Bryans First Activity" for "BryansTestProcess"
so.Properties["ActivityName"].Value = "Bryans First Activity";
so.Properties["ProcessName"].Value = "BryansTestProcess";
so.Properties["Status"].Value = "Active";
// Execute - return the results as a DataTable
DataTable dt = sos.ExecuteListDataTable(so);
// If you use groups for destinations by using advanced mode to split groups to users...
// you can get duplicate Process Instance IDs - one for every user in the group
// to get a distinct list of process instances, use a datatable view to return distinct results
DataTable DistinctDT = dt.DefaultView.ToTable(true, "Process Instance ID");
// copy the resulting count to a K2 process data field
K2.ProcessInstance.DataFields["WorklistCount"].Value = DistinctDT.Rows.Count;
// and do cleanup
sos.Connection.Close()