Skip to main content

I'm trying to query K2 via it's management API:

            WorklistCriteria criteria = new WorklistCriteria();
            criteria.AddFilterField(WCField.WorklistItemOwner, WCCompare.Equal, "mylogin");
            var items = workflowServer.GetWorklistItems(criteria);

this doesn't get me any item nor an exception, it returns an empty list.

However I can see in the workspace that I've many work items

Any idea what is wrong?

Unfortunately, as mentioned here (http://www.k2underground.com/forums/thread/31503.aspx) there is a currently aknown issue where using the WorklistCriteria object within the WorkflowManagement API will return an empty list.


Just to give an update, it is possible to workaround this issue by using WorklistCriteriaFilter instead of WorklistCriteria

I'm not sure ATM if it's possible to  cover the same possibilities via this overload


I try to work with the (undocumented) WorklistCriteriaFilter API.


 As far as I can understand, in order to build a request, you have to add "regular filters" for "regular" fields using WorklistCriteriaFilter.AddRegularFilter to get the same result as WorklistCriteria.AddFilterField for filters on columns


The tricky part is the WCLogical that is replaced by a RegularFilter.FilterCondition that doesn't have the same values, so you have to build your request differently (the coordination between logical elements is written differently). (BTW, I've never seen such an awkward way to build logical BLOCKED EXPRESSION


Eg. Writing (A OR 😎 AND C


using WorklistCriteria :


crit.AddFilterField(sc.WCLogical.StartBracket, sc.WCField.None, sc.WCCompare.Equal, null); // (
crit.AddFilterField(sc.WCField.ActivityName, sc.WCCompare.Equal, "123"); // A
crit.AddFilterField(sc.WCLogical.Or, sc.WCField.ActivityName, sc.WCCompare.Like, "345"); // OR B
crit.AddFilterField(sc.WCLogical.EndBracket, sc.WCField.None, sc.WCCompare.Like, null); // )
crit.AddFilterField(sc.WCLogical.And, sc.WCField.None, sc.WCCompare.Equal, null); // AND
crit.AddFilterField(sc.WCField.ActivityName, sc.WCCompare.Like, "45"); // C


using WorklistCriteriaFilter :


cf.AddRegularFilter(sc.WCField.ActivityName, sc.WCCompare.Equal, "123", RegularFilter.FilterCondition.AND_OPEN); // (A
cf.AddRegularFilter(sc.WCField.ActivityName, sc.WCCompare.Like, "345", RegularFilter.FilterCondition.OR_CLOSE); // OR B)
cf.AddRegularFilter(sc.WCField.ActivityName, sc.WCCompare.Like, "45", RegularFilter.FilterCondition.AND); // AND C


On line 1, we could use either AND_OPEN or OR_OPEN, since the logical operator is ignored for the first item (but _OPEN is used to open the bracket).


The trouble is that you can't write the following request with WorklistCriteriaFilter :


((A OR 😎 AND C) OR D


because of the "((" begining sequence. You can do it with WorklistCriteria because it allows to put two brackets in a row using empty filters, but you can't with WorklistCriteriaFilter.


Is there a way to write a filter ((A OR 😎 AND C) OR D using WorklistCriteriaFilter?


 


 


Reply