[Updated: 4/6/2015]: Added reference to usage of WorklistCriteria here.
The SourceCode.Workflow.Client assembly provides the access to interact with the K2 blackpearl Server in the context of a User. This means that the API will not be able to query, for example, for all Users who has a Worklist Item from a specific Process. You will need to use SourceCode.Workflow.Management assembly for this. This API, however will allow the current User to impersonate as any other User within K2, if the account has the Impersonate rights on the Workflow Server. We will see more about this. Now down to the basics.
K2 Workflow Client API
Adding a reference to the assembly
These 2 assemblies can be found in the following location:
GAC – This is if you are working from within the K2 sever
K2 blackpearl’s bin folder – If you have the client components installed on your machine. The default path is C:\Program Files (x86)\K2 blackpearl\bin.
K2 Host Server’s bin folder – If you are working from within the K2 server. The default path is C:\Program Files (x86)\K2 blackpearl\Host Server\bin.
Note:The API call is carried out via RPC, so it means that as long as you have the required DLLs with your application, you will be able to make the call even if you did not install the K2 Client Components on that machine.
Open a connection to K2 blackpearl server
To open a connection, you only need the following:
//create connection object
For the Open method, there are a couple of variations:
Open(string Server): This requires a server name that can be resolved by the DNS/Host File or an IP.
Open(string Server, string ConStr): The 2nd parameter provides a connection string information. See ConnectionSetup.ConnectionString property.
Open(ConnectionSetup setup): This requires a ConnectionSetup object. You can provide a different log in credentials here.
Once the connection is opened, the User property will show the current logged on account:
If you find that the User property does not match the current logged on User in your ASP.NET page, it means that your web.config file is not configured to impersonate the current logged on User. Make sure the following is present in your web.config file:
Impersonate another User
If the current logged on User has the Impersonate rights on the Workflow Server:
You can execute the following code to impersonate as any User within the K2 environment:
//impersonate as K2:myDomain\User1
Closing a connection to K2 blackpearl server
When you are done with the connection, always remember to close it by calling on the Close or Dispose method. You should always wrap the connection in a Using block:
Or a try-catch and/or finally block:
Start a Process Instance
To start a new process instance (a.k.a new workflow instance), you will need to create a ProcessInstance object first.
The path to process is a combination of the root project folder name, followed by any folders’ name till the process. So in the following example:
The path will be “TestProject1\ModuleA\Process1”.
With the ProcessInstance object created, you will be able to update the Folio and process level Data Fields before the process instance starts. This procedure is optional.
procInst.Folio="My first test";
//set Data Field
procInst.DataFields["Message"].Value="My first message";
When the necessary updates on the ProcessInstance object is completed, you will need the Connection object’s StartProcessInstance method call to kick start the process instance.
Note: The StartProcessInstance method runs asynchronously by default. If you need the method to be executed synchronously, pass a 2nd parameter “true”:
Opening a Worklist
A work list (task list) is a collection of work list items (task list items) that is assigned to the current logged on user. You need to call on the OpenWorklist method of the Connection object and it will return a Worklist object, which is a collection of WorklistItems. The following is a sample method call:
foreach(WorklistItem wli inmyWorklist)
//Displaying the Worklist Items
Note: The OpenWorklist method without any input parameter will return the entire collection of WorklistItems of the current User. This is not going to be efficient and very time consuming if the current User has thousands of tasks. To overcome this, we should use a Filter with the OpenWorklist method, which we will discuss in a separate article you can find here. [Updated: 4/6/2015]
Now, the WorklistItem is a single task assigned to the current User. It has the information of the current process instance and also the Activity Destination Instance. This means that we can draw the following information from it (Just to name a few):
WorklistItem.ProcessInstance.Folio: The Folio of the current process instance.
WorklistItem.ProcessInstance.DataField[“myField”].Value: Get the process level data field.
WorklistItem.Data: The full URL of the task form.
WorklistItem.Actions: The configured Actions for this task.
foreach(Action act inwli.Actions)
//print the configured Action name
To open a work list item, it means getting K2 to assign a slot to this user. This method will also validate if the current user is the valid Destination User and whether the work list item is still available for actioning.
// open the work list item
SN stands for Serial Number, which is an identifier that the K2 server will insert as a query string parameter with the task form URL.
Just for information, the serial number comprises of:
Process Instance Id; and
Activity Destination Instance Id
The 2 values will be separated by an underscore ‘_’ symbol. For example: SN=123_45
Execution the work list item action
And of course, with the WorklistItem, you will be able to execute the configured Action (i.e. when User clicks on the Approve button).
Note: The action name needs to be spelled exactly the same as configured in the process.
Note:The Execute method runs asynchronously by default. If you need the method to be executed synchronously, pass a 2nd parameter “true”.
Here are some “more complete” sample codes if you are still unclear:
If you have Working Hours configured, for example, Mon-Friday, 8 working hours
And in your workflow, you configured an Escalation using the Escalate After template and filled in the Days value. For example, 3 days:
Your workflow WILL NOT be kicking off the escalation after 3 working days. It seems logical from the configurations, but it is not!
In the back-end, Escalation will convert Days to Hours, meaning 3 days x 24 hours = 72 hours. This will be the number of hours the Escalation is waiting for. When paired with Working Hours (8 hours working day in our example), the final escalation date will be 9 days later ( 72 hours / 8 hours = 9 days). This is how it works!
So, if you are using Escalation with Working Hours, always remember that Days will be converted to Hours to get the final escalation date. Hope it helps!
There are times when you need to write codes in your K2 workflow to provide features that is not available out-of-box. It could be a complex logic processing, sending of formatted HTML email with table contents, etc. In this article, I’m going to show you how to attach to the K2HostServer.exe process to debug your workflow.
In your Visual Studio, open the Options dialog (Tools > Options).
In the Options dialog, select the debugging category and uncheck the option, “Require source files to exactly match the original version” and click OK.
Attaching to the K2HostServer.exe process
Deploy your K2 process, if you have not done so.
Open your process in Visual Studio.
Right click on your Default Server Events (Codes), select View Code, followed by Event Item to view the codes.
Add a breakpoint.
In the menu, select DEBUG > Attach to process…
In the Attach to Process dialog, select K2HostServer.exe under Available Processes. You may need to check the “Show processes from all users” if you are not logged in as the K2 Service account.
Next, click on the Select… button.
In the Select Code type dialog, select Debug these codes types radio button and check Managed (v4.5, v4.0) and click OK.
Click on the Attach button and we are ready to test the workflow!
Note: Don’t worry if the symbols are not loaded after you attached to the process. It will do so when the workflow kicks off.
Start your workflow running and wait for the breakpoint to hit. When it does, it is up to your debugging skills to find your problem now =)
Just a side note, if you are running the K2 blackpearl Server service in console mode, your Console.WriteLines will appear in the console too.
A lot of times before a form submission, changes to important values, etc. “Initialize” actions, you will want to prompt the User to get their confirmation on their action like the following:
Well.. The above is just for illustration and by no means you should irritate your Users, no matter how you dislike them =)
The Action that allow us to prompt and get a confirmation from the User is the “Get a confirmation from user” Action, which can cheap mlb jerseys be found under the “Notifications” section:
Now, based on the explanation from the production site the “OK” and “Cancel” buttons function like this:
If the “OK” button is clicked, it will process the subsequent Actions.
If the “Cancel” button it clicked, it will stop processing subsequent Actions.
When the Action is used in a “If” to condition, clicking on the “OK” button will process the subsequent Actions. Click on the “Cancel” button will process the “Else” condition.
It is pretty straight cheap mlb jerseys forward for the above cases, but it is different if Nullam you configure it like the following:
In the – sample, message B or C will still be processed after the user clicks on “Cancel” button. This is correct by design, since the production documentation states that it will only stop execution of follow-up Actions. So, an “If” is not an Action and thus will be processed regardless of the button clicked.
To make the above sample work, you will need to wrap Mac the Action within a Condition like the following:
This setup will ensure that when the User clicks on the “Cancel” button, the “Stop rule execution” Action is triggered and the rest of the Rule processing is aborted. If the User clicks on the “OK” button, the follow-up Actions and Conditions will be processed.
Now, what did I put in the “If an advanced condition is true” Condition?
It is a 1 cheap mlb jerseys = 1 condition which will ensure that it will always execute and support our “Get confirmation from user” scenario.
When you Nouvelle add a View to a Form, wholesale nfl jerseys the Form will automatically inherit the Rules from the View and at the same time, automatically adds a “When [View] executed Initialize” Rule. This is regardless whether your View has this Rule at all.
Now, this tip is only true if you do not need any Expressions on the View to be evaluated when the Form loads.
Let’s see why:
This is my sample View:
It has 2 Text Boxes, let us refer to the top Text Box as “Value A” and the bottom Text Box as “Value B”. Lastly, there is a “Addition Result” Data Label, Or which has the following Expression:
When I test this View, I should see that the “Additional Result” gets evaluated correctly.
Next, I proceed to add the View to a Form.
Going on to the Rules page now, I see that there is a “When the Form is Initializing” Rule added.
In the rule, there is an Action running the View’s “Initialize” method.
But wait! I did not configure any Initialize Rule on my View earlier. So let’s remove it based on the best practice and view my Form in runtime URL.
Hmm… something is wrong. The “Addition Result” Data Label did not show any value. It Wylick should have, since it has the Expression configured and both “Value A” and “Value B” Text Boxes have values in them.
Updating the “Value A” to 2 kicks off the Expression evaluation and I get the value in “Addition Result”. This shows that the Expression works, just that it did not start evaluating when the Form loads.
Now, of going back to my Form Rule designing page, I put back the Form Initialization Rule that calls on the View’s Initialize method that with I have deleted earlier. After checking in the Form, I try running the Form again.
It works now!
Great! Now we know God that View’s Expressions will only start running on Form load when the View’s Initialize method is called on. So, it does not mean that we should always remove View Initialize method on Form Rules when there isn’t any actions in it =)
This article wholesale MLB jerseys shows you how to create a selectable Checkbox Views section like the following:
Appending the following style to your form’s theme CSS files (Both Designer and Girls Runtime). If you are using the default Platinum theme, then your CSS file will be located at [Path to K2 blackpearl folder]\K2 SmartForms Runtime\Styles\Themes\Platinum.css and [K2 blackpearl folder]\K2 smartforms Designer\Styles\Themes\Platinum.css.
Add a Checkbox control into the table cheap jerseys cell, right after the zumLabel control above. The CSS selector above will use this These combination of Table > Label + sibling Checkbox condition to apply the required stylings.
The section header is now ready. Add your Views after this header and apply your rules to hide/show the underlying views when the checkbox Montaditos is checked or cleared.
Save and test the form!
Note: You may need to execute an IIS reset to refresh a cached stylesheet.