データグリッドでの合計値の表示

データグリッドで合計値を表示してみました。
http://moeten.info/flex/20080708_rakutenShop3/bin-release/main.html

こつとしてはデータグリッドの更新を検出したら合計値を再計算します。

<mx:DataGrid updateComplete="calSum()">

合計値の計算
datagrid の分だけ for 文を回してあげればOK

private function calSum():void{
    if( dg2.dataProvider ){
        var dp2:ArrayCollection = dg2.dataProvider as ArrayCollection;
        var sum:int = 0;
        var len:int = dp2.length;
        for( var i:int = 0 ; i < len ; i ++ ){
            sum += dp2[i].price;
        }
        mySum.text = "" + sum + "円";
    }
}

おまけでアドバンストデータグリッドでもやってみました。
サマリーを使えばOKです。サマリーは oparation にて合計値や平均値を出すことが可能です。

AdvancedDataGrid なソースはこちら

<mx:Script>
<![CDATA[
private function formatSummary(data:Object, col:AdvancedDataGridColumn):Object{
    if (data.hasOwnProperty("summary")){
        return { color:0xFF0000, fontWeight:"bold", fontSize:12 };
    }
    return {};
}
//SUM、MIN、MAX、AVG、COUNT
private function flatSummaryObject():Object{
    return { title:"合計", summary:true };
}
private function flatSummaryObject2():Object{
    return { title:"平均", summary:true };
}
private function flatSummaryObject3():Object{
    return { title:"最大", summary:true };
}
private function flatSummaryObject4():Object{
    return { title:"最小", summary:true };
}
private function flatSummaryObject5():Object{
    return { title:"個数", summary:true };
}
]]>
</mx:Script>
<mx:AdvancedDataGrid id="adg" creationComplete="groupedData.refresh();adg.dataProvider.showRoot=false"
    groupItemRenderer="mx.controls.advancedDataGridClasses.AdvancedDataGridItemRenderer" dropEnabled="true"
    x="462" y="571" width="369" height="200" styleFunction="formatSummary">
    <mx:dataProvider>
       <mx:GroupingCollection id="groupedData" source="{dg2.dataProvider}" >
           <mx:Grouping>
                <mx:GroupingField >
                   <mx:summaries>
                       <mx:SummaryRow summaryPlacement="last" summaryObjectFunction="flatSummaryObject">
                           <mx:fields>
                               <mx:SummaryField dataField="price" operation="SUM" />
                           </mx:fields>
                       </mx:SummaryRow>
                       <mx:SummaryRow summaryPlacement="last" summaryObjectFunction="flatSummaryObject2">
                           <mx:fields>
                               <mx:SummaryField dataField="price"  operation="AVG"/>
                           </mx:fields>
                       </mx:SummaryRow>
                       <mx:SummaryRow summaryPlacement="last" summaryObjectFunction="flatSummaryObject3">
                           <mx:fields>
                               <mx:SummaryField dataField="price"  operation="MAX"/>
                           </mx:fields>
                       </mx:SummaryRow>
                       <mx:SummaryRow summaryPlacement="last" summaryObjectFunction="flatSummaryObject4">
                           <mx:fields>
                               <mx:SummaryField dataField="price"  operation="MIN"/>
                           </mx:fields>
                       </mx:SummaryRow>
                       <mx:SummaryRow summaryPlacement="last" summaryObjectFunction="flatSummaryObject5">
                           <mx:fields>
                               <mx:SummaryField dataField="price"  operation="COUNT"/>
                           </mx:fields>
                       </mx:SummaryRow>
                   </mx:summaries>
               </mx:GroupingField>
           </mx:Grouping>
       </mx:GroupingCollection>
    </mx:dataProvider>
    <mx:groupedColumns>
        <mx:AdvancedDataGridColumn headerText = "title" dataField="title"/>
        <mx:AdvancedDataGridColumn headerText = "price" dataField="price" width="100" />
    </mx:groupedColumns>
</mx:AdvancedDataGrid>
<mx:Button x="663" click="{groupedData.refresh();}" y="779" label="データグリッド更新(合計表示)"/>