tag:blogger.com,1999:blog-33884392417752629242024-03-14T05:10:25.649+01:00Volker Heck über BI Lösungen mit dem Microsoft BI StackBei meiner Arbeit stoße ich auf interessante, merkwürdige oder nützliche Dinge, die einen Kommentar wert sind. Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comBlogger86125tag:blogger.com,1999:blog-3388439241775262924.post-80094398140285739852015-06-03T23:18:00.000+02:002015-06-04T07:09:51.819+02:00Self-Service BI - eine Aufgabe für die IT Abteilung<strong>Frage</strong>: Was müssen Sie tun, um Self-Service BI im Unternehmen zu einem Misserfolg zu machen? <br />
<strong>Antwort</strong>: Überlassen Sie dieses Thema den Endanwendern<br />
<br />
Mit Produkten wie PowerPivot, Power Query, Power View, SharePoint und Report Builder bietet Microsoft eine ganze Palette von Werkzeugen an, die den Fachabteilungen mehr Flexibilität und Unabhängigkeit von IT Spezialisten geben sollen. Im Rahmen meiner Arbeit habe ich nun schon mehrere Unternehmen erlebt, die diese Möglichkeiten einsetzen. Einige Initiativen waren sehr erfolgreich, andere sind weitgehend gescheitert. <br />
<br />
<h3>
Warum Self-Service BI ohne die IT Spezialisten nicht funktioniert</h3>
Der größte Irrtum in Bezug auf Self-Service BI ist, dass die Fachanwender nun auf einmal die Arbeit der IT Abteilung übernehmen könnten. Dies ist übrigens auch eine gelegentlich geäußerte Befürchtung von IT Spezialisten - ob sie denn nun arbeitslos werden, weil ihre Kenntnisse nicht mehr benötigt werden. <br />
<br />
Das Gegenteil ist der Fall. <br />
<br />
Aus den Augen der Fachanwender betrachtet ist das Versprechen der neuen Werkzeuge, nämlich mit ihren "eigenen Leuten" den Bedarf an Reporting und Datenanalyse abzudecken, die Befreiung von vielen lästigen Restriktionen der Unternehmens-IT:<br />
<ul>
<li>fehlende Daten </li>
<li>langwierige, aufwändige Prozesse bis neue Daten in Reports erscheinen</li>
<li>unflexible Lösungen, die am tatsächlichen Bedarf vorbei gehen</li>
<li>hohe Kosten</li>
</ul>
Verlockende Aussichten. Ein Heer von Vertriebsleuten schürt diese Vision.<br />
<br />
So kommt es, dass eine "ganz normale" Mitarbeiterin in einer Fachabteilung zunächst Rechnungs-Informationen in einer Excel Datei zusammenstellt, darauf ein PowerPivot Modell baut und erste Erfolge publiziert. Hoch motiviert bindet sie eine weitere Datenquelle ein, sagen wir eine CSV-Datei mit SAP Daten. Und eine weitere, nun eine Datenbank mit Abrechnungsinformationen. Hier unterstützt ein Access-erfahrener Kollege. Beide zusammen polieren das PowerPivot Modell auf, fügen ein paar DAX Ausdrücke hinzu und publizieren das Ergebnis in SharePoint. Ein großer Erfolg! Die Abteilung hat ihr eigenes Abrechnungs-Reporting unabhängig von der geschmähten IT Abteilung hinbekommen. <br />
<br />
Noch etwas warten, dann ist der Punkt erreicht, wo ich für gewöhnlich ins Spiel komme. Denn im nächsten, spätestens im übernächsten Monat sind die selbst gebauten Reports nicht mehr so ganz korrekt. Unbeherrschbare DAX Ausdrücke, Fehler nach dem Aktualisieren der Daten, nur halb funktionierende Kennzahlen. Jetzt beginnt die eigentliche Arbeit: Fragen nach den Datenquellen, Aufräumen des PowerPivot Modells, Konsolidieren der Daten. <br />
<br />
Was ist hier schief gelaufen?<br />
<br />
Eigentlich haben die Anwender alles richtig gemacht. Nur haben sie die Komplexität der Aufgabe unterschätzt. Solange der überwiegende Anteil der Daten für ein PowerPivot Modell aus einer Datenbank kommt, ist alles überschaubar. Aber die Informationen aus Textdateien oder Excel Dateien abzurufen, aufzubereiten und mit den anderen Datenquellen zu harmonisieren, das wird mit jeder zusätzlichen Datei um ein Vielfaches aufwändiger. Die Fachabteilung findet sich auf einmal in der Modellierung von ETL-Prozessen wieder - etwas, worauf sie nicht vorbereitet waren und wofür sie auch keine Methodik kennen. <br />
<br />
<h3>
Die richtige Mischung macht's</h3>
Wir IT Spezialisten sehen solche Aufgabenstellungen mit anderen Augen. Datenmodellierung, ETL und Datenqualität sind dank Ralph Kimball bestens erschlossene Gebiete. Aber wir haben ja nun auch viel Zeit in unsere Ausbildung und in die Umsetzung der best practices investiert. Die Fallstricke der Modellierung und das erforderliche akribische Vorgehen beim Extrahieren und Laden von Daten in ein Data Warehouse haben wir in hunderten Stunden Projektarbeit kennengelernt. Das sind Aufgaben, die eine genaue Klärung, eine routinierte Umsetzung und geplante Tests erfordern. Nichts, was man "nebenbei" erledigen könnte. Der Lohn der Arbeit sind stabile, automatisch ablaufende Daten-Aktualisierungen und eine hohe Datenqualität. <br />
<br />
Wenn wir den Fachabteilungen solche Datenquellen liefern, dann können sie diese tatsächlich einfach verwenden, um darauf ihr eigenes Reporting und ihre eigenen Analysen aufzusetzen. Dann können sie die Berichte schnell so gestalten, wie es ihren Bedürfnissen am besten entspricht. Und sie können sich auf die Zahlen verlassen. In so einer Umgebung ist es auch einfach, noch die eine oder andere Information aus einer zusätzlichen Datei oder aus dem Internet hinzuzufügen. <br />
<br />
Um es ganz deutlich zu sagen: Dies ist ein Plädoyer für das klassische Data Warehouse! Das Data Warehouse stellt hoch qualitative Daten bereit, so dass Fachanwender einfach darauf zugreifen und sie nach Herzenslust miteinander verknüpfen können. Gerade in Zeiten von Self-Service BI kommt dieser Vorteil so richtig zum Tragen.<br />
<br />
<h3>
Was Self-Service BI tatsächlich leisten kann</h3>
Die erfolgreichen Self-Service BI Initiativen, die ich kennenlernen durfte, zeichnen sich alle durch ein Merkmal aus: Entscheidungsträger aus dem obersten Management wollten, unterstützten und überwachten die Maßnahmen. <br />
Die nicht erfolgreichen Initiativen waren allesamt dadurch gekennzeichnet, dass sie entweder ausschließlich technisch betrachtet wurden ("mit den richtigen Tools kommt der Erfolg von selbst") oder dass sie nur von wenigen Personen getragen wurden ("was interessiert mich dieser neumodische Kram"). <br />
<br />
Die positiven Effekte für die Fachanwender wie Flexibilität, Geschwindigkeit und passgenaue Lösungen können sich nur dann einstellen, wenn diese Bedingungen gegeben sind:<br />
<ol>
<li>die Self-Service BI Initiative hat die volle Unterstützung durch das oberste Management</li>
<li>die Ziele der Initiative sind allen Betroffenen klar</li>
<li>der Erfolg oder Misserfolg wird durch das oberste Management engagiert überwacht</li>
<li>die Fachanwender haben Zugriff auf ein hervorragend gepflegtes Data Warehouse (das ist mit Abstand der kostenintensivste Teil)</li>
<li>die Fachanwender haben im Rahmen von Schulungen ihre neuen Werkzeuge gründlich kennengelernt</li>
<li>die Fachanwender erhalten Unterstützung durch Mitarbeiter, die sowohl die Self-Service Tools bestens kennen als auch mit der IT Landschaft vertraut sind. Anwenderunterstützung, End User Computing, Daten Analysten, Business Analysten - wie auch immer die Rollenbezeichnung lautet - Menschen mit solidem und umfangreichem IT Hintergrundwissen aber auch mit einem Verständnis für die Anforderungen der Fachabteilungen schlagen Brücken. Sie unterstützen die Anwender beim Auffinden der für sie besten Datenquellen, bei komplexeren SQL Statements, bei ausgefeilten DAX Ausdrücken und sie erkennen vor allem, wann die Grenzen der Self-Service Tools erreicht sind und wann eine professionelle ETL Lösung erforderlich ist.
</li>
</ol>
Wenn diese Voraussetzungen gegeben sind, dann entfalten die anfangs aufgezählten Tools eine belebende Wirkung. Dann erstellen pfiffige Mitarbeiter in den Fachbereichen auf einmal neuartige Reports und Analysen, die ein Unternehmen effizienter, profitabler, schneller und kundenfreundlicher machen können. Dann lösen sie das Versprechen von Self-Service BI ein. An jede dieser Lösungen, die ich unterstützen durfte, denke ich mit großer Begeisterung zurück. <br />
<br />
Wenn das Management und die IT die richtigen Rahmenbedingen schaffen, dann ermöglichen sie die Erfolgsgeschichte von Self-Service BI. Arbeiten wir daran! Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-90558925586845841092015-03-31T18:19:00.000+02:002015-03-31T18:19:10.821+02:00Liste der SQL Server FehlercodesEine Liste der Fehlercodes, die der SQL Server ausgeben kann, findet sich in der <a href="https://technet.microsoft.com/de-de/library/cc645603%28v=sql.105%29.aspx" target="_blank">Dokumentation</a>. Wenn Sie jedoch gerade keinen Zugriff aufs Internet haben, können Sie auch den SQL Server direkt fragen:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">select * from sys.messages</span><br />
<br />
Das ist sehr praktisch, wenn Sie einen Fehlercode haben und den vollständigen Text der Fehlermeldung nachschlagen möchten. Oder wenn Sie die deutsche Fehlermeldung kennen und den englischen Text wissen möchten um ihn zum Beispiel in einer Suchmaschine einzugeben. Das ist möglich, weil die Tabelle <i>sys.messages</i> alle Fehlermeldungen in 22 verschiedenen Sprachen enthält.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5gml_6pk_WGYJl10CTrxm3RRGboywx3G5ynQdhidPLtdNqQ_NksKS5dcibqUmubbw0N4r8FqS8lW3VlAtCWmORc20ZJDkHVbuiyqmwL_lsGYNpnBGorHYEVRG_ehv6i9LKsc0IBrbKOA/s1600/Unbenannt+1.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5gml_6pk_WGYJl10CTrxm3RRGboywx3G5ynQdhidPLtdNqQ_NksKS5dcibqUmubbw0N4r8FqS8lW3VlAtCWmORc20ZJDkHVbuiyqmwL_lsGYNpnBGorHYEVRG_ehv6i9LKsc0IBrbKOA/s1600/Unbenannt+1.PNG" height="129" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tabelle sys.messages enthält jede Fehlermeldung in verschiedenen Sprachen</td></tr>
</tbody></table>
Welche <i>language_id</i> zu welcher Sprache gehört, können Sie in einer anderen Systemtabelle nachschlagen:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">select *<br />from sys.syslanguages</span><br />
<br />
In der Spalte <i>msglangid </i>dieser Tabelle finden Sie den zu <i>language_id</i> korrespondierenden Wert. In welcher Sprache Sie die Fehlermeldungen sehen, hängt von den Ländereinstellungen auf dem Betriebssystem des Clients ab, der die Verbindung zum SQL Server aufgebaut hat. Wenn Sie die Sprache für eine Verbindung umstellen möchten, können Sie das mit diesem Befehl machen:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">SET LANGUAGE FRENCH; </span><br />
<br />
Mehr zur SET LANGUAGE Anweisung finden Sie in der <a href="https://msdn.microsoft.com/de-de/library/ms174398.aspx" target="_blank">MSDN</a>. Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-51485333735676688372015-03-01T20:28:00.000+01:002015-03-01T20:28:19.078+01:00SQL Server Migration Assistant (SSMA) und die Sortierreihenfolge der DatenbankenBei der Migration einer größeren Oracle Datenbank nach MS SQL Server haben wir den <a href="http://blogs.msdn.com/b/ssma/" target="_blank">SQL Server Migration Assistant (SSMA) for Oracle</a> in der Version 6 eingesetzt. Wirklich ein sehr hilfreiches Tool! <br />
<br />
<h4>
Laufzeitprobleme nach Umzug der Datenbank</h4>
<br />
Ein größeres Problem trat auf, nachdem wir die migrierte SQL Server Datenbank gesichert und auf einer anderen SQL Server Instanz wiederhergestellt hatten. Beim Ausführen von gespeicherten Prozeduren, die der SSMA generiert hatte, gab es auf einmal diesen Laufzeitfehler: <br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">Msg 217, Level 16, State 1, Line 1</span><br />
<span style="font-family: "Courier New", Courier, monospace;">Maximum stored procedure, function, trigger, or view nesting level exceeded (limit 32).</span><br />
<br />
Auf dem alten SQL Server funktionierten dieselben Funktionsaufrufe weiterhin fehlerfrei. Die Ursache musste also irgend etwas mit dem neuen Server zu tun haben. <br />
<br />
<h4>
Sortierreihenfolge als Fehlerursache</h4>
<br />
Um es kurz zu machen: Die Sortierreihenfolge der neuen SQL Server Instanz (Server Collation) war eine andere als auf dem alten Server. Dadurch hatte auch die Systemdatenbank <span style="font-family: "Courier New", Courier, monospace;">master</span> eine andere Sortierreihenfolge (Database Collation) als die auf dem alten Server. Erst einmal ist nicht ersichtlich, warum das zu Problemen führen könnte. Der Hintergrund ist Folgender: In der <span style="font-family: "Courier New", Courier, monospace;">master</span> Datenbank werden durch das SSMA Extension Pack drei Extended Stored Procedures installiert. Der vom SSMA generierte T-SQL Code verwendet Kompatibilitätsfunktionen (das sind die im Schema <span style="font-family: "Courier New", Courier, monospace;">ssma_oracle</span>), welche ihrerseits wiederum diese Extended Stored Procedures in <span style="font-family: "Courier New", Courier, monospace;">master</span> aufrufen. <br />
<br />
Wenn die <span style="font-family: "Courier New", Courier, monospace;">master</span> Datenbank und die Benutzerdatenbank mit vom SSMA generierten T-SQL Code unterschiedliche Sortierreihenfolgen aufweisen, dann tritt reproduzierbar dieser Fehler auf. <br />
<br />
Das Aufspüren dieser Fehlerursache hat unser Team viel Zeit gekostet. Vielleicht hilft diese Erläuterung ja jemandem, der ebenfalls auf dieses etwas exotische Problem stößt. Wir haben es übrigens beseitigt, indem wir die Sortierreihenfolge der Benutzerdatenbank umgestellt haben. Das ist einen weiteren Blog-Post wert, den ich in den nächsten Tagen schreiben werde. Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-76930981754359824432015-02-28T07:04:00.000+01:002015-02-28T07:07:41.740+01:00SSMS: Mit Suchen und Ersetzen Zeilenumbrüche einfügenOft wäre es nützlich, im SQL Editor von SQL Server Management Studio mit Suchen und Ersetzen auch Sonderzeichen wie "neue Zeile" einfügen zu können. Beispielsweise um vor jedem "CREATE" Statement noch ein "GO" einzufügen, denn nach "GO" muss immer eine neue Zeile beginnen. <br />
Auf dem direkten Weg ist es nicht möglich Sonderzeichen einzugeben. Doch durch die Verwendung regulärer Ausdrücke eröffnen Sie sich diese und noch eine ganze Palette weiterer Möglichkeiten.<br />
<br />
<h4>
Reguläre Ausdrücke sind der Schlüssel</h4>
<br />
Die im Bild dargestellte Option "Use - Regular expressions" interpretiert die Zeichenfolgen in den Eingabefeldern "Find what" und "Replace with" unter Berücksichtigung der Regeln für reguläre Ausdrücke.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8d3HkYCVvWANS5PFw4lRKbmeXWdQqMd4fYuMeAL5tAOCT0JP2OgKGHCyDeb6uzAYH5TmBmFvpIv77wmvCainzBxr-fN6dPrJu3oBFyLgo1HJ_HGnwjvDCIT8KJzDGJiXBaSVnDc8zQus/s1600/RegEx.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8d3HkYCVvWANS5PFw4lRKbmeXWdQqMd4fYuMeAL5tAOCT0JP2OgKGHCyDeb6uzAYH5TmBmFvpIv77wmvCainzBxr-fN6dPrJu3oBFyLgo1HJ_HGnwjvDCIT8KJzDGJiXBaSVnDc8zQus/s1600/RegEx.PNG" height="200" width="148" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Mit regulären Ausdrücken wird das Suchen und Ersetzen erheblich leistungsfähiger</td></tr>
</tbody></table>
Weil in regulären Ausdrücken die Zeichenfolge "\n" die Bedeutung "neue Zeile" hat, fügt das im Bild dargestellte Beispiel vor jedem "CREATE" ein "GO" und eine neue Zeile ein. <br />
<br />
Vor allem aber können Sie reguläre Ausdrücke bei der <strong>Suche von Mustern </strong>im Text verwenden, indem Sie diese im Eingabefeld "Find what:" eingeben. Gerade erst musste ich in einem sehr langen SQL Skript alle Funktionsaufrufe finden, denen kein Schemaname vorangestellt war. Da die Funktionsnamen alle mit "fn_" begannen, konnte ich die betreffenden Stellen im Text mit diesem Ausdruck in "Find what:" schnell finden:<br />
<span style="font-family: "Courier New", Courier, monospace;">[^.]fn_</span> Dieser reguläre Ausdruck liefert alle Stellen, wo vor <span style="font-family: "Courier New", Courier, monospace;">fn_</span> kein Punkt steht. Ist diese Hürde erst einmal genommen, ist es ein Leichtes, mit Suchen und Ersetzten an diesen Stellen noch den Schemanamen hinzuzufügen. In meinem Fall dauerte das für ca. 400 Ersetzungen nur wenige Sekunden. <br />
<br />
Eine vollständige Dokumentation regulärer Ausdrücke finden Sie zum Beispiel in der <a href="https://msdn.microsoft.com/de-de/library/az24scfc%28v=vs.110%29.aspx" target="_blank">MSDN</a> oder in diesem <a href="http://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck" target="_blank">Wikipedia</a> Artikel.<br />
<br />
Noch ein Tipp: Gerade wenn das gesuchte Muster an sehr vielen Stellen im Text vorkommt, dann ist die Option "Find in Files" eine großartige Hilfe. Sie erreichen diese Funktion hier:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdyoO24PJc1knrf7iSFwCjGERb_Sk_VfONS9_VMPxWKo1dQMS73CJsSZ_k4x4188sg88UnLyiotM9R8QHF-2EDtFT1xKmhQtoAOl_4-jBAVW8-wk9mAZsq7TEsbXv7r7UvYtAE3oBGm7k/s1600/28-02-2015+06-43-44.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdyoO24PJc1knrf7iSFwCjGERb_Sk_VfONS9_VMPxWKo1dQMS73CJsSZ_k4x4188sg88UnLyiotM9R8QHF-2EDtFT1xKmhQtoAOl_4-jBAVW8-wk9mAZsq7TEsbXv7r7UvYtAE3oBGm7k/s1600/28-02-2015+06-43-44.png" height="200" width="193" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Find in Files erstellt eine Liste mit allen Stellen, wo der Suchausdruck gefunden wurde</td></tr>
</tbody></table>
<br />
Fazit: Der Texteditor im Management Studio bietet viele leistungsstarke Funktionen für das Suchen und Ersetzen in Texten. Man muss nur genau hinsehen um sie zu finden. Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-51838748722113072642015-02-15T17:40:00.002+01:002015-02-16T07:36:11.809+01:00Zahl der zertifizierten Business Analysten wächst weiterAuch im Jahr 2014 ist die Zahl der nach den Anforderungen der IIBA zertifizierten Business Analysten weiter stark gewachsen. Die Grafik zeigt das eindrucksvoll: <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQCpznzEkU8lotT5ePka1r0RZ-MhGvx36pWA4NEVVPYbDwGPfOsSSfTFkG7L5-x7cBOLnBhuISINHvI2i14gS0THIQsXl-JjD_1gk_1F-HVdHzciRpKL1NzWt_A7s32SQNrc5M_yt7_UQ/s1600/CBAP+Stand+2014.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQCpznzEkU8lotT5ePka1r0RZ-MhGvx36pWA4NEVVPYbDwGPfOsSSfTFkG7L5-x7cBOLnBhuISINHvI2i14gS0THIQsXl-JjD_1gk_1F-HVdHzciRpKL1NzWt_A7s32SQNrc5M_yt7_UQ/s1600/CBAP+Stand+2014.png" height="247" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Auch 2014 ist die Zahl der zertifizierten Business Analysten stark gewachsen</td></tr>
</tbody></table>
<br />
CBAP: Certified Business Analysis Professional<br />
CCBA: Certified Competency in Business Analysis<br />
<br />
In Deutschland ist die Zahl auf 33 CBAP und 2 CCBA angewachsen, zeigt aber im europäischen Vergleich z.B. gegenüber England, Italien und der Schweiz immer noch einen deutlichen Nachholbedarf. Es fällt auch auf, dass inzwischen die Anzahl der CCBA, das sind jüngere Business Analysten, die noch nicht über so viel Berufserfahrung verfügen wie CBAP, deutlich gestiegen ist. Damit gewinnt dieses Zertifikat weitere Anerkennung. Das entspricht meiner Wahrnehmung, dass die Rolle des Business Analysten als Partner des Projektmanagers und als Garant für den Projekterfolg in Bezug auf die Qualität immer bekannter wird. Nicht zuletzt deswegen, weil Projekte, in denen ein qualifizierter Business Analyst mitwirkt, in aller Regel zuverlässiger und mit besserem Erfolg abgeschlossen werden. <br />
<br />
Zumindest sind das die Erfahrungen, die ich in meinem beruflichen Umfeld "Business Intelligence" mache. Gerade in BI Projekten, die naturgemäß komplex sind und viele Beteiligte haben, kommen bei Fehlplanungen schnell fünf- und sechsstellige zusätzliche Beträge zusammen, die sich durch die Arbeit eines Business Analysten hätten vermeiden lassen. Das liegt auch daran, dass der Business Analyst wie die IIBA ihn definiert, viel mehr leistet, als lediglich die Anforderungen (Requirements) aufzunehmen, qualitativ hochwertig zu machen und systematisch die Änderungen von Anforderungen zu klären und genehmigen zu lassen. Der Business Analyst stellt darüber hinaus auch zum Beispiel Fragen in Bezug auf die Versionierung einer Lösung (in welchen Schritten wird die Lösung bereitgestellt), die erforderlichen Änderungen bei den Fachanwendern (Schulung, Änderungen bestehender Abläufe, Konvertierung von Daten) und vor allem immer wieder nach dem Wert, den eine neue Lösung (oder ihre Teile) dem Unternehmen liefert. So trägt der Business Analyst entscheidend dazu bei, dass das Projekt auf Kurs bleibt und dass das eingesetzte Geld den größtmöglichen Nutzen für den Auftraggeber bringt. Das sich daraus ergebende positive Arbeitsklima ist ein weiterer angenehmer Nebeneffekt für alle Beteiligten. <br />
<br />
Nun bin ich gespannt, was das Jahr 2015 der Business-Analysten Gemeinde bringt und wann wir die Marke von 10.000 CBAPs und CCBAs "knacken" werden. <br />
<br />
Quelle: <a href="http://www.iiba.org/Certification-Recognition/Certification-Registry/CBAP-Registry.aspx" target="_blank">IIBA</a> Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-60767622988060832292015-01-11T16:03:00.000+01:002015-01-11T16:03:10.699+01:00Mit ReportItems auf Inhalte in Tablix-Zellen zugreifenIn etwas anspruchsvolleren Berichten benötigen Sie gelegentlich die Möglichkeit, den Inhalt der Zelle in einer Tabelle oder Matrix an anderer Stelle noch einmal zu verwenden. Das ist durchaus möglich aber nicht ganz offensichtlich. <br />
<br />
<h3>
Ein einfaches Beispiel</h3>
Im vorliegenden Beispiel sehen Sie zwei Tabellen, in denen die Umsätze unterschiedlicher Länder dargestellt werden. Der Bericht soll nun noch um ein Textfeld erweitert werden, das die Summe der beiden "Total" Zellen berechnet. <br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikETzJDTV6n6wRnQtnXYVPehGOzGRmNqH3mWEVuvPTaPTL9eN5mm7_-wvplmMQzqXfF1LJRvHl9kkJScOhIw5mMzw_viWIoe6vQy9kpwR0vtDcHOmJJHxP6ZbNh-E3bFyV7rX1zjmrcMU/s1600/10-01-2015+14-41-39a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikETzJDTV6n6wRnQtnXYVPehGOzGRmNqH3mWEVuvPTaPTL9eN5mm7_-wvplmMQzqXfF1LJRvHl9kkJScOhIw5mMzw_viWIoe6vQy9kpwR0vtDcHOmJJHxP6ZbNh-E3bFyV7rX1zjmrcMU/s1600/10-01-2015+14-41-39a.png" height="190" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Das Textfeld rechts unten zeigt die Summe der "Total"-Zellen der beiden Tabellen an</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Um das zu erreichen, ist es nützlich den beiden Tabellenzellen erst einmal sprechende Namen zu geben. Exakter ausgedrückt: Eine Tabelle (Tablix) in SSRS besteht aus TextBoxen. Diejenigen TextBoxen in den Tabellen, welche den "Total" Wert enthalten, bekommen die Namen "SummeTablix1" und "SummeTablix2". Das folgende Bild zeigt dies deutlicher. <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE4RAOsjy0nOoTX4uO2Ebn0TkRt2S3qDkZ5-rH1UEXtRP0q-jN7qYA7TxDVC_9HPyfEIuTeESO4oa1lGrzrzzXKXClIC7nnZ9biEwOz0TFt9X4tLRlOYM4k6TiAq83hsUUn36b6lOHqlY/s1600/10-01-2015+14-58-36a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiE4RAOsjy0nOoTX4uO2Ebn0TkRt2S3qDkZ5-rH1UEXtRP0q-jN7qYA7TxDVC_9HPyfEIuTeESO4oa1lGrzrzzXKXClIC7nnZ9biEwOz0TFt9X4tLRlOYM4k6TiAq83hsUUn36b6lOHqlY/s1600/10-01-2015+14-58-36a.png" height="126" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Der Name dieser TextBox wird geändert nach "SummeTablix1" </td></tr>
</tbody></table>
Nach dieser Vorbereitung kann die neue TextBox rechts unten im Bericht hinzugefügt werden. Der folgende Ausdruck leistet das Gewünschte: <br />
<br />
<span style="font-family: "Courier New", Courier, monospace;"> =ReportItems!SummeTablix1.Value + ReportItems!SummeTablix2.Value</span><br />
<br />
Die hier verwendete <strong>ReportItems</strong> Collection enthält alle TextBoxen einer Berichtsdatei. Allerdings ist sie an der grafischen Oberfläche nicht sichtbar. Sie müssen einfach wissen, dass es diese Collection gibt und dann können Sie diese in einer Expression eintippen. Lassen Sie sich nicht irritieren - erst nachdem Sie das Ausrufezeichen nach dem Wort "ReportItems" eingegeben haben, erscheint die Drop-Down Liste als Eingabeunterstützung und bietet Ihnen die Namen aller TextBoxen in diesem Bericht zur Auswahl an. Dies ist der Punkt, wo sich die sprechenden Namen der betreffenden TextBoxen als nützlich erweisen. <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIUq04p0cMF1hETFgympaj33QesRDHEUtTm0CUCeMgshxOPK6mV2_-O7ILSvH35ji5RdUo1-YjSUXlsve-hYcNzGNHmQPCGqdM1plqVoCfVzOb6pyfOurcLSgeWnPcD59UVyYrrwD_uBA/s1600/10-01-2015+15-12-10.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhIUq04p0cMF1hETFgympaj33QesRDHEUtTm0CUCeMgshxOPK6mV2_-O7ILSvH35ji5RdUo1-YjSUXlsve-hYcNzGNHmQPCGqdM1plqVoCfVzOb6pyfOurcLSgeWnPcD59UVyYrrwD_uBA/s1600/10-01-2015+15-12-10.png" height="137" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Erst nach Eingabe des Ausrufezeichens hinter dem Wort ReportItems nimmt die Eingabehilfe ihre Arbeit auf</td></tr>
</tbody></table>
<br />
Wenn sie diese Hürde genommen haben, ist es ein Leichtes den Ausdruck vollständig einzugeben. <br />
<br />
<h3>
Noch ein Beispiel</h3>
Sie möchten in einer Tabelle Verhältniszahlen berechnen? Mit <strong>ReportItems</strong> ist das kein Problem mehr. Nehmen wir folgende Anforderung als Beispiel: Neben dem Umsatz eines Jahres soll sein prozentualer Anteil am Umsatz aller Jahre angezeigt werden. <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwYqesmhWY9SUsS_nVpk_gsfYXGUU34R2tDr7Mc6N-OZJO4rSU6Ipfg2c7ZnLcEACJwHBWk-nKeoKccJRVM3r0EiL_N-wlYSzGhyphenhyphen5iZsZhoW1X9A6rkBuT4ADb9g2_9o6p9ZyjCoXyBn4/s1600/10-01-2015+15-51-11a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwYqesmhWY9SUsS_nVpk_gsfYXGUU34R2tDr7Mc6N-OZJO4rSU6Ipfg2c7ZnLcEACJwHBWk-nKeoKccJRVM3r0EiL_N-wlYSzGhyphenhyphen5iZsZhoW1X9A6rkBuT4ADb9g2_9o6p9ZyjCoXyBn4/s1600/10-01-2015+15-51-11a.png" height="148" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Der "Sales Amount" für das Jahr 2005 entspricht 20% des "Sales Amount" über alle Jahre</td></tr>
</tbody></table>
<br />
Der Ausdruck in der Spalte "% Umsatz" ist der Umsatz eines Jahres geteilt durch die Summe des Umsatzes über alle Jahre:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">=ReportItems!SalesAmount1.Value / ReportItems!SummeTablix1.Value</span><br />
<br />
<h3>
ReportItems in Kopf- und Fußzeilen</h3>
Noch ein schöner Anwendungsfall ist der Einsatz von ReportItems in Kopf- oder Fußzeilen eines Berichts. Nehmen wir an, in der Kopfzeile soll das erste und das letzte Jahr angezeigt werden, das auf der jeweiligen Seite zu sehen ist. Um das besser demonstrieren zu können, habe ich meinen Beispiel-Bericht so verändert, dass nur noch maximal 3 Jahre auf einer Seite dargestellt werden. (Hierfür habe ich einfach in der Eigenschaft des Berichts "InteractiveSize" die Höhe auf 3 Zentimeter reduziert.) <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBXpw9niCbs-TpfkpfbU2x4jDaTGTcCajAyaJ3ZjZXCUUPfLSbDNOfnoYist4h5yM8e-CDhAPVuyTetZjGM4sXTrh101UGxL7n4jHu7WKsZ2px5IJLvMTDQsYA6wdDy-_3o8thl14KdG0/s1600/10-01-2015+16-06-45.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBXpw9niCbs-TpfkpfbU2x4jDaTGTcCajAyaJ3ZjZXCUUPfLSbDNOfnoYist4h5yM8e-CDhAPVuyTetZjGM4sXTrh101UGxL7n4jHu7WKsZ2px5IJLvMTDQsYA6wdDy-_3o8thl14KdG0/s1600/10-01-2015+16-06-45.png" height="92" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">In der Kopfzeile werden die erste und die letzte Jahreszahl auf dieser Seite angezeigt</td></tr>
</tbody></table>
Mit Hilfe der Aggregatfunktionen First() und Last() können Sie das erste Jahr und das letzte Jahr in der Spalte "OrderYear" ermitteln. Jedoch gibt es noch eine kleine Hürde zu nehmen. Denn wenn Sie versuchen, einen Ausdruck wie den folgenden zu verwenden, erhalten Sie eine Fehlermeldung:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">="Von " & First(ReportItems!OrderYear.Value) & " bis " & Last(ReportItems!OrderYear.Value)</span><br />
<br />
Die Fehlermeldung besagt, dass Sie in Kopf- und Fußzeilen pro Ausdruck jeweils nur ein ReportItem verwenden dürfen. <br />
Zur Lösung könnten Sie zwei nahe nebeneinander gelegene TextBoxen verwenden. Noch eleganter finde ich allerdings die Verwendung von zwei Platzhaltern in <em>derselben</em> TextBox. Jeder Platzhalter wird über einen eigenen Ausdruck mit Inhalt gefüllt.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIs-QPUvm65PEdc1CCoNG1j0Y-PHqRc4FUwn6QddcmXuTta-XQ6MNgZWmIhAUS-mP_KnMXVhXwaKwo9lOwNkzJdXuXMbyCpOMBDfTEUozLGBXA5c_gzjf8K06TgbXyWm7DArL42DptB9k/s1600/10-01-2015+16-19-20a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIs-QPUvm65PEdc1CCoNG1j0Y-PHqRc4FUwn6QddcmXuTta-XQ6MNgZWmIhAUS-mP_KnMXVhXwaKwo9lOwNkzJdXuXMbyCpOMBDfTEUozLGBXA5c_gzjf8K06TgbXyWm7DArL42DptB9k/s1600/10-01-2015+16-19-20a.png" height="110" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Eine TextBox kann mehrere Platzhalter enthalten</td></tr>
</tbody></table>
Der erste Platzhalter enthält diesen Ausdruck:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">="Von " & First(ReportItems!OrderYear.Value) & " bis "</span><br />
<br />
Der zweite Platzhalter enthält diesen Ausdruck:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">=Last(ReportItems!OrderYear.Value)</span><br />
<br />
Voilá! <br />
<br />
<h3>
Die offizielle Dokumentation</h3>
ReportItems sind natürlich auch in der MSDN dokumentiert, wenn auch etwas abstrakt, wie ich finde. Das <a href="http://msdn.microsoft.com/de-de/library/dd255285.aspx" target="_blank">entsprechende Kapitel in der MSDN</a> enthält hierzu noch einige interessante Anmerkungen über die interne Arbeitsweise von Reporting Services. Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-62915767270472837552015-01-07T12:26:00.000+01:002015-01-07T12:30:06.013+01:00Auswahl mehrerer Werte im Bericht anzeigenReporting Services bietet die Möglichkeit, dass ein Berichtsparameter mehrere Werte enthalten kann. Im folgenden Beispiel ist das eine Liste von Ländern. Dieser Beitrag soll zeigen, wie Sie die Liste der ausgewählten Länder ganz einfach als Text im Bericht anzeigen können (im folgenden Bild grün hinterlegt). <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQjXVKmjHLXJUb_-DL7OXbJb1iyiSZLf3zMcNdMJIaFh3AaNk8QRqcyZGV7DzJJelb9GaiyF3nCOK0iEQ5i8NB9IP6SH3J3pV5ROKRd-gpd5odSPXZH8rbuhz4F7jT4WtZLq4hRMrGfuc/s1600/07-01-2015+11-48-02.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQjXVKmjHLXJUb_-DL7OXbJb1iyiSZLf3zMcNdMJIaFh3AaNk8QRqcyZGV7DzJJelb9GaiyF3nCOK0iEQ5i8NB9IP6SH3J3pV5ROKRd-gpd5odSPXZH8rbuhz4F7jT4WtZLq4hRMrGfuc/s1600/07-01-2015+11-48-02.png" height="200" width="177" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Dieser einfache Bericht zeigt die Umsätze der ausgewählten Länder<br />
</td></tr>
</tbody></table>
<h3>
Das sind die Schritte zur Lösung</h3>
Zunächst einmal braucht es einen Berichtsparameter, bei dem die Eigenschaft "allow multiple values" gesetzt ist.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj34KwFJO4k0krqTbd7IAPWNuuKWJfIbDZGqnBDWALnoZxtJsC58DX_6uBKpZw1eS9poXsqifBI8thVWuM-213NyZ0rbytHopn7N54QSvSAf2VNrmH82RSKnQU3hKhWTq4D2mjEokaXVp0/s1600/07-01-2015+11-57-21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj34KwFJO4k0krqTbd7IAPWNuuKWJfIbDZGqnBDWALnoZxtJsC58DX_6uBKpZw1eS9poXsqifBI8thVWuM-213NyZ0rbytHopn7N54QSvSAf2VNrmH82RSKnQU3hKhWTq4D2mjEokaXVp0/s1600/07-01-2015+11-57-21.png" /></a></div>
<br />
Das hat zur Folge, dass der Parameter dem Anwender in dieser Form angezeigt wird:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVK-uKJ1scDeC3w2mGlcnfthefQD9ORmJdKHN-TsInnDMruAAOixtR0ma-VEDJrhxlXpEYp83N1wkagWciTYwi4IJvByjhNZL-lVRRpKtfhw2xAMCvMPPd2oDti1QDkWb047dvpZ3JDX8/s1600/07-01-2015+11-50-53.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVK-uKJ1scDeC3w2mGlcnfthefQD9ORmJdKHN-TsInnDMruAAOixtR0ma-VEDJrhxlXpEYp83N1wkagWciTYwi4IJvByjhNZL-lVRRpKtfhw2xAMCvMPPd2oDti1QDkWb047dvpZ3JDX8/s1600/07-01-2015+11-50-53.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
Um jetzt die ausgewählten Länder im Bericht anzuzeigen, habe ich dem Bericht zwei TextBoxen hinzugefügt: eine mit dem statischen Text "Umsatz für folgende Länder:" und darunter eine TextBox mit einer Expression. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY5o1_J3WIS1cpLyZXKWR-hi4YO6DHuJICVQrAoN83_W5rUM8aaTtckwKut8tNpMqet9a_13N63AzJn7_K1ORl5adL25YAw7eL0JAji8wrdmDezxeFaPpFue5zEpLPgrF-yLhA7WUcVTY/s1600/07-01-2015+12-12-25.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhY5o1_J3WIS1cpLyZXKWR-hi4YO6DHuJICVQrAoN83_W5rUM8aaTtckwKut8tNpMqet9a_13N63AzJn7_K1ORl5adL25YAw7eL0JAji8wrdmDezxeFaPpFue5zEpLPgrF-yLhA7WUcVTY/s1600/07-01-2015+12-12-25.png" /></a></div>
<br />
Die Expression nutzt die Funktion <strong>Join()</strong>. Diese Funktion wandelt den Inhalt eines mehrwertigen Parameters in eine Zeichenkette um. Das zweite Argument dieser Funktion gibt an, durch welche Zeichen die einzelnen Parameterwerte getrennt werden sollen. <br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">Join(Parameters!pCountries.Value, ", ")</span><br />
<br />
Eine Dokumentation der Join() Funktion sowie viele weitere nützliche Informationen über die Verwendung von Berichtsparametern in Expressions finden Sie <a href="http://technet.microsoft.com/de-de/library/aa337293%28v=sql.100%29.aspx" target="_blank">hier in der MSDN</a>.Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-41038086310973826302015-01-06T16:11:00.000+01:002015-01-06T16:11:09.118+01:00Spaltenüberschriften auf jeder Seite wiederholenEs ist eine typische Anforderung an einen Bericht, dass die Spaltenüberschriften einer langen Tabelle sich auf jeder Seite wiederholen. Dafür bietet Reporting Services eine scheinbar einfach zu verwendende Eigenschaft, die nach einem Rechtsklick auf die Tabelle und Auswahl von "Tablix Properties" zu sehen ist. Sie heißt "Column Headers" und bietet zwei Checkboxen. Die erste dient zum Wiederholen der Spaltenüberschriften auf jeder Seite und die zweite blendet die Spaltenüberschriften auch dann am oberen Bildrand ein, wenn Sie eine lange Seite im Browser herunterscrollen. <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKebD5JIswHbnLlentzcff6giPPwPbcQUfYe2Fzcfr3Pa550S7VY-zr2hbRqbbR_Q6wBHR9C6iHoc8nA0IaXILvt2rLew8Yj9F-EgFAfXFp8S980-m-ZGB8LhaAKvGiPBMh4YCOp4nJ0w/s1600/05-01-2015+10-11-31.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKebD5JIswHbnLlentzcff6giPPwPbcQUfYe2Fzcfr3Pa550S7VY-zr2hbRqbbR_Q6wBHR9C6iHoc8nA0IaXILvt2rLew8Yj9F-EgFAfXFp8S980-m-ZGB8LhaAKvGiPBMh4YCOp4nJ0w/s1600/05-01-2015+10-11-31.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Diese Option hat bei Tabellen keine Auswirkung</td></tr>
</tbody></table>
Allerdings hat diese Eigenschaft bei Tabellen einen entscheidenden Nachteil: Sie funktioniert nicht. Die Spaltenüberschriften werden NICHT wiederholt, unabhängig davon, ob Sie den Haken setzen oder nicht. <br />
<br />
<h3>
Mit einer Matrix geht's</h3>
So ganz wirkungslos sind diese Checkboxen allerdings nicht. Wenn Sie mit einer <strong>Matrix</strong> anstelle einer Tabelle arbeiten, dann werden die Spaltenüberschriften sehr wohl wiederholt. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1V11xPyiF5lwOEo7XAdeE3CdTfxf_Cia15QE7B1Iwfx52IcD5VhObSUPWM7Ic4YTl5yrniBGcyS3T_PUuHEDA2g4truudxD7HR4H4QvnntWM-1uSXk6qNVEOCAbKyxzJe5iH1JyTSHsE/s1600/05-01-2015+10-20-49a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1V11xPyiF5lwOEo7XAdeE3CdTfxf_Cia15QE7B1Iwfx52IcD5VhObSUPWM7Ic4YTl5yrniBGcyS3T_PUuHEDA2g4truudxD7HR4H4QvnntWM-1uSXk6qNVEOCAbKyxzJe5iH1JyTSHsE/s1600/05-01-2015+10-20-49a.png" height="91" width="320" /></a></div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEgZRp7MZZUqrobUpDcUJ3CniMMRFnVONRjrSFQeyYMnT1jr0QFSkKTF60KMXq_AtJJ3OO3G5M8mMnz2WP8KtRDYwJyiK-L5p3qvksO8xqO8DIM81Ij2QItk9sv-OJQckwGcHKhYEINr8/s1600/05-01-2015+10-21-17a.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgEgZRp7MZZUqrobUpDcUJ3CniMMRFnVONRjrSFQeyYMnT1jr0QFSkKTF60KMXq_AtJJ3OO3G5M8mMnz2WP8KtRDYwJyiK-L5p3qvksO8xqO8DIM81Ij2QItk9sv-OJQckwGcHKhYEINr8/s1600/05-01-2015+10-21-17a.png" height="108" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Bei einer Matrix werden die Spaltenüberschriften wiederholt</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
Was ist hier anders? Die Matrix zeichnet sich ja dadurch aus, dass die Anzahl der Spalten von den Daten im Dataset bestimmt wird. Im Beispiel gibt es Daten für die Jahre 2005 bis 2008. Gäbe es darüber hinaus noch Daten für das Jahr 2009, würde der Matrix automatisch eine entsprechende Spalte hinzugefügt. Man könnte auch sagen, dass bei der Matrix die Spalten dynamisch sind. Die Eigenschaft "Repeat header columns on each page" bezieht sich also auf dynamische Spalten. <br />
<br />
<h3>
Die Lösung für Tabellen</h3>
In einer Tabelle hingegen sind die Spalten statisch. Zur Entwurfszeit legen Sie fest, welche Spalten der Tabelle im Bericht angezeigt werden sollen. Und für statische Spalten gilt die Eigenschaft "Repeat header columns on each page" eben nicht. <br />
Die Lösung für statische Spalten ist leider nicht so einfach, aber dafür zeigt sie uns tiefer liegende Eigenarten von Reporting Services. Es wird also spannend. <br />
Schauen wir uns zunächst das Problem genauer an. Dazu habe ich einen Bericht erstellt, der eine Tabelle mit Umsatzzahlen pro Monat darstellt. Jedes Jahr beginnt auf einer neuen Seite. Die statischen Spaltenüberschriften (Order Year, Order Month und Sales Amount) werden auf der ersten Seite angezeigt, aber auf den Folgeseiten nicht mehr. <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNG4ciI8tj_gnQ3JFMLbzuY53M6h9-mSF3dzMOoRBbqe2VgJFZ5Mnch6kIt2SC-YDOGSA4q2Sfv81XJ728cG-PCk70Zluj-VhOe74xrPEubpAEGWq2llt3co_2eb4ZBfqdSahPiGTQIIo/s1600/06-01-2015+14-49-50.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNG4ciI8tj_gnQ3JFMLbzuY53M6h9-mSF3dzMOoRBbqe2VgJFZ5Mnch6kIt2SC-YDOGSA4q2Sfv81XJ728cG-PCk70Zluj-VhOe74xrPEubpAEGWq2llt3co_2eb4ZBfqdSahPiGTQIIo/s1600/06-01-2015+14-49-50.png" height="107" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh92EMiO730cgoFxKhrDrkSUeZvSMT9_4EotX2gdN3ETinBRQFvaLEq8MuVmBwb697DOkTPaAPc31Mj_gH67c_hHqLZK-gulT0-CmwzmPH68_ZejKRQ5KBd2_3l5eYWlL_ILabkxmAK2ro/s1600/06-01-2015+14-49-03.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh92EMiO730cgoFxKhrDrkSUeZvSMT9_4EotX2gdN3ETinBRQFvaLEq8MuVmBwb697DOkTPaAPc31Mj_gH67c_hHqLZK-gulT0-CmwzmPH68_ZejKRQ5KBd2_3l5eYWlL_ILabkxmAK2ro/s1600/06-01-2015+14-49-03.png" height="93" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Bei einer Tabelle werden die statischen Spaltenüberschriften nicht wiederholt</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
Um die Eigenschaften der statischen Spaltenüberschriften zu sehen, brauchen Sie das wohl am besten versteckte Bedienelement der Visual Studio Oberfläche: rechts unten, im Bereich der Gruppenkonfiguration, finden Sie bei genauem Hinsehen einen kleinen Pfeil. <br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW3ojZXcEf1t03EIFhU_TiBXuqTCPVOzqWgTB1MzZDjw8YkTJ4pg-5GbSaNMXR7aqspe313wJGRxrg2k46c3e3tt9OQA1wAJLxKzfhRu9ZnHQih92amNF9s5nquaYXUj7DdMlphfI_OAw/s1600/06-01-2015+15-01-16.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW3ojZXcEf1t03EIFhU_TiBXuqTCPVOzqWgTB1MzZDjw8YkTJ4pg-5GbSaNMXR7aqspe313wJGRxrg2k46c3e3tt9OQA1wAJLxKzfhRu9ZnHQih92amNF9s5nquaYXUj7DdMlphfI_OAw/s1600/06-01-2015+15-01-16.png" height="168" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Dieser unscheinbare Pfeil (rot umrandet) ist der Schlüssel zur Lösung</td></tr>
</tbody></table>
Nach Klicken auf den Pfeil können Sie den "Advanced Mode" einschalten. Diese Betriebsart stellt in den beiden Fenstern der Gruppenkonfiguration (Row Groups und Column Groups) auch die statischen Elemente dar. <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKhs4k5qCG1jv4FO0xO7f80L1NAMhfygZxhx4W2olfllsZEVVRP3MKk-_ESl3VXbcZdPxBAwU3-SqiRWp-gg5yVdRnRVhkMUqionvvi3THrQ6oJDy2RykRI03a-JIB_WFA8JUfRDasZt8/s1600/06-01-2015+15-06-48.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKhs4k5qCG1jv4FO0xO7f80L1NAMhfygZxhx4W2olfllsZEVVRP3MKk-_ESl3VXbcZdPxBAwU3-SqiRWp-gg5yVdRnRVhkMUqionvvi3THrQ6oJDy2RykRI03a-JIB_WFA8JUfRDasZt8/s1600/06-01-2015+15-06-48.png" height="170" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Nach Anklicken eines "Static" Eintrags wird das entsprechende Feld in der Tabelle dick umrandet</td></tr>
</tbody></table>
Was Sie jetzt noch brauchen, ist nach dem Anklicken des ersten "Static" Elements in der Row Group das "Eigenschaften" Fenster, um die Eigenschaften dieses statischen Elements zu sehen. Falls das Fenster nicht schon in Visual Studio angezeigt wird, können Sie es über den Menüpunkt "Ansicht" - "Eigenschaftenfenster" oder mit der Taste [F4] einblenden. Wenn Sie die Eigenschaft "KeepWithGroup" auf "After" einstellen und die Eigenschaft "RepeatOnNewPage" auf "True", dann erreichen Sie den gewünschten Effekt. <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1ybYPbYkhb7Jq2z4jCMl-Q3QcIMJEoWbIaj1O2t1Ly1w83fUdRpR3hDYc_0H2FcCdWtVGI_cw9qsn_pUU9ed1PvvwjRWQ8iGKH0kbe_QkOMOK58pJSwFBLg7stRGxJF-sdt2cD1IVtGE/s1600/06-01-2015+15-14-29.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1ybYPbYkhb7Jq2z4jCMl-Q3QcIMJEoWbIaj1O2t1Ly1w83fUdRpR3hDYc_0H2FcCdWtVGI_cw9qsn_pUU9ed1PvvwjRWQ8iGKH0kbe_QkOMOK58pJSwFBLg7stRGxJF-sdt2cD1IVtGE/s1600/06-01-2015+15-14-29.png" height="200" width="143" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Die Eigenschaften KeepWithGroup und RepeatOnNewPage der statischen Spaltenüberschrift führen zur Lösung</td></tr>
</tbody></table>
Interessanterweise funktioniert das nur dann, wenn Sie diese Einstellung bei der ersten statischen Spaltenüberschrift durchführen.<br />
<h3>
Spaltenüberschriften beim Scrollen immer anzeigen</h3>
Am Anfang dieses Beitrags hatte ich noch eine weitere Eigenschaft erwähnt, die bei dynamischen Spaltenüberschriften möglich ist: "Keep header visible while scrolling". Auch bei statischen Überschriften können Sie das konfigurieren, allerdings heißt die entsprechende Eigenschaft im Eigenschaften-Fenster "FixedData".<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihDOABxf50G01N4WB_nLULqJJ9HVxEr1G2QNhyrOtIv2OTZLaOXBI4f7smifI1-RzFakLuVNbBb5bLZe2yR59Po2XZeHTtMBvSIZcG7HwtN_XDR68VfEVOskX37cZUAol4qiiAaLBwiQc/s1600/06-01-2015+15-51-17.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihDOABxf50G01N4WB_nLULqJJ9HVxEr1G2QNhyrOtIv2OTZLaOXBI4f7smifI1-RzFakLuVNbBb5bLZe2yR59Po2XZeHTtMBvSIZcG7HwtN_XDR68VfEVOskX37cZUAol4qiiAaLBwiQc/s1600/06-01-2015+15-51-17.png" height="90" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Die (gelb hinterlegten) Spaltenüberschriften bleiben auch beim Scrollen am oberen Bildrand sichtbar</td></tr>
</tbody></table>
Übrigens finden Sie eine Beschreibung dieses Verhaltens auch in der <a href="http://msdn.microsoft.com/de-de/library/dd207045.aspx" target="_blank">MSDN Dokumentation</a>. Allerdings in einer Form, die für mich nicht so offensichtlich war. Ich musste mich einige Zeit mit diesem Thema beschäftigen, bevor mir die Hintergründe klar wurden. Von daher hoffe ich, dass dieser Beitrag Ihnen das Arbeiten mit statischen Spaltenüberschriften in Reporting Services etwas einfacher macht. Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-48027971767400090052014-08-30T07:56:00.002+02:002014-08-30T07:59:34.095+02:00Business Analyse: Entscheidender Erfolgsfaktor in BI ProjektenEs ist ein unschätzbarer Vorteil meines Berufs, dass ich viele unterschiedliche BI Projekte erlebe. Interessanterweise sehe ich dabei einige Unternehmen, in denen BI Projekte fast immer sehr erfolgreich sind und andere Unternehmen, wo BI Projekte regelmäßig katastrophenähnliche Zustände annehmen. Unter "erfolgreich" verstehe ich Projekte, die im geplanten Zeitrahmen alle vorgesehenen Berichte und Analysen zur vollen Zufriedenheit der Anwender liefern und dabei mit dem veranschlagten Budget auskommen. Die nicht erfolgreichen Projekte hingegen liefern Ergebnisse nur verspätet und die Anwender sind damit dann auch noch unzufrieden. Wegen der wiederholten Terminverschiebungen und unerwarteten Arbeiten sieht sich der Auftraggeber gezwungen, das Budget immer wieder aufzustocken oder irgendwann das Projekt abzubrechen.<br />
<br />
Wenn aber doch alle Verantwortlichen den Erfolg wollen, warum sind dann nicht alle Projekte erfolgreich? Was machen die erfolgreichen Unternehmen besser?<br />
<br />
Es gibt eine augenfällige Gemeinsamkeit: Bei allen erfolgreichen Projekten erhebt ein Business Analyst die Anforderungen und pflegt diese während des gesamten Projektverlaufs. In diesen Unternehmen ist es üblich, dass erst wenn die Anforderungen hinreichend geklärt sind (hinreichend mit Blick auf die Vorgehensweise wie plangesteuert oder agil), mit der Umsetzung begonnen wird. Alle Projektverantworlichen haben diese Regel verinnerlicht. <br />
<div>
</div>
<div>
In den anderen Unternehmen sind Aussagen wie diese an der Tagesordnung:</div>
<ul>
<li>Für Analysen haben wir jetzt keine Zeit</li>
<li>Für Analysen steht kein Budget bereit</li>
<li>Wir wissen sowieso, was die Anwender brauchen</li>
<li>Das Projekt ist so klein, dass der Aufwand für eine Analyse sich nicht lohnt</li>
<li>Wir haben das immer so gemacht</li>
</ul>
<div>
Das Interessante ist, dass bei ALLEN so durchgeführten Projekten der Misserfolg gewiss ist. </div>
<div>
</div>
<div>
Inzwischen hat sich in Bezug auf die Business Analyse weltweit bei immer mehr Unternehmen die Erkenntnis durchgesetzt, dass sie ein wesentlicher Erfolgsfaktor bei allen Projekten ist. Das International Institute for Business Analysis (IIBA) hat eine umfassende Herangehensweise erarbeitet mit zwei Zertifizierungen (<a href="http://volkerheck.blogspot.de/2013/04/erfahrungsbericht-cbap-prufung.html" target="_blank">hier finden Sie mehr</a>) und kürzlich hat das Project Management Institute (PMI) ebenfalls eine entsprechende Zertifizierung herausgegeben (<a href="https://www.xing.com/communities/posts/have-you-ever-heard-about-pmi-pba-1007943467" target="_blank">hier mehr</a>). </div>
<div>
</div>
<div>
Zum Schluss noch mein Lieblingsargument gegen den Einsatz von Business Analyse in BI Projekten: "Dieses Vorgehen schränkt das Team in seiner Kreativität ein." Seien Sie versichert, das Gegenteil ist der Fall! Immer wenn ich in einem Projekt mitarbeite, das aus dem Krisenmodus nicht herauskommt, sehne ich mich nach den gut analysierten Projekten, in denen wir unsere Energie nicht in die Bewältigung vorhersehbarer Probleme stecken mussten, sondern uns ganz dem Erarbeiten der fachlich, wirtschaftlich und technisch besten Lösung widmen konnten. </div>
<div>
</div>
<h3>
Webinar-Tipp</h3>
<div>
Am Donnerstag, den 4. September 2014, biete ich von 10:00 bis 11:00 Uhr ein Webinar "Anforderungsanalyse für Business Intelligence Projekte" an. </div>
<div>
<a href="https://attendee.gotowebinar.com/register/5886828495466267393" rel="nofollow" target="_blank">Sie können kostenlos daran teilnehmen. </a></div>
<div>
</div>
Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-42213599582461590602014-06-09T17:43:00.002+02:002014-06-09T21:22:45.318+02:00SQL Server Data Tools - die Entwicklungsumgebung für DatenbankentwicklerMit welchen Werkzeugen haben sie bisher Ihre Datenbanktabellen, Views und Stored Procedures erstellt? Die SQL Server Umgebung bot hier bisher nur wenig Unterstützung, so dass Entwicklerteams auf Produkte von Drittanbietern angewiesen waren. Das ändert sich durch die <strong>SQL Server Data Tools (SSDT)</strong>, die Microsoft <a href="http://msdn.microsoft.com/en-us/data/hh322942" target="_blank">lizenzkostenfrei</a> anbietet. <br />
<br />
<h3>
"BI or not BI" - Begriffsklärung</h3>
Die Namensgebung ist etwas verwirrend, denn wenn Sie bereits mit SQL Server 2012 arbeiten und die Reporting Services, Integration Services oder Analysis Services einsetzen, dann haben Sie bereits "Data Tools" installiert. Diese heißen jetzt zur Unterscheidung mit vollem Namen "SQL Server Data Tools – Business Intelligence" (SSDT-BI). Darüber habe ich bereits <a href="http://volkerheck.blogspot.de/2014/06/data-tools-fur-business-intelligence.html" target="_blank">in diesem Blogbeitrag</a> geschrieben. <br />
<br />
Hier geht es nun um die Server Data Tools (SSDT) für die Entwicklung von Datenbank-Projekten. <br />
<br />
<h3>
Einsatz</h3>
<div>
SSDT kommt dem Bedürfnis von Projektteams entgegen, Datenbankprojekte genauso wie BI Projekte in Visual Studio zu entwickeln und dabei eine Quellcodeverwaltung (z.B. Team Foundation Server TFS) einzusetzen. Zu diesem Zweck gibt es neben dem Online-Arbeiten, wo Änderungen direkt auf die Datenbankobjekte angewendet werden, die Offline-Projekte, wo Entwickler auch ohne direkte Verbindung zum SQL Server Objekte wie Tabellen etc. modellieren können. Grafische Editoren für Tabellen, Views, Stored Procedures usw. erleichtern und beschleunigen diese Arbeiten sehr. </div>
<div>
Darüber hinaus bietet der Schema-Vergleich die Möglichkeit, ALTER-Skripte zu generieren, mit denen beispielsweise der Stand der Produktionsdatenbank auf den der Test-Datenbank gebracht wird - eine ganz wichtige Arbeitserleichterung. Auch für den Vergleich und das Angleichen von Daten in Tabellen gibt es ein Werkzeug. Und beim Überarbeiten umfangreicher SQL-Skripte, zum Beispiel dem Umbenennen einer Tabellenspalte, identifiziert die Funktion "Refactor" alle Referenzen, die in Folge ebenfalls angepasst werden müssen. </div>
<div>
Mein erster Eindruck ist, dass hier kein Wunsch offen bleibt und ich bin gespannt, was nach einigen Wochen Projekterfahrung mit SSDT zu ergänzen ist. SSDT unterstützt als Quell- und Zieldatenbanken die SQL Server Versionen 2005 bis 2014 sowie SQL Azure. </div>
<div>
<br />
<h3>
Eindrücke</h3>
Die folgenden Bilder geben einen kleinen Eindruck von der Entwicklungsumgebung. Eine anschauliche Schritt-für-Schritt Anleitung stellt Microsoft hier bereit: <a href="http://msdn.microsoft.com/de-de/library/hh272686(v=vs.103).aspx" target="_blank">Dokumentation zu SSDT</a> </div>
<div>
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPUm-VVHRjhDG6V4cHnCC9GM-vx4oZllvX207xBP7Znkc7_4Je55aLHdIu_3ylczqZE3htYBSZFZwjiDzFrbjll3__sgrWbg549LjFnzjmB7zWtm-Gs_O_rnM_tJtan2DBnE__j-wPRCU/s1600/09-06-2014+17-17-02.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPUm-VVHRjhDG6V4cHnCC9GM-vx4oZllvX207xBP7Znkc7_4Je55aLHdIu_3ylczqZE3htYBSZFZwjiDzFrbjll3__sgrWbg549LjFnzjmB7zWtm-Gs_O_rnM_tJtan2DBnE__j-wPRCU/s1600/09-06-2014+17-17-02.jpg" height="187" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Der Schemavergleich zeigt Unterschiede in den Strukturen zweier Datenbanken und generiert ein passendes ALTER Skript.</td></tr>
</tbody></table>
<div>
</div>
<div>
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPnNLf9DdjadF316cS7FF6RLvFvtQfuGz6shAJhyphenhyphencK7iqK-XJLxo_t3r9U2NDqwjZkJzUSdeYoUH1pKFxB72Rq_eBoVfXigfwYBhb-mG8Zn_zjj8IgXVt7W-5Pb6TemDwz6ZHX_EwGAWs/s1600/09-06-2014+14-17-33.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPnNLf9DdjadF316cS7FF6RLvFvtQfuGz6shAJhyphenhyphencK7iqK-XJLxo_t3r9U2NDqwjZkJzUSdeYoUH1pKFxB72Rq_eBoVfXigfwYBhb-mG8Zn_zjj8IgXVt7W-5Pb6TemDwz6ZHX_EwGAWs/s1600/09-06-2014+14-17-33.jpg" height="143" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Der Datenvergleich zeigt die unterschiedlichen Daten in zwei Tabellen und generiert ein Skript, um die Inhalte anzugleichen.</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitKsXmXOGL2o4z0EL4HnkGvmIJdLtZbxcEdTOeDhw1zB28jm8NZZh7li9lQ90Jp5GXzKNnj_ItHJi8X7zrY1iWyT23GlFr6G8fz8Vv3MkbF-6-gFm58WYeFJ4cNLydA8MgUiNYBHItoJg/s1600/09-06-2014+17-20-44a.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitKsXmXOGL2o4z0EL4HnkGvmIJdLtZbxcEdTOeDhw1zB28jm8NZZh7li9lQ90Jp5GXzKNnj_ItHJi8X7zrY1iWyT23GlFr6G8fz8Vv3MkbF-6-gFm58WYeFJ4cNLydA8MgUiNYBHItoJg/s1600/09-06-2014+17-20-44a.jpg" height="189" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Der linke Teil zeigt die grafische und die Skript-Darstellung einer Tabelle, während der rechte Teil die Projektstruktur anzeigt.</td></tr>
</tbody></table>
<div>
</div>
<h3>
Installation</h3>
Die SQL Server Data Tools können Sie <a href="http://msdn.microsoft.com/en-US/jj650015" target="_blank">hier</a> herunterladen. Es gibt einen Web-Installer sowie ein ISO-Image, das die Installation ohne Internetzugang ermöglicht. Wenn Sie bereits die Professional, Ultimate oder Premium Edition von Visual Studio 2012 installiert haben, dann ist SSDT bereits darin enthalten. Wenn Sie jedoch noch kein Visual Studio 2012 auf dem Computer installiert haben, dann erhalten Sie bei der Installation die <a href="http://msdn.microsoft.com/de-de/library/bb129445.aspx" target="_blank">Visual Studio 2012 Shell</a>, die keine Unterstützung für die Programmiersprachen wie C# oder Visual Basic bietet. <br />
Die Visual Studio Shell wird übrigens auch bereitgestellt, wenn Sie die <a href="http://volkerheck.blogspot.de/2014/06/data-tools-fur-business-intelligence.html" target="_blank">SQL Server Data Tools für BI (SSDT-BI)</a> installieren. Wenn Sie SSDT und SSDT-BI installieren, dann integrieren sie sich in dieselbe Visual Studio Shell. <br />
Fazit: Egal, ob Sie eine Vollversion von Visual Studio haben oder nicht, beide Projekttypen integrieren sich in dieselbe Entwicklungsumgebung. <br />
<br />
<h3>
Alle Links auf einen Blick</h3>
<br />
<a href="http://msdn.microsoft.com/en-US/jj650015" target="_blank">Download der SSDT</a><br />
<a href="http://msdn.microsoft.com/de-de/library/hh272686(v=vs.103).aspx" target="_blank">Dokumentation zu SSDT</a> <br />
<a href="http://msdn.microsoft.com/en-us/data/hh297027" target="_blank">Übersicht der SQL Server Data Tools</a>Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-14665495837583591222014-06-05T09:17:00.002+02:002014-06-06T16:46:20.126+02:00Data Tools für Business IntelligenceDie Installations-DVD von SQL Server 2012 enthält - wie die vorherigen Versionen auch - als Entwicklungsumgebung für die BI-Komponenten eine Version von Visual Studio. Diese trägt zwar aus Marketing-Gründen die Bezeichnung "SQL Server Data Tools", ist aber nichts anderes als Visual Studio 2010 mit den Projektvorlagen für Business Intelligence Projekte (Reporting Services, Integration Services, Analysis Services). <br />
<br />
<h3>
Zwei Versionen der SQL Server Data Tools: VS2010 und VS2012</h3>
Seit März 2013 ist die Situation etwas komplizierter geworden, da es zusätzlich möglich ist, Visual Studio 2012 als BI Entwicklungsumgebung einzusetzen. Der korrekte Name für diese Version ist <strong>"SQL Server Data Tools – Business Intelligence for Visual Studio 2012"</strong>. Diese neuere Version der Data Tools steht hier zum Herunterladen bereit:<br />
<a href="http://www.microsoft.com/en-us/download/details.aspx?id=36843" target="_blank">http://www.microsoft.com/en-us/download/details.aspx?id=36843</a><br />
<br />
Wenn zwei Versionen verfügbar sind, welche sollten Sie dann einsetzen? Glücklicherweise vertragen sich beide Versionen sehr gut, so dass ein Projektteam sogar beide gleichzeitig einsetzen kann:<br />
<ul>
<li>Beide Versionen lassen sich nebeneinander auf einem Rechner installieren</li>
<li>Projekte können abwechselnd mal mit der neueren und dann wieder mit der älteren Version bearbeitet werden - es findet keine Konvertierung der Dateien statt</li>
</ul>
Sie haben also die freie Wahl, mit welcher Version Sie arbeiten.<br />
<br />
<h3>
Und was ist mit Visual Studio 2013? </h3>
Die Produktzyklen bei Microsoft werden kürzer, so ist bereits Visual Studio 2013 verfügbar und auch SQL Server 2014 ist bereits seit April auf dem Markt. Die gute Nachricht ist: Da es an den BI Komponenten von SQL Server 2014 keine Veränderungen gegenüber SQL Server 2014 gegeben hat, können Sie problemlos mit den "alten" Data Tools für SQL Server 2012 auch für SQL Server 2014 entwickeln. <br />
Falls Sie die letzte verfügbare Entwicklungsumgebung einsetzen möchten, können Sie hier die <strong>"Microsoft SQL Server Data Tools - Business Intelligence for Visual Studio 2013 "</strong> herunterladen: <br />
<a href="http://www.microsoft.com/en-us/download/details.aspx?id=42313" target="_blank">http://www.microsoft.com/en-us/download/details.aspx?id=42313</a><br />
<br />
<h3>
Zusammenfassung</h3>
Diese Matrix stellt das vorher Beschriebene in kompakter Form dar:<br />
<br />
<table border="1" cellpadding="4" cellspacing="0">
<tbody>
<tr>
<td> </td>
<td><strong>Visual Studio 2010</strong></td>
<td><strong>Visual Studio 2012</strong></td>
<td><strong>Visual Studio 2013</strong></td>
</tr>
<tr>
<td><strong>SQL Server 2012</strong></td>
<td>auf Installations-DVD</td>
<td><a href="http://www.microsoft.com/en-us/download/details.aspx?id=36843" target="_blank">SSTD-BI für SQL Server 2012</a></td>
<td>--</td>
</tr>
<tr>
<td><strong>SQL Server 2014</strong></td>
<td>--</td>
<td><a href="http://www.microsoft.com/en-us/download/details.aspx?id=36843" target="_blank">SSTD-BI für SQL Server 2012</a></td>
<td><a href="http://www.microsoft.com/en-us/download/details.aspx?id=42313" target="_blank">SSTD-BI für SQL Server 2014</a></td>
</tr>
</tbody></table>
<br />
<h3>
Einfache Installation</h3>
Die Installation ist unkompliziert. Nach dem Download und Start der Installationsdatei sollten Sie die Standardeinstellung "Perform a new Installation..." belassen, wie das folgende Bild zeigt (die andere Option führt zu einem Abbruch der Installation).<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiyD-iF6k0OyGkfa4pgoTv-oV5g9NWKczomC0NUePuEVAQ_rEL8lheB7OOlenzS4kNCFlKXAnYg4x49UpMXxipSwYLXeEMhOLk9jk7aV5gm3zrzP9n_SOH3kMkvvN5IB4fgws5WTesoaI/s1600/05-06-2014+07-56-18.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiyD-iF6k0OyGkfa4pgoTv-oV5g9NWKczomC0NUePuEVAQ_rEL8lheB7OOlenzS4kNCFlKXAnYg4x49UpMXxipSwYLXeEMhOLk9jk7aV5gm3zrzP9n_SOH3kMkvvN5IB4fgws5WTesoaI/s1600/05-06-2014+07-56-18.jpg" height="81" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Diese Standardeinstellung sollten Sie nicht ändern</td></tr>
</tbody></table>
<br />
Danach stehen die Data Tools als Shared Feature für die Installation zur Verfügung.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhPeMj4jEfyPp5tMvwZgaqmuWQsp2Mdk7QyZrKiY8XoDUlsjNlEmv-dV8yTEohc0xU8eEvZrxqJ8bD8_PfPA_oSZUOTFO_DNg4N3yGVxeiQmIzBaAPDr6-FdIAWrts-NXHTbwGxFa_-D0/s1600/05-06-2014+07-53-52.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhPeMj4jEfyPp5tMvwZgaqmuWQsp2Mdk7QyZrKiY8XoDUlsjNlEmv-dV8yTEohc0xU8eEvZrxqJ8bD8_PfPA_oSZUOTFO_DNg4N3yGVxeiQmIzBaAPDr6-FdIAWrts-NXHTbwGxFa_-D0/s1600/05-06-2014+07-53-52.jpg" height="65" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Außer dem Setzen dieses Hakens gibt es keine weiteren Auswahlmöglichkeiten</td></tr>
</tbody></table>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<br />
Quelle:<br />
<a href="http://blogs.msdn.com/b/mattm/archive/2013/03/07/sql-server-data-tools-business-intelligence-for-visual-studio-2012-released-online.aspx" target="_blank">http://blogs.msdn.com/b/mattm/archive/2013/03/07/sql-server-data-tools-business-intelligence-for-visual-studio-2012-released-online.aspx </a>Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-52254139256524525762014-05-20T12:06:00.001+02:002014-05-20T12:08:41.528+02:00Freigegebene Datenquellen und Datasets richtig einsetzenReporting Services (SSRS) bieten ja die Möglichkeit, zwei unterschiedliche Entwicklungsumgebungen für Berichte zu verwenden:<br />
<ul>
<li><strong>Report Designer</strong> in Visual Studio (bzw. "Business Intelligence Studio" oder "Data Tools", wie es aus Marketinggründen heißt, wenn es mit SQL Server installiert wird)</li>
<li><strong>Report Builder</strong>, den berechtigte Anwender selbst von SharePoint oder vom Report Manager herunterladen und nutzen können</li>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0BFOV77M6WydMR_AC1XTrjtTovGalgL_3MK-5c3_L1JTVkHfvCsi8qJ-gonsyR7kklYbgmva3j7fogEp7EOdNFuZBXoBtsvIo6bKJ5nAZW5BsoIaa8Tj6vvy9sAfvRnCnlOVmiYMpEL4/s1600/20-05-2014+11-40-28.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0BFOV77M6WydMR_AC1XTrjtTovGalgL_3MK-5c3_L1JTVkHfvCsi8qJ-gonsyR7kklYbgmva3j7fogEp7EOdNFuZBXoBtsvIo6bKJ5nAZW5BsoIaa8Tj6vvy9sAfvRnCnlOVmiYMpEL4/s1600/20-05-2014+11-40-28.jpg" height="197" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Report Builder mit seiner an Office Anwendungen angelehnten Oberfläche für Fachanwender</td></tr>
</tbody></table>
<br />
Während Report Designer eher das Werkzeug für IT-Profis ist, soll der Office-ähnlich aufgemachte Report Builder Mitarbeitern in den Fachabteilungen die Möglichkeit geben, selbständig Berichte zu erstellen. Eine gute Ergänzung, die gleichermaßen der Forderung nach qualitätsgesicherten Standard-Berichten von der IT-Abteilung und dem Bedürfnis nach hoher Flexibilität für die Fachanwender gerecht wird. <br />
<br />
Nun haben IT-Verantwortliche naturgemäß Schwierigkeiten damit, allen Anwender direkten Zugriff auf die Unternehmensdatenbanken zu gewähren. Das ist ja auch nachvollziehbar, denn in diesem Fall könnten einzelne Berichtsautoren durch (ungewollt) massive Datenbankabfragen die Verfügbarkeit für alle Anwender gefährden. Hier kommen freigegebene Datenquellen (shared data sources) und freigegebene Datasets (shared datasets) ins Spiel. Datenquellen enthalten die Verbindungszeichenfolge zu einer Datenbank (Server, Datenbank, Benutzername und Passwort), während Datasets die SQL Abfrage enthalten. Das ermöglicht eine klare Rollenverteilung:<br />
<ul>
<li>Alle Anwender, die direkten Zugriff auf eine Datenbank haben, dürfen freigegebene Datenquellen und freigegebene Datasets hierfür erstellen und modifizieren. </li>
<li>Anwender, die keinen Zugriff auf eine Datenbank haben, können dennoch die freigegebenen Datenquellen und die freigegebenen Datasets in eigenen Berichten nutzen.</li>
<li>Wenn Anwender ohne Zugriff auf eine Datenbank versuchen, eine Datenquelle oder ein Dataset zu verändern, erhalten sie die Aufforderung, einen Datenbankbenutzer samt Passwort anzugeben.</li>
</ul>
Auf diese Weise ist sichergestellt, dass nur eingewiesene Programmierer die SQL Abfragen erstellen. Die IT Verantwortlichen behalten so die Kontrolle über die Art des Zugriffs auf die Datenbank. Gleichzeitig können Fachanwender auf Basis dieser Datasets ihre eigenen Berichte erstellen. <br />
<br />
Wäre noch zu klären wie es sein kann, dass Fachanwender ohne direkten Datenbankzugriff dennoch über die vorhandenen Datenquellen und Datasets die Berichtsdaten abrufen können. Dazu muss ein Mitglied der Rolle "Content Manager" auf dem Report Manager den Eigenschaften-Dialog der Datenquelle öffnen.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqFFhsJ6yxEDFO9PM1MhiP7HlA-MFSc72elFu-Ercs5fFlNpsrjU2LmjZ6biHvlpo78EaU9qfa8BAlSknaCVwOxfbT0AI-XrW4Na5Lp2wxsWKf2YnJs_q529mFSDop38x92aML2F111m4/s1600/20-05-2014+11-51-00.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqFFhsJ6yxEDFO9PM1MhiP7HlA-MFSc72elFu-Ercs5fFlNpsrjU2LmjZ6biHvlpo78EaU9qfa8BAlSknaCVwOxfbT0AI-XrW4Na5Lp2wxsWKf2YnJs_q529mFSDop38x92aML2F111m4/s1600/20-05-2014+11-51-00.jpg" height="320" width="315" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Hier erhält die Datenquelle Zugriff auf die Datenbank</td></tr>
</tbody></table>
<br />
Der Benutzername und das Kennwort des hier angegebenen Benutzerkontos werden verschlüsselt auf dem Berichtsserver gespeichert. Bitte achten Sie darauf, hier einen technischen Benutzer und nicht die Anmeldeinformationen eines echten Mitarbeiters anzugeben, denn wenn dieser sein Kennwort ändert, dann funktioniert die Datenquelle nicht mehr. <br />
Diese Funktionsweise von freigegebenen Datenquellen und Datasets ist unabhängig davon, ob Reporting Services im nativen Modus ("stand-alone") oder im SharePoint integrierten Modus laufen. Einziger Unterschied ist, dass im ersten Fall die Webanwendung "Berichts-Manager" den Speicherort für Quellen, Datasets und Berichte bereitstellt und im zweiten Fall SharePoint Bibliotheken diese Aufgabe übernehmen.
Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-53162996493298442052014-04-22T13:40:00.000+02:002014-04-22T13:40:12.078+02:00Kostenloses E-Book zu SQL Server 2014So wie schon für die letzten beiden Versionen von SQL Server haben nun die beiden Autorinnen Ross Mistry und Stacia Misner ein E-Book zum SQL Server 2014 geschrieben. Es behandelt die Neuerungen gegenüber der Version 2012 und ist dank des anschaulichen Schreibstils, klarer Abbildungen und prägnanter Codebeispiele wieder sehr nützlich für alle, die sich mit den neuen Möglichkeiten vertraut machen möchten. <br />
<br />
Dieses E-Book ist kostenfrei bei Microsofts Virtual Academy zum Download erhältlich:<br />
<a href="http://www.microsoftvirtualacademy.com/ebooks" target="_blank">http://www.microsoftvirtualacademy.com/ebooks</a><br />
<br />
Meine Empfehlung an alle, die bereits mit den früheren SQL Server Versionen vertraut sind und die SQL Server 2014 verstehen und einsetzen möchten: <strong>Unbedingt lesen!</strong> Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-84939830603074630172014-02-28T18:07:00.000+01:002014-02-28T18:09:52.778+01:00Beziehungen zwischen Tabellen dokumentieren"Herzlichen Glückwunsch - Sie haben eine Datenbank gewonnen!" Mit diesen Worten bekam ich vor einigen Jahren anlässlich der Verabschiedung eines Kollegen die Verantwortung für den Betrieb und die Weiterentwicklung einer Datenbank überreicht. Wie Sie sich vorstellen können, hatte ich daraufhin erst einmal einiges an Arbeit, um mir einen Überblick über Art und Umfang des "Geschenks" zu verschaffen. <br />
<br />
<h4>
Beziehungen automatisch dokumentieren</h4>
<br />
Insbesondere um die existierenden Abfragen gegen die nicht so gut dokumentierte Datenbank zu verstehen und weiterentwickeln zu können, brauchte ich schnell eine Zusammenstellung der Beziehungen zwischen den Tabellen: <br />
<ul>
<li>von Tabelle</li>
<li>nach Tabelle</li>
<li>Namen der Primär- und Fremdschlüsselspalten</li>
</ul>
Die folgende Abfrage auf Basis der Sichten in <a href="http://technet.microsoft.com/de-de/library/ms186778.aspx" target="_blank">INFORMATION_SCHEMA</a> hat mir dabei sehr geholfen. <br />
<br />
<br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">SELECT</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> FKT</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">TABLE_NAME </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">AS</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> FK_Table </span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">-- Fremdschlüssel-Tabelle</span></span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">CU</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">COLUMN_NAME </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">AS</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> FK_Column </span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">-- Fremdschlüssel-Spalte</span></span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,<span style="font-family: Consolas; font-size: x-small;"><span style="color: black; font-family: Consolas; font-size: x-small;">PKT</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"></span></span></span></span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">TABLE_NAME </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">AS</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> PK_Table </span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">-- Primärschlüssel-Tabelle</span></span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">PKT1</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">COLUMN_NAME </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">AS</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> PK_Column </span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">-- Primärschlüssel-Spalte</span></span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">,</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">C</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">CONSTRAINT_NAME </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">AS</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> Constraint_Name </span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">-- Name des Constraints</span></span></span><br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;">FROM</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">INFORMATION_SCHEMA</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">REFERENTIAL_CONSTRAINTS</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> C</span></span><br />
<span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">INNER</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">JOIN</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">INFORMATION_SCHEMA</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">TABLE_CONSTRAINTS</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> FKT</span></span><br />
<span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: black;"> </span>ON</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> C</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">CONSTRAINT_NAME </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">=</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> FKT</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">CONSTRAINT_NAME</span></span><br />
<span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">INNER</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">JOIN</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">INFORMATION_SCHEMA</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">TABLE_CONSTRAINTS</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> PKT</span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"> ON</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> C</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">UNIQUE_CONSTRAINT_NAME </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">=</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> PKT</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">CONSTRAINT_NAME</span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">INNER</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">JOIN</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">INFORMATION_SCHEMA</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">KEY_COLUMN_USAGE</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> CU</span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"> ON</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> C</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">CONSTRAINT_NAME </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">=</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> CU</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">CONSTRAINT_NAME</span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">INNER</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">JOIN</span></span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"> </span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">(</span></span></span><br />
<span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">
</span></span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"> SELECT</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> TCI</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">TABLE_NAME</span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"> ,<span style="color: black;">CUI</span></span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">COLUMN_NAME</span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"> ,<span style="color: black;">CUI</span></span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">ORDINAL_POSITION</span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"> FROM</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">INFORMATION_SCHEMA</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">TABLE_CONSTRAINTS</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> TCI<span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"></span></span></span></span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"> INNER</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">JOIN</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">INFORMATION_SCHEMA</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;"><span style="color: green; font-family: Consolas; font-size: x-small;">KEY_COLUMN_USAGE</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> CUI</span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"> ON</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> TCI<span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"></span></span></span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">CONSTRAINT_NAME </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">=</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> CUI</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">CONSTRAINT_NAME</span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"> WHERE</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> TCI<span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"></span></span></span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">CONSTRAINT_TYPE </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">=</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> </span></span><span style="color: red; font-family: Consolas; font-size: x-small;"><span style="color: red; font-family: Consolas; font-size: x-small;"><span style="color: red; font-family: Consolas; font-size: x-small;">'PRIMARY KEY'</span></span></span><br />
<span style="color: red; font-family: Consolas; font-size: x-small;"><span style="color: red; font-family: Consolas; font-size: x-small;"><span style="color: red; font-family: Consolas; font-size: x-small;">
</span></span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"> )</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> PKT1</span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"><span style="color: blue; font-family: Consolas; font-size: x-small;"> ON</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> PKT1</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">TABLE_NAME </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">=</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> PKT</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">TABLE_NAME</span></span><br />
<span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">
</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"> AND</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> PKT1</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">ORDINAL_POSITION </span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">=</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;"> CU</span></span><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;"><span style="color: grey; font-family: Consolas; font-size: x-small;">.</span></span></span><span style="font-family: Consolas; font-size: x-small;"><span style="font-family: Consolas; font-size: x-small;">ORDINAL_POSITION</span></span><br />
<br />
Aus SQL-Sicht ist daran interessant, dass die Tabellen TABLE_CONSTRAINTS und KEY_COLUMN_USAGE mehrfach vorkommen, aber in unterschiedlichen Rollen. Durch Vergabe unterschiedlicher Alias-Namen für dieselbe Tabelle (FKT, PKT, TCI bzw. CU, CUI) wird das unterschieden. So, als handle es sich jedes Mal um eine andere Tabelle. Eine Technik, die Sie immer dann anwenden können, wenn dieselbe Tabelle in einer Abfrage unterschiedliche Rollen einnimmt. Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-10657061644595678302014-02-19T09:28:00.000+01:002014-02-28T17:19:36.537+01:00Entwurfsmuster für DAX FormelnVielen DAX Formeln, die wir in Analysen und Berichten benötigen, liegen immer wieder typische Aufgabenstellungen zugrunde. Zum Beispiel laufende Summen, Lagerbestände, Buchungen und Gegenbuchungen. <br />
Um nicht jedes Mal das Rad neu zu erfinden, ist die Verwendung von Entwurfsmustern ("pattern") eine gute Sache. Sie helfen uns in der jeweiligen Situation schnell einen bewährten Lösungsweg zu finden. Für die noch junge Sprache DAX gab es bisher keine Sammlung solcher Entwurfsmuster. Da ist es ausgesprochen hilfreich, dass die erfahrenen Vorreiter Alberto Ferrari und Marco Russo jetzt diesen Mangel abstellen. Sie stellen unter <a href="http://www.daxpatterns.com/">http://www.daxpatterns.com/</a> genau solche Muster zur Verfügung. <br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://www.daxpatterns.com/" imageanchor="1" style="margin-left: auto; margin-right: auto;" target="_blank"><img alt="http://www.daxpatterns.com/" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUr0_kwErQyguRnoForS8HzRNRi6n69VjoWWEq6wt2Fig4Kb45GnmxVjqzdTEepNJz4N0_C0pHiOY8AfyxzDhtPvHICrHuzDDmrgH0HnOgGzJSQQdJBwA-xI_jmF5Kuo3MV67qg32zEdw/s1600/19-02-2014+09-21-34.png" height="235" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Die Website ist ein Vorbild an Übersichtlichkeit</td></tr>
</tbody></table>
<br />
<br />
Die Website ist ausgesprochen übersichtlich, die Texte verständlich geschrieben und mit praxisgerechten Beispielen erklärt. <br />
<br />
<strong>Fazit</strong>: Leider nur auf Englisch verfügbar, aber eine unschätzbare Hilfe! Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-11785056393568074332014-01-24T14:29:00.000+01:002014-01-24T18:29:23.972+01:00Speicherprobleme in PowerPivot verstehen und beheben<blockquote class="tr_bq">
PowerPivot erlaubt das blitzschnelle Analysieren von Tabellen mit vielen Millionen Zeilen.</blockquote>
Die Aussage trifft auf jeden Fall zu, wenn Sie die 64-Bit Version von Excel einsetzen und der Rechner über 8GB oder mehr Arbeitsspeicher verfügt. Allerdings sind viele Anwender auf die 32-Bit Version von Excel beschränkt. Ich arbeite gerade in so einer Umgebung, wo auch noch die 32-Bit Version von Windows 7 mit 4GB RAM im Einsatz ist. Unter diesen Umständen kann PowerPivot nach meinen Beobachtungen nur maximal ca. 700MB Arbeitsspeicher verwenden – unabhängig davon, mit wie viel RAM der Rechner ausgestattet ist. Daher wird der Import immer wieder mal mit einer Fehlermeldung wie dieser abgebrochen: <br />
<ul>
<li>"Memory error: Allocation failure : Not enough storage is available to process this command. . If using a 32-bit version of the product, consider upgrading to the 64-bit version or increasing the amount of memory available on the machine." <br />(Excel 2010, englisch)</li>
<li>"Die Verbindung konnte nicht aktualisiert werden. Rufen Sie die vorhandenen Verbindungen auf, und überprüfen Sie, ob eine Verbindung mit der Datei bzw. dem Server besteht." <br />(Excel 2013, deutsch)</li>
</ul>
<div>
</div>
<div>
Der größte Bedarf an Speicherplatz tritt während des Aktualisierens einer bestehenden Tabelle auf. Dann benötigt Excel ausreichend Arbeitsspeicher </div>
<ul>
<li>für die bestehenden Daten </li>
<li>und für alle neu zu importierenden Daten </li>
<li>und für das Erstellen der neuen Indexe </li>
</ul>
<div>
Dadurch steigt der Speicherbedarf während des Imports etwa auf das Dreifache an. In 32-Bit Umgebungen ergeben sich daraus schon bei relativ kleinen Datenmengen (je nach Art der Daten ca. 1 Million Zeilen) Probleme. </div>
<div>
</div>
<h4>
Gewusst wie: den Speicherbedarf verringern</h4>
<br />
Die beiden nachfolgenden Regeln helfen, den Speicherbedarf von PowerPoint Modellen zu reduzieren. Das ist nicht nur in 32-Bit Umgebungen wichtig; auch wenn in 64-Bit Umgebungen sehr viel mehr Speicher zur Verfügung steht, ist dieser nicht unbegrenzt.<br />
<h3>
<br />Regel 1: Nur die erforderlichen Spalten aus den Quelltabellen laden</h3>
<br />
Spalten, deren Inhalt in keiner Auswertung verwendet wird, sollten Sie aus dem PowerPivot Modell löschen. Falls Sie zu einem späteren Zeitpunkt eine gelöschte Spalte wieder hinzufügen möchten, ist das ohne Probleme möglich. Auch aus Gründen der Übersichtlichkeit empfiehlt es sich sowieso, nur mit den nötigsten Spalten zu beginnen und erst bei Bedarf weitere hinzuzufügen. <br />
<h3>
<br />Regel 2: Keine bzw. wenige Nachkommastellen laden</h3>
<br />
Für den Speicherbedarf ist die Anzahl unterschiedlicher Werte in einer Spalte entscheidend. PowerPivot erstellt automatisch einen Index auf jede Spalte, der einen Eintrag für jeden unterschiedlichen Wert enthält. Zwei Zeilen, die in einer Spalte die Werte 12,300 und 12,301 enthalten, brauchen also mehr Speicher als zwei Zeilen, die in dieser Spalte jeweils die Zahl 12,30 enthalten. Da für Auswertungen über große Datenmengen oft nur wenige oder gar keine Nachkommastellen benötigt werden, sollten Sie Fließkommazahlen bereits beim Import (bei einem SQL Befehl z.B. mit der Funktion ROUND) runden. <br />
<h4>
<br />Ein Experiment</h4>
<br />
Um den Speicherbedarf unterschiedlicher Daten besser zu verstehen, habe ich einmal eine Tabelle mit 500.000 Datensätzen erzeugt, die folgende Spalten enthält (SQL Code am Ende des Artikels):<br />
<br />
<table>
<tbody>
<tr><td>i</td><td>Aufsteigende Ganzzahlen</td></tr>
<tr><td>KonstanterInt</td><td>immer 0</td></tr>
<tr><td>Werte0bis9</td><td>Nur Werte zwischen 0 und 9</td></tr>
<tr><td>KonstanterString</td><td>immer 'abc'</td></tr>
<tr><td>ZufallswerteInt</td><td>zufällig erzeugte Ganzzahlen</td></tr>
<tr><td>ZufallswerteFloat</td><td>zufällig erzeugte Fließkommazahlen</td></tr>
</tbody></table>
<br />
Um die Auswirkungen der unterschiedlichen Zahlenverteilung zu sehen, habe ich nach dem Import mit folgender DAX Abfrage den Speicherbedarf der einzelnen Spalten ermittelt:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">select Attribute_Name, Dictionary_Size </span><br />
<span style="font-family: "Courier New", Courier, monospace;">from $system.DISCOVER_STORAGE_TABLE_COLUMNS </span><br />
<span style="font-family: "Courier New", Courier, monospace;">where Dictionary_Size > 0</span><br />
<br />
Eine Anleitung, wo Sie diese Abfrage eingeben können, finden Sie <a href="http://volkerheck.blogspot.de/2013/07/excel-arbeitsblatter-mit-dax-abfragen.html" target="_blank">hier</a>. <br />
<br />
Und das ist das interessante Ergebnis dieses Experiments. Die Tabelle zeigt für jede Spalte den Speicherbedarf im PowerPivot Modell:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0m2H8lHoehZ9R0l_7e5npNFH2yjl3anMY099mfushz-UboyZ3cQ8nNxHf8PA_2m612a1lAPbS9BF87IB-C5k0LfXGAfaxZbVPRnA2oc0PgBueiYhlGHYnvNrF5qW-RS6ofmLBjiBZVjE/s1600/24-01-2014+12-33-50.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0m2H8lHoehZ9R0l_7e5npNFH2yjl3anMY099mfushz-UboyZ3cQ8nNxHf8PA_2m612a1lAPbS9BF87IB-C5k0LfXGAfaxZbVPRnA2oc0PgBueiYhlGHYnvNrF5qW-RS6ofmLBjiBZVjE/s1600/24-01-2014+12-33-50.jpg" /></a></div>
<br />
<div>
Der Speicherbedarf der Spalten ist demnach sehr unterschiedlich:</div>
<ul>
<li>Die Spalten "i" und "RowNumber" (eine interne Spalte) belegen mit 64 Bytes fast gar keinen Speicher – wie auch immer PowerPivot das bewerkstelligt. </li>
<li>Wie zu erwarten, belegt die Spalte "KonstanterInt" nur sehr wenig Speicherplatz.</li>
<li>Direkt darauf folgt die Spalte "Werte0bis9", die nur 10 unterschiedliche Werte enthält und deren Inhalt daher sehr stark komprimiert werden kann. </li>
<li>Die Spalte "KonstanterString" belegt mit etwa 1 MB überraschend viel Platz. Da alle Spalten denselben Wert enthalten, hätte ich mit weniger gerechnet. Anscheinend benötigt PowerPivot für die Verwaltung von Zeichenketten viel mehr Platz als für die Verwaltung von Integer-Zahlen. Dafür verändert sich jedoch der Platzbedarf auch nicht, wenn die Zeichenkette erheblich länger wird. </li>
<li>Erheblich mehr Speicher benötigt die Spalte mit den vielen unterschiedlichen Integer-Werten "ZufallsWerteInt", nämlich etwa 10.000-mal so viel Platz wie die Spalte "Werte0bis9", die nur 10 unterschiedliche Werte enthält.</li>
<li>Und die Spalte "ZufallswerteFloat" belegt aufgrund der Nachkommastellen noch einmal doppelt so viel Platz wie die zufälligen Integer-Werte. </li>
</ul>
<div>
Kurz gesagt, hat die Anzahl unterschiedlicher Werte in einer Spalte einen erheblich größeren Einfluss auf den Speicherbedarf als der Datentyp. </div>
<div>
</div>
<h4>
Der SQL Code zum Erzeugen der Tabelle</h4>
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US;">CREATE</span><span lang="EN-US" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US;">
<span style="color: blue;">TABLE</span> <span style="color: teal;">TestData</span><span style="color: blue;"> </span><span style="color: grey;">(</span></span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span lang="EN-US" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US;"><span style="mso-tab-count: 1;"> </span><span style="color: teal;">i</span> <span style="color: blue;">INT</span> <span style="color: grey;">NOT</span> <span style="color: grey;">NULL</span></span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span lang="EN-US" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US;"><span style="mso-tab-count: 1;"> </span></span><span style="color: grey; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">,</span><span style="color: teal; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">ZufallsWerteInt</span><span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"> <span style="color: blue;">INT</span></span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"><span style="mso-tab-count: 1;"> </span><span style="color: grey;">,</span><span style="color: teal;">ZufallswerteFloat</span>
<span style="color: blue;">FLOAT</span></span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"><span style="mso-tab-count: 1;"> </span><span style="color: grey;">,</span><span style="color: teal;">KonstanterInt</span>
<span style="color: blue;">INT</span><span style="mso-tab-count: 1;"> </span></span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"><span style="mso-tab-count: 1;"> </span><span style="color: grey;">,</span><span style="color: teal;">KonstanterString</span>
<span style="color: blue;">VARCHAR</span><span style="color: grey;">(</span>1000<span style="color: grey;">)</span></span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"><span style="mso-tab-count: 1;"> </span><span style="color: grey;">,</span><span style="color: teal;">Werte0bis9</span>
<span style="color: blue;">INT</span><o:p></o:p></span></div>
<span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"><span style="mso-tab-count: 1;"> </span><span style="color: grey;">)</span><o:p></o:p></span><br />
<span style="color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">GO</span><span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"><o:p></o:p></span><br />
<br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span style="color: green; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">-- Füge 1 Zeile
ein</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span style="color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">INSERT</span><span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"> <span style="color: teal;">TestData</span><span style="color: blue;"> </span><span style="color: grey;">(</span><span style="color: teal;">i</span><span style="color: grey;">,</span> <span style="color: teal;">KonstanterInt</span><span style="color: grey;">,</span> <span style="color: teal;">ZufallsWerteInt</span><span style="color: grey;">,</span> <span style="color: teal;">ZufallswerteFloat</span><span style="color: grey;">,</span> <span style="color: teal;">KonstanterString</span><span style="color: grey;">,</span> <span style="color: teal;">Werte0bis9</span><span style="color: grey;">)</span><o:p></o:p></span></div>
<span style="color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">VALUES </span><span style="color: grey; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">(</span><span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">1<span style="color: grey;">,</span> 0<span style="color: grey;">,</span> 0<span style="color: grey;">,</span> 0.0<span style="color: grey;">,</span> <span style="color: red;">'abc'</span><span style="color: grey;">,</span> 0<span style="color: grey;">)</span><o:p></o:p></span><br />
<span style="color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">GO</span><span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"><o:p></o:p></span><br />
<br />
<span style="color: green; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">-- Füge 2^19
Zeilen ein</span><span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"><o:p></o:p></span><br />
<span style="color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">INSERT</span><span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"> <span style="color: teal;">TestData</span><span style="color: blue;"> </span><span style="color: grey;">(</span><span style="color: teal;">i</span><span style="color: grey;">,</span> <span style="color: teal;">KonstanterInt</span><span style="color: grey;">,</span> <span style="color: teal;">ZufallsWerteInt</span><span style="color: grey;">,</span> <span style="color: teal;">ZufallswerteFloat</span><span style="color: grey;">,</span> <span style="color: teal;">KonstanterString</span><span style="color: grey;">,</span> <span style="color: teal;">Werte0bis9</span><span style="color: grey;">)</span></span><br />
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span lang="EN-US" style="color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US;">SELECT
</span><span lang="EN-US" style="color: grey; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US;">(</span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span lang="EN-US" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US;"><span style="mso-tab-count: 2;"> </span><span style="color: blue;">SELECT</span>
<span style="color: magenta;">max</span><span style="color: grey;">(</span><span style="color: teal;">i</span><span style="color: grey;">)</span></span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span lang="EN-US" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US;"><span style="mso-tab-count: 2;"> </span><span style="color: blue;">FROM</span>
<span style="color: teal;">TestData</span></span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span lang="EN-US" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US;"><span style="mso-tab-count: 2;"> </span><span style="color: grey;">)</span> <span style="color: grey;">+</span> <span style="color: magenta;">row_number</span><span style="color: grey;">()</span> <span style="color: blue;">OVER </span><span style="color: grey;">(</span></span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span lang="EN-US" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US;"><span style="mso-tab-count: 2;"> </span><span style="color: blue;">ORDER</span>
<span style="color: blue;">BY</span> <span style="color: magenta;">current_timestamp</span></span></div>
<div class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;">
<span lang="EN-US" style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: EN-US;"><span style="mso-tab-count: 2;"> </span><span style="color: grey;">),</span>
0<span style="color: grey;">,</span> <span style="color: magenta;">checksum</span><span style="color: grey;">(</span><span style="color: magenta;">newid</span><span style="color: grey;">()),</span> <span style="color: magenta;">checksum</span><span style="color: grey;">(</span><span style="color: magenta;">newid</span><span style="color: grey;">())</span> <span style="color: grey;">/</span> 3.0<span style="color: grey;">,</span> <span style="color: red;">'abc'</span><span style="color: grey;">,</span> <span style="color: magenta;">ABS</span><span style="color: grey;">(</span><span style="color: magenta;">checksum</span><span style="color: grey;">(</span><span style="color: magenta;">newid</span><span style="color: grey;">()))</span> <span style="color: grey;">%</span> 10<o:p></o:p></span></div>
<span style="color: blue; font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;">FROM</span><span style="font-family: Consolas; font-size: 9.5pt; mso-ansi-language: DE;"> <span style="color: teal;">TestData</span> <o:p></o:p></span><br />
<span style="color: blue; font-family: Consolas; font-size: 9.5pt; line-height: 115%; mso-ansi-language: DE; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;">GO</span><span style="font-family: Consolas; font-size: 9.5pt; line-height: 115%; mso-ansi-language: DE; mso-bidi-language: AR-SA; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin;"> 19</span><br />
<h4>
<br />Weitere Links zu diesem Thema</h4>
<a href="http://www.sqlbi.com/articles/checklist-for-memory-optimizations-in-powerpivot-and-tabular-models" target="_blank">http://www.sqlbi.com/articles/checklist-for-memory-optimizations-in-powerpivot-and-tabular-models </a><br />
<br />
<a href="http://sqlblog.com/blogs/marco_russo/archive/2010/01/26/memory-considerations-about-powerpivot-for-excel.aspx" target="_blank">http://sqlblog.com/blogs/marco_russo/archive/2010/01/26/memory-considerations-about-powerpivot-for-excel.aspx </a><br />
<br />
<a href="http://denglishbi.wordpress.com/2010/06/21/powerpivot-memory-error-%E2%80%93-not-enough-storage/" target="_blank">http://denglishbi.wordpress.com/2010/06/21/powerpivot-memory-error-%E2%80%93-not-enough-storage/ </a><br />
<br />
<br />
<br />Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-58209315037442905432013-12-20T16:18:00.000+01:002013-12-20T16:20:03.637+01:00PowerPivot Formeln blitzschnell dokumentierenFür einen komplexen Bericht habe ich etliche Measures erstellt. Bei der Suche nach einer einfachen Möglichkeit, diese "auf Knopfdruck" zu dokumentieren, erwiesen sich die Systemsichten von PowerPivot als ein guter Weg.<br />
<br />
<h3>
Die Lösung im Detail</h3>
<br />
Grundlage ist ein Excel Arbeitsblatt, das als Datenquelle eine DAX Abfrage an PowerPivot schickt. Wie das geht, habe ich in <a href="http://volkerheck.blogspot.de/2013/07/excel-arbeitsblatter-mit-dax-abfragen.html" target="_blank">diesem Beitrag </a>beschrieben. <br />
Die DAX Abfrage zum Auflisten aller Measures sieht so aus:<br />
<br />
<span style="font-family: "Courier New",Courier,monospace;">SELECT * FROM $SYSTEM.MDSCHEMA_MEASURES</span><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzJLvnW_c50xpoiiu8u5LJY7cIlzI2d1Bw1ZrAwc9D45V1gZEs-xuc3-MXohuGicl6GE4bHaIKqFEU3PEiF2hj3wjRi0NDeEqr0Lpilckll9zS6fjVMs7zQC0Nwiqjk6_8ecE5SdnTsKg/s1600/Capture.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="209" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzJLvnW_c50xpoiiu8u5LJY7cIlzI2d1Bw1ZrAwc9D45V1gZEs-xuc3-MXohuGicl6GE4bHaIKqFEU3PEiF2hj3wjRi0NDeEqr0Lpilckll9zS6fjVMs7zQC0Nwiqjk6_8ecE5SdnTsKg/s320/Capture.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Die DAX Abfrage zum Ermitteln der erstellten Measures in PowerPivot</td></tr>
</tbody></table>
<br />
Das Ergebnis ist eine Liste aller Measures mit ihrer DAX Formel. In dieser Form lässt sich auch eine große Anzahl von Formeln übersichtlich darstellen und überprüfen.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKJSGHsNRFbL5RIN36QjRjhr09h6nw8ZiYeZI5tBDZcB3CFM-EOhv-NRq5gl-hUj4sajWLUzhx7rPdQo3TK8kxt9gA8zKNhix5OSLXlc-RhDqYnBuBYJidw9O5k-ua1xsqBnNzNHmKjCo/s1600/Capture.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="46" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKJSGHsNRFbL5RIN36QjRjhr09h6nw8ZiYeZI5tBDZcB3CFM-EOhv-NRq5gl-hUj4sajWLUzhx7rPdQo3TK8kxt9gA8zKNhix5OSLXlc-RhDqYnBuBYJidw9O5k-ua1xsqBnNzNHmKjCo/s320/Capture.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Ausschnitt aus den dokumentierten Formeln</td></tr>
</tbody></table>
<br />
<br />
<h3>
Hintergrundinformationen</h3>
<br />
Mit Hilfe der $SYSTEM-Views von PowerPivot lassen sich noch viele weitere interessante interne Informationen ermitteln. Die folgende Abfrage etwa listet alle Tabellen (benutzerdefinierte Tabellen und Systemtabellen) auf:<br />
<span style="font-family: "Courier New",Courier,monospace;"><br /></span>
<span style="font-family: "Courier New",Courier,monospace;">SELECT * FROM $SYSTEM.DBSCHEMA_TABLES</span><br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4J7rQdoixXzT00GIB87koAi7WnN5TuwlbVAaMtFXMdzh49-T6uuiNGj45f-Y6Ky_Lc4jmsD1KxFDyC1ievE8l3cSOAX0e2iiVHCZ0KWFx9eA_R_b_ahRFhCac9Ey2BwQo-R-I3HhSYCY/s1600/Capture.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4J7rQdoixXzT00GIB87koAi7WnN5TuwlbVAaMtFXMdzh49-T6uuiNGj45f-Y6Ky_Lc4jmsD1KxFDyC1ievE8l3cSOAX0e2iiVHCZ0KWFx9eA_R_b_ahRFhCac9Ey2BwQo-R-I3HhSYCY/s320/Capture.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Liste einiger interessanter Systemtabellen</td></tr>
</tbody></table>
Durch entsprechende Abfragen auf diese Tabellen lasen sich viele Meta-Informationen ermitteln und stets aktuell in Excel Arbeitsblättern dokumentieren.<br />
<br />
<br />
<br />Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-79945617554068534122013-11-30T21:59:00.000+01:002013-11-30T22:26:42.133+01:00Videos: PowerPivot und Power View einsetzenAuf Basis eines kleinen Anwendungsbeispiels habe ich zwei Videos erstellt, die den Einsatz von PowerPivot und Power View in Excel 2013 veranschaulichen. Ich hatte eine Excel Liste mit Personen, die eine bestimmte Prüfung abgelegt haben. Dabei handelt es sich um die öffentlich zugängliche Datei der CBAPs, welche die IIBA <a href="http://www.iiba.org/Certification-Recognition/Certification-Registry/CBAP-Registry.aspx" target="_blank">hier</a> veröffentlicht. Mit diesen Daten wollte ich den jährlichen Zuwachs der zertifizierten Personen und ihre Verteilung auf der Welt darstellen. Herausgekommen ist dabei diese Grafik:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsBoQz3p4_4sozze5LsUqGDV5yRdJHMA_xPWaqeND6ETst00I_8Ib2-NphJOpStObnQCWUl1fmhGS2fz76uSaljFsH_PTzlPV9azBEvRv76X2cT_WVtUP4k_gptdaA3REI-PO1aYTeepM/s1600/CBAP+20131125.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsBoQz3p4_4sozze5LsUqGDV5yRdJHMA_xPWaqeND6ETst00I_8Ib2-NphJOpStObnQCWUl1fmhGS2fz76uSaljFsH_PTzlPV9azBEvRv76X2cT_WVtUP4k_gptdaA3REI-PO1aYTeepM/s320/CBAP+20131125.jpg" width="320" /></a></div>
<br />
Weil ich für die Erstellung dieser Grafik nur wenige Minuten benötigt habe, hielt ich dies für ein schönes Beispiel des Einsatzes von PowerPivot und Power View.<br />
<br />
Das <a href="http://sdrv.ms/1j5513U" target="_blank">erste Video</a> zeigt folgende Schritte:<br />
<ul>
<li>Erstellen eines einfachen PowerPivot Modells</li>
<li>Auswerten der Daten in einer Pivot Tabelle</li>
<li>Auswerten der Daten in Power View</li>
</ul>
Das <a href="http://sdrv.ms/1j559Av" target="_blank">zweite Video</a> zeigt:<br />
<ul>
<li>Ausblenden nicht benötigter Spalten</li>
<li>Hinzufügen eines weiteren berechneten Feldes</li>
<li>Hinzufügen einer zweiten Tabelle, um die Verteilung nach Regionen darstellen zu können</li>
</ul>
Viel Freude beim Ansehen!Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-4308354455889500602013-10-20T17:20:00.003+02:002013-10-20T17:20:40.437+02:00Kommentare in PowerPivot Beim Arbeiten mit PowerPivot kommen Sie schnell an den Punkt, wo Sie DAX Ausdrücke schreiben.
Entweder um einer Tabelle eine berechnete Spalte hinzuzufügen oder um ein
Measure (in Excel 2013 ein „berechnetes Feld“) zu erstellen. Die ersten
Ausdrücke sind einfach und schnell geschrieben. In meinem Fall wurden sie
jedoch bald komplexer (Ja, es macht viel Freude, mit immer neuen Measures den
Fachanwendern maßgeschneiderte Pivot-Tabellen zu liefern!) und ich suchte nach
einer vermeintlich selbstverständlichen Möglichkeit: Kommentare sollten die verschachtelten
Ausdrücke besser lesbar machen.
<br />
<br />
<h4>
Das Problem: PowerPivot
erlaubt keine Kommentare in DAX Ausdrücken
</h4>
<br />
Das ist schade und wird
hoffentlich in künftigen Versionen möglich sein. Beim Suchen nach Alternativen bin ich auf die Möglichkeit gestoßen, Kommentare zu Spalten und Measures hinzuzufügen. Etwas versteckt finden Sie diese
Möglichkeit, wenn Sie im PowerPivot Fenster mit der rechten Maustaste auf eine
Tabellenspalte klicken und die Funktion „Beschreibung“ auswählen.
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9K-X87_evl86KutCyguuOxotKQGAcgPN-jajsz6QRu59AxAsMf2DZCP2xxsP7nnG5Wl8XJTHxkCrH8hEdPh9duqQjVrAQd-IF4w5OW-A3RqBNSY2TclxUtx5L2hudn1-SPk85mnIjvTw/s1600/20-10-2013+08-00-35.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9K-X87_evl86KutCyguuOxotKQGAcgPN-jajsz6QRu59AxAsMf2DZCP2xxsP7nnG5Wl8XJTHxkCrH8hEdPh9duqQjVrAQd-IF4w5OW-A3RqBNSY2TclxUtx5L2hudn1-SPk85mnIjvTw/s1600/20-10-2013+08-00-35.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Hinzufügen einer Beschreibung zu einer berechneten Spalte</td></tr>
</tbody></table>
<br />
Die gleiche Funktion gibt
es auch für Measures. Allein: was nützen diese Kommentare? Sie werden nirgendwo
in der Benutzeroberfläche eingeblendet (z.B. als Tooltip). <a href="http://cwebbbi.wordpress.com/2013/05/15/comments-and-descriptions-in-dax/" target="_blank">Chris Webb hat in einem Blog beschrieben</a>, wie sich die Kommentare mit Hilfe
von Dynamischen Verwaltungssichten abfragen lassen, aber das ist noch ein wenig
rudimentär. Da kann ich mir für künftige Versionen viele Verbesserungen
vorstellen.
<br />
<br />
<h4>
Zurzeit gibt es anscheinend nur eine Möglichkeit,
Kommentare so zu hinterlegen, dass sie gut sichtbar sind. </h4>
<br />
Nämlich ganz einfach,
indem Sie im Formelbereich <em>anstelle</em> einer Measure-Definition <em>einen freien Text
</em>schreiben. Die einzige Einschränkung ist, dass die Zeichenfolge := nicht in diesem
Text vorkommen darf.
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4XgDG9eB-1kuT2xhiGMu9eZKcSdSqiVFj_YkSv2kcoxFfL272YiiFlg0ON29t7SB3VEsCeJfQ25tLnmFuZLRktbQBC8veqXh_vYmWOIw0iaEYPcV8YK9BXmwUW9Wwc4LvoMxB1A9n3n4/s1600/Grafik.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4XgDG9eB-1kuT2xhiGMu9eZKcSdSqiVFj_YkSv2kcoxFfL272YiiFlg0ON29t7SB3VEsCeJfQ25tLnmFuZLRktbQBC8veqXh_vYmWOIw0iaEYPcV8YK9BXmwUW9Wwc4LvoMxB1A9n3n4/s1600/Grafik.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Sie können Kommentare in Formelfeldern hinterlegen<br />
<br />
</td></tr>
</tbody></table>
<br />
Der Kommentar fällt durch die automatisch vergebene kursive Schrift auf. Ein Klick darauf zeigt den Kommentartext im Formelbereich an. Das funktioniert und wird auch offiziell von Microsoft unterstützt.<br />
<h4>
<br />Tipps für lange Formeln und Kommentare</h4>
Je länger die DAX Formeln (oder die Kommentartexte) werden, desto unübersichtlich gestaltet sich die Bearbeitung der Texte in dem kleinen, einzeiligen Formeleditor. Glücklicherweise gibt es eine kleine unscheinbare Schaltfläche rechts des Formeleditors, mit der sich die einzeilige in eine mehrzeilige Anzeige umschalten lässt. <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSO00Q95bWJQI2VeHMJNR3UVkafe2wdJn40rUyhvnUPPbBwSnv7HScJoJqExHRYgTVD6kDCLIy7fevS69FOKNcStT4ajbepYuVNAF1OQrObRd-2-O1gT3XLYc-TFMI42n1Yy4uSfsLsMw/s1600/20-10-2013+16-45-37.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="23" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSO00Q95bWJQI2VeHMJNR3UVkafe2wdJn40rUyhvnUPPbBwSnv7HScJoJqExHRYgTVD6kDCLIy7fevS69FOKNcStT4ajbepYuVNAF1OQrObRd-2-O1gT3XLYc-TFMI42n1Yy4uSfsLsMw/s320/20-10-2013+16-45-37.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Diese Schaltfläche vergrößert den Bereich des Formeleditors</td></tr>
</tbody></table>
<br />
Auf diese Weise haben Sie viel Platz, um auch längere Formeln strukturiert darzustellen. <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQidMm-PlKDSAKqe7qLj8AE1OM1P77SfeL5NOKV5Xsq-wLNwGz_WUkOlZN2tWbNPbQBNfVK1rNZqohAWB1r2dGpkcolWaCLBlO6Dr1RFxze0wVynhRiCiLnFQhSlRLdF4k76mkxC9TGoI/s1600/20-10-2013+16-48-35.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQidMm-PlKDSAKqe7qLj8AE1OM1P77SfeL5NOKV5Xsq-wLNwGz_WUkOlZN2tWbNPbQBNfVK1rNZqohAWB1r2dGpkcolWaCLBlO6Dr1RFxze0wVynhRiCiLnFQhSlRLdF4k76mkxC9TGoI/s320/20-10-2013+16-48-35.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">So lassen sich auch längere DAX Ausdrücke übersichtlich bearbeiten</td></tr>
</tbody></table>
<br />
<br />
Die einzige kleine Hürde, die es jetzt noch zu nehmen gilt: Wie fügen Sie in diesem Editor einen Zeilenumbruch hinzu? Es ist die Tastenkombination [Shift] + [Eingabe].<br />
Wie Sie DAX Ausdrücke automatisch formatieren lassen, habe ich in <a href="http://volkerheck.blogspot.de/2012/05/dax-und-mdx-ausdrucke-schnell-und.html" target="_blank">diesem Blog-Beitrag</a> bereits einmal beschrieben.<br />Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-54351012739551905272013-09-06T10:07:00.001+02:002013-09-06T10:37:25.442+02:00Vom Ingenieur zum Business-Analysten – ein logischer SchrittWenn Ingenieure und andere Spezialisten wie Softwareentwickler oder Datenbankspezialisten 10 Jahre und länger ihre Frau oder ihren Mann stehen, dann verändert sich ihr Berufsbild nach und nach. Einige werden zu Projektmanagern. Schließlich brauchen technische Projekte eine starke Führung und wer könnte das besser leisten als jemand mit Erfahrung und Weitblick? <br />
<br />
Doch nicht jeder ist mit der Rolle des Projektmanagers glücklich, sondern möchte lieber weiterhin als "Senior Experte" sein gereiftes Fachwissen in Projekte einbringen, jüngere Kollegen anleiten und ins Team integrieren und darüber hinaus das Projekt mit dem Blick aufs Ganze in den richtigen Bahnen halten. Eine Stärke dieser erfahrenen Spezialisten ist, dass sie den Projektnutzen für das Unternehmen im Auge haben und mit vielen früheren Projekten im Rücken die Schnittstellen eines neuen Projekts zu den bestehenden Strukturen besser verstehen. Aufgrund ihrer Erfahrungen analysieren sie unwillkürlich mögliche Schwachstellen und decken Lücken in den Konzepten auf. So arbeiten Senior Experten als Business-Analysten – unabhängig von ihrem offiziellen Titel. In dieser Rolle sind sie ein wichtiger Erfolgsfaktor für alle Arten von Projekten in Unternehmen weltweit.<br />
<br />
Mir ging es genauso. Nach fast 20 Jahren Arbeit als Softwareentwickler und Datenbankspezialist habe ich dann sogar noch herausgefunden, dass es einen Weg gibt, die bereits erworbenen Fähigkeiten ganz systematisch einzusetzen und sich über die eigene Rolle noch besser klar zu werden, ja, dass es sogar möglich ist, mit einem Zertifikat diese Kompetenz zu dokumentieren. Es ist das CBAP® Zertifikat, eine Abkürzung für "Certified Business Analysis Professional". In einem Vorbereitungsseminar der masVenta Business GmbH wurde mir klar, dass ich aufgrund meiner Berufserfahrung bereits über einen Großteil des erforderlichen Wissens verfügte und dass ich viele der prüfungsrelevanten Techniken bereits selbst angewendet hatte. Ähnlich wie ich hatten alle Teilnehmer dieses Seminars ihre Aha-Erlebnisse, als es darum ging, die Wissensgebiete des BABOK®, des "Business Analysis Body of Knowledge", zu erschließen und systematisch aufzubereiten. Insofern liegt der persönliche Gewinn in der Einordnung und gezielten Nutzbarmachung des längst erworbenen Wissens. So kann ich nun in der Rolle des Business Analysten den Projektmanager besser unterstützen und wirkungsvoll dazu beitragen, "meine" IT-Projekte erfolgreich zu machen. <br />
<br />
Das BABOK® sieht den Projektmanager und den Business Analysten als starkes Gespann: Der Projektmanager ist für die Termine und das Budget verantwortlich, quasi als Bundeskanzler, Finanz-, Außen- und Verteidigungsminister des Projektes in Personalunion. Der Business Analyst hingegen trägt die Verantwortung für die Inhalte und die Qualität, er ist also so etwas wie der Innen-, Forschungs- und Verkehrsminister des Projekts. Er prüft alle Anforderungen an eine Lösung daraufhin, welchen Nutzen sie dem Unternehmen bringen. Berücksichtigt man die unterschiedlichen Aspekte dieser anspruchsvollen Aufgabe – z.B. die Methodik zum Erfassen der Anforderungen, den Umgang mit Änderungen, die effektive Kommunikation mit den unterschiedlichen Beteiligten – wird schnell klar, dass nur „Seniors“, die selbständiges Arbeiten im Team gewöhnt sind, diesem hohen Anspruch gerecht werden können. <br />
<br />
Wenn Sie sich auch für diesen Entwicklungspfad interessieren, dann ist die erste deutschsprachige Konferenz für Business Analyse und Anforderungsmanagement, die am 11. Oktober in Salzburg stattfindet, der richtige Ort um sich zu orientieren, mit anderen Business Analysten auszutauschen und interessante Vorträge anerkannter Fachleute zu hören. Vielleicht treffen wir uns dort? <br />
<br />
<a href="http://www.business-analyse-summit.com/" target="_blank">www.business-analyse-summit.com </a>Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-28445726698424836042013-09-02T16:31:00.001+02:002014-03-28T14:30:18.355+01:00Daten aus Oracle nach PowerPivot importierenEine wesentliche Stärke von PowerPivot ist es, Daten aus unterschiedlichen Quellen für eine gemeinsame Analyse zusammenzubringen. Da viele Unternehmen Oracle Datenbanken einsetzen, unterstützt PowerPivot den Import aus diesen Datenbanken direkt. Allerdings merkt man bei größeren Tabellen bald, dass der von Microsoft bereitgestellte Oracle Treiber nicht der schnellste ist. <br />
<br />
<h4>
Die Lösung: Einsatz des OLE DB Treibers von Oracle</h4>
<br />
Einen aktuellen, performanten OLE DB Treiber kann man auf den <a href="http://www.oracle.com/technetwork/database/windows/downloads/index-101290.html" target="_blank">Technet-Seiten bei Oracle </a>herunterladen. Nachdem dieser installiert ist, sieht das Vorgehen so aus, wie in den folgenden Schritten dargestellt. <br />
<br />
Schritt 1: <br />
Wählen Sie als Datenquelle "Others (OLEDB/ODBC)"<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwoQumTjNY_1HvUyK0MsaAAKd5hI_aC-7wTzRXki9wHGyIRQSskQN2ByGyqfknj-eAcqpKxFz37TXGQFBKGWVdVMaSUpER_qa5TzfX95PgIbcgkdpHF-xalQrFZL1Akhe0tNYBdaPStRk/s1600/Capture0.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwoQumTjNY_1HvUyK0MsaAAKd5hI_aC-7wTzRXki9wHGyIRQSskQN2ByGyqfknj-eAcqpKxFz37TXGQFBKGWVdVMaSUpER_qa5TzfX95PgIbcgkdpHF-xalQrFZL1Akhe0tNYBdaPStRk/s320/Capture0.PNG" height="320" psa="true" width="298" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Wählen Sie die Datenquelle "Others (OLEDB/ODBC)"</td></tr>
</tbody></table>
<br />
Schritt 2: <br />
Benennen Sie die Datenquelle<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpP9BHM_XBS_52DHmnYYgfOdFU5B_AnXiH6Ds7yA98Z39BQYXyqVEQCCfdw5zx8W7FRG9OYtJU1THEP8TQYJmskQGtAG92UhrxxfSKKeA-TQZj9p2Mb6bdmmEFIkptj7Dk_S_S804BGSo/s1600/Capture0a.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpP9BHM_XBS_52DHmnYYgfOdFU5B_AnXiH6Ds7yA98Z39BQYXyqVEQCCfdw5zx8W7FRG9OYtJU1THEP8TQYJmskQGtAG92UhrxxfSKKeA-TQZj9p2Mb6bdmmEFIkptj7Dk_S_S804BGSo/s320/Capture0a.PNG" height="203" psa="true" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Geben Sie der Datenquelle einen sprechenden Namen</td></tr>
</tbody></table>
<br />
Schritt 3: <br />
Wählen Sie den OLE DB Provider "Oracle Provider for OLE DB"<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNzZci2sCwqxhXJdN2HDAV4aXXRdl_E9uto-kBpGkhUq0JupHUOR35zzvE1I6RcpjRpFHfyIeD8qiAttDqOeWbu_MEjd128alii9ip10PQIWd-YNmTrvmefY09zqa0Q-JDrGnc8GVyBO0/s1600/Capture1.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNzZci2sCwqxhXJdN2HDAV4aXXRdl_E9uto-kBpGkhUq0JupHUOR35zzvE1I6RcpjRpFHfyIeD8qiAttDqOeWbu_MEjd128alii9ip10PQIWd-YNmTrvmefY09zqa0Q-JDrGnc8GVyBO0/s320/Capture1.PNG" height="310" psa="true" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Hinter diesem OLE DB Provider verbirgt sich der Oracle Treiber von Oracle</td></tr>
</tbody></table>
<br />
Schritt 4: <br />
Geben Sie den Namen der Oracle Datenbank ein, zu der Sie eine Verbindung herstellen möchten<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9zYGqniYFP2px875_MBVSKKqlJbAA5pzTngUSDR5RG22SWeA-_lMiTB_dmKlQjKTyu8D25OVUG9V7w7Jt4EiLe1cGV4JXA-c8CIgOpyVcyvzGpmIn3d7GeymGyG42aEBkTG6TRYRDH5k/s1600/Capture2.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9zYGqniYFP2px875_MBVSKKqlJbAA5pzTngUSDR5RG22SWeA-_lMiTB_dmKlQjKTyu8D25OVUG9V7w7Jt4EiLe1cGV4JXA-c8CIgOpyVcyvzGpmIn3d7GeymGyG42aEBkTG6TRYRDH5k/s320/Capture2.PNG" height="320" psa="true" width="258" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Hier geben Sie den Namen der Oracle Datenbank ein, wie er in der Datei TNSNAMES.ORA definiert ist</td></tr>
</tbody></table>
<br />
Schritt 5: <br />
Wenn Sie Windows Authentifizierung verwenden möchten, spezifizieren Sie die Extended Property <b>OSAuthent = 1</b> wie im folgenden Bild dargestellt.<br />
Wenn Windows Authentifizierung nicht verwendet werden soll, geben Sie im Schritt 4 stattdessen einen Benutzernamen und ein Passwort ein.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit-1CSrVSY7p5e1DPMjx1KGAALMS0hu1nTwJyOI9l6hzAQcNPA9dTW9ZeQmwQcxkJIopG444fj2brJBpInWnRH7J1B_OhSSQCL7VaOeW8giD5hfOF3wYdeHJb0c74zMkMizEJQTUxdMog/s1600/Capture3.PNG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEit-1CSrVSY7p5e1DPMjx1KGAALMS0hu1nTwJyOI9l6hzAQcNPA9dTW9ZeQmwQcxkJIopG444fj2brJBpInWnRH7J1B_OhSSQCL7VaOeW8giD5hfOF3wYdeHJb0c74zMkMizEJQTUxdMog/s320/Capture3.PNG" height="320" psa="true" width="254" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">So konfigurieren Sie Windows Authentifizierung </td></tr>
</tbody></table>
<br />
<b>Ergebnis</b>: <br />
Der fertige Connection String (Verbindungszeichenfolge)<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRCunAmiUSzeOGJ8o-4fjL71dI2YOlW18H6ZqdQVQgWhA42_bzaMc_n1rbLixyedBwjBR_6A2DGNkF8Q_uFK2PLvIvySUT7ZndmZmdu-y-O2lbpNrrY1L_wNpH80J1K0U2QZf99q2zv_0/s1600/1.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRCunAmiUSzeOGJ8o-4fjL71dI2YOlW18H6ZqdQVQgWhA42_bzaMc_n1rbLixyedBwjBR_6A2DGNkF8Q_uFK2PLvIvySUT7ZndmZmdu-y-O2lbpNrrY1L_wNpH80J1K0U2QZf99q2zv_0/s1600/1.JPG" height="195" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Diese Verbindungszeichenfolge ist das Ergebnis der vorherigen Schritte</td></tr>
</tbody></table>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
Sie werden feststellen, dass auf diese Weise Daten aus Oracle Datenbanken deutlich schneller nach PowerPivot importiert werden. In unserem Umfeld erfolgt der Import nun 5- bis 8-mal schneller als mit dem Microsoft Treiber für Oracle Datenbanken.Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-12310838560191506112013-07-12T18:18:00.002+02:002013-07-12T18:53:52.188+02:00Installieren des PowerPivot Add-Ins für ExcelUm PowerPivot in Excel 2010 nutzen zu können, ist das Herunterladen und Installieren des PowerPivot Add-Ins erforderlich. Wenn Sie bereits Excel 2013 einsetzen, ist das Add-In bereits installiert und muss nur noch aktiviert werden. <br />
<br />
<h4>
Die Anleitung</h4>
Weil ich wiederholt gefragt wurde, wie die Installation im Detail funktioniert, habe ich <a href="http://sdrv.ms/13FBQjs" target="_blank">hier eine Installationsanleitung</a> für das PowerPivot Add-In zur Verfügung gestellt. <br />
<br />
<h4>
Das Video</h4>
Für diejenigen, die lieber direkt sehen möchten, wie es geht, gibt es hier ein <a href="http://sdrv.ms/178ZyBJ" target="_blank">4-Minuten-Video</a>.<br />
<br />
<h3>
Was tun, wenn's mal nicht funktioniert?</h3>
<br />
<h4>
Excel 2010 </h4>
Bei Excel 2010 habe ich mehrfach gesehen, dass zwar ein Add-In installiert wurde, aber in Excel war der Reiter <em>PowerPivot</em> trotzdem nicht zu sehen. Ursache war stets die falsche Version (32/64-Bit) des Add-Ins. Prüfen Sie unter Systemsteuerung > Programme > Programm deinstallieren, welches Add-In tatsächlich installiert ist. <br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBe8sE20SsDVNcXGJ78auY6U4qAat9GW_VNJrHFfkLfZBews1-Dx5SOrPz93hy3gZP1ST2A66wvgoDfRaXRRLGIzPqab2xWYgh6Gx2uGR6fifdUtI3rvXU_zKgfMwCDd5FmB6B-LaS4M0/s1600/1.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="16" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBe8sE20SsDVNcXGJ78auY6U4qAat9GW_VNJrHFfkLfZBews1-Dx5SOrPz93hy3gZP1ST2A66wvgoDfRaXRRLGIzPqab2xWYgh6Gx2uGR6fifdUtI3rvXU_zKgfMwCDd5FmB6B-LaS4M0/s400/1.JPG" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">In der Liste installierter Programme finden Sie auch das PowerPivot Add-In</td></tr>
</tbody></table>
Deinstallieren Sie in diesem Fall das falsche Add-In, laden Sie das richtige aus dem Internet herunter und installieren Sie dieses.<br />
<br />
<h4>
Excel 2013</h4>
Wenn Sie Excel 2013 einsetzen, hilft Ihnen wahrscheinlich dieser Link weiter:<br />
<br />
<a href="http://office.microsoft.com/de-de/excel-help/starten-des-powerpivot-in-excel-2013-add-ins-HA102837097.aspx?CTT=5&origin=HA102893837" target="_blank">http://office.microsoft.com/de-de/excel-help/starten-des-powerpivot-in-excel-2013-add-ins-HA102837097.aspx?CTT=5&origin=HA102893837 </a>Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-43994361624917365772013-07-10T17:13:00.001+02:002014-01-24T11:14:26.911+01:00Excel Arbeitsblätter mit DAX Abfragen füllenWenn Sie mit PowerPivot arbeiten und die Daten in einer Pivot-Tabelle darstellen, dann sendet die Pivot-Tabelle im Hintergrund MDX-Abfragen an das PowerPivot Modell. Das macht Excel ganz automatisch. <br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGrrIdExor6HbpV86yNLomsz_GDGkenCAcVMjGwg2R198s-qH85K8CEa-dqPrC9KFBpi-wGHLCSVGpXnylq4StkXLMSJ6jvQ9auAO-1XDZEKUmguMQ1nO6cDwrqK_2WTENhfDkQugyPus/s1600/1.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGrrIdExor6HbpV86yNLomsz_GDGkenCAcVMjGwg2R198s-qH85K8CEa-dqPrC9KFBpi-wGHLCSVGpXnylq4StkXLMSJ6jvQ9auAO-1XDZEKUmguMQ1nO6cDwrqK_2WTENhfDkQugyPus/s320/1.JPG" height="168" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Um die Pivot-Tabelle zu erstellen, generiert Excel automatisch MDX-Abfragen</td></tr>
</tbody></table>
<br />
Eine Frage, die immer wieder gestellt wird, lautet: "Wie kann ich den Inhalt einer PowerPivot Tabelle in einem Excel Arbeitsblatt anzeigen?" Also nicht die oben gezeigte Pivot-Tabelle, sondern einfach nur den Inhalt einer Tabelle, die Sie zuvor nach PowerPivot importiert haben, als "flache" Tabelle. Das ist nicht ganz so offensichtlich, vor allem bietet in Excel 2010 die grafische Oberfläche keinen direkten Weg dafür. <br />
<br />
Je nachdem, ob Sie mit Excel 2010 oder mit Excel 2013 arbeiten, sieht die Vorgehensweise etwas anders aus. <br />
<br />
<h4>
PowerPivot in Excel 2010</h4>
Mit einem Doppelklick auf eine Zelle in der Pivot-Tabelle öffnet sich ein neues Excel Arbeitsblatt, das die ersten 1000 Zeilen anzeigt, die zum Berechnen des Werts in der angeklickten Zelle beitragen. Auch hierfür erzeugt Excel automatisch eine MDX-Abfrage.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFJ0oj1IC36c-kTOLrAWEcOXpVXB7mdBmk2AG4eUKcavDyUAaJveJqYDcxsy8W-lMzhej9RNmesymkh6lnRmHwQhYqy27R00V0YaiGtS4NAucN33fVvYrFkkL6Vy8WkH20iMDh-5TkDBw/s1600/2+(2).jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFJ0oj1IC36c-kTOLrAWEcOXpVXB7mdBmk2AG4eUKcavDyUAaJveJqYDcxsy8W-lMzhej9RNmesymkh6lnRmHwQhYqy27R00V0YaiGtS4NAucN33fVvYrFkkL6Vy8WkH20iMDh-5TkDBw/s320/2+(2).jpg" height="212" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Die Liste der Werte wird mit einer MDX Anweisung ermittelt.</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
Sie können dieses Fenster sehen, wenn Sie mit einem Rechtsklick in die Tabelle klicken und dann die Funktion "Table" - "Edit Query..." auswählen.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdBX7bXl1vQrfI3ExTRb0gYtizltGq6AQT2oX1rWw3Y7ruTREsjU0B2EEviqYzvnesV0e-set05DW-PUjAy1DJaorGySLEHrY4mXRd8omFkw8yR9Yl05FSZRB3NALp7OnQi1ufpeQK4aA/s1600/4.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdBX7bXl1vQrfI3ExTRb0gYtizltGq6AQT2oX1rWw3Y7ruTREsjU0B2EEviqYzvnesV0e-set05DW-PUjAy1DJaorGySLEHrY4mXRd8omFkw8yR9Yl05FSZRB3NALp7OnQi1ufpeQK4aA/s320/4.JPG" height="320" width="306" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Mit "Edit Query..." können Sie die MDX-Abfrage hinter der Tabelle sehen.</td></tr>
</tbody></table>
<br />
<br />
Jetzt kommt der Clou: Diese MDX-Abfrage können Sie durch eine DAX-Abfrage ersetzen. Da die Sprache DAX extra für das Arbeiten mit Tabellen in PowerPivot entwickelt wurde, können Sie damit recht einfach Tabellen abfragen. (Anm.: Da MDX mit Mengen von Zellen "Cellsets" arbeitet, ist das Abfragen von Tabellen mit MDX nicht einfach möglich. Tabellen gibt es in der Welt von MDX einfach nicht.)<br />
<br />
Das folgende Fenster zeigt das Beispiel für eine solche Abfrage.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfiXr19BBPKKGUNhqpBKs8ZtOMnWYOOCFDi2jsbzoFBkeCo7_8tDPYcChqaPro8ycgKqFmYIiUptw_DsbVKefv5Wgw6lRDUNmP6Na-y80G7savqVe-4XbD-QooS-9cA5KezB3djaYNhhc/s1600/3+%25282%2529.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfiXr19BBPKKGUNhqpBKs8ZtOMnWYOOCFDi2jsbzoFBkeCo7_8tDPYcChqaPro8ycgKqFmYIiUptw_DsbVKefv5Wgw6lRDUNmP6Na-y80G7savqVe-4XbD-QooS-9cA5KezB3djaYNhhc/s320/3+%25282%2529.jpg" height="211" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Im Bereich "Command Text" können Sie auch eine DAX-Abfrage eintragen.</td></tr>
</tbody></table>
<span style="color: blue; font-family: "Courier New", Courier, monospace;">Evaluate( Filter( TradingData, TradingDate[Month_Number] = "12" ) )</span><br />
<br />
Die DAX-Funktion "Evaluate" fragt eine Tabelle ab. Da die verwendete Tabelle "TradingData" sehr viele Zeilen hat, wurden mit der "Filter"-Funktion diejenigen Zeilen ausgewählt, wo die Spalte "Month Number" einen Wert von 12 hat. <br />
Wenn Sie das erst einmal hinbekommen haben, können Sie beliebige DAX-Ausdrücke erstellen, um deren Ergebnis in einer Excel Tabelle darzustellen. <br />
<br />
<h4>
PowerPivot in Excel 2013</h4>
In der aktuellen Version 2013 funktioniert das im Prinzip genauso, allerdings hat sich die Bedienung ein klein wenig verändert. Daher die Schritte hier noch einmal für die neue Version:<br />
<ol>
<li>Wählen Sie im Ribbon "Daten" - "Vorhandene Verbindungen". <br />Achtung: das funktioniert nur dann, wenn Sie eine Zelle ausgewählt haben, die nicht innerhalb einer Pivot Tabelle liegt ;-)<br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4_ph1wEYaYN1FawxxmSV2s65MNU_rXiCxMxeT-XvbCZnwz8Bg-PUnMefLZN3o4ZD-3f5KAqjqjPXjYVVnLyd8cOGAVY0-ZUuWN0Ja5tSDQLUztH2O4JDzezhJLKtRN802oszN0M6ItgY/s1600/10.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4_ph1wEYaYN1FawxxmSV2s65MNU_rXiCxMxeT-XvbCZnwz8Bg-PUnMefLZN3o4ZD-3f5KAqjqjPXjYVVnLyd8cOGAVY0-ZUuWN0Ja5tSDQLUztH2O4JDzezhJLKtRN802oszN0M6ItgY/s320/10.JPG" height="320" width="320" /></a></li>
<li>Wählen Sie unter dem Reiter "Tabellen" eine beliebige Tabelle aus. </li>
<li>Es wird ein neues Arbeitsblatt mit den Daten dieser Tabelle angelegt. <div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcEzt0cLEM0yWo_McxylpFrxHX11rFgOO1w3XZ_5pCh58sVuOn9VZhcQrw-B1FImpMh2aJGjUXnpfwQDxgxOryos62DPj6fYQGvKvLCM_Jaqno5eCLzdFTP823rBw0MOguloCFwbwtCJs/s1600/11.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcEzt0cLEM0yWo_McxylpFrxHX11rFgOO1w3XZ_5pCh58sVuOn9VZhcQrw-B1FImpMh2aJGjUXnpfwQDxgxOryos62DPj6fYQGvKvLCM_Jaqno5eCLzdFTP823rBw0MOguloCFwbwtCJs/s320/11.JPG" height="190" width="320" /></a></div>
Damit ist die Aufgabenstellung "Hole die Daten einer Tabelle aus PowerPivot in ein Excel Arbeitsblatt" bereits erledigt. Sie können die dahinter stehende DAX Abfrage nun noch modifizieren.</li>
<li>Mit einem Rechtsklick in die Excel Tabelle öffnet sich das folgende Menü. <a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigPvS9dRgx-zf1xPKNG_dY5rkWLyTn5wnkFm0_wH-5c_Lwfqc6u3cZl0L6VrXPYodL4op1TS8jKKOK5W8WcmbKqymLG0XlXgjSzQjA4GdUdJG79ia6aZNoKUmvx1RvNMeke4zkwGmwAAg/s1600/12.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigPvS9dRgx-zf1xPKNG_dY5rkWLyTn5wnkFm0_wH-5c_Lwfqc6u3cZl0L6VrXPYodL4op1TS8jKKOK5W8WcmbKqymLG0XlXgjSzQjA4GdUdJG79ia6aZNoKUmvx1RvNMeke4zkwGmwAAg/s320/12.JPG" height="320" width="290" /></a></li>
<li>Wählen Sie hier die Funktion "Tabelle" - "DAX bearbeiten". In dem folgenden Dialog können Sie die gewünschte DAX Abfrage einfügen. Achten Sie dabei darauf, dass Sie den Befehlstyp von "Tabelle" nach "DAX" umstellen! <div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinuKwBEko8Sotw2eq8w4vMJksd1EWifz-CoqH3ypiin53sAIlPcLIS8e2AFSEvh1_7lm91c3WV15k-JSsZ-ZwhhwfGY8o5UYrHF71yV_WJOl99L_gl6IN5cNpeCnX_T0NZZRSgBkUZyM4/s1600/15.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinuKwBEko8Sotw2eq8w4vMJksd1EWifz-CoqH3ypiin53sAIlPcLIS8e2AFSEvh1_7lm91c3WV15k-JSsZ-ZwhhwfGY8o5UYrHF71yV_WJOl99L_gl6IN5cNpeCnX_T0NZZRSgBkUZyM4/s320/15.JPG" height="213" width="320" /></a></div>
</li>
</ol>
<br />
<h4>
DAX Abfragen erstellen</h4>
Bleibt nur noch die Frage, mit welchem Werkzeug sich DAX Abfragen komfortabel erstellen lassen. Meine Empfehlung: Versuchen Sie es mit dem Excel Add-In DAX Studio. Es steht kostenlos hier zum Download bereit: <a href="http://daxstudio.codeplex.com/" target="_blank">http://daxstudio.codeplex.com/</a>Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-34183513440000744762013-06-09T21:41:00.000+02:002013-06-16T07:50:50.820+02:00Kostenloses Webinar: Anforderungsanalyse in BI-ProjektenNicht nur um BI-Projekte erfolgreich umzusetzen, ist die Erhebung, die Analyse, die Nachverfolgung und schließlich die Umsetzung der Anforderungen in der richtigen Reihenfolge unabdingbar. Das BABOK® bietet eine Sammlung der Methoden und Techniken, mit denen dies erreicht werden kann. Im Vergleich zu anderen Arten von Projekten gibt es jedoch bei BI-Projekten ein paar Besonderheiten zu beachten. <br />
<br />
Das Gratis-Webinar liefert einen Überblick zum richtigen Vorgehen, so dass Sie die typischen Stolperfallen vermeiden können. <br />
<br />
<h4>
Referenten</h4>
Rainer Wendt, Geschäftsführer von masVenta, und ich werden in knapp einer Stunde das Wichtigste zu diesem Thema anschaulich vermitteln. <br />
<br />
Für alle, die tiefer einsteigen möchten, bietet masVenta ein tiefer gehendes zweitägiges Seminar an, in dem die Teilnehmer anhand eines praxisnahen Beispiels ihr Wissen ausbauen können. <br />
<br />
<h4>
Das Webinar</h4>
Hier können Sie sich anmelden: <a href="https://attendee.gotowebinar.com/rt/2552418737743036672">https://attendee.gotowebinar.com/rt/2552418737743036672</a><br />
Und hier finden Sie das masVenta Seminar: <a href="http://www.masventa.eu/academia/anforderungsanalyse-fuer-business-intelligence-projekte/">http://www.masventa.eu/academia/anforderungsanalyse-fuer-business-intelligence-projekte/</a>Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.comtag:blogger.com,1999:blog-3388439241775262924.post-18766847940693365152013-05-11T16:37:00.000+02:002013-05-11T16:38:03.644+02:00T-SQL Code übersichtlich formatierenDer T-SQL Editor in SQL Server Management Studio (SSMS) ist von Version zu Version immer besser geworden. Dank IntelliSense ist das Schreiben von Objektnamen (Tabellen, Spalten, etc.) schnell und fehlerfrei möglich. Aber wenn es darum geht, wann ein Zeilenumbruch erfolgt, ob Kommas am Anfang oder am Ende einer Zeile stehen und wie weit ein Ausdruck einzurücken ist, endet die Unterstützung. Je länger die SQL Statements, desto aufwändiger gestaltet sich die Formatierung.<br />
<br />
<h4>
Tools unterstützen beim Formatieren</h4>
<br />
Zum Glück erlaubt SSMS das Einbinden von Erweiterungen. Was den Funktionsumfang und die Qualität betrifft, ist hier wahrscheinlich <a href="http://www.red-gate.com/products/sql-development/sql-prompt/" target="_blank">SQL Prompt</a> von redgate an erster Stelle zu nennen. Entwickler, die das <a href="http://www.red-gate.com/products/sql-development" target="_blank">SQL Developer Bundle</a> nutzen, finden SQL Prompt darin bereits vor. Einziger Nachteil: Die Kosten in Höhe von ca. 300 Euro für die Professional Version von SQL Prompt. <br />
<br />
<h4>
Mein Favorit unter den kostenfreien Tools</h4>
<br />
Jedoch gibt es auch kostenfreie Tools. Einige habe ich kurz ausprobiert und dabei schnell meinen Favoriten gefunden. Es handelt sich dabei um ein Open Source Projekt von <a href="http://architectshack.com/WelcomePage.ashx" target="_blank">Tao Klerks</a> mit dem auffälligen Namen <a href="http://architectshack.com/PoorMansTSqlFormatter.ashx" target="_blank">Poor Man's T-SQL Formatter.</a> Die <a href="http://architectshack.com/PoorMansTSqlFormatter.ashx#Download_5" target="_blank">MSI-Datei</a> ist schnell heruntergeladen und installiert. Danach erweitert sich das Menü in SSMS um zwei neue Funktionen unter "Tools":<br />
<ul>
<li>Format T-SQL Code</li>
<li>T-SQL Formatting Options ...</li>
</ul>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbXnQhN_qqn8dp3ulvVMa6xeTvXj7Hv0mCgMIUJ7j9_wD39gyKsrGG_JdeVqU-Ac01AmlaOeFAE1tJRmQPAHL8-f9EBQ8lPUBsjnQ0xQdwoJJKe6tbiHf9UOueb1BE7yOTA_YkrONNN28/s1600/1Unbenannt.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbXnQhN_qqn8dp3ulvVMa6xeTvXj7Hv0mCgMIUJ7j9_wD39gyKsrGG_JdeVqU-Ac01AmlaOeFAE1tJRmQPAHL8-f9EBQ8lPUBsjnQ0xQdwoJJKe6tbiHf9UOueb1BE7yOTA_YkrONNN28/s1600/1Unbenannt.JPG" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Die neuen Funktionen, die das Formatierungswerkzeug SSMS hinzufügt</td></tr>
</tbody></table>
Die Verwendung ist so einfach, wie es den Anschein hat: wenn Sie "Format T-SQL Code" anklicken, wird der markierte T-SQL Code formatiert. Falls Sie nichts markiert haben, wird der gesamte T-SQL Code im Abfragefenster formatiert.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Yg-xgXUnkfGoqa9CyPhJLcnczgevUcxjWbwZActKIrvhf3eU5haOIShY1M3EGst-ccf1z_V3c5_6Z2-vz7ysr9c07QPWTJpuE2xZ4ddqY4NyS0VOw02UHMb4l3Zjpu1L7pzu4aanj8U/s1600/2Unbenannt.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5Yg-xgXUnkfGoqa9CyPhJLcnczgevUcxjWbwZActKIrvhf3eU5haOIShY1M3EGst-ccf1z_V3c5_6Z2-vz7ysr9c07QPWTJpuE2xZ4ddqY4NyS0VOw02UHMb4l3Zjpu1L7pzu4aanj8U/s320/2Unbenannt.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Egal, wie Sie den Code eingegeben haben: nach Aufruf von "Format T-SQL Code" sieht er sofort gut aus.</td></tr>
</tbody></table>
Da jeder Programmierer eigene Vorstellungen davon hat, was die richtige Formatierung ist (bzw. da unterschiedliche Unternehmen unterschiedliche Vorgaben machen), lässt sich die Formatierung mit der Funktion "T-SQL Formatting Options ..." steuern. <br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoV9dmJkJWbEntrzZ_Ft50i0dvaQTWfiHpnt1IdX2Rv-Hey_1HEnElIZqH6p_-Pkm6AHgiS7uF0Y5G5GkJYgcMYDneCx7HCsnMjTh0qyMg2FRSh_wBvoci3Vy6DVehiN89lTf__fwq4rw/s1600/4Unbenannt.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoV9dmJkJWbEntrzZ_Ft50i0dvaQTWfiHpnt1IdX2Rv-Hey_1HEnElIZqH6p_-Pkm6AHgiS7uF0Y5G5GkJYgcMYDneCx7HCsnMjTh0qyMg2FRSh_wBvoci3Vy6DVehiN89lTf__fwq4rw/s320/4Unbenannt.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Die Einstellungen zum Formatieren</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
Alles in allem ein sehr hilfreiches und darüber hinaus kostenfreies Tool! Lediglich ein kleines Problem musste ich lösen: Die Tastenkombination [Ctrl]+[K] [F] soll das Formatieren starten. Mit der voreingestellten Einstellung funktionierte diese Tastenkombination jedoch nicht in meiner Umgebung. Ich musste die Einstellung "SSMS HotKey" folgendermaßen ändern:<br />
<div style="text-align: center;">
<strong><span style="font-family: "Courier New", Courier, monospace;">Text Editor::ctrl+k, ctrl+f</span></strong></div>
<br />
<h4>
T-SQL Formatierung in Notepad++</h4>
Gehören Sie auch zu den Nutzern des ebenfalls kostenfrei verfügbaren Texteditors <a href="http://notepad-plus-plus.org/" target="_blank">Notepad++</a>? Dann können Sie den Poor Man's T-SQL Formatter dort ebenfalls verwenden. Hierzu wählen Sie einfach im Menü "Erweiterungen" - "Plugin Manager" das Plugin aus - fertig.<br />
<br />
<h4>
Weitere Links</h4>
Die Tools SQL Prompt und Poor Man's T-SQL Formatter habe ich nach subjektiven Kriterien herausgegriffen. Wenn Sie an einer Übersicht der verfügbaren Tools interessiert sind, finden Sie diese auch bei Tao Klerks: <a href="http://architectshack.com/PoorMansTSqlFormatter.ashx#Other_Products_and_Projects_1" target="_blank">Übersicht der Formatierungs-Tools</a>Volker Heckhttp://www.blogger.com/profile/06991932477762141608noreply@blogger.com