The Microsoft Visio team recently blogged about Creating custom validation rules for Visio 2010 (see http://blogs.msdn.com/visio/archive/2009/09/10/creating-custom-validation-rules-for-visio-2010.aspx), in which it was suggested that we can use Visual Basic for Applications to interact with the new validation API. I thought, there’s a challenge … so I will develop a VBA project to do just that. I will upload the code soon, but, as it is only half developed today, I will demonstrate how to understand why a rule has been broken.
In the following BPMN diagram, I have failed to connect a Task to the End Event. I have made it obvious here but it could be easy to overlook in a larger diagram. In fact, I know of one company who were advised by a “consultant” that there must be something wrong when the end of a connector goes red therefore you should move it away from the shape until it goes green! The result was that the company had over 300 flow diagrams without a single valid connection! That company is no more!
The new UI in Visio 2010 has a new Process tab, which has a button to Check Diagram and a tick box display the Issues Window. This shows that two rules have been broken, but it does not give you any more than the rule Description and Category. Now, you may assume that Microsoft have the BPMN rules modelled correctly, but if you are creating your own rule sets, then you need to understand exactly why they have been broken, therefore I have constructed a basic VBA dialog that displays the Issues and Rules in a selected document.
So, when an Issue is read from the new document.Validation.Issues collection
Issue 1 has the rule with the description An End Event must have incoming Sequence Flow. has the name NoSequenceFlowToEndEvent , and the category of End Events .
Issue 2 has the rule with the description The flow must have a source and target. has a name NoTargetOrSource, and a category list of Sequence Flow, Message Flow .
The Name, Description and Category of the Rule, cannot be sufficient to define what the rule is, so we must explore the Rules of the active RuleSet in the document. In this case it is the BPMN RuleSet, which contains many Rules, and using my dialogue, I can find the Rule with the name NoTargetOrSource to see what it’s definition is.
Now we can begin to understand how a rule is defined by inspecting the Test Expression and Filter Expression values.
These expressions look very similar to ShapeSheet formulae, but they are not actual ShapeSheet formulae. However, some ShapeSheet functions can be used in these expressions, but Microsoft have had to create some extra quasi-ShapeSheet functions that are needed in order to create a rule definition.
Closer inspection of the FilterExpression shows that this rule is only to be applied to shapes which have either an Actions.MessageFlow or Actions.SequenceFlow row checked. The Dynamic Connector in the BPMN template has been modified to have such rows in the Actions section of the spreadsheet.
If you now look at the TestExpression reveals that the new GluedShapes method, as seen in my previous post Listing Connections in Visio 2010 ( http://bvisual.spaces.live.com/blog/cns!3350D61BC93733A9!1820.entry ), returns an array of glued shapes . The arguments 4 and 5 are the actual values of the constants visGluedShapesIncoming2D and visGluedShapesOutgoing2D respectively. The function AGGCOUNT() obviously means the count the number of items in the retuned array, so the whole expression simply says that there must be a connected 2D shape at either end of the connector.
The other broken rule, NoSequenceFlowToEndEvent, has :
Inspection of these expressions reveal that it applies to and shape that has the category “Event”, and has the row Actions.End checked, and it must have a glued connector which has the row Actions.SequenceFlow checked. I discussed the new ShapeSheet function HASCATEGORY() in my earlier blog Visio 2010 : Containment and Cross-Functional Flowcharts ( http://bvisual.spaces.live.com/blog/cns!3350D61BC93733A9!1811.entry ), but the other new function is FILTERSET() obviously means that the returned array of GluedShapes is filtered to include only those that satisfy the second argument, in this case, Actions.SequenceFlow.Checked.
Once you start examining the rules, you can begin to understand how you can create your own ones. Getting interested?