TotalSummary GroupSummaries в Девэкспресс - PullRequest
6 голосов
/ 10 мая 2011

У меня есть ASPxGridview, как это:

enter image description here

Можно ли как-нибудь вычислить сумму от GroupSummary до TotalSummary без группировки .

GroupSummary's  SummeryType="AVERAGE"

Например:

MUS_K_ISIM   GroupSummary[RISK_EUR]
2M LOJİSTİK  123.456 
ABA LOJİSTIK 234.567 

Тогда я хочу, чтобы столбец TotalSummary из RISK_EUR был 123,456 + 234,567 = 358023.

ПРИМЕЧАНИЕ : я хочу только этот расчет с обычным Gridview. Не делать с группировкой.

Другой пример:

Customer_No Customer_Name Price
123         aaa           50
123         aaa           100
123         aaa           60
124         bbb           60
125         ccc           20
125         ccc           40

Я хочу с этой сеткой:

What is avarage of 123 number customer = 50 + 100 + 60 = 210/3= 70
What is avarage of 124 number customer = 60/1=60
What is avarage of 125 number customer = 20 + 40 = 60/2= 30

И тогда TotalSummary of Price будет = 70 + 60 + 30 = 160

Как я могу это сделать? Или о чем этот код? Какую функцию я должен использовать?

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Я вижу два разных решения:

1) реализовать управление данными вручную:
а) сортировать данные по столбцу псевдогруппы; б) просмотреть отсортированный список данных, вычислить итоговые значения вручную и, наконец, показать это значение;

2) создать новую сетку на странице, связать ее с данными, сгруппировать по требуемому столбцу, извлечь итоговые значения и, наконец, утилизировать.

Я не проверял второй подход, но не вижу причины, по которой этот подход не должен работать.

UPDATE

Задать итоговое значение возможно только в том случае, если вы используете пользовательскую сводку. Это можно сделать в обработчике событий CustomSummaryCalculate. Также для получения сводных значений вы можете использовать следующий код:

double total = 0;
                for(int i = 0; i < ASPxGridView1.VisibleRowCount; i ++) {
                    total += Convert.ToDouble(ASPxGridView1.GetGroupSummaryValue(i, someSummaryItem));
                }

Вы должны реализовать что-то вроде этого.

Обновление 2 Хорошо, я думаю, что нашел наиболее эффективное решение этой проблемы. Позволь мне объяснить. Во-первых, необходимо использовать пользовательскую сводку, как это объясняется в теме Custom Summary . Используя обработчик событий CustomSummaryCalculate, необходимо собрать данные в объект Dictionary, ключ которого содержит значение поля Customer_No, value - список значений Price для этого Customer. Наконец, необходимо рассчитать итоговое резюме. Ниже приведен полный код, как ASPx, так и C #. Надеюсь, это будет вам полезно.

    <dx:ASPxGridView ID="ASPxGridView1" runat="server" OnCustomSummaryCalculate="ASPxGridView1_CustomSummaryCalculate">
        <TotalSummary>
            <dx:ASPxSummaryItem FieldName="Price" SummaryType="Custom" ShowInColumn="Price" />
        </TotalSummary>
        <Settings ShowFooter="True" />
    </dx:ASPxGridView>

...

using System;
using System.Collections.Generic;
using System.Data;
using System.Collections;

    protected void Page_Init(object sender, EventArgs e) {
        ASPxGridView1.DataSource = GetDataSource();
        ASPxGridView1.DataBind();
    }

    private object CreateDataSource() {
        DataTable table = new DataTable();
        table.Columns.Add("Customer_No", typeof(int));
        table.Columns.Add("Price", typeof(int));
        table.Rows.Add(new object[] {123, 50 });
        table.Rows.Add(new object[] {123, 100 });
        table.Rows.Add(new object[] {123, 60 });
        table.Rows.Add(new object[] {124, 60 }); 
        table.Rows.Add(new object[] {125, 20 });
        table.Rows.Add(new object[] {125, 40 });
        return table;
    }
    private object GetDataSource() {
        if(Session["data"] == null)
            Session["data"] = CreateDataSource();
        return Session["data"];
    }

    Dictionary<int, List<int>> dict;
    protected void ASPxGridView1_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs e) {
        if(e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Start)
            dict = new Dictionary<int, List<int>>();
        if(e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Calculate) {
            int customer_No = Convert.ToInt32(e.GetValue("Customer_No"));
            List<int> list;
            if(!dict.TryGetValue(customer_No, out list)) {
                list = new List<int>();
                dict.Add(customer_No, list);
            }
            list.Add(Convert.ToInt32(e.GetValue("Price")));
        }
        if(e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Finalize) {
            e.TotalValue = CalculateTotal();
        }
    }
    private object CalculateTotal() {
        IEnumerator en = dict.GetEnumerator();
        en.Reset();
        float result = 0;
        while(en.MoveNext()) {
            KeyValuePair<int, List<int>> current = ((KeyValuePair<int, List<int>>)en.Current);
            int sum = 0;
            for(int i = 0; i < current.Value.Count; i++)
                sum += current.Value[i];
            result += sum / current.Value.Count;
        }
        return result;
    }
0 голосов
/ 20 мая 2011

Ваш sql возвращает значение:

select (select SUM(x) from foo f2 where f1.x = f2.x) as sum, f1.x from foo f1
...