# X++ business runtime functions

This topic describes the business run-time functions.

These functions enter financial data and calculate formulas.

## cTerm

Calculates the number of periods that are required for the current investment value to yield a target value.

### Syntax

```
real cTerm(real interest, real future_value, real current_value)
```

### Parameters

Parameter | Description |
---|---|

interest | The interest rate. |

future_value | The target value. |

current_value | The current investment value. |

### Return value

The number of periods that are required in order to reach *future_value*.

### Remarks

The *current_value* and *future_value* parameters must have the same prefixed sign (plus or minus).

### Example

```
static void cTermExample(Args _arg)
{
real r;
;
r = cTerm(10.0, 500.00, 100.00);
print "The cTerm is " + num2Str(r, 2, 2, 1, 1);
pause;
}
```

## ddb

Calculates the accelerated depreciation of an asset.

### Syntax

```
real ddb(real price, real scrap, real life, int period)
```

### Parameters

Parameter | Description |
---|---|

price | The purchase price of the asset. |

scrap | The residual value of the asset that has been written off. |

life | The expected lifetime of the asset. |

period | The period to calculate depreciation over. |

### Return value

The depreciation of the asset.

### Remarks

The book value for a specific period is equal to the purchase price minus the accumulated depreciation for previous periods:

- Book value for Period 1 = Price
- Book value for Period 2 = Book value for Period 1 – Depreciation for Period 1
- Book value for Period n = Book value for Period (n–1) – Depreciation for Period (n–1)

There are three variations for the calculation of depreciation: If Period > Life:

- Depreciation = 0

If (Book value for Period n) – ((Book value for Period n) × 2 ÷ Life) < Residual value:

- Depreciation = (Book value for Period n) – Residual value

In all other cases: Depreciation = (Book value for Period n) × 2 ÷ Life The **syd** and **sln** functions also calculate the depreciation of an asset. The **syd** and **ddb** functions enables higher depreciation for the earlier years, whereas **sln** calculates a linear depreciation.

```
ddb(12000,2000,10,1); //Returns the value 2400.
ddb(12000,2000,10,3); //Returns the value 1536.
```

## dg

Calculates the contribution ratio, which is based on the sales price and the purchase price. If the value of the *sale* parameter is **0.0**, the calculation can't be done.

### Syntax

```
real dg(real sale, real purchase)
```

### Parameters

Parameter | Description |
---|---|

sale | The sale price. |

purchase | The purchase price. |

### Return value

The contribution ratio.

### Remarks

```
dg(1000,300); //Returns the value 0.7.
dg(100,30); //Returns the value 0.7.
dg(20000, 11000); //Returns the value 0.45.
```

## fV

Calculates the future value of an investment.

### Syntax

```
real fV(real amount, real interest, real life)
```

### Parameters

Parameter | Description |
---|---|

amount | The amount that was paid in during each period. |

interest | The interest rate. |

life | The number of investment periods. |

### Return value

The future value of the investment.

### Remarks

```
fV(100,0.14,10); //Returns the value 1933.73.
fV(400,0.10,5); //Returns the value 2442.04.
```

## idg

Calculates the sale price, based on the purchase price and the contribution ratio.

```
real idg(real purchase, real contribution_ratio)
```

### Parameters

Parameter | Description |
---|---|

purchase | The purchase price. |

contribution_ratio | The contribution ratio. |

### Return value

The sale price.

### Remarks

If the contribution ratio is equal to **1.0**, the calculation can't be done. The **idg** function is the inverse of the **dg** function.

```
idg(300,0.7); //Returns the value 1000.
idg(11000,0.45); //Returns the value 20000.
```

## intvMax

Retrieves the number of intervals for the specified period when the period is divided into parts as specified by the *func* parameter.

```
int intvMax(date input_date, date ref_date, int func)
```

### Parameters

Parameter | Description |
---|---|

input_date | The end of the period, which must be later than the ref_date parameter. |

ref_date | The start of the period. |

func | A IntvScale system enumeration value that indicates the division unit. |

### Remarks

Here are the possible values for the *func* parameter:

- None
- YearMonthDay
- YearMonth
- Year
- MonthDay
- Month
- Day
- YearQuarter
- Quarter
- YearWeek
- Week
- WeekDay

### Example

```
static void intvMaxExample()
{
date refDate = str2Date("4/9/2007", 213);
date inputDate = str2Date("10/5/2007", 213);
int numberOfIntervals;
;
numberOfIntervals = intvMax(inputDate, refDate, intvScale::YearMonth);
print numberOfIntervals;
pause;
}
```

## intvName

Returns the name of the interval that is the specified number of intervals ahead of the specified date.

```
str intvName(date input_date, int col, enum func)
```

### Parameters

Parameter | Description |
---|---|

input_date | A date in the first interval. |

col | The number of intervals ahead of the date that is specified by the input_date parameter. |

func | An intvScale enumeration value. |

### Return value

The name of the interval.

### Remarks

For example, if the *func* parameter is the **IntvScale::WeekDay** enumeration value, this method returns the name of the weekday. If the *func* parameter is the **IntvScale::Week** enumeration value, this method returns a string that contains the number of the week.

### Example

```
static void intvNameExample(Args _args)
{
date refDate = 2672010;
str name;
;
name = intvName(refDate, 3, intvScale::WeekDay);
Global::info(strfmt("%1 is the output, which indicates the day of the week 3 days after 26\7\2010.", name));
}
/**** Infolog display.
Message (09:56:55 am)
Thu is the output, which indicates the day of the week 3 days after 2672010.
****/
```

## intvNo

Calculates the number of intervals between two dates when you divide the time into the specified intervals.

### Syntax

```
int intvNo(date input_date, date ref_date, int func)
```

### Parameters

Parameter | Description |
---|---|

input_date | A date that indicates the end of the period |

ref_date | A date that indicates the start of the period. |

func | An intvScale enumeration value. |

### Return value

The number of intervals between the dates that are specified by the *ref_date* and *input_date* parameters.

### Example

```
static void intvNoExample(Args _args)
{
date inputDate = str2Date("1/1/2007", 213);
date refDate = str2Date("3/1/2007", 213);
int noOfIntervals;
;
noOfIntervals = intvNo(refDate, inputDate, intvScale::Month);
print noOfIntervals;
pause;
//noOfIntervals now holds the difference in months between March and January (2).
}
```

## intvNorm

Returns the normalized date for the period.

### Syntax

```
date intvNorm(date input_date, date ref_date, int func)
```

### Parameters

Parameter | Description |
---|---|

input_date | The end of the period, which must be later than the date that is specified by the ref_date parameter. |

ref_date | The start of the period. |

func | An intvScale enumeration value that indicates the interval division unit. |

### Return value

The normalized date for the period.

### Remarks

The returned date will equal the date of the first day in the interval in which the date that is specified by the *ref_date* parameter exists.

### Example

```
static void example()
{
print intvNorm(today(), today()-1, IntVScale::WeekDay);
pause;
}
```

## pmt

Calculates the amount that must be paid every period to repay a loan.

### Syntax

```
real pmt(real principal, real interest, real life)
```

### Parameters

Parameter | Description |
---|---|

principal | The amount that was originally borrowed. |

interest | The interest that is applied each period to the amount that was borrowed. |

life | The number of periods that the loan is repaid over. |

### Return value

The amount that must be paid every period.

### Remarks

The *life* and *interest* parameters must be expressed in the same time units. The value of the *life* parameter must be more than **0.0**.

### Example

```
pmt(4000,0.14,4); //Returns the value 1372.82.
pmt(10000,0.10,20); //Returns the value 1174.60.
```

## pt

Retrieves the sum of a number plus a specified percentage of that number.

### Syntax

```
real pt(real amount, real percentage)
```

### Parameters

Parameter | Description |
---|---|

amount | The original number. |

percentage | The percentage supplement. |

### Return value

The number that is equal to ((*amount *× *percentage*) + *amount*).

### Remarks

```
pt(2000.0,0.10); //Returns the value 2200.0.
pt(20.0,0.10); //Returns the value 22.0.
```

## pv

Calculates the present value of an annuity, where an amount is received over multiple periods and the interest rate is deducted for each period.

### Syntax

```
real pv(real amount, real interest, real life)
```

### Parameters

Parameter | Description |
---|---|

amount | The amount that is paid during each period. |

interest | The interest rate. |

life | The number of times that the value that is specified by the amount parameter is paid. |

### Return value

The current value of an annuity.

### Remarks

```
pv(300,0.14,4); //Returns the value 874.11.
```

## rate

Calculates the interest that is required for the current investment value to attain the future value over the specified number of periods.

### Syntax

```
real rate(real _future_value, real _current_value, real _terms)
```

### Parameters

Parameter | Description |
---|---|

_future_value | The future value of the investment. |

_current_value | The current value of the investment. |

_terms | The number of periods that the investment spans. |

### Return value

The calculated interest rate.

### Remarks

```
rate(10000,1000,20); //Returns the value 0.12.
```

## sln

Retrieves the constant depreciation amount for the specified asset for each depreciation period.

### Syntax

```
real sln(real price, real scrap, real life)
```

### Parameters

Parameter | Description |
---|---|

price | The purchase price of the asset. |

scrap | The scrap value of the asset. |

life | The number of periods in the expected life of the asset. |

### Return value

The depreciation amount.

### Example

```
static void slnExample(Args _arg)
{
real r;
;
r = sln(100.00, 50.00, 50.00);
print r;
pause;
}
```

## syd

Calculates the depreciation of an asset over a specified period.

### Syntax

```
real syd(real _price, real _scrap, real _life, int _period)
```

### Parameters

Parameter | Description |
---|---|

_price | The purchase price of the asset. |

_scrap | The scrap value of the asset. |

_life | The expected life of the asset (the number of periods). |

_period | The period to calculate depreciation for. |

### Return value

The amount of depreciation over the specified period.

### Remarks

In contrast to the **sln** function, the **syd** function can allow for an accelerated depreciation of the asset. As with the **ddb** function, this enables higher depreciation during the early periods of the life of an asset.

### Example

In the following examples, the periodic depreciation is calculated for an asset that has a purchase price of 10,000, a scrap value of 2,000, and a life of 5. In comparison, **sln(10000,2000,5)** would calculate 1600.00 for each period.

```
// Returns the value 2666.67 (for the 1st period).
syd(10000,2000,5,1);
// Returns the value 2133.33 (for the 2nd period).
syd(10000,2000,5,2);
// Returns the value 1600.00 (for the 3rd period).
syd(10000,2000,5,3);
// Returns the value 1066.67 (for the 4th period).
syd(10000,2000,5,4);
// Returns the value 533.33 (for 5th - and final- period).
syd(10000,2000,5,5);
```

## term

Calculates the number of periods that an investment must run for.

### Syntax

```
real term(real amount, real interest, real future_value)
```

### Parameters

Parameter | Description |
---|---|

amount | The amount of the periodic investment. |

interest | The interest rate for each period. |

future_value | The future value that is anticipated for the investment |

### Return value

The number of periods that the investment must run for.

### Example

```
static void termExample(Args _args)
{
print term(400,0.08,5000); //returns the value '9.01'.
print term(100,0.14,3000); //returns the value '12.58'.
pause;
}
```