Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Sv translation
languageen

Special functions


Function

Description

String[] comments()

Return array of text inside comments.

Code Block
ArrayUtils.toString(comments())


String[] commentsDetails()

Returns array of comments in format datetime + text, e.g.: 216-08-12T15:24:22.486;text.

Code Block
ArrayUtils.toString(commentsDetails())


void filter(String filterExpression, { expression } )

Evaluates the passed expression with the specified filter. For example:

Code Block
filter('M_MEASURE > 100') { L_ID_COUNT } 


Double aggregatePrevLevel(int countOfPrevlevels, { expression } )

Returns the aggregated value of the embedded expression. The aggregation is computed for the specified upper level. For example:

Code Block
total = aggregatePrevLevel(1, {
  cumulateFromTime(actualYear(), {
    'M_NAME_1' + 'M_NAME_2'
  });
});
current = cumulateFromTime(actualYear(), {
    'M_NAME_1' + 'M_NAME_2'
});
return current / total;


Double firstValue()

Returns the lowest value of selected level(measure). For example:

Section


Column



DatefirstValue('L_DATE')
Project11/1/20151/1/2015
Project15/1/20151/1/2015
Project23/1/20153/1/2015
Project28/1/20153/1/2015




Double forEachRow('expression')

Computes the expression on data set row level and calculates the sum from particular results. Following example shows the difference of using multiplication within the forEachRow() method and outside:

Section


Column




Ind1

Ind2

forEachRow('M_IND_1 * M_IND_2')

M_IND_1 * M_IND_2

Member


5

30

80

150


DrillDownMember1

3

20

60

60


DrillDownMember2

2

10

20

20




Double forEachRow('expression','aggregation')Computes the expression on data set row level and calculates the aggregation based on the second parameter from particular results. Aggregation can include SUM, MIN, MAX, AVG, COUNT, DCOUNT.
Double formatNumber(number value)Formats the value according to the indicator's format from settings.
Double formatNumber(number value, 'String pattern')Formats the value according to the indicator's format from settings. String pattern allows you to control, how the format specified.
Double lastValue()

Returns the highest value of the selected level (measure). For example:

Section


Column


ProjectDatelastValue('L_DATE')
Project11/1/20155/1/2015
Project15/1/20155/1/2015
Project23/1/20157/1/2015
Project27/1/20157/1/2015




void eachMember(String attribute) { expression }

Computes the expression for particular attribute values defined by attribute parameter.

Section


Column


L_ATTRIBUTE_1

L_ATTRIBUTE_2

Ind1

Ind2

def result = 0

eachMember('L_ATTRIBUTE_2') { result = M_IND_1 * M_IND_2 }

return result

M_IND_1 * M_IND_2

Value


5

30

80

150


Value1

3

20

60

60


Value2

2

10

20

20



Refer to Formula best practices for correct usage.

Double members(String path, { expression } )

Computes the expression for desired drill-down member values. Example:

Code Block
return members('[L_LEVEL_1=VAL][L_LEVEL_2="VAL1,VAL2"]', {
M_NAME_1 * M_NAME_2
})

This example returns the value of indicator M_NAME_1 aggregated for specified members.

Refer to Formula best practices for correct usage.

Double membersSum({ expression } )

Computes the expression for particular members and calculates the sum from particular results. Following example shows the difference of using multiplication within the membersSum() method and outside:

Section


Column




Ind1

Ind2

membersSum( { M_IND_1 * M_IND_2 } )

M_IND_1 * M_IND_2

Member


5

30

80

150


DrillDownMember1

3

20

60

60


DrillDownMember2

2

10

20

20



Refer to Formula best practices for correct usage.

Double membersSum(String levelCode, { expression } )

Computes the expression for particular members of the defined levelCode and calculatesthesumfrom particular results.

Refer to Formula best practices for correct usage.

Double membersAvg({ expression } )

Computes the expression for particular members and calculates the average value from particular results.

Refer to Formula best practices for correct usage.

Double membersAvg(String levelCode, { expression } )

Computes the expression for particular members of the defined levelCode and calculates the average value from particular results.

Refer to Formula best practices for correct usage.

Double membersMin({ expression } )

Computes the expression for particular members and calculates the minimal value from particular results.

Refer to Formula best practices for correct usage.

Double membersMin(String levelCode, { expression } )

Computes the expression for particular members of the defined levelCode and calculates the minimal value from particular results.

Refer to Formula best practices for correct usage.

Double membersMax({ expression } )

Computes the expression for particular members and calculates the maximum value from particular results.

Refer to Formula best practices for correct usage.

Double membersMax(String levelCode, { expression } )

Computes the expression for particular members of the defined levelCode and calculates the maximum value from particular results.

Refer to Formula best practices for correct usage.

Double dateAttribute(String levelCode){ expression }


Computes the expression for particular members of the defined levelCode on defined dates.

Code Block
dateAttribute('L_DATE') {dateInterval('2014-01-01','2014-12-01') { 'M_NAME_1' + 'M_NAME_2' } }


Double timeAttribute(String levelCode){ expression }

Computes the expression for particular members of the defined levelCode on defined time.

Code Block
timeAttribute('L_TIME') {timeInterval('10:00:00','12:00:00') { 'M_NAME_1' + 'M_NAME_2' } }


String attributeCode()

Returns the attribute code of current member. Example:

Section


Column



Population

attributeCode()

Prague

1200000

L_CITY

Berlin

3000000

L_CITY

London

7825200

L_CITY




String localize(String attributeCode, String valueToLocalize)
String localize(String dataSetCode, String attributeCode, String valueToLocalize);

Method to load translations from referenced data set.

Code Block
languagejava
localize('TRANSLATIONS', 'L_ORIG', firstValue('L_STATE'));


String memberIdentifier()

Returns the attribute code and value of current member in following form [L_CODE={VALUE}]. Example:

Section


Column



Population

memberIdentifier()

Prague

1200000

[L_CITY= {Prague}]

Berlin

3000000

[L_CITY= {Berlin}]

London

7825200

[L_CITY= {London}]




String memberValue()

Returns the value of current member. Example:

Section


Column



Population

memberValue()

Prague

1200000

Prague

Berlin

3000000

Berlin

London

7825200

London




printComments()
Returns formatted text of comments. No need to iterate over it.

rank() { expression }

Returns numerical order (rank) of the indicatorappliedintheexpression within used drill-down. Example:

Section


Column


User

Score

rank()

Peter

90.3

2

John

92.7

1

Anna

89.7

3




rank('L_DRILLDOWN', 'M_INDICATOR')

Rank will calculate over specific drill down.

rank('L_DRILLDOWN', 'MEMBER', 'M_INDICATOR')

Rank will calculate over specific drill down and member

Code Block
languagegroovy
withoutFilter() {
	rank('L_CITY', 'Aberdeen', 'M_VISITS')
}


rankInner() { expression }

Returns numerical order (rank - ascending) of the indicator applied in the expression within all used drill-downs in the table. Example:

Section


Column


Drill-downSalesrankInner()
Coffee750001
- Caffe Latte250003
- Caffe Mocca350002

- Decaf Espresso

150001
Tea1000002
- Lemon1000001




rankInner(true) { expression }

Returns numerical order (rank - descending) of the indicator applied in the expression within all used drill-downs in the table. Example:

Section


Column


Drill-downSalesrankInner(true)
Coffee750002
- Caffe Latte250002
 - Caffe Mocca350001
- Decaf Espresso150003
Tea1000001
- Lemon1000001




setDebugOn(true)

Enables debug mode. Ifformulacontains error, table cell will contain detailed stack trace about error, chart and KPI label won't be rendered and error detail will be printed out.

We recommend using this function only while debugging. If not debugging, delete or mark it as comment:

//setDebugOn(true)
withoutDateTime() { expression }

Opt-out from applied Date and Time intervals. Example:

Section


Column


Date

M_INDICATOR

withoutDateTime() { M_INDICATOR }

1/12 - 12/12

1000

3000

1/1/2013 - 1/31/2013

100

3000




withoutDrillDown() { expression }

Opt-out from applied Drill-downs. Example:

Section


Column


Country

M_INDICATOR

withoutDrillDown() { M_INDICATOR }

+UK

3000

3000

--London

1000

3000

--Manchester

1000

3000

--Oxford

1000

3000



In cases, whentherearemultipledrill-downsappliedinthetable, some of the drill-downs can be excluded from the withoutDrillDownFunction function (the aggregation for the upper level will be displayed).

Section


Column


Country

City

M_INDICATOR

withoutDrillDown('L_CITY') { M_INDICATOR }

UK

Manchester

3000

4000

UK

London

1000

4000

France

Paris

1000

2000

France

Nice

1000

2000




withoutFilter() { expression }


Opt-out from applied filters. Example: (Filter is set to SEGMENT=SMB)

Section


Column


City

M_INDICATOR

withoutFilter() { M_INDICATOR }

Paris

1000

3000

London

900

3000

Berlin

1100

3000




withoutReportFilter() { expression }
 Only

Only view filter and indicator filter will be applied (available since BellaDati 2.9.4).

Since BellaDati 2.9.17, you can indicate which filter should be ignored by their codes

Code Block
withoutReportFilter('code1','code2')


withoutViewFilter() { expression }

Only report filter and indicator filter will be applied (available since BellaDati 2.9.4).

Since BellaDati 2.9.17, you can indicate which filter should be ignored by their codes

Code Block
withoutViewFilter('code1','code2')


loadData('L_DRILLDOWN', 'M_INDICATOR')

Allows to load values of an indicator for all members of specifiedattribute. it can greatly improve the performance of formulas. The function returna map of members and their values. This map can be accessed by using function getMapValue()


Code Block
languagegroovy
data = loadData('L_DRILLDOWN', 'M_INDICATOR')
getMapValue(data, '[memberId]')

The memberId has to have following format: [memberId] = [L_ATTRIBUTE={Value}]. Usually, the function is used toghether with withoutDrillDown().

Code Block
languagegroovy
withoutDrillDown() { 
data = loadData('L_COUNTRY', 'M_NUMBERS_BUILT')
getMapValue(data, '[L_COUNTRY={Germany}]')
  }

It also possible to use rank or aggregation such as MAX, MIN etc.:

Code Block
languagegroovy
data = loadData('L_DRILLDOWN', 'M_INDICATOR_rank()')
getMapValue(data, '[memberId]') //will return M_INDICATOR_rank() 


Code Block
languagegroovy
data = loadData('L_DRILLDOWN', 'M_INDICATOR@MAX')
getMapValue(data, '[memberId]') //will return the highest value of indicator


Instead of indicator, users can also retrieve first of last value of an attribute.

Code Block
languagegroovy
data = loadData('L_DRILLDOWN', 'L_ATTRIBUTE_LASTVALUE')


Code Block
languagegroovy
data = loadData('L_DRILLDOWN', 'L_ATTRIBUTE_FIRSTVALUE')


Passing parameters to time formula

It is possible to define the time entry by formula. Following functions are applicable for these kind of formulas only.

Function

Description

void set(String name, Object value)

Sets the parameter value.

Object get(String name)

Loads the parameter value.

Object indicator()

Returns indicator from the context of the row of current table. This function returns also values of formula defined indicators (defined in report). Example:

Code Block
value(actualYear(),'actualMonth - 1m - 1d',indicator())


Consider following example - we have several indicators with codes M_NAME_1, M_NAME_2 and M_NAME_3. These indicators are used in formulas 1 - 3. The time area is defined by time formulas 1 - 5.


Time formula 1:
M_NAME_1

Time formula 2:
M_NAME_2

Time formula 3:
M_NAME_3

Time formula 4:
s = get('suffix');
return value('M_NAME' + s);

Time formula 5:
value(actualYear(),
'now-1m',indicator())

Formula 1:
set('suffix', '_1');
return M_NAME_1;

1000

2000

3000

1000

1000

Formula 2:
set('suffix', '_2');
return M_NAME_2;

1000

2000

3000

2000

2000

Formula 3:
set('suffix', '_3');
return M_NAME_3;

1000

2000

3000

3000

3000

M_NAME_1

1000

2000

3000

N/A

1000

M_NAME_2

1000

2000

3000

N/A

2000

M_NAME_3

1000

2000

3000

N/A

3000

Getting User Information

It is possible to obtain information about logged in user for your reporting needs.

FunctionDescriptionResponse example
String getSignedUserName()Returns name of currently signed-in user.John
String getSignedUserSurname()Returns surname of currently signed-in user.Smith
String getSignedUserEmail()Returns email of currently signed-in user.support@belladati.com
String getSignedUser()Returns username of currently signed-in user.JohnSmith
String getSignedUserTimezone()Returns time zone of currently signed-in user as a stringEurope/Prague

Double getSignedUserTimezoneOffset()

Returns time zone offset of currently signed-in user as a number2
String getSignedUserAdditionalInfo()Returns additional information of currently signed-in user.Employee
Double getSignedUserID()Returns ID of currently signed-in user.35
Strung getSignedUserLanguage()Returns chosen language of currently signed-in user.en

Working with lists and arrays

BellaDati supports all Arrays from https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html and ArrayUtils from https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/ArrayUtils.html.

Syntax: first define name of the package, then use desired method.

Example:

def int[] a = [1,2,3]
a = ArrayUtils.add(a, 0)
Arrays.sort(a)
return a[3]

Next Steps

...