Aufgabenstellung
Auf der Basis einer Datenbank-Abfrage werden Balkendiagramme, Tortendiagramme und Liniendiagramme mit Flex 3 und der Middleware FluorineFX, die auf einem Microsoft IIS Server läuft, erstellt.
Ansatz
FluorineFX lässt sich über die Webseite http://www.fluorinefx.com/download.html herunterladen und installieren.
Es handelt sich hierbei lediglich um eine Web-Anwendung, die auf dem Microsoft IIS Server mit dem Enterprise Manager eingebunden werden muss.
Vorraussetzungen
- Installation von FluorineFX auf dem Microsoft IIS Server
- Installation von Adobe Flex
- Installation einer .NET Umgebung
- Konfiguration aller Komponenten
Lösung
Beispiel
Code in FluorineFX
Der folgende Code wird in Visual Studion (Express) als Projekttyp Klassenbibliothek (oder FluorineFX Service Projekt) mit der Sprache C# genutzt. Die C# Klassenbibliothek wird im kompilierten Zustand (dll-Datei) in den Order „bin“ im FluorineFX-Verzeichnis (welches als Website in IIS eingebunden wurde) kopiert.
Die SQL-Anweisung sollte aus Performance-Gründen möglichst stark aggregiert werden. Das Beispiel benutzt eine zweispaltige Struktur (ReportVO) und kann beliebig angepasst werden.
C# Code:
using System; using System.Collections.Generic; using System.Text; using System.Collections; using System.Data.SqlClient; using FluorineFx; // Wichtig! FluorineFx.dll Verweis einbinden namespace ITReportingServices { [RemotingService("ReportingService")] public class ReportingService { public ArrayList getReport() { ArrayList reports = new ArrayList(); SqlConnection conn = new SqlConnection(MyConfigurationManager.msSqlServerString); try { conn.Open(); SqlCommand comm = new SqlCommand(); comm.Connection = conn; comm.CommandText = "SELECT MONTH(buchdatum) As Monat, "+ "sum(wert) AS Summe FROM costcenteraccounting "+ "WHERE (YEAR(buchdatum)) = 2011 "+ "AND costcenter='101008960' "+ "GROUP BY (MONTH(buchdatum)), (YEAR(buchdatum)) "; SqlDataReader reader = comm.ExecuteReader(); while (reader.Read()) { ReportVO vo = new ReportVO(); vo.monat = reader.GetValue(0).ToString(); vo.summe = reader.GetValue(1).ToString().Replace(",","."); reports.Add(vo); } } catch (Exception e) { reports = new ArrayList(); ReportVO vo = new ReportVO(); vo.monat = e.Message; vo.summe = e.Message; reports.Add(vo); return reports; } finally { conn.Close(); } return reports; } } public class ReportVO { public string monat; public string summe; } }
Code in Adobe Flex
Das Model wird auf den .NET-Namespace gemappt.
Model:
package models { [RemoteClass(alias="ITReportingServices.ReportVO")] public class ReportVO { public var monat:String; public var summe:String; public function ReportVO() { } } }
Service in Flex-Code aufrufen:
<!-- unter den Script-Teil in MXML schreiben --> <mx:RemoteObject id="reportingService" destination="GenericDestination" source="ITReportingServices.ReportingService" showBusyCursor="true" fault="faultHandler(event)" > <mx:method name="getReport" result="getReportHandler(event)"/> </mx:RemoteObject> ... // Das hier in mx:Script Teil [Bindable] public var reports:ArrayCollection=new ArrayCollection(); public function creationComplete():void { reportingService.getReport(); } public function getReportHandler(event:ResultEvent):void { reports = event.result as ArrayCollection; } public function faultHandler(event:FaultEvent):void { Alert.show(event.fault.toString()); }
Diagramme
Balkendiagramm:
<mx:ColumnChart dataProvider="{reports}" height="100%" width="100%" id="columnchart1"> <mx:horizontalAxis> <mx:CategoryAxis id="ca" categoryField="monat" title="Market sizes" /> </mx:horizontalAxis> <!-- horizontal axis renderer --> <mx:horizontalAxisRenderers> <mx:AxisRenderer axis="{ca}" canDropLabels="false" /> </mx:horizontalAxisRenderers> <mx:series> <mx:ColumnSeries displayName="Amount" xField="monat" yField="summe"/> </mx:series> </mx:ColumnChart> <mx:Legend visible="false" dataProvider="{columnchart1}"/>
Tortendiagramm:
<mx:Label text="Linke Seite" /> <mx:PieChart id="pie2" width="100%" height="100%" dataaProvider="{reports}" showDataTips="true"> <mx:series> <!--Apply the Array of radii to the PieSeries.--> <mx:PieSeries field="summe" nameField="monat" labelPosition="callout"/> </mx:series> </mx:PieChart> <mx:Legend dataProvider="{pie2}"/>
Liniendiagramm:
<mx:LineChart width="100%" height="100%" id="myChart" dataProvider="{reports}" showDataTips="true"> <mx:horizontalAxis> <mx:CategoryAxis dataProvider="{reports}" categoryField="month"/> </mx:horizontalAxis> <mx:series> <mx:LineSeries yField="summe" displayName="Summe"/> </mx:series> </mx:LineChart>