Hey all,
I have run into an issue using AggregateExpressions with GridViewSummaryItems.
If I use the following method and Sum(Foo2) is 0, I will obviously get a Divide by Zero exception. Is there anyway handle this when using AggregateExpressions or will I have to use the CustomSummaryItem method as described here?
Too clarify, I have already got the desired output (percentage of the sums of two other columns in my grid) using the CustomSummaryItem, but I would rather use AggregateExpressions if possible as it's cleaner and requires less code.
Thanks!
I have run into an issue using AggregateExpressions with GridViewSummaryItems.
If I use the following method and Sum(Foo2) is 0, I will obviously get a Divide by Zero exception. Is there anyway handle this when using AggregateExpressions or will I have to use the CustomSummaryItem method as described here?
Dim summaryItem As New GridViewSummaryItem() summaryItem.Name = "Foo" summaryItem.AggregateExpression = "(Sum(Foo) / Sum(Foo2)"
Too clarify, I have already got the desired output (percentage of the sums of two other columns in my grid) using the CustomSummaryItem, but I would rather use AggregateExpressions if possible as it's cleaner and requires less code.
Thanks!
6 Answers, 1 is accepted
0
Hello Brennan,
Thank you for your question.
You can use the Immediate IF function to check for zero values in your expression:
I hope it helps in your case. Please write back if you have additional questions.
Kind regards,
Alexander
the Telerik team
Thank you for your question.
You can use the Immediate IF function to check for zero values in your expression:
summaryItem.AggregateExpression = "Sum(ID) / (IIf(Sum(ID2) > 0, Sum(ID2), 1))"I hope it helps in your case. Please write back if you have additional questions.
Kind regards,
Alexander
the Telerik team
Q3’11 of RadControls for WinForms is available for download (see what's new). Get it today.
0
Brennan
Top achievements
Rank 1
answered on 10 Mar 2015, 08:52 PM
Hi there,
Here is what I'm trying:
However, I am still getting a Divide By Zero exception. I assume that this is because IIf() is evaluating both sides of the if statement regardless if Sum(Tariff) > 0 or not. Is there any way around this?
Thanks,
Here is what I'm trying:
Dim real As GridViewSummaryItem = New GridViewSummaryItem("Real", "{0:#,##;(#,##);#}", "IIf(Sum(Tariff) > 0, ((Sum(Tariff) + Sum(Adj)) / Sum(Tariff)), 0) * 100")However, I am still getting a Divide By Zero exception. I assume that this is because IIf() is evaluating both sides of the if statement regardless if Sum(Tariff) > 0 or not. Is there any way around this?
Thanks,
0
Brennan
Top achievements
Rank 1
answered on 11 Mar 2015, 02:53 PM
Hi there,
Here is the work around I am using, which I am not proud of lol.
Please note I have also tried handling GroupSummaryEvaluate and testing for zero, but for this specific scenario, I need the exact formula I am using to be in a single GridViewSummaryItem as I call summaryItem.GetSummaryExpression() elsewhere in my code (I have implemented my own GridGroupContentCellElement to have aggregate values in the group rows) and need the full formula to be returned.
Here is the work around I am using, which I am not proud of lol.
Dim real As GridViewSummaryItem = New GridViewSummaryItem("Real", "{0:#,##;(#,##);#}", "IIf(Sum(Tariff) = 0, 0, ((Sum(Tariff) + Sum(Adj)) / (Sum(Tariff) + 0.000000001))) * 100")Please note I have also tried handling GroupSummaryEvaluate and testing for zero, but for this specific scenario, I need the exact formula I am using to be in a single GridViewSummaryItem as I call summaryItem.GetSummaryExpression() elsewhere in my code (I have implemented my own GridGroupContentCellElement to have aggregate values in the group rows) and need the full formula to be returned.
0
Hi Brennan,
Thank you for writing.
I tested your code and to me it appears that you add this really small number in the case where the sum of the Tariff column is greater than 0. ​Could you please try the following aggregate expression and let us know if it is ok for your project:
Looking forward to your reply.
Regards,
Hristo Merdjanov
Telerik
Thank you for writing.
I tested your code and to me it appears that you add this really small number in the case where the sum of the Tariff column is greater than 0. ​Could you please try the following aggregate expression and let us know if it is ok for your project:
Dim real1 As New GridViewSummaryItem("Real", "{0:#,##;(#,##);#}", "IIf(Sum(Tariff) = 0, 0, ((Sum(Tariff) + Sum(Adj)) / Sum(Tariff))) * 100")Looking forward to your reply.
Regards,
Hristo Merdjanov
Telerik
Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.
0
Brennan
Top achievements
Rank 1
answered on 13 Mar 2015, 02:53 PM
Hi Hristo,
This is what I tried in my post, two posts up and it doesn't work. It seems that IIf() calculates both branches of the IIf() statement regardless if tariff is zero or not, always leading to a divide by 0. This is why I added the small number to tariff - to avoid the divide by zero exception when the IIf is calculating the logical branch that won't be used.
This is what I tried in my post, two posts up and it doesn't work. It seems that IIf() calculates both branches of the IIf() statement regardless if tariff is zero or not, always leading to a divide by 0. This is why I added the small number to tariff - to avoid the divide by zero exception when the IIf is calculating the logical branch that won't be used.
0
Hi Brennan,
Thank you for writing back.
After being read the aggregate expression is parsed. When there is an if statement, you would need to provide two values or expressions which will be considered for the different cases. If the if statement evaluates to true the first one will be passed otherwise the second. Please try the code snippet below:
Other examples and detailed information you can find here. I am also sending you screenshots of the results on my side for both cases.
I hope this helps. Should you have further questions please do not hesitate to write back.
Regards,
Hristo Merdjanov
Telerik
Thank you for writing back.
After being read the aggregate expression is parsed. When there is an if statement, you would need to provide two values or expressions which will be considered for the different cases. If the if statement evaluates to true the first one will be passed otherwise the second. Please try the code snippet below:
Public Class Form1 Sub New() InitializeComponent() Dim dataTable As New DataTable() dataTable.Columns.Add("Real", GetType(Integer)) dataTable.Columns.Add("Tariff", GetType(Integer)) dataTable.Columns.Add("Adj", GetType(Integer)) For i As Integer = 0 To 9 'dataTable.Rows.Add(i, i, i + 20) dataTable.Rows.Add(i, 0, i + 20) Next Me.RadGridView1.DataSource = dataTable Me.RadGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill Dim real As New GridViewSummaryItem() real.Name = "Real" 'real4.FormatString = "{0:#,##;(#,##);#}" Dim expr As String = "(IIf(Sum(Tariff) = 0, 0, ((Sum(Tariff) + Sum(Adj)) / Sum(Tariff)) * 100))" real.AggregateExpression = expr Dim summaryRowItem As New GridViewSummaryRowItem(New GridViewSummaryItem() {real}) Me.RadGridView1.SummaryRowsTop.Add(summaryRowItem) End SubEnd ClassOther examples and detailed information you can find here. I am also sending you screenshots of the results on my side for both cases.
I hope this helps. Should you have further questions please do not hesitate to write back.
Regards,
Hristo Merdjanov
Telerik
Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.
