<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ixto-Blog &#187; Sven Bayer</title>
	<atom:link href="http://www.ixto.de/blog/author/sbayer/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ixto.de/blog</link>
	<description>Business Intelligence, Database Consulting, Software Development</description>
	<lastBuildDate>Mon, 26 Sep 2011 09:23:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Deaktivieren von Reporting Services Abonnements</title>
		<link>http://www.ixto.de/blog/sql-server-2005/reportingservices/deaktivieren-von-reporting-services-abonnements/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/reportingservices/deaktivieren-von-reporting-services-abonnements/#comments</comments>
		<pubDate>Thu, 30 Sep 2010 14:50:16 +0000</pubDate>
		<dc:creator>Sven Bayer</dc:creator>
				<category><![CDATA[Reporting Services 2005]]></category>
		<category><![CDATA[Reporting Services 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=145</guid>
		<description><![CDATA[Wenn man häufiger mit den Abonnements der Reporting Services zu tun hat, musste der ein oder andere, ich leider auch, mit bedauern feststellen, dass es keine Möglichkeit gibt die angelegten Abonnements zu deaktivieren. Um das Verenden eines Berichts zu verhindern, konnte man dessen Abonnement entweder löschen oder den Zeitpunkt für die Ausführung weit in die [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn man häufiger mit den Abonnements der Reporting Services zu tun hat, musste der ein oder andere, ich leider auch, mit bedauern feststellen, dass es keine Möglichkeit gibt die angelegten Abonnements zu deaktivieren. Um das Verenden eines Berichts zu verhindern, konnte man dessen Abonnement entweder löschen oder den Zeitpunkt für die Ausführung weit in die Zukunft verlegen. Für mich zwei Methoden, die nicht wirklich benutzerfreundlich sind, entweder muss ich das Abonnement neu anlegen oder ich muss darauf achten meine Zeitänderungen wieder rückgängig zu machen und hab keine richtige Kontrolle über aktivierte oder deaktivierte Abonnements.</p>
<p> Ich möchte hier kurz beschreiben, wie es möglich ist, unter Verwendung der <em>ReportServer</em> Datenbank, die Ausführung der Abonnements einfach zu verwalten.</p>
<p><span id="more-145"></span><br />
<br\></p>
<h2>Die Grundidee</h2>
<p><br\><br />
Die Reporting Services speichern ihre Abonnements in der zugehörigen DB(Standardname: <em>ReportServer</em>). Die Tabelle in der alle Abonnements aufgeführt sind nennt sich <em>dbo.Subscriptions</em>:</p>
<p><img class="alignnone" title="Tabelle" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/SB/blog1.png" alt="" width="1059" height="648" /><br />
<br\><br />
In dieser Tabelle gibt es eine Spalte mit dem Namen <em>InactiveFlags</em>. Bei einem aktiven Abo ist dieser Wert auf 0 gesetzt. Um das Abo zu deaktivieren muss dieser Wert auf 1 geändert werden.<br />
<br\><br />
<br\></p>
<h2>Die Umsetzung</h2>
<p><br\><br />
Zunächst benötigen wir noch einige Tabellen, um die Lesbarkeit zu erhöhen, indem wir die IDs durch die zugehörigen Namen für Bericht, Abonnement und Benutzer ersetzen:</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup span="1">
<col style="width: 191px;" span="1"></col>
<col style="width: 181px;" span="1"></col>
<col style="width: 18px;" span="1"></col>
<col style="width: 251px;" span="1"></col>
</colgroup>
<tbody>
<tr style="background: black;">
<td style="padding-left: 7px; padding-right: 7px; border-top: solid black 1.5pt; border-left: solid black 1.5pt;"><span style="color: white; font-family: Times New Roman; font-size: 10pt;"><strong>Tabelle</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid black 1.5pt;" colspan="2"><span style="color: white; font-family: Times New Roman; font-size: 10pt;"><strong>Information</strong></span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid black 1.5pt; border-right: solid black 1.5pt;"> </td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-left: solid black 1.5pt;">
<p style="text-align: justify;"><span style="font-family: Times New Roman; font-size: 10pt;">Dbo.Users u</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px;">
<p style="text-align: justify;"><span style="font-family: Times New Roman; font-size: 10pt;">Benutzername</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-right: solid black 1.5pt;" colspan="2">
<p style="text-align: justify;"><span style="font-family: Times New Roman; font-size: 10pt;">u.UserID = OwnerID</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-left: solid black 1.5pt;">
<p style="text-align: justify;"><span style="font-family: Times New Roman; font-size: 10pt;">Dbo.Catalog c</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px;">
<p style="text-align: justify;"><span style="font-family: Times New Roman; font-size: 10pt;">Berichtsname</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-right: solid black 1.5pt;" colspan="2">
<p style="text-align: justify;"><span style="font-family: Times New Roman; font-size: 10pt;">c.ItemID = Report_OID</span></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-left: solid black 1.5pt; border-bottom: solid black 1.5pt;">
<p style="text-align: justify;"><span style="font-family: Times New Roman; font-size: 10pt;">[dbo].[ReportSchedule] rs</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-bottom: solid black 1.5pt;">
<p style="text-align: justify;"><span style="font-family: Times New Roman; font-size: 10pt;">SQL Server Agent Job Name</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-bottom: solid black 1.5pt; border-right: solid black 1.5pt;" colspan="2">
<p style="text-align: justify;"><span style="font-family: Times New Roman; font-size: 10pt;">SubscriptionID = rs.SubscriptionID</span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p> <br />
<br\><br />
Mit dem nachfolgendem SQL-Statement können wir die passenden Informationen auslesen:<br />
<br\><br />
<span style="font-family: Courier New;"><span style="color: blue;">SELECT<br />
</span>     s<span style="color: gray;">.</span>[SubscriptionID]<br />
     </span><span style="color: gray;">,</span>s<span style="color: gray;">.</span>[Description]<br />
             <span style="color: gray;">,</span>u<span style="color: gray;">.</span>UserName<br />
<span style="color: gray;">             ,</span>c<span style="color: gray;">.</span>Name as ReportName<br />
             <span style="color: gray;">,</span>[InactiveFlags]<br />
             <span style="color: gray;">,</span>rs<span style="color: gray;">.</span>ScheduleID <span style="color: blue;">AS</span> JobName<br />
             <span style="color: gray;">,</span>rs<span style="color: gray;">.</span>ReportAction<br />
             <span style="color: gray;">,</span>[ExtensionSettings]<br />
             <span style="color: gray;">,</span>[Locale]<br />
             <span style="color: gray;">,</span>s<span style="color: gray;">.</span>[ModifiedByID]<br />
             <span style="color: gray;">,</span>s<span style="color: gray;">.</span>[ModifiedDate]<br />
             <span style="color: gray;">,</span>[LastStatus]<br />
             <span style="color: gray;">,</span>[EventType]<br />
             <span style="color: gray;">,</span>[MatchData]<br />
             <span style="color: gray;">,</span>[LastRunTime]<br />
             <span style="color: gray;">,</span>[Parameters]<br />
             <span style="color: gray;">,</span>[DataSettings]<br />
             <span style="color: gray;">,</span>[DeliveryExtension]<br />
             <span style="color: gray;">,</span>[Version]<br />
             <span style="color: gray;">,</span>[ReportZone]<br />
             <span style="color: gray;">,</span>[OwnerID]<br />
             <span style="color: gray;">,</span>[Report_OID]<br />
<span style="color: blue;">FROM</span> [ReportServer]<span style="color: gray;">.</span>[dbo]<span style="color: gray;">.</span>[Subscriptions] s<br />
<span style="color: gray;">             inner </span><span style="color: gray;">join</span> dbo<span style="color: gray;">.</span>Users u <span style="color: blue;">on</span> u<span style="color: gray;">.</span>UserID <span style="color: gray;">=</span> OwnerID<br />
             <span style="color: gray;">inner </span><span style="color: gray;">join</span> [dbo]<span style="color: gray;">.</span>[Catalog] c <span style="color: blue;">on</span> s<span style="color: gray;">.</span>Report_OID <span style="color: gray;">=</span> c<span style="color: gray;">.</span>ItemID<br />
             <span style="color: gray;">inner </span><span style="color: gray;">join</span> [dbo]<span style="color: gray;">.</span>[ReportSchedule] rs <span style="color: blue;">on</span> s<span style="color: gray;">.</span>SubscriptionID <span style="color: gray;">=</span> rs<span style="color: gray;">.</span>SubscriptionID<br />
<br\><br />
Abhängig von den Abonnements sollte die Abfrage in etwa das folgende Ergebnis liefern:</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup span="1">
<col style="width: 126px;" span="1"></col>
<col style="width: 169px;" span="1"></col>
<col style="width: 115px;" span="1"></col>
<col style="width: 109px;" span="1"></col>
<col style="width: 122px;" span="1"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;"><span style="font-family: Times New Roman;">SubscriptionID</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"><span style="font-family: Times New Roman;">Description</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"><span style="font-family: Times New Roman;">UserName</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">
<p style="text-align: center;"><span style="font-family: Times New Roman;">ReportName</span></p>
</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"><span style="font-family: Times New Roman;">InactiveFlags</span></td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"><span style="font-family: Times New Roman;">929CDEE8-…</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"><span style="font-family: Times New Roman;">In &#8216;…&#8217; unter &#8216;Arbeitszeit Übersicht&#8217; speichern</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Domäne\Bayer</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"><span style="font-family: Times New Roman;">Arbeitszeit Übersicht</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"><span style="font-family: Times New Roman;">7A4B049E-…</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"><span style="font-family: Times New Roman;">In &#8216;…&#8217; unter &#8216;</span><br />
<span style="font-family: Times New Roman;">Fluktuation &#8216; speichern</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Domäne\Bayer</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Fluktuation</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"><span style="font-family: Times New Roman;">23E7F4EF-…</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"><span style="font-family: Times New Roman;">In &#8216;…&#8217; unter Haushalt&#8217; speichern</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Domäne\Bayer</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Haushalt</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0</td>
</tr>
</tbody>
</table>
</div>
<p> <br />
<br\><br />
Mit den oben stehenden Informationen können wir jetzt einzelne Abonnements aktivieren bzw. deaktivieren.<br />
<br\><br />
Für die Deaktivierung kann folgende Query verwendet werden:</p>
<p><span style="font-family: Courier New;">UPDATE Subscriptions set<br />
[InactiveFlags] = 1<br />
where<br />
[SubscriptionID] = &#8216;929CDEE8-…&#8217;<br />
END<br />
</span></p>
<p>Für die Aktivierung kann das gleiche Update-Statement verwendet werden, der Wert <em>InactiveFlags</em> muss jetzt nur auf 0 gesetzt werden.<br />
<br\><br />
<br\></p>
<h2>Ausführung von Abonnements</h2>
<p><br\><br />
Gelegentlich kommt es vor, dass ein Abonnement außerhalb der geplanten Zeiten durchgeführt werden soll.<br />
<br\><br />
Da die Ausführung der Abonnements über den SQL Server Agent gesteuert wird, haben wir die Möglichkeit die passenden Jobs von Hand zu starten. Dies kann im SQL Server Management Studio erfolgen.</p>
<p><img title="Tabelle" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/SB/blog2.png" alt="" /><br />
<br\><br />
Oder es können vordefinierte gespeicherte Prozeduren aus der msdb Datenbank verwendet werden.<br />
<br\><br />
<em>EXEC msdb.dbo.sp_start_job ‚251601B4…&#8217;<br />
</em><br />
<br\><br />
Die IDs der für die angelegten Jobs und die IDs für die zugehörigen Abos sind in der <em>[dbo].[ReportSchedule] </em>Tabelle der <em>ReportServer</em> DB hinterlegt. Wenn man diese Tabelle noch mit der <em>dbo.Subscriptions</em> verbindet:</p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">SELECT</span><br />
<span style="color: #0000ff;">   </span>[ScheduleID]<br />
  </span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: gray;">,</span>[ReportID]<br />
</span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: gray;">  ,</span>rs<span style="color: gray;">.</span>[SubscriptionID]<br />
</span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: gray;">  ,</span>s<span style="color: gray;">.<span style="color: blue;">Description<br />
</span></span></span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: gray;">  ,</span>[ReportAction]<br />
</span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">FROM</span> [dbo]<span style="color: gray;">.</span>[ReportSchedule] rs<br />
</span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: gray;">INNER </span><span style="color: gray;">JOIN</span> dbo<span style="color: gray;">.</span>Subscriptions s <span style="color: blue;">ON</span> rs<span style="color: gray;">.</span>SubscriptionID <span style="color: gray;">=</span> s<span style="color: gray;">.</span>SubscriptionID<br />
</span><br />
können die JobIDs den zugehörigen Abos zugeordnet werden.<br />
<br\><br />
<br\></p>
<h2>Der passende Bericht</h2>
<p><br\><br />
Nachdem die Grundlagen für die Deaktivierung bzw. Aktivierung der Abonnements geklärt sind, kann ein einfacher Bericht erstellt werden, mit dem die Ausführung und der Status des Abos gesteuert werden kann.</p>
<p><img title="Tabelle" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/SB/blog3.png" alt="" /><br />
<br\><br />
Für den Bericht muss eine Datenquelle für die <em>ReportServer</em> Datenbank erstellt werden und die folgenden Parameter werden benötigt, um die zugehörigen Funktionalitäten zu gewährleisten:</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup span="1">
<col style="width: 187px;" span="1"></col>
<col style="width: 83px;" span="1"></col>
<col style="width: 372px;" span="1"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;">Parameter</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Typ</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Beschreibung</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">SetActiv</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Text (0,1) Default: 0</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">0 – Keine Aktion wird ausgeführt1 – Der Status des ausgewählten Abos wird geändert</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">SubscriptionID</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Text</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">ID des Abos.Blank und null Value aktiviert</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">JobName</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Text</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">ID des JobsBlank und null Value aktiviert</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">InactiveFlags</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Text</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Neue Status für das zugehörige Abo0 – aktiviert1 – deaktiviert</p>
<p>Blank und null Value aktiviert</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Execute</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Text (0,1)</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Job0 – nicht ausführen1 &#8211; ausführen</td>
</tr>
</tbody>
</table>
</div>
<p><br\><br />
Des Weiteren brauchen wir ein Dataset, das zum einen die Informationen, wie vorhandene Abos, Berichtsnamen, etc. ermittelt, um sie im Bericht anzuzeigen, zum anderen aber auch Abos aktiviert und deaktiviert, sowie einzelne Jobs ausführt. Die Steuerung der Ausführung wird durch die einzelnen Parameter vollzogen und einzelne Teile der Abfrage übergangen oder ausgeführt:</p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">if</span> @SetActiv <span style="color: gray;">=</span> 1<br />
</span><span style="color: blue; font-family: Courier New; font-size: 10pt;">BEGIN<br />
</span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">UPDATE</span> Subscriptions <span style="color: blue;">set </span></span><span style="font-family: Courier New; font-size: 10pt;">[InactiveFlags] <span style="color: gray;">=</span> @InactiveFlags<br />
</span><span style="color: blue; font-family: Courier New; font-size: 10pt;">where<br />
    </span><span style="font-family: Courier New; font-size: 10pt;">[SubscriptionID] <span style="color: gray;">=</span> @id<br />
</span><span style="color: blue; font-family: Courier New; font-size: 10pt;">END<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">if</span> @Execute <span style="color: gray;">=</span> 1<br />
</span><span style="color: blue; font-family: Courier New; font-size: 10pt;">BEGIN<br />
</span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">EXEC</span> msdb<span style="color: gray;">.</span>dbo<span style="color: gray;">.<span style="color: maroon;">sp_start_job @JobName<br />
</span></span></span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">WAITFOR</span><br />
<span style="color: blue;">delay </span><span style="color: red;">&#8216;00:00:05&#8242;<br />
</span></span><span style="color: blue; font-family: Courier New; font-size: 10pt;">END<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">SELECT</span> s<span style="color: gray;">.</span>SubscriptionID<span style="color: gray;">,</span> rs<span style="color: gray;">.</span>ScheduleID <span style="color: blue;">AS</span> JobName<span style="color: gray;">,</span> s<span style="color: gray;">.</span>OwnerID<span style="color: gray;">,</span> u<span style="color: gray;">.</span>UserName<span style="color: gray;">,</span> s<span style="color: gray;">.</span>Report_OID<span style="color: gray;">,</span> c<span style="color: gray;">.</span>Name <span style="color: blue;">AS</span> Reportname<span style="color: gray;">,</span> s<span style="color: gray;">.<span style="color: blue;">Description </span><span style="color: blue;">AS</span> SubDesc,</span> s<span style="color: gray;">.</span>InactiveFlags <span style="color: blue;">AS</span> Active<span style="color: gray;">, </span></span><span style="font-family: Courier New; font-size: 10pt;">s<span style="color: gray;">.</span>ExtensionSettings<span style="color: gray;">,</span> s<span style="color: gray;">.</span>Locale<span style="color: gray;">,</span> s<span style="color: gray;">.</span>ModifiedByID<span style="color: gray;">,</span> s<span style="color: gray;">.</span>ModifiedDate<span style="color: gray;">,</span> s<span style="color: gray;">.</span>LastStatus<span style="color: gray;">,</span> s<span style="color: gray;">.</span>EventType<span style="color: gray;">,</span> s<span style="color: gray;">.</span>MatchData<span style="color: gray;">,</span> s<span style="color: gray;">.</span>LastRunTime<span style="color: gray;">,</span> s<span style="color: gray;">.<span style="color: green;">Parameters<span style="color: gray;">,</span> s<span style="color: gray;">.</span>DataSettings<span style="color: gray;">, </span></span></span></span><span style="font-family: Courier New; font-size: 10pt;">s<span style="color: gray;">.</span>DeliveryExtension<span style="color: gray;">,</span> s<span style="color: gray;">.<span style="color: blue;">Version<span style="color: gray;">,</span> s<span style="color: gray;">.</span>ReportZone<br />
</span></span></span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">FROM</span> Subscriptions <span style="color: blue;">AS</span> s<br />
   </span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: gray;">INNER </span><span style="color: gray;">JOIN </span></span><span style="font-family: Courier New; font-size: 10pt;">Users <span style="color: blue;">AS</span> u <span style="color: blue;">ON</span> u<span style="color: gray;">.</span>UserID <span style="color: gray;">=</span> s<span style="color: gray;">.</span>OwnerID<br />
   <span style="color: gray;">INNER </span><span style="color: gray;">JOIN </span></span><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">Catalog </span><span style="color: blue;">AS</span> c <span style="color: blue;">ON</span> s<span style="color: gray;">.</span>Report_OID <span style="color: gray;">=</span> c<span style="color: gray;">.</span>ItemID<br />
   <span style="color: gray;">INNER </span><span style="color: gray;">JOIN </span></span><span style="font-family: Courier New; font-size: 10pt;">ReportSchedule <span style="color: blue;">AS</span> rs <span style="color: blue;">ON</span> s<span style="color: gray;">.</span>SubscriptionID <span style="color: gray;">=</span> rs<span style="color: gray;">.</span>SubscriptionID<br />
</span><br />
<br\><br />
Im unteren Teil der Abfrage werden die Informationen ermittelt, im oberen Teil wird zunächst der Status des Abos aktualisiert oder der ausgewählte Job gestartet. Dadurch, dass das Statusänderungen und Jobausführungen über die Links in der Tabelle gesteuert werden, ist immer nur einer der beiden Parameter @SetActiv und @Execute eins und es wird immer nur eine der beiden Aktionen ausgeführt.<br />
<br\><br />
Um die Daten anzuzeigen erstellen wir eine einfache Tabelle:<br />
<img title="Tabelle" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/SB/blog3a.png" alt="" /><br />
<br\><br />
Für das Feld Aktiv wird die folgende Expression: <span style="font-family: Courier New; font-size: 10pt;">=iif(Fields!Active.Value = 0,<span style="color: #a31515;">&#8220;Aktiv&#8221;</span>,<span style="color: #a31515;">&#8220;Deaktiviert&#8221;</span>) </span>verwendet und die folgende Aktion, für die Änderung des Status, definiert:<br />
<img title="Tabelle" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/SB/blog4.png" alt="" /><br />
<br\><br />
Zum Schluss muss noch das Ausführen des Jobs ermöglicht werden. Hierfür definieren wir eine Aktion für das Textfeld Execute:<br />
<img title="Tabelle" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/SB/blog5.png" alt="" /><br />
Jetzt ist der Bericht soweit fertig, dass der Status und das Ausführen der Abos verwaltet werden kann, birgt aber noch die ein oder andere Gefahr in sich. So wird z.B. ein Abo erneut ausgeführt, wenn man den Bericht nach einem <em>Execute </em>aktualisiert. Für eine erste Demonstration sollte er aber reichen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/reportingservices/deaktivieren-von-reporting-services-abonnements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Was gibt es neues beim SQL Server 2008 R2 SSRS</title>
		<link>http://www.ixto.de/blog/sql-server-2008/was-gibt-es-neues-beim-sql-server-2008-r2-ssrs/</link>
		<comments>http://www.ixto.de/blog/sql-server-2008/was-gibt-es-neues-beim-sql-server-2008-r2-ssrs/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 22:24:02 +0000</pubDate>
		<dc:creator>Sven Bayer</dc:creator>
				<category><![CDATA[Reporting Services 2008]]></category>
		<category><![CDATA[SQL Server 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/sql-server-2008/was-gibt-es-neues-beim-sql-server-2008-r2-ssrs/</guid>
		<description><![CDATA[Die November CTP des SLQ Server 2008 R2 steht seit einiger Zeit zum Download bereit und bietet zahlreiche neue Features. In diesem Artikel sollen die zahlreichen Neuerungen, die die Reporting Services erhalten haben, beschrieben werden. Wir beschränken uns auf die Features, die unmittelbar mit der Entwicklung der Berichte zu tun haben und lassen die Änderungen, [...]]]></description>
			<content:encoded><![CDATA[<p>Die November CTP des SLQ Server 2008 R2 steht seit einiger Zeit zum Download bereit und bietet zahlreiche neue Features. In diesem Artikel sollen die zahlreichen Neuerungen, die die Reporting Services erhalten haben, beschrieben werden. Wir beschränken uns auf die Features, die unmittelbar mit der Entwicklung der Berichte zu tun haben und lassen die Änderungen, die bezüglich der erweiterten Sharepoint Integration vorhanden sind, außen vor. Der Report Manager hat ein neues Äußeres bekommen und der Report Builder steht jetzt in Version 3.0 zur Verfügung, die auch benötigt wird, um mit den neuen Features arbeiten zu können:</p>
<p><span id="more-78"></span><br />
<br\></p>
<h3>Freigegebene Data Sets</h3>
<p><br\><br />
Genau wie freigegebene Datenquellen, die in jedem größerem Projekt verwendet werden, um Änderungen an der Datenquelle an zentraler Stelle zu realisieren, können jetzt auch Data Sets freigegeben werden und in einem geeigneten Ordner auf dem Server zu speichern. Freigegebene Data Sets können von allen Berichten verwendet werden, so können Sie z.B. für einen Parameter, der in mehreren Berichten vorkommt, ein Data Set anpassen, dieses freigeben und es dann auch in den anderen Berichten verwenden.<br />
Mit dem Report Builder können Sie alle freigegebenen Data Sets auf dem Server verwenden, mit dem BIDS hingegen können Sie nur die freigegebenen Data Sets ihres Projekts verwenden.<br />
<br\></p>
<h3>Report Part Gallery</h3>
<p><br\><br />
Seit der November CTP ist es möglich Teile eines Berichts zu veröffentlichen. Diese Report Parts können dann in anderen Berichten verwendet werden. Im Gegensatz zu den freigegebenen Data Sets, können Report Parts in einem neuen Bericht weiter angepasst werden, ohne dass die Vorlage davon beeinflusst wird. Ein Report Part wird sozusagen ein normales Berichtselement im neuen Report. Falls das Original aktualisiert wurde, wird Ihnen dies mitgeteilt, damit Sie Ihre verwendeten Elemente aktualisieren können.<br />
Beim Hinzufügen eines Report Parts werden automatisch die zugehörigen Data Sets und Datenquellen mit angelegt.<br />
Report Parts können sowohl mit dem BIDS, als auch mit dem Report Builder erstellt werden. Sie können aber zurzeit nur mit dem Report Builder verwendet werden, indem Sie einfach per Drag&amp;Drop aus der Report Part Gallery in den Bericht gezogen werden.<br />
<br\><br />
Folgende Elemente stehen zur Verfügung:</p>
<ul>
<li>Charts</li>
<li>Tabellen, Matrizen und Listen</li>
<li>Messgeräte</li>
<li>Maps</li>
<li>Bilder</li>
<li>Rectangles</li>
</ul>
<p><br\></p>
<h3>Neue Berichtselemente zur Datenvisualisierung</h3>
<p><br\><br />
Die neuen Berichtselemente sind speziell konzipiert worden, um in Tabellen und Matrizen eingesetzt zu werden.<br />
<br\></p>
<h3><span style="color: #999999;">Sparklines und Data Bars</span></h3>
<p><br\><br />
Sparklines und Data Bars sind einfache Charts, die nur die wesentlichen Elemente beinhalten und gänzlich auf Legenden, Achsen und Beschriftungen verzichten. Sie werden in erster Linie in Tabellen und Matrizen verwendet, um viel Information auf möglichst geringem Raum zu repräsentieren.<br />
Typischerweise zeigen Data Bars nur einen Wert pro Zeile an, um den Vergleich der Werte untereinander zu vereinfachen:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/122309_2210_Wasgibtesne2.png" alt="" /><br />
<br\><br />
Im Gegensatz zu den Sparklines, die normalerweise den zeitlichen Verlauf wiederspiegeln:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/122309_2210_Wasgibtesne3.png" alt="" /><br />
<br\><br />
Bei den Sparklines wäre noch anzumerken, dass sie nur in Gruppen- und nicht in Detailzeilen verwendet werden können.<br />
<br\></p>
<h3><span style="color: #999999;">Indikatoren</span></h3>
<p><br\><br />
Indikatoren werden verwendet, um den Status eines Wertes auf den ersten Blick erkennen zu können. Sie werden häufig in Tabellen und Matrizen eingesetzt. Ein Indikator ist ein vereinfachtes Messgerät und kann auch in eben dieses umgewandelt werden. Sie können Trends anhand von Pfeilen, Abstimmungen durch Sterne und Status durch Bilder wie z.B. der Ampel darstellen:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/122309_2210_Wasgibtesne4.png" alt="" /><br />
<br\></p>
<h3>Erweiterungen der RDL Ausdruckssprache</h3>
<p><br\></p>
<h3><span style="color: #999999;">Aggregationen von Aggregationen</span></h3>
<p><br\><br />
In der aktuellen Version ist es endlich möglich Ausdrücke zu verwenden, die Aggregationen von Aggregationen bilden. Dadurch können Werte, wie z.B. der Durchschnitt der monatlichen Einnahmen gebildet werden.<br />
<span style="font-family: Courier New;">=Avg(Sum(Fields!Reseller_Sales_Amount.Value, &#8220;Month&#8221;),&#8221;Year&#8221;)</span><strong><br />
</strong><br />
<br\></p>
<h3><span style="color: #999999;">OverallPageNumber und OverallTotalPages</span></h3>
<p><br\><br />
Zeigt die Gesamtseitenzahl und die aktuelle Seitenzahl bezogen auf das gesamte Dokument. Im Gegensatz zu den schon bekannten Feldern <span style="font-family: Courier New;">PageNumber</span> und <span style="font-family: Courier New;">TotalPages</span>, die die Seitenzahlen abhängig von einer Sequenz angeben(die Seitenzahlen können durch ein PageBreak zurückgesetzt werden). Diese Eigenschaften können nur im Seitenkopf oder –fuß verwendet werden.<br />
<br\></p>
<h3><span style="color: #999999;">RenderFormat</span></h3>
<p><br\><br />
Eine weitere neue, in meinen Augen sehr nützliche Eigenschaft, ist die Globale <span style="font-family: Courier New;">RenderFormat</span>. Zum Einen kann der Name durch <span style="font-family: Courier New;">Globals!RenderFormat.Name</span> ermittelt werden und zum Anderen, mit der Expression <span style="font-family: Courier New;">=Globals!RenderFormat.IsInteractive,</span> ob es sich um ein interaktives Ausgabeformat handelt.<br />
<br\><br />
Durch die Möglichkeit das Ausgabeformat zu ermitteln ergeben sich ganz neue Gestaltungsmöglichkeiten. So können für ein Excel-Export z.B. Spalten einer Tabelle ein- oder ausgeblendet werden. Es können Abhängig vom Ausgabeformat komplett unterschiedliche Elemente angezeigt werden.<br />
Bei nicht interaktiven Formaten können, durch den Drilldown versteckte Elemente, sichtbar gemacht werden.<br />
<br\></p>
<h3><span style="color: #999999;">PageName</span></h3>
<p><br\><br />
Endlich können Excelsheets einer Excel-Datei mit Namen versehen werden. Dafür müssen Sie einfach den PageName angeben. Wenn Sie den PageName dynamisch vergeben und den Gruppennamen verwenden für den ein PageBreak existiert, bekommt jedes Excelsheet den Namen der Gruppe.</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/122309_2210_Wasgibtesne5.png" alt="" /><br />
<br\><br />
Mit der Eigenschaft PageBreak/Disabled kann z.B., abhängig vom RenderFormat, der Seitenumbruch deaktiviert werden.<br />
<br\></p>
<h3>Maps</h3>
<p><br\><br />
Was man in früheren Versionen der Reporting Services von Drittanbietern kaufen musste, wurde in der aktuellen Version integriert. Dieses neue Berichtselement dient zur Visualisierung von Daten abhängig von ihrer geographischen Lage. Es stehen eine Vielzahl von Karten in der Kartengalerie zur Verfügung (zurzeit, wohl aus rechtlichen Gründen, nur Karten der USA). Falls Sie eine andere Karte benötigen, können auch ESRI-Shapefiles oder SQL Spatial Datentypen verwendet werden. Sie können hinter Ihre Karte noch eine Bing Karte legen, um die Darstellung noch etwas aufzuwerten. Folgende Kartenvisualisierungen stehen zur Verfügung:</p>
<ul>
<li><strong>Basic Map (Basis Karte)</strong> – Es werden einfach nur Gebiete angezeigt. So können z.B. Ihre Verkaufsgebiete angezeigt werden.</li>
<li><strong>Color Analytical Map (Farbanalytische Karte) </strong>– Informationen werden durch Farbvariationen hervorgehoben. Z.B. werden die Verkaufszahlen pro Gebiet farblich gekennzeichnet.</li>
<li><strong>Bubble Map (Blasen Karte)</strong> – Informationen werden durch die Größe der Blasen angezeigt. Die Blasen liegen zentriert in den zugehörigen Gebieten.</li>
</ul>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/122309_2210_Wasgibtesne6.png" alt="" /><br />
<br\></p>
<h3><span style="color: #000000;">Report Viewer</span></h3>
<p><br\><br />
Der neue Report Viewer verwendet AJAX für die Seitennavigation und die Interaktivität. So wird beim Öffnen eines Drilldowns die aktuelle Scrollposition beibehalten.<br />
Das Aussehen wurde angepasst und optimiert, um mehr Platz für den Bericht zu haben.<br />
<br\><br />
Wir konnten natürlich nur einen kurzen Überblick über die neuen Features der Reporting Services des SQL Server 2008 R2 geben und werden daher in den nächsten Blogeinträgen gezielt und detailliert einzelne der oben genannten Features beschreiben.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2008/was-gibt-es-neues-beim-sql-server-2008-r2-ssrs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DistinctSum oder ich will den Reiniger nicht zweimal zählen</title>
		<link>http://www.ixto.de/blog/sql-server-2005/reportingservices/distinctsum-oder-ich-will-den-reiniger-nicht-zweimal-zahlen/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/reportingservices/distinctsum-oder-ich-will-den-reiniger-nicht-zweimal-zahlen/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 16:23:36 +0000</pubDate>
		<dc:creator>Sven Bayer</dc:creator>
				<category><![CDATA[Reporting Services 2005]]></category>
		<category><![CDATA[Reporting Services 2008]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/sql-server-2005/reportingservices/distinctsum-oder-ich-will-den-reiniger-nicht-zweimal-zahlen/</guid>
		<description><![CDATA[Eine der häufigsten Anforderungen in Berichten, neben der grafischen Darstellung von Datenreihen, ist die Auflistung von Daten in Tabellen und Matrizen. Dabei sollen in den meisten Fällen auch die Summen der Gruppen und die Gesamtsumme, wie in der ersten Abbildung, gebildet werden.



Ja und, kann doch jeder: Einfach die Sum-Funktion verwenden:


Stimmt, in den meisten Fällen kommen wir [...]]]></description>
			<content:encoded><![CDATA[<p>Eine der häufigsten Anforderungen in Berichten, neben der grafischen Darstellung von Datenreihen, ist die Auflistung von Daten in Tabellen und Matrizen. Dabei sollen in den meisten Fällen auch die Summen der Gruppen und die Gesamtsumme, wie in der ersten Abbildung, gebildet werden.</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/063009_1622_1.png" alt="" /></p>
<p><span id="more-55"></span><br />
<br\><br />
Ja und, kann doch jeder: Einfach die Sum-Funktion verwenden:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/063009_1622_2.png" alt="" /><br />
<br\><br />
Stimmt, in den meisten Fällen kommen wir damit zum Ziel.<br />
<br\><br />
Was aber, wenn wir noch mehr Informationen anzeigen wollen und dadurch einige Werte doppelt vor kommen, wie z.B. in unserem Beispiel, wenn wir nicht nur die Informationen des Internetverkaufs anzeigen wollen, sondern auch noch die Daten der Wiederverkäufer und zwar landesbezogen. Wenn wir dann die Sum-Funktion verwenden bekommen wir folgende Tabelle:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/063009_1622_3.png" alt="" /><br />
<br\><br />
Wie man erkennen kann sind die Informationen über den Internetverkauf unabhängig vom Land, wodurch in jeder Zeile die Gesamtmenge für diesen einen Reiniger angezeigt wird. Der Wert für die Anzahl, der mit der einfachen Summenfunktion ermittelt wurde, summiert natürlich jede Zeile auf, wodurch wir ein Ergebnis von 6 * 908 = 5448 erhalten. Richtig wäre, wenn auch in der Gruppenzeile 908 stehen würde.<br />
<br\><br />
<strong>Die Lösung</strong><br />
<br\><br />
Wir müssen also in der Summenfunktion prüfen, ob der Wert schon mal aufsummiert wurde. Das können wir erreichen, indem wir im Code eine globale Variable vom Typ String definieren. Jedes neue Produkt wird ans Ende des Strings geschrieben, so dass eine Liste mit den einzelnen Produkten entsteht. Als nächstes wird noch eine Funktion benötigt, die zum Einen den Wert und zum Anderen den Produktnamen übergeben bekommt. Diese überprüft, ob das Produkt schon in der Liste steht, falls dies nicht der Fall ist, wird der Wert zurückgegeben und der Name in der Liste aufgenommen. Falls der Name schon vorhanden ist, wird 0 zurückgegeben, wie der Codeausschnitt zeigt:</p>
<p><span style="font-family: Courier New;">private productList as String = String.Empty<br />
</span></p>
<p><span style="font-family: Courier New;">function DistinctSum(quantity as Integer, product as String) as Integer<br />
    if productList.IndexOf(product) = -1 then<br />
        productList += product + &#8220;, &#8221;<br />
        return quantity<br />
    else<br />
        return 0<br />
    end if<br />
end function<br />
</span><br />
<br\><br />
Man muss nur darauf achten, dass die Funktion immer Daten vom gleichen Typ zurück gibt, da es sonst passieren kann, dass die Summe nicht berechnet wird.<br />
<br\><br />
Abschließend muss die Gruppenzeile so angepasst werden, dass sie die neu erstellte Funktion verwendet. Leider ist es nicht möglich, einfach das Array mit den Details zu übergeben und die Summe zu berechnen. Daher verwenden wir weiterhin die Summenfunktion, um die Liste der Details einer Gruppe zu durchlaufen. Der Trick ist jetzt  nicht einfach ein Feld eines Datasets einzutragen, sondern inerhalb der Summe die im Code erstellte Funktion zu verwenden, die dann für jedes einzelne Element prüft, ob es schon aufaddiert wurde:</p>
<p><span style="font-family: Courier New;">=Sum(code.DistinctSum(Fields!Internet_Order_Quantity.Value,Fields!Product.Value))<br />
</span><br />
<br\><br />
Wenn der Bericht, wie beschrieben angepasst wurde sollte jetzt für die Anzahl der Bestellungen, wie in der abschließenden Grafik,  der richtige Wert angezeigt werden.</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/063009_1622_4.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/reportingservices/distinctsum-oder-ich-will-den-reiniger-nicht-zweimal-zahlen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

