Friday, 13. may 2011 5 13 /05 /Mai /2011 17:53

Microsoft Reporting Services (SSRS) kann bekanntlich auf diverse unterschiedlichste Arten von Datenquelle zugreifen, so auch auf XML Daten. Dabei muss es nicht zwingend eine fixe XML Datei sein, die auf einem Web Server gehostet ist. Es darf auch das dynamische Ergebnis eines SOAP oder Web API Request’s sein.

Freie Web APIs, die auch brauch- & verwertbare Daten liefern, gibt es einige. Für einen ersten Test habe ich mich im Bereich Wetter & deren Vorhersage umgesehen. Es gibt eine Google Weather API, die allerdings undokumentiert ist und es gibt auch keine Garantie zur Verfügbarkeit bzw. wie lange es diese API noch gibt. Die API liefert ein einfach gehaltenes XML Ergebnis, das man problemlos im Internet Explorer oder Tools wie XML Notepad anzeigen kann. Nur SSRS mag das Ergebnis nicht, es sein ein ungültiges Zeichen in den Daten enthalten; es ist das Zeichen mit Hex-Wert A0 = No-Break Space (geschütztes Leerzeichen) zwischen dem Luftfeuchtewert und dem Prozentzeichen.

Aber es gibt noch andere Wetter APIs und eine frei nutzbare (sofern man sich an die Bedingungen hält) ist die Yahoo Weather API. Die API liefert einen RSS Feed, was aber auch nichts anderes als XML Daten sind, ein Beispiel kann man bei Yahoo sehen. Die Basis URL lautet http://weather.yahooapis.com/forecastrss und es gibt nur zwei Parameter:

   U = Einheit (unit) für die Temperatur Wert
   W = WOEID, die Id der Stadt / Bereich, für den das Wetter abgefragt werden soll.

Die WOEID kann man z.B. über den GeoPlanet-Explorer heraus suchen. Beispiel für Hannover (w=657169) in Grad Celsius (=c):

http://weather.yahooapis.com/forecastrss?u=c&w=657169

Wie kann ich nun das Ergebnis für einen SSRS Report nutzen? Zunächst legt man eine Datenquelle an, da auf die API nur im dem Bericht zugegriffen wird, reicht eine eingebettete Datenquelle, eine freigegeben wird nicht nötig sein; als Verbindungstyp wählt man natürlich XML. In der Verbindungszeichenfolge gibt man nur die URL wie oben an, sonst nichts; die WOEID als dynamischer Parameter gestalte ich später noch. In den „Anmeldeinformationen“ muss „Aktuellen Windows-Benutzer verwenden“ ausgewählt sein; SSRS erwartet immer eine Anmeldeinformation, auch wenn sie nicht benötigt wird.

Als nächstes benötigt man ein Dataset für die anzuzeigenden Daten. Zum Abfragen von XML Daten werden XML Queries verwendet; das war für mich zunächst auch noch etwas neu, auch wenn ich in T-SQL schon ein wenig damit gearbeitet habe; etwas ins Thema eingearbeitet (siehe weiterführende Links unten) und etwas experimentiert, schon habe ich brauchbare Ergebnisse erhalten. Hier mal ein Beispiel, um die Forecast abzufragen, je API Request gibt es für die nächsten zwei Tage ein Ergebnis.

Die allereinfachste Abfrage sieht so aus: 

 <Query>
  <ElementPath IgnoreNamespaces="true">
<ElementNode>
<XMLName>
*
</XMLName>
</ElementNode>
</ElementPath>
</Query>

Durch die Angabe des Sternchens * versucht der Query Designer zu ermitteln, welche Elemente & Attribute selektierbar sind; da die XML Strukture des RSS Feeds etwas komplexer sind und ein paar Namespaces verwendet werden, funktioniert es nicht so gut. Bessere Ergebnisse erzielt man, wenn man explizit ElementPath & ElementNodes angibt, dadurch werden aber auch mehrere Dataset’s benötigt, um alle Daten zu erhalten. Hier mal ein Beispiel für die Forecast Nodes der XML Daten:  

<Query xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0"
xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<ElementPath IgnoreNamespaces="true">
<ElementNode>
<XMLName>
rss{}/channel{}/item{}/forecast
</XMLName>
</ElementNode>
</ElementPath>
</Query>

 

Es werden zunächst die Namesspaces definiert und dann gezielt über ElementPath + ElementNode die gewünschten Elemente adressiert. Man erhält nun ein Dataset mit Feldern je Element, wobei das letzte Feld immer dem ElementNode-Namen entspricht und keine Daten enthält.

 

Ein Dataset haben wir nun und mit dem kann man nun eine Table auf dem Report anlegen, um die Daten anzuzeigen. Wie erwähnt müssen weitere Dataset’s je Element-Hierarchie angelegt werden, um weitere Daten aus dem XML Ergebnis zu selektieren. Das ist soweit kein Problem, nur etwas Fleißarbeit.

So, bisher war die URL fix für eine WOEID hinterlegt, wünschenswerte wäre aber, die Wettervorhersage auch für andere Orte abrufen zu können. Dazu lege ich einen Parameter namens WOEID mit einer festen Werteliste an; Default setze ich wieder auf Hannover.

Die Verbindungszeichenfolge muss dann von einem festen Werte auf einen „Ausdruck“ geändert werden, der sieht so aus:

= "http://weather.yahooapis.com/forecastrss?u=c&w=" & Parameters!WOEID.Value

also nichts anderes als die Basis URL mit der WOEID als variabler Teil. Nach der Änderung funktionieren aber die Abfragen im Query Designer nicht mehr, deswegen sollte man diese Anpassung erst ganz zu Letzt machen.

Das Ergebnis sieht so aus und kann wie üblich von meinem SkyDrive heruntergeladen werden, Anpassungen sind dieses Mal eigentlich nicht nötig, da die sonst variable Datenquelle hier fix ist; eben die Yahoo URL. 


  YahooWeatherReport.jpg

Ein nettes Gimmick, dieser Wetterbericht. Es ist wirklich kein Must-Have, aber wenn man eh schon einen Reporting Service im Einsatz hat, kann man den Report doch auch mit veröffentlichen; frisst ja kaum Brot. 

Dann noch eine Subsription mit PDF Versand per Email und schon muss man nicht mehr die Nachrichten hören, um die aktuelle Wettervorhersage zu erhalten. J

Und ich für meinen Teil werden nun weiter Ausschau nach freien Web APIs halten, die man für SSRS Berichte nutzen könnte.

Weiterführende Links bei MSDN:

-       XML-Abfragesyntax zum Angeben von XML-Berichtsdaten
-       Syntax für Elementpfade zum Angeben von XML-Berichtsdaten

von Olaf Helper - veröffentlicht in: Reporting - Community: Microsoft SQL Server
Kommentar hinzufügen - Kommentare (0)ansehen
Friday, 29. april 2011 5 29 /04 /Apr. /2011 18:49

Es ist natürlich nicht wirklich als Ersatz für das DatePicker Control für Datumsparameter gedacht, sondern mehr als kleines Gimmick und ist auch eher ein kleines Experiment, was so machbar ist im Microsoft Reporting Services.

Um einen Kalender abbilden zu können, werden natürlich zunächst einmal die Datumswerte für einen Bereich rund um ein vorgegebenes Datum benötigt. Damit man auch eine einfache Liste zu Darstellung verwendet werden kann, sollten die Daten nach Wochentagnamen pivotisiert sein. Das kann mit zwei Funktionalitäten vom Microsoft SQL Server erreicht werden: Eine Common Table Expression zum Erzeugen der Datenreihe und die Pivot Funktion um eine Kalenderwoche / Wochentag Matrix zu erhalten:

Statement: 

 -- Nur für Test in SSMS, für SSRS wieder entfernen
SET LANGUAGE DEUTSCH; -- Wegen fixen Wochentagnamen
DECLARE @startDate date; -- Parameter wie in SSRS definiert
SET @startDate = {d N'2011-01-03'};
;WITH
dates AS
(SELECT CAST(DATEADD(dd, -13 - DATEPART(dw, @startDate)
, @startDate) AS date) as CalendarDate
UNION ALL
SELECT DATEADD(dd, 1, CalendarDate) as CalendarDate
FROM dates
WHERE CalendarDate <
DATEADD(dd, 14 + (7 - DATEPART(dw, @startDate)), @startDate)
)
SELECT IsoWeek, [Montag], [Dienstag], [Mittwoch]
, [Donnerstag], [Freitag], [Samstag], [Sonntag]
FROM
(SELECT DATEPART(iso_week, CalendarDate) AS IsoWeek
,DATENAME(dw, CalendarDate) AS DayName
,CalendarDate
FROM dates
) AS PivotSource
PIVOT (Min(CalendarDate)
FOR DayName IN ( [Montag], [Dienstag], [Mittwoch]
,[Donnerstag], [Freitag], [Samstag], [Sonntag])
) AS PivotTable
ORDER BY [Montag], [Dienstag], [Mittwoch]
, [Donnerstag], [Freitag], [Samstag], [Sonntag]
 Ergebnis:

 IsoWeek     Montag     Dienstag   Mittwoch   Donnerstag Freitag    Samstag    Sonntag
----------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
51          2010-12-20 2010-12-21 2010-12-22 2010-12-23 2010-12-24 2010-12-25 2010-12-26
52          2010-12-27 2010-12-28 2010-12-29 2010-12-30 2010-12-31 2011-01-01 2011-01-02
1           2011-01-03 2011-01-04 2011-01-05 2011-01-06 2011-01-07 2011-01-08 2011-01-09
2           2011-01-10 2011-01-11 2011-01-12 2011-01-13 2011-01-14 2011-01-15 2011-01-16
3           2011-01-17 2011-01-18 2011-01-19 2011-01-20 2011-01-21 2011-01-22 2011-01-23

 

Da für die PIVOT Funktion fixe Werte für die Wochentage verwendet werden, funktioniert die Abfrage natürlich nur mit deutschen Spracheinstellungen und für die IsoWeek ist natürlich die DATEFIRST Einstellung wichtig; also komplett DE Settings. Als Aggregationsfunktion für PIVOT kann statt MIN auch jede andere Aggregation verwendet werden; es gibt ja nur ein Datum je Woche / Wochentag Gruppierung. Das Aufrechnen des DATEPART(dw,..) Wertes wird hier verwendet, um immer „volle“ Wochen zu erhalten. So enthält das Ergebnis immer die Woche, in der das Datum liegt und jeweils +/- 2 volle Wochen drum rum.

 Weiter geht’s mit dem Report. Da die Daten bereits wie gewünscht aufbereitet sind, reicht eben ein einfaches Listen Control für die Darstellung (abgesehen davon, dass in SSRS 2008/2008R2 eh alles ein Tablix ist). Um die Liste auch als interaktives Control verwenden zu können, wird einfach „Aktion“ Funktion bei den einzelnen Datumsfelder verwendet. Hier gibt man als „Gehe zu Bericht“ den gleichen Bericht wieder an und legt für den Parameter den Wert des aktuellen Feldes an; so wird der Bericht erneut mit dem neuen, angeklickten Datum aufgerufen.

Calender_Action.jpg

Analog kann man über Textboxen / Images Funktionen wie „Heute“, „Vorjahr“ oder „Folgemonat“ umsetzen, nur das hier für den Parameter beim Berichtsaufruf eine Expression verwendet wird, wo auf dem aktuellen Datumsparameter per DateAdd ein Wert aufgerechnet wird bzw. fix auf Today() gesetzt wird.

Das BIDS 2008 Projekt kann von meinem SkyDrive geladen werden, es muss dann nur die Datenquelle angepasst werden, wobei die auch auf die master Datenbank zeigen kann; es wird ja aus keiner Tabelle selektiert, sondern nur eine CTE mit fixen Werten verwendet.

Eine Vorschau des Reports sieht so aus, optisch kann es ja nach Belieben gestaltet werden; die aufs Datum bezogenen Daten können dann unterhalb des Kalenders angezeigt werden:

Calender Preview

 

von Olaf Helper - veröffentlicht in: Reporting - Community: Business Intelligence
Kommentar hinzufügen - Kommentare (1)ansehen
Friday, 22. april 2011 5 22 /04 /Apr. /2011 05:55

Wenn man im SSMS = „Microsoft SQL Server Management Studio“ im Query Editor ein T-SQL Statement ausführt, hat man im Standard immer 2 Kartenreiter als Resultat: „Ergebnisse“ und „Meldungen“. Bei einfachen Statements bekommt man unter „Meldungen“ so etwas wie „(5 Zeile(n) betroffen)“ zu sehen. Bei eher administrativen Statements wie DBCC Kommandos werden schon umfangreichere Meldungen ausgegeben und auch die Texte von benutzerdefinierten Meldungen aus PRINT Anweisungen erscheinen dort.
Durchaus informative Meldungen erhält man zum Beispiel bei BACKUP DATABASE Anweisungen; wenn man den Parameter STATS mit angibt, erhält man Fortschrittsmeldungen, wie viel Prozent des Vorganges bereits abgeschlossen sind.

Wenn man solche Kommandos per ADO.NET absetzt, wäre es praktisch, solche Meldungen empfangen zu können, um dem Benutzer ein Feedback zu geben; „Jetzt sind bereits 30% des Backup Vorganges abgeschlossen.“. Nur wie?

Das geht recht einfach über das SqlConnection.InfoMessage Ereignis; hier ein kleines Beispiel als einfache Konsolen Anwendung:

Imports System.Data.SqlClient
Module InfoMessage
    Sub Main()
        Console.WriteLine("Start backup")
        Using conn As New SqlConnection("Data Source=.\SQL105DEV;Initial Catalog=master;Integrated Security=True;")
             Dim sql = "BACKUP DATABASE [AdventureWorks2008R2] " & _
"TO DISK = N'AdvWorks2K8R2.bak' " & _
"WITH NOFORMAT, INIT, NAME = N'Backup AdventureWorks2008R2' " & _
", SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10;"
            Using cmd As New SqlCommand(sql, conn)
                AddHandler conn.InfoMessage, New SqlInfoMessageEventHandler(AddressOf OnInfoMessage)
                conn.Open()
cmd.ExecuteNonQuery()
            End Using
        End Using
        Console.WriteLine("Press any key to exit.")
Console.ReadKey()
    End Sub
    Private Sub OnInfoMessage(sender As Object, args As SqlInfoMessageEventArgs)
        Console.WriteLine(args.Message)
        For Each err As SqlError In args.Errors
Console.WriteLine(err.Message)
Next
    End Sub
End Module

 

Ergebnis:

SqlInfoMessage.jpg

 

P.S.: Der im BACKUP Command verwendet Parameter COMPRESS war in den Versionen bis einschließlich MS SQL Server 2008 ausschließlich der Enterprise Edition vorbehalten; seit SQL Server 2008 R2 geht das auch bereits ab der Standard Edition; juhu.

von Olaf Helper - veröffentlicht in: .NET - Community: .NET Development
Kommentar hinzufügen - Kommentare (0)ansehen
Thursday, 21. april 2011 4 21 /04 /Apr. /2011 17:46

Microsoft hat sein Online Fortbildungsprogramm (E-Learning) um die Microsoft Virtual Academy (MVA) erweitert, der man kostenlos bei treten kann.

Momentan werden 4 Kurse angeboten, die sich alle um die Cloud drehen, also um Windows Azure, dabei ist auch ein Kurs zu SQL Azure. Die Kurse beziehen sich inhaltlich mehr auf technologische und administrative Aspekte von Azure, Themen zur Entwicklung sind nicht dabei, das wird nur etwas am Rande behandelt.
Wenn man einen Kurs startet, muss man die Lektionen einen nach dem anderen abarbeiten, wobei die Kursmaterialen aus PDF Dokumenten und WebCasts bestehen. Als Abschluss jedes Kurses kann man eine Prüfung (Self-Assessment) ablegen, dabei werden 5 – 7 Fragen gestellt, die man innerhalb 10 Minuten beantworten muss. Für jede gestartete Lektion und für jede erfolgreich abgeschlossene Prüfung gibt es Punkte, wobei es für die Prüfungen immer die volle Punktezahl gibt, auch wenn ein oder zwei Fragen falsch beantwortet wurden. Von daher sagt die volle erreichte Punktezahl nur aus, das man alles abgearbeitet hat, aber nicht wie gut … mal abgesehen, das man nebenher schummeln könnte und die Antworten im Netz suchen könnte.
Es ist halt nur zur Selbstkontrolle gedacht; eben ein Self-Assessment.

von Olaf Helper - veröffentlicht in: MSSQL - Community: Microsoft SQL Server
Kommentar hinzufügen - Kommentare (0)ansehen
Tuesday, 19. april 2011 2 19 /04 /Apr. /2011 12:22

Wie ich schon berichtete, gab es nach der Installation des Service Pack 1 für das Microsoft Visual Studio 2010 einige Probleme mit IntelliSense im SQL Server Management Studio (SSMS).

 

Seit kurzen gibt es dazu auch einen MS Support Eintrag:

 

FIX: The IntelliSense feature in SQL Server Management Studio for SQL Server 2008 R2 may stop working after you install Visual Studio 2010 Service Pack 1

und einen Fix dazu; das Problem kann mit dem Cumulative Update package 7 for SQL Server 2008 R2 behoben werden.

von Olaf Helper - veröffentlicht in: Download MSSQL - Community: Microsoft SQL Server
Kommentar hinzufügen - Kommentare (0)ansehen

Über diesen Blog

Kategorien

Kalender

February 2012
M T W T F S S
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29        
<< < > >>

Syndication (RSS)

  • RSS-Feed der Artikel

Suchen

Blog erstellen

Erstellen Sie einen Blog auf OverBlog - Kontakt - Nutzungsbedingungen - Werbung - Missbrauch melden - Impressum - Artikel mit den meisten Kommentaren