Overblog
Folge diesem Blog Administration + Create my blog
Blog von Olaf Helper
Neueste Posts

Microsoft® SQL Server® code name 'Denali', Community Technology Preview 3 (CTP 3) Product Guide

11. August 2011 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

Microsoft hat mit der Microsoft® SQL Server® code name 'Denali', Community Technology Preview 3 (CTP 3) Product Guide eine sehr umfangreiche Sammlung an Whitepaper, Präsentationen, Videos, Linksammlungen und mehr zum SQL Server „Denali“ veröffentlich; eine Zusammenfassung kann man im SQL Server Blog nachlesen.

 

Der Download ist 456 MB groß, entpackt sind es 503 MB. Etwas durchgeblättert habe ich schon, der Aufbau ist sehr ansehnlich gestaltet und bei der Fülle an Informationen kann man sich damit durchaus ein paar Tage beschäftigen; genau das richtige fürs anstehende voraussichtlich verregnete Wochenende.

Weiterlesen

Microsoft® SQL Server® Codename 'Denali' Community Technology Preview 3 (CTP 3)

12. Juli 2011 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

Die neue Microsoft® SQL Server® Codename 'Denali' Community Technology Preview 3 (CTP 3) steht zum Download zur Verfügung und das auch auf Deutsch; natürlich für x86 und x64 Systeme.

Nicht verwirren lassen, man muss zunächst die "SQL DMS DE.html" herunterladen, auf der Seite findet man dann den weiterführenden Link. Der Download-Manager erfolgt dann über ein Download-Manager AddIn. Für x86 ist der Download 2,3 GB groß.

Ein aktuelles Feature Pack gibt es dazu. Man beachte auch, was in Denali / CTP 3 neu ist.

Weiterlesen

Der aktuelle Wetter- SSRS -Bericht

13. Mai 2011 , Geschrieben von Olaf Helper Veröffentlicht in #Reporting

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

Weiterlesen

Alternatives Kalender Control für SSRS Report Datums Parameter und das auf dem Report

29. April 2011 , Geschrieben von Olaf Helper Veröffentlicht in #Reporting

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

 

Weiterlesen

SqlConnection.InfoMessage Ereignis

22. April 2011 , Geschrieben von Olaf Helper Veröffentlicht in #.NET

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.

Weiterlesen

Microsoft Virtual Academy

21. April 2011 , Geschrieben von Olaf Helper Veröffentlicht in #MSSQL

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.

Weiterlesen

Fix für SSMS 2008 R2 IntelliSense nach Installation Visual Studio 2010 SP 1

19. April 2011 , Geschrieben von Olaf Helper Veröffentlicht in #Download MSSQL

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.

Weiterlesen

Verarbeiten von EZB Währungskursen

18. April 2011 , Geschrieben von Olaf Helper Veröffentlicht in #T-SQL

Umrechnungskurse für Währungen werden in vielen Fachbereichen und Anwendungsfällen benötigt. Der Börsenbroker benötigt sie im Sekundentakt für die Aktienbewertung, beim Verkauf von Import-Artikel mit Tagespreisen wird der aktuelle Tageskurs benötigt und die Buchhaltung verwendet für die Fremdwährung OP Bewertung einen Monats-Durchschnittskurs.

Die EZB Europäische Zentralbank veröffentlich die Tages-Umrechnungskurse seit Anfang 1999 als XML Datei im Internet. Man kann eine Datei mit den Kursen des letzten Banktages (TARGET Tag), der letzten 90 Tagen und die gesamte Aufstellung erhalten.

Diese Xml Daten bieten sich natürlich dazu an, sie einzulesen und per T-SQL weiter zu verarbeiten, um so eine Referenztabelle mit Umrechnungskursen zu pflegen. Etwas gekürzt sieht der Inhalt der Xml Datei so aus:

 <?xml version="1.0" encoding="UTF-8"?>
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"
xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
<gesmes:subject>Reference rates</gesmes:subject>
<gesmes:Sender>
<gesmes:name>European Central Bank</gesmes:name>
</gesmes:Sender>
<Cube>
<Cube time='2011-04-18'>
<Cube currency='USD' rate='1.4275'/>
<Cube currency='JPY' rate='118.25'/>
<Cube currency='BGN' rate='1.9558'/>
<Cube currency='CZK' rate='24.188'/>
</Cube>
</Cube>
</gesmes:Envelope>

 

Grundsätzlich ist das Verarbeiten kein Problem, allerdings muss man, um die Xml Daten überhaupt lesen zu können, zunächst die verwendete Namespace mittels WITH XmlNameSpaces deklarieren, hier gesmes:Envelope. Will man zugleich auch noch CTE (Common Table Expressions) verwenden, muss man nur berücksichtigen, das XmlNameSpaces an erste Stelle der WITH Anweisung gesetzt wird, die CTE’s dürfen erst darauf folgen.

Hat man das Namespace erst einmal deklariert, erfolgt das weitere Auslesen der Daten wie bei allen anderen Xml Daten auch. Das ganz Statement für eine Tabelle, das Einlesen und Umwandeln sieht dann so aus:

  -- ECB Währungskurse

 -- Tabelle für die Tageskurse anlegen, sofern noch nicht vorhanden. 
 IF OBJECT_ID('[dbo].[EcbDailyExchangeRates]', 'U ') IS NULL
CREATE TABLE [dbo].[EcbDailyExchangeRates]
( [ExcDate] date NOT NULL
,[Currency] char(3) NOT NULL
,[Rate] decimal(19, 6) NOT NULL
,CONSTRAINT [PK_EcbDailyExchangeRates] PRIMARY KEY CLUSTERED
( [ExcDate] ASC
,[Currency] ASC
) WITH ( PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF
  ,ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90)
);
GO
 -- Sourcen der Ecb Xml Dateien:
-- Letzter Tag: http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml
-- Letzten 90 Tage: http://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist-90d.xml
-- Komplett: http://www.ecb.int/stats/eurofxref/eurofxref-hist.xml

 -- Laden der Xml Datei in eine Variable 
 DECLARE @ecb XML;
SET @ecb = (SELECT CONVERT(xml, EcbSrc.BulkColumn) AS XmlRates
FROM OPENRowsET( BULK N'D:\eurofxref-hist.xml'
,SINGLE_BLOB) AS EcbSrc);
 -- Selektion der Kurse und Einfügen von fehlenden Werten 
;WITH XMLNAMESPACES
( 'http://www.gesmes.org/xml/2002-08-01' as gesmes
,DEFAULT 'http://www.ecb.int/vocabulary/2002-08-01/eurofxref')

 INSERT INTO [dbo].[EcbDailyExchangeRates]
( [ExcDate], [Currency], [Rate])
SELECT Cubes.Rows.value('@time', 'date') AS [ExcDate]
,Nodes.Rows.value('@Currency', 'char(3)') AS [Currency]
,Nodes.Rows.value('@Rate', 'decimal(19, 6)') AS [Rate]
FROM @ecb.nodes('/gesmes:Envelope/Cube/*') AS Cubes(Rows)
CROSS APPLY
Cubes.Rows.nodes('Cube') as Nodes(Rows)
LEFT JOIN
EcbDailyExchangeRates AS Dst
ON Dst.ExcDate = Cubes.Rows.value('@time', 'date')
AND Dst.Currency = Nodes.Rows.value('@Currency', 'char(3)')
WHERE Dst.ExcDate IS NULL
AND NOT Nodes.Rows.value('@Currency', 'char(3)') IS NULL;
 
Weiterlesen

Free ebook: Introducing Microsoft SQL Server 2008 R2

15. März 2011 , Geschrieben von Olaf Helper Veröffentlicht in #Free eBooks

Microsoft hat gleich 9 freie eBooks zu diversen Themen veröffentlicht, darunter auch das Buch "Introducing Microsoft SQL Server 2008 R2" von Ross Mistry und Stacia Misner; zugegeben nichts Neues.

Es umfasst zwei Bereiche "Database Administration" und "Business Intelligence" mit insgesamt 10 Kapiteln auf 216 Seiten; ein Leichtgewicht unter den Büchern zum SQL Server. Es befasst sich aber auch in erster Linie mit den Neuerungen im Microsoft SQL Server 2008 R2.

Weiterlesen

Bedingte Formatierung für Reporting Services

13. März 2011 , Geschrieben von Olaf Helper Veröffentlicht in #Reporting

Man muss ja nicht immer alles Nachmachen oder –programmieren, besonders nicht Features aus der Rubrik „Noch Bunter – Noch Greller“.

Die Funktion zur „Bedingten Formatierung“, die in MS Excel 2007 hinzugekommen ist, ist aber durchaus gut geeignet, um Werte und deren Größenordnung optisch hervor zu heben. Im MS Reporting Services kann man dieses ebenfalls abbilden, das setzt aber etwas Customer Code voraus.

Zum Testen nehme ich zunächst einmal eine einfache CTE mit fixen Werten für Umsatzzahlen her, die prozentualen Anteile am Jahresumsatz werden dann in einer weiteren CTE errechnet. Diese Prozentwerte will ich dann im Weiteren eben durch eine Hintergrundfarbe hervorheben.

 

 ;WITH 
Umsatz AS
( SELECT 'Kunde 1' As Customer, 15000 AS Ums2009, 17000 AS Ums2010
UNION ALL
SELECT 'Kunde 2', 23000, 22000 UNION ALL
SELECT 'Kunde 3', 10000, 12000 UNION ALL
SELECT 'Kunde 4', 39000, 32000 UNION ALL
SELECT 'Kunde 5', 1000, 3000)
 , Summe AS
( SELECT SUM(Ums2009) AS Total2009
,SUM(Ums2010) AS Total2010
FROM Umsatz)
 , Statistik AS
( SELECT Customer
,Ums2009
,Ums2010
,100 * Ums2009 / Total2009 AS Percentage2009
,100 * Ums2010 / Total2010 AS Percentage2010
,100 * (Ums2010 - Ums2009) / Ums2009 AS Raise
FROM Umsatz, Summe)
 SELECT *
FROM Statistik;

 

Nun brauch ich noch etwas Customer Code. Das Property „BackgroundColor“ erwartet entweder einen Farbnamen wie „Black“ für Schwarz oder einen RGB Werte als Hexadezimal Wert als String wie #FF0000 für einen Rotwert. Letzteres nutze ich, um einen Farbwert passend zum Prozentwert zu errechnen. Der Code, um einen Rotwert analog in der Helligkeit zum Prozentwert zu errechnen, sieht so aus:


 ' Liefert einen Rot-Farbwert als Hexadezimal-Wert (String) zu den übergebenen Prozentwerten 
 Public Function PercentageRed(ByVal percentage As Decimal) As String 
  ' Wert muss zwischen 0 und 100 sein; sonst zur Sicherheit auf Default Werte setzen 
  If percentage < 0 Then percentage = 0
If percentage > 100 Then percentage = 100
   Dim value As Integer 
  value = CInt(255.0 * (100.0 - percentage) / 100.0) 
   ' #FF = Rot als Basis
Return "#FF" & value.ToString("X2") & value.ToString("X2")
 End Function 

 

Also wirklich Karo-Einfach, den maximalen Byte-Wert von 255 ins Verhältnis gesetzt zum Prozentwert. Damit hohe Prozentwerte dunkel dargestellt werden, wird vom Prozentwert das Inverse gebildet.

Im Report setzte ich dann als Beispiel für die Textbox „Percentage2010“ das Property „BackgroundColor“ auf „Expression“ und füge nur noch das folgende Expression ein:

=Code.PercentageRed(Fields!Percentage2010.Value)

 

Das Ergebnis sieht dann so aus; für das bisschen Customer Code doch ganz gut, oder?


SsrsConditionalColoring-Kopie-1.jpg

 

Weiterlesen
<< < 1 2 3 4 5 6 7 8 9 10 20 > >>