AdvancedDataGrid Programmatic Grouping and Summations
I was bashing my head against the monitor today trying to figure out why my actionscript created summation rows were not appearing in my Flex 3 AdvancedDataGrid component. After several hours I figured out it was, gasp, a string mismatch. I am fairly confident that my problem will appear for others so let me explain more after the Read More link.
Following these docs and this blog I figured I had my solution pretty quick. I hit play and no summarized rows appear. What happened? Well The SummaryField’s label property needs to exactly match a column in the AdvancedDataGrid. It makes perfect sense now but for several hours it was a mystery. Not only does it have to match a column but it has to match on the column’s datafield NOT the header text. The code below should make the scenario apparent:
<mx:Script>
<![CDATA[
import mx.collections.SummaryField;
import mx.collections.ArrayCollection;
[Bindable]
private var dpFlat:ArrayCollection = new ArrayCollection([
{Region:”Southwest”, Territory:”Arizona”,
Territory_Rep:”Barbara Jennings”, Actual:38865, Estimate:40000},
{Region:”Southwest”, Territory:”Arizona”,
Territory_Rep:”Dana Binn”, Actual:29885, Estimate:30000},
{Region:”Southwest”, Territory:”Central California”,
Territory_Rep:”Joe Smith”, Actual:29134, Estimate:30000},
{Region:”Southwest”, Territory:”Nevada”,
Territory_Rep:”Bethany Pittman”, Actual:52888, Estimate:45000},
{Region:”Southwest”, Territory:”Northern California”,
Territory_Rep:”Lauren Ipsum”, Actual:38805, Estimate:40000},
{Region:”Southwest”, Territory:”Northern California”,
Territory_Rep:”T.R. Smith”, Actual:55498, Estimate:40000},
{Region:”Southwest”, Territory:”Southern California”,
Territory_Rep:”Alice Treu”, Actual:44985, Estimate:45000},
{Region:”Southwest”, Territory:”Southern California”,
Territory_Rep:”Jane Grove”, Actual:44913, Estimate:45000}
]);
public function init():void{
//SUMMARY Fields and Rows
var rAC:ArrayCollection=new ArrayCollection();
var nSumm:SummaryField=new SummaryField(”Actual”);
nSumm.label=”Min Actual”; //THIS MUST match an existing column datafield not the header text label
nSumm.operation=”MIN”;
rAC.addItem(nSumm);
var rSR:SummaryRow=new SummaryRow();
rSR.summaryPlacement=”group”;
rSR.fields=rAC.toArray();
var gc:GroupingCollection=null; //FOLLOW the hierarchy for Groups-fields-rows-summary rows
gc=new GroupingCollection();
gc.source=dpFlat;
var nGroup:Grouping=new Grouping();
var fields:Array=new Array();
var nField:GroupingField=new GroupingField();
nField.name=”Region”;
//find summaries
nField.summaries=[rSR];
fields.push(nField);
var nField2:GroupingField=new GroupingField();
nField2.name=”Territory”;
//find summaries
nField2.summaries=[rSR];
fields.push(nField2);
nGroup.fields=fields;
gc.grouping=nGroup;
nADG.dataProvider=gc;
gc.refresh();
}
]]>
</mx:Script>
<mx:AdvancedDataGrid id=”nADG” width=”100%” height=”100%”>
<mx:columns>
<mx:AdvancedDataGridColumn dataField=”Region”/>
<mx:AdvancedDataGridColumn dataField=”Territory_Rep”
headerText=”Territory Rep”/>
<mx:AdvancedDataGridColumn dataField=”Actual”/>
<mx:AdvancedDataGridColumn dataField=”Estimate”/>
<mx:AdvancedDataGridColumn dataField=”Min Actual” headerText=”Actual Min”/>
<mx:AdvancedDataGridColumn dataField=”Max Actual”/>
</mx:columns>
</mx:AdvancedDataGrid>
