Category: Examples

Table Headers : Tabular Layout Trick

Table Headers : Tabular Layout Trick

Updated 18th March 2020

[Update Start

Thanks to assiduous reader Steven Robert (see the comments) who reached out and pointed out some annoying side effects and  a requirement, now I get to revisit this topic after a while away. As luck would have it, I was working on a similar situation to the one Steven describes, and I had not been timely in updating this post. Thanks to him and here is the updated version of the concept, with explanations.

  1. As the original post mentioned, and Steven pointed out, the selector used in the example is unreliable
  2. Steven proposed a new selector and solved that issue, making it multi-column as well

But the downside is the lack of display when the table is first instantiated. We need something capable of reacting before the think cycle kicks in.

In order to  achieve something like this, our “payload” needs to be part of the table that is displayed automatically. So the obvious candidate in this case is the label extension, since the first column is actually a label anyway. You could extend this concept to include other controls, but  it would require more heavy lifting as you would probably end up, if you were unlucky, building an entire Entity Container. We covered that in the JavaScript Extensions book and it isn’t usually a short effort. Anyway, we have a label so we are cool.

Our label extension has a mount key which fires when the label is displayed. So if the table is displayed, the label code will kick in. So we can be ready as soon as the table is ready. Secondly, we could in theory add several label columns and have custom headers for each of them (you could of course achieve that using non-JavaScript techniques).

Here is the walkthrough based on the previous Project (with the credit cards and visa cards which are derived as a subset of the credit cards).

  1. Add a label in the row in the table and add custom properties. It should display whatever attribute is appropriate.
  2. Generate a standard label extension and edit it a bit.
  3. Add the custom properties to trigger the code when the label is displayed.
  4. Add another label if you want (I ran out of originality but added a second one for demonstration purposes).
  5. Fire it up in the Debugger, and then in the Browser.

I didn’t go all the way to deployment but it looks like it could be elevated into a viable concept. Also, I wasn’t a very good citizen as I didn’t do any checking to avoid my code running every time the label is instantiated – I would most likely check to see if the header already had the text I wanted to avoid setting it again.

And finally, of course if you want the Project Zip just leave a note in the comments!

Here is a walkthrough video. Hope it makes sense!

Update End]

Original Post :

There is always much discussion when users first discover the Interview tab. Let’s be honest – not all of the comments are exactly positive. It all feels a bit, well, basic.

There are a number of things that catch you out at first (and indeed, later). So let’s take a moment to study tabular layouts and a common issue.

For this example I’m going to use the same project (Credit and Visa Cards) as the previous post, since that gives us two entities to work with.

Tabular Layout

Let’s consider that you want to display both entities using tabular layout. You create a Screen and set them both to tabular display. But let’s assume that you want to display the Visa Card with a couple of specifics. You want to include the provider of the credit card. So let’s set that up as a Value List and use an attribute on the Credit Card, and infer it on the Visa Card:

Table Headers Tabular Layout Trick 1So, with that now done, we want to display the Visa Card provider in the Entity Collect (as it is an inferred entity, we cannot use an Entity Collect). But we want to display it as a label as you can see in this screenshot (we added a name to the attribute as you saw in step one so we can reference it in our Screen:

Table Headers Tabular Layout Trick 2Notice how we added a label and used that to display the text of the provider? Using a label ensures three things

  1. It is read-only
  2. If the user is tabbing from input to input, the cursor will not get stuck in that field
  3. It doesn’t look like a read-only input, just a label (which is what we want).

But the downside is that the label does not have a table header in that column, since the Interview designer only adds those for Inputs:

Table Headers Tabular Layout Trick 4

I find it a shame that we cannot put table headers in this “tabular” column, since in HTML a table should have column headers. In fact if we take a moment to inspect this table in the browser, we note that annoying, there is a table header in the table:

Table Headers Tabular Layout Trick 5

So, we need to get that table header populated with our chosen text. But how shall we do it? We don’t want to create an Entity Container extension, since that would mean we have to do the whole thing from top to bottom. So we only want a little tiny change. We have a couple of choices.

  1. Create a Style Extension for the Entity Collect
  2. Create a Label Extension for stealth modification

Let’s try the first option, since it reveals some interesting facts about Styling Extensions. Firstly, get ready by doing the following; change the text associated with your entity in the Interview by double-clicking where the rectangle is, and entering whatever text you would like to display in the missing header.

Then add a compound Styling Extension to your Project. Tabular Containers allow for nested styling, like this:

OraclePolicyAutomation.AddExtension({
style: {
tabularContainer: function (control) {
if (control.getProperty("name") === "xContainer") {
style: {
headerRow:
YOUR STUFF GOES HERE

}
}
}

}
});

Notice the “headerRow” is a child of “tabularContainer”. And notice the line that says YOUR STUFF GOES HERE. Now for an interesting fact about Styling Extensions. They behave, to a reasonable degree, just like Control Extensions. They are really one and the same thing – the main difference of course is the handlers that are exposed in Control and Interview Extensions.

Drop jQuery into your resources folder, and then replace YOUR STUFF GOES HERE with the following line:

$("#opaCtl4th0").text(control.getCaption());

Of course, the jQuery selector may be different for you but it is easy to find the “header” I illustrated in the previous screenshots. Open your Project in a real Browser (Ctrl+F5) for debugging and take a look at the results:

Final Header Result

Our Styling Extension has added the text to the header, drawing it from the Interview Screen Entity Container definition, and we have it where we want it. Of course, you could style it as well.

But it goes to show that Styling Extensions are really not very different to Control Extensions!

Back to Basics : InferInstanceFor

Back to Basics : InferInstanceFor

It’s one of those functions that people often ask questions about. At first glance InferInstanceFor appears to be “just another one of those Instance functions”. But it actually hides something very interesting. The ability to create copies, to a certain degree.

So copies of instances, huh? Why would I want to do that? Well there are many reasons. But before we look at reasons, let’s look at how it works. Starting with a simple data model – consider the credit card as an entity. And the visa card as well. Let’s say that (logically enough) the visa card will be hosting instances of the credit card that are Visa cards.

So if we wanted to actually infer the existence of these Visa cards (as opposed to inferring membership of a relationship) then InferInstanceFor is going to come in very handy.

What we need, in order to be able to do this, is to establish an inferred associative relationship. We need to connect the credit and Visa cards with a relationship, so that we can use that in our upcoming rules.

InferInstanceFor 1

Suppose we enter into the Debugger 3 credit cards. Note that the Visa card is an inferred entity – you are about to add the rules to infer them. Here is the rule to begin the Word document:

InferInstanceFor Rule

And so, let’s tidy up the Interview and make a nice Screen layout with the two entities on the Screen – the credit card as a New Input and the Visa card as a new Control > Entity Container. I’ve added some labelling and put it into Tabbed layout for clarity:

InerInstanceFor Screen Layout

So now let’s run the Debugger and see the result, with 3 cards entered:

InferInstanceFor Debug 1

Hmm, that’s seriously underwhelming – what’s with the unknown?! The reason is, InferInstanceFor simply creates the “copy” instance. It does not in any way clone the attribute values. So right now you have a Visa card, but there is no information at all in the instance.

That’s why, whenever you see an InferInstanceFor, you are highly likely to see another rule right after it, making sure that some of the data is actually populated. A useful function in this context would be For(), since it is designed for cross-entity reasoning – which you are now doing since you have two entities. A sample rule might look like this:

InferInstanceFor Rule For

Note that this rule assumes that your credit card entity has an attribute called the credit card number. I renamed the attribute the credit card to the credit card number in my project. And of course, the separator “,” might be different in your region.

After a bit more tidying up it looks like this. Nice!

Debug Screen Final

Job done. So InferInstanceFor is useful for creating mirror copies of instances, but you will need to leverage other functions and rules to actually populate the instances you create.

If anyone wants the Zip File, just leave a comment!

Calendar Black Out Dates with Control Extensions

Calendar Black Out Dates with Control Extensions

The OPA Hub Website is always happy to hear from readers and learn about the things they are doing and trying to do. In this case, this article was inspired by our reader AF, from Adelaide. The question was; how can we implement a calendar control, to allow the users to select a date – but the calendar control must be able to black-out certain dates (public holidays, non-work days). It’s the sort of thing we probably can all relate to.

The Calendar control that Oracle Policy Automation uses is a very standard JavaScript dropdown, but there is little in the way of configuration in respect of the dates shown. We can style the calendar and we can offer two different ways to enter dates (either as the traditional calendar or the three-fields-in-a-row style that some applications use).

So it comes down to what can be done with an Extension. Regular reader will remember that we have spoken about calendar controls before, on the subject of Year-Only Selection. So that Extension will be the basis of this article.

Firstly, what are the tools we might need?

  • jQuery
  • JQuery UI, especially datepicker

The datepicker widget from jQuery supports a variety of user-related events, including one called BeforeShowDay, which is where we can come in a specify which days should not be clickable. They remain in the calendar display of course.

The basic concept therefore, for this demonstration is:

  1. The user can select a date from the control. Certain days are not available.
  2. The control must handle both adding a date when the date is not currently entered, as well as when the date is already entered and the user wants to correct it (for example, going back to a previous screen in the interview.
  3. The date must of course be saved to our chosen attribute.

As always this is without any warranty or guarantee of fitness for purpose. It’s a quick demonstration that you can then add to and correct yourselves.

 

/**
 * Richard Napier The OPA Hub Website March 2019
 * Educational Example of Custom Date Control Extension
 * I will remember this is for demonstration purposes only
 */
OraclePolicyAutomation.AddExtension({
	customInput: function (control, interview) {
		if (control.getProperty("name") == "xDate") {
			return {
				mount: function (el) {
					
					var myDatePicker = document.createElement('input');
					myDatePicker.setAttribute("id", "dateselect");
					var mySessionDate = interview.getValue("dt_session");
					

					el.appendChild(myDatePicker);
					

					$('#dateselect').datepicker({
						dateFormat: "yy-mm-dd",
						onSelect: function (dateText) {
							var RecoveredDate = dateText;
							
							interview.setInputValue("dt_circ", RecoveredDate);
							
						},
						beforeShowDay: function (date) {
							var array = ["2019-03-14", "2019-03-15", "2019-03-16"]
							var string = jQuery.datepicker.formatDate('yy-mm-dd', date);
							
							return [array.indexOf(string) == -1]
						}
					});

					var mySelectedDate = "";

					if (interview.getValue("dt_circ") == null) {
					
						$('#dateselect').datepicker("setDate", mySessionDate);
						var RecoveredDate = mySessionDate;
						
						interview.setInputValue("dt_circ", RecoveredDate);
						

					} else {

						var myPreviouslySelectedDate = new
							Date(interview.getValue("dt_circ"));
						

						var myPreviouslySelectedDateAsDate = new
							Date(myPreviouslySelectedDate);
						
						var myDayPrefix = "";
						var myMonthPrefix = "";
						if (myPreviouslySelectedDateAsDate.getDate() < 10) {
							myDayPrefix = "0"
						}
						if (myPreviouslySelectedDateAsDate.getMonth() < 10) {
							myMonthPrefix = "0"
						}
						var myConvertedYear = myPreviouslySelectedDateAsDate.getFullYear();
						var myConvertedMonth = myPreviouslySelectedDateAsDate.getMonth() + 1;
						var myConvertedDay = myPreviouslySelectedDateAsDate.getDate();
						var myPreviouslySelectedDateOnly =
							myConvertedYear + "-" + myMonthPrefix + (myConvertedMonth) + "-" + myDayPrefix + myConvertedDay;
						

						mySelectedDate = myPreviouslySelectedDateOnly;

						
						$('#dateselect').datepicker("setDate", mySelectedDate);

						
						var RecoveredDate = $('#dateselect').datepicker("getDate");
						
						interview.setInputValue("dt_circ", new Date(RecoveredDate));
					}
				},
				update: function (el) {},
				unmount: function (el) {
					var RecoveredDate = $('#dateselect').datepicker("getDate");
					
					interview.setInputValue("dt_circ", new Date(RecoveredDate));
					
					var myPicker = $('#dateselect');
					myPicker.remove();
					

				}
			}
		}
	}
});

Calendar Black Out Dates with Control Extensions – About the Code

The first part of the Mount is basically setting up the jQuery datepicker to be able to hide some days. We also set the date format to the international YYYY-MM-DD that we all know. Of course a more sophisticated approach would check the region and apply the correct format.

Line 22 Sets up the Select Event and Line 29 the BeforeShowDay  Event.

We attempt to grab the value of our user-entered date (dt_circ) and place it in the date control. If that is unknown or null, then we will default to the current date.

When the user selects a valid date, we will of course copy it into the attribute again.
Finally, when the Unmount fires, we will clean up.

The End Result

 

In a later post we will look at using an entity to store the blackout dates. Stay tuned! For the time being the Project is in the OPA Hub Shop.

OPA 10 – Missing “It is currently known”

OPA 10 – Missing “It is currently known” in a non-English language

This is an old one but it comes up now and again. Discussing with an Oracle Policy Modeler user (that was running Policy Automation in version 10.3) the other day, she remarked upon the lack of support for “it is currently known” or “it is currently unknown” in the rule language of choice of the user and how something that worked fine in another project (using a later version) did not compile at all in 10.3.  The solutions was to modify the relevant template file to provide the French mapping for the relevant English phrase.

In the installation folders of the relevant Oracle Policy Modeler, the templates.xml file can be located : choose the file relevant to the language needed (in this case for example the folder was “C:\….Policy Modeling\language\French\templates.xml”).

In this file we can see the different template of english phrases (for example, “currently known” or “currently unknown”) mappings to their non-English translations. If necessary, add the relevant Statement Operators and Variable Operators to the file, and restart Oracle Policy Modeler.

Check the existence of, or add t the following in the “statement operator” section of the file:

OPA 10 - Statement Operators

And the following  to the “variable operators” section of the same file:

OPA 10 -Variable Operators

These modifications allowed the documents in French to compile and be used. There are quite a few similar posts hanging around on the Internet, for example here is one involving Swedish.

Of course one should pay close attention to the XML file structure, and where possible use an existing language XML to help model the correct elements in your chosen language to create a valid XML structure for your templates.xml. In this case the easiest approach was to search for “currently known” in an existing file and work from there.

Getting Started With Oracle Policy Automation Book Now Available

Getting Started With Oracle Policy Automation

The book is now available on Amazon UK, Amazon India and Amazon United States, all of which you can access from our Online Shop here on ODE OPA Blog. I look forward to having some fun with it in the coming weeks, notably in the courses coming up in May, June and beyond.

Update : A common request has been to be able to buy the book outside of Amazon – well, now in addition you can place worldwide orders using another shipping service.

Update : Response to the book has been positive and I look forward to creating more content on this site and preparing the second edition!

[vc_row_inner][vc_column_inner width=”1/2″]

[/vc_column_inner][vc_column_inner width=”1/2″]
[/vc_column_inner][/vc_row_inner]

Update December 2016

Getting Started With Oracle Policy AutomationThanks to the many people who bought the first version of the Book. Like a lot of guides and other similar material, the first version was never considered to be the endgame, so as soon as the first version was released we began collecting the feedback, correcting the errors and building out some of the areas where, for the sake of brevity, the book did not go first time around. The result is almost ready.

The new, expanded release of the book (20 chapters, about 250 pages) is expected to enter final draft in December 2o16. Watch out for it in the Amazon bookstore and elsewhere, probably before the end of January 2017. Happily this will allow for the new features of the December 2016 release to be included in the next version of the book, as well as some of the updated content that has been on this site in the last few months (with more text, example and so on!)

OPA 12 – It’s all in the Natural Language Text

OPA 12 – It’s all in the Natural Language Text

OPA 12 – It’s all in the Natural Language Text

I suppose this article could have just as easily been about Oracle Policy Modelling 10 as well. But since I was teaching version 12 I decided to use it for the screenshots. I also was teaching a group of French students so the examples are in French and English. Ultimately the same challenges occur no matter what language you are using, provided that language uses definite articles in the same way. Natural Language is not always natural.

Consider the following :

An Entity called “the contact” or “l’interlocuteur”.

OPA 12 - Contact Entity Natural Language

As you can see, the Relationship Text has been changed to “tous les interlocuteurs” or “all the contacts” instead of the standard “all instances of the contact” or “toutes les instances de l’interlocuteur”. I see a lot of students working in this way. However there are some side effects of using this kind of wording…

Let’s imagine that every contact has a telephone number, and we want to check that the telephone number has been entered. The first part is fine, we can write the following rule to assign a Boolean value depending on whether we have a telephone number or not, and let’s build a rule that uses Entity Quantifiers to look at the different contacts.

When is Natural Language really Natural?OPA 12 - For Each of the Contacts Natural Language

In English we would have something like

OPA For Each Contact in English Natural Language

We are using the longest version of the “natural language” Function “ForAll“. And it looks a bit, well, long-winded. So we might try one of the other versions:

OPA 12 - For Each of the Contacts EN Part Two Natural Language

That’s even worse. In French too it’s almost comical …

OPA 12 - For Each of the Contacts FR Part Two Natural Language

That’s even worse. So let us try a different approach. We decide to modify the Relationship Text and remove the “all” to leave only “the contacts” or “les interlocuteurs”. So now our rules look a bit more “natural language” when we use the ForAll function in it’s long form.

OPA 12 - For Each of the Contacts EN Part Three Natural Language

OPA 12 - For Each of the Contacts FR Part Three Natural Language

Of course I can hear people saying, why don’t you just use ForAll or PourTous – that is, the terse or short version of the function? It does of course depend on your environment, but a non-technical user is going to be far more comfortable using a natural language-based solution.

Have fun improving your text, until next time

Rich@rd

OPA 12 – Whatever happened to…

OPA 12 – Whatever happened to…

Working through the Policy Modeler version 12, from time to time I notice little things that have dropped off the map. It should also be noted that the “Polishing your  Rulebase” PDF document now exists in two distinct versions, for 10.x and 12.x. This should be enough to tell the casual reader that not everything is identical.

Well before I get into a bad mood, let us focus for a second on the improvements made. There are many in the domain of usability, workflow and general fluidity of the Modelling user interface – not least the new Debugger with “everything under one roof”.

New OPA 12 Debugger

But there are some things I regret seeing the back of and I want to share one of them with you right now. It concerns document structuring.  The other day I was building a demonstration of the idea of isomorphism in source and design documents. I found myself adding structural elements to my Word document using numerals and the Tab key :

Doc Structure OPA 10

The following day I wanted to do the same thing in 12.x but got this instead. After trying a few different approaches I gave up, and noticed a posteriori that this particular page had disappeared from the latest version of the above-mentioned “Polishing” PDF file.

Doc Structure OPA 12

So that would appear to put an end to that common practice.  A shame, unless there is something else that can be used that has the same ease-of-typing. There are a number of areas that seem to have lost a little functionality and I am going to talk about another one of these in my next post, but in that case there is, at least for now, a happier outcome. The new user interface of version 12 is definitely improved in many areas, but it does require some readjustments as we have seen above.

Until next time!

Oracle Policy Automation Quiz Question Two – AND

Oracle Policy Automation Quiz Question Two – AND

Many of you probably saw this one coming after the first Quiz Question. Well, here it is.

I am sharing with you all another question I often ask during the Oracle Policy Automation training to my students. I ask it for three main reasons

  1. It helps to understand the Engine and the inferencing process
  2. It’s fun and a great way to challenge yourself
  3. It is good preparation for the sort of question that you might get in the Certification examination.

This is quite an easy one, and most people will get it right away

Something to think about

The Oracle Policy Automation  Certification, as it is sometimes called (incorrectly) is in fact actually called “Oracle Policy Automation 10 Rule Developer Essentials 1Z0-534” and as such is focuses for the major part on rule development. The exam study guide seems to have gone 404 on the Oracle University Website but the corresponding guide in the partner website is still useful.

Update in 2016

Of course, since this article was originally written for Version 10, things have changed – not least with the arrival of a Cloud-focused certification examination that, at time of writing in December 2016, was undergoing beta testing. Although there are currently no self-testing or exam guides yet available, I hope this is just a matter of time.

OPA – Entities Adventures #10 Temporal Reasoning

OPA – Entities Adventures #10 Temporal Reasoning

Temporal Workshop

And so we come to the tenth, and final (for the time being) post in this hopefully useful and entertaining series for learners of Oracle Policy Automation. In this episode we will discuss the concept of Temporal Reasoning and apply it to the Workshop example we have been using since the beginning of the series.

What is this temporal stuff?

To give you a simple example, our Workshop has a variety of elements to it that change over time :-

  • Cars in the Workshop
  • Mechanics
  • Car Storage Cost

And of course, these pieces of data might need to be analysed and calculated over time. This is a common thing in business of course. Generally software tries to handle this by having “data points” – snapshots of data – but usually they are not very good at handling “periods of time” – where you don’t have data for each day or other time period  but you expect to have to calculate as if you did. Say for example you have a person who receives money from the state. They receive it on a weekly basis. We need to calculate from their date of first receipt, until today. So we need to be able to “span the time period” and calculate the figures. And that is pretty cool.

How does it work in Policy Automation? – an example

In Policy Automation, we need first to understand how the data is entered. Let’s focus on the storage costs – cars that are left in the Workshop are charged at a daily rate to the customer, for storage, once they are left more than 3 days. In addition, the storage charge is a percentage of the value of the vehicle. Finally, storage of more than 10 days gets a higher rate.

So let us work up an example. Assume two cars being worked on in the Workshop. One of the them arrives in the Workshop on September 11, the other on September 1. Today is September 17. So how much storage should we charge? To make matters more realistic, we can say that the first ten days are charged at 9% of the car’s residual value, the next ten days at 11%, and beyond that a punitive 15% since the car has really been here too long.

OPA - Daily Cost of Storage Temporal Example

]In the above example we introduce some new Attributes (the cost of the car’s storage and the date of the car’s arrival) respectively currency and date types, and the function TemporalBefore().

From the Function Reference we see that TemporalBefore (date) is explained thus:

Returns a Boolean attribute that varies over time and is true before a date and false on and afterwards.

So essentially our cost will be calculated using the car’s residual value * 0.09 for as long as TemporalBefore(AddDays(the date of the car’s arrival, 10)) is TRUE.

There are other versions of this function to handle things like “on or before” or similar calculations for “after” or “on or after” dates. Visualising the data in the debugger makes it clearer how this is working. Don’t forget to right-click the cost of the car’s storage in the Debugger window and choose Show in Temporal Visualisation.

[vc_single_image image=”” img_size=”full” alignment=”center”]Now we can see the cost of storage incurred based on the car residual value and the arrival date of the car, according to the different values over time. But perhaps you didn’t see what you were expecting – the actual total cost as of today. So let us introduce this into the mix:-

In the following screenshot, note we have added new “total cost” and “current daily cost” Attributes.

As a demonstration we are using the ValueAt() function to get the current value charged today (according to our table of values).

We are also using the IntervalDailySum(start, end, value) to calculate the total amount payable to date.

OPA - Car Storage Cost Rates and Total Temporal Function Example

 

Now that we have the total cost of the storage, we can go ahead and work out if the car storage has exceeded the residual value of the car.

And so we come to the end of this 10 part series, designed to give you some more fun examples of working with Entities. For those of you who are reading this after taking the OPA Essentials Class with me, I hope you enjoyed them.

What Next?

For the next series of posts we will be looking at teasing questions that might help you prepare for the certification. After that, get ready for more function examples and fun with Oracle Policy Automation.

Rich@rd

OPA – Entities Adventures #9 Testing using What If

[vc_row][vc_column][vc_column_text]

What If?

Back in the Workshop now with all our different chapters, things are getting more and more complex. But one feature of the Policy Modelling user interface that we do not cover in the standard training course can come to our rescue. I’m talking about the What If Analysis feature. This is based on Microsoft Excel and reasonably easy to explain to a non-technical user, so it can be leverage to prove that a use case has been understood, or as a tool for working with the business to understand each other.

The use of this functionality starts with a new file in your Project:

OPA - What If Initial View

As you will have seen, the first time you open it can be quite a disappointment. What you need to do is proceed first to an initial setup, then to some data entry. Begin by clicking the Add Worksheet button on the top left, and adding Worksheets for any Entities that you intend to work with. It will end up looking like something like this, using our Workshop as the example:-

OPA - What if Added Entities

Now we proceed to each of the Worksheets and click the Add Column button. We add any attribute we intend to enter data for, as well as any inferred attributes we want to see the results for after our analysis. Notice the color coding for the columns to make it easy to see which are conditions and which are conclusions.

OPA - What If Added Columns

As in the example above, the colors indicate:

  1. Black is an identifier for the Entity on this tab. In our case here, the customer.
  2. Blur is an identifier for another Entity in the Rulebase. In this case, the Global Entity as well as the customer’s car.
  3. Green is a base attribute
  4. Brown is an inferred attribute

Entering the correct data can be a little daunting, since in many cases you will need to remember for example that car #1 is the Fiat, and mechanic #1 is Bob and so on. But you quickly get the hang of it. Common traps include

  • failing to compile your documents before clicking the Analyze button
  • failing to add information to the Global tab.

Remember that all your Entities will fold up into the parent Global, so there will need to a record on the Global tab. Go ahead and click the Analyze button and see what happens. For the purposes of demonstration, enter one car, one mechanic, one customer and one set of wheel-covers. For inspiration here is a carousel of What If Analysis Worksheets with some example data, and the results (ie, these screenshots were taken after clicking the Analyze button.[/vc_column_text][/vc_column][/vc_row][vc_row][vc_column][vc_images_carousel images=”9163,9164,9165,9166,9167″ img_size=”large” onclick=”link_no” autoplay=”yes” hide_prev_next_buttons=”yes” wrap=”yes” title=”What If Analysis Outcome”][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]Hopefully you will see from the carousel that the inferred attributes have been updated following the Analyze button being clicked. Of course why stop there with only one car and one customer. Not only can we enter many of them for our Global Case #1, we can create many Global Cases, and associate our Entity Instances with a different Global Case.

Furthermore once you have built your complex What If scenario, you can export it to a Policy Modelling Test Case file for further testing.

Have fun, until next time

Rich@rd[/vc_column_text][/vc_column][/vc_row]

Worldwide
Logo by Southpaw Projects LLC