Service Manager

### Supported Operators

The following categories of operators are supported:

Arithmetic Operators: These operators are strictly used with numeric operands.

Boolean Operators: These operators are used for operands that yield Boolean values (for example, values from logical fields, values from relational comparisons, etc.).

Relational Operators: These operators are used with numeric operands for numerical comparisons. If one or both of the operands contain a string value, the type of comparison is instead based on lexicographical ordering.

Equality Operators: These operators are used for testing for (non)equivalence for Boolean, DateTime, numeric, and text values.

Bitwise Operators: These operators are used to perform Boolean operations on each bit of an integer.

DateTime Interval Operators: These operators are used with the DateTime functions.

The operators supported in Service Manager are:

Category Name Operator
Arithmetic Subtraction -
Arithmetic Multiplication *
Arithmetic Division /
Arithmetic Remainder %
Boolean NOT !
Boolean AND && or AND
Boolean OR || or OR
Relational Less Than <
Relational Greater Than >
Relational Less Than or Equal <=
Relational Greater Than or Equal >=
Equality Equal == or = or <>
Equality Not Equal !=
Bitwise AND &
Bitwise OR |
Bitwise Exclusive OR ^
Bitwise Complement ~
Bitwise Left shift <<
Bitwise Right shift >>
DateTime Interval before
DateTime Interval not before
DateTime Interval during
DateTime Interval not during
DateTime Interval after
DateTime Interval not after

### Operator Precedence

The following table illustrates the order of precedence of the operators, from highest to lowest precedence.

Operators in the same row have the same precedence, which are evaluated from left to right, based on the appearance of the operators in the expression.

Category Operators
Boolean NOT

!

+ (unary)

- (unary)

~

NOTE: The + (unary) and - (unary) operators are not the same as the + (additive) and - (additive) operators.

Membership and DateTime interval

in

not in

before

not before

during

not during

after

not after

Multiplicative

*

/

%

+

-

Left and right shift

<<

>>

Relational / Equality

<

>

<=

>=

==

!=

Bitwise AND

&

Bitwise OR

|

Bitwise exclusive OR

^

Boolean AND

&&

Boolean OR

||

You can use parentheses to control precedence and associativity. When you save an expression, if you did not specify parentheses, the application automatically adds additional parentheses.

For example, if you enter the following expression:

\$(3 + 4 * 5)

When you save it, the application displays the expression as:

\$(3 + (4 * 5))

This is consistent with the order of precedence as shown in the previous table.

The Boolean operators (||, &&) are short circuiting:

For expressions like \$(Expr1 || Expr2), if Expr1 evaluates to true, then Expr2 is not evaluated.

For expressions like \$(Expr1 && Expr2), if Expr1 evaluates to false, then Expr2 is not evaluated.

For the Boolean AND (&&) and Boolean OR (||) operators, while defining the expression, you can opt to specify the operators as AND or OR, respectively. The application automatically converts them to && or || when you save the expression.

For example, if you define the if expressions as:

\$(if Expr1 AND Expr2

then

...

else

if Expr1 OR Expr2

then

...

else

...

)

The application saves the respective expressions as:

\$(if Expr1 && Expr2

then

...

else

if Expr1 || Expr2

then

...

else

...

)

### Binary Operators

Service Manager recognizes the following binary operators:

in, not in, before, not before, during, not during, after, not after, *, /, %, +, -, <<, >>, <, >, <=, >=, ==, !=, &, |, ^, &&, and ||

You can also use AND and OR instead of && and ||.

For example:

\$(Status == "Closed" || Status == "Denied")

This conditional expression can be found as a read-only condition in the Layout Editor. If the value returned is true, then the status is closed and the form field becomes read-only. If the value returned is false, then the status is denied.

Prior to Service Manager Release 2015.2, you could use & instead of && and you could use | instead of ||.

Starting in Service Manager Release 2015.2, you can no longer use & and | in place of && and ||, as & and | are now used as bitwise operators.

If you have existing expressions that use & and | in place of && and ||, you must update them to use && and ||

For example, when constructing an operator in the If block of the Workflow Designer, you can use binary operators:

1.Enter a title in an If block. An example is Need additional approval.

3.Select a field as an operand. An example is Type of change.

4.Apply an additional operator. An example is Not equal to (<>).

5.Select a value. An example is Standard.

Based on the outcome of this expression, the exit port of the If block can connect to a different block, creating a different path within the workflow.

### Boolean and Bitwise Operators

The && (AND), || (OR), and ! (NOT) operators have Boolean operands and evaluate to a single Boolean value. && and || operators are short-circuiting, meaning that the right operand is not evaluated if the left operand determines the value result of the operator. This is only important if the right side expression has side effects, for example, in the case \$(x && Prompt(...)).

The Prompt function is executed only when x is true. If x is false, the result of the && operator is always false regardless of the value of the Prompt function, and therefore the right operand is not executed in this case.

There are several new bitwise operators. Unlike the Boolean operators, these work on the individual bits of an integer value, treating a 0 it as false and 1 as true.

The bitwise operators are often useful in conjunction with hexadecimal literals, since the bit pattern of the resulting value is more apparent, for example, \$(m & 0#f0f7).

Operator Example Description
| \$(m | n)

Applies the OR Boolean operation to each bit of m with the corresponding bit of n.

& \$(m & n)

Applies the AND Boolean operation to each bit of m with the corresponding bit of n.

^ \$(m ^ n)

Applies the exclusive-OR Boolean operation to each bit of m with the corresponding bit of n. The exclusive-OR operation yields true if either of its left and right operands is true, but not both.

~ \$(~m)

Applies the NOT Boolean operation to each bit of m.

<< \$(m << j)

Shifts the value of m left i bits. If j is greater than the length of m, it will yield zero.

>> \$(m >> j)

Shifts the value of m right i bits. If j is greater than the length of m, it yields zero.

### DateTime Interval Operators

DateTime interval operators consist of a pair of DateTime values that represent the start and end. They are often a calendar interval but do not have to be.

after means after the end of the interval.

not after means not after the end of the interval.

before means before the beginning of the interval.

not before means not before the beginning of the interval.

during means during the interval.

not during means not during the interval.

See Interval, Day, Week, Month, Quarter, and Year for information about built-in functions that use these DateTime interval operators.

### About the In and Not In Operators

The in and not in operators can function on the server, on the client, and in Microsoft SQL queries.

The syntax is as follows:

Text1 in ("one", "two", "three", ...)

Int2 in (3,33,333, ...)

The right side of the operator is a comma-separated list of values surrounded by parentheses. Starting in Service Manager Release 2015.2, the values do not need to be constants. Therefore, the following example is valid: Status in ("Open", "Log" + "ged", Status).

You cannot include null in the list. For example, Status in (null, "Open") is not valid.

The right side of the in and not in operator expressions can also be any built-in function that computes a list. Currently, the only ways to compute a list are by using the built-in functions called CurrentUserTeamNames and CurrentUserTeamIds.

The CurrentUserTeamNames function is now implemented on the client, on the server, and in Microsoft SQL queries, including in data segregation and in read-only and required rules. It appears in the function list in the expression editor for each of these kinds of expressions.

The CurrentUserTeamIds function is only implemented on the server.

Therefore, expressions like \$(OwnerTeam in CurrentUserTeamNames()) now work.

A conditional expression is a tool that lets you evaluate alternatives depending if a condition is true or false. You can enter conditional expressions using the if statement in the following syntax:

\$(if condition then whenTrue else whenFalse)

This expression has three parameters:

condition: The condition for which to test.

whenTrue: The value to return if the condition is true.

whenFalse: The value to return if the condition is false.

Service Manager only evaluates either the whenTrue or whenFalse value, based on the outcome of the condition.

You can nest if expressions within one another, so that the return value of one if expression feeds into another expression. It is most common to nest an if expression in the else part of another if expression. It is also possible to nest in the then and if parts of the expression, but that is less common. In all cases, note that the Service Manager expression syntax \$() applies to the outermost expression.  You do not need to use the \$() syntax anywhere within the nested expression.

### Conditional Expression Examples

The following expression return false if the incident status has a value of logged; otherwise, it returns a value of true:

\$(if Status == "Logged" then false else true)

The return value of this conditional expression can then be used, for example, to determine when the Owner field in the Incident business object is mandatory (that is, when the status has a value other than logged):

Owner is required when \$(if Status == "Logged" then false else true)

The following is a more complex example of a conditional expression. It is in a default incident editing rule and specifies the priority change to make when the urgency and impact fields are changed:

\$(if Urgency == "High" && Impact == "High"

then "1"

else

if Urgency == "High" && Impact == "Medium" || Urgency == "Medium" && Impact == "High"

then "2"

else

if Urgency == "High" && Impact == "Low" || Urgency == "Medium" && Impact == "Medium" || Urgency == "Low" && Impact == "High"

then "3"

else

if Urgency == "Medium" && Impact == "Low" || Urgency == "Low" && Impact == "Medium"

then "4"

else "5"

)

In this case, each combination of urgency and impact field values specifies the priority level from 1 to 5.

### Using the Case Expression

There are two types of case expressions: Boolean and value.

#### Boolean Case

The Boolean case expression is similar to an if-then-else statement.

For example, this statement:

case

when a > 0

then 44

when a < 0

then 22

else 11

is equivalent to this statement:

if a > 0 then 44 else if a < 0 then 22 else 11

The application executes the case statements in order. You can also nest case expressions, as in this example:

case

when a > 0 then case

when b > 0 then 11
when b < 0 then 22
else 33

when a < 0 then case

when b > 0 then 44
when b < 0 then 55
else 66

else case

when b > 0 then 44
when b < 0 then 55
else 66

#### Value Case

The following is an example of a value case expression:

\$(if ViewType == "frsHelpDesk"

then helpdesk_Priority

else case Urgency

when "High", "Higher"

then (case Impact

when "High" then "1"

when "Medium" then "2"

when "Low" then "3" )

when /^Med*i+um\$"/

then (case Impact

when "High" then "2"

when "Medium" then "3"

when "Low" then "4" )

when "Low"

then (case Impact

when "High" then "3"

when "Medium" then "4"

when "Low" then "5" )

else "5")

This case expression is a modified form of the expression in an editing rule for an incident, change, or problem that calculates the priority based on the impact and urgency.

The expression after the case clause computes a value and then the application matches the when expressions for equality. In this case, the when can also have a list of values as in the first when clause above.

If there is more than one when clause with the same value, the application only evaluates one of the then expressions; however, it is not necessarily done in order.

You can omit the else clause, but then the expression generates an error if there is no selected when clause. The when values do not have to have constant values, which means that you can use "when a/b then...". If a when value does not have the same type as the case value, the usual implicit conversions apply to the when value to make it have the same type.