Setting activity destinations when the destination users are not known
KB000051
PRODUCTThis article explains how to create an activity with a ‘placeholder’ destination user for scenarios where the destination user for an activity is not known at design-time - or when users need to ‘pull’ items from a shared Worklist.
It may happen that the destination user for an activity is not known at design-time. By design, K2.net
The following procedure may be followed to achieve this functionality: | ||||
1. | Create a user account in Active Directory that represents a ‘ghost’ user. | |||
2. | In K2.net Studio, set the Destination Rule for the activity to point to the ‘ghost’ user created in step 1. | |||
3. | Create a page/function/sub within your application which retrieves Worklist items for the ‘ghost’ user. Typically, this page/function/sub would perform the following actions: | |||
a. | Open a connection to the K2.net![]() | |||
b. | Obtain the first item in the ‘ghost’ user’s Worklist, taking into consideration factors such as process name, folio name or start date to return the correct item. | |||
c. | Redirect the Worklist item to the current user. | |||
d. | Do a Response.Redirect() or similar function in your code to open the Worklist item as the current user. | |||
The following is sample code for a web-based ASP.NET form which demonstrates the steps a - d:
if (!Page.IsPostBack) { string FoundItem = string.Empty; // Open the connection as the ‘ghost’ user (the destination user you specified for the activity in K2 Studio) // Note: replace the values , , and // with the correct values for your environment SourceCode.K2ROM.Connection MyConn = new SourceCode.K2ROM.Connection(); MyConn.Open("MyServerName", "domain,GhostUser,password"); try { // Ensure that only the items for the desired process are returned // Note: you may do some further processing to filter the worklist items returned // In this example, only the activities from the project MyProject and its process MyProcess // will be returned // Note: replace the values with the correct values for your environment WorklistCriteria MyCriteria = new WorklistCriteria(); MyCriteria.AddFilterField(WCField.ProcessFullName, WCCompare.Equal, @"MyProjectMyProcess"); // Make sure the oldest item is picked up first MyCriteria.AddSortField(WCField.EventStartDate, WCSortOrder.Ascending); // Open the ‘ghost’ user’s worklist Worklist CurrentWorklist = MyConn.OpenWorklist(MyCriteria); // If an item is found, choose the first one. if (CurrentWorklist.Count > 0) { CurrentWorklistr0].Redirect(this.Page.User.Identity.Name); FoundItem = CurrentWorklist 0].Data; } } finally { // Close the connection, regardless of whether there was an error. MyConn.Close(); } if (!FoundItem.Equals(String.Empty)) { // Redirect to the item, Response.Redirect(FoundItem); } }
Visual Basic
If Not Page.IsPostBack Then Dim FoundItem As String = String.Empty ' Open the connection as the ghost user (the destination user you specified for the activity in K2 Studio) ' Note: replace the values , , and ' with the correct values for your environment Dim MyConn As New SourceCode.K2ROM.Connection MyConn.Open("MyServerName", "domain,GhostUser,password") Try ' Ensure that only the items for the desired process are returned ' Note: you may do some further processing to filter the worklist items returned ' In this example, only the activities from the project MyProject and its process MyProcess ' will be returned ' Note: replace the values with the correct values for your environment Dim MyCriteria As New WorklistCriteria MyCriteria.AddFilterField(WCField.ProcessFullName, WCCompare.Equal, "MyProjectMyProcess") ' Make sure the oldest item is picked up first MyCriteria.AddSortField(WCField.EventStartDate, WCSortOrder.Ascending) ' Open the ghost users worklist Dim CurrentWorklist As Worklist = MyConn.OpenWorklist(MyCriteria) ' If an item is found, choose the first one. If CurrentWorklist.Count > 0 Then CurrentWorklist(0).Redirect(Me.Page.User.Identity.Name) FoundItem = CurrentWorklist(0).Data End If Finally ' Close the connection, regardless of whether there was an error. MyConn.Close() End Try If Not FoundItem.Equals(String.Empty) Then ' Redirect to the item, Response.Redirect(FoundItem) End If End If
|