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

<channel>
	<title>ixto-Blog &#187; Allgemein</title>
	<atom:link href="http://www.ixto.de/blog/category/allgemein/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>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>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>.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>
		<item>
		<title>Vom Bild einer Karte zur vektorisierten Shape-Datei für Reporting Services</title>
		<link>http://www.ixto.de/blog/allgemein/vom-bild-einer-karte-zur-vektorisierten-shape-datei-fur-reporting-services/</link>
		<comments>http://www.ixto.de/blog/allgemein/vom-bild-einer-karte-zur-vektorisierten-shape-datei-fur-reporting-services/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 15:22:03 +0000</pubDate>
		<dc:creator>Max Grünwald</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=313</guid>
		<description><![CDATA[Wer mit den Reporting Services arbeitet, hat ein gewisses Portfolio an Karten die genutzt werden können. Sei es mit den SSRS in der Version 2005 / 2008, wo zusätzlich die „Dundas Maps“ installiert werden müssen, oder innerhalb der Version 2008 R2, in der die Kartenfunktionalität schon integriert ist. Da die Auswahl der Standardkarten jedoch nicht [...]]]></description>
			<content:encoded><![CDATA[<p>Wer mit den Reporting Services arbeitet, hat ein gewisses Portfolio an Karten die genutzt werden können. Sei es mit den SSRS in der Version 2005 / 2008, wo zusätzlich die „Dundas Maps“ installiert werden müssen, oder innerhalb der Version 2008 R2, in der die Kartenfunktionalität schon integriert ist. Da die Auswahl der Standardkarten jedoch nicht sonderlich groß ist, gibt es sicherlich recht schnell Bedarf, eigenen Karten zu erstellen.</p>
<p><span id="more-313"></span><br />
Mit ein bischen Glück findet man eine geeignete Karte im .shp (Shape) – Format im www und kann diese ganz einfach importieren. Was aber ist zu tun, wenn man keine passende Datei findet oder wenn etwas visualisiert werden soll, wovon nur ein Foto existiert?
<p>&nbsp;</p>
<p>Dieser Beitrag soll Ihnen die (technischen) Voraussetzungen erläutern, aus einem einfachen Bild eine Shape-Datei anzufertigen und diese in Ihren Bericht einzubinden.
<p>&nbsp;</p>
<p><strong>Vorbereitung: </strong>
<p>&nbsp;</p>
<p>Karte suchen &#8211; am besten ohne Beschriftungen und nur in 2 Farben gehalten (s/w).<br />
Hinweis: bei bestimmten Karten sind für einige Vektorisierungsprogramme die Trennungen bestimmter Bereiche nicht erkennbar. Bildbearbeitung notwendig!<br />
Beste Ergebnisse erzielt man, wenn der Hintergrund und die Trennlinien weiß sind (gleich gefärbt) und die einzelnen zu vektorisierenden Bereiche schwarz sind (in einer Farbe gehalten) und keine störenden Pixel vorhanden sind.
<p>&nbsp;</p>
<p><strong>weitere Voraussetzungen:</strong>
<p>&nbsp;</p>
<p>-	Programm zum vektorisieren der Karte (z.B. Photoline, Freeware).<br />
-	Programm, welches Vektordateien konvertieren kann (um das gewünschte .shp Format zu erhalten [Cad2Shape]).<br />
-	Programm mit welchem man Metadaten pflegen kann (bestimmten Ebenen die gewünschten Daten zuzuordnen [fGis]).
<p>&nbsp;</p>
<p><strong>Karte</strong>
<p>&nbsp;</p>
<p>Findet man nur eine derartige Karte, wäre zu einer Bearbeitung zu raten.<br />
(oder man vektorisiert selbst)
<p>&nbsp;</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/mgw_maps/mgw_01.png"><br />
Quelle: http://www.strolchundmiez.de/img/berl_bez.gif</p>
<p>&nbsp;</p>
<p><strong>Vektorisieren:</strong>
<p>&nbsp;</p>
<p>Bei den Vektorisierungsprogrammen kann man meistens die Genauigkeit einstellen mit der die gewünschte Fläche vektorisiert wird. Entstehen zu viele Polygone bei der Vektorisierung, können diese ausgeblendet werden.<br />
Wer viel Zeit und Erfahrung hat, kann das Vektorisieren auch manuell vornehmen.
<p>&nbsp;</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/mgw_maps/mgw_02.PNG">
<p>&nbsp;</p>
<p><strong><br />
Konvertieren</strong>
<p>&nbsp;</p>
<p>Beim Konvertieren ist darauf zu achten, dass bei den Optionen „Polygon“ auswählt wird, da es sich um Flächen handelt.  Ansonsten muss das Programm die Shape-Dateien erstellen können, die wir für den Import benötigen.
<p>&nbsp;</p>
<p><strong>Metadaten pflegen</strong>
<p>&nbsp;</p>
<p>Die Metadaten legen fest, zu welchem Shape ein bestimmter Wert zugeordnet ist.<br />
Mit einem Programm wie „fGis“ lässt sich die Shape-Datei öffnen und bearbeiten.<br />
Dazu einfach die Tabelle mit den einzelnen Shapes öffnen und die gewünschten Daten einpflegen und abspeichern.</p>
<p>&nbsp;</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/mgw_maps/mgw_03.png"></p>
<p>&nbsp;</p>
<p>Nun ist die Shape-Datei bereit für den Import.
<p>&nbsp;</p>
<p>Wer das Prinzip verstanden hat und sich an anspruchsvolleren Projekten versuchen will, wie zum Beispiel Karten mit genauen Koordinaten auszuwerten, den könnte folgender Link interessieren:</p>
<p>&nbsp;</p>
<p>http://www.raumberg.at/Unterricht/GIS/UZR_GI_PU_01.pdf</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/allgemein/vom-bild-einer-karte-zur-vektorisierten-shape-datei-fur-reporting-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sicheres Deployment einer BI-Lösung mit Bordmitteln und OpenSource-Tools</title>
		<link>http://www.ixto.de/blog/allgemein/sicheres-deployment-einer-bi-losung-mit-bordmitteln-und-opensource-tools/</link>
		<comments>http://www.ixto.de/blog/allgemein/sicheres-deployment-einer-bi-losung-mit-bordmitteln-und-opensource-tools/#comments</comments>
		<pubDate>Mon, 29 Nov 2010 13:34:18 +0000</pubDate>
		<dc:creator>Martin Ihrke</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server 2008]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=293</guid>
		<description><![CDATA[Die Bereitstellung einer Business Intelligence Lösung erscheint im ersten Moment als eine triviale Angelegenheit. Wer jedoch eine mühevoll und aufwendig entwickelte BI-Lösung nach erfolgreichem Test und Abnahme auf ein Produktivsystem übertragen musste, der weiss, wie mühevoll und aufwendig dieses Unterfangen trotz aller anfänglichen Vermutung sein kann.
Neben den technischen Herausforderungen, die eine für den rauen Betriebsalltag [...]]]></description>
			<content:encoded><![CDATA[<p>Die Bereitstellung einer Business Intelligence Lösung erscheint im ersten Moment als eine triviale Angelegenheit. Wer jedoch eine mühevoll und aufwendig entwickelte BI-Lösung nach erfolgreichem Test und Abnahme auf ein Produktivsystem übertragen musste, der weiss, wie mühevoll und aufwendig dieses Unterfangen trotz aller anfänglichen Vermutung sein kann.<br />
<span id="more-293"></span>Neben den technischen Herausforderungen, die eine für den rauen Betriebsalltag konfigurierte Umgebung mit sich bringt, sind auch fachliche Schwierigkeiten zu meistern, insbesondere dann, wenn eine bereits im laufenden Betrieb befindliche Lösung abgelöst werden soll. Einerseits sollen produktive Daten natürlich nicht verloren gehen, andererseits gilt es, Strukturänderungen und Steuerdaten vollständig und unbeschadet in die Produktivumgebung zu bringen. Es existieren zahlreiche Dritthersteller-Werkzeuge, die dies mehr oder weniger automatisch auf Knopfdruck realisieren können, diese kosten jedoch oft mehr als den sprichwörtlichen schmalen Taler und können damit das Projektbudget in die Höhe schnellen lassen. Aus diesem Grund möchte ich im folgenden Beitrag Lösungswege aufzeigen, die sich auf die Benutzung von SQL Server Bordmitteln und kostenlos erhältlichen OpenSource-Werkzeugen beschränken. Voraussetzung für das nachfolgend beschriebene Szenario ist, dass die produktive Umgebung nicht direkt aus der Entwicklungsumgebung erreichbar ist und somit nicht einfach ein direktes Deployment von dort aus geschehen kann. Ein Umstand, der aufgrund von strikten Sicherheitsbestimmungen sehr oft im realen Projektgeschäft angetroffen wird.</p>
<p><strong>Die Datenbank</strong></p>
<p>Zunächst sollte Klarheit darüber herrschen, welche Datenbankobjekte übertragen werden müssen. Vorbildliche Naturen können diese Frage mit einem Blick in die Historie ihrer professionellen Versionsverwaltung (natürlich inklusive Application LifeCycle Management) sogar des Nächtens im Halbschlaf beanworten (vielleicht haben sie auch mit Zettel und Stift mitgeschrieben), aber auch wenn diese Professionalität des Vorgehens nicht erreicht werden kann oder soll, gibt es es nützliche Hilfsmittel, die uns auf unter die Arme greifen helfen. Das OpenSource-Tool <em>OpenDBDiff</em> bietet die Möglichkeit, zwei Datenbank-Stände miteinander zu vergleichen. Es entsteht dabei ein SQL-Skript, dass ausgeführt auf der Zieldatenbank die ausgewählten Objekte synchronisiert. Dabei sei angemerkt, dass hierbei eigentlich nur Tabellenobjekte kritisch sind, da sich alle anderen, wie <em>Views</em>, <em>Stored Procedures</em> und <em>User-Defined Functions</em>, auch durch Löschen und Neu-Anlegen auf den gleichen Stand bringen lassen. Aber wenn wir OpenDBDiff ohnehin gestartet haben, sparen wir uns die Mühe.</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/mi_deployment/mi_01.png" alt="" /></p>
<p>Der zweite Schritt besteht im Abgleich von Steuerdaten, die zumeist in Konfigurationstabellen schlummern. Dazu kann uns das Tool TableDiff dienen, mit dessen Hilfe Unterschiede in Tabellendaten abgeglichen werden, indem auch hier SQL-Skripte generiert werden. Das Tool ist Bestandteil der SQL Server Installation und lässt sich zumeist unter <em>C:\Program Files\Microsoft SQL Server\100\COM</em> finden und aufrufen, wobei der Pfad je nach SQL Server Version und dessen Installationsverzeichnis varieren kann. TableDiff geht dabei tabellenweise vor, weshalb es sich anbietet, eine Batchdatei zu programmieren, die den Aufruf pro Tabelle automatisiert.</p>
<p>rem Server festlegen</p>
<p>set sserver=localhost</p>
<p>set dserver=localhost</p>
<p>rem Datenbanken festlegen</p>
<p>set sdb=AdventureWorksDW</p>
<p>set ddb=AdventureWorksDW2008</p>
<p>rem Pfade definieren</p>
<p>set exepath=&#8221;C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe&#8221;</p>
<p>set destfolder=D:\SQL</p>
<p>rem Schema festlegen</p>
<p>set schema=dbo</p>
<p>for %%t in (dimCurrency dimScenario) do (</p>
<p>%exepath% /sourceserver %sserver% /sourcedatabase %sdb% /sourceschema %schema%  /sourcetable %%t /destinationserver %dserver% /destinationdatabase %ddb% /destinationschema %schema% /destinationtable %%t -f &#8220;%destFolder%\changeScript(%schema%_%%t).sql&#8221;</p>
<p>)</p>
<p>Wir haben nun eine Reihe von SQL-Skripten, die nur noch auf der Zieldaten ausgeführt werden müssen, um die Datenbankstruktur in einen identischen Zustand zu bringen.</p>
<p><strong>SSIS-Pakete und Cube-Defintionen</strong></p>
<p>Es gilt nun, sowohl SSIS-Pakete und Cube-Definitionen zu übertragen. Dies ist etwas einfacher, da sowohl für SSIS- als für SSAS-Projekte einen Deployment-Wizard existiert, der uns das Bereitstellen auf dem Zielsystem (fast) vollständig abnimmt. Im Falle von SSIS-Paketen besteht weiterhin die Möglichkeit, auf das Kommandozeilenwerkzeug dtutil zurückzugreifen, das, eingebettet in eine Batch-Datei, das Bereitstellen der Pakete nach einem Doppelklick automatisch übernehmen kann. Da wir selbst in kleineren Projekten intensiven Gebrauch von der SSIS-Paketkonfiguration machen, haben wir auch wenig Mühe damit, Informationen wie Server- oder Datenbanknamen zu aktualisieren. SSAS-Cubes  müssen nur noch verarbeitet werden und sind damit direkt bereit zum Einsatz. Aber auch hier gilt es, eine gewisse Vorsicht an den Tag zu legen, da doch der ein oder andere Fallstrick lauert. Einer dieser Fallstricke sind Cube-Rollen, die ohne weitere Konfiguration auf dem Zielserver überschrieben werden. Doch auch wenn wir dies explizit verhindern wollen (die entsprechende Option im Deployment Wizard heißt <em>Retain Roles und Members</em>), ist leider nicht immer gewährleistet, dass die bestehende Konfiguration erhalten bleibt. Hier hat sich der Workaround etabliert, die Rollendefinition auf dem Produktivserver zu sichern (Zu finden im entsprechenden Bereich in der XMLA-Datei, also der Datenbankdefinition, auf der SSAS-Datenbank) und nach dem Deployment zurückzuspielen.</p>
<p><strong>Die Berichte</strong></p>
<p>Für SSRS-Berichte hat sich ein ein Werkzeug bewährt, dass es uns ermöglicht, Berichte direkt vom (Test)Berichtsserver herunterzuladen und auf den (Produktiv)Berichtsserver zu übertragen. Dazu wird neben den Berichtsdefinitionen in Form von .rdl-Dateien eine Batchdatei generiert, in der nur noch die URL des Zielsystems hinterlegt werden muss. Nach einem Doppelklick können wir und zurücklehnen und die Deployment-Show genießen.</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/mi_deployment/mi_02.png" alt="" /></p>
<p><strong>Fazit</strong></p>
<p>Mit dem vorgestellen Vorgehen und Werkzeugen ist es uns, ein recht elegantes Deployment unserer BI-Solution auf entfernte Umgebungen vorzunehmen. Großer Vorteil dabei ist die Möglichkeit, weite Teile durch Batch-Dateien und Konfigurationen zu automatisieren und damit den Aufwand mehrmaliger Deployments zu merklich reduzieren.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/allgemein/sicheres-deployment-einer-bi-losung-mit-bordmitteln-und-opensource-tools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Erzeugung von Intervall-Datensätzen mithilfe von Common Table Expressions</title>
		<link>http://www.ixto.de/blog/allgemein/erzeugung-von-intervall-datensatzen-mithilfe-von-common-table-expressions/</link>
		<comments>http://www.ixto.de/blog/allgemein/erzeugung-von-intervall-datensatzen-mithilfe-von-common-table-expressions/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 16:06:17 +0000</pubDate>
		<dc:creator>David Veenhuis</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/?p=257</guid>
		<description><![CDATA[Mit rekursiven CTEs (Common Table Expressions) lassen sich Abfragen elegant und lesbar schreiben.  Ein Beispiel wird hier vorgestellt. Vorgegebene Wertebereiche sollen jeweils auf eine bestimmte Anzahl von Intervallen (Buckets) aufgeteilt werden. Es kann sich dabei z.B. um Kennzahlen wie Einkommen oder um das Alter von Kunden handeln. Der jeweilige Kunde kann dann (z.B. in einem [...]]]></description>
			<content:encoded><![CDATA[<p>Mit rekursiven CTEs (Common Table Expressions) lassen sich Abfragen elegant und lesbar schreiben.  Ein Beispiel wird hier vorgestellt. Vorgegebene Wertebereiche sollen jeweils auf eine bestimmte Anzahl von Intervallen (Buckets) aufgeteilt werden. Es kann sich dabei z.B. um Kennzahlen wie Einkommen oder um das Alter von Kunden handeln. Der jeweilige Kunde kann dann (z.B. in einem Lookup-Task in SSIS) dem passenden Bucket zugeordnet werden um alle Kunden sinnvoll zu klassifizieren. <br />
<span id="more-257"></span></p>
<p>Gegeben ist eine Hilfstabelle wo für jede Kennzahl der Name, den Wertebereich (z.B. 20 – 70 für das Alter) und die Anzahl der gewünschten Buckets (z.B. 5 für das Alter, womit jedes Bucket einen Bereich von 10 Jahren abdeckt) enthält. Die Hilfstabelle &#8220;Kennzahlen_Bucketdefinition&#8221; enthält in unserem Beispiel zwei Kennzahlen: Alter und Einkommen.</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/CTE_Intervall/Bucket_Definition.PNG" alt="" /></p>
<p>Abgespeichert wird für jedes der erzeugten Buckets ein Datensatz mit dem Start und dem Ende des Intervalls sowie die Bezeichnung der Kennzahl, um die es geht. Zusätzlich wird eine fortlaufende Nummerierung der Buckets erzeugt. In diesem Beispiel werden für jede Kennzahl zwei zusätzliche Buckets erzeugt, nämlich eines für alle Werte, die kleiner als der Startwert des Wertebereichs sind (nach unten offen) und eines für alle Werte, die größer als der Endwert des jeweiligen Wertebereichs sind (nach oben offen). Auf die Erzeugung dieser zusätzlichen Buckets kann je nach Anwendungszweck natürlich in der Realität auch verzichtet werden.</p>
<p>Bei der Umsetzung der Anforderung wird ein rekursiver allgemeiner Tabellenausdruck verwendet, der eine kurze und einfache Umsetzung ermöglicht. Es wird dabei zunächst die Startmenge (Rekursions-Anker) festgelegt, die aus dem jeweils ersten Bucket-Datensatz für jede Kennzahl besteht (das nach unten offene Startintervall gekennzeichnet mit NULL als Startwert). Auf diese Menge wird dann das rekursive Statement ausgeführt, das für jeden Datensatz in der Startmenge den Nachfolgedatensatz erzeugt. Darauf folgend wird für die Ergebnismenge (die erzeugten Nachfolgedatensätze)  wiederrum das rekursive Statement aufgerufen. Das wird dann für jede Zwischenschritt-Ergebnismenge ausgeführt, bis nach einem Schritt keine Zeilen mehr in der Ergebnismenge sind, dann bricht die Rekursion ab. Das wird in unserem Beispiel erreicht, wenn die Bucket-Nummer den vorgegebene Wert für die maximale Anzahl an Buckets erreicht hat. Das jeweils letzte Bucket für jede Kennzahl wird als oben offen erzeugt (NULL als Endwert).</p>
<p>Der Abfrage für den rekursiven allgemeinen Tabellenausdruck (CTE – Common Table Expression) sieht wie folgt aus:</p>
<p><span style="color: #000000;">;</span><span style="color: #0000ff;">WITH </span>MyCTE <span style="color: #0000ff;">AS</span></p>
<p><span style="color: #808080;">(<br />
</span><span style="color: #008000;">&#8211;1. Teil (Anchor): festes Statement als Start der Rekursion (erstes Bucket):<br />
&#8211; erstes Bucket = Pufferbucket für alle Werte, die kleiner sind als die Bucket-Range; daher unten offen</span></p>
<p><span style="color: #0000ff;">SELECT<br />
</span>Kennzahl_Name<span style="color: #808080;">,<br />
</span>BucketNr<span style="color: #808080;">=</span>1<span style="color: #808080;">,<br />
</span>BucketStart<span style="color: #808080;"> =</span> <span style="color: #ff00ff;">CONVERT</span><span style="color: #808080;">(</span>decimal<span style="color: #808080;">(</span>18<span style="color: #808080;">,</span>2<span style="color: #808080;">),NULL),<br />
</span>BucketStop <span style="color: #808080;">=</span> <span style="color: #ff00ff;">CONVERT</span><span style="color: #808080;">(</span>decimal<span style="color: #808080;">(</span>18<span style="color: #808080;">,</span>2<span style="color: #808080;">),</span>Intervall_Start<span style="color: #808080;">),<br />
</span>BucketLength <span style="color: #808080;">=</span> <span style="color: #ff00ff;">CONVERT</span><span style="color: #808080;">(</span>decimal<span style="color: #808080;">(</span>18<span style="color: #808080;">,</span>2<span style="color: #808080;">),(</span>Intervall_Ende-Intervall_Start<span style="color: #808080;">)/ (</span>Buckets_Anzahl<span style="color: #808080;">)),<br />
</span>maxBuckets <span style="color: #808080;">=</span> Buckets_Anzahl<span style="color: #808080;">+</span>2<br />
<span style="color: #0000ff;">FROM</span> Kennzahlen_Bucketdefinition</p>
<p><span style="color: #0000ff;">UNION ALL</span><br />
<span style="color: #008000;">&#8211;2. Teil (Recursive): dynamisches (rekursives) Statement<br />
&#8211; letztes Bucket = Pufferbucket für alle Werte, die größer sind als die Bucket-Range; daher oben offen</span></p>
<p><span style="color: #0000ff;">SELECT</span><br />
Kennzahl_Name<span style="color: #808080;">,<br />
</span>BucketNr<span style="color: #808080;">=</span>BucketNr<span style="color: #808080;">+</span>1<span style="color: #808080;"> ,<br />
</span>BucketStart<span style="color: #808080;">=</span><span style="color: #ff00ff;">ISNULL</span><span style="color: #808080;">(</span>BucketStop<span style="color: #808080;">,</span>0<span style="color: #808080;">),<br />
</span>BucketStop<span style="color: #808080;">=</span><span style="color: #0000ff;">CASE</span> <span style="color: #0000ff;">WHEN</span> BucketNr<span style="color: #808080;">+</span>1 <span style="color: #808080;">&lt;</span> maxBuckets <span style="color: #0000ff;">THEN</span> <span style="color: #ff00ff;">CONVERT</span><span style="color: #808080;">(</span><span style="color: #0000ff;">decimal</span><span style="color: #808080;">(</span>18<span style="color: #808080;">,</span>2<span style="color: #808080;">),</span> Bucketstop<span style="color: #808080;">+</span>BucketLength<span style="color: #808080;">)</span> <span style="color: #0000ff;">ELSE</span> <span style="color: #808080;">NULL</span> <span style="color: #0000ff;">END</span><span style="color: #808080;">,<br />
</span>BucketLength<span style="color: #808080;">,<br />
</span>maxBuckets<br />
<span style="color: #0000ff;">FROM</span> MyCTE <span style="color: #0000ff;">WHERE</span> BucketNr<span style="color: #808080;">+</span>1 <span style="color: #808080;">&lt;=</span> maxBuckets<br />
<span style="color: #808080;">)</span></p>
<p><span style="color: #0000ff;">SELECT</span> Kennzahl_Name<span style="color: #808080;">,</span>BucketNr<span style="color: #808080;">,</span>BucketStart<span style="color: #808080;">,</span>BucketStop <span style="color: #0000ff;">FROM</span> MyCTE<br />
<span style="color: #0000ff;">ORDER</span> <span style="color: #0000ff;">BY</span> Kennzahl_Name<span style="color: #808080;">,</span> BucketNr<br />
<span style="color: #0000ff;">OPTION</span> <span style="color: #808080;">(</span>MAXRECURSION 32767 <span style="color: #808080;">);</span></p>
<p>Das Ergebnis des Aufruf sieht wie gewünscht aus:</p>
<p><img src="http://blog.ixtoprod.s15244651.onlinehome-server.info/blogbilder/CTE_Intervall/Buckets.PNG" alt="" />:</p>
<p>Anmerkungen: Um Uneindeutigkeiten bezüglich des Schlüsselwortes<span style="color: #0000ff;"> WITH</span> zu vermeiden, muss bei einer CTE-Definition in einem Batch (außer es ist die erste Anweisung) die Anweisung vor <span style="color: #0000ff;">WITH</span> mit einem Semikolon abgeschlossen werden. Es ist also ganz praktisch immer ein Semikolon vor <span style="color: #0000ff;">WITH</span> zu schreiben, um das nicht zu übersehen.<br />
Der  Wert für MAXRECURSION ist optional. Er gibt die maximal erlaubte Anzahl von Rekursionsschritten an. Wird der Wert nicht explizit gesetzt, gilt übrigens der serverweite Default-Wert 100. Die CTE-Abfrage würde dann beim 101-ten Rekursionsschritt eine Ausnahme auslösen. Wird der Wert auf 0 gesetzt, ist die Rekursionstiefe unbegrenzt, was aber bei fehlerhaft geschriebenen CTEs zu einer Endlosschleife führen kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/allgemein/erzeugung-von-intervall-datensatzen-mithilfe-von-common-table-expressions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft Windows Azure</title>
		<link>http://www.ixto.de/blog/allgemein/microsoft-windows-azure/</link>
		<comments>http://www.ixto.de/blog/allgemein/microsoft-windows-azure/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 09:16:25 +0000</pubDate>
		<dc:creator>Christian Voigt</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Azure]]></category>

		<guid isPermaLink="false">http://www.ixto.de/blog/allgemein/microsoft-windows-azure/</guid>
		<description><![CDATA[Nein, Windows Azure ist nicht das neue Desktop-Betriebssystem von Microsoft &#8211; und möglicherweise wird Windows Azure auch nicht alle Ihre Probleme lösen, aber ein Blick auf Windows Azure kann durchaus lohnenswert und interessant sein.
Dazu aber eine kleine Einführung in die Thematik Cloud Computing. 


Cloud Computing

 
Cloud Computing ist momentan das Schlagwort der IT-Branche. Nutzen Sie etwa noch [...]]]></description>
			<content:encoded><![CDATA[<p>Nein, Windows Azure ist nicht das neue Desktop-Betriebssystem von Microsoft &#8211; und möglicherweise wird Windows Azure auch nicht alle Ihre Probleme lösen, aber ein Blick auf Windows Azure kann durchaus lohnenswert und interessant sein.<br />
Dazu aber eine kleine Einführung in die Thematik Cloud Computing. <br />
<span id="more-62"></span><br />
<br\><br />
<strong>Cloud Computing</strong><br />
<br\></p>
<p style="clear: both;"> </p>
<p>Cloud Computing ist momentan das Schlagwort der IT-Branche. Nutzen Sie etwa noch kein Cloud Computing?<br />
<em>(Der Autor kann sich an dieser Stelle ein Lächeln nicht verkneifen)</em><br />
<br\><br />
Aber jetzt im Ernst:<br />
Cloud Computing bedeutet : weg vom zentralen Server, der seiner Umwelt Dienste bereitstellt, hin zu einer ganzen Ansammlung von Servern (Wolke), die die Aufgaben des einzelnen Servers übernehmen. An dieser Stelle dürfte dem geneigten Leser  bei der zu erwartenden Kostenexplosion &#8211; schon das erste Mal der Hut hoch gehen.<br />
Aber nein, ganz so schlimm ist es nicht!<br />
Sie können die Bestellung über 50 neue Server also wieder stornieren. Ganz im Gegenteil, Cloud Computing unterstützt Sie aktiv bei der Reduzierung Ihrer IT-Kosten. Anstatt eigene IT-Infrastruktur aufzubauen, mieten Sie doch einfach Rechenkapazität bei einem Cloud-Anbieter. Die Vorteile liegen auf der Hand. Unmengen an Rechenkapazität steht Ihnen zur Verfügung – und zwar dann, wann Sie sie benötigen. Und sollten Sie mal keine Rechenkapazität benötigen, entstehen auch keine Kosten.<br />
<br\></p>
<p style="clear: both;"> </p>
<p><strong>Microsoft Windows Azure</strong></p>
<p style="clear: both;"> </p>
<p><br\><br />
Windows Azure ist so ein Cloud Computing System von Microsoft. Es befindet sich momentan in der Entwicklung, soll aber voraussichtlich noch 2009 fertiggestellt werden. Es richtet sich vorrangig an Softwareentwickler, die während der Entwicklung „on-demand“ Speicherplatz, Rechenkapazität, Datenbanken, etc. benötigen. Unterstützt werden diverse Protokolle wie zum Beispiel SOAP, REST und XML sowie Programmiersprachen von Microsoft (.NET), aber auch non-Microsoft Programmiersprachen wie PHP.<br />
Preise für die Cloud Services hat Microsoft auch schon bekannt gegeben: Demnach soll eine Stunde Rechenzeit in der Cloud 12 US-Cent kosten, Speicherplatz in der Cloud schlägt mit 15 US-Cent pro GByte pro Monat zubuche.</p>
<p style="clear: both;"> </p>
<p>Weiterführende Informationen zu Windows Azure finden Sie unter <a href="http://www.microsoft.com/azure" target="_blank">www.microsoft.com/azure</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ixto.de/blog/allgemein/microsoft-windows-azure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

