Google Analytics auf dem Windows Phone 7 mit SSIS und SSRS

image

Die Firma BlueGranite hat mit BlueGranite Nitro for Windows Phone 7 eine kostenlose Applikation für das Windows Phone 7 herausgebracht, die Daten aus verschiedenen XML Quellen visualisiert, darunter auch XML Daten, die von den SSRS generiert worden sind. BlueGranite Nitro bietet ein umfangreiches Tutorial Create an SSRS Data Source for BlueGranite Nitro an, in dem sehr detailliert erklärt wird, wie Berichte zu erstellen sind. In der Visualization Gallery sind einige Screenshots von den möglichen Dashborads, zu sehen.

Da das Tutorial von BlueGranite bereits sehr umfangreich ist, möchte ich in folgendem Beispiel gar nicht zu sehr in das Erstellen des Dashboards eingehen, sondern vielmehr kurz und knapp zeigen, wie mittels SSIS und SSRS eine XML Datei für BlueGranite Nitro generiert wird und man somit von unterwegs z.B. auf seine GoogleAnalytics Daten zugreifen kann. Daraus ergibt sich der Vorteil, das man nicht zwangsläufig die Reporting Services aus dem Internet heraus erreichen muss.

 

Das SSIS Paket

image

Die GoogleAnalytics Daten werden über den Data Flow Task geladen. Für das Beispiel werden die Daten Browser, Country, Date, Month, Region, Year und Visits geladen.

Da von Google die Ländernamen ausgeschrieben zurückgegeben werden, BlueGranite Nitro aber die ISO2 Länderkürzel verwendet, müssen zur Darstellung der Daten in einer Landkarte die geladenen Daten um ISO2 Ländercodes ergänzt werden. Eine entsprechende Liste mit den ISO Ländercodes habe ich dafür bereits im SQL Server hinterlegt. Für die Suche der Daten mittels des Lookup Tasks wird die Spalte Country vorher über die Character Map Komponente in Großbuchstaben gewandelt. Die um den ISO2 Ländercode angereicherten GoogleAnalytics Daten werden am Ende in der Tabelle “SSISComponents” abgelegt, die nicht gefundenen Datensätze werden in diesem Beispiel einfach verworfen.

image

Nach dem Laden der Daten wird der Report über die Komponente SSIS ReportGeneratorTask als XML Datei gerendert und über den FTP Task auf einen FTP Server hochgeladen.

SNAGHTML3cfd66dd

Am Anfang des Paketes sind noch zwei kleine Aufräumroutinen eingebaut, zum einen wird eine ggf. bereits zuvor erstellte XML Datei über den File System Task gelöscht, zum anderen werden die zuvor geladenen Daten über den Execute SQL Task TRUNCATE SSISComponents wieder entfernt.

Der Report

Für BlueGranite Nitro wird mit dem Report Designer nicht der eigentliche Report erstellt, sondern es werden die Tabellen generiert, die später als XML der Anwendung zur Verfügung gestellt und geparst werden. Dabei muss jeder Report eine Tabelle DataLayout enthalten, über die die grundlegenden Konfigurationen zur Anzeige und zur Beschreibung der eigentlichen Daten festgelegt wird. Hier wird z.B. definiert ob Daten mit einem Indikator, als Funnel oder als Map dargestellt werden sollen. BlueGranite Nitro stellt über diese Konfigurationstabelle die eigentlichen Daten später als unterschiedliche “Seiten” auf dem Windows Phone 7 dar.

SNAGHTML3d06aee5

Als “Seiten” werden die verschiedenen Ansichten bezeichnet, die über das Touchdisplay hin und her geschoben werden können. In diesem Beispiel werden aus den oben geladenen Daten insgesamt drei “Seiten” erstellt:

  • Zugriffe pro Browser
  • Zugriffe pro Land
  • Zugriffe pro Land auf einer Weltkarte

Die Daten werden für die 3 “Seiten” über die Tabelle DataLayout mit dem folgenden SQL Script formatiert:

   1: SELECT    'BrowserData' AS DataSet, 'Browser' AS PageTitle

   2:         , 'Visits by Browser' AS ChartTitle, '17' AS ChartType

   3:         , 'Browser' AS x1, 'Visits' as y1

   4:         , 'Quota' as y2, 'KPI Status' as y3, NULL AS y1Format

   5:         , 'P2' AS y2Format, 'true' AS IncludeKPI, NULL AS MapName

   6:         , NULL AS KPIPositiveARGB,  NULL AS KPINegativeARGB

   7:         , NULL AS KPIZeroARGB, NULL AS MapSource

   8: UNION

   9: SELECT    'CountryData' AS DataSet, 'Country' AS PageTitle

  10:         , 'Visits by Country' AS ChartTitle, '17' AS ChartType

  11:         , 'Country' AS x1, 'Visits' as y1, 'Quota' as y2

  12:         , 'KPI Status' as y3, NULL AS y1Format, 'P2' AS y2Format

  13:         , 'true' AS IncludeKPI, NULL AS MapName

  14:         , NULL AS KPIPositiveARGB,  NULL AS KPINegativeARGB

  15:         , NULL AS KPIZeroARGB, NULL AS MapSource

  16: UNION

  17: SELECT    'WorldMap' AS DataSet, 'World' AS PageTitle

  18:         , 'Visits by Country' AS ChartTitle, '19' AS ChartType

  19:         , 'Country' AS x1, 'Visits' as y1, NULL as y2, NULL AS y3

  20:         , 'P2' AS y1Format, NULL AS y2Format, NULL AS IncludeKPI

  21:         , 'WORLD' AS MapName, '#FF7ECD6E' AS KPIPositiveARGB

  22:         ,  '#FFE26161' AS KPINegativeARGB, '#FFF8FA4C' AS KPIZeroARGB

  23:         , 'Embedded' AS MapSource

Die darzustellenden Daten werden im Report Designer in 3 unterschiedlichen DataSets definiert und als jeweils eigenständige Tabelle dem Report hinzugefügt.

image    SNAGHTML3d3fc247

Das Dataset BrowserData gibt dabei z.b. den Namen des Browser mit den dazugehörigen Visits, einem daraus berechneten prozentualen Wert und einem Wert für den Indikator aus. Der Indikator ist in dem Beispiel nicht unbedingt schön gemacht, Browser mit Visits > 50 % erhalten eine 1 (grüner Indikator), 30% – 50% eine 0 (gelber Indikator) und unter 30% eine –1 (roter Indikator), ist aber ja auch nur ein Beispiel.

image

In der XML Ausgabe sehen die Tabellen inkl. der Tabelle DataLayout wie folgt aus:

   1: <DataLayout>

   2:     <Details_Collection>

   3:       <Details DataSet="BrowserData" PageTitle="Browser" ChartTitle="Visits by Browser" ChartType="17" y2="Quota" x1="Browser" y3="KPI Status" y1="Visits" y2Format="P2" IncludeKPI="true" />

   4:       <Details DataSet="CountryData" PageTitle="Country" ChartTitle="Visits by Country" ChartType="17" y2="Quota" x1="Country" y3="KPI Status" y1="Visits" y2Format="P2" IncludeKPI="true" />

   5:       <Details DataSet="WorldMap" PageTitle="World" ChartTitle="Visits by Country" ChartType="19" x1="Country" y1="Visits" y1Format="P2" MapName="WORLD" MapSource="Embedded" KPIPositiveARGB="#FF7ECD6E" KPINegativeARGB="#FFE26161" KPIZeroARGB="#FFF8FA4C" />

   6:     </Details_Collection>

   7:   </DataLayout>

   8:   <BrowserData>

   9:     <Details1_Collection>

  10:       <Details1 x1="Chrome" y1="39" y2="0,08" y3="-1" />

  11:       <Details1 x1="Firefox" y1="132" y2="0,26" y3="-1" />

  12:       <Details1 x1="Internet Explorer" y1="322" y2="0,64" y3="1" />

  13:       <Details1 x1="Mozilla Compatible Agent" y1="1" y2="0,00" y3="-1" />

  14:       <Details1 x1="Opera" y1="3" y2="0,01" y3="-1" />

  15:       <Details1 x1="Safari" y1="8" y2="0,02" y3="-1" />

  16:     </Details1_Collection>

  17:   </BrowserData>

  18:   <CountryData>

  19:     <Details2_Collection>

  20:       <Details2 x1="Argentina" y1="2" y2="0,00" y3="-1" />

  21:       <Details2 x1="Australia" y1="12" y2="0,02" y3="-1" />

  22:       <Details2 x1="Austria" y1="19" y2="0,04" y3="-1" />

  23:       <Details2 x1="Belgium" y1="2" y2="0,00" y3="-1" />

  24:       <Details2 x1="Brazil" y1="3" y2="0,01" y3="-1" />

  25:       <Details2 x1="Canada" y1="5" y2="0,01" y3="-1" />

  26:       <Details2 x1="Chile" y1="3" y2="0,01" y3="-1" />

  27:       <Details2 x1="China" y1="10" y2="0,02" y3="-1" />

  28:       <Details2 x1="Colombia" y1="3" y2="0,01" y3="-1" />

  29:       <Details2 x1="Denmark" y1="1" y2="0,00" y3="-1" />

  30:       <Details2 x1="Egypt" y1="1" y2="0,00" y3="-1" />

  31:       <Details2 x1="France" y1="4" y2="0,01" y3="-1" />

  32:       <Details2 x1="Germany" y1="258" y2="0,51" y3="1" />

  33:       <Details2 x1="Greece" y1="1" y2="0,00" y3="-1" />

  34:       <Details2 x1="India" y1="8" y2="0,02" y3="-1" />

  35:       <Details2 x1="Ireland" y1="1" y2="0,00" y3="-1" />

  36:       <Details2 x1="Italy" y1="7" y2="0,01" y3="-1" />

  37:       <Details2 x1="Japan" y1="1" y2="0,00" y3="-1" />

  38:       <Details2 x1="Madagascar" y1="1" y2="0,00" y3="-1" />

  39:       <Details2 x1="Malaysia" y1="1" y2="0,00" y3="-1" />

  40:       <Details2 x1="Netherlands" y1="2" y2="0,00" y3="-1" />

  41:       <Details2 x1="Poland" y1="1" y2="0,00" y3="-1" />

  42:       <Details2 x1="Saudi Arabia" y1="1" y2="0,00" y3="-1" />

  43:       <Details2 x1="Serbia" y1="1" y2="0,00" y3="-1" />

  44:       <Details2 x1="South Africa" y1="3" y2="0,01" y3="-1" />

  45:       <Details2 x1="Spain" y1="1" y2="0,00" y3="-1" />

  46:       <Details2 x1="Sweden" y1="2" y2="0,00" y3="-1" />

  47:       <Details2 x1="Switzerland" y1="28" y2="0,06" y3="-1" />

  48:       <Details2 x1="Thailand" y1="1" y2="0,00" y3="-1" />

  49:       <Details2 x1="Turkey" y1="2" y2="0,00" y3="-1" />

  50:       <Details2 x1="Ukraine" y1="2" y2="0,00" y3="-1" />

  51:       <Details2 x1="United Kingdom" y1="25" y2="0,05" y3="-1" />

  52:       <Details2 x1="United States" y1="93" y2="0,18" y3="0" />

  53:     </Details2_Collection>

  54:   </CountryData>

  55:   <WorldMap>

  56:     <Details3_Collection>

  57:       <Details3 x1="AR" y1="0,00" y2="-1" />

  58:       <Details3 x1="AT" y1="0,04" y2="-1" />

  59:       <Details3 x1="AU" y1="0,02" y2="-1" />

  60:       <Details3 x1="BE" y1="0,00" y2="-1" />

  61:       <Details3 x1="BR" y1="0,01" y2="-1" />

  62:       <Details3 x1="CA" y1="0,01" y2="-1" />

  63:       <Details3 x1="CH" y1="0,06" y2="-1" />

  64:       <Details3 x1="CL" y1="0,01" y2="-1" />

  65:       <Details3 x1="CN" y1="0,02" y2="-1" />

  66:       <Details3 x1="CO" y1="0,01" y2="-1" />

  67:       <Details3 x1="DE" y1="0,51" y2="1" />

  68:       <Details3 x1="DK" y1="0,00" y2="-1" />

  69:       <Details3 x1="EG" y1="0,00" y2="-1" />

  70:       <Details3 x1="ES" y1="0,00" y2="-1" />

  71:       <Details3 x1="FR" y1="0,01" y2="-1" />

  72:       <Details3 x1="GB" y1="0,05" y2="-1" />

  73:       <Details3 x1="GR" y1="0,00" y2="-1" />

  74:       <Details3 x1="IE" y1="0,00" y2="-1" />

  75:       <Details3 x1="IN" y1="0,02" y2="-1" />

  76:       <Details3 x1="IT" y1="0,01" y2="-1" />

  77:       <Details3 x1="JP" y1="0,00" y2="-1" />

  78:       <Details3 x1="MG" y1="0,00" y2="-1" />

  79:       <Details3 x1="MY" y1="0,00" y2="-1" />

  80:       <Details3 x1="NL" y1="0,00" y2="-1" />

  81:       <Details3 x1="PL" y1="0,00" y2="-1" />

  82:       <Details3 x1="RS" y1="0,00" y2="-1" />

  83:       <Details3 x1="SA" y1="0,00" y2="-1" />

  84:       <Details3 x1="SE" y1="0,00" y2="-1" />

  85:       <Details3 x1="TH" y1="0,00" y2="-1" />

  86:       <Details3 x1="TR" y1="0,00" y2="-1" />

  87:       <Details3 x1="UA" y1="0,00" y2="-1" />

  88:       <Details3 x1="US" y1="0,18" y2="0" />

  89:       <Details3 x1="ZA" y1="0,01" y2="-1" />

  90:     </Details3_Collection>

  91:   </WorldMap>

Für die genaue Definition der Datasets und vor allem der Tabelle DataLayout noch einmal der Hinweis auf das oben erwähnte sehr ausführliche Tutorial. Wichtiger Hinweis dazu, die angegebenen Namen für die Maps sind Case Sensitive.


BlueGranite Nitro


Innerhalb von BlueGranite Nitro auf dem Windows Phone 7 wird nun noch ein neues Dashboard hinzugefügt. Als URL wird einfach auf die generierte XML Datei in dem entsprechende FTP Verzeichnis verwiesen und schon kann von unterwegs auf ein eigenes GoogleAnalytics Dashboard mit dem Windows Phone 7 zugegriffen werden.

Gerne hätte ich diesen Eintrag mit ein paar Screenshots von meinem Windows Phone 7 angereichert, aber leider ist es es derzeit nicht möglich auf dem Gerät Screenshot zu machen.