Cortex Studio V6 User Guide
Cortex Studio V6 User Guide
User Guide
Cortex Studio V6 User Guide
Cortex Limited
Keypoint
17-23 High Street
Slough
Berkshire
SL1 1DY
United Kingdom
T +44 (0) 1753 513 980
E [email protected]
Status: Release
Release Date: 23/03/2016
Author: Cortex Product Development
Document Version: 1.1
Software Version: Cortex Studio v6.0
All rights reserved. Passing on and copying of this
document, use and communication of its contents
are not permitted without written authorisation
from Cortex Limited.
Preface
Audience
The intended audience is primarily those responsible for designing or implementing business
automation processes. This User Guide assumes a working knowledge of flow diagrams.
Related Material
For further information, please also consult the following documents:
Cortex Block Reference Guide – HTML and PDF versions of this guide are normally
located in the C:\Cortex\Help folder on the Cortex server and may also be
duplicated in other locations by the system administrator. This information is
also available through Cortex Studio’s ‘Help’ menu item.
Cortex Administration Guide
1 Introduction
In today’s economic climate, businesses need to be more competitive and agile than ever
before, just to survive; to flourish, businesses also need to deliver a healthy return on
shareholder investment at an acceptable level of risk. This means that businesses need to
reduce their time to market and become ever more efficient, delivering greater
productivity for less cost, whilst controlling and minimising business risk.
To achieve this, business processes must be easily adaptable and executed faster with
greater precision to reduce risk. What is required is flexible, business process automation
that coordinates (or orchestrates) the interworking of different, and often diverse, business
and technology applications; this process is known as Orchestration and Automation.
1.1 Automation
Automation is the use of control systems and information technologies to reduce the need
for human work in the production of goods and services.
Not all processes can be automated, and in some instances it is not desirable to automate
certain processes. However, many processes that are repetitive, are complex, or require
human intervention to undertake well-defined tasks, can be automated, achieving business
benefits, such as:
Increasing productivity by decreasing the time to complete a process
Reducing risk of error
Reducing cost of human intervention
Improving uniformity of service
1.2 Orchestration
Orchestration is the automated control and coordination of various, often disparate,
systems (and possibly people) to undertake the correct activities at the right time to
achieve an automated end-to-end process.
1.4 Cortex
Cortex is a powerful software platform that delivers business process automation to
increase business agility and efficiency. It contains three logical elements: Business Rules,
Process Automation, and Operational Intelligence.
Business process flow diagrams may be entered directly into Cortex Studio, which provides
for the visualisation of the process flow, without having to use specialised programmers to
write complex scripts. Cortex Studio is also equipped with predefined ‘interfaces’ enabling
the easy communication to a vast array of external third-party systems in use in businesses
today. If a business uses legacy or custom systems, these can easily be accommodated by
implementing new ‘interfaces’.
1.8 LivePortal
LivePortal is a separate web-server component within the Cortex system that allows for
easy end-user interaction with Cortex. Using LivePortal, users can view the service
catalogue available to them, initiate flows (service requests) and interact with the flow.
LivePortal is an integral part of Cortex, enabling flow developers to configure the end-user
interaction whilst requiring little or no knowledge about web technologies.
CORTEX
SubtaskA Flow1
SubtaskB Flow2 MyGroup AnotherGroup Group ...
... Flow3
...
MySubtask1 MyFirstFlow
MySecondFlow MySubSubGroup
2.1.1 Groups
Groups are hierarchical organisational containers that contain related Groups, Flows or
Subtasks. Group containers may contain any number of Flows, Subtasks or other Group
containers.
The hierarchical grouping of Flows in the group hierarchy is replicated within LivePortal.
2.1.2 Flows
A Flow is an object that contains all the logic and other entities that define a process; it
can exist within a nested hierarchical Group structure; Figure 2 shows an example of Flows
as viewed in Cortex Studio.
2.1.3 Subtasks
Subtasks are re-useable sub-processes that contain logic and other entities that can be
executed at several different points in a Flow, or used within multiple different Flows.
Subtasks can only be used within Flows and cannot be run directly within Cortex Studio, nor
are they visible within LivePortal.
Note: A Subtask is a ‘Global’ object, which means any Subtask can be made
available to any Flow. The hierarchical grouping of Subtasks within Cortex Studio is
to depict a logical relationship with its associated tasks; its actual location within
the hierarchy does not influence which Flows may make use of it.
2.1.4 States
A State is a high-level step in the Flow; it acts as a container for the detailed logic and
associated objects necessary to perform the functions that form part of that step.
Each State has its own workspace, which contains a local Variables Store, holding the
variable declarations for the variables to be used within that State, and the logic required
to implement that part of the overall Flow, including any specific error handling logic.
Note: The Default Error Handler in the top-level Flow workspace is identical to any
flow State in that it has its own workspace containing a Variables Store and the
necessary logic required to handle errors, including the ability to define its own
Local Error Handler to handle any errors that occur in the Default Error Handler.
2.1.5 Workspaces
A workspace is a ‘canvas’ onto which blocks are placed in order to build the logic of a Flow.
Workspaces ‘belong’ to an object, such as a State, and can be accessed by double-clicking
the object.
Note: Any object that has an icon with a ‘page turn’ indicator (the top right corner
of the icon peeling over) has a workspace that can be accessed by double-clicking
the object.
Note: Some objects that have a ‘page turn’ indicator, such as the ‘Execute
Subtask’ function block, act as a ‘link’ to the actual Subtask definition. Double-
clicking on the ‘Execute Subtask’ function block opens the workspace associated
with the corresponding Subtask object.
‘Page Turn’
Indicator
To aid navigation and visibility, it is possible to zoom-in or zoom-out of the workspace using
the magnifying glass icon on the workspace title bar or <Ctrl-mouse-wheel>. If the
workspace exceeds the window or tab size, scroll bars at the top and/or bottom of the
workspace window enable easy navigation throughout the workspace; see Section 3.2.
To enable orderly placement of blocks onto the workspace, objects are forced to snap to a
hidden grid.
Figure 6 shows an example of the hierarchy of workspaces that may be found in a typical
Flow.
Top-Level Workspace
State Workspace
State Workspace
Figure 6 – Workspaces within a Flow
2.1.6.3 Configuration
Each block performs a specific function and has properties that can be configured, using
the Property Viewer, to specify the function’s details. See Section 4.2.9 for more
information about block configuration.
2.1.6.4 Palettes
Palettes are containers that hold template function blocks, similar to the stencils provided
in Visio. Each palette contains a number of function blocks that perform related functions;
for example, Figure 9 shows the function blocks contained within the Database Blocks
Palette.
2.1.7 Connections
Each block has a single, input connection point, and one or more output connection points.
Using the mouse, the blocks can be connected together to create a logical flow. See
Section 0 for more information about connecting blocks together.
2.1.8 Variables
Variables are named containers that hold data; this data may be changed in the execution
of a Flow, i.e. it can vary. For example, if manipulating information about a person, a
variable could be created to hold a numeric value representing a person’s age. The
variable would be named appropriately, for example, ‘Age’, and its contents can be
manipulated or evaluated by referring to the Variable’s name.
Before a flow can use a Variable, it must be created or ‘declared’; before a flow can make
a decision based on the contents of a Variable, or use a Variable as an input to a
calculation, the Variable must be assigned a value. Values can be assigned to Variables at
the time of declaration or during the execution of a flow, or passed to Variables when the
flow is started.
Float: A Float Variable holds a decimal number, or a very large or very small
number. For example, a Float Variable would be used to hold a person’s bank
balance, e.g. 10,123.49, or it could be used to hold a very large number, such as
the mass of a star in kg, e.g. 1.989 x 1030, which can also be written in scientific
notation as ‘1.989E30’. Figure 12 shows a Float Variable definition block,
entitled ‘bank_balance’, which is used to declare the Float Variable and
optionally assign it an initialisation value.
Boolean: A Boolean Variable holds a logical value of either ‘True’ or ‘False’. For
example, a Boolean Variable could be used to hold a person’s employment
status, e.g. ‘True’. Figure 13 shows a Boolean Variable definition block, entitled
‘employment_status’, which is used to declare the Boolean Variable and
optionally assign it an initialisation value.
DateTime: A DateTime Variable holds a single date and time value. For
example, a DateTime Variable could be used to hold an employee’s start date,
e.g. 1st January 2012. Figure 14 shows a DateTime Variable definition block,
entitled ‘start_date’, which is used to declare the DateTime Variable and
optionally assign it an initialisation value.
For more detailed information about Simple Variables, see Appendix 7.2.1.
Composite Variables
List: A List Variable holds a collection of values, which can be of different types
and can include other composite types. Each value in a List variable is called an
Element, and is referenced by its position in the List, known as an ‘index’. For
example, a List variable could be used to hold the examination scores obtained
by an individual for each question, e.g. ‘9, 9, 8, 10 …’. The score of the first
exam would be referenced as the first element (index=0), the second exam as
the second element (index=1), etc. Figure 17 shows a List Variable definition
block, entitled ‘exam_scores’, which is used to declare the List Variable and
optionally assign it an initialisation value.
A specific syntax using ‘[ ]’ (double square-brackets), i.e., ($)exam_scores[1], is
used to directly access a specific list member for use in expressions, see
Appendix 7.2.2.1 for more details.
Column Name UID First Name Last Name Date of Birth Average Score Member
Column Data Type Integer Text Text DateTime Float Boolean
Column
Figure 19 – Visual Representation of a Table Variable (with example data)
A Table generally has a fixed number of columns to describe a dataset, but rows
(records) can be added and removed as size of the dataset changes. For
example, a Table, designed to keep the data for all employees, has columns for
‘firstname’, ‘surname’, ‘age’ and ‘job title’. As a person joins the company, a
new record for that person will be added to the Table; when a person leaves the
company, the corresponding record will be removed from the Table.
Figure 20 shows a Table Variable definition block, entitled ‘all_employees’,
which is used to declare the Table Variable.
For more detailed information about Composite Variables, see Appendix 7.2.2.
Multi-type Variables
Multi-type Variables can accommodate values of multiple, different types and can be
viewed as generic data containers. Multi-type Variables should be used sparingly as it is
easy to inadvertently cause run-time errors that might not be identified during the testing
phase. However, there are situations where Multi-type Variables are really useful, for
example to receive a value of a type that is not known in advance from an external system.
The Multi-type Variable types available in Cortex are:
Quantity: A Quantity Variable can hold either an integer value (see Integer
Variable) or a floating point value (see Float Variable). Figure 21 shows a
Quantity Variable definition block, entitled ‘quantity_var’, which is used to
declare the Quantity Variable and optionally assign it an initialisation value.
Value: A Value Variable can hold any of the simple or complex variable types,
except for an Object variable; i.e. Integer, Float, Text, Boolean, List, Structure,
DateTime or Timespan. Figure 22 shows a Value Variable definition block,
entitled ‘value_var’, which is used to declare the Value Variable and optionally
assign it an initialisation value.
Any: An Any Variable can hold any information type, including data relating to
an Object Variable. Figure 23 shows an Any Variable definition block, entitled
‘any_status’, which is used to declare the Any Variable and optionally assign it
an initialisation value.
If it is necessary to persist the value of any variable from one Flow execution to another,
either the variable has to be made ‘Static’, or the Flow has to write the values to some
persistent media or system (e.g., file, database, or other system).
2.1.11 Semaphores
A Flow in Cortex can be simultaneously triggered and executed multiple times (a concept
called parallel execution). Each execution will follow its own path through the Flow based
on:
The initial values passed into the execution
The current values of data in external systems or database
The current state of infrastructure and the environment
The time of day
A similar concept is that of many cars simultaneously travelling on a town's road network,
each taking its own route depending on where it wanted to go in the first place, traffic
volumes, etc.
Sometimes it is necessary to restrict the number of cars on a section of the road, e.g. due
to a weak bridge. In that case some mechanism, e.g., a traffic light, is used to only allow a
certain number of cars onto that section of the road, forcing the others to either wait or
take a different route.
The same scenario can occur for multiple parallel Flow executions. For example, if an
external system can only support a maximum of 3 concurrent connections, any section of a
Flow that uses that system should be controlled to only allow 3 executions inside that
section, and other executions should wait their turn or branch away.
In Cortex this is achieved using a Semaphore, which is a special counter used to restrict
access to an area of a Flow to a configurable maximum number of simultaneous executions.
Before entering a protected area, each Flow execution checks the value of the associated
semaphore. If the semaphore is at the configured maximum, the flow execution is
prevented from entering the protected area and either has to wait or branch (depending on
the type of semaphore block used); if the Semaphore is not at its maximum the Flow
execution is allowed to enter the protected area, and the semaphore counter is increased.
As soon as an execution leaves the protected section of the flow the semaphore counter is
decreased, allowing the next flow in line to enter.
2.1.12 LivePortal
LivePortal is a component of Cortex that provides a web-based interface for user
interaction. Using a standard web browser, a user can:
Trigger the execution of a Flow
Observe real-time status information on the progress of the Flow execution
Interact with a Flow execution using web-forms
Note: It is possible for more than one user to edit their copy of a particular Flow at
the same time, however when any one of the users commit their changes to Cortex,
they will be warned if any other user’s changes will be overwritten.
3.2.1.1 Flows
Flows are organised hierarchically in Groups and sub-Groups, see Figure 27.
<Left-Click> the Flows icon to reveal a list of the top-level group, CORTEX;
Groups that contain sub-Groups, Flows or Subtasks will be denoted by a right-
arrow at the left of the Group name, see Figure 27.
<Left-Click> on a Group’s name to reveal its contents of sub-Group, Flows or
Subtasks.
<Left-Click> on a Flow’s or Subtask’s name to open that object in the main
display window.
<Left-Click> on the ‘+’ icon to the right of parent Group’s name, see Figure
27, to create a new sub-Group, Flow or Subtask within that Group container.
Property
Toolbox Viewer
If the contents of a window exceed the window’s size, scroll bars will automatically appear
at the right hand side and bottom edge of the window to enable the easy scrolling
throughout the window’s workspace.
Close Flow
Help
Currently selected workspace Current User
highlighted in dark grey
3.3.1.1 History
The History icon displays a list of the 10 most recently opened workspaces associated with
any of the Flows.
To navigate to a previously opened workspace within a Flow:
1 <Left-Click> on the History icon to reveal a dropdown list of all of the
workspaces, displayed hierarchically, that have been recently opened for any
Flow.
2 <Left-Click> on a workspace name, displayed in the dropdown, to open and
navigate to that workspace.
3.3.1.4 Help
This icon displays help for Cortex Studio, including detailed information on block
configuration, in a new tab on the current web browser.
3.3.2 Toolbox
The Toolbox is displayed to the left of the Main Display Area, see Figure 32, whenever a
Flow is open and Cortex Studio is in Edit Mode (default mode). The Toolbox contains a list
of palettes; each palette contains groups of related function blocks that can be used to
build a Flow.
Figure 32 – Toolbox
For more information on palettes and function blocks, see Section 4.2.
Within the Toolbox, it is possible to:
Expand an individual Palette to display all the associated Function Blocks.
Collapse an individual Palette to hide its associated Function Blocks.
Expand all the Palettes to display all the Function Blocks, using the Palettes
Window icon bar.
Collapse all the Palettes to hide all the Function Blocks, using the Palettes
Window icon bar.
Search for a Function Block within all the Palettes.
Select a Function Block from the Palette to be placed on a flow workspace.
To expand an individual Palette:
<Left-Click> on the down arrow to the right of the Palette’s name to reveal all
the Function Blocks associated with that Palette.
To collapse an individual Palette:
<Left-Click> on the up arrow to the right of the Palette’s name to hide the
function blocks associated with that Palette.
For more information on the Toolbox and Function Blocks, see Section 4.2.
Expand All
Collapse All
Search box
Commit Flow
Deploy to Server Get Master Version of this Flow
Save Delete
3.5.1.1 Undo
Reverses the previous action. The Undo facility can accommodate reversing the previous
50 actions.
3.5.1.2 Redo
Reverses the Undo action. This icon is only available to click immediately after the Undo
icon has been clicked. The previous 50 Undo actions can be reversed.
3.5.1.6 Save
Saves the Flow into the user’s repository on the Cortex server.
3.5.1.10 Delete
Deletes the Flow from the user’s repository and marked as deleted in the Master
Repository. If a Flow is marked as deleted in the Master Repository, it is no longer visible to
developers within Cortex Studio.
Current Mode
Switch to Edit Mode (Debug)
Start an Execution
Zoom In
1:1
Shrink Wrap
Close
3.6.1.3 1:1
Reverts the scaling of objects in the workspace to 1:1, i.e. the maximum object size.
3.6.1.4 Zoom In
Zooms-in to the workspace, making all the objects contained within it larger, enabling
better visibility of the objects contained in the workspace.
3.6.1.6 Close
Closes the workspace and any subordinate workspaces that are open.
Execution Viewer
Execution Viewer Hide/Unhide
Toolbar
{
List of current
executions
Selected execution
highlighted in blue
Figure 38 – Execution Viewer
Stop Tracking
Start Tracking
Show in LivePortal
Go To
3.7.1.5 Go To
Opens the workspace of the selected Flow, in which the Token, representing the current
point of execution, is located.
Note: This icon will not be available if multiple Flows have been selected.
3.8.1.1 Copy
Copies the selected State or States, including all child objects, to a clipboard. This option
is only available in Edit Mode.
Note: Copying a State duplicates all the objects contained within it. Therefore, all
aspects of the copied object should always be reviewed to ensure the correct
configuration and references.
3.8.1.2 Cut
Copies the selected State or States, including all child objects, to a clipboard, and deletes
the original selected States from the workspace. This option is only available in Edit Mode.
3.8.1.3 Delete
Deletes the selected State or States, including any associated connections, from the
workspace. This option is only available in Edit Mode.
3.8.2.1 Copy
Copies the selected Function Block or Blocks, including all child objects in the case of a Sub
Flow Block, to a clipboard. This option is only available in Edit Mode.
Note: Copying a Function Block duplicates all of its properties. Therefore, all
properties of the copied Function Block should always be reviewed to ensure the
correct configuration and references.
3.8.2.2 Cut
Copies the selected Function Block or Blocks, including all child objects in the case of a
Sub-Flow block, to a clipboard, and deletes the original selected objects from the
workspace. This option is only available in Edit Mode.
3.8.2.3 Delete
Deletes the selected Function Block or Blocks, including any associated connections, from
the workspace. This option is only available in Edit Mode.
3.8.3.2 Paste
Copies the contents of the clipboard to the workspace. This option is only available in Edit
Mode and when objects have been copied to the clipboard using the Copy or Cut context
menu options.
4.1 Introduction
4.1.1 Overview of Creating a Flow
Flows are created using a graphical approach to generate a visual representation of the
flow. This approach makes it easier to understand the steps that make up a Flow and
reduces errors, and also serves as documentation of the process.
Each block has a specific purpose, and its appearance reflects its function. Although the
purpose of each block is fixed, the detail of its activity is not; each block has one or more
properties specific to its purpose that must be configured in order to achieve the desired
outcome. For example, the ‘Copy File’ block has two properties: one identifies which file
to copy, and the other identifies the destination of the copied file.
4.1.2 Flows
A Flow holds all the logic and other entities that make up a logical process; see Figure 41.
Each Flow has a sub-workspace that contains:
A Flow starting point.
One or more States that represent the high-level stages of the Flow and contain
the detailed logic that defines the Flow.
A global Variables Store that holds the declaration of variables that are valid in
all of the States within this Flow. For more information on Variables, see
Section 2.1.8.3.
A Default Error Handler that is executed whenever an unhandled error is
encountered in the Flow in any of the States within the Flow. For more
information on error handling, see Section 4.4.8.
A Default UI Configuration object, used to define the default screen to be shown
on the LivePortal user interface when the flow is executing. For more
information on the Default UI Configuration and LivePortal, see Section 4.4.9.
Flow Start
States
When the Flow is initiated, execution begins at the Flow Start block and enters the first
State within the Flow’s workspace, where the detailed logic is executed; see Section 4.1.3.
When the logic in the first State has completed execution, the Flow will then proceed to
the second State (if applicable) or the Flow will terminate normally if there are no further
States to execute.
A
NOTE: Connector
with arrow showing
B direction of flow link
blocks together.
C
H
NOTE: Icon and
shape provides visual
representation of the
D block’s function.
F
J
NOTE: Junction
G indicating several
flows merging into
one.
K L
A Variables Store contains the declarations of variables that are only valid within
this State. Variables declared at the Flow level in a superior Variables Store are
valid in any of the States defined for this Flow.
B Start State block identifies the starting point of the Flow execution within this
State. Every State workspace has exactly one Start State block, which is
automatically included in the State’s workspace when the State is created.
Note: Having more than one entry point on a workspace (by cloning or
adding another entry point from a palette) will result in an error.
D Flow execution then proceeds to this function block from block ‘C’.
In this example, this function block is a ‘True/False Expression Evaluator’ flow
control block, drawn from the Branching Blocks palette. If the logical expression
is true, flow execution will continue downwards from the green-tick icon to block
‘E’; if the logical expression is false, flow execution will continue to the right from
the red-cross icon to block ‘F’.
E Flow execution will continue to this function block if the logical expression
evaluated in block ‘D’ is true.
In this example, this function block is a ‘Subtask’ activity block, drawn from the
Flows and States palette. The Subtask block contains its own sequence of function
blocks, presented as a single block at this level.
F Flow execution will continue into this function block if the logical expression
evaluated in block ‘D’ is false.
In this example, this function block is a ‘Post to Operator Logbook’ activity block,
drawn from the Miscellaneous palette.
H The optional State Error Handler block identifies a common point within the
State’s sub-workspace for the flow execution to proceed if an error condition
occurs that has not been handled by a Local Error Handler.
If the State Error Handler block is not present in a State’s sub-workspace and an
error condition arises, execution will be passed to the Default Error Handler at the
Flow level. The State Error Handler block is drawn from the Error Handling
palette.
I The first function block encountered after an unhandled error condition has
occurred in this State’s sub-workspace.
In this example, this function block happens to be a ‘Pattern Match’ decision
block, drawn from the Branching Blocks palette. This Pattern Match block uses
Regex to search for a pattern of characters within a text string; for example, it
could search for the pattern ‘Error E4’ within the source text of an error message.
If the pattern is found, execution will continue downwards from the green-tick
icon to block ‘J’, otherwise execution will continue to the right from the red-cross
icon to block ‘L’.
J Flow execution passes to this function block if a Regex match was found in block
‘I’.
In this example, this function block is a ‘Set Variable’ function block, drawn from
the Variable Blocks palette.
K This End State block is executed immediately after block ‘F’ or block ‘J’, directing
the execution to a different State.
Additional End State blocks may be drawn from the Flows and States palette.
L This block is executed if there was no Regex match found in block ‘I’.
In this example, this block is an ‘End Flow’ block, drawn from the Flows and
States palette. The End Flow block immediately terminates execution of the
Flow.
2 Hold down the <Shift> key and <Left-Click> on the additional blocks to be
selected.
Note: Individual selected blocks may be deselected by <Shift> and <Left-Click>
on the selected blocks.
<Left-Click> the required block and <Drag> it to the desired position. Any
connections to the block will be automatically rerouted.
If blocks are moved out of the workspace area, the workspace will automatically re-size to
accommodate the moved block.
2 <Left-Click> the Copy context menu option to copy the block to the
clipboard.
3 <Right-Click> the mouse in the target workspace to reveal a context menu.
Activity blocks also have an additional ‘error-handling’ connection point on the right edge
of the block, denoted by a red circle, which is optionally used to divert the Flow execution
if any error is raised by the function block.
There are two methods to connect two sequential blocks together to form a logical flow of
activities; ‘Connect Forward’ or ‘Connect Back’.
The example shown in Figure 47 depicts the properties associated with an Integer Variable
declaration block; the value for the Name property is preconfigured with the symbol
($)NO-NAME; this should be changed to a unique symbol to represent this variable.
TEXT
The value type of Text accepts free format text; however, care should be taken to ensure
that the text entered is relevant to the property. For example, the arithmetic operation to
be performed in the ‘Arithmetic Operation’ block, which is defined in the Arithmetical
Expression property, is entered as a text string. In this example, a character string, such as
‘1 + 1’, would be appropriate; however, a character string, such as ‘the cat sat on the
mat’, would be nonsensical.
Figure 48 shows the properties of the ‘Arithmetical Operation’ function block. Both the
Description property (optional) and Arithmetical Expression property (mandatory) should
be assigned Text type values. The Description property can be completed using a free text
format; the Arithmetical Expression property should be completed using meaningful text to
represent the desired expression.
The value of a variable may also be used within any Text type property value by enclosing
the variable name in double braces, for example {{MY-VARIABLE-NAME}}.
Example 1:
The Text variable, MY-VARIABLE, has the current value “JOHN”
Property assignment: Hello {{MY-VARIABLE}}
Result: “Hello JOHN”
Example 2:
The Integer variable, I-INPUT, has the current value ‘4’
The Text variable, T-INPUT, has the current text value “7”
Property assignment: {{I-INPUT}} * 3 + {{T-INPUT}}
Result: “4 * 3 + 7”
Text-based expressions may be either assigned directly to the property as described above,
or for more complex expressions involving variables, an Editor Dialog may be used.
VALUE
A Value is a literal value or a reference to a variable as the same type. For example, in the
‘Set Variable’ function block, if the target variable of the Save to property is of type
Integer, then the Parameter Value (i.e. Source) property must contain a literal value that is
a whole number (an integer) or reference a variable that is also of type Integer.
Table 1 details the variables types and literal values that may be used within a property of
type Value for each expected property type.
As is illustrated, a Text type target property can accept a wider range of input types,
provided the correct syntax is used, than, for example, an Integer type target.
Property Type
Boolean Integer Float Quantity Text
ALLOWED ALLOWED ALLOWED ALLOWED ALLOWED
Values Integer Any numeric value Any numeric value Numeric values must be
Literal permitted: values only cast to Text using
(including (including
true, scientific scientific double inverted
false notation) notation) commas, e.g. “128”
ALLOWED by Casting
Variable Type Referenced in Property Value
For the other types, namely: LIST, STRUCTURE, DATATABLE, DATETIME and TIMESPAN,
whenever a property value is assigned, the type of the source must match the type of the
target value.
To assign a value to a property using the Data Entry Field Property Editor Dialog (Variant 1):
1 <Left-Click> the ellipsis to the right of the property value field to open the
Property Editor Dialog.
2 If the data entry field contains an existing value, either modify that value
directly, or clear the contents of the data entry field to reveal a dropdown
menu of items to select.
The dropdown menu displays all the variables of a suitable type for the
property that are in scope; for more information on the scope of variables,
see Section 2.1.8.3. If the property accepts a Boolean value, the drop-down
list will also contain the Boolean literal vales of True and False.
If the mouse is hovered over a variable in the dropdown menu, the variable
description property, if set, will be displayed; see Figure 52 – Data Entry
Property Editor Dialog – Variable Description DisplayFigure 52.
3 <Left-Click> the required variable name or literal value from the drop-down
list.
4 <Left-Click> OK to save the property value and exit the Data Entry Field
Property Editor Dialog, or <Left-Click> Cancel to close Data Entry Field
Property Editor Dialog without saving any changes.
Variant 2 – Text and Variable Entry
This variant of Property Editor Dialog allows references to Text variables, or a Text value to
be formed from any combination of literal text, variables casted as text, or functions
casted as text.
Figure 53 – Data Entry Property Editor Dialog – Text and Variable Entry
To assign a value to a property using the Data Entry Field Property Editor Dialog (Variant 2):
1 <Left-Click> the ellipsis to the right of the property value field in the
Property Viewer to open the Property Editor Dialog. The Property Editor
Dialog will open with the ‘Reference an existing variable’ tab selected.
2 Enter the required data by either:
To assign a date and time to a property using the Data Entry Field Property Editor Dialog
(Variant 3):
1 <Left-Click> the ellipsis to the right of the property value field in the
Property Viewer to open the Property Editor Dialog.
2 If the data entry field contains an existing value, either modify that value
directly, or clear the contents of the data entry field to reveal the Date and
Time Picker, see Figure 54.
3 Select the required date and time.
4 <Left-Click> OK to save the property value and exit the Data Entry Field
Property Editor Dialog, or <Left-Click> Cancel to close Data Entry Field
Property Editor Dialog without saving any changes.
Dropdown List
of Actions
Note: A new element of a specific type can be created by <Left-Click> the down
arrow to the right of the Append menu option and selecting the appropriate type
required.
To add an additional element at the end of a Composite value:
1 <Left-Click> the Actions Menu icon to the left of element to reveal the
Actions Menu.
2 <Left-Click> the Append menu option to add a value after the selected
element.
3 Type the required value in the entry field(s) of the newly created element.
To add an additional element before an existing element:
1 <Left-Click> the Actions Menu Icon to the left of element to reveal the
actions menu.
2 <Left-Click> the Insert menu option to add a value before to the selected
element.
3 Type the required value in the entry field of the newly created element.
To duplicate or remove an element:
1 <Left-Click> the Actions Menu Icon to the left of element to be duplicated
or removed to reveal the actions menu.
2 <Left-Click> the Duplicate (to duplicate) or Remove (to remove) menu
option to add or delete an element.
When the Composite value has been created:
1 <Left-Click> OK to save the text to the property value and exit the
Composite Variable Property Editor Dialog, or <Left-Click> Cancel to close
the Composite Variable Property Editor Dialog without saving any changes.
3 <Left-Click> the ‘+’ icon to the right of the Group name to reveal a drop-
down menu, see Figure 60.
4 <Left-Click> the Group item from the drop-down menu to create a new
Group under the current Group container. The user will be presented with a
New Group properties form, as shown in Figure 61.
5 Provide a name for the new Group in the Name field, and optionally provide a
description of the Group in the Description field.
6 If it is necessary, alter the permissions authorising which user-groups may edit
or view this Group. To alter the permissions, <Left-Click> the up-arrow to
the right of Permission Groups to expand a matrix of authorisation rights, and
select the appropriate authorisation.
Additional Groups may be added to the Group hierarchy by navigating to the Group in which
the new Group is to be created and following Steps 3 to 6 detailed above.
1 <Left-Click> the down arrow icon to the right of the ‘Flow and States’
palette in the Palettes Window to reveal its associated blocks.
2 <Drag> the ‘State’ object from the Flows and States palette onto the Flows
workspace below the existing State.
3 Connect the new State to the existing States. See section 0 for details on how
to connect objects.
Note: Only Integer, Float, Quantity, Text, Boolean, Timespan, Value, Object, and
Any variable types support initialisation using literal values.
2 Set the Set-Initial-Value property to True, by either entering the literal value
‘True’ directly into the property value field or using the Property Editor Dialog
associated with this property.
3 Optionally set the Initial Variable property to True, using the method in Step
2 above.
See Table 2 for further information about the properties associated with a variable.
Some of these blocks can only allow a single type of target variable, for example the
‘Convert Variable to Text’ function block; other blocks can store their results in a variety of
different variable types; see Table 1 for the allowed target variables types and property
value types.
Note: Exceptions to Table 1 include the ‘Convert All Variables to Text’ and the
‘Convert Variable to Text’ function blocks, which always store their result in a Text
variable.
Note: The ‘Delete Variable’ block simply removes any value from the variable; the
variable may be used later in the flow only after it has a value assigned to it, for
example, using the ‘Set Variable’ function block.
For details on the specific functions of these blocks and their individual properties, please
refer to the Cortex Block Reference Guide, available from the Help icon.
Text Manipulation
Text manipulation is undertaken using blocks drawn from the ‘Text Manipulation’ palette;
many of these blocks have icons that are based on an uppercase, italic letter ‘T’, others
have icons based on a square-bracketed ‘RX’ symbol to denote Regex functionality, see
Figure 64.
The text manipulation blocks perform basic functions with Text variables, including:
changing text to upper or lower case; text pattern matching using Regex; etc. For more
information on Regex, see Section 2.1.10.
For details on the specific functions of these blocks and their individual properties, please
refer to the Cortex Block Reference Guide, available from the Help icon.
The ‘Create DateTime’ and ‘Create Timespan’ blocks assign values to DateTime and
Timespan variables respectively; the properties of these blocks allow each time element
(Day, Hour, Minute, etc.) to be assigned a value individually, either by entering a literal
value or by direct reference to an Integer type variable.
Other DateTime and Timespan function blocks allow the manipulation of DateTime and
Timespan variables, including:
Adding to, and subtracting from, the individual elements of DateTime and
Timespan variables either using a literal value or by direct reference to Integer,
Float or Quantity type variables.
Creating a Timespan from the difference between two DateTime variables.
Converting the values of DateTime and Timespan variables to, and from, other
Text type variables. For example, using the ‘DateTime to Text’ block with its
default conversion properties will yield a result similar to:
13/08/2014 02:00:01.
Note: This result is very different to the result obtained by using the ‘Set Variable’
function block to assign the same DateTime variable to a Text value, which simply
converts the underlying DateTime structure into text:
structure (YEAR: 2014, MONTH: 8, DAY: 13, HOUR: 2, MINUTE: 0, SECOND:
1, MILLISECOND: 0)
For details on the specific functions of the ‘DateTime and Timespan blocks’ and their
individual properties, please refer to the Cortex Block Reference Guide, available from the
Help icon.
Lists may be initialised when being declared, or they may be initialised during the flow
using the ‘Create List’, ‘Create from Delimited Text’ or ‘Create from File’ function blocks.
To initialise a List using the ‘Create List’ function block:
1 <Left-Click> the ellipsis at the right of the Initialisation Values property to
select the field to reveal the Property Editor Dialog.
2 Create the initialisation List or reference an existing List variable, see Section
4.2.11.3 for more information on the Property Editor Dialog.
To initialise a List using the ‘Create from Delimited Text’ function block:
1 Enter the delimited text, either literally or by direct reference to a Text
variable, into the Delimited Text property value field.
2 Ensure that the delimiter in the Delimiter property value field matches that
of the delimiters in the source text.
To initialise a List using the ‘Create from File’ function block:
1 Enter the source filename as text into the Source File property value field.
2 Ensure that the delimiter in the Delimiter property value field matches that
of the delimiters in the source file.
Lists may be manipulated in a number of different ways:
Elements may be inserted in any position into an existing List (‘Insert Element’
block).
Structure Manipulation
Structures are collections of named variables; each element of a Structure is independent
of other elements of the same Structure and can be of different variable types. The
manipulation of Structures is undertaken using blocks, drawn from the ‘Structure Blocks’
palette, that have icons that are based on three horizontal pairs representing the name-
value concept of each element of the Structure, see Figure 68.
Structures may be initialised when being declared, or they may be initialised during the
flow using the ‘Create Structure’, ‘Create from List’ or ‘Create from File’ blocks.
To initialise a Structure using the ‘Create Structure’ block:
1 <Left-Click> the ellipsis at the right of the Initialisation Values property to
select the field to reveal the Property Editor Dialog, see Section 4.2.11.
2 Create the initialisation Structure or reference an existing Structure variable.
To initialise a Structure using the ‘Create from Structure’ block:
1 Set the Save To property to reference the Structure to be created.
2 Set the Element Names property to assign the source List to be used to
initialise the Structure element names.
3 Set the Element Values property to assign the source List to be used to
initialise the Structure element values.
To initialise a Structure using the ‘Create from File’ block:
1 Set the Save To property to reference the Structure to be created.
2 Set the Source File property to reference the source file to be used to
initialise the Structure. The source file must be referenced by its full-path.
3 Set the Name Value Separator property to the correct separator character
used in the source file.
Structures may be manipulated in three different ways:
A new element may be added or an existing element may be modified in an
existing Structure (‘Add or Modify Element’ block).
An element may be removed from a Structure (‘Remove Element’ block).
An element value may be retrieved from a Structure (‘Get Element Value’
block).
The ‘Add or Modify Element’ and ‘Remove Element’ blocks manipulate Structures using the
principle of taking a source Structure, performing the required manipulation, and writing
the result back into a destination or target Structure. This enables the source Structure to
remain unmodified and its modifications written into a separate Structure. If it is not
necessary to keep the source Structure after the manipulation is performed, the source
Structure can be used as the destination Structure.
The following procedure provides an example of Structure manipulation using separate
source and destination Structures. This example demonstrates the configuration of the ‘Add
or Modify Element’ block, see Figure 69.
To modify an existing element within a Structure:
1 Set the Save To property to reference the destination Structure variable.
2 Set the Structure Variable Name property to reference the source Structure
variable.
3 Set the Element Name property to identify the element in the source
Structure to be modified.
4 Set the Element Value property to the new value for the named element.
Table Manipulation
Tables contain a number of fields, organised into a rectangular grid of rows and columns;
the fields in each row must be of the same type for any given column. Tables are most
often used as part of databases, with each row representing a separate record. The
manipulation of Tables is undertaken using blocks, drawn from the ‘Table Blocks’ palette,
that have icons that are based on a rectangular grid representing a table, see Figure 70.
Unlike other types of variables, Tables cannot be initialised when they are declared; they
can only be created during the flow using the ‘Create Table’ or ‘Clone Table’ blocks drawn
from the ‘Table Blocks’ palette, or using the ‘Query DB’ block, drawn from the ‘Database
Blocks’ palette. For information on creating a Table from a database query, see Section
4.4.7.2.
To create a Table using the ‘Create Table’ function block:
1 Set the Save To property to reference the Table to be created.
2 Set the Columns property to a literal Structure or to reference a Structure
variable.
Note: When using a Structure variable to define the columns, the Structure’s
elements have to be in the format ‘Column_Name:“Variable_Type”’; the values
entered as “Variable_Type” must only be variable types, e.g., “text”, “integer”,
etc.
3 If required, set the Primary-Key-Columns property to List value containing the
names of the columns to be Primary Keys.
Note: The values within the Primary Keys column should be unique within each
row.
New columns and rows, complete with values, may be added to an existing Table using the
‘Insert Column’ and ‘Insert Row’ blocks respectively. When adding a column, the field
values are referenced as a List; when adding a row, the field values are referenced either
as a Structure, where the Structure element’s name corresponds to columns in the table, or
as a List. If a List is used, it will be assumed that the first element of the List matches the
first column; the second element matches the second column, etc.
Similarly, the values contained in a Table’s columns or rows may be extracted using ‘Get
Column’ and ‘Get Row’ blocks respectively. Values extracted from a Table’s column are
stored in a List variable, whereas values extracted from a Table’s row are stored in a
Structure variable.
Columns and Rows may be deleted from Tables using the ‘Delete Column’ and ‘Delete Row’
blocks respectively. These two function blocks use the concept of a source and a
destination Table, enabling the source Table to remain unaltered by the manipulation.
The Table’s columns may be renamed or their properties modified, e.g., change the
Primary Key columns, by using the ‘Rename Column’ and ‘Modify Table Properties’ blocks
respectively.
Tables may also be manipulated by subtracting one Table (e.g., Table A) from another
(e.g., Table B) to form a third Table using the ‘Subtract Table’ block. This function block
subtracts from one Table any records, or rows, that match the Primary Keys (if specified),
or whole record (if no Primary Keys are specified), that are contained in the subtrahend
Table (i.e., Table A). Tables may also be manipulated by combining two Tables that have
the same schema, or column structure, to form a third Table using the ‘Join Tables’ block.
The most powerful Table manipulations are those that query the Table to extract data,
similar to a database query. The Table palette contains three distinct function blocks to
query Table variables:
‘Get Row Value / Single Row Query’ block to retrieve the value from a single
field of the Table and store it in a simple variable.
‘Multi-row Simple Query’ block to retrieve the values in a column from all the
rows in the Table that have values in another column that match a particular
value, storing the result in a List variable.
‘Full Query’ block to retrieve all the rows in a Table where the values in a
particular column match a query string, and place a copy of the resultant rows
in another Table.
Figure 71 shows an example configuration of the ‘Full Query’ function block acting upon a
source Table (MYTABLE) to query the column ‘USERAGE’ for values greater than 12 and
store any resultant rows in a second Table (RESULTSTABLE).
Note: References to column names within a query string must be enclosed in single
braces; e.g., ‘{ColumnName}’.
The query strings allowed in a full query are:
The comparative operators:
Greater than (‘>’)
Greater than or equal to (‘>=’)
Less than (‘<’)
Less than or equal to (‘<=’)
Equal to (‘=’)
Not Equal to (‘/=’)
For example: {USERAGE} > 12, or: {USERAGE} /= 12
The simile operator ‘like’ in conjunction with text string. The text string must
be enclosed in single inverted commas and percentage signs, i.e., ‘%string%’.
For example: {USERNAME} like ‘%e%’, which will search for the letter ‘e’ in
the USERNAME fields; in the example shown in Figure 71, the result from such a
query would result in the two rows containing the UserNames of ‘Fred’ and
‘Dave’.
The Boolean operators ‘AND’, ‘OR’ and ‘NOT()’, enabling complex queries to be
formed.
For example: {USERNAME} like ‘%e%’ AND NOT({USERAGE} > 12); in the
example shown in Figure 71, the result from such a query would result in the
row containing the UserName of Fred.
4.4.2.5 Loops
Loops are a special class of branching block in that they combine elements of a logical
expression decision block with other activities to enable the easy creation of a logic flow
that loops repeatedly until a certain condition is met.
For Loops
‘For Loops’ use a counter variable that is automatically set to the value contained in the
block’s Start-Index property at the initial execution of the loop. During each successive
execution of the loop, the value referenced in the Increment property is added to the
counter variable. The loop will exit when the counter variable is equal to the value
contained in the End-index property. Any of these properties may be assigned a value
contained within a variable, so that the number of times the loop is executed is dependent
on calculations performed in the flow during execution.
Note: The counter must be an Integer type variable.
Note: The Increment property can have a negative value.
See Figure 73 for an example of a ‘For Loop’ block used in a flow.
4.4.3 Semaphores
Semaphores are special objects that can only be accessed using Semaphore function blocks.
The only actions that can be performed with Semaphores are to ‘Check and Set’ the
Semaphore, and ‘Clear’ the Semaphore.
At the beginning of the activity to be protected, the Semaphore must first be checked to
ensure that no other instance of the flow has already set the Semaphore and is executing
the protected activities. If the Semaphore is clear, it should then be immediately set to
signal that this part of the flow is now protected; if the Semaphore is set, then either the
Flow execution should take a different path (to avoid the protected area) or this instance
of the Flow is queued in order to gain access to the protected area once the existing user
has left this part of the Flow and cleared the Semaphore.
The action of checking and setting the Semaphore is undertaken in a single function block.
At the end of the protected activity, the Semaphore must be cleared to allow other
instances of the Flow to use the protected area.
Cortex can not only provide exclusive access to a protected activity (i.e., only one instance
is allowed to execute the activity at once), but it can also provide restrictive access to a
protected area, i.e., it can limit the number of simultaneous executions within a protected
area; this is useful when external systems can only handle a certain number of
simultaneous connections.
Note: More than one Semaphore can exist within the same Flow; each Semaphore is
referred to by the name set in the Semaphore Name property.
Figure 75 – Example Use of ‘Check Semaphore’ and ‘Check Semaphore with Queue’
4.4.4 Subtasks
For larger or more complex flows, the use of Subtasks should be considered. A Subtask is a
collection of logic, encapsulated within a single block; however, any given Subtask may be
referenced multiple times within a Flow, or indeed in different Flows, thereby removing
the need to replicate the same logic in several different places. See Figure 77 for an
example of re-using Subtasks.
The activities performed by a Subtask are defined in a Subtask object, defined in a similar
way to a Flow; however, when this Subtask is subsequently invoked within a Flow, the
actual Subtask is referenced by a separate ‘Execute Subtask’ block, see Figure 76.
A Subtask has global scope within the Cortex system, and hence must have a unique name;
any Subtask may be called from any Flow, allowing the re-use of common logic between
Flows.
Subtasks may also be recursive, i.e. it is possible to put an ‘Execute Subtask’ block within
its own Subtask definition so that an execution of the Subtask will cause another execution
of the same Subtask, and so on.
Note: If Subtasks are nested in this way, the Subtask should contain logic to
prevent the Subtask invoking the execution of itself continuously, otherwise the
intended purpose of the Flow will not be achieved and the Cortex server will
eventually run out of memory.
An ‘Execute Subtask’ block, in common with all function blocks, may be cloned; cloning will
replicate all the Properties of the original, i.e., the clone will refer to the same Subtask
definition as the original. Therefore, it is necessary to check the Properties of the cloned
object to ensure that appropriate property values are set.
Variables may be passed to the Subtask for each instance of use, and its results passed back
to the calling flow. It is also possible to use global or local variables defined in the Flow
executing (or calling) the Subtask within the Subtask itself. However, care must be taken
when doing this as the different Flows invoking the subtask may not have the same
variables defined.
Note: Recommended practice is to pass variables into the subtask at the point
where it is executed.
To create a Subtask:
1 <Left-Click> on the Flows icon in the Menu Bar, to reveal the group
organisation of any existing Flows.
2 Navigate through the group hierarchy to the desired group in which to define
the Subtask.
3 <Left-Click> on the ‘+’ icon on the Group Title Bar to reveal a dropdown list
of actions.
4 <Left-Click> on Subtask to create a new Subtask.
Note: The variables that will be used to receive values passed to the Subtask flow,
and the variables that will be used to pass values back from the Subtask flow, must
be declared in the Subtask’s Variables Store. For more information on declaring
variables, see Section 4.3.4.
Link the main Flow’s ‘Execute Subtask’ block to the predefined Subtask flow and map the
variables to be passed:
Note: Before any variables can be mapped, they must be declared in the
appropriate Variables Store. For more information on declaring variables, see
Section 4.3.4.
1 <Left-Click> on the ellipsis to the right of Subtask-Name or Variables-To-
Pass property of the ‘Execute Subtask’ block to open the dedicated Property
Editor Dialog, see Figure 78.
Note: Selecting the dedicated Property Editor Dialog from the Variables-To-Return
property will activate the Property Editor Dialog, defaulting to the ‘Map Output’
tab. The ‘Execute Subtask’ block must be associated with a predefined Subtask,
using the ‘Map Inputs’ tab before any variables can be mapped.
2 <Left-Click> the To: field to reveal a list of available Subtasks, and select
the appropriate Subtask definition to link with this ‘Execute Subtask’ block.
To pass values to a Subtask:
1 Ensure the Map Input tab on the Property Dialog Editor is selected.
2 <Left-Click> the Add button to insert a new set of ‘value/variable to
variable’ mapping fields.
3 Enter the value or variable name to be passed to the Subtask using the
Property Editor Dialog activated by the ellipsis to the right of the left-most
field.
4 Enter the variable declared in the Subtask flow that will be used to receive
the passed value into the right-most field.
5 Add any additional values or variables to be passed to the Subtask by
following Steps 2 to 4; see Figure 79.
Note: The Flow variable and its corresponding Subtask variable must be of the same
Type.
4 Enter the variable declared in the main Flow that will be used to receive the
passed value into the right-most field.
5 Add any additional values or variables to be passed from the Subtask by
following Steps 2 to 4; see Figure 80.
Note: The Subtask variable and the corresponding Flow variable must be of the
same Type.
Wireless
Receivers
Wireless
Senders
Figure 81 – Wireless Senders and Receivers used in a Flow
Wireless Sender and Receiver blocks are drawn from the ‘Miscellaneous’ palette, see Figure
82.
Both the Wireless Sender and Wireless Receiver blocks each have two properties:
A mandatory Link Colour property, which defines the colour associated with this
block. The colour chosen must be from a defined list of colours, which are
accessible through the Property Editor Dialog.
An optional Description property, which can be assigned free format literal
text.
Note: There must be only one Wireless Receiver block of any given colour on a
workspace, otherwise Flow execution will fail.
Interface Retries
Properties
Interface Simulation
Properties
To define a custom list of text strings to match error messages received from the
underlying subsystem:
Set the Api-Call-Retry-Errors property to a List of the required text strings to
partially match any error messages received.
Command-Timeout
The Command-Timeout property defines the amount of time the function block will wait
for a response from the external database before an error is raised. If the function times-
out, then connection retries will be attempted in accordance with the Interface Retry
Properties, see Section 4.4.6.1.
In common with all API blocks, the database interaction blocks provide a third, dedicated
error-handling connection point on the right edge of the block to enable additional logic to
be followed to handle the error.
Interface Retries
Properties
Interface Simulation
Properties
Database Specific
Properties
Figure 84 – Database Open Connection Properties
Stored-Procedure-Name
The Stored-Procedure-Name property contains the name of the stored procedure to be
executed in the external database.
Arguments-Parameter
The Arguments-Parameter property contains any arguments, not already contained in the
Stored-Procedure-Name property, that are to be passed to the stored procedure when it is
executed.
Interface Retries
Properties
Interface Simulation
Properties
Database Specific
Properties
Figure 85 – Query Database Properties
Interface Retries
Properties
Interface Simulation
Properties
Database Specific
Properties
Figure 86 – Database Close Connection Properties
set, or interaction with an external system may fail if the external system is unavailable at
that time.
In either of these examples the Flow cannot continue its execution and an error condition is
raised. Cortex supports a number of ways in which these error conditions can be handled
to ensure that the overall flow can still complete in one way or another, or if the error is so
severe that the process cannot complete, allow compensatory actions to be taken such as
sending failure notifications to the appropriate people.
The ‘Block Error Handler’ intercepts textual error messages from the process generating
the error and parses the error message. If any of the error text matches any of the
elements stored in the Errors-Handled-By-This-Block List property, Flow execution will
proceed from the bottom of the block, otherwise Flow execution will proceed from the
right of the block. By default, each ‘Block Error Handler’ is configured to handle all errors.
The ‘Block Error Handler’ can also store the error message in a Text variable for subsequent
testing and processing.
For more information on these and other built-in functions, see Appendix 7.5.
Note: The name displayed in LivePortal can contain spaces and other non-
alphanumeric characters.
5 Set the Export-Description property to free format text that will be
displayed in LivePortal. The description can contain HTML formatting tags.
6 Optionally, set the Access Control property to a valid Access Control Entry
(ACE) in order to restrict access to predefined LivePortal users.
Note: If the Access Control property is not set, all LivePortal users will have access
to execute the Flow.
Note: The Cortex system administrator should provide details of the Access Control
Entries that have been set up for the specific Cortex installation. These are
typically configured to map to Active Directory security groups in order to control
access.
The Flow will automatically be exported into the LivePortal’s service catalogue on the
Cortex Debug Server when it is ‘deployed’ by the Flow Developer (provided that its Export
property is set to True).
Note: The action of Publishing the service request (Flow) to a Cortex Production
Server and the associated export to LivePortal can only be undertaken by an Admin
user.
Note: Flows will be organised in the same hierarchy as they are located in the
Group structure, and with the same Group names, defined within Cortex Studio.
Service Catalogue
Selected Service
Selected Service
Description
Figure 91 – LivePortal Service Catalogue
2 <Left-Click> the Start button at the lower right of the LivePortal home
screen to open the LivePortal Service Catalogue.
3 <Left-Click> the ‘+’ mark to the left of the service catalogue tree structure
to expand the tree to reveal the available Flows.
Note: The Flows visible and hence available to use are dependent on the user’s
Active Directory authorisation rights.
4 <Left-Click> the required flow to select it. The selected flow’s description
will appear to the right of the screen.
5 <Left-Click> either of the two Start buttons to initiate the selected Flow.
When the Flow has been started, the LivePortal user will be presented with the Flow’s
default web screen, see Figure 92, as defined in the ‘Default UI Configuration’ object. The
contents of the ‘Default UI Configuration’ object can be modified by the flow developer to
present a different default web screen, including the addition of additional ‘steps’ to the
Progress Display and other elements to be displayed.
Flow Progress
Display (Default)
Progress Indicator
Web part rendered from Device (Default)
flow’s default User
Interface Definition Abort Button
(Default)
To provide user interaction, the Flow can present the LivePortal user with additional web
pages and forms to enable the display of information and data to be entered that can be
processed by the flow logic. For further information, see Section 4.4.10.
The current ‘step’ of the Progress Display can be incremented (or selected non-
incrementally) to highlight to the LivePortal user the progress of the flow execution by
using the ‘Update Progress’ block, drawn from the ‘LivePortal Blocks’ palette.
The default layout of the ‘User Interaction’ block includes three buttons: ‘Back’, ‘Cancel’
and ‘Next’; Flow execution may be controlled, based on which of these buttons was
clicked, using the ‘UI Navigation with Timeout’ control, drawn from the ‘LivePortal Blocks’
palette. If the LivePortal user clicks on ‘Next’, data entered the web-form is submitted
back to the Cortex server.
The Timeout Seconds property of the ‘User Interaction’ block specifies the time allowed
before the web-form is automatically cancelled, causing the ‘UI Navigation with Timeout’
block to execute a different Flow path. An example of the use of the ‘UI Navigation with
Timeout’ control block in conjunction with the ‘User Interaction’ function block is shown in
Figure 96.
‘User Interaction’
function block
‘Update Progress’
function block
‘Delete Thread in
UI’ function block
“Terminate
LivePortal
Session”
Figure 96 – Example of ‘User Interaction’ and ‘UI Navigation with Timeout’ blocks
the lowest element in the tree structure may be selected to return a structure
of all elements in that branch.
Literal – Can contain any HTML markup that can be used to enhance the format
of the presented web-form, display images, play animation, use 3rd party
controls, etc.
HTML Button – Enables the execution of JavaScript code when clicked by the
LivePortal user.
Custom Script – Provides an object to contain JavaScript that can be attached to
a web control object, for example, an HTML Button.
Repeat Section (Start) – Marks the beginning of a section of LivePortal controls
that are to be repeated, e.g., a series of Text boxes where the properties of
each box differ in accordance with the elements of a List variable.
Repeat Section (End) – Marks the end of a section of LivePortal controls that are
to be repeated.
For a more detailed explanation on the use of the LivePortal controls and how data is
displayed and extracted from the submitted web-forms, see Section 4.4.10.2.
Note: By default, the Navigation Control is not displayed in the LivePortal rendered
web page. To make any of the buttons visible to the LivePortal user, the
Navigation Control must be set to be visible.
To make the Navigation Control (and any associated visible buttons) visible on the rendered
LivePortal web page:
1 <Left-Click> the Seq Block Navigation Config object to select it and display
its properties in the Property Viewer.
2 Set the Visible property to True.
To rename a Navigation Control button or make it inactive or invisible:
1 <Left-Click> the Seq Block Navigation Config object to select it and display
its properties in the Property Viewer.
2 To hide a button, e.g., the ‘Back’ button, set the Back-Button-Visible
property to False.
3 To disable a button, e.g., the ‘Back’ button, set the Back-Button-Enabled
property to False.
4 To change the label of a button, e.g., the ‘Back’ button label, modify the text
contained in the Back-Button-Label property.
Note: The ‘Cancel’ button and the ‘Next’ buttons may be modified similarly.
Additional LivePortal controls may be added to the User Interaction block’s workspace by
simply placing the appropriate control from the ‘LivePortal Controls’ palette in the desired
location on the workspace in a similar way to placing function blocks onto a workspace.
Note: The LivePortal controls are not connected to each other using block
connection points. LivePortal controls do not define an order of execution; they
define the position of web controls on the web page.
Figure 98 shows an example of three different LivePortal Controls that have been placed
and configured on a ‘User Interaction’ workspace:
1. Dropdown box
2. HTML Literal to improve the layout of the rendered web page. In this instance,
the HTML tag ‘<br/>’ has been used to insert a line break.
3. Checkbox
Note: The formatting of text in the workspace is not representative of the rendered
web-form; see Appendix 7.6.
Figure 99 shows how the example above is rendered in the web-form viewed by the
LivePortal user.
Note that the title text of the LivePortal controls is left justified, and that the text
associated with the Checkbox controls is automatically left-justified and wrapped, as the
forms use a flow layout as opposed to fixed layout, i.e.:
All rows of controls will start at the same position on the left side of the screen;
Controls placed next to each other will be displayed next to each other as long
as the browser window is wide enough. If the browser window is too small, the
controls will wrap and be displayed on the next line;
Empty space between ‘rows’ of controls are ignored; rows are placed directly
beneath each other. To force empty space, use an HTML literal control
containing one or more HTML ‘<br/>’ (line break) tags to force one or more
empty lines.
LivePortal controls are configured in a similar way to the function blocks using the Property
Viewer.
Most controls have additional properties that need to be set (although some are optional).
The key properties for each specific control are listed in the subsequent sections.
Integer
String
To ensure that the data entered is of the correct type and falls within a specified range,
the following properties should be set:
Currency,
[Range Validator – Date,
The data type of the value to be
Range Data Type] Double, “”
validated.
Property-Value Integer, or
String
[Range Validator –
The error message to be displayed if
Error Message] <text> “”
validation fails.
Property-Value
To ensure that the data entered matches a RegEx validator, the following properties should
be set:
Note: The regular expression syntax that has to be used here is standard C# .NET
regular expression syntax, rather than Cortex regular expression syntax. The reason
is simply that this expression will be evaluated within the LivePortal web server.
Displayed as...
Label Label
LivePortal Control LivePortal Control
as displayed in User as displayed in
Interaction Block LivePortal
Table 7 identifies the key properties required to configure the Label control, in addition to
any common properties shown in Table 4. For a full list of all the properties that are
available to customise the behaviour of this control, please refer to the Cortex Block
Reference Guide, available from the Help icon.
Displayed as...
Textbox Textbox
LivePortal Control LivePortal Control
as displayed in User as displayed in
Interaction Block LivePortal
Table 8 identifies the key properties required to configure the Textbox control in addition
to any common properties shown in Table 4. For a full list of all the properties that are
available to customise the behaviour of this control, please refer to the Cortex Block
Reference Guide, available from the Help icon.
Singleline (Default)
= Single line of text
Displayed as...
Button Button
LivePortal Control LivePortal Control
as displayed in User as displayed in
Interaction Block LivePortal
Table 9 identifies the key properties required to configure the Button control in addition to
any common properties shown in Table 4. For a full list of all the properties that are
available to customise the behaviour of this control, please refer to the Cortex Block
Reference Guide, available from the Help icon.
Displayed as...
Listbox Listbox
LivePortal Control LivePortal Control
as displayed in User as displayed in
Interaction Block LivePortal
Table 10 identifies the key properties required to configure the Listbox control in addition
to any common properties shown in Table 4. For a full list of all the properties that are
available to customise the behaviour of this control, please refer to the Cortex Block
Reference Guide, available from the Help icon.
Item-Values-Parameter property), which are not displayed to the user, can be associated
with the list of displayed options (contained in the Item-Texts-Parameter property).
Items selected in the list box by the LivePortal user, and their associated non-displayed
values, can be accessed using implied variables.
Figure 104 shows the appearance of the Dropdown List control on the ‘User Interaction’
workspace, together with example properties, to demonstrate its rendering in LivePortal.
Displayed as...
Dropdown Dropdown
LivePortal Control LivePortal Control
as displayed in User as displayed in
Interaction Block LivePortal
Table 11 identifies the key properties required to configure the Dropdown List control in
addition to any common properties shown in Table 4. For a full list of all the properties
that are available to customise the behaviour of this control, please refer to the Cortex
Block Reference Guide, available from the Help icon.
Figure 105 shows the appearance of the Checkbox control on the ‘User Interaction’
workspace, together with example properties, to demonstrate its rendering in LivePortal.
Displayed as...
Checkbox Checkbox
LivePortal Control LivePortal Control
as displayed in User as displayed in
Interaction Block LivePortal
Table 12 identifies the key properties required to configure the Checkbox control in
addition to any common properties shown in Table 4. For a full list of all the properties
that are available to customise the behaviour of this control, please refer to the Cortex
Block Reference Guide, available from the Help icon.
Displayed as...
Calendar
LivePortal Control Calendar
as displayed in User LivePortal Control
Interaction Block as displayed in
LivePortal
Table 13 identifies the key properties required to configure the Calendar control in addition
to any common properties shown in Table 4. For a full list of all the properties that are
available to customise the behaviour of this control, please refer to the Cortex Block
Reference Guide, available from the Help icon.
Displayed as...
Select Textbox
Table 14 identifies the key properties required to configure the Calendar Extender control
in addition to any common properties shown in Table 4. For a full list of all the properties
that are available to customise the behaviour of this control, please refer to the Cortex
Block Reference Guide, available from the Help icon.
Note: The selected value from the Calendar Extender control will be placed into
the associated Textbox control and returned to the Cortex server in the implied
variable of the associated Textbox control.
Grıd
LivePortal Control
as displayed in User
Interaction Block
Displayed as...
Grıd
LivePortal Control
as displayed in
LivePortal
Table 15 identifies the key properties required to configure the Grid control in addition to
any common properties shown in Table 4. For a full list of all the properties that are
available to customise the behaviour of this control, please refer to the Cortex Block
Reference Guide, available from the Help icon.
[Allow Column Filtering] Allows the LivePortal user to filter Literal boolean
Mandatory
Property-Value grid based on column contents (Default: True)
In addition to customising the grid behaviour using the properties on the grid, it is also
possible to influence the behaviour from the column settings of the input data table
variable, as detailed below:
Primary key columns: Users will not be able to enter new rows into the grid with a
duplicate combination of primary key values.
Nullable Columns: To indicate that when a new row is entered into the grid, the user need
not provide a value for this specific column.
Read Only columns: To indicate that the user should not be able to edit a value in this
specific column.
Double Grıd
LivePortal Control
as displayed in User
Interaction Block
Displayed as...
Double Grıd
LivePortal Control
as displayed in
LivePortal
Table 16 identifies the key properties required to configure the Double Grid control in
addition to any common properties shown in Table 4. For a full list of all the properties
that are available to customise the behaviour of this control, please refer to the Cortex
Block Reference Guide, available from the Help icon.
Displayed as...
Tree Selector
LivePortal Control
as displayed in User
Interaction Block
Tree Selector
LivePortal Control
as displayed in
LivePortal
Table 17 identifies the key properties required to configure the Tree Selector control in
addition to any common properties shown in Table 4. For a full list of all the properties
that are available to customise the behaviour of this control, please refer to the Cortex
Block Reference Guide, available from the Help icon.
Figure 112 shows the appearance of the Literal control on the ‘User Interaction’ workspace,
together with example properties, to demonstrate its rendering in LivePortal.
Displayed as...
Table 18 identifies the key properties required to configure the Literal control in addition
to any common properties shown in Table 4. For a full list of all the properties that are
available to customise the behaviour of this control, please refer to the Cortex Block
Reference Guide, available from the Help icon.
Displayed as...
HTML Button
LivePortal Control HTML Button
as displayed in User LivePortal Control
Interaction Block as displayed in
LivePortal
Table 19 identifies the key properties required to configure the HTML Button control in
addition to any common properties shown in Table 4.
Displayed as...
Custom Script
LivePortal Control Custom Script
(attached to Checkbox LivePortal Control
Control) as displayed in Is not displayed in
User Interaction Block LivePortal
Table 20 identifies the key properties required to configure the Custom Script control in
addition to any common properties shown in Table 4. For a full list of all the properties
that are available to customise the behaviour of this control, please refer to the Cortex
Block Reference Guide, available from the Help icon.
For further information and for more detail on the properties of LivePortal controls, refer
to the Cortex Block Reference Guide, available through the Help icon.
5.1 Overview
The flow should be fully tested to ensure correct operation and avoid errors. Typically,
there are normally three sources of errors:
1. I/O errors, which unexpectedly occur when interacting to external systems, for
example, a communications error with the external system, or reception of
unexpected information, including users entering invalid information via
LivePortal.
2. Logical errors, where a mistake has been made in the construction of a flow; for
example, the failure to declare a variable before use.
3. Semantic errors, caused by the developed logic not representing the intended
outcome.
5.2 Testing
The amount of testing that is undertaken depends on how critical the Flow is to the
business’ success. Flows that are business critical should be thoroughly tested with a wide
range of possible inputs to test every eventuality within the Flow.
Note: It is essential that the level of testing required is identified and documented
before embarking the testing process itself.
Testing can be undertaken either in a ‘live’ environment, where Cortex is connected to any
3rd party systems with which the Flow is required to interact, or in a ‘simulated’
environment, where data received from 3rd party systems is simulated within the system.
5.3 Debugging
Cortex Studio provides a powerful set of tools to enable the effective debugging of Flows
should an error be detected in the testing phase.
In addition to visually showing the current point of execution, the Token also contains the
‘current state’ associated with the specific Flow execution.
5.3.1.2 Observation of Flow Execution with the Flow Execution Display Window
Observation of the flow execution from the Execution Viewer enables the execution
progress of all executions of the flow to be monitored simultaneously.
The Execution Viewer is automatically displayed at the bottom of the Main Display Area
when Debug Mode is entered, and can be minimised or expanded by <Left-Click> on the
dark grey handle at the top of the Execution Viewer.
In the example of the Execution Viewer shown in Figure 116, two simultaneous executions
of the Flow can been seen. The upper Flow instance is currently paused at a breakpoint in
the workspace ‘State-1’ prior to executing a ‘Set Variable’ function block; the lower is
currently in the process of executing a ‘Get Element’ function block in workspace ‘State-1’.
5.3.2 Tracking
During debug, the Token is automatically ‘tracked’ as it progresses through the Flow, with
workspaces that the Token enters being automatically opened to make the Token visible.
Note: Only one instance of the Flow can be tracked at any one time.
5.3.3 Breakpoints
A breakpoint can be set before any function block, which will pause the Flow execution at
the breakpoint, above the block to be executed next.
With the Flow execution paused at the breakpoint, it is possible to examine all of the
variables that have been assigned a value, review the error history associated with the
current execution of the flow, and identify any errors associated with interfaces to 3 rd
party systems.
Once all the debugging checks have been completed at this point, the Token may be:
‘Stepped’ to execute the next function block and paused again, or
Resumed to run continuously, or until the next breakpoint is encountered.
See Section 5.3.3.4 for more information about continuing the execution of the flow.
Figure 118 – Execution Information – Display Variables (List and Table variable examples)
2 <Left-Click> on the ‘Show in LivePortal’ icon, see Figure 39, to open a web
browser and instantiate a LivePortal session.
Or:
1 Open the LivePortal website using a web browser.
2 <Left-Click> the My Running Requests hyperlink on LivePortal’s main menu
bar to open the current flow executions display associated with the logged on
LivePortal user.
3 <Left-Click> the View hyperlink at the left of the Flow instance to establish
a session with it.
2 <Left-Click> the Step the execution icon, see Figure 39, to execute the
current block and pause at the next block
2 <Left-Click> the Continue the execution icon, see Figure 39, to continue
the execution.
6.2 Troubleshooting
6.2.1 Testing and Executing a Flow
the flow and determine if it is paused at a breakpoint. For further information about the
Executions Viewer, see Section 5.3.1.2.
For more information about declaring variables and variable block’s properties, see Section
4.3.4.
Another cause of variables providing unexpected values is that they are being referenced
incorrectly within the function block. Cortex provides two methods to reference a
variable, either directly, i.e. the variable’s data is used in its native form, by using the
syntax($)VariableName, or by using its contents as text, by using the syntax
{{VariableName}}.
7 Appendices
7.1.2 Planning
The planning stage is important to ensure that the project’s goals are clearly defined, the
stakeholders are ‘bought-in’, relevant information is made available, and the end results
meet the goals to everyone’s satisfaction.
7.1.2.5 Documentation
After the process has been designed, documentation should be created that captures the
flow design, the necessary information exchanges between external systems and any
necessary procedures that should be followed.
7.1.2.6 Sign-Off
With the goal identified, the process designed and the documentation completed, the
project should be signed-off with the stakeholders to ensure that the project does not
change over time due to informal enhancements.
7.1.4 Test
After implementing the process flow using Cortex Studio, the Flow should be thoroughly
tested to ensure that it meets the agreed goals and is free from errors. The initial testing
of the flow can be achieved within Cortex Studio.
7.1.5 Release
Having ensured that the automated process works as designed and is free from errors, the
automated flow can then be released into the production environment.
Declaration
Float variables must be declared in a Variables Store before they can be used. Declaring a
variable does not assign a value to the variable (unless it is ‘Initialised’ at the same time);
it simply creates the variable that is then available for use.
Initialisation
Float variables may be initialised when the Float variable is declared, or it may be assigned
an initial value using the ‘Set Variable’ block from the Variable Blocks palette.
Declaration
Timespan variables must be declared in a Variables Store before they can be used.
Declaring a variable does not assign a value to the variable (unless it is ‘Initialised’ at the
same time); it simply creates the variable that is then available for use.
Initialisation
Timespan variables may be initialised when the Timespan variable is declared by entering
the required initialisation value in seconds; the initialisation value can contain up to three
decimal places to accommodate spans involving milliseconds. Alternatively, a Timespan
variable may be assigned an initial value using the ‘Create Timespan’ block from the Date
and Time palette.
Declaration
Table variables must be declared in either a Variables Store before they can be used.
Declaring a variable does not assign a value to the variable; it simply creates the variable
that is then available for use.
Note: It is not, at present, possible to ‘Initialise’ a Table variable at the time of its
Declaration.
Initialisation
Table variables cannot be initialised at the time of declaration. Table variables can only be
initialised by either using the ‘Create Table’ function block and populated using blocks
from the Table Blocks palette, or defined and populated using the ‘Query DB’ block from
the Database Block palette to query an external database to bulk load multiple records into
a Table variable.
Each Record within a Table is inserted, deleted or modified, one at a time, using Blocks
from the Table Blocks palette. If required, columns may be added or removed at any time
during the execution of a flow using blocks from the Table Blocks palette.
Blocks are available to query a single value (Field) within a Table, complete Records
(Rows), create a List of column values and even create a new Table based on a composite
query acting upon the source Table. For further information on Table manipulation, see
Section 4.4.1.3.
Declaration
All Any variables must be declared in a Variables Store before they can be used. Declaring
a variable does not assign a value to the variable (unless it is ‘Initialised’ at the same
time); it simply creates the variable that is then available for use.
Note: It is not possible to ‘Initialise’ an Any variable with an Object type value at
the time of its Declaration.
Initialisation
An Any variable may be initialised when the Any variable is declared (except for assigning
an Object type value), or it may be assigned an initial value using the appropriate function
block for the type of value being assigned.
For any of the variable types, more complex expressions may be formed using the Boolean
operators: AND, OR or NOT. For example, the following expression checks to ensure that the
variable username is neither ‘admin’ nor ‘root’; i.e. if username is either ‘admin’ or
‘root’, the expression will evaluate to False:
(‘{{username}}’ /= ‘admin’) AND (‘{{username}}’ /= ‘root’)
Finally, here is an example of an expression which evaluates to True if the ‘username’ is
not ‘rafa’, the user is an administrator, and the number of connections divided by two is
not greater or equal to 100; if any of these conditions is not met, then the expression will
evaluate to False:
(‘{{username}}’ /= ‘rafa’) AND {{is-administrator}} AND NOT(({{number-of
connections}} /2) >= 100)
Operator Description
OR Logical OR
= Is equal to
/= Is not equal to
Example 1:
Source text: “This is an equation: 1+1=2”
Regex: Th<whitespace>+is
Match: No match
Example 2:
Source text: “This is an equation: 1+1=2”
Regex: (is<whitespace>)+
Match: “This is an equation: 1+1=2”
{ Open brace Used to denote the start of a range, see Section 7.4.1.4. \{
Plus sign Used after an expression to denote a match of one or more
+ contiguous instances, see Section 7.4.1.14.
\+
Asterisk Used after an expression to denote a match of zero or
* more contiguous instances, see Section 7.4.1.13.
\*
Question mark Used after an expression to denote a match of zero or one
? instances, see Section 7.4.1.15.
\?
Full stop or
. period
\.
Raw text of the most recent error The remote server returned an
f_Error-Raw without context information, e.g., error: (500) Internal Server
date, time, function block etc. Error.
f_Export-Name Export name for the current flow. ‘Add new Employee’
f_Get-Date-Time Date & time in abbreviated format. 15-Dec-2013 17:57:32
The Navigation Control Button block is always displayed at the bottom of the web-form, no
matter where it’s placed relative to LivePortal controls on the workspace; see Figure 122.
Figure 122 – Navigation Control Button Block is Always Displayed at the Bottom
Note: Although the Block Navigation Control buttons may be place anywhere on the
worksheet, it is recommended that they place at the bottom of the worksheet to
improve the visibility of the layout.
Two LivePortal controls, placed side by side on the workspace will be displayed to the
LivePortal user as directly adjacent to each other, separated by a single space; see Figure
123. If a single control is too wide to be displayed on the user’s browser, a scroll bar will
automatically be displayed to enable the use to scroll to view the whole control.
Note: If the Title property is used on horizontally adjacent controls, all the text of
the Title properties will appear together, before the actual controls themselves;
see Figure 124.
Figure 124 – Text in Title Properties of Adjacent Controls is Always Displayed at the Left
In order to label controls that are to be displayed horizontally adjacent to each other, do
not use the control’s Title property, but instead insert a Label control before each control;
See Figure 125.
Controls need not to be placed directly aligned with each other to form an adjacency, nor
does there have to be clear space between the controls (i.e., the controls can overlap), for
the controls to be displayed correctly; see Figure 126.
Note: It is recommended and good practice that the controls are laid out in a tidy
and organised fashion on the workspace in order to enable easy visibility of the
intended layout of the rendered display.
If the web page displayed to the user is not wide enough to display all the horizontally
adjacent controls on a single line, then the controls will wrap onto the next line; see Figure
127.
Figure 127 – Text will be Wrapped if Controls Exceed Display Page Width
Multiple HTML tags may be inserted within a relevant field, for example, if the Property-
Value property of the ‘Text’ group properties of a Label control was set to:
<b style=”color:Red;”>This text is bold</b><br/><i style=”color:blue;”>This
text is italicised.</i>,
The resultant rendered web-form would be displayed as shown in Figure 129.
However, where empty tags, e.g. <br/>, are used, or if the inline formatting covers a
number of sequential elements, e.g. using the <div></div> tags, then the use of the Literal
control should be preferred. For example, the Literal control is used to format the
following example to make the workspace layout more representative of the LivePortal
displayed web-page, see Figure 130.
Note: The Literal is regarded at an element within the web-page and inherently
introduces a line-break. Using a line-break tag (<br/>) within the Literal causes
two line breaks (one inherently, and one from the explicit HTML tag), see Figure
130.
It is not possible to format the appearance of the controls themselves using inline HTML
tags. To format the actual controls themselves, Cascading Style Sheet (CSS) Classes should
be used.
Figure 131 – CSS Class Applied to Label and HTML Literal Controls
Table 24 below details the behaviour and precedence of the CSS class and inline HTML tags
applied to various LivePortal control properties.
Note: that the Label and Literal controls have different behaviour characteristics to
each other and the other LivePortal controls.
Highest Lowest
Precedence Precedence
Additive &
Literal Overrides lower Not Affected Affected
precedence formatting
Figure 132 and Figure 133 show the behaviour and precedence of workspace section
formatting, CSS classes applied to LivePortal controls and inline HTML Tags; Figure 132
shows the layout in the workspace of a ‘User Interaction’ block; Figure 133 shows how the
rendered web-form is formatted.
Figure 132 – CSS Classes and HTML Tag Behaviour and Precedence on Workspace
Figure 133 – CSS Classes and HTML Tag Behaviour and Precedence on Web-Form
8 Index
1:1 ............................................................................................................ 35
Activity blocks ........................................................................................ 14, 60
Add Breakpoint ............................................................................................ 38
Add note .................................................................................................... 38
Any variable .......................................................................................... 21, 130
Automation .................................................................................................. 8
Block configuration ....................................................................................... 47
Block error handling ...................................................................................... 82
Block Icon ................................................................................................... 15
Blocks ........................................................................................................ 14
Boolean variable ................................................................................ 18, 50, 126
Breakpoints ............................................................................................... 115
Button control.............................................................................................. 98
Button Control ............................................................................................. 98
Calendar Control ........................................................................................ 102
Calendar Extender Control ............................................................................ 103
Cancel flow execution .................................................................................. 119
Cascaded Style Sheets .................................................................................. 147
Checkbox Control ........................................................................................ 101
Clone.................................................................................................... 37, 38
Close ......................................................................................................... 35
Close Flow .................................................................................................. 29
Collapse All ................................................................................................. 31
Commit Flow ............................................................................................... 33
Composite variable ................................................................................... 19, 63
Connect Backward......................................................................................... 45
Connect Forward .......................................................................................... 45
Connecting blocks ......................................................................................... 44
Connection-String ......................................................................................... 79
Context menus ............................................................................................. 37
Continue flow execution ........................................................................... 36, 119
Cortex ........................................................................................................ 8
Cortex Gateway ............................................................................................. 9
Cortex Gateway User Interface ......................................................................... 25
Cortex Studio ............................................................................................9, 25
Cortex Studio User Interface ............................................................................ 27
Current user ................................................................................................ 28
Custom form................................................................................................ 91
Custom Script Control .................................................................................. 111
Custom web-form ......................................................................................... 89
Cut ...................................................................................................... 37, 38
Data entry validation ..................................................................................... 95
Database .................................................................................................... 79
DateTime variable ......................................................................... 18, 62, 63, 126
Debug Mode ................................................................................................ 33
Debugging ........................................................................................... 113, 114
Save .......................................................................................................... 33
Scope of variables ......................................................................................... 21
Semantic errors .......................................................................................... 113
Semaphores ............................................................................................ 23, 72
Seq Block Navigation Config ............................................................................. 92
Service Catalogue ................................................................................... 86, 121
Service Request Catalogue............................................................................... 23
Set Next Block to Execute ............................................................................... 38
Show in LivePortal......................................................................................... 37
Shrink Wrap ................................................................................................. 35
Signalling an error ......................................................................................... 85
Simple variable ............................................................................................ 18
Simple variable manipulation ........................................................................... 60
Simulated interaction................................................................................... 113
Single step ................................................................................................ 118
Software version ........................................................................................... 26
Start an execution .................................................................................... 32, 34
Start State block ...................................................................................... 41, 42
Start tracking .............................................................................................. 37
State ...................................................................................... 12, 39, 41, 42, 58
State Error Handler ............................................................................ 42, 83, 120
Static variable ............................................................................................. 22
Step the execution ........................................................................................ 36
Stop tracking ............................................................................................... 37
Structure manipulation ................................................................................... 65
Structure variable ................................................................................... 19, 128
Subtask ...................................................................................... 12, 42, 73, 120
Switch to Edit Mode ....................................................................................... 34
SYMBOL ...................................................................................................... 48
Table manipulation ....................................................................................... 67
Table variable ........................................................................................ 20, 128
Terminate LivePortal session ............................................................................ 89
Testing .................................................................................................... 113
TEXT ......................................................................................................... 48
Text manipulation ......................................................................................... 61
Text variable .............................................................................. 18, 50, 125, 132
Textbox Control ........................................................................................... 97
Timespan variable .............................................................................. 19, 63, 126
Token ...................................................................................................... 121
Toolbox ................................................................................................. 29, 43
Toolbox Icon Bar ........................................................................................... 30
Toolbox Search............................................................................................. 31
Tracking ................................................................................................... 115
Tree Selector Control ................................................................................... 108
TRUTH-VALUE .............................................................................................. 48
Types of variables ......................................................................................... 18
Undo ......................................................................................................... 32
User Interaction ...................................................................................... 24, 71
User Interaction palettes ................................................................................ 17
VALUE........................................................................................................ 49