# Calculation field

The values in the calculation fields are calculated from the expressions specified by you.
The following types of expressions are supported:

• Mathematical - Expression involving numbers.
• String - String can also be added together, compared, etc...
• Boolean - Expression that evaluate to true (1.0) and false (0.0).
• Numeric and string types can not be mixed in a left / right operand pair.

## Variables

Variables are values of other fields in the same record.
Variable must be enclosed by a pound sign and open brace #{ and a closed brace }. i.e. expression:

`#{field_name1} + #{field_name2}`

String values/variables must be enclosed by Quote characters:

`'Result: ' + '#{string_field1}' + '#{string_field2}'`

## Operators

The following operators are supported:

• ( open parentheses
• ) closed parentheses
• + addition (for numbers and strings)
• - subtraction
• * multiplication
• / division
• % modulus
• == equal (for numbers and strings)
• != not equal (for numbers and strings)
• < less than (for numbers and strings)
• <= less than or equal (for numbers and strings)
• > greater than (for numbers and strings)
• >= greater than or equal (for numbers and strings)
• && boolean and
• || boolean or
• ! boolean not

## Result type

For each calculation, there must be a correct result type set:

• Real result and Integer result are used for expressions with numerical result.
• Date/Time result is used to represent the result in form of date and time. The calculation result is interpreted as the number of seconds that has passed since January 1, 1970 (UNIX time).
• Date result is the same as the previous type, but displays only the date.
• String result is used for expressions that contain string manipulations or functions that return a string.

Use the following syntax to get access to the values of entry fields like Link to entry:

`#{field_name.child_field_name}`

where field_name – name of field like Link to the entry, child_field_name – name of one field of a related entry.

`#{field_name@0.child_field_name}, #{field_name@1.child_field_name}, …`

You can specify one of the supported aggregation functions instead of the index:

`#{field_name@sum.child_field_name}`

This expression returns the sum of values of field child_field_name for all entries included into field_name. In addition, the following functions are supported: avg, min, max.
Use the following syntax to get the number of entries in field field_name:

`#{field_name@size}`

## Examples

##### Example 1

Entries contain fields: Price, Count
We add a calculating field "Sum" by using the following expression:

`#{Price}*#{Count}`
##### Example 2

Entries contain fields: Count, Total
We add a calculating field "Percentage" by using the following expression:

`(#{Count } / #{ Total }) * 100`
##### Example 3

Entries contain fields: StartDateTime, EndDateTime
We add a calculating field "Duration" by using the following expression (result is number seconds):

`#{EndDateTime} - #{StartDateTime}`
##### Example 4

Entries contain fields: StartDate, EndDate
We add a calculating field "Days" by using the following expression:

`datediff(#{EndDate} , #{StartDate})`
##### Example 5

Entries contain fields: Time
We add a calculating field "Days left" by using the following expression:

`if( #{Time} > now() , rint((#{Time} - now())/(60*60*24)) , 'in the past')`
##### Example 6

There’s library Order – with orders and library Item – with items. Library Order contains a link to library Item and numeric field Count. Library Item contains field Price.
To calculate the cost of the order, let’s add calculable field Sum using the following formula:

`#{count} * #{item.price}`

If an order can make a reference to several different items, their total cost can be calculated:

`#{item@sum.price}`

The most expensive item:

`#{item@max.price}`

The cheapest item:

`#{item@min.price}`

The average price for the item:

`#{item@avg.price}`