DevExpress MVC Pivotgrid:如何 summarize/aggregate 在分组级别上有所不同
DevExpress MVC Pivotgrid: How to summarize/aggregate differently on grouping levels
我有一个 DevExpress MVC PivotGrid。它有一个 header,最高级别是季度,然后是月,然后是周。传递给网格的数据需要对周的数据求和,但对月的周数据求平均,对季度的数据(周或月)求平均。
网格截图如下:
我希望第 201632、201633、201634、201635 周为 0.1,但 2016 年 7 月也应为 0.1(因为这是平均值)并且与 9 月相同。那么2016年Q2、2016年Q4应该也有0.1(因为这是平均值)。
这是网格字段的代码
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 0;
field.TotalsVisibility = PivotTotalsVisibility.None;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Quarter Year";
field.FieldName = "YYYYQ";
field.CellStyle.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 1;
field.TotalsVisibility = PivotTotalsVisibility.None;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Month Year";
field.FieldName = "YYYYMM";
field.CellStyle.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 2;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Work Week";
field.FieldName = "YYYYWW";
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.DataArea;
field.FieldName = summaryField;
field.Caption = summaryField;
field.CellFormat.FormatType = FormatType.Numeric;
field.CellFormat.FormatString = format;
});
我尝试使用
field.SummaryType = DevExpress.Data.PivotGrid.PivotSummaryType.Average;
在季度和月份中,但这没有效果。我尝试了很多其他方法,但似乎没有任何改变计算结果。
有什么建议吗?
我明白了。我需要使用自定义摘要类型
这是 PivotGrid 的代码
@using DevExpressPivotGridTest;
@{
string summaryField = ViewBag.SummaryField;
WWMMQ wwmmq = new WWMMQ();
}
@Html.DevExpress().PivotGrid(settings =>
{
settings.Name = "PivotGridProject";
settings.CallbackRouteValues = new { Controller = "PivotGrid", Action = "Project"};
settings.OptionsPager.RowsPerPage = 100;
settings.OptionsView.ShowFilterHeaders = false;
settings.OptionsView.ColumnTotalsLocation = PivotTotalsLocation.Near;
settings.CustomSummary = (sender, e) =>
{
int nbrWWs;
string fieldName = "";
if (e.ColumnField == null)
fieldName = "";
else
fieldName = e.ColumnField.FieldName;
switch (fieldName)
{
case "YYYYMM":
nbrWWs = wwmmq.GetWorkWeeksInMonth(e.ColumnFieldValue.ToInt());
e.CustomValue = e.SummaryValue.Summary.ToDecimal() / nbrWWs;
break;
case "YYYYQ":
nbrWWs = wwmmq.GetWorkWeeksInQuarter(e.ColumnFieldValue.ToInt());
e.CustomValue = e.SummaryValue.Summary.ToDecimal() / nbrWWs;
break;
case "YYYYWW":
default:
e.CustomValue = e.SummaryValue.Summary;
break;
}
};
settings.Fields.Add(field =>
{
field.Area = PivotArea.RowArea;
field.AreaIndex = 0;
field.FieldName = "ProjectName";
field.Caption = "Project";
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.RowArea;
field.AreaIndex = 2;
field.FieldName = "SupplierName";
field.Caption = "Supplier";
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 0;
field.TotalsVisibility = PivotTotalsVisibility.None;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Quarter Year";
field.FieldName = "YYYYQ";
field.CellStyle.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 1;
field.TotalsVisibility = PivotTotalsVisibility.None;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Month Year";
field.FieldName = "YYYYMM";
field.CellStyle.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 2;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Work Week";
field.FieldName = "YYYYWW";
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.SummaryType = PivotSummaryType.Custom;
field.Area = PivotArea.DataArea;
field.FieldName = summaryField;
field.Caption = summaryField;
field.CellFormat.FormatType = FormatType.Numeric;
field.CellFormat.FormatString = "n2";
});
}).Bind(Model).GetHtml()
public class WWMMQ
{
private List<MyDates> dates;
public WWMMQ()
{
dates = MyDates.Get();
}
public WWMMQ(string startDate, string endDate)
{
dates = MyDates.Get(startDate, endDate);
}
public int GetWorkWeeksInMonth(int month)
{
// some months have 4, some months have 5
return dates.Count(d => d.YYYYMM == month);
}
public int GetWorkWeeksInQuarter(int quarter)
{
// most quarters have 13, some quarters have 14
return dates.Count(d => d.YYYYQ == quarter);
}
诀窍是定义自定义摘要函数。 DevExpress 已经计算了所有的聚合。对于周摘要,我只是像往常一样使用 Sum 值,但对于月和季度,我使用 Sum,但将其除以月或季度中的周数以获得平均值。
我有一个 DevExpress MVC PivotGrid。它有一个 header,最高级别是季度,然后是月,然后是周。传递给网格的数据需要对周的数据求和,但对月的周数据求平均,对季度的数据(周或月)求平均。
网格截图如下:
我希望第 201632、201633、201634、201635 周为 0.1,但 2016 年 7 月也应为 0.1(因为这是平均值)并且与 9 月相同。那么2016年Q2、2016年Q4应该也有0.1(因为这是平均值)。
这是网格字段的代码
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 0;
field.TotalsVisibility = PivotTotalsVisibility.None;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Quarter Year";
field.FieldName = "YYYYQ";
field.CellStyle.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 1;
field.TotalsVisibility = PivotTotalsVisibility.None;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Month Year";
field.FieldName = "YYYYMM";
field.CellStyle.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 2;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Work Week";
field.FieldName = "YYYYWW";
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.DataArea;
field.FieldName = summaryField;
field.Caption = summaryField;
field.CellFormat.FormatType = FormatType.Numeric;
field.CellFormat.FormatString = format;
});
我尝试使用
field.SummaryType = DevExpress.Data.PivotGrid.PivotSummaryType.Average;
在季度和月份中,但这没有效果。我尝试了很多其他方法,但似乎没有任何改变计算结果。
有什么建议吗?
我明白了。我需要使用自定义摘要类型
这是 PivotGrid 的代码
@using DevExpressPivotGridTest;
@{
string summaryField = ViewBag.SummaryField;
WWMMQ wwmmq = new WWMMQ();
}
@Html.DevExpress().PivotGrid(settings =>
{
settings.Name = "PivotGridProject";
settings.CallbackRouteValues = new { Controller = "PivotGrid", Action = "Project"};
settings.OptionsPager.RowsPerPage = 100;
settings.OptionsView.ShowFilterHeaders = false;
settings.OptionsView.ColumnTotalsLocation = PivotTotalsLocation.Near;
settings.CustomSummary = (sender, e) =>
{
int nbrWWs;
string fieldName = "";
if (e.ColumnField == null)
fieldName = "";
else
fieldName = e.ColumnField.FieldName;
switch (fieldName)
{
case "YYYYMM":
nbrWWs = wwmmq.GetWorkWeeksInMonth(e.ColumnFieldValue.ToInt());
e.CustomValue = e.SummaryValue.Summary.ToDecimal() / nbrWWs;
break;
case "YYYYQ":
nbrWWs = wwmmq.GetWorkWeeksInQuarter(e.ColumnFieldValue.ToInt());
e.CustomValue = e.SummaryValue.Summary.ToDecimal() / nbrWWs;
break;
case "YYYYWW":
default:
e.CustomValue = e.SummaryValue.Summary;
break;
}
};
settings.Fields.Add(field =>
{
field.Area = PivotArea.RowArea;
field.AreaIndex = 0;
field.FieldName = "ProjectName";
field.Caption = "Project";
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.RowArea;
field.AreaIndex = 2;
field.FieldName = "SupplierName";
field.Caption = "Supplier";
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 0;
field.TotalsVisibility = PivotTotalsVisibility.None;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Quarter Year";
field.FieldName = "YYYYQ";
field.CellStyle.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 1;
field.TotalsVisibility = PivotTotalsVisibility.None;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Month Year";
field.FieldName = "YYYYMM";
field.CellStyle.HorizontalAlign = System.Web.UI.WebControls.HorizontalAlign.Center;
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.Area = PivotArea.ColumnArea;
field.AreaIndex = 2;
field.CellStyle.Wrap = DefaultBoolean.False;
field.Width = 150;
field.Caption = "Work Week";
field.FieldName = "YYYYWW";
field.Options.AllowSort = DefaultBoolean.False;
field.Options.AllowFilter = DefaultBoolean.False;
});
settings.Fields.Add(field =>
{
field.SummaryType = PivotSummaryType.Custom;
field.Area = PivotArea.DataArea;
field.FieldName = summaryField;
field.Caption = summaryField;
field.CellFormat.FormatType = FormatType.Numeric;
field.CellFormat.FormatString = "n2";
});
}).Bind(Model).GetHtml()
public class WWMMQ
{
private List<MyDates> dates;
public WWMMQ()
{
dates = MyDates.Get();
}
public WWMMQ(string startDate, string endDate)
{
dates = MyDates.Get(startDate, endDate);
}
public int GetWorkWeeksInMonth(int month)
{
// some months have 4, some months have 5
return dates.Count(d => d.YYYYMM == month);
}
public int GetWorkWeeksInQuarter(int quarter)
{
// most quarters have 13, some quarters have 14
return dates.Count(d => d.YYYYQ == quarter);
}
诀窍是定义自定义摘要函数。 DevExpress 已经计算了所有的聚合。对于周摘要,我只是像往常一样使用 Sum 值,但对于月和季度,我使用 Sum,但将其除以月或季度中的周数以获得平均值。