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

<channel>
	<title>ixto-Blog</title>
	<atom:link href="http://www.ixto.de/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ixto.de/blog</link>
	<description>Business Intelligence, Database Consulting, Software Development</description>
	<lastBuildDate>Mon, 26 Sep 2011 09:23:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Surrogate-Keys f&#252;r Parent-Child-Hierarchie mit SSIS erzeugen und Hierarchiestufen ausgeben</title>
		<link>http://www.ixto.de/blog/sql-server-2008/integration-services-2008/surrogate-keys-fr-parent-child-hierarchie-mit-ssis-erzeugen-und-hierarchiestufen-ausgeben/</link>
		<comments>http://www.ixto.de/blog/sql-server-2008/integration-services-2008/surrogate-keys-fr-parent-child-hierarchie-mit-ssis-erzeugen-und-hierarchiestufen-ausgeben/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 09:16:17 +0000</pubDate>
		<dc:creator>Christopher Glomb</dc:creator>
				<category><![CDATA[Integration Services 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=587</guid>
		<description><![CDATA[Das folgende Szenario bezieht sich auf die Microsoft Demo-Datenbank AdventureWorks 2008. Diese kann auf http://msftdbprodsamples.codeplex.com/ heruntergeladen werden. Die Umsetzung dieses Beispiels erfolgte mit Visual Studio 2008 und SQL Server 2008.
&#160;
Ich möchte in diesem Blogbeitrag erklären, wie man Surrogate-Keys für Parent-Child-Hierarchien und die jeweilige Hierarchiestufe des Mitarbeiters anlegen kann. Dabei hilft uns die Angestellten Tabelle der [...]]]></description>
			<content:encoded><![CDATA[<p>Das folgende Szenario bezieht sich auf die Microsoft Demo-Datenbank AdventureWorks 2008. Diese kann auf <a href="http://msftdbprodsamples.codeplex.com/">http://msftdbprodsamples.codeplex.com/</a> heruntergeladen werden. Die Umsetzung dieses Beispiels erfolgte mit Visual Studio 2008 und SQL Server 2008.</p>
<p>&#160;</p>
<p>Ich möchte in diesem Blogbeitrag erklären, wie man Surrogate-Keys für Parent-Child-Hierarchien und die jeweilige Hierarchiestufe des Mitarbeiters anlegen kann. Dabei hilft uns die Angestellten Tabelle der AdventureWorks Datenbank. Diese findet man unter dem Tabellennamen Employee im Schema HumanResources. Der Mitarbeiter wird über die Spalte EmployeeID identifiziert und der Vorgesetzte über die Spalte ManagerID. Angestellte die keinen Vorgesetzten haben, sind mit entsprechender ManagerID auf NULL gesetzt. Dementsprechend ist der/sind die Mitarbeiter der/die keinen Vorgesetzten hat/haben, die höchste Stufe in unserer Organisation (in unserem Fall also der Chef).</p>
<p>&#160;</p>
<p> <span id="more-587"></span>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb.png" width="585" height="287" /></a></p>
<p>&#160;</p>
<p>Wir müssen in unserer Tabelle in der später unsere Daten landen sollen zunächst zwei zusätzliche Spalten einfügen. Das wäre zum einen die Spalte <i>EmployeeBK</i> und <i>ManagerBK</i>. Die Erklärung dazu folgt dann später im Text.</p>
<p>&#160;</p>
<p>Außerdem benötigen wir in unserer Ausgangstabelle (Employee) eine Hilfsspalte (ich habe mich i.F. für istImportiert entschieden (NULL ist zulässig)) mit beliebigen Namen und dem Datentyp bit.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_3.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_3.png" width="585" height="137" /></a></p>
<p>&#160;</p>
<p>Als nächstes müssen wir dafür sorgen, dass alle Werte in dieser neuen Spalte den Wert 0 enthalten. Damit das Ganze gleich in SSIS passiert, ziehen wir uns einen SQL-Task auf unsere Arbeitsfläche und fügen den Befehl <strong>update [HumanResources].[Employee] set istImportiert = 0</strong> ein.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_4.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_4.png" width="600" height="490" /></a></p>
<p>&#160;</p>
<p>Für den nächsten Schritt benötigen wir eine Laufvariable mit dem Datentyp Integer und dem Standardwert 0. Danach legen wir einen for-Schleifencontainer an. Nachdem Ihr die Eigenschaften festgelegt habt, legen wir einen Datenflusstask in den Container.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_5.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_5.png" width="600" height="505" /></a></p>
<p>&#160;</p>
<p>Vorweg schon mal die Ansicht, wie es später in unserem Datenflusstask aussehen wird:</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_6.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_6.png" width="600" height="558" /></a></p>
<p>&#160;</p>
<p>&#160;</p>
<p><b><font size="3">Schritt 1</font></b></p>
<p><strong></strong></p>
<p>Wie üblich brauchen wir zunächst eine Quelle. Entscheidend ist hier natürlich, dass wir neben der ManagerID und der EmployeeID die Abfrage darauf einschränken, dass nur Daten geladen werden, wo der Wert für istImportiert = 0 ist.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_7.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_7.png" width="590" height="616" /></a></p>
<p>&#160;</p>
<p><b><font size="3">Schritt 2</font></b></p>
<p><strong><font size="3"></font></strong></p>
<p>In der Komponente für bedingtes Teilen erfolgt die Überprüfung, welche Daten unsere Wurzelknoten (also unsere Manager mit dem Eintrag null) sind. Alle anderen Mitarbeiter werden als Knoten ausgegeben. </p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_8.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_8.png" width="591" height="351" /></a></p>
<p>&#160;</p>
<p><b><font size="3">Schritt 3</font></b></p>
<p><strong></strong></p>
<p>Wir kümmern uns zunächst um die Mitarbeiter, die unseren Wurzelknoten repräsentieren. Dazu legen wir eine Abgeleitete Spalte mit dem folgenden Ausdruck an: </p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_9.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_9.png" width="600" height="69" /></a></p>
<p>&#160;</p>
<p>Im zweiten Teil von Schritt 3 müssen die anderen Hierarchiestufen überprüft werden. Hierfür legen wir eine Lookup Komponente an und verbinden diese mit der Ausgabe für Knoten aus der Conditional-Split Komponente. Damit wir es später nicht vergessen, ändern wir unter Allgemein die Einstellung wie nicht getroffene Einträge behandelt werden (auf Fehler ignorieren stellen). Unter Verbindung fügen wir ein SQL-Statement ein, das unsere Tabelle abfragt, in der letztendlich unsere Daten landen sollen. Jetzt kommt eine der erwähnten Spalten aus der Einleitung ins Spiel. EmployeeBK enthält später die Mitarbeiternummer welche aus EmployeeID kommt.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_10.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_10.png" width="409" height="392" /></a></p>
<p>&#160;</p>
<p>Wir verknüpfen die ManagerID mit EmployeeBK und lassen uns die EmployeeID (im SQL-Statement umbenannt zu EmployeeParentID) ausgeben. Überall wo wir keinen Treffer haben, wird NULL ausgegeben.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_11.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_11.png" width="600" height="304" /></a></p>
<p>&#160;</p>
<p><b><font size="3">Schritt 4</font></b></p>
<p><strong><font size="3"></font></strong></p>
<p>Mit dem nächsten Conditional Split überprüfen wir, ob EmployeeParentID einen Wert erhalten hat oder nicht. Alle Zeilen für die es einen Treffer gibt, gehen in diesem Beispiel an die Ausgabe „Vater gefunden“.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_12.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_12.png" width="600" height="354" /></a></p>
<p>&#160;</p>
<p><b><font size="3">Schritt 5</font></b></p>
<p><strong><font size="3"></font></strong></p>
<p>Mit Hilfe einer Union All Komponente verknüpfen wir die eingehenden Zeilen.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_13.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_13.png" width="599" height="587" /></a></p>
<p>&#160;</p>
<p><b><font size="3">Schritt 6</font></b></p>
<p><strong></strong></p>
<p>Über die Multicast Komponente lassen wir uns Kopien des Datasets erzeugen.</p>
<p>&#160;</p>
<p><b><font size="3">Schritt 7</font></b></p>
<p><strong></strong></p>
<p>In der Komponente OLE DB Befehl fügen wir für unsere Quelltabelle Employee ein Update Statement ein.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_14.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_14.png" width="600" height="441" /></a></p>
<p>&#160;</p>
<p>Außerdem muss in den Spaltenzuordnungen EmployeeID mit Param_0 verknüpft werden.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_15.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_15.png" width="598" height="323" /></a></p>
<p>&#160;</p>
<p><b><font size="3">Schritt 8</font></b></p>
<p><strong></strong></p>
<p>Als Erstes betrachten wir die Zuordnungen für unser Ziel (OLE_DST EmployeeNeu). Wie bereits erwähnt, stellt die EmployeeID in unserer Zieltabelle den Surrogate-Key dar. Außerdem muss darauf geachtet werden, dass unsere EmployeeParentID mit der ManagerID verknüpft wird.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_16.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_16.png" width="593" height="548" /></a></p>
<p>&#160;</p>
<p>Da wir uns immer noch im Schleifencontainer befinden, müssen wir im letzten Schritt dafür sorgen, dass kein Durchlauf mehr erfolgt, wenn unsere Laufvariable einen Wert ungleich 0 hat. Wir fügen eine Komponente „SQL ausführen“ (SQL UPDATE Employee) ein (siehe Bild)</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_17.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_17.png" width="365" height="475" /></a></p>
<p>&#160;</p>
<p>und legen folgende Einstellungen fest:</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_18.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_18.png" width="600" height="421" /></a></p>
<p>&#160;</p>
<p>Wenn noch nicht geschehen, muss im ResultSet unsere Laufvariable ausgegeben werden.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_19.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_19.png" width="600" height="113" /></a></p>
<p>&#160;</p>
<p><b><font size="3">Hierarchiestufe</font></b></p>
<p><strong><font size="3"></font></strong></p>
<p>Da ich abschließend wissen möchte, wie viele Vorgesetzte ein Mitarbeiter über sich hat, benötige ich eine zusätzliche Variable, die für jeden Durchlauf des Containers hochgezählt und dann in unsere Zieltabelle weggeschrieben wird. Hierfür lege ich zunächst eine Variable (iHierarchiestufe) mit dem Datentyp integer an (Startwert steht auf 1) und ergänze meine Zieltabelle um die Spalte Hierarchiestufe. Den Wert der Variablen füge ich mit Hilfe der Komponente „abgeleitete Spalte“ in eine neue Spalte ein.</p>
<p> <a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_20.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_20.png" width="607" height="569" /></a>
<p>&#160;</p>
<p>Außerdem muss ich noch das Mapping wie in Schritt 8 beschrieben ergänzen falls nicht schon geschehen. </p>
<p>&#160;</p>
<p>Natürlich muss dem Schleifencontainer noch mitgeteilt werden, dass unsere Variable pro Durchlauf hochgezählt wird (AssignExpression). Die Einstellung dafür bitte dem Bild For-Schleifen-Editor entnehmen.</p>
<p>&#160;</p>
<p>Abschließend schauen wir uns noch das Ergebnis für unsere Zieltabelle „EmployeeNeu“ an. Im ersten Durchlauf finden wir genau einen Mitarbeiter der keinen Vorgesetzten hat. Er steht dementsprechend an erster Stelle in der Hierarchie.</p>
<p>&#160;</p>
<p>Erster Durchlauf:</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_21.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_21.png" width="600" height="74" /></a></p>
<p>&#160;</p>
<p>Im zweiten Durchlauf (zweite Ebene in der Hierarchie) haben wir schon mehr Mitarbeiter getroffen. Die ehemalige EmployeeID aus der Quelltabelle befindet sich nun in der Spalte EmployeeBK. Unter ManagerBK finden wir die zugehörige Kennzeichnung des Vorgesetzten (ManagerID aus der Quelltabelle). Unter ManagerID befindet sich der neu erzeugte Surrogate Key.</p>
<p>&#160;</p>
<p>Zweiter Durchlauf:</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_22.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/8ad168261186_9839/image_thumb_22.png" width="600" height="190" /></a></p>
<p>&#160;</p>
<p>Da alle weiteren Hierarchiestufen nach dem gleichem Schema gefüllt werden, spare ich mir an dieser Stelle die Fotos für die nächsten Durchläufe. Viel Spaß beim Ausprobieren.</p>
<p>&#160;</p>
<p>Wenn ich euch mit dieser Anleitung helfen konnte, ihr weitere Fragen, Anmerkungen, Verbesserungsvorschläge oder Lösungen habt, freue ich mich auf Kommentare!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2008/integration-services-2008/surrogate-keys-fr-parent-child-hierarchie-mit-ssis-erzeugen-und-hierarchiestufen-ausgeben/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExecutionValue beim Execute SQL-Task in SSIS</title>
		<link>http://www.ixto.de/blog/sql-server-2008/integration-services-2008/executionvalue-beim-execute-sql-task-in-ssis-2/</link>
		<comments>http://www.ixto.de/blog/sql-server-2008/integration-services-2008/executionvalue-beim-execute-sql-task-in-ssis-2/#comments</comments>
		<pubDate>Fri, 22 Jul 2011 09:56:18 +0000</pubDate>
		<dc:creator>David Veenhuis</dc:creator>
				<category><![CDATA[Integration Services 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/allgemein/executionvalue-beim-execute-sql-task-in-ssis-2/</guid>
		<description><![CDATA[Es gibt einen einfachen Weg um festzustellen, wieviele Zeilen von der Ausführung von SQL-Anweisungen wie DELETE oder UPDATE mit dem Execute-SQL-Task betroffen sind. Dazu kann die ExecutionValue-Property des Execute-SQL-Tasks verwendet werden. Das wird hier am Beispiel einer DELETE-Anweisung vorgestellt.
&#160;
Auf die Property kann nicht direkt zugegriffen werden. Stattdessen wird der Property ExecValueVariable eine Package-Variable zugeordnet. In [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt einen einfachen Weg um festzustellen, wieviele Zeilen von der Ausführung von SQL-Anweisungen wie DELETE oder UPDATE mit dem Execute-SQL-Task betroffen sind. Dazu kann die ExecutionValue-Property des Execute-SQL-Tasks verwendet werden. Das wird hier am Beispiel einer DELETE-Anweisung vorgestellt.<span id="more-583"></span></p>
<p>&#160;</p>
<p>Auf die Property kann nicht direkt zugegriffen werden. Stattdessen wird der Property ExecValueVariable eine Package-Variable zugeordnet. In diese wird dann zur Laufzeit des Paketes die Anzahl der Zeilen, die von der ausgeführten SQL-Anweisung betroffen waren, eingetragen. Diese Variable kann im weiteren Package-Ablauf verwendet werden. Für die Anzahl der Zeilen wird eine Int-Variabel verwendet, die in disem Beispiel iExecValue genannt wird.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/ExecutionValue-beim-Execute-SQL-Task-in-_A742/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/ExecutionValue-beim-Execute-SQL-Task-in-_A742/image_thumb.png" width="430" height="107" /></a></p>
<p>&#160;</p>
<p>Als nächstes wird ein Execute-SQL-Task erstellt, der die Beispiel-Tabelle Example mittels einer DELETE-Anweisung leert. Die Tabelle enthält 3 Datensätze und somit erwarten wir die Zahl 3 als Anzahl der betroffenen Zeilen. Im Editor des Tasks wird die Connection ausgewählt und die Anweisung „DELETE FROM Example“ als Direkteingabe eingegeben.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/ExecutionValue-beim-Execute-SQL-Task-in-_A742/image_3.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/ExecutionValue-beim-Execute-SQL-Task-in-_A742/image_thumb_3.png" width="511" height="435" /></a></p>
<p>&#160;</p>
<p>Durch Rechtsklick auf den Task und Auswahl von „Eigenschaften“ wird der Eigenschaften-Editor des Tasks geöffnet. Da wird der Property ExecValueVariable über die Dropdpwn-Liste die vorher angelegte Variabel iExecValue aus. </p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/ExecutionValue-beim-Execute-SQL-Task-in-_A742/image_4.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/ExecutionValue-beim-Execute-SQL-Task-in-_A742/image_thumb_4.png" width="337" height="515" /></a></p>
<p>&#160;</p>
<p>Um nach Start des Paketes das Ergebnis zu prüfen, setzen wir einen Breakpoint auf das PostExecute-Ereignis des Tasks (Rechtsklick auf den Task, Haltepunkte bearbeiten wählen und dann den Eintrag für „OnPostExecute“ anhaken). Damit kann direkt nach Ausführung des SQL-Tasks geprüft werden, ob die Variable tatsächlich die gewünschte Anzahl der betroffenen Zeilen enthält.</p>
<p>&#160;</p>
<p>Anschließende wird das Paket ausgeführt. Bei Erreichen des Breakpoints fügen wir über Debuggen-&gt;Fenster-&gt;Überwachungsfenster1. Dort tippen wir in die Namensspalte den Namen unserer Variabel ein. Anschließend sehen wir, dass unsere Variable tatsächlich die Anzahl der von der SQL-Anweisung betroffenen Zeilen enthält:</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/ExecutionValue-beim-Execute-SQL-Task-in-_A742/image_5.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/ExecutionValue-beim-Execute-SQL-Task-in-_A742/image_thumb_5.png" width="526" height="174" /></a>#</p>
<p>&#160;</p>
<p>Es kann auch eine Stored Procedure aufgerufen werden, die wie in unserem Beispiel eine DELETE-Anweisung ausführt. In der Stored Procedure darf dann nicht SET NOCOUNT ON“ verwenden, da dann die Zahl der betroffenen Zeilen nicht ermittelt wird.</p>
<p>&#160;</p>
<p>In dem Beispiel kann TRUNCATE nicht verwendet werden, da bei TRUNCATE nicht zeilenweise gelöscht wird, wie bei DELETE. Bei TRUNCATE werden stattdessen die Datenseiten der betroffenen Tabelle deallokiert. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2008/integration-services-2008/executionvalue-beim-execute-sql-task-in-ssis-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kostenstellenhierarchie, Kostenartenhierarchie, Profitcenterhierarchie aus SAP ERP im SQL Server auswerten</title>
		<link>http://www.ixto.de/blog/allgemein/kostenstellenhierarchie-kostenartenhierarchie-profitcenterhierarchie-aus-sap-erp-im-sql-server-auswerten/</link>
		<comments>http://www.ixto.de/blog/allgemein/kostenstellenhierarchie-kostenartenhierarchie-profitcenterhierarchie-aus-sap-erp-im-sql-server-auswerten/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 14:55:16 +0000</pubDate>
		<dc:creator>Christopher Glomb</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Kostenartenhierarchie]]></category>
		<category><![CDATA[Kostenstellenhierarchie]]></category>
		<category><![CDATA[Profitcenterhierarchie]]></category>
		<category><![CDATA[SAP ERP im SQL Server]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=573</guid>
		<description><![CDATA[In diesem Blogbeitrag möchte ich am Beispiel der Kostenstellengruppen zeigen, wie es möglich ist, die Zusammenhänge von SAP-Datenstrukturen zu erkennen und auf Grundlage dieser Erkenntnisse die Daten so zusammen zu führen, um sie für die Aufbereitung eines Datawarehouse nutzen zu können.         
Vorab exemplarisch die Struktur,&#160; wie in [...]]]></description>
			<content:encoded><![CDATA[<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><font face="Calibri"><font style="font-size: 11pt"><font size="2" face="Verdana">In diesem Blogbeitrag möchte ich am Beispiel der Kostenstellengruppen zeigen, wie es möglich ist, die Zusammenhänge von SAP-Datenstrukturen zu erkennen und auf Grundlage dieser Erkenntnisse die Daten so zusammen zu führen, um sie für die Aufbereitung eines Datawarehouse nutzen zu können.</font></font>      <span id="more-573"></span>   </font></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify">Vorab exemplarisch die Struktur,<span style="mso-spacerun: yes">&#160; </span>wie in SAP die Darstellung der Kostenstellgruppen aussieht:</p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_thumb.png" width="211" height="244" /></a></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><span style="mso-fareast-language: de; mso-no-proof: yes"></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify">Zunächst habe ich die betroffenen Tabellen (SETHEADER, SETHEADERT, SETNODE und SETLEAF) in eine SQL Server Datenbank importiert. SETHEADER enthält den Topknoten. Hier erhält man über den Wert in Settype die Information, ob der Oberknoten (parent) weitere Subknoten (childs) besitzt. Ist dies der Fall, signalisiert das der Buchstabe S. Wenn es keine Subknoten gibt, steht für settype ein B. Über den Wert in SETCLASS kann man die Suchergebnisse einschränken. Für die Kostenstellengruppe wählt man 0101, Kostenartengruppen = 0102 und Profit-Center-Gruppen = 0106.</p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><font face="Calibri"><span style="color: ; mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font color="#0000ff">SELECT</font></span><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"> <span style="color: "><font color="#0000ff">DISTINCT</font></span></span></font></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><font face="Calibri"><span style="color: ; mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><span style="mso-spacerun: yes"><font color="#0000ff">&#160;&#160;&#160;&#160;&#160; </font></span></span><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><span style="mso-spacerun: yes">&#160;</span><span style="color: "><font color="#008080">[SAP_SETHEADER]</font></span><span style="color: "><font color="#808080">.</font></span><font color="#008080"><span style="color: ">[MANDT]</span><span style="color: "></span></font></span></font></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[SAP_SETHEADER]</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SETCLASS]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[SAP_SETHEADER]</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SUBCLASS]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[SAP_SETHEADER]</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SETNAME]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[SETTYPE]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[CREDATE]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[CRETIME]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[UPDUSER]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[UPDDATE]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[UPDTIME]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[SAPRL]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[TABNAME]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[FIELDNAME]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[ROLLNAME]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[DESCRIPT]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#0000ff">FROM</font></span> <span style="color: "><font color="#008080">[sap_demo_cgl]</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[dbo]</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SAP_SETHEADER]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">INNER</font></span> <span style="color: "><font color="#808080">JOIN</font></span> <span style="color: "><font color="#008080">SAP_SETHEADERT</font></span> <span style="color: "><font color="#0000ff">ON</font></span> <span style="color: "><font color="#008080">SAP_SETHEADER</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> <span style="color: "><font color="#008080">SAP_SETHEADERT</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETNAME</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#0000ff">where</font></span> <span style="color: "><font color="#008080">SAP_SETHEADER</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> <span style="color: "><font color="#ff0000">&#8216;C1&#8242;</font></span></font></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><span style="line-height: 12pt; mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Calibri"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">AND</font></span> <span style="color: "><font color="#008080">SAP_SETHEADER</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETCLASS</font></span> <span style="color: "><font color="#808080">=</font></span> 0101</font></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_3.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_thumb_3.png" width="550" height="63" /></a></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><span style="mso-fareast-language: de; mso-no-proof: yes"></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify">Anmerkung: Den join auf SETHEADERT führe ich durch, damit ich den genauen Namen der Kostenstellengruppe erhalte.</p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify">Möchte man nun mehr über die Subknoten erfahren, begibt man sich mit dem Wert aus Setname in die Tabelle SETNODE.</p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_4.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_thumb_4.png" width="563" height="384" /></a></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><span style="mso-fareast-language: de; mso-no-proof: yes"></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify">Das Ergebnis zeigt, dass es für diesen Knoten weitere Subknoten (SUBSETNAME) gibt. Man kann nun entweder in die Tabelle SETHEADER gehen und dort überprüfen ob es weitere Subknoten für den SUBSETNAME gibt, oder man ändert einfach den Wert aus der vorherigen Abfrage.</p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><font face="Courier New"><span style="font-family: ; color: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font color="#0000ff">SELECT</font></span><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"> <span style="color: "><font color="#0000ff">DISTINCT</font></span> </span></font></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1">&#160;&#160;&#160;&#160;&#160; </span><span style="mso-spacerun: yes">&#160;</span><span style="color: "><font color="#008080">SAP_SETNODE</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[MANDT]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">SAP_SETNODE</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SETCLASS]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">SAP_SETNODE</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SUBCLASS]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">SAP_SETNODE</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SETNAME]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[LINEID]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[SUBSETCLS]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[SUBSETSCLS]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[SUBSETNAME]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[SEQNR]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">[DESCRIPT]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#0000ff">FROM</font></span> <span style="color: "><font color="#008080">[sap_demo_cgl]</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[dbo]</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SAP_SETNODE]</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">INNER</font></span> <span style="color: "><font color="#808080">JOIN</font></span> <span style="color: "><font color="#008080">SAP_SETHEADERT</font></span> <span style="color: "><font color="#0000ff">ON</font></span> <span style="color: "><font color="#008080">SAP_SETNODE</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> <span style="color: "><font color="#008080">SAP_SETHEADERT</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETNAME</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#0000ff">WHERE</font></span> <span style="color: "><font color="#008080">SAP_SETNODE</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> <span style="color: "><font color="#ff0000">&#8216;C1200&#8242;</font></span></font></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><span style="line-height: 12pt; font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">AND</font></span> <span style="color: "><font color="#008080">SAP_SETNODE</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETCLASS</font></span> <span style="color: "><font color="#808080">=</font></span> 0101</font></span><span style="mso-ansi-language: en-us" lang="EN-US"></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><span style="mso-fareast-language: de; mso-no-proof: yes"></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_5.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_thumb_5.png" width="543" height="132" /></a></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify">Hat man die letzte Hierarchiestufe erreicht, kann man mit den Wert für SETNAME in der Tabelle SETLEAF alle SETS für die jeweilige Gruppe anzeigen lassen.</p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><span style="mso-fareast-language: de; mso-no-proof: yes"></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify">Für einen join auf die Tabelle der Kostenstellenstammsätze (CSKS) verwende ich folgendes Statement:</p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_6.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_thumb_6.png" width="368" height="62" /></a></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><span style="mso-fareast-language: de; mso-no-proof: yes"></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify">Die Kostenartenstammsätze befinden sich übrigens in der Tabelle CSKA und die Profit Center Stammdaten in der Tabelle CEPC.</p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify">Mit Hilfe eines Self-Joins kann man sich die Kostenstellenhierarchie auch übersichtlich mittels einer Abfrage anzeigen lassen.</p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_7.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_thumb_7.png" width="244" height="222" /></a></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><font face="Courier New"><span style="font-family: ; color: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font color="#0000ff"><font style="font-size: 8pt">SELECT</font></font></span><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font style="font-size: 8pt"> <span style="color: "><font color="#0000ff">DISTINCT</font></span> </font></span></font></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160;&#160; </span><span style="color: "><font color="#008080">Rootknoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SETCLASS]</font></span> <span style="color: "><font color="#0000ff">as</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#008080">Kostenstelle</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">Rootknoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SETNAME]</font></span> <span style="color: "><font color="#0000ff">as</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#008080">KST_Key_Level1</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">Level1Knoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[DESCRIPT]</font></span> <span style="color: "><font color="#0000ff">as</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#008080">KST_Name_Level1</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">Kind_1</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SETNAME]</font></span> <span style="color: "><font color="#0000ff">as</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#008080">KST_Key_Level2</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">Level2Knoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[DESCRIPT]</font></span> <span style="color: "><font color="#0000ff">as</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#008080">KST_Name_Level2</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">Kind_2</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SETNAME]</font></span> <span style="color: "><font color="#0000ff">as</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#008080">KST_Key_Level3</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">Level3Knoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[DESCRIPT]</font></span> <span style="color: "><font color="#0000ff">as</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#008080">KST_Name_Level3</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">Kind_2</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SUBSETNAME]</font></span> <span style="color: "><font color="#0000ff">as</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#008080">KST_Key_Level3</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">Level4Knoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[DESCRIPT]</font></span> <span style="color: "><font color="#0000ff">as</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#008080">KST_Name_Level4</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span></font><span style="color: "><font style="font-size: 8pt" color="#008080">VALFROM</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span></font><span style="color: "><font style="font-size: 8pt" color="#008080">VALTO</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">SAP_CSKS</font></span><span style="color: "><font color="#808080">.</font></span></font><span style="color: "><font style="font-size: 8pt" color="#008080">KOKRS</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-tab-count: 1"><font style="font-size: 8pt">&#160;&#160;&#160;&#160;&#160;&#160; </font></span><font style="font-size: 8pt"><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#808080">,</font></span><span style="color: "><font color="#008080">SAP_CSKS</font></span><span style="color: "><font color="#808080">.</font></span></font><span style="color: "><font style="font-size: 8pt" color="#008080">KOSTL</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; color: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><font style="font-size: 8pt" color="#008080">&#160;</font></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><span style="mso-spacerun: yes"><font face="Courier New"><font style="font-size: 8pt">&#160;</font></font></span></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#0000ff">FROM</font></span><span style="mso-spacerun: yes">&#160;&#160; </span><span style="color: "><font color="#008080">[sap_demo_cgl]</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[dbo]</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">[SAP_SETNODE]</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#008080">Rootknoten</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#808080">INNER</font></span> <span style="color: "><font color="#808080">JOIN</font></span> <span style="color: "><font color="#008080">dbo</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SAP_SETNODE</font></span> <span style="color: "><font color="#008080">Kind_1</font></span> <span style="color: "><font color="#0000ff">on</font></span> <span style="color: "><font color="#008080">Rootknoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SUBSETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> <span style="color: "><font color="#008080">Kind_1</font></span><span style="color: "><font color="#808080">.</font></span></font><span style="color: "><font style="font-size: 8pt" color="#008080">SETNAME</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#808080">INNER</font></span> <span style="color: "><font color="#808080">JOIN</font></span> <span style="color: "><font color="#008080">dbo</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SAP_SETNODE</font></span> <span style="color: "><font color="#008080">Kind_2</font></span> <span style="color: "><font color="#0000ff">on</font></span> <span style="color: "><font color="#008080">Kind_1</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SUBSETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> <span style="color: "><font color="#008080">Kind_2</font></span><span style="color: "><font color="#808080">.</font></span></font><span style="color: "><font style="font-size: 8pt" color="#008080">SETNAME</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#808080">INNER</font></span> <span style="color: "><font color="#808080">JOIN</font></span> <span style="color: "><font color="#008080">dbo</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SAP_SETLEAF</font></span><span style="mso-spacerun: yes">&#160; </span><span style="color: "><font color="#0000ff">on</font></span> <span style="color: "><font color="#008080">Kind_2</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SUBSETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> <span style="color: "><font color="#008080">dbo</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SAP_SETLEAF</font></span><span style="color: "><font color="#808080">.</font></span></font><span style="color: "><font style="font-size: 8pt" color="#008080">SETNAME</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#808080">INNER</font></span> <span style="color: "><font color="#808080">JOIN</font></span> <span style="color: "><font color="#008080">dbo</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SAP_SETHEADERT</font></span> <span style="color: "><font color="#008080">Level1Knoten</font></span> <span style="color: "><font color="#0000ff">on</font></span> <span style="color: "><font color="#008080">Rootknoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> <span style="color: "><font color="#008080">Level1Knoten</font></span><span style="color: "><font color="#808080">.</font></span></font><span style="color: "><font style="font-size: 8pt" color="#008080">SETNAME</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#808080">INNER</font></span> <span style="color: "><font color="#808080">JOIN</font></span> <span style="color: "><font color="#008080">dbo</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SAP_SETHEADERT</font></span> <span style="color: "><font color="#008080">Level2Knoten</font></span> <span style="color: "><font color="#0000ff">on</font></span> <span style="color: "><font color="#008080">Kind_1</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> <span style="color: "><font color="#008080">Level2Knoten</font></span><span style="color: "><font color="#808080">.</font></span></font><span style="color: "><font style="font-size: 8pt" color="#008080">SETNAME</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#808080">INNER</font></span> <span style="color: "><font color="#808080">JOIN</font></span> <span style="color: "><font color="#008080">dbo</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SAP_SETHEADERT</font></span> <span style="color: "><font color="#008080">Level3Knoten</font></span> <span style="color: "><font color="#0000ff">on</font></span> <span style="color: "><font color="#008080">Kind_2</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> <span style="color: "><font color="#008080">Level3Knoten</font></span><span style="color: "><font color="#808080">.</font></span></font><span style="color: "><font style="font-size: 8pt" color="#008080">SETNAME</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#808080">INNER</font></span> <span style="color: "><font color="#808080">JOIN</font></span> <span style="color: "><font color="#008080">dbo</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SAP_SETHEADERT</font></span> <span style="color: "><font color="#008080">Level4Knoten</font></span> <span style="color: "><font color="#0000ff">on</font></span> <span style="color: "><font color="#008080">Kind_2</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SUBSETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> <span style="color: "><font color="#008080">Level4Knoten</font></span><span style="color: "><font color="#808080">.</font></span></font><span style="color: "><font style="font-size: 8pt" color="#008080">SETNAME</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#808080">INNER</font></span> <span style="color: "><font color="#808080">JOIN</font></span> <span style="color: "><font color="#008080">dbo</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SAP_CSKS</font></span> <span style="color: "><font color="#0000ff">on</font></span> <span style="color: "><font color="#008080">SAP_CSKS</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">KOSTL</font></span> <span style="color: "><font color="#808080">between</font></span> <span style="color: "><font color="#008080">valfrom</font></span> <span style="color: "><font color="#808080">and</font></span> <span style="color: "><font color="#008080">valto</font></span> </font></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><span style="mso-spacerun: yes"><font face="Courier New"><font style="font-size: 8pt">&#160;</font></font></span></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#0000ff">WHERE</font></span> </font></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#008080">Rootknoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">SETNAME</font></span> <span style="color: "><font color="#808080">=</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#ff0000">&#8216;C1&#8242;</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#808080">AND</font></span> <span style="color: "><font color="#008080">Level1Knoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">LANGU</font></span> <span style="color: "><font color="#808080">=</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#ff0000">&#8216;Z&#8217;</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#808080">AND</font></span> <span style="color: "><font color="#008080">Level2Knoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">LANGU</font></span> <span style="color: "><font color="#808080">=</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#ff0000">&#8216;Z&#8217;</font></span></font></span></p>
<p style="line-height: normal; margin: 0cm 0cm 0pt; text-autospace: ; mso-layout-grid-align: none" class="MsoNormal"><span style="font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><font face="Courier New"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span><font style="font-size: 8pt"><span style="color: "><font color="#808080">AND</font></span> <span style="color: "><font color="#008080">Level3Knoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">LANGU</font></span> <span style="color: "><font color="#808080">=</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#ff0000">&#8216;Z&#8217;</font></span></font></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><font face="Courier New"><span style="line-height: 9pt; font-family: ; mso-no-proof: yes; mso-ansi-language: en-us" lang="EN-US"><span style="mso-spacerun: yes"><font style="font-size: 8pt">&#160; </font></span></span><font style="font-size: 8pt"><span style="line-height: 9pt; font-family: ; color: ; mso-no-proof: yes"><font color="#808080">AND</font></span></font><span style="line-height: 9pt; font-family: ; mso-no-proof: yes"><font style="font-size: 8pt"> <span style="color: "><font color="#008080">Level4Knoten</font></span><span style="color: "><font color="#808080">.</font></span><span style="color: "><font color="#008080">LANGU</font></span> <span style="color: "><font color="#808080">=</font></span> </font><span style="color: "><font style="font-size: 8pt" color="#ff0000">&#8216;Z&#8217;</font></span></span></font><span style="line-height: 9pt; mso-fareast-language: de; mso-no-proof: yes"></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><span style="mso-fareast-language: de; mso-no-proof: yes"></span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify"><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_8.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Kostenstellenhierarchie-Kostenartenhiera_EC8E/image_thumb_8.png" width="568" height="220" /></a></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify">Hier kann man sehr schön sehen, dass die Kostenstellengruppe C1 (KST_KEY_Level1) die Gruppe C1000 (KST_Key_Level2) enthält, welche u.a. die Gruppen C1200, C1300 und C1400 (KST_Key_Level3) besitzt.<span style="mso-spacerun: yes">&#160; </span></p>
<p style="line-height: 13pt; margin: 0cm 0cm 10pt" class="MsoNormal" align="justify">Ich habe die Description Language eingeschränkt, damit mir die japanischen und russischen Erklärungen nicht angezeigt werden. Beachten Sie bitte, dass eine Kostenstellengruppe mit obiger Abfrage allerdings auch nicht angezeigt wird, wenn die gewählte Sprache für eine Kostenstellengruppe in der Tabelle SETHEADERT nicht vorhanden ist.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/allgemein/kostenstellenhierarchie-kostenartenhierarchie-profitcenterhierarchie-aus-sap-erp-im-sql-server-auswerten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pr&#252;fung auf Nachkommastellen bei Importen (SSIS)</title>
		<link>http://www.ixto.de/blog/allgemein/prfung-auf-nachkommastellen-bei-importen-ssis/</link>
		<comments>http://www.ixto.de/blog/allgemein/prfung-auf-nachkommastellen-bei-importen-ssis/#comments</comments>
		<pubDate>Mon, 30 May 2011 16:07:57 +0000</pubDate>
		<dc:creator>Ricardo Radke</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Integration Services 2005]]></category>
		<category><![CDATA[Integration Services 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=549</guid>
		<description><![CDATA[Es gibt Mittel und Wege, Gültigkeitsprüfungen für Gleitkommazahlen innerhalb der Integration Services zu realisieren. Die Überlegungen zum Vorgehen können dabei von einfachen Konvertierungen bis hin zu komplexen Script-Tasks reichen.    

In diesem Beitrag möchte ich eine Möglichkeit erläutern, die so simpel ist, dass der ein oder andere vielleicht gar nicht erst daran gedacht [...]]]></description>
			<content:encoded><![CDATA[<p>Es gibt Mittel und Wege, Gültigkeitsprüfungen für Gleitkommazahlen innerhalb der Integration Services zu realisieren. Die Überlegungen zum Vorgehen können dabei von einfachen Konvertierungen bis hin zu komplexen Script-Tasks reichen.    </p>
<p></br>
<p>In diesem Beitrag möchte ich eine Möglichkeit erläutern, die so simpel ist, dass der ein oder andere vielleicht gar nicht erst daran gedacht hat – frei nach dem Motto: „Ich seh‘ den Wald vor lauter Bäumen nicht“.    </p>
<p> <span id="more-549"></span> <br /></br>  Nehmen wir an, es handelt sich bei unserer Zahl um einen Prozentwert, dessen Anzahl der Nachkommastellen wir auf 5 begrenzen und im Falle der Überschreitung einen Fehler ausgeben lassen wollen (z.B. wenn die Zielspalte in der Datenbank nicht mehr als 5 zulässt). Dies würde sich zwar mit einfachen Mitteln realisieren lassen, jedoch unter Umständen nicht immer zum gewünschten Ergebnis führen.    </p>
<p></br>Angenommen es handelt sich um den Wert <i>12,12345<b>00 </b></i>– so würden die beiden letzten Nachkommastellen nach „Schema-F“ abgeschnitten und ein Fehler erzeugt werden. Da es sich in diesem Falle aber um das Abschneiden von lediglich zwei nullen handelt und somit der numerische Wert trotzdem unverändert und somit gültig bleibt, muss hier eine andere Lösung her.     </p>
<p></br>
<p>Wie? Ganz einfach! Man vergleiche die Zahl mit sich selbst – und zwar konvertiert in einen Gleitkommawert mit 5, sowie mit 6 Nachkommastellen. Das ganze könnte dann z.B. so aussehen:    </p>
<p></br><i>(DT_NUMERIC, 10, 5)Wert == (DT_NUMERIC, 10, 6)Wert      <br /></i></p>
<p></br>
<p>Die folgende Abbildung sollte das Prinzip noch einmal veranschaulichen und weitere Erläuterungen überflüssig machen <img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smiley" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Prfung-auf-Nachkommastellen-bei-Importen_FE03/wlEmoticon-smile.png" />     </p>
<p></br><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Prfung-auf-Nachkommastellen-bei-Importen_FE03/ssis_conversion.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="ssis_conversion" border="0" alt="ssis_conversion" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Prfung-auf-Nachkommastellen-bei-Importen_FE03/ssis_conversion_thumb.png" width="494" height="263" /></a></p>
<p></br></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/allgemein/prfung-auf-nachkommastellen-bei-importen-ssis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSIS 2005 Suche-Task &#8211; Wo ist meine Spalte?</title>
		<link>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/ssis-2005-suche-task-wo-ist-meine-spalte/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/ssis-2005-suche-task-wo-ist-meine-spalte/#comments</comments>
		<pubDate>Thu, 21 Apr 2011 09:12:00 +0000</pubDate>
		<dc:creator>Martin Ihrke</dc:creator>
				<category><![CDATA[Integration Services 2005]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=531</guid>
		<description><![CDATA[Wenn kleine Buchstaben groß sein sollten…
Es gibt Bugs, die sind, wenn man sie denn kennt und zu umschiffen weiß, eher amüsant als ärgerlich. Zumeist sind sie längst bekannt und zaubern ein Lächeln ins Gesicht des Eingeweihten, wenn er diesem beim Entwickeln einmal mehr begegnet. Und doch kann es passieren, dass sich ein solcher Bug eben [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn kleine Buchstaben groß sein sollten…</p>
<p>Es gibt Bugs, die sind, wenn man sie denn kennt und zu umschiffen weiß, eher amüsant als ärgerlich. Zumeist sind sie längst bekannt und zaubern ein Lächeln ins Gesicht des Eingeweihten, wenn er diesem beim Entwickeln einmal mehr begegnet. Und doch kann es passieren, dass sich ein solcher Bug eben doch nicht überall herumgesprochen hat, was dann oftmals zu Unmut und Verwirrung führt.</p>
<p><span id="more-531"></span></p>
<p>Ein Klassiker dieser Art ist der Suche-Task der Integration Services 2005 in deutscher Sprachversion. Dieser birgt nämlich einen gemeinen Fallstrick, der oft zu wirren ETL-Paketen führt, wenn man auch nur einen einzigen Mausklick vergisst. Der Sachverhalt ist folgender: Nach erfolgter Definition der Spalten-Zuordnungen für die Übereinstimmungsbedingungen und Auswahl der entsprechenden Spalten in der Verweistabelle vergisst der Task anscheinend seine Konfiguration der Spalten, nachdem man die Einstellungen mit OK bestätigt und sich der Dialog schließt. Konkret könnte das Ganze ungefähr so ausschauen:<br />
<a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/d5a1a692fe72_9D69/clip_image002.jpg"><img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="clip_image002" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/d5a1a692fe72_9D69/clip_image002_thumb.jpg" border="0" alt="clip_image002" width="223" height="244" /></a></p>
<p>Nach dem Bestätigen verschwindet aber die eben neu hinzugefügte Spalten wie von Geisterhand wieder:</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/d5a1a692fe72_9D69/clip_image004.jpg"><img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="clip_image004" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/d5a1a692fe72_9D69/clip_image004_thumb.jpg" border="0" alt="clip_image004" width="244" height="233" /></a></p>
<p>Auch nach erneutem Öffnen des Konfigurationsdialogs hat es den Anschein, als wäre hier niemals etwas eingestellt worden. Die eingangs erwähnten wirren ETL-Pakete entstehen nun durch den Workaround, dass man eine oder mehrere Spalten vorher angelegt, etwas durch den Abgeleitete Spalte-Task, und in der Suche diese mit dem nachgeschlagenen Wert überschreibt. Dies funktioniert nämlich anstandslos.</p>
<p>Dabei gibt es einen viel effektiveren Weg, an seine Nachschlage-Spalten zu kommen: ein Mausklick an der richtigen Stelle im Konfigurationsdialog. Der entscheidende Punkt ist nämlich die Dropdown-Box „Suchvorgang“. Der aufmerksame Entwickler sieht den Unterschied: Hier gibt es die Option „Als neue Spalte hinzufügen“ mit einem großen A an erster Stelle. Die Standard-Auswahl beginnt mit einem kleinen A:</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/d5a1a692fe72_9D69/clip_image006.jpg"><img style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="clip_image006" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/d5a1a692fe72_9D69/clip_image006_thumb.jpg" border="0" alt="clip_image006" width="223" height="244" /></a></p>
<p>Und dies ist auch schon des Rätsels Lösung: wenn man sich nun die einzig auswählbare Option entscheidet, klappt es mit der neuen Spalte ohne Probleme. Offensichtlich haben die Integration Services hier Probleme mit den angebotenen Optionen dieses Dialogs und der erlaubten Auswahl. Ein Blick auf die Metadaten beweist: die neue Spalte ist tatsächlich vorhanden:</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/d5a1a692fe72_9D69/clip_image008.jpg"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="clip_image008" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/d5a1a692fe72_9D69/clip_image008_thumb.jpg" border="0" alt="clip_image008" width="244" height="216" /></a></p>
<p>Wohlgemerkt betrifft dies unseres Wissens nur SSIS 2005 in deutscher Sprache und könnte durch den ein oder anderen Patch in einigen Versionen auch behoben worden sein. Nichtsdestotrotz begegnen wir immernoch regelmäßig der kritischen Version und auch unter den Entwicklern hat sich das vorgestellte vorgehen noch nicht bis in die hintersten Ecken herumgesprochen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/ssis-2005-suche-task-wo-ist-meine-spalte/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Einfacher mit Performance Monitor Countern in der Leistungs&#252;berwachung arbeiten</title>
		<link>http://www.ixto.de/blog/allgemein/einfacher-mit-performance-monitor-countern-in-der-leistungsberwachung-arbeiten/</link>
		<comments>http://www.ixto.de/blog/allgemein/einfacher-mit-performance-monitor-countern-in-der-leistungsberwachung-arbeiten/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 14:42:00 +0000</pubDate>
		<dc:creator>Markus Raatz</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Leistungsüberwachung]]></category>
		<category><![CDATA[Perfmon]]></category>
		<category><![CDATA[Performance Monitor]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=528</guid>
		<description><![CDATA[Unter Windows Vista, Windows 7 und im Windows Server 2008 sieht ja die Leistungsüberwachung oder “perfmon.exe” etwas anders aus als in den vorigen Versionen. Das Tool ist aber quasi das “Schweizer Messer des Performance Tuning”, so dass man sich eigentlich nicht genug damit beschäftigen kann. Im diesem Text wollte ich nur einfach mal einige schöne [...]]]></description>
			<content:encoded><![CDATA[<p>Unter Windows Vista, Windows 7 und im Windows Server 2008 sieht ja die Leistungsüberwachung oder “perfmon.exe” etwas anders aus als in den vorigen Versionen. Das Tool ist aber quasi das “Schweizer Messer des Performance Tuning”, so dass man sich eigentlich nicht genug damit beschäftigen kann. Im diesem Text wollte ich nur einfach mal einige schöne Tricks für den einfachen Umgang mit diesem Werkzeug loswerden!</p>
<p><span id="more-528"></span><br />
<h3>Hinzufügen von Leistungsindikatoren</h3>
<p>OK, unter dem Zweig “Leistung / Überwachungstools / Leistungsüberwachung” (bzw.&#160; “Performance / Monitoring Tools / Performance Monitor”) findet sich zunächst die bekannte Sicht mit den von links nach rechts fortschreitenden, bunten Kurven. Klickt man auf den grünen Plus-Knopf, so kann man noch etliche Counter mehr hinzufügen; für uns natürlich speziell die des SQL Servers und der Analysis Services. </p>
<p>Welche man dabei wählt, ist eine im Web viel diskutierte Wissenschaft für sich; da ist noch Material für viele, viele Blog-Einträge drin! Aus Performance-Gründen macht man in der Regel zwei Dinge:</p>
<p>1. Nicht einfach alle Leistungsindikatoren wählen, wenn wir wirklich visuell etwas beobachten wollen, sondern nur 10-30 Counter, die man noch im Fenster im Auge behalten kann. </p>
<p>2. Die Leistungsüberwachung nicht auf dem Rechner laufen lassen, der überwacht wird, sondern sich mit “Leistungsindikatoren auswählen von Computer” von einem anderen Rechner aus mit dem Server verbinden:</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/96db9bbba3b9_EA2C/image.png"><img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/96db9bbba3b9_EA2C/image_thumb.png" width="244" height="131" /></a></p>
<p>Leider dauert es, sobald man das Feld mit dem Rechnernamen verlassen hat, immer einige Sekunden, bis sich die Counter-Liste darunter auf die des Remote-Servers aktualisiert hat. In dieser Zeit sieht man garnix, nicht einmal eine Sanduhr, also Geduld, bitte!</p>
<h3>Skalierung von Leistungsindikatoren</h3>
<p>Oftmals beginnt jetzt eine endlose Mühe: Die Hälfte der neuen Counter hängen ganz oben auf der “100”, die andere Hälfte krebsen bei der “0” herum, wie die folgende Abbildung beispielhaft zeigt:</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/96db9bbba3b9_EA2C/image_3.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/96db9bbba3b9_EA2C/image_thumb_3.png" width="401" height="325" /></a></p>
<p>Mit Hilfe der “Skalierung” (“Scale”) kann man das für jeden Counter individuell einstellen, im Fenster “Eigenschaften von Leistungsüberwachung” (“Performance Monitor Properties”). Ganz schön mühsam! Man kann aber auch einfach alle interessanten Counter in der unteren Liste markieren und per Rechtsklick sagen “Ausgewählte Leistungsindikatoren skalieren” (“Scale selected counters”). Schon wählt perfmon selbst eine Skalierung, die jeden Counter sinnvoll zwischen 0 und 100 platziert, etwa so:</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/96db9bbba3b9_EA2C/image_4.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/96db9bbba3b9_EA2C/image_thumb_4.png" width="403" height="327" /></a></p>
<p>Na, das sieht doch schon viel besser aus!</p>
<h3>Performance Monitor Counter speichern</h3>
<p>Nachdem man mit der Auswahl und der Skalierung der Leistungsindikatoren schon so viel Mühe gehabt hat, möchte man die Liste natürlich irgendwie “persistieren”. Sonst müsste man nach einem Abmelden oder einem Neustart die ganzen Counter neu zusammenstellen! Wie das geht, ist nicht ganz offensichtlich: man braucht wieder einen Rechtsklick auf die untere Liste, aber diesmal auswählen “Einstellungen speichern unter…” (“Save Settings As…”), und als Zielformat .html wählen!</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/96db9bbba3b9_EA2C/image_5.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/96db9bbba3b9_EA2C/image_thumb_5.png" width="356" height="143" /></a></p>
<p>Die so gewonnene Datei kann aber nicht einfach so in einen neuen perfmon wieder eingelesen werden, oh nein: man muss sie mit dem Texteditor der Wahl öffnen, den ganzen Inhalt markieren und in die Zwischenablage kopieren. Dann geht man in eine neue, ggf. noch leere Leistungsüberwachung und klickt im Menü oben auf die Taste “Leistungsindikatorenliste einfügen” (“Paste Counter List”); Strg-V tut’s auch. Das fügt die Counter aus der .html-Datei der neuen Instanz hinzu!</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/96db9bbba3b9_EA2C/image_6.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/96db9bbba3b9_EA2C/image_thumb_6.png" width="406" height="146" /></a></p>
<p>Auf diese Weise kann man sich im HTML-Format ein paar nette Listen mit Leistungsindikatoren bereithalten, die man dann an jedem neuen Server geschwind aus der Tasche zieht und anwendet. Aber Halt: der neue Server heißt ja anders! Kein Problem: wenn man beim hinzufügen der Counter brav über “Select counters from computer”, wie oben beschrieben, gearbeitet hat, dann steht der Name des Quellservers lesbar in der .html-Datei, und er kann mit Suchen und Ersetzen leicht ausgetauscht werden. </p>
<p>An dieser Stelle möchte ich mich gar nicht darüber ärgern, dass beim Betriebssystem die Namen der Counter auf deutsch übersetzt wurden (z.B. “Physikalischer Datenträger / Aktuelle Warteschlangenlänge”); bei Anwendungen wie beim SQL Server aber englisch geblieben sind. Babel, du bist nicht fern! </p>
<h3>Daten aus Leistungsindikatoren aufzeichnen lassen mit Sammlungssätzen</h3>
<p>Für den, der sich für so was interessiert, ist es spannend genug, jetzt den bunten Kurven stundenlang zu folgen, alle anderen fühlen sich an den Blick ins Glasfenster ihrer laufenden Waschmaschine erinnert und möchten die Ergebnisse gerne abspeichern, um sie an den Performance Tuner ihrer Wahl zu mailen. Dazu gibt es die &quot;Sammlungssätze”</p>
<p>(“Data Collector Sets”), eine Auswahlliste aus Countern, deren Daten dann in eine .blg-Datei geschrieben werden. Diese Dateien, die standardmäßig auf dem Systemlaufwerk im Verzeichnis /perflogs zu liegen kommen, kann man durch Doppelklick dann wieder im perfmon öffnen und inspizieren! Dumm nur, dass bei mir das unter</p>
<p><a title="http://technet.microsoft.com/en-us/library/cc722148.aspx" href="http://technet.microsoft.com/en-us/library/cc722148.aspx">http://technet.microsoft.com/en-us/library/cc722148.aspx</a> beschriebene Verfahren, wie man aus den Countern einer laufenden Leistungsüberwachung einen Sammlungssatz generiert, nicht funktioniert, auf keinem mir zur Verfügung stehen den Rechner. Wer herausfindet, wie es geht, wird herzlich um einen Kommentar gebeten! Bis dahin bleibt nur: manuell wieder zum untersuchten Server verbinden, einzeln aus der Liste heraussuchen und so weiter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/allgemein/einfacher-mit-performance-monitor-countern-in-der-leistungsberwachung-arbeiten/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Vorsicht vor BIDS2008-R2 (Textqualifier _x0222_ )</title>
		<link>http://www.ixto.de/blog/allgemein/vorsicht-vor-bids2008-r2-textqualifier-_x0222_/</link>
		<comments>http://www.ixto.de/blog/allgemein/vorsicht-vor-bids2008-r2-textqualifier-_x0222_/#comments</comments>
		<pubDate>Fri, 25 Mar 2011 13:35:05 +0000</pubDate>
		<dc:creator>Jens Consör</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=474</guid>
		<description><![CDATA[Ich dachte bisher, SSIS-Projekte, die mit BIDS-2008-Nicht-R2 erstellt wurden, lassen sich problemlos im R2-BIDS öffnen, weiterbearbeiten und dann auch unter beiden SSIS-Runtimes problemlos ausführen. Zumindest würde man (wie bei SSRS-Projekten) einen Hinweis erwarten, falls dem nicht so sein sollte. Antwort ist leider:
Es gibt Probleme, wenn man die Projekte zwischen beiden Versionen hin- und herschiebt&#8230;und die [...]]]></description>
			<content:encoded><![CDATA[<p>Ich dachte bisher, SSIS-Projekte, die mit BIDS-2008-Nicht-R2 erstellt wurden, lassen sich problemlos im R2-BIDS öffnen, weiterbearbeiten und dann auch unter beiden SSIS-Runtimes problemlos ausführen. Zumindest würde man (wie bei SSRS-Projekten) einen Hinweis erwarten, falls dem nicht so sein sollte. Antwort ist leider:</p>
<p>Es gibt Probleme, wenn man die Projekte zwischen beiden Versionen hin- und herschiebt&#8230;und die sind leider sehr versteckt!</p>
<p>  <span id="more-474"></span>
<p>Hier ein Beispiel, welches in diesen Zusammenhang die Problematiken mit Flatfile-Connection-Managern aufzeigt. Zum Nachvollziehen bitte einfach dem hier beschriebenen Ablauf folgen:     </p>
<p>SSIS-Package im BIDS-2008-Nicht-R2 öffnen:    <br />im FlatFile-ConnectionManager als Textqualifier <span style="color: #ff0000">“</span> eintragen und Paket speichern     </p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Vorsicht-vor-BIDS2008-R2-Textqualifier-__C9F7/image.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Vorsicht-vor-BIDS2008-R2-Textqualifier-__C9F7/image_thumb.png" width="471" height="483" /></a> </p>
<p>SSIS-Package im BIDS-2008-R2 öffnen:     <br />im ConnectionManager ist als Textqualifier immernoch <span style="color: #ff0000">“</span> eingetragen.     <br />jetzt OK drücken und dann speichern     </p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Vorsicht-vor-BIDS2008-R2-Textqualifier-__C9F7/image_3.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Vorsicht-vor-BIDS2008-R2-Textqualifier-__C9F7/image_thumb_3.png" width="476" height="487" /></a> </p>
<p>SSIS-Package wieder im BIDS-2008-Nicht-R2 öffnen:     <br />Jetzt steht dort <span style="color: #ff0000">_x0022_</span> direkt im Klartext als Textqualifier.     <br />( <span style="background-color: #ffffff; color: #ff0000">_x0022_</span> ist eigentlich die XML-Quellcode-Kodierung für “).     </p>
<p>Dementsprechend problematisch wird der Datei-Import über die NichtR2-SSIS-Runtime    <br />Die Anführungszeichen sind nämlich noch in allen Spalten enthalten und sämtliche Zahlen-konvertierungen schlagen fehl. Dies ist natürlich sehr schwer nachzuvollziehen, da im BIDS-R2 alles normal aussieht, man sieht das _x0022_ wirklich nur, wenn man das Paket in einem Nicht-R2-BIDS öffnet.     </p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Vorsicht-vor-BIDS2008-R2-Textqualifier-__C9F7/image_4.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Vorsicht-vor-BIDS2008-R2-Textqualifier-__C9F7/image_thumb_4.png" width="526" height="291" /></a>     </p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Vorsicht-vor-BIDS2008-R2-Textqualifier-__C9F7/image_5.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Vorsicht-vor-BIDS2008-R2-Textqualifier-__C9F7/image_thumb_5.png" width="600" height="195" /></a></p>
<p>Ich hoffe, dies kann Euch bei ähnlichen Problemstellungen helfen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/allgemein/vorsicht-vor-bids2008-r2-textqualifier-_x0222_/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Jahreswerte auf Monate verlustfrei verteilen &#8211; Teil 1</title>
		<link>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/jahreswerte-auf-monate-verlustfrei-verteilen-teil-1/</link>
		<comments>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/jahreswerte-auf-monate-verlustfrei-verteilen-teil-1/#comments</comments>
		<pubDate>Wed, 23 Feb 2011 09:15:00 +0000</pubDate>
		<dc:creator>Chris Jacob</dc:creator>
				<category><![CDATA[Integration Services 2005]]></category>
		<category><![CDATA[Integration Services 2008]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=510</guid>
		<description><![CDATA[Ich habe wieder ein schönes Beispiel gefunden an der man die Flexibilität der Integration Services demonstrieren kann. Die Aufgabe ist recht einfach: es geht darum, einen Jahreswert mit Dezimalstellen (in unserem Fall ein numeric(6,2), z.B. ein Euro-Wert) gleichmäßig auf 12 Monate zu verteilen. Die Division sollte uns hoffentlich keine Kopfschmerzen bereiten, die Herausforderung liegt darin, [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe wieder ein schönes Beispiel gefunden an der man die Flexibilität der Integration Services demonstrieren kann. Die Aufgabe ist recht einfach: es geht darum, einen Jahreswert mit Dezimalstellen (in unserem Fall ein numeric(6,2), z.B. ein Euro-Wert) gleichmäßig auf 12 Monate zu verteilen. Die Division sollte uns hoffentlich keine Kopfschmerzen bereiten, die Herausforderung liegt darin, dass unser Datentyp nur zwei Nachkommastellen erlaubt und daher viele Werte bei der Division einen Genauigkeitsverlust erleiden würden.<br />
<span id="more-510"></span><br />
Ein kurzes Beispiel: teilen wir den Wert 100,00 € durch 12 erhalten wir pro Monat einen Wert von 8,3333. € Würden wir nun 12 mal den Wert 8,33 € als Monatswert in unsere Datenbank übernehmen, würden uns über das Jahr hinweg gesehen 0,04 € fehlen. Das Ziel wäre hier, diese 4 Eurocent (also den Differenzbetrag) auf den letzten Monat aufzuschlagen.</p>
<p>&#160;</p>
<p>Das Problem begegnet uns immer dann, wenn in der Datenbank Werte in einer anderen Granularität gespeichert werden (in diesem Fall monatsgenau) als diese von der darauf aufsetzenden Anwendung geliefert werden (diese erlaubt nur jahresgenaue Werte). Für spätere Auswertungen oder Änderungen möchten wir monatsgenaue Werte speichern, ohne den korrekten Jahreswert (die Summe der 12 Monate) zu verlieren.</p>
<p>&#160;</p>
<p>Auch hier führen wieder viele Wege nach Rom, daher zeige ich im ersten Teil neben der eigentlichen Problemstellung und dem Kern der Lösung eine von vier (!) Möglichkeiten die ich gefunden habe um die Aufgabe zu lösen.</p>
<p>&#160;</p>
<p>Zunächst einmal überlege ich mir geeignete Ausdrücke um die oben genannte Anforderung innerhalb eines SSIS-Datenfluss&#8217; umsetzen zu können. Für die Monate 1 bis 11 genügt folgender Ausdruck:</p>
<p>&#160;</p>
<p><font face="Consolas">(DT_NUMERIC,6,2)(Value / 12)</font></p>
<p>&#160;</p>
<p>Der Monat 12 erfordert eine Sonderbehandlung, welche durch folgenden Ausdruck gewährleistet wird:</p>
<p>&#160;</p>
<p><font face="Consolas">(DT_NUMERIC,6,2)(Value &#8211; (DT_NUMERIC,6,2)(11 * (DT_NUMERIC,6,2)(Value / 12)))</font></p>
<p>&#160;</p>
<p>Im Grunde ermittelt dieser Ausdruck die Differenz zwischen dem Jahreswert und der Summe der 11 Monatswerte um den Wert für Monat 12 zu berechnen. Beachten Sie dabei, dass es egal ist ob bei der Ermittlung der Monatswerte ab- oder aufgerundet oder gar abgeschnitten wird (was hier der Fall ist), der Wert für Monat 12 wird stets korrekt ermittelt.</p>
<p>&#160;</p>
<p>Einer der naheliegendsten Wege um diese Logik umzusetzen ist die Nutzung eines Cross Joins zwischen dem Jahreswert und 12 Monaten. Damit wird der Jahreswert von einer Zeile auf 12 Zeilen verteilt. Anschließend kann in einem &#8220;Abgeleitete Spalte&#8221;-Task der Wert mit Hilfe der oben beschriebenen Ausdrücke manipuliert werden.</p>
<p>&#160;</p>
<p>Folgender Screenshot zeigt den Datenfluss und zwei Data Viewer: einen nach dem Cross Join und einem nach dem Anwenden der Ausdrücke. Beachten Sie, dass sich der Wert für Monat 12 von allen anderen unterscheidet um einen korrekten Jahreswert zu gewährleisten.</p>
<p>&#160;</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/cc00279c2c81_1174B/image.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/cc00279c2c81_1174B/image_thumb.png" width="572" height="291" /></a></p>
<p>&#160;</p>
<p>Im zweiten Teil zeige ich drei (!) weitere Vorgehensweisen, sowie die Ergebnisse eines Performancetests um zu ermitteln, wie sich die unterschiedlichen Wege im produktiven Einsatz bewähren könnten.</p>
<p></br></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/sql-server-2005/integration-services-2005/jahreswerte-auf-monate-verlustfrei-verteilen-teil-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.NET Excel Interop als Windows Service benutzen</title>
		<link>http://www.ixto.de/blog/allgemein/net-excel-interop-als-windows-service-benutzen/</link>
		<comments>http://www.ixto.de/blog/allgemein/net-excel-interop-als-windows-service-benutzen/#comments</comments>
		<pubDate>Wed, 12 Jan 2011 10:37:00 +0000</pubDate>
		<dc:creator>Andreas Schwarzer</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=375</guid>
		<description><![CDATA[Microsoft stellt mit den InterOp Assemblies für Office Applikationen Klassenbibliotheken zur Automation von Excel Prozessen zur Verfügung. Diese werden in der Regel dazu benutzt Excel Dateien zu lesen oder zu erzeugen.
Da es sich bei Excel jedoch nicht um eine Server Applikation für Hintergrundanwendungen handelt sind bei dem Einsatz dort einige Fallstricke zu umschiffen.
In Folge werden [...]]]></description>
			<content:encoded><![CDATA[<p>Microsoft stellt mit den InterOp Assemblies für Office Applikationen Klassenbibliotheken zur Automation von Excel Prozessen zur Verfügung. Diese werden in der Regel dazu benutzt Excel Dateien zu lesen oder zu erzeugen.</p>
<p>Da es sich bei Excel jedoch nicht um eine Server Applikation für Hintergrundanwendungen handelt sind bei dem Einsatz dort einige Fallstricke zu umschiffen.</p>
<p>In Folge werden wir einen kleinen Windows Service entwickeln, der in der Lage ist en Verzeichnis zu überwachen, Excel Dateien dort zu lesen, zu modifizieren und sie in ein Ausgabe Verzeichnis zu kopieren. Hierzu müssen Visual Studio, die Microsoft Interop Assemblies als auch Microsoft Excel auf dem Entwicklungssystem installiert sein.</p>
<p><span id="more-375"></span></p>
<h4>Erstellung des Windows Service Projektes</h4>
<p>Wir benutzen dafür die entsprechende Projektvorlage unter Visual C# / Windows</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image.png"><img title="image" width="600" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_thumb.png" border="0" alt="image" height="416" /></a></p>
<p>Zusätzlich benötigen wir die Referenz auf die entsprechende Excel Interop Assembly: Microsoft.Office.Interop.Excel (14.0.0.0).</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_3.png"><img title="image" width="600" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_thumb_3.png" border="0" alt="image" height="348" /></a></p>
<p>Nachdem Sie die automatisch generierte Service Komponente umbenannt haben, benötigen wir Routinen zur Installation des Service. Diese können am einfachsten über das Kontext Menü im Komponenten Designer erstellt werden.</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_4.png"><img title="image" width="600" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_thumb_4.png" border="0" alt="image" height="381" /></a></p>
<p>Der letzte Teil der Vorbereitungen ist die Erstellung eines Setup Projektes als Teil der Solution. Wir benutzen auch hier wieder die entsprechende Vorlage, und fügen die Primäre Ausgabe unseres Projektes hinzu. Und zum Abschuss fügen wir die Primäre Ausgabe auch noch einmal zu den Benutzerdefinierten Aktionen hinzu, um die weiter oben bereits generierten Installations Routinen für den Service auch während des Setups ausführen zu lassen.</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_5.png"><img title="image" width="600" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_thumb_5.png" border="0" alt="image" height="290" /></a></p>
<p>Für die Deinstallation muss diese Aktion natürlich auch ausgeführt werden.</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_6.png"><img title="image" width="429" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_thumb_6.png" border="0" alt="image" height="248" /></a></p>
<h4>Implementierung der Logik</h4>
<p>Nachdem wir nun alle Vorbereitungen getroffen haben können wir nun zu dem interessanterem Teil der Entwicklung kommen.</p>
<p>Da der Service als Hintergrund Applikation laufen soll erstellen wir einen Service Loop mittels eines Threads den wir starten und stoppen können. Wir wechseln hierzu in die Code Ansicht unserer Service Komponente, und implementieren den Rumpf dieser Schleife.</p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">public</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">partial</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">class</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">BlogExcelService</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> : </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">ServiceBase</span></span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> {</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">private</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">bool</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> ServiceShouldRun { </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">get</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">; </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">set</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">; }</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"><span style="font-family: Consolas;"> </span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">private</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">Thread</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> ServiceRunner { </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">get</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">; </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">set</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">; }</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"><span style="font-family: Consolas;"> </span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">public</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> BlogExcelService()</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> {</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> InitializeComponent();</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> }</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"><span style="font-family: Consolas;"> </span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">protected</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">override</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">void</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> OnStart(</span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">string</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">[] args)</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> {</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> ServiceRunner = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">new</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">Thread</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">(</span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">new</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">ThreadStart</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">(ServiceLoop));</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> ServiceShouldRun = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">true</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">;</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> ServiceRunner.Start();</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> }</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"><span style="font-family: Consolas;"> </span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">protected</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">override</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">void</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> OnStop()</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> {</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">if</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> (ServiceRunner != </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">null</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> &amp;&amp; ServiceShouldRun &amp;&amp; ServiceRunner.IsAlive)</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> {</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> ServiceShouldRun = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">false</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">;</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> ServiceRunner.Join(10000);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> }</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> }</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"><span style="font-family: Consolas;"> </span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">protected</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">void</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> ServiceLoop()</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;">{</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"> </span><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"><span style="color: #0000ff;">while</span></span><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"> (ServiceShouldRun)</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"><span style="font-family: Consolas;"> {</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"> </span><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"><span style="color: #2b91af;">Thread</span></span><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;">.Sleep(3000);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"><span style="font-family: Consolas;"> }</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"><span style="font-family: Consolas;"> }</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"><span style="font-family: Consolas;"> }</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"><span style="font-family: Consolas;"> </span></span></p>
<p>Die eigentliche Implementierung unserer wiederkehrenden Aufgaben können wir nun innerhalb der Methode ServiceLoop implementieren. D.h. als erstes selektieren wir alle Excel Dateien im Eingangsverzeichnis, und bewegen sie in ein Bearbeitungsverzeichnis. Dort werden diese Dateien geöffnet, ein neues Blatt eingefügt und nach dem Speichern in das Ausgabeverzeichnis verschoben.</p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">protected</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">void</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> HandleNewFiles()</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> {</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">var</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> inputDirectory = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">new</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">DirectoryInfo</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">(</span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">Settings</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">.Default.InputPath);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">foreach</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> (</span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">var</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> file </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">in</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> inputDirectory.GetFiles(</span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #a31515;">&#8220;*.xlsx&#8221;</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">))</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> {</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">var</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> tempFilename = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">Settings</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">.Default.TempPath + </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #a31515;">@&#8221;\&#8221;</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> + file.Name;</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">var</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> outputFilename = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">Settings</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">.Default.OutputPath + </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #a31515;">@&#8221;\&#8221;</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> + file.Name;</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> file.MoveTo(tempFilename);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">var</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> tempFile = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">new</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">FileInfo</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">(tempFilename);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> EditFile(tempFile);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> tempFile.MoveTo(outputFilename);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> }</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> }</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"><span style="font-family: Consolas;"> </span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">protected</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">void</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> EditFile (</span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">FileInfo</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> f)</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> {</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">var</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> excelApp = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">new</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">Application</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">() {DisplayAlerts = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">false</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">, Visible = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">false</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">};</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">var</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> workbook = excelApp.Workbooks.Open(f.FullName);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">var</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> sheet    = workbook.Sheets.Add() </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">as</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">Worksheet</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">;</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #0000ff;">var</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> cell     = sheet.Range[</span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #a31515;">"A1"</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">];</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"><span style="font-family: Consolas;"> </span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> sheet.Name   = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #a31515;">&#8220;ExcelService&#8221;</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">;</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> cell.Value2  = </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #a31515;">&#8220;Hello World&#8221;</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">;</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"><span style="font-family: Consolas;"> </span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> workbook.Save();</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> workbook.Close();</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"><span style="font-family: Consolas;"> </span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Consolas;"> excelApp.Quit();</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="mso-spacerun: yes;"><span style="font-family: Consolas;"> </span></span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">Marshal</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">.FinalReleaseComObject(cell);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">Marshal</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">.FinalReleaseComObject(sheet);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">Marshal</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">.FinalReleaseComObject(workbook);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="color: #2b91af;">Marshal</span></span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">.FinalReleaseComObject(excelApp);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"> </span><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;">}</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; background: white; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt;"><span style="font-family: Consolas;"></span></p>
<p>Da wir uns in einem lang laufendem Prozess befinden, ist es notwendig die über Interop verbunden COM Objekte wieder frei zu geben, da diese sonst Memory Leaks oder verwaiste Excel Prozesse hinterlassen können. Dieses erreichen wir über die Aufrufe am Ende der Edit File Methode.</p>
<p>Zum Debuggen verfügt Visual Studio leider über keinen direkten Start Typen für unser Projekt, d.h. wir werden uns mit einem kleinem Umweg dorthin begeben müssen. Wir installieren als erstes den Service über das Kontextmenü des Setup Projektes.</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_7.png"><img title="image" width="509" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_thumb_7.png" border="0" alt="image" height="509" /></a></p>
<p>Dabei müssen während der Installation auch die Zugangsdaten des Ausführenden Benutzers übergeben werden. Während der Entwicklung benutzt man entweder schon das Zielkonto oder das eigene. Die Berechtigungen dieses Benutzers werden benötigt um Verzeichnisse zugreifbar zu machen oder Datenbankverbindungen zu autorisieren.</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_8.png"><img title="image" width="469" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_thumb_8.png" border="0" alt="image" height="387" /></a></p>
<p>Nachdem wir den Service über die Service Console gestartet haben verbinden wir uns mit dem Dienstprozess aus Visual Studio heraus.</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_9.png"><img title="image" width="600" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_thumb_9.png" border="0" alt="image" height="438" /></a></p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_10.png"><img title="image" width="600" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_thumb_10.png" border="0" alt="image" height="408" /></a></p>
<p>Jetzt sind wir in der Lage unseren Service zu debuggen, und stoßen auf einen Fallstrick:</p>
<p>Sobald wir eine Excel Arbeitsmappe im Input Verzeichnis hinterlegen kommt es zu folgender Fehlermeldung:</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_11.png"><img title="image" width="538" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_thumb_11.png" border="0" alt="image" height="262" /></a></p>
<p>Der Service wird zwar mit den Berechtigungen des eingegebenen Benutzerkontos ausgeführt, jedoch wird das System Profil als Umgebung geladen. Da Excel ein Benutzerapplikation ist setzt sie auch ein Desktopverzeichnis im Profil voraus, jedoch besitzen weder Windows 2008 und Windows 7 diese standardmäßig im Profil.</p>
<p>Erzeugen Sie je nach Plattform folgende Verzeichnisse:</p>
<table class="MsoTableGrid" style="border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes;">
<td width="65" style="padding-bottom: 0cm; padding-left: 5.4pt; padding-right: 5.4pt; padding-top: 0cm; mso-border-alt: solid windowtext .5pt; border: windowtext 1pt solid;" valign="top">
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt;"><span style="font-family: Calibri;"><span style="font-size: 11pt;">32-bit</span></span></p>
</td>
<td width="570" style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; padding-right: 5.4pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid; padding-top: 0cm; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt;" valign="top">
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt;"><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;"><span style="font-family: Arial;">%WinDir%\SysWOW64\config\systemprofile\Desktop</span></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 1; mso-yfti-lastrow: yes;">
<td width="65" style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; padding-bottom: 0cm; padding-left: 5.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt;" valign="top">
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt;"><span style="font-family: Calibri;"><span style="font-size: 11pt;">64-bit</span></span></p>
</td>
<td width="570" style="border-bottom: windowtext 1pt solid; border-left: medium none; padding-bottom: 0cm; padding-left: 5.4pt; padding-right: 5.4pt; border-top: medium none; border-right: windowtext 1pt solid; padding-top: 0cm; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt;" valign="top">
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt;"><span style="font-family: Calibri;"><span style="font-size: 11pt;">%WinDir%</span></span><span style="font-family: Arial;"><span style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;;">\Sy</span><span lang="EN-US" style="mso-fareast-font-family: &amp;#39;Times New Roman&amp;#39;; mso-ansi-language: en-us;">stem32\config\systemprofile\Desktop</span></span></p>
</td>
</tr>
</tbody>
</table>
<p>Wenn wir jetzt den Service ausführen können wir fehlerfrei unsere Excel Dateien modifizieren:</p>
<p><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_12.png"><img title="image" width="341" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/Testblog-001_A2D4/image_thumb_12.png" border="0" alt="image" height="340" /></a></p>
<p>Mögliche weitere Fehlerquellen können sein, dass kein Standarddrucker eingerichtet ist, oder dass der Service Benutzer keine Berechtigungen auf die verwendeten Verzeichnisse hat.</p>
<h4>Letze Worte</h4>
<p>.NET und Excel bieten vielseitige Möglichkeiten. Man sollte aber immer daran denken, dass Excel kein Serverprodukt ist, und somit immer damit gerechnet werden muss, das Benutzerinteraktion erforderlich sein kann. Jedoch sind die allermeisten Eigenheiten programmatisch umschiffbar.</p>
<p>… be a good ninja .. use C#</p>
<p>Andreas Schwarzer</p>
<p>Fachbereichsleiter SharePoint und Anwendungsentwicklung<br />
ixto GmbH</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/allgemein/net-excel-interop-als-windows-service-benutzen/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>C#-ExcelButler vs. SSIS-ExcelDestination</title>
		<link>http://www.ixto.de/blog/allgemein/c-excelbutler-vs-ssis-exceldestination/</link>
		<comments>http://www.ixto.de/blog/allgemein/c-excelbutler-vs-ssis-exceldestination/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 11:58:00 +0000</pubDate>
		<dc:creator>Alexander Wolff</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=357</guid>
		<description><![CDATA[Oft stellt sich die Anforderung, Excel-Dateien komfortabel aus Datenbanken befüllen zu können. Als Alternative zur Excel-Destination im SSIS-Paket wurde hierfür die C#-Klasse ExcelButler.cs &#8220;entwickelt. Sie enthält Routinen zum Erstellen, Auslesen, Beschreiben und Abspeichern von Excel-Dateien. Sie kann an beliebigen Stellen im Excel-Sheet Werte einfügen, Werte auslesen, Zellen formatieren, Zellen gruppieren und so weiter und bietet [...]]]></description>
			<content:encoded><![CDATA[<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;">Oft stellt sich die Anforderung, Excel-Dateien komfortabel aus Datenbanken befüllen zu können. Als Alternative zur Excel-Destination im SSIS-Paket wurde hierfür die C#-Klasse ExcelButler.cs &#8220;entwickelt. Sie enthält Routinen zum Erstellen, Auslesen, Beschreiben und Abspeichern von Excel-Dateien. Sie kann an beliebigen Stellen im Excel-Sheet Werte einfügen, Werte auslesen, Zellen formatieren, Zellen gruppieren und so weiter und bietet damit eine Fülle von Möglichkeiten für das Handling von Excel-Dateien.<span id="more-357"></span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;">In Abbildung <span style="mso-no-proof: yes;">1</span> ist das Klassendiagramm des ExcelButlers dargestellt. Unter „Methods“ sind die implementierten Methoden aufgelistet. Hier könnte man mit der Methode OpenWorkbook() ein bestehenden Excel-Dokument öffnen, mit der Methode InsertCellContent() beschrieben und mit der Methode SaveAndClose() wieder abspeichern.</p>
<p class="MsoNormal" style="line-height: 13pt; page-break-after: avoid; margin: 0cm 0cm 10pt;"><span style="mso-fareast-language: de; mso-no-proof: yes;"><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/9ce13afa7faa_B5FD/clip_image002.jpg"><img title="clip_image002" width="241" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/9ce13afa7faa_B5FD/clip_image002_thumb.jpg" border="0" alt="clip_image002" height="483" /></a></span></p>
<p class="MsoCaption" style="line-height: normal; margin: 0cm 0cm 10pt;"><a name="_Ref286559866"><span style="font-family: Calibri;"><span style="color: #4f81bd; font-size: 9pt;"><strong>Abbildung </strong></span></span></a><span style="font-family: Calibri;"><span style="color: #4f81bd;"><span style="font-size: 9pt;"><strong><span style="mso-bookmark: _ref286559866;"><span style="mso-no-proof: yes;">1</span></span>: Ansicht des Klassendiakgramms des ExcelButlers</strong></span></span></span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;"><span style="font-family: Calibri;"><span style="font-size: 11pt;">Doch bevor das überhaupt möglich ist sind einige vorbereitende Schritte zu tun. Wenn man vor hat ein Excel-Dokument innherhalb eines SSS-Paketes mit dem ExcelButler dort zu befüllen, müsste eine C#-Konsolenapplikation im Visual Studio erstellt werden. Zu Beginn ist bei den Verweisen der Verweis zur Microsoft.Office.Interop.Excel .NET-Komponente hinzuzufügen. In Abbildung <span style="mso-no-proof: yes;">2</span> ist das dargestellt. Anschliessend muss die Komponente mit der using-Direktive im Code eingebunden werden:</span></span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;"><span style="font-family: Courier New;"><span lang="EN-US" style="line-height: 12pt; mso-no-proof: yes; mso-ansi-language: en-us;"><span style="color: #0000ff;">using</span></span><span lang="EN-US" style="line-height: 12pt; mso-no-proof: yes; mso-ansi-language: en-us;"> Excel = Microsoft.Office.Interop.Excel;</span></span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;"><span lang="EN-US" style="line-height: 12pt; mso-no-proof: yes; mso-ansi-language: en-us;"><span style="font-family: Courier New;"> </span></span></p>
<p class="MsoNormal" style="line-height: 13pt; page-break-after: avoid; margin: 0cm 0cm 10pt;"><span style="mso-fareast-language: de; mso-no-proof: yes;"><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/9ce13afa7faa_B5FD/clip_image004.jpg"><img title="clip_image004" width="482" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/9ce13afa7faa_B5FD/clip_image004_thumb.jpg" border="0" alt="clip_image004" height="408" /></a></span></p>
<p class="MsoCaption" style="line-height: normal; margin: 0cm 0cm 10pt;"><a name="_Ref286560301"><span style="font-family: Calibri;"><span style="color: #4f81bd; font-size: 9pt;"><strong>Abbildung </strong></span></span></a><span style="font-family: Calibri;"><span style="color: #4f81bd;"><span style="font-size: 9pt;"><strong><span style="mso-bookmark: _ref286560301;"><span style="mso-no-proof: yes;">2</span></span>: Hinzufügen der .NET-Komponente</strong></span></span></span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;">Nun kann sofort die ExcelButler-Klasse instanziiert werden:</p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;"><span style="font-family: Courier New;"><span style="line-height: 12pt; mso-no-proof: yes;"><span style="color: #2b91af;">ExcelButler</span></span><span style="line-height: 12pt; mso-no-proof: yes;"> butlerinstanz = <span><span style="color: #0000ff;">new</span></span> <span><span style="color: #2b91af;">ExcelButler</span></span>();</span></span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes;">Nach Schaffung des C#-Objektes butlerinstanz<span style="mso-spacerun: yes;"> </span>muss mit ihrer Hilfe nun eine Excel-Instanz erzeugt werden:</span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;"><span lang="EN-US" style="line-height: 12pt; mso-no-proof: yes; mso-ansi-language: en-us;"><span style="font-family: Courier New;">butlerinstanz.CreateExcelInstance(<span><span style="color: #0000ff;">true</span></span>, <span><span style="color: #0000ff;">out</span></span> error);</span></span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes;">Nach Ausführen des Befehls CreateExcelInstance mit dem ersten Parameter Visible = true öffnet sich sofort Excel, was der Entwickler am Bildschirm beobachten kann. Wenn nach Entwicklungsabschluss später die Excel-Dateien automatisiert innherhalb eines SSIS-Paketes erzeugt werden sollen, muss der Visible-Parameter auf false gesetzt werden, um eine fehlerlose Excel-Generierung im Hintergund zu bewerkstelligen.</span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes;">Nun kann mit der Methode OpenWorkbook ein bestehendes Dokument geöffent und in die Excel-Instanz geladen werden. In </span>Abbildung <span style="mso-no-proof: yes;">3</span><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-no-proof: yes;"> ist diese Routine beispielhaft dargestellt.</span></p>
<p class="MsoNormal" style="line-height: 13pt; page-break-after: avoid; margin: 0cm 0cm 10pt;"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin; mso-fareast-language: de; mso-no-proof: yes;"><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/9ce13afa7faa_B5FD/clip_image006.jpg"><img title="clip_image006" width="564" style="background-image: none; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/9ce13afa7faa_B5FD/clip_image006_thumb.jpg" border="0" alt="clip_image006" height="572" /></a></span></p>
<p class="MsoCaption" style="line-height: normal; margin: 0cm 0cm 10pt;"><a name="_Ref286560970"><span style="font-family: Calibri;"><span style="color: #4f81bd; font-size: 9pt;"><strong>Abbildung </strong></span></span></a><span style="font-family: Calibri;"><span style="color: #4f81bd;"><span style="font-size: 9pt;"><strong><span style="mso-bookmark: _ref286560970;"><span style="mso-no-proof: yes;">3</span></span>: Ansicht eines Code-Ausschnittes für die Routine OpenWorkbook()</strong></span></span></span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;">Nun ist es möglich mit den zur Verfügung stehenden Routinen (zum Beispiel InsertCellContent) die Excel-Datei beliebig zu befüllen:</p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span lang="EN-US" style="mso-no-proof: yes; mso-ansi-language: en-us;"><span style="font-family: Courier New;">butlerinstanz.AddWorkbook(<span><span style="color: #0000ff;">out</span></span> error);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span lang="EN-US" style="mso-no-proof: yes; mso-ansi-language: en-us;"><span style="font-family: Courier New;">butlerinstanz.AddWorksheet(<span><span style="color: #a31515;">&#8220;testblatt&#8221;</span></span>, <span><span style="color: #0000ff;">out</span></span> error);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span lang="EN-US" style="mso-no-proof: yes; mso-ansi-language: en-us;"><span style="font-family: Courier New;">butlerinstanz.InsertCellContent(1, 1, <span><span style="color: #a31515;">&#8220;testwert&#8221;</span></span>, <span><span style="color: #0000ff;">out</span></span> error, <span><span style="color: #a31515;">&#8220;testblatt&#8221;</span></span>);</span></span></p>
<p class="MsoNormal" style="line-height: normal; margin: 0cm 0cm 0pt; mso-layout-grid-align: none;"><span lang="EN-US" style="mso-no-proof: yes; mso-ansi-language: en-us;"><span style="font-family: Courier New;">butlerinstanz.InsertCellContent(1, 2, <span><span style="color: #a31515;">&#8220;testwert&#8221;</span></span>, <span><span style="color: #0000ff;">out</span></span> error, <span><span style="color: #a31515;">&#8220;testblatt&#8221;</span></span>);</span></span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;"><span lang="EN-US" style="mso-ansi-language: en-us;"><span style="font-family: Calibri;"><span style="font-size: 11pt;"> </span></span></span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;">Nun könnte eine Datenbankverbindung geöffnet warden eine Datenbankabfrage gemacht werden, die Ergebnisse dieser Abfrage in ein DataSet geschrieben werden und anschliessen das DataSet iteriert werden und mit InsertCellContent an beliebige Zellen im Excel-Dokument Werte geschrieben werden.<span style="mso-spacerun: yes;"> </span>Nach Beschreiben der Excel-Datei ist das Dokument mit der Routine SaveAndClose() abzuspeichern und zu schliessen.</p>
<p class="MsoNormal" style="line-height: 13pt; page-break-after: avoid; margin: 0cm 0cm 10pt;"><span style="mso-fareast-language: de; mso-no-proof: yes;"><a href="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/9ce13afa7faa_B5FD/clip_image008.jpg"><img title="clip_image008" width="164" style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/9ce13afa7faa_B5FD/clip_image008_thumb.jpg" border="0" alt="clip_image008" height="192" /></a></span></p>
<p class="MsoCaption" style="line-height: normal; margin: 0cm 0cm 10pt;"><a name="_Ref286562446"><span style="font-family: Calibri;"><span style="color: #4f81bd; font-size: 9pt;"><strong>Abbildung </strong></span></span></a><span style="font-family: Calibri;"><span style="color: #4f81bd;"><span style="font-size: 9pt;"><strong><span style="mso-bookmark: _ref286562446;"><span style="mso-no-proof: yes;">4</span></span>: Einbindung des ExcelButlers in ein SSIS-Paket</strong></span></span></span></p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;">Schlussendlich kann man die komplette Erstellung der Excel-Datei nun in ein SSIS-Paket einbinden. Hierzu sind zu Beginn die im Excel-Dokument anzuzeigenden Daten bereitzustellen und anschliessend in einem Prozess-Ausführ-Task die Konsolenapplikation, bei Bedarf mit Parameterübergabe, auszuführen (siehe Abbildung <span style="mso-no-proof: yes;">4</span>).</p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;">Zusammenfassend sind also folgende Schritte zu tun:</p>
<p class="MsoListParagraphCxSpFirst" style="line-height: 13pt; text-indent: -18pt; margin: 0cm 0cm 0pt 36pt; mso-list: l0 level1 lfo1;"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: ignore;">1.  i</span></span>n einem herkömmlichen SSIS die im Excel anzuzeigenden Daten bereitstellen (für vereinfachten späteren Lesezugriff idealerweise in einer extra für dieses Zweck geschaffenen Persistierungstabelle)</p>
<p class="MsoListParagraphCxSpMiddle" style="line-height: 13pt; text-indent: -18pt; margin: 0cm 0cm 0pt 36pt; mso-list: l0 level1 lfo1;"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: ignore;">2.<span style="line-height: normal;"> </span></span></span>C#-Konsolenapplikations-Projekt im Visual-Studio erstellen,<span style="mso-spacerun: yes;"> </span>.NET-Komponente einbinden, ExcelButler-Instanz erzeugen und Excel mit Visible = false öffnen</p>
<p class="MsoListParagraphCxSpMiddle" style="line-height: 13pt; text-indent: -18pt; margin: 0cm 0cm 0pt 36pt; mso-list: l0 level1 lfo1;"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: ignore;">3.<span style="line-height: normal;"> </span></span></span>Innerhalb der Konsolenapplikation Datenbankverbindung öffen und die in Punkt 1 beschriebene Persistierungstabelle abfragen und iterieren und in jedem Iterationsschritt<span style="mso-spacerun: yes;"> </span>Excel mit InsertCellContent() befüllen</p>
<p class="MsoListParagraphCxSpMiddle" style="line-height: 13pt; text-indent: -18pt; margin: 0cm 0cm 0pt 36pt; mso-list: l0 level1 lfo1;"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: ignore;">4. </span></span>Excel mit SaveAnClose() speichern und schliessen</p>
<p class="MsoListParagraphCxSpLast" style="line-height: 13pt; text-indent: -18pt; margin: 0cm 0cm 10pt 36pt; mso-list: l0 level1 lfo1;"><span style="mso-bidi-font-family: calibri; mso-bidi-theme-font: minor-latin;"><span style="mso-list: ignore;">5. </span></span>Die C#-Main-Rountine mit dem Process-Exit-Code = 0 verlassen</p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;">Als Hinweis sei an dieser Stelle noch gesagt, dass empfindliche Code-Stelllen in der Konsolenapplikation, wie beispielsweise das Abfragen von Datenbanken, in Try-Catch-Blöcke gekapselt werden sollten und die Exceptions kontrolliert aufgefangen werden sollten. Bei eventuell auftretenden Fehlern sind dann enstprechend sinnvolle Exit-Codes zu vergeben (zum Beipiel: -3, Datenbankserver nicht verfügbar, oder: -4, keine Zugriffsberechtigung auf das Verzeichnis XY zum Abespeichern der Excel-Datei). Diese Codes sollte die Main-Rountine dann zurückliefern (Beispiel: return -7) und das SSIS-Paket wird diese Codes auswerten und so Fehler erkennen.</p>
<p class="MsoNormal" style="line-height: 13pt; margin: 0cm 0cm 10pt;">Das wars, so einfach und komfortabel kann das sein.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/allgemein/c-excelbutler-vs-ssis-exceldestination/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

