The following are elements contained in business views.
Organizing data required by a user into multiple categories or multiple levels of categories is meaningful, and makes it easy to use. End users can use categories to find data elements they need to use without knowing the underlying table names although sometimes the table names are used as categories.
Categories have no affect on the way reports get data at runtime. They are simply for the end users to more easily find the data they need.
Custom aggregations are special aggregations used for sophisticated mathematic and logic calculation purposes. They are created using the Formula Editor and are defined based on the elements in a business view and the built-in functions including aggregation functions, mathematic and logic calculation related functions. Custom aggregations can be created as aggregation objects or as dynamic formulas that are used as aggregations in a business view.
When using a custom aggregation in a data component, you need to make sure the group elements referenced in the custom aggregation are also added as table group-by field, crosstab column/row field or chart category/series field in the data component.
The expression for a custom aggregation is defined by relative member set and aggregation. It returns a single value or an array.
The general expression structure of a custom aggregation is @(<Group Collection>, <Aggregation>) or @(<Group Collection>, <Detail>).
The following details each segment in the expression.
@"Customers.Country"
.In the following example, G1, G2, G3, G4, and G5 are group names.
@dim means @dim:CURRENT
@dim: means @dim:CURRENT
@dim:"" zero length string, means @dim:CURRENT
@"Orders Detail.Total Quantity".
Loop reference is not supported, for example:
Here are some custom aggregation expression examples:
@(@"Orders Detail.Sales Year":ALL,@"Customers.Country":"USA",Sum(@"Orders Detail.Quantity"))
@(@"MonthOfOrderDate":CURRENT,@"Orders Detail.Total Quantity") - @(@"MonthOfOrderDate":PrevMember(),@"Orders Detail.Total Quantity")
@(@"Customers.Country":"USA",@"Orders Detail.Total Quantity") / Sum(@"Orders Detail.Quantity")
@"Orders Detail.Total Quantity" / Sum(@"Orders Detail.Quantity")
Average(@(@"F_day":Children,@"Count_Order ID"))
. Here F_day is a dynamic formula used as group which is defined as: ForeachDay(@"Orders Detail.Order Date")
@(@Country:"USA",@Year:CHILDREN, @@CTF1)
. Here CTF1 is the name of a crosstab formula.Calculation logic
The calculation of custom aggregations is based on data components. The following introduces the calculation logic in a crosstab. Calculation on chart category and series is similar to that on crosstab. Other components with group structure can be regarded as one-direction crosstabs.
For exmaple, a custom aggregation is defined as @(@Year:CURRENT, @Month:CURRENT, Sum(@Sales))
, which contains the two groups @Year:CURRENT and @Month:CURRENT, when it is used in a crosstab with row header Country and column header Region, Country and Region will also determine member combination, so the expression will be @(@Year:CURRENT, @Month:CURRENT, @Country:CURRENT, @Region:CURRENT, Sum(@Sales))
.
If a custom aggregation uses variable as <Group Name> in the expression, such as CURRENT, CROSSTAB_ROW, CROSSTAB_COLUMN, CHART_CATEGORY, and CHART_SERIES, during the calculation the variable need to be replaced by a group name in the data component, and which group name will be used depends on the position where the custom aggregation is inserted in the data component.
In the above example, JReport knows Country and Region member values of the cells, but cannot know that of Year and Month, so Year and Month members are ALL, and the expression will be @(@Year:ALL, @Month:ALL, @Country:"USA", @Region:"CA", Sum(@Sales))
.
When the Running functions are used in the custom aggregation expression, if the group member combination does not have relative cell in the crosstab, it returns Null.
During the custom aggregation calculation, error may occur when any of the following happens:
For example: CusAgg1 is defined as @(CURRERT:CURRENT, @Year:"2014", Sum(@Sales))
and is inserted into a data component's Year group. During calculation, <Group Collection> is @Year:CURRENT, @Year:PrevMember()
, where group names are duplicated.