<?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>HP&#039;s Blog</title>
	<atom:link href="http://blog.schelian.de/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.schelian.de</link>
	<description>Hans-Peter Schelian&#039;s Weblog</description>
	<lastBuildDate>Mon, 14 May 2012 09:29:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>DotNetNuke &#8211; Nach Upgrade auf DNN 6.1.X &#8211; HTML Modul speichert keine &#196;nderungen mehr</title>
		<link>http://blog.schelian.de/2012/05/dotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr/</link>
		<comments>http://blog.schelian.de/2012/05/dotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr/#comments</comments>
		<pubDate>Mon, 14 May 2012 09:29:53 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[DNN]]></category>
		<category><![CDATA[DotNetNuke]]></category>
		<category><![CDATA[DotNetNuke 6]]></category>
		<category><![CDATA[Provider]]></category>
		<category><![CDATA[Telerik]]></category>
		<category><![CDATA[TextEditor]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1950</guid>
		<description><![CDATA[Heute Vormittag habe ich den Anruf eines Kunden erhalten der mir folgendes Problem geschildert hat. Nach der Aktualisierung eines DotNetNuke Portals von DNN 5.6.X auf DNN 6.1.1 werden Änderungen die man an Texten im HMTL Modul vornimmt nicht gespeichert. Keine &#8230; <a href="http://blog.schelian.de/2012/05/dotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Heute Vormittag habe ich den Anruf eines Kunden erhalten der mir folgendes Problem geschildert hat.</p>
<p>Nach der Aktualisierung eines DotNetNuke Portals von DNN 5.6.X auf DNN 6.1.1 werden Änderungen die man an Texten im HMTL Modul vornimmt nicht gespeichert.</p>
<blockquote><p><strong>Keine Fehlermeldung, kein Eintrag im Ereignisprotokoll, einfach nichts!</strong></p>
</blockquote>
<p>Nachdem ich mir die Konfiguration genauer angeschaut hatte, konnte ich einen Fehler in der Konfiguration des System (IIS und App Pool) ausschließen.</p>
<p>Das Problem war aber trotzdem relativ schnell gefunden.</p>
<p>Mit dem “früher” als Standardeditor eingesetzten FCK Editor gibt es mit der aktuellen Version (Ich glaube schon seit Version 5.6.X) von DotNetNuke an einigen Stellen Probleme, unter anderem eben auch im Text/HMTL Modul. </p>
<p>Irgendwelche JavaScripte des Editors kollidieren mit anderen JavaScript aufrufen in irgend einer der vielen verwendeten JavaScript Frameworks.</p>
<p>JavaScript eben <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.schelian.de/wp-content/uploads/2012/05/wlEmoticon-smile.png"></p>
<p>Ich weiß schon warum sich meine Begeisterung für dieses (Java)Script Gedöns in Grenzen hält.</p>
<p>OK, aber lassen wir das.</p>
<p>Ob es einen aktualisierte Version des FCK Editors gibt, die mit DNN Version 6.1 und höher läuft, weiß ich nicht, sollte jemand näheres dazu wissen, würde ich mich über einen entsprechenden Kommentar freuen.</p>
<p>Um das Problem mit den Bordmitteln von DNN zu lösen kann man aber einfach den Texteditor umstellen und anstelle des FCK Editors den Telerik Texteditor, der aktuell als Standardeditor von DotNetNuke verwendet wird.</p>
<p>Hierzu öffnet man die web.config und nimmt folgende Änderung vor:</p>
<p>Den defaultProvider von “FckHtmlEditorProvider” (siehe Vorher) auf “TelerikEditorProvider” (siehe Nachher) ändern</p>
<p>Vorher:</p>
<p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:d11cb4a4-b95b-46c9-951d-2d835f3f020b" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: xml; pad-line-numbers: true; title: ; notranslate">
&lt;htmlEditor defaultProvider=&quot;FckHtmlEditorProvider&quot;&gt;
  &lt;providers&gt;
	&lt;clear /&gt;
	&lt;add name=&quot;TelerikEditorProvider&quot; type=&quot;DotNetNuke.HtmlEditor.TelerikEditorProvider.EditorProvider, DotNetNuke.HtmlEditor.TelerikEditorProvider&quot; providerPath=&quot;~/Providers/HtmlEditorProviders/Telerik/&quot; toolsFile=&quot;~/Providers/HtmlEditorProviders/Telerik/Config/ToolsDefault.xml&quot; configFile=&quot;~/Providers/HtmlEditorProviders/Telerik/Config/ConfigDefault.xml&quot; FilterHostExtensions=&quot;True&quot; /&gt;
	&lt;add name=&quot;FckHtmlEditorProvider&quot; type=&quot;DotNetNuke.HtmlEditor.FckHtmlEditorProvider.FckHtmlEditorProvider, DotNetNuke.FckHtmlEditorProvider&quot; providerPath=&quot;~/Providers/HtmlEditorProviders/Fck/&quot; CustomConfigurationPath=&quot;~/Providers/HtmlEditorProviders/Fck/custom/FCKConfig.js&quot; EnhancedSecurityDefault=&quot;false&quot; SecureConfigurationPath=&quot;~/Providers/HtmlEditorProviders/Fck/custom/FCKConfigSecure.js&quot; ImageGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; ImageUploadPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; ImageAllowedFileTypes=&quot;gif,png,bmp,jpg&quot; FlashGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; FlashUploadPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; FlashAllowedFileTypes=&quot;fla,swf&quot; LinksGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx&quot; DynamicStylesGeneratorPath=&quot;~/Providers/HtmlEditorProviders/Fck/FCKStyles.aspx&quot; DynamicStylesCaseSensitive=&quot;true&quot; DynamicStylesGeneratorFilter=&quot;controlpanel|filemanager|mainmenu|wizard&quot; StaticStylesFile=&quot;~/Providers/HtmlEditorProviders/Fck/FCKeditor/fckstyles.xml&quot; StylesDefaultMode=&quot;dynamic&quot; DynamicCSSGeneratorPath=&quot;~/Providers/HtmlEditorProviders/Fck/FCKCSS.aspx&quot; StaticCSSFile=&quot;~/Providers/HtmlEditorProviders/Fck/FCKeditor/editor/css/fck_editorarea.css&quot; CSSDefaultMode=&quot;dynamic&quot; spellCheck=&quot;ieSpell&quot; AvailableToolbarSkins=&quot;Office2003,Silver&quot; DefaultToolbarSkin=&quot;Office2003&quot; AvailableToolBarSets=&quot;DNNDefault,Default,NoGallery,Basic&quot; DefaultToolbarSet=&quot;DNNDefault&quot; DefaultImageGallerySkin=&quot;Default&quot; DefaultFlashGallerySkin=&quot;Default&quot; DefaultLinksGallerySkin=&quot;Default&quot; FCKDebugMode=&quot;false&quot; UseFCKSource=&quot;false&quot; OptionsOpenMode=&quot;ShowModalDialog&quot; ShowModuleType=&quot;true&quot; FixOldDNNPostback=&quot;false&quot; CustomOptionsDialog=&quot;Admin&quot; /&gt;
  &lt;/providers&gt;
&lt;/htmlEditor&gt;
</pre>
</pre>
</div>
<p>Nachher:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:ea1d3a9e-a044-480b-a0a3-18cbffe33731" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: xml; title: ; notranslate">
&lt;htmlEditor defaultProvider=&quot;TelerikEditorProvider&quot;&gt;
  &lt;providers&gt;
	&lt;clear /&gt;
	&lt;add name=&quot;TelerikEditorProvider&quot; type=&quot;DotNetNuke.HtmlEditor.TelerikEditorProvider.EditorProvider, DotNetNuke.HtmlEditor.TelerikEditorProvider&quot; providerPath=&quot;~/Providers/HtmlEditorProviders/Telerik/&quot; toolsFile=&quot;~/Providers/HtmlEditorProviders/Telerik/Config/ToolsDefault.xml&quot; configFile=&quot;~/Providers/HtmlEditorProviders/Telerik/Config/ConfigDefault.xml&quot; FilterHostExtensions=&quot;True&quot; /&gt;
	&lt;add name=&quot;FckHtmlEditorProvider&quot; type=&quot;DotNetNuke.HtmlEditor.FckHtmlEditorProvider.FckHtmlEditorProvider, DotNetNuke.FckHtmlEditorProvider&quot; providerPath=&quot;~/Providers/HtmlEditorProviders/Fck/&quot; CustomConfigurationPath=&quot;~/Providers/HtmlEditorProviders/Fck/custom/FCKConfig.js&quot; EnhancedSecurityDefault=&quot;false&quot; SecureConfigurationPath=&quot;~/Providers/HtmlEditorProviders/Fck/custom/FCKConfigSecure.js&quot; ImageGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; ImageUploadPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; ImageAllowedFileTypes=&quot;gif,png,bmp,jpg&quot; FlashGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; FlashUploadPath=&quot;~/Providers/HtmlEditorProviders/Fck/fckimagegallery.aspx&quot; FlashAllowedFileTypes=&quot;fla,swf&quot; LinksGalleryPath=&quot;~/Providers/HtmlEditorProviders/Fck/fcklinkgallery.aspx&quot; DynamicStylesGeneratorPath=&quot;~/Providers/HtmlEditorProviders/Fck/FCKStyles.aspx&quot; DynamicStylesCaseSensitive=&quot;true&quot; DynamicStylesGeneratorFilter=&quot;controlpanel|filemanager|mainmenu|wizard&quot; StaticStylesFile=&quot;~/Providers/HtmlEditorProviders/Fck/FCKeditor/fckstyles.xml&quot; StylesDefaultMode=&quot;dynamic&quot; DynamicCSSGeneratorPath=&quot;~/Providers/HtmlEditorProviders/Fck/FCKCSS.aspx&quot; StaticCSSFile=&quot;~/Providers/HtmlEditorProviders/Fck/FCKeditor/editor/css/fck_editorarea.css&quot; CSSDefaultMode=&quot;dynamic&quot; spellCheck=&quot;ieSpell&quot; AvailableToolbarSkins=&quot;Office2003,Silver&quot; DefaultToolbarSkin=&quot;Office2003&quot; AvailableToolBarSets=&quot;DNNDefault,Default,NoGallery,Basic&quot; DefaultToolbarSet=&quot;DNNDefault&quot; DefaultImageGallerySkin=&quot;Default&quot; DefaultFlashGallerySkin=&quot;Default&quot; DefaultLinksGallerySkin=&quot;Default&quot; FCKDebugMode=&quot;false&quot; UseFCKSource=&quot;false&quot; OptionsOpenMode=&quot;ShowModalDialog&quot; ShowModuleType=&quot;true&quot; FixOldDNNPostback=&quot;false&quot; CustomOptionsDialog=&quot;Admin&quot; /&gt;
  &lt;/providers&gt;
&lt;/htmlEditor&gt;
</pre>
</pre>
</div>
<div class="google_plus_one"><g:plusone size="medium" count="true" url="http://blog.schelian.de/2012/05/dotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr/"></g:plusone></div><div align="right"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>

<a href="http://twitter.com/share?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F05%2Fdotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr%2F&amp;url=http%3A%2F%2Fblog.schelian.de%2F2012%2F05%2Fdotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr%2F" target="_blank" rel="nofollow" title="Twitter"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/twitter.png" alt="Twitter" title="Twitter" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F05%2Fdotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr%2F&amp;title=DotNetNuke+-+Nach+Upgrade+auf+DNN+6.1.X+-+HTML+Modul+speichert+keine+%26Auml%3Bnderungen+mehr" target="_blank" rel="nofollow" title="del.icio.us"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/delicious2.png" alt="del.icio.us" title="del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.schelian.de%2F2012%2F05%2Fdotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr%2F&amp;title=DotNetNuke+-+Nach+Upgrade+auf+DNN+6.1.X+-+HTML+Modul+speichert+keine+%26Auml%3Bnderungen+mehr" target="_blank" rel="nofollow" title="Digg"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/digg.png" alt="Digg" title="Digg" /></a>
<a href="http://facebook.com/sharer.php?u=http%3A%2F%2Fblog.schelian.de%2F2012%2F05%2Fdotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr%2F&amp;t=DotNetNuke+-+Nach+Upgrade+auf+DNN+6.1.X+-+HTML+Modul+speichert+keine+%26Auml%3Bnderungen+mehr" target="_blank" rel="nofollow" title="Facebook"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/facebook.png" alt="Facebook" title="Facebook" /></a>
<a href="http://www.linkedin.com/shareArticle?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F05%2Fdotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr%2F&amp;title=DotNetNuke+-+Nach+Upgrade+auf+DNN+6.1.X+-+HTML+Modul+speichert+keine+%26Auml%3Bnderungen+mehr" target="_blank" rel="nofollow" title="linked-in"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/linkedin.png" alt="linked-in" title="linked-in" /></a>
<a href="http://buzz.yahoo.com/submit?submitUrl=DotNetNuke+-+Nach+Upgrade+auf+DNN+6.1.X+-+HTML+Modul+speichert+keine+%26Auml%3Bnderungen+mehr&amp;u=http%3A%2F%2Fblog.schelian.de%2F2012%2F05%2Fdotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr%2F" target="_blank" rel="nofollow" title="Yahoo Buzz"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/yahoo.png" alt="Yahoo Buzz" title="Yahoo Buzz" /></a>
<a href="http://stumbleupon.com/submit?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F05%2Fdotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr%2F&amp;title=DotNetNuke+-+Nach+Upgrade+auf+DNN+6.1.X+-+HTML+Modul+speichert+keine+%26Auml%3Bnderungen+mehr&amp;newcomment=DotNetNuke+-+Nach+Upgrade+auf+DNN+6.1.X+-+HTML+Modul+speichert+keine+%26Auml%3Bnderungen+mehr" target="_blank" rel="nofollow" title="StumbleUpon"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/su.png" alt="StumbleUpon" title="StumbleUpon" /></a>



]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/05/dotnetnuke-nach-upgrade-auf-dnn-6-1-x-html-modul-speichert-keine-nderungen-mehr/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Generische Methode zur &#220;berschreibung der ToString Methode eigener komplexer Klassen &#8211; C#</title>
		<link>http://blog.schelian.de/2012/04/generische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c/</link>
		<comments>http://blog.schelian.de/2012/04/generische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 13:01:52 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1946</guid>
		<description><![CDATA[Im Zuge eines Projektes musste eine komplexe ineinander verschachtelte Klassenstrukturen aufgebaut werden, um eine ebenfalls komplexe Interfacestruktur einer externen Anwendung abzubilden. Um bei Fehlermeldungen und beim Debuggen (ja ich oute mich, ich debugge auch Code) ordentliche Daten, anstelle des reinen &#8230; <a href="http://blog.schelian.de/2012/04/generische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Im Zuge eines Projektes musste eine komplexe ineinander verschachtelte Klassenstrukturen aufgebaut werden, um eine ebenfalls komplexe Interfacestruktur einer externen Anwendung abzubilden. </p>
<p>Um bei Fehlermeldungen und beim Debuggen (ja ich oute mich, ich debugge auch Code) ordentliche Daten, anstelle des reinen Objektnamen über die ToString() Methode dargestellt zu bekommen, überschreibt man in der jeweiligen Klasse die ToString() Methode und gibt darin an, welche Daten ausgegeben werden sollen.</p>
<p>So in etwas sieht es im Debugger aus, wenn man ToString() <strong>nicht</strong> überschreibt:</p>
<p><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.schelian.de/wp-content/uploads/2012/04/image.png" width="644" height="55"></p>
<p>Für, ich will es mal “<em>Nicht so komplexe Klassen</em>” nennen, kann man das auch im folgenden Stil machen.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:acb14459-f774-430c-a810-008319020cb2" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; pad-line-numbers: true; title: ; notranslate">
        public override string ToString()
        {
            return &quot;Ausschreibungsstatus= &quot; + this.Ausschreibungsstatus +
                &quot; &quot; + &quot;Ausschreibungstext= &quot; + this.Ausschreibungstext;
        }
</pre>
</pre>
</div>
<p>Das ist schon besser und sieht in etwa so aussehen:</p>
<p><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.schelian.de/wp-content/uploads/2012/04/image1.png" width="644" height="48"></p>
<p>Schon besser, aber …. </p>
<p>Ich würde gerne ohne großen Schreibaufwand in jeder Klasse die Public Eigenschaften mit den enthaltenen Werten angezeigt bekommen.</p>
<p>Also musste ich mir hierfür etwas mehr generisches ausdenken.</p>
<p>Und wieder einmal lag die Lösung meines Problems in der Verwendung von Reflection.</p>
<p>Hier nun meine “generische” Methode zur Bildung einer für mich “sinnvollen” ToString() Ausgabe für meine komplexen Klassen.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:bc74f5fa-932a-487d-9093-7cf86af79d2f" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; title: ; notranslate">
public static string ClassPropertiesToString(object obj)
{
    string retVal = obj.GetType().ToString() + &quot;\n&quot;;
    const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy;
    var sourceProperties = obj.GetType().GetProperties(Flags);

    foreach (PropertyInfo pi in sourceProperties)
    {
        if (pi.PropertyType.Namespace != &quot;System&quot;)
            continue;

        retVal += string.Format(&quot;{0}:{1}\n&quot;, pi.Name, pi.GetValue(obj, null));
    }

    return retVal;
}
</pre>
</pre>
</div>
<p>Ich denke der Code ist soweit Selbsterklärend, falls nicht, einfach einen Kommentar abgeben und fragen, dann erläutern wir die Details.</p>
<p>Hier noch der Vollständigkeit halber, das Ergebnis im Debugger:</p>
<p><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.schelian.de/wp-content/uploads/2012/04/image2.png" width="401" height="484"></p>
<p>Und bevor ich es vergesse. </p>
<p>So sieht dann die Überschreibung in der jeweiligen Klasse aus:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:608ee6c2-3901-46c9-834f-83d6433e3e1b" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; title: ; notranslate">
public override string ToString()
{
    return Lager.Global.Common.Generic.ClassPropertiesToString(this);
}
</pre>
</pre>
</div>
<div class="google_plus_one"><g:plusone size="medium" count="true" url="http://blog.schelian.de/2012/04/generische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c/"></g:plusone></div><div align="right"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>

<a href="http://twitter.com/share?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F04%2Fgenerische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c%2F&amp;url=http%3A%2F%2Fblog.schelian.de%2F2012%2F04%2Fgenerische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c%2F" target="_blank" rel="nofollow" title="Twitter"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/twitter.png" alt="Twitter" title="Twitter" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F04%2Fgenerische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c%2F&amp;title=Generische+Methode+zur+%26Uuml%3Bberschreibung+der+ToString+Methode+eigener+komplexer+Klassen+-+C%23" target="_blank" rel="nofollow" title="del.icio.us"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/delicious2.png" alt="del.icio.us" title="del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.schelian.de%2F2012%2F04%2Fgenerische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c%2F&amp;title=Generische+Methode+zur+%26Uuml%3Bberschreibung+der+ToString+Methode+eigener+komplexer+Klassen+-+C%23" target="_blank" rel="nofollow" title="Digg"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/digg.png" alt="Digg" title="Digg" /></a>
<a href="http://facebook.com/sharer.php?u=http%3A%2F%2Fblog.schelian.de%2F2012%2F04%2Fgenerische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c%2F&amp;t=Generische+Methode+zur+%26Uuml%3Bberschreibung+der+ToString+Methode+eigener+komplexer+Klassen+-+C%23" target="_blank" rel="nofollow" title="Facebook"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/facebook.png" alt="Facebook" title="Facebook" /></a>
<a href="http://www.linkedin.com/shareArticle?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F04%2Fgenerische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c%2F&amp;title=Generische+Methode+zur+%26Uuml%3Bberschreibung+der+ToString+Methode+eigener+komplexer+Klassen+-+C%23" target="_blank" rel="nofollow" title="linked-in"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/linkedin.png" alt="linked-in" title="linked-in" /></a>
<a href="http://buzz.yahoo.com/submit?submitUrl=Generische+Methode+zur+%26Uuml%3Bberschreibung+der+ToString+Methode+eigener+komplexer+Klassen+-+C%23&amp;u=http%3A%2F%2Fblog.schelian.de%2F2012%2F04%2Fgenerische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c%2F" target="_blank" rel="nofollow" title="Yahoo Buzz"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/yahoo.png" alt="Yahoo Buzz" title="Yahoo Buzz" /></a>
<a href="http://stumbleupon.com/submit?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F04%2Fgenerische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c%2F&amp;title=Generische+Methode+zur+%26Uuml%3Bberschreibung+der+ToString+Methode+eigener+komplexer+Klassen+-+C%23&amp;newcomment=Generische+Methode+zur+%26Uuml%3Bberschreibung+der+ToString+Methode+eigener+komplexer+Klassen+-+C%23" target="_blank" rel="nofollow" title="StumbleUpon"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/su.png" alt="StumbleUpon" title="StumbleUpon" /></a>



]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/04/generische-methode-zur-berschreibung-der-tostring-methode-eigener-komplexer-klassen-c/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Generische Methode um gleichnamige Properties einer Klasse zu einem Objekt einer anderen Klasse zu kopieren &#8211; C#</title>
		<link>http://blog.schelian.de/2012/03/generische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c/</link>
		<comments>http://blog.schelian.de/2012/03/generische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c/#comments</comments>
		<pubDate>Fri, 23 Mar 2012 08:42:44 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Properties]]></category>
		<category><![CDATA[PropertyInfo]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1936</guid>
		<description><![CDATA[Bei meiner Arbeit kommt es häufiger vor, dass ich umfangreiche Klassen (welche die Daten einer Datenbank repräsentieren) verwende die mal schnell über 50 oder 100 Public Properties (Datenbankfelder) enthalten. Nun kommt immer wieder vor, dass ich zum Beispiel zum Archivieren &#8230; <a href="http://blog.schelian.de/2012/03/generische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Bei meiner Arbeit kommt es häufiger vor, dass ich umfangreiche Klassen (welche die Daten einer Datenbank repräsentieren) verwende die mal schnell über 50 oder 100 Public Properties (Datenbankfelder) enthalten. </p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/03/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://blog.schelian.de/wp-content/uploads/2012/03/image_thumb.png" width="244" height="114"></a>Nun kommt immer wieder vor, dass ich zum Beispiel zum Archivieren solcher Daten, damit meine ich die Daten aus einer Tabelle in eine andere zu verschieben, nicht auf SQL Skripte auf dem Server zugreifen kann oder möchte, da dieses verschieben noch mit zusätzlicher Businesslogik hinterlegt werden muss.</p>
<p>Was bleibt ist dann so etwas in dieser Art:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:676be534-3cee-43dc-9d05-62c26e5c9c1d" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; pad-line-numbers: true; title: ; notranslate">
var auftrag = new Auftrag
    { Position = 1, Artikel = &quot;Mars&quot;, Beschreibung = &quot;Schoko Riegel&quot;, Preis = 1.50 };

var auftragsArchiv = new AuftragArchiv();
auftragsArchiv.Artikel = auftrag.Artikel;
auftragsArchiv.Beschreibung = auftrag.Beschreibung;
auftragsArchiv.Preis = auftrag.Preis;

if (auftragsArchiv.Save())
{
    auftrag.Delete();
}
</pre>
</pre>
</div>
<p>Diese Vorgehensweise kann bei umfangreichen Klassen sehr arbeitsintensiv sein.</p>
<p>Nun gibt es verschiedene Ansätze um sich diesem Problem anzunehmen. Nachfolgend möchte ich einige Lösungsansätze unter Verwendung von Reflection aufzeigen.</p>
<p>Ich nehme an, jeder kennt die Methode ToString(). </p>
<p>Die Idee ist nun eine generische To…. Methode zu erstellen, welche die Aufgaben wie im obigen Beispiel dargestellt, universell erledigt.</p>
<p>Das Ziel soll sein, dass die Public Property Werte eines Objektes, durch Aufruf einer Methode, alle Werte die den gleichen Property Namen&nbsp; haben in ein anderes Objekt einer anderen Klasse kopiert werden.</p>
<p>Hier nun die Variante 1 (Methode einer Klasse):</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:6de5f11b-93de-4444-a5a5-d91191d489a0" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; title: ; notranslate">
public T ToTobject&lt;T&gt;(T target)
{
    const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public;
    var sourceProperties = this.GetType().GetProperties(Flags);

    foreach (PropertyInfo pi in sourceProperties)
        {
            if (pi.CanWrite)
            {
				var propInfoObj = target.GetType().GetProperty(pi.Name);
				if (propInfoObj != null)
				{
					var propValue = pi.GetValue(this, null);
					propInfoObj.SetValue(target, propValue, null);
				}
            }
        }

    return target;
}
</pre>
</pre>
</div>
<p>Der Aufruf um diese Variante zu verwenden sieht dann so aus:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:4873472e-a5e9-4f0d-b5c7-1dd82c113f54" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; highlight: [6]; title: ; notranslate">
var auftrag = new Auftrag
	{ Position = 1, Artikel = &quot;Mars&quot;, Beschreibung = &quot;Schoko Riegel&quot;, Preis = 1.50 };

var auftragsArchiv = new AuftragArchiv();

auftragsArchiv = auftrag.ToTobject(auftragsArchiv);

if (auftragsArchiv.Save())
{
	auftrag.Delete();
}
</pre>
</pre>
</div>
<p>Sieht doch schon ganz gut aus.</p>
<p>Hier noch eine Variante, die noch etwas mehr generisch arbeitet und nur noch mitgeteilt bekommt, welchen Type ich als Rückgabe der Methode erwarte, die Instanz des Objekts der neuen Klasse wird in der Methode selbst erzeugt.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:ba854a89-fa43-47fa-aa89-1a7cbc9987d0" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; title: ; notranslate">
public T ToTobject&lt;T&gt;()
{
	var constructorInfo = typeof(T).GetConstructor(new Type[] { });
	if (constructorInfo != null)
	{
		var target = (T)constructorInfo.Invoke(new object[] { });

		const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public;
		var sourceProperties = this.GetType().GetProperties(Flags);

		foreach (PropertyInfo pi in sourceProperties)
		{
			if (pi.CanWrite)
			{
				if (!pi.IsDefined(typeof(XmlIgnoreAttribute), false))
				{
					var propInfoObj = target.GetType().GetProperty(pi.Name);
					if (propInfoObj != null)
					{
						var propValue = pi.GetValue(this, null);
						propInfoObj.SetValue(target, propValue, null);
					}
				}
			}
		}

		return target;
	}

	return default(T);
}
</pre>
</pre>
</div>
<p>Diese Variante wird dann so verwendet:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:c6c74197-9022-4089-854b-af1237bb472c" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; highlight: [4]; title: ; notranslate">
var auftrag = new Auftrag
	{ Position = 1, Artikel = &quot;Mars&quot;, Beschreibung = &quot;Schoko Riegel&quot;, Preis = 1.50 };

var auftragsArchiv = auftrag.ToTobject&lt;AuftragArchiv&gt;();

if (auftragsArchiv.Save())
{
	auftrag.Delete();
}
</pre>
</pre>
</div>
<p>Diese Variante gefällt mir schon etwas besser</p>
<p>Aber das ist noch nicht das Ende der Methoden Evolution!</p>
<p><img src="http://lh4.ggpht.com/_APjgPmP_12w/SeLksqfHIbI/AAAAAAAAEi8/CZlpxjrjS0A/Evolution25.jpg" width="240" height="218"></p>
<p>Es geht noch generischer (und statisch für alle Klassen verwendbar) und diese Variante folgt nun.</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:fdc50ae3-c82e-466a-b32e-79ce4cdc3307" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; title: ; notranslate">
public static T ToTobject&lt;T&gt;(object source)
{
	var constructorInfo = typeof(T).GetConstructor(new Type[] { });
	if (constructorInfo != null)
	{
		var target = (T)constructorInfo.Invoke(new object[] { });

		const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public;
		var sourceProperties = source.GetType().GetProperties(Flags);

		foreach (PropertyInfo pi in sourceProperties)
		{
			if (pi.CanWrite)
			{
				var propInfoObj = target.GetType().GetProperty(pi.Name);
				if (propInfoObj != null)
				{
					var propValue = pi.GetValue(source, null);
					propInfoObj.SetValue(target, propValue, null);
				}
			}
		}

		return target;
	}

	return default(T);
}
</pre>
</pre>
</div>
<p>Diese nun statische Variante kann auf jedes beliebige Objekt jeder beliebigen Klasse angewendet und für die Rückgabe jeder beliebigen Klasse verwendet werden. Natürlich nur solange diese Klassen auch gleiche Properties enthalten.</p>
<p>Und so wird diese statische Methode verwendet:</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:d022abb7-7403-4b6f-9068-e5969c5eaa99" class="wlWriterEditableSmartContent">
<pre style=white-space:normal>
<pre class="brush: csharp; highlight: [4]; title: ; notranslate">
var auftrag = new Auftrag
	{ Position = 1, Artikel = &quot;Mars&quot;, Beschreibung = &quot;Schoko Riegel&quot;, Preis = 1.50 };

var auftragsArchiv = Auftrag.ToTobject&lt;AuftragArchiv&gt;(auftrag);

if (auftragsArchiv.Save())
{
	auftrag.Delete();
}
</pre>
</pre>
</div>
<p>Mir hat es Spaß gemacht diese Methodik zu entwickeln, evtl. hilft es auch mal jemand anderem beim Lösen “seines” Problem.</p>
<p>Anregungen und Kritik wie immer gerne als Kommentar zum Beitrag.</p>
<div class="google_plus_one"><g:plusone size="medium" count="true" url="http://blog.schelian.de/2012/03/generische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c/"></g:plusone></div><div align="right"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>

<a href="http://twitter.com/share?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F03%2Fgenerische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c%2F&amp;url=http%3A%2F%2Fblog.schelian.de%2F2012%2F03%2Fgenerische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c%2F" target="_blank" rel="nofollow" title="Twitter"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/twitter.png" alt="Twitter" title="Twitter" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F03%2Fgenerische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c%2F&amp;title=Generische+Methode+um+gleichnamige+Properties+einer+Klasse+zu+einem+Objekt+einer+anderen+Klasse+zu+kopieren+-+C%23" target="_blank" rel="nofollow" title="del.icio.us"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/delicious2.png" alt="del.icio.us" title="del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.schelian.de%2F2012%2F03%2Fgenerische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c%2F&amp;title=Generische+Methode+um+gleichnamige+Properties+einer+Klasse+zu+einem+Objekt+einer+anderen+Klasse+zu+kopieren+-+C%23" target="_blank" rel="nofollow" title="Digg"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/digg.png" alt="Digg" title="Digg" /></a>
<a href="http://facebook.com/sharer.php?u=http%3A%2F%2Fblog.schelian.de%2F2012%2F03%2Fgenerische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c%2F&amp;t=Generische+Methode+um+gleichnamige+Properties+einer+Klasse+zu+einem+Objekt+einer+anderen+Klasse+zu+kopieren+-+C%23" target="_blank" rel="nofollow" title="Facebook"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/facebook.png" alt="Facebook" title="Facebook" /></a>
<a href="http://www.linkedin.com/shareArticle?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F03%2Fgenerische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c%2F&amp;title=Generische+Methode+um+gleichnamige+Properties+einer+Klasse+zu+einem+Objekt+einer+anderen+Klasse+zu+kopieren+-+C%23" target="_blank" rel="nofollow" title="linked-in"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/linkedin.png" alt="linked-in" title="linked-in" /></a>
<a href="http://buzz.yahoo.com/submit?submitUrl=Generische+Methode+um+gleichnamige+Properties+einer+Klasse+zu+einem+Objekt+einer+anderen+Klasse+zu+kopieren+-+C%23&amp;u=http%3A%2F%2Fblog.schelian.de%2F2012%2F03%2Fgenerische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c%2F" target="_blank" rel="nofollow" title="Yahoo Buzz"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/yahoo.png" alt="Yahoo Buzz" title="Yahoo Buzz" /></a>
<a href="http://stumbleupon.com/submit?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F03%2Fgenerische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c%2F&amp;title=Generische+Methode+um+gleichnamige+Properties+einer+Klasse+zu+einem+Objekt+einer+anderen+Klasse+zu+kopieren+-+C%23&amp;newcomment=Generische+Methode+um+gleichnamige+Properties+einer+Klasse+zu+einem+Objekt+einer+anderen+Klasse+zu+kopieren+-+C%23" target="_blank" rel="nofollow" title="StumbleUpon"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/su.png" alt="StumbleUpon" title="StumbleUpon" /></a>



]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/03/generische-methode-um-gleichnamige-properties-einer-klasse-zu-einem-objekt-einer-anderen-klasse-zu-kopieren-c/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>ASCII Schnittstellen mit Hilfe von Custom Attributes komfortabel erstellen &#8211; C#</title>
		<link>http://blog.schelian.de/2012/02/ascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c/</link>
		<comments>http://blog.schelian.de/2012/02/ascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c/#comments</comments>
		<pubDate>Tue, 07 Feb 2012 20:27:28 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Attributes]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1923</guid>
		<description><![CDATA[Viele kennen dass Problem, dass Daten zwischen verschiedenen Welten auch Heute noch immer durch Übergabe von Schnittstellendateien, seien es EDI oder auch ASCII Dateien, die einen festen Satzaufbau haben, übergeben werden. Die Definitionen sehen oft wie folgt aus: Wobei die &#8230; <a href="http://blog.schelian.de/2012/02/ascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Viele kennen dass Problem, dass Daten zwischen verschiedenen Welten auch Heute noch immer durch Übergabe von Schnittstellendateien, seien es EDI oder auch ASCII Dateien, die einen festen Satzaufbau haben, übergeben werden.</p>
<p>Die Definitionen sehen oft wie folgt aus:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/02/image.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="" src="http://blog.schelian.de/wp-content/uploads/2012/02/image_thumb.png" alt="" width="644" height="118" border="0" /></a></p>
<p>Wobei die nähere Definition etwas komplexer sein kann:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/02/image1.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="Art: A alphanumerisches Feld N numerisches Feld Länge L Gesamtlänge des Datenfeldes Nachkomma K davon Nachkommastellen Position von von Stelle ... im Datensatz bis bis Stelle ... im Datensatz M/O M Muss-Feld O Kann-Feld (optional) M/O abhängig von anderen Angaben handelt es sich wahlweise um ein Muss- oder ein Kann-Feld " src="http://blog.schelian.de/wp-content/uploads/2012/02/image_thumb1.png" alt="Art: A alphanumerisches Feld N numerisches Feld Länge L Gesamtlänge des Datenfeldes Nachkomma K davon Nachkommastellen Position von von Stelle ... im Datensatz bis bis Stelle ... im Datensatz M/O M Muss-Feld O Kann-Feld (optional) M/O abhängig von anderen Angaben handelt es sich wahlweise um ein Muss- oder ein Kann-Feld " width="644" height="262" border="0" /></a></p>
<p>Der Output, also die Übertragungsdatei enthält dann Daten die ähnlich der nachfolgenden Abbildung aussehen können.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/02/image2.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2012/02/image_thumb2.png" alt="image" width="644" height="182" border="0" /></a></p>
<p>Eine durchaus übliche Vorgehensweise solche Daten erstellen zu können ist es, sich Klassen zu erstellen, die dem eigentlichen benötigten Satzaufbau entsprechen, diese in einer Füll Routine mit Daten füllt und anschließend die Daten der Klasseneigenschaften mit string.Format Stück für Stück ausgibt.</p>
<p>Wäre es nicht wünschenswert, bereits bei der Definition der Klasse festlegen zu können, welche Ausgabeeigenschaften (Ausgabeformat wie führende Nullen, Links oder Rechtsbündig, Anzahl Nachkommastellen usw.) die jeweilige Eigenschaft besitzt und an welcher Position die Eigenschaft ausgegeben werden soll, anzugeben, damit man anschließend die Daten einfach mit einer einzelnen Methode im richtigen Format ausgeben kann.</p>
<p>Und genau da setze ich mit meiner Lösung an:</p>
<p>Man kann mit sogenannten Custom Attributes beliebig zusätzliche Informationen an jedes beliebige Klassenelement anheften. Hierzu muss man eine Klasse erstellen die von System.Attributes abgeleitet wird.</p>
<p>Siehe Nachfolgendes Beispiel, welches ziemlich selbsterklärend sein sollte.</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:9d1fbd0e-4241-4cbe-8eaa-fede6ec5f613" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; pad-line-numbers: true; title: ; wrap-lines: true; notranslate">
using System;
    using System.Reflection;

    public enum ExportFieldType
    {
        /// &lt;summary&gt;
        /// Alphanumeric Field
        /// &lt;/summary&gt;
        Alpha,

        /// &lt;summary&gt;
        /// Numeric Field
        /// &lt;/summary&gt;
        Numeric
    }

    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
    public class ExportFieldAttribute : Attribute
    {
        private readonly int index;

        private readonly int length;

        private readonly ExportFieldType fieldType;

        private readonly int precision;

        private readonly bool optionalField;

        private readonly int fromPos;

        private readonly int toPos;

        /// &lt;summary&gt;
        /// Initializes a new instance of the &lt;see cref=&quot;ExportFieldAttribute&quot;/&gt; class.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;index&quot;&gt;The index.&lt;/param&gt;
        /// &lt;param name=&quot;fieldType&quot;&gt;Type of the field.&lt;/param&gt;
        /// &lt;param name=&quot;length&quot;&gt;The length.&lt;/param&gt;
        /// &lt;param name=&quot;precision&quot;&gt;The precision.&lt;/param&gt;
        /// &lt;param name=&quot;optionalField&quot;&gt;if set to &lt;c&gt;true&lt;/c&gt; [optional field].&lt;/param&gt;
        /// &lt;param name=&quot;fromPos&quot;&gt;From pos.&lt;/param&gt;
        /// &lt;param name=&quot;toPos&quot;&gt;To pos.&lt;/param&gt;
        public ExportFieldAttribute(int index, ExportFieldType fieldType, int length, int precision, bool optionalField = false, int fromPos = -1, int toPos = -1)
        {
            this.index = index;
            this.fieldType = fieldType;
            this.length = length;
            this.precision = precision;
            this.optionalField = optionalField;
            this.fromPos = fromPos;
            this.toPos = toPos;
        }

        public int Index
        {
            get
            {
                return this.index;
            }
        }

        public ExportFieldType FieldType
        {
            get
            {
                return this.fieldType;
            }
        }

        public int Length
        {
            get
            {
                return this.length;
            }
        }

        public int Precision
        {
            get
            {
                return this.precision;
            }
        }

        public bool OptionalField
        {
            get
            {
                return this.optionalField;
            }
        }

        public int FromPos
        {
            get
            {
                return this.fromPos;
            }
        }

        public int ToPos
        {
            get
            {
                return this.toPos;
            }
        }
    }
</pre>
</div>
<p>Nun kann ich in der Klassendefinition in der ich die Datensatzstruktur der Exportdatei abbilde, dieses Attribut zusätzlich zu den Eigenschaften der Klasse verwenden um die für den korrekten Export benötigen Informationen anzuheften.</p>
<p>Die Klasse könnte so aussehen:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:5724d337-dd90-4a99-82d4-1daaee149501" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; title: ; notranslate">
    public class Ksta
    {
        [ExportField(0, ExportFieldType.Alpha, 5, 0)]
        public string Satza
        {
            get
            {
                return &quot;KSTA_&quot;;
            }
        }

        [ExportField(1, ExportFieldType.Numeric, 2, 0)]
        public int Gsber
        {
            get
            {
                return 1;
            }
        }

        [ExportField(2, ExportFieldType.Numeric, 8, 0)]
        public int Kvkda { get; set; }

        [ExportField(3, ExportFieldType.Numeric, 8, 0)]
        public int Dtkda { get; set; }

        [ExportField(4, ExportFieldType.Numeric, 5, 0)]
        public int Kvkvn { get; set; }

        [ExportField(5, ExportFieldType.Numeric, 5, 0)]
        public int Ssbpa { get; set; }

        [ExportField(6, ExportFieldType.Numeric, 8, 3)]
        public int Sskda { get; set; }
    }
</pre>
</div>
<p>Wie aber können wir diese zusätzlichen Attribute verwenden?</p>
<p>Ich möchte dies an einem einfachen Beispiel demonstrieren. Hierzu erweitere ich die Klasse ExportFieldAttribute um folgende Methode:</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:2a80c6ce-7dc8-4855-bcaa-ccb26f51c845" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; title: ; wrap-lines: true; notranslate">
public static string ExportFieldToString(object obj, bool sorted = true)
{
	string buffer = string.Empty;
	PropertyInfo[] pi = obj.GetType().GetProperties();
	if (sorted)
	{
		var propertyInfoSorted = new PropertyInfo[pi.Length];
		foreach (var propertyInfo in pi)
		{
			var attribs = (ExportFieldAttribute[])propertyInfo.GetCustomAttributes(typeof(ExportFieldAttribute), true);
			if (attribs.Length &gt; 0)
			{
				propertyInfoSorted[attribs[0].Index] = propertyInfo;
			}
		}

		pi = propertyInfoSorted;
	}

	foreach (var propertyInfo in pi)
	{
		if (propertyInfo == null)
		{
			continue;
		}

		var attribs = (ExportFieldAttribute[])propertyInfo.GetCustomAttributes(typeof(ExportFieldAttribute), true);

		if (attribs.Length &gt; 0)
		{
			ExportFieldAttribute attrib = attribs[0];
			var o = propertyInfo.GetValue(obj, null);
			if (o == null)
			{
				o = string.Empty;
			}

			if (attrib.FieldType == ExportFieldType.Alpha)
			{
				string t = string.Format(o.ToString().PadRight(attrib.Length));
				buffer += t;
			}

			if (attrib.FieldType == ExportFieldType.Numeric)
			{
				if (attrib.Precision &gt; 0)
				{
					string concat;
					var buf = o.ToString().Split(',');
					if (buf.Length &gt; 1)
					{
						buf[1] = buf[1].PadRight(attrib.Precision, '0').Substring(0, attrib.Precision);
						concat = buf[0] + buf[1];
					}
					else
					{
						concat = buf[0] + string.Empty.PadRight(attrib.Precision, '0');
					}
					string t = string.Format(concat.PadLeft(attrib.Length, '0'));
					buffer += t;
				}
				else
				{
					string t = string.Format(o.ToString().PadLeft(attrib.Length, '0'));
					buffer += t;
				}
			}
		}
	}
	return buffer;
}
</pre>
</div>
<p>Ich möchte an dieser Stelle nun auch keine aufwändige Erklärung der Methode vornehmen, ich denke dass derjenige der sich mit diesem Problem beschäftigt erkennen wird was darin geschieht.</p>
<p>Und um diese Methode zu verwenden, also um den Satzaufbau der Daten so zu erhalten wie ich ihn mit den Attributen definiert habe, überschreibe ich einfach die ToString() Methode der Klasse in welcher ich die Datenstruktur abgebildet habe.</p>
<p>Das sieht dann so aus (In der Klasse Ksta):</p>
<div id="scid:C89E2BDB-ADD3-4f7a-9810-1B7EACF446C1:6c1bd2f7-cd57-476b-b3e0-96c3947e6e9f" class="wlWriterEditableSmartContent" style="margin: 0px; display: inline; float: none; padding: 0px;">
<pre class="brush: csharp; title: ; notranslate">
        public override string ToString()
        {
            return ExportFieldAttribute.ExportFieldToString(this);
        }
</pre>
</div>
<p>Wenn ich nun eine Instanz der Klasse Ksta erstelle, diese dann mit Daten fülle und anschließen die ToString Methode aufrufe erhalten ich die Daten genau in der definierten Struktur.</p>
<p>Wenn jemand noch Fragen zu dem Thema hat, oder doch noch weiterführende Erläuterungen benötigt, dann einfach per Kommentar die Fragen oder Anregungen stellen.</p>
<div class="google_plus_one"><g:plusone size="medium" count="true" url="http://blog.schelian.de/2012/02/ascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c/"></g:plusone></div><div align="right"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>

<a href="http://twitter.com/share?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F02%2Fascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c%2F&amp;url=http%3A%2F%2Fblog.schelian.de%2F2012%2F02%2Fascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c%2F" target="_blank" rel="nofollow" title="Twitter"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/twitter.png" alt="Twitter" title="Twitter" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F02%2Fascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c%2F&amp;title=ASCII+Schnittstellen+mit+Hilfe+von+Custom+Attributes+komfortabel+erstellen+-+C%23" target="_blank" rel="nofollow" title="del.icio.us"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/delicious2.png" alt="del.icio.us" title="del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.schelian.de%2F2012%2F02%2Fascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c%2F&amp;title=ASCII+Schnittstellen+mit+Hilfe+von+Custom+Attributes+komfortabel+erstellen+-+C%23" target="_blank" rel="nofollow" title="Digg"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/digg.png" alt="Digg" title="Digg" /></a>
<a href="http://facebook.com/sharer.php?u=http%3A%2F%2Fblog.schelian.de%2F2012%2F02%2Fascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c%2F&amp;t=ASCII+Schnittstellen+mit+Hilfe+von+Custom+Attributes+komfortabel+erstellen+-+C%23" target="_blank" rel="nofollow" title="Facebook"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/facebook.png" alt="Facebook" title="Facebook" /></a>
<a href="http://www.linkedin.com/shareArticle?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F02%2Fascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c%2F&amp;title=ASCII+Schnittstellen+mit+Hilfe+von+Custom+Attributes+komfortabel+erstellen+-+C%23" target="_blank" rel="nofollow" title="linked-in"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/linkedin.png" alt="linked-in" title="linked-in" /></a>
<a href="http://buzz.yahoo.com/submit?submitUrl=ASCII+Schnittstellen+mit+Hilfe+von+Custom+Attributes+komfortabel+erstellen+-+C%23&amp;u=http%3A%2F%2Fblog.schelian.de%2F2012%2F02%2Fascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c%2F" target="_blank" rel="nofollow" title="Yahoo Buzz"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/yahoo.png" alt="Yahoo Buzz" title="Yahoo Buzz" /></a>
<a href="http://stumbleupon.com/submit?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F02%2Fascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c%2F&amp;title=ASCII+Schnittstellen+mit+Hilfe+von+Custom+Attributes+komfortabel+erstellen+-+C%23&amp;newcomment=ASCII+Schnittstellen+mit+Hilfe+von+Custom+Attributes+komfortabel+erstellen+-+C%23" target="_blank" rel="nofollow" title="StumbleUpon"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/su.png" alt="StumbleUpon" title="StumbleUpon" /></a>



]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/02/ascii-schnittstellen-mit-hilfe-von-custom-attributes-komfortabel-erstellen-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>SQL Server Management Studio &#8211; Saving changes is not permitted</title>
		<link>http://blog.schelian.de/2012/01/sql-server-management-studio-saving-changes-is-not-permitted/</link>
		<comments>http://blog.schelian.de/2012/01/sql-server-management-studio-saving-changes-is-not-permitted/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 12:15:27 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Allgemeines]]></category>
		<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[SQL Server Management Studio]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1913</guid>
		<description><![CDATA[Heute bin ich wieder mal (jedes mal wenn ich das Management Studio neu installiere) über ein bereits seit langem bekanntes Problem gestolpert. Nachdem ich einer vorhandenen Tabelle  einige Felder über den Table Designer hinzugefügt habe und diese Änderungen speichern wollte, &#8230; <a href="http://blog.schelian.de/2012/01/sql-server-management-studio-saving-changes-is-not-permitted/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Heute bin ich wieder mal (jedes mal wenn ich das Management Studio neu installiere) über ein bereits seit langem bekanntes Problem gestolpert.</p>
<p>Nachdem ich einer vorhandenen Tabelle  einige Felder über den Table Designer hinzugefügt habe und diese Änderungen speichern wollte, habe ich folgende Meldung erhalten:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/01/image.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="Saving changes is not permitted. The changes you have made require the&lt;br /&gt;<br />
following tables to be dropped and re-created, You have either made changes&lt;br /&gt;<br />
to a table that can’t be re-created or enabled the option Prevent saving&lt;br /&gt;<br />
changes that require the table to be re-created," src="http://blog.schelian.de/wp-content/uploads/2012/01/image_thumb.png" alt="Saving changes is not permitted. The changes you have made require the&lt;br /&gt;<br />
following tables to be dropped and re-created, You have either made changes&lt;br /&gt;<br />
to a table that can’t be re-created or enabled the option Prevent saving&lt;br /&gt;<br />
changes that require the table to be re-created," width="520" height="100" border="0" /></a></p>
<blockquote><p>Verzeihung liebes Management Studio, <strong>Nein</strong> ich möchte nicht dass du die Tabelle löschst und sie mit der neuen Struktur Neu erstellst.</p></blockquote>
<p>Da mir aber zu diesem Zeitpunkt wieder mal entfallen war, dass ich dieses Problem früher schon hatte, habe ich mich kurzerhand an meine Timeline in Twitter gewandt.</p>
<p>Dort habe ich prompt, wie fast immer,  die richtige Antwort erhalten.</p>
<p>Danke dafür an <a href="http://twitter.com/#!/Cayas_Software" target="_blank">Sebastian</a> und <a href="http://twitter.com/#!/norberteder" target="_blank">Norbert</a>, bei den beiden Funktioniert das Gedächtnis wohl noch besser als bei mir.</p>
<p>Und damit ich in Zukunft selbst daran denke, und auch <a href="http://twitter.com/#!/ufwe" target="_blank">Uwe</a> nachschauen kann wie man das Problem lösen kann, habe ich diesen Beitrag geschrieben.</p>
<p><span style="text-decoration: underline;">Und hier nun die Lösung des Problems:</span></p>
<p>Man kann in den Optionen einstellen, ob das Management Studio diese Vorgehensweise “Warnung ausgeben und das Drop/Create Szenario” anstelle einer “Änderung der Tabellenstruktur”, verwenden soll (Siehe nachfolgende Abbildung).</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2012/01/SNAGHTML15e0776.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="SNAGHTML15e0776" src="http://blog.schelian.de/wp-content/uploads/2012/01/SNAGHTML15e0776_thumb.png" alt="SNAGHTML15e0776" width="644" height="433" border="0" /></a></p>
<p>Vielleicht hilft das hier nicht nur <a href="http://twitter.com/#!/schelianhp" target="_blank">mir</a> und <a href="http://twitter.com/#!/ufwe" target="_blank">Uwe</a></p>
<div class="google_plus_one"><g:plusone size="medium" count="true" url="http://blog.schelian.de/2012/01/sql-server-management-studio-saving-changes-is-not-permitted/"></g:plusone></div><div align="right"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>

<a href="http://twitter.com/share?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F01%2Fsql-server-management-studio-saving-changes-is-not-permitted%2F&amp;url=http%3A%2F%2Fblog.schelian.de%2F2012%2F01%2Fsql-server-management-studio-saving-changes-is-not-permitted%2F" target="_blank" rel="nofollow" title="Twitter"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/twitter.png" alt="Twitter" title="Twitter" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F01%2Fsql-server-management-studio-saving-changes-is-not-permitted%2F&amp;title=SQL+Server+Management+Studio+-+Saving+changes+is+not+permitted" target="_blank" rel="nofollow" title="del.icio.us"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/delicious2.png" alt="del.icio.us" title="del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.schelian.de%2F2012%2F01%2Fsql-server-management-studio-saving-changes-is-not-permitted%2F&amp;title=SQL+Server+Management+Studio+-+Saving+changes+is+not+permitted" target="_blank" rel="nofollow" title="Digg"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/digg.png" alt="Digg" title="Digg" /></a>
<a href="http://facebook.com/sharer.php?u=http%3A%2F%2Fblog.schelian.de%2F2012%2F01%2Fsql-server-management-studio-saving-changes-is-not-permitted%2F&amp;t=SQL+Server+Management+Studio+-+Saving+changes+is+not+permitted" target="_blank" rel="nofollow" title="Facebook"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/facebook.png" alt="Facebook" title="Facebook" /></a>
<a href="http://www.linkedin.com/shareArticle?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F01%2Fsql-server-management-studio-saving-changes-is-not-permitted%2F&amp;title=SQL+Server+Management+Studio+-+Saving+changes+is+not+permitted" target="_blank" rel="nofollow" title="linked-in"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/linkedin.png" alt="linked-in" title="linked-in" /></a>
<a href="http://buzz.yahoo.com/submit?submitUrl=SQL+Server+Management+Studio+-+Saving+changes+is+not+permitted&amp;u=http%3A%2F%2Fblog.schelian.de%2F2012%2F01%2Fsql-server-management-studio-saving-changes-is-not-permitted%2F" target="_blank" rel="nofollow" title="Yahoo Buzz"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/yahoo.png" alt="Yahoo Buzz" title="Yahoo Buzz" /></a>
<a href="http://stumbleupon.com/submit?url=http%3A%2F%2Fblog.schelian.de%2F2012%2F01%2Fsql-server-management-studio-saving-changes-is-not-permitted%2F&amp;title=SQL+Server+Management+Studio+-+Saving+changes+is+not+permitted&amp;newcomment=SQL+Server+Management+Studio+-+Saving+changes+is+not+permitted" target="_blank" rel="nofollow" title="StumbleUpon"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/su.png" alt="StumbleUpon" title="StumbleUpon" /></a>



]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2012/01/sql-server-management-studio-saving-changes-is-not-permitted/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SugarSync &#8211; Windows 7 64 BIT Explorer friert ein und st&#252;rzt ab</title>
		<link>http://blog.schelian.de/2011/12/sugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab/</link>
		<comments>http://blog.schelian.de/2011/12/sugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 08:14:18 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[SugarSync]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Win7]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1903</guid>
		<description><![CDATA[Bevor ich zum eigentlichen Problem mit SugarSync und dem Explorer Absturz komme möchte ich kurz Beschreiben wie und warum ich zu SugarSync gekommen bin. Meine Geschichte zu SugarSync Vor einigen Wochen, eigentlich sind es schon Monate her, bin ich auf &#8230; <a href="http://blog.schelian.de/2011/12/sugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Bevor ich zum eigentlichen Problem mit SugarSync und dem Explorer Absturz komme möchte ich kurz Beschreiben wie und warum ich zu SugarSync gekommen bin.</p>
<h4>Meine Geschichte zu SugarSync</h4>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image36.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb12.png" alt="image" width="189" height="69" align="left" border="0" /></a>Vor einigen Wochen, eigentlich sind es schon Monate her, bin ich auf das Synchronisations Tool <a href="https://www.sugarsync.com/" target="_blank">SugarSync</a> aufmerksam geworden.</p>
<p>Dieses Tool stellt ähnliche Funktionalitäten wie die <a href="http://www.dropbox.com/" target="_blank">Dropbox</a> oder <a href="http://explore.live.com/windows-live-mesh" target="_blank">Live Mesh</a> zur Verfügung.</p>
<p>Da ich sowohl Dropbox als auch Live Mesh einsetze, und das nicht weil ich gerne mehrere Tools für ein und denselben Zweck einsetze, sondern weil jedes der Tools ein Alleinstellungsmerkmal hat, dass ich benötige musste ich beide verwenden.</p>
<h5>Alleinstellungsmerkmal Dropbox (gegenüber Live Mesh)</h5>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image37.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb13.png" alt="image" width="189" height="57" align="left" border="0" /></a>Bei der Dropbox war das Alleinstellungsmerkmal die Möglichkeit “Public Links” erstellen zu können, die man einfach weiter geben kann, damit ein anderer sich die mit dem “Public Link” verknüpfte Datei herunterladen kann.</p>
<h5>Alleinstellungsmerkmal Live Mesh (gegenüber Dropbox)</h5>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image38.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb14.png" alt="image" width="89" height="85" align="left" border="0" /></a>Bei Live Mesh, ist es die Möglichkeit beliebige Ordner aus dem Dateisystem in die Synchronisation aufzunehmen und mit beliebigen Ordner auf anderen Geräten synchronisieren zu können.</p>
<h5>SugarSync Alleinstellungsmerkmal (gegenüber Live Mesh und Dropbox)</h5>
<p>SugarSync, kann sowohl “Public Links” erstellen, als auch beliebige Ordner des Dateisystems synchronisieren. Damit würden meine beiden speziellen Anforderungen von einem Tool erfüllt werden und ich müsste nicht auf mehrere Tools zurückgreifen.</p>
<h4>Nach der Installation &#8211; der erste Start</h4>
<p>Nachdem ich also überzeugt war, dass ich durch SugarSync die beiden Produkte Live Mesh und Dropbox ersetzen zu können, habe ich SugarSync auf 4 Geräten installiert.</p>
<ul>
<li>2 Geräte mit Windows 7 64 Bit</li>
<li>1 Gerät mit Windows 7 32 Bit</li>
<li>1 Gerät mit Windows XP 32 Bit</li>
</ul>
<p>Auf 3 der 4 Geräte funktionierte alles wie erwartet, auf dem 4ten Gerät, das leider mein aktueller Entwicklungsrechner (Windows 7 64 Bit) war, trat das folgende Problem auf:</p>
<p>Der Versuch, nachdem der Rechner neu gestartet wurde, ein Windows Explorer Fenster zu öffnen führte dazu, dass dieses einfriert und nach einigen Sekunden abstürzt.</p>
<p>Neben dem Absturz des Explorer Fenster wurden auch einige Programme aus der Symbolleiste beendet:</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="clip_image002" src="http://blog.schelian.de/wp-content/uploads/2011/12/clip_image002.gif" alt="clip_image002" width="479" height="98" border="0" /></p>
<p>Da ich mir nicht erklären konnte warum dieses Problem auftritt, ich aber sicher war, dass ich nicht der einzige sein kann, der dieses Problem hat, habe ich eine Mail an den Support geschrieben, und gehofft, der würde mir eine Antwort geben können.</p>
<h4><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image39.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; float: right; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb15.png" alt="image" width="211" height="66" align="right" border="0" /></a>Die Support Odyssee</h4>
<p>Am 26.10.2011 habe ich dann eine ausführliche Beschreibung meines Problems per E-Mail an den Support gesendet.<br />
Da SugarSync (sowohl das Produkt als auch die Webseite) auch auf Deutsch verfügbar ist, hatte ich ohne groß darüber nachzudenken, dass E-Mai in Deutsch geschrieben.</p>
<p>Am 01.11.2011 habe ich dann eine Nachricht vom Support erhalten (in Englisch), dass Sie das Ticket geschlossen haben, da ich mich nicht weiter gemeldet habe. <img class="wlEmoticon wlEmoticon-surprisedsmile" style="border-style: none;" src="http://blog.schelian.de/wp-content/uploads/2011/12/wlEmoticon-surprisedsmile.png" alt="Erstauntes Smiley" /></p>
<p>Am 02.11.2011 erhalte ich dann aber ein Mail vom Support, indem Sie mir erklären, dass ich doch bitte mein Problem in Englisch an sie senden soll, da der Support nur in English gegeben werden könnte.</p>
<p>Ich hatte in den folgenden Tagen wenig Zeit und habe mich daher erst wieder am 23.11.2011, nun in Englisch, an den Support gewendet und mein Problem in einer ausführlichen Mail beschrieben und darum gebeten mir mitzuteilen, wie man ein Error Logging einschalten könnte, damit ich mehr Informationen zu dem Problem liefern könnte.</p>
<p>Immerhin habe ich nun am gleichen Tag eine (automatisierte) Antwort bekommen, dass meine Mail angekommen sei und sich “ASAP” jemand um mein Problem kümmern würde.</p>
<p>Am 01.12.2011 (ist das ASAP) erhalte ich dann eine Mail, dass sie sich überhaupt nicht vorstellen können wie das Problem auftreten könnte, sie aber gerne mal Remote auf meinen Computer schauen würden um das Problem zu analysieren.</p>
<p>Ich habe dann kurz geantwortet, dass ich davon keinen Gebrauch machen möchte. Damit war klar ich werde das Problem selbst angehen, sobald ich etwas Zeit dafür habe.</p>
<h4>Die Zeit war Reif für eine Analyse</h4>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image40.png"><img style="background-image: none; margin: 0px 8px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb16.png" alt="image" width="182" height="97" align="left" border="0" /></a>Da ich SugarSync auf verschiedenen Rechnern installiert und das Problem in dieser Art nur auf einem Rechner aufgetreten ist, habe ich zuerst versucht die Besonderheit dieses Rechners zu ermitteln.</p>
<p>Hierbei habe ich festgestellt, dass ich einen Rechner mit exakt den gleichen installierten Programmen habe, auf dem das Problem nicht auftritt. Der einzige Unterschied, der Rechner auf dem es läuft ist ein 32 Bit Windows.</p>
<p>Also tritt das Problem vermutlich nur auf einem 64 Bit System auf.</p>
<p>Einer der installierten Rechner auf dem es läuft ist ein Windows 7 64 Bit Rechner. Dann vergleiche ich doch mal die darauf installierten Programme.</p>
<p>Bei Durchsicht der installierten Programme bekomme ich relativ schnell eine Ahnung woran das Problem liegen kann.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image41.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; float: right; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb17.png" alt="image" width="100" height="58" align="right" border="0" /></a>Auf dem Rechner mit dem Problem ist neben SugarSync auch TortoiseHg installiert, das ist auf dem anderen Windows 7 64 Bit Rechner nicht (mehr) installiert.</p>
<p>Ich möchte kurz erklären warum meine Vermutung relativ schnell in diese Richtung ging:</p>
<blockquote><p>Das Stichwort lautet: Overlay Icons.</p></blockquote>
<p>Sowohl TortoiseHg als auch SugarSync verwenden Overlay Icons um den Dateistatus im Windows Explorer darstellen zu können.</p>
<p>Wie sich nachfolgend herausstellen sollte, liegt tatsächlich das Problem an der Verwendung dieser Overlay Icons.</p>
<h4>Die Lösung (vorübergehend auf jeden Fall)</h4>
<p>Sowohl TortoiseHg als auch SugarSync bieten die Möglichkeit die Darstellung der Overlay Icons ein und ausschalten zu können.</p>
<p>Man kann eine der beiden Overlay Icon Anzeigen deaktivieren, und das Problem tritt nicht mehr auf. (Ich werde natürlich dieses Problem nun an SugarSync melden, damit sie das Problem aktiv angehen können, mal schauen ob und wann das dann geschieht)</p>
<p>Hier die Einstellungen die man ändern muss damit die beiden Produkte nebeneinander auf dem gleichen Rechner funktionieren.</p>
<p>Entweder dieses Option ausschalten (SugarSync):</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/SNAGHTML6d562c.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="SNAGHTML6d562c" src="http://blog.schelian.de/wp-content/uploads/2011/12/SNAGHTML6d562c_thumb.png" alt="SNAGHTML6d562c" width="509" height="484" border="0" /></a></p>
<p>Oder diese hier (TortoiseHg) ausschalten:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/SNAGHTML6e7984.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="SNAGHTML6e7984" src="http://blog.schelian.de/wp-content/uploads/2011/12/SNAGHTML6e7984_thumb.png" alt="SNAGHTML6e7984" width="644" height="477" border="0" /></a></p>
<p>Und nun mal schauen ob der “Live Test” mit SugarSync meine Bedürfnisse ganz befriedigen kann und ich dann in naher Zukunft die beiden anderen Produkte ganz von meinen Rechnern entfernen kann.</p>
<div class="google_plus_one"><g:plusone size="medium" count="true" url="http://blog.schelian.de/2011/12/sugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab/"></g:plusone></div><div align="right"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>

<a href="http://twitter.com/share?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fsugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab%2F&amp;url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fsugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab%2F" target="_blank" rel="nofollow" title="Twitter"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/twitter.png" alt="Twitter" title="Twitter" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fsugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab%2F&amp;title=SugarSync+-+Windows+7+64+BIT+Explorer+friert+ein+und+st%26uuml%3Brzt+ab" target="_blank" rel="nofollow" title="del.icio.us"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/delicious2.png" alt="del.icio.us" title="del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fsugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab%2F&amp;title=SugarSync+-+Windows+7+64+BIT+Explorer+friert+ein+und+st%26uuml%3Brzt+ab" target="_blank" rel="nofollow" title="Digg"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/digg.png" alt="Digg" title="Digg" /></a>
<a href="http://facebook.com/sharer.php?u=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fsugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab%2F&amp;t=SugarSync+-+Windows+7+64+BIT+Explorer+friert+ein+und+st%26uuml%3Brzt+ab" target="_blank" rel="nofollow" title="Facebook"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/facebook.png" alt="Facebook" title="Facebook" /></a>
<a href="http://www.linkedin.com/shareArticle?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fsugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab%2F&amp;title=SugarSync+-+Windows+7+64+BIT+Explorer+friert+ein+und+st%26uuml%3Brzt+ab" target="_blank" rel="nofollow" title="linked-in"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/linkedin.png" alt="linked-in" title="linked-in" /></a>
<a href="http://buzz.yahoo.com/submit?submitUrl=SugarSync+-+Windows+7+64+BIT+Explorer+friert+ein+und+st%26uuml%3Brzt+ab&amp;u=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fsugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab%2F" target="_blank" rel="nofollow" title="Yahoo Buzz"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/yahoo.png" alt="Yahoo Buzz" title="Yahoo Buzz" /></a>
<a href="http://stumbleupon.com/submit?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fsugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab%2F&amp;title=SugarSync+-+Windows+7+64+BIT+Explorer+friert+ein+und+st%26uuml%3Brzt+ab&amp;newcomment=SugarSync+-+Windows+7+64+BIT+Explorer+friert+ein+und+st%26uuml%3Brzt+ab" target="_blank" rel="nofollow" title="StumbleUpon"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/su.png" alt="StumbleUpon" title="StumbleUpon" /></a>



]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2011/12/sugarsync-windows-7-64-bit-explorer-friert-ein-und-stuerzt-ab/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP Debugging für .NET Dummies (IIS &#8211; WordPress &#8211; PhpStorm &#8211; Xdebug)</title>
		<link>http://blog.schelian.de/2011/12/php-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug/</link>
		<comments>http://blog.schelian.de/2011/12/php-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug/#comments</comments>
		<pubDate>Wed, 14 Dec 2011 09:55:26 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[Wissenswert]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[MySql]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PhpStorm]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1859</guid>
		<description><![CDATA[Vor einigen Tagen stand ich vor der Aufgabe im Zuge eines kleinen Projektes eine Verbindung zwischen der .NET und der PHP Welt herstellen zu müssen. Als .NET Entwickler bin ich es eigentlich gewohnt mit Visual Studio zu arbeiten. Auch wenn &#8230; <a href="http://blog.schelian.de/2011/12/php-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Vor einigen Tagen stand ich vor der Aufgabe im Zuge eines kleinen Projektes eine Verbindung zwischen der .NET und der PHP Welt herstellen zu müssen.</p>
<p><img style="margin: 0px 6px 0px 0px; display: inline; float: left;" src="http://t0.gstatic.com/images?q=tbn:ANd9GcSmGYVmL0CakR5uzlVIyEqB-OpDzBfyHvSUDs5jqgpXz-dkC76s" alt="" align="left" />Als .NET Entwickler bin ich es eigentlich gewohnt mit Visual Studio zu arbeiten. Auch wenn man nicht immer mit VS super zufrieden ist, kann man damit aber doch ganz ordentlich Entwickeln. daher war es mir  wichtig auch für diesen PHP Ausflug zuerst einmal eine “gescheite” Entwicklungsumgebung für dieses Projekt aufzubauen.</p>
<p>Da ich neben ReSharper (Visual Studio Plugin) bereits WebStorm (beides Erstklassige Produkte von JetBrains) einsetze war für mich sehr schnell klar, dass als PHP IDE PhpStorm vom gleichen Hersteller zum Einsatz kommen soll.</p>
<p>Unter einer “gescheiten” Entwicklungsumgebung verstehe ich ab er als minimale Anforderung:</p>
<ul>
<li>Einen guten Editor (IDE) (Am besten Syntax highlighting)</li>
<li>Einen ordentlichen Debugger (Am besten in der IDE integriert)</li>
</ul>
<p>Mit PhpStorm habe ich die “gute”  IDE bereits ausgewählt.</p>
<p>Das Problem des integrierten Debugger kann ich aber weder mir PhpStorm noch mit einer anderen mir bekannten Entwicklungsumgebung für PHP direkt und einfach lösen.</p>
<p>Um PHP zu debuggen gibt es eine Extension mit der Bezeichnung “Xdebug”,  die direkt zusammen mit PHP arbeitet und in der PHP.INI konfiguriert werden muss.</p>
<p><img style="display: inline; float: left;" src="http://t3.gstatic.com/images?q=tbn:ANd9GcRzAOouKPYj-hUV0gP2kTpQMVNdDBITpkVvtDNqPtzUsXg0R6BG" alt="" width="112" height="112" align="left" />Und genau diese Konfiguration und Einrichtung ist mir als .NET Entwickler irgendwie nicht wirklich einfach von der Hand gegangen.</p>
<p>Die Konfiguration von Xdebug in PHP war noch recht einfach und auch ganz ordentlich dokumentiert. Wie man jedoch aus der IDE (PhpStorm) Breakpoints setzen und den Debugger nutzen kann, dass blieb zuerst ein Buch mit vielen Siegeln.</p>
<p>Über die Konfiguration von PHP und Xdebug auf einem IIS unter Verwendung von PhpStorm, gab es eigentlich keine oder nur unvollständige Anleitungen (oder ich habe sie einfach nicht gefunden).</p>
<p>Nun aber genug der Vorreden, ab hier geht es nun um die Beschreibung (Schritt für Schritt Anleitung) wie man auf einem Windows Rechner eine komplette Entwicklungsumgebung für PHP einrichten kann, mit der sogar ein .NET Entwickler etwas anfangen kann <img src='http://blog.schelian.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  .</p>
<p><strong>Systemumgebung, Programme, Voraussetzungen:</strong></p>
<ul>
<li>Windows 2008 R2 Server (Windows 7 mit installiertem IIS würde auch funktionieren)</li>
<li>WordPress (Oder jede andere PHP Anwendung wie z.B. Joomla)</li>
<li><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; float: right; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb.png" alt="image" width="146" height="84" align="right" border="0" /></a>PhpStorm 3.X</li>
<li>Xdebug (Debugger Tool für PHP)</li>
</ul>
<h3>Installation / Überprüfung IIS</h3>
<p>Benötigt wird ein IIS 7 oder 7.5 (kein IIS Express).</p>
<p>Unter dem W2K8 geht das einfach indem man die Serverrolle Webserver (IIS) auswählt und installiert.</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image1.png" alt="image" width="644" height="475" border="0" /></p>
<p>Es werden keine speziellen Rollendienste benötigt, also einfach nur auf Weiter und Installieren klicken bis die Installation abgeschlossen ist.</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image2.png" alt="image" width="644" height="474" border="0" /></p>
<h3>WordPress (und alle benötigten Komponenten installieren)</h3>
<p>Der einfachste Weg um ein Produkt wie WordPress auf einem Windows Rechner zu installieren ist sicherlich die Verwendung des Web Plattform Installer (Der übrigens auch in WebMatrix integriert ist).</p>
<p>Der Web Plattform Installer stellt selbst fest welche Komponenten auf dem Rechner vorhanden sind und welche installiert werden müssen um das ausgewählte Produkt verwenden zu können.</p>
<p><a href="http://www.microsoft.com/web/downloads/platform.aspx" target="_blank">Hier kann man dem Web Plattform Installer herunterladen</a></p>
<p>Also Web Plattform Installer herunterladen und aufrufen (installieren).</p>
<p>Nach der Initialisierung geben wir im Suchfeld “WordPress” ein und bestätigen die Eingabe mit der Enter Taste.</p>
<p>Nun wählen wir WordPress in der gewünschten Sprache aus und betätigen den Button hinzufügen.</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image3.png" alt="image" width="644" height="449" border="0" /></p>
<p>Wenn man nun auf Installieren klickt werden die folgenden Tools und Produkte installiert.</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image4.png" alt="image" width="644" height="583" border="0" /></p>
<p>Während der Installation müssen wir noch folgende Angaben machen:</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image5.png" alt="image" width="644" height="445" border="0" /></p>
<p>Da ich eine Entwicklungsumgebung aufbauen möchte, werde ich MySQL auf dem lokalen Rechner installieren lassen. (Weiter klicken)</p>
<p>Nun bekommt man noch mal alle zu installierenden Produkte angezeigt und wird aufgefordert den Lizenzbedingungen zuzustimmen.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image6.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb1.png" alt="image" width="125" height="35" border="0" /></a></p>
<p>Jetzt muss noch ein root Passwort für die MySQL Installation angeben werden:</p>
<p>Beim Weiter Klicken, geht die Installation schon los.</p>
<p>Die Installation kann je nach Internet Geschwindigkeit unterschiedlich lange dauern, da während der Installation die aktuellen Pakete heruntergeladen und installiert werden.</p>
<p>Bei DSL 16000 und einem Rechner mit I7 Prozessor dauert die Gesamte Installation 3 &#8211; 5 Minuten.</p>
<h4>Nächster Stop Webseite für WP konfigurieren:</h4>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image7.png" alt="image" width="644" height="444" border="0" /></p>
<p>Da ich WordPress nur in der Entwicklungsumgebung aufrufen und nicht von extern zugänglich machen möchte, lasse ich die Einstellungen wie vorgegeben. Das führt nach der Installation dazu, dass die Seite unter localhost/wordpress erreichbar sein wird.</p>
<h4>Noch ein Stop Datenbank erstellen</h4>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image8.png" alt="image" width="644" height="443" border="0" /></p>
<h4>Datenbank auswählen / erstellen und Root Passwort</h4>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image9.png" alt="image" width="644" height="319" border="0" /></p>
<p>Da wir MySQL gerade erst installiert haben, müssen wir natürlich eine Neue Datenbank erstellen.</p>
<p>Im Eingabefeld (roter Pfeil(, müssen wir das Root Passwort eingeben, dass wir während der Installation von MySQL vergeben haben.</p>
<p>Datenbankbenutzer / Passwort eingeben</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image10.png" alt="image" width="644" height="522" border="0" /></p>
<p>Die Einträge mit den grünen Pfeilen müssen wir nicht anpassen.</p>
<p>In den Feldern mit den roten Pfeilen muss nun noch ein Kennwort für den Datenbank Benutzer eingegeben werden. Das muss nicht, kann aber das gleiche wie das Root Passwort sein (aber bitte nur auf lokalen Entwicklungssystemen, sonst sollten die Datenbank Passwort nicht dem Root Passwort entsprechen)</p>
<p>In allen weiteren Felder müssen keine Eingaben gemacht werden.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image11.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb2.png" alt="image" width="126" height="33" border="0" /></a></p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image12.png" alt="image" width="644" height="442" border="0" /></p>
<p>Damit sind nun WordPress und alle benötigten Tools und Programme installiert.</p>
<p>WordPress sollte nun schon funktionieren, also testen wir es mal.</p>
<p>Browser öffnen und localhost/wordpress eingeben.</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image13.png" alt="image" width="644" height="487" border="0" /></p>
<p>Am besten geben wir gleich die notwendigen Daten für WP ein, so dass wir später direkt auf die Homepage von WordPress und nicht mehr auf die Admin Setup Seite geleitetet werden.</p>
<p>Beim nächsten Aufruf sollte das so aussehen:</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image14.png" alt="image" width="644" height="482" border="0" /></p>
<h3>Xdebug installieren</h3>
<p>Nun müssen wir die <a href="http://xdebug.org/index.php" target="_blank">Xdebug Extension</a> installieren.</p>
<p>Wie wir weiter oben sehen wurde PHP in der Version 5.2 installiert, also müssen wir nun auch die Xdebug Version für PHP 5.2 herunterladen und installieren.</p>
<blockquote><p><strong>Aber Achtung es gibt 2 verschiedene Varianten:</strong></p></blockquote>
<p>Eine Thread sichere und eine Nicht Thread Sichere (nts), für die Installtion auf dem IIS muss die nts Variante verwendet werden.</p>
<p><a href="http://xdebug.org/files/php_xdebug-2.1.2-5.2-vc6-nts.dll" target="_blank">Hier geht es direkt zum Download xdebug version 2.1.2 für PHP 5.2 Not Thread Safe</a></p>
<p>Die Extension besteht lediglich aus einer DLL Datei mit dem Namen:</p>
<p><strong>php_xdebug-2.1.2-5.2-vc6-nts.dll</strong></p>
<p>Nachdem man die Datei heruntergeladen hat muss diese in das Ext Verzeichnis von PHP kopiert werden.</p>
<p>Bei einer Standardinstallation auf einem W2K8 Server (64 BIT) findet man das Ext Verzeichnis unter folgendem Pfad:</p>
<p><strong>C:\Program Files (x86)\PHP\v5.2\ext</strong></p>
<p>Als nächstes muss die PHP.INI angepasst werden um die Debugger Extension verwenden zu können</p>
<p>Die PHP.INI befindet sich im Verzeichnis:</p>
<p><strong>C:\Program Files (x86)\PHP\v5.2</strong></p>
<p>Also öffnen wir die PHP.INI mit einem Texteditor und fügen folgende Einträge hinzu:</p>
<pre class="brush: plain; title: ; notranslate">
[xdebug]
zend_extension = &quot;C:\Program Files (x86)\PHP\v5.2\ext\php_xdebug-2.1.2-5.2-vc6-nts.dll&quot;
xdebug.remote_enable = On
xdebug.remote_host = &quot;localhost&quot;
xdebug.remote_port = 9000
xdebug.remote_handler = &quot;dbgp&quot;
</pre>
<p>Eigentlich ist es gleich an welcher Stelle diese Einträge hinzugefügt werden, aber wer sich gerne strikt an Vorgaben hält, kann die Einträge direkt unter dem folgenden Eintrag einfügen, dann funktioniert es auf jeden Fall.</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image15.png" alt="image" width="644" height="153" border="0" /></p>
<p>Nun speichern wird die PHP.INI und müssen noch den IIS Neu starten:</p>
<p>Entweder über die Konsole “Internetinformationsdienste (IIS)-Manager</p>
<p>oder über die Kommandozeile:</p>
<blockquote><p>net stop WAS (zum stoppen des IIS)</p></blockquote>
<p>und dann</p>
<blockquote><p>net start W3SVC (um den IIS wieder zu starten.)</p></blockquote>
<p>Später (nachdem wir PhpStorm installiert haben und damit auch einen brauchbaren Editor  zur Verfügung haben)  prüfen wir auch noch ob die Extension richtig eingerichtet wurde.</p>
<h3>PhpStorm installieren</h3>
<p>PhpStorm gibt es in einer 30 Tage Trial Version, wer also keine Lizenz besitzt kann sich  erst einmal 30 Tage lang anschauen ob im PhpStorm das Geld, was es kostet, wert ist (Ich denke dass ist es auf jeden Fall, ein tolles Produkt wie eigentlich alle Produkte von JetBrains. Nein ich bekomme keine Prozente <img src='http://blog.schelian.de/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  )</p>
<p>Den Download gibt es hier: <a href="http://www.jetbrains.com/phpstorm/download/">http://www.jetbrains.com/phpstorm/download/</a></p>
<p>Nachdem herunterladen installieren wir PhpStorm einfach mit allen Standardeinstellungen.</p>
<h3>WordPress Projekt in PhpStorm einrichten</h3>
<p>Nun öffnen wir PhpStorm und wählen die nachfolgende Option aus:</p>
<p>Create New Project from Existing Files</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image16.png" alt="image" width="644" height="568" border="0" /></p>
<p>Das Szenario: Lokaler Web Server und Source Code unterhalb des Web Root passt genau für unser vorhaben.</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image17.png" alt="image" width="644" height="515" border="0" /></p>
<p>Nun wählen wir das Root Verzeichnis (<strong>Nicht das WordPress Verzeichnis auswählen</strong>) des Default WEB unseres localhost aus.</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image18.png" alt="image" width="644" height="569" border="0" /></p>
<p>Jetzt geben wir dem Projekt Server noch einen Namen (z.B. MyLocalServer)</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image19.png" alt="image" width="644" height="569" border="0" /></p>
<p>In nächsten Schritt (Siehe Abbildung oben) geben wir nun die Projekt URL unserer WordPress Installation an.</p>
<p>Und haben damit das Projekt eingerichtet (Wie man auch in der folgenden Abbildung sehen kann).</p>
<p>Xdebug überprüfen</p>
<p>Wir öffnen die Datei index.php aus dem Root Verzeichnis unserer WordPress Installation im PhpStorm Editor.</p>
<p>Dort fügen wir die Funktion phpInfo() direkt nach dem Kommentar ein und speichern die Datei ab.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image20.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb3.png" alt="image" width="644" height="484" border="0" /></a></p>
<p>Nun öffnen wir den Browser und geben localhost/wordpress ein. Wenn anstelle der normalen WordPress Startseite diese PHP Info Seite angezeigt wird, haben wir bis hierhin schon mal alles richtig gemacht.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image21.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb4.png" alt="image" width="644" height="484" border="0" /></a></p>
<p>Um die Prüfung von Xdebug durchführen zu können, benötigen wir den Source Code der im Browse dargestellten phpinfo Seite.</p>
<p>Dazu lassen wir uns den Quelltext der Seite anzeigen, markieren den gesammten Quelltext, kopieren diesen in die Zwischenablage, und öffnen anschließend folgende Webseite:</p>
<p><a href="http://xdebug.org/find-binary.php">http://xdebug.org/find-binary.php</a></p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image22.png" alt="image" width="644" height="739" border="0" /></p>
<p>Dort wo der rote Pfeil hinzeigt fügen wir dann den in der Zwischenablage befindlichen Quelltext ein und betätigen anschließend den “Analyse my phpinfo() output” Button.</p>
<p>Wenn Xdebug richtig installiert ist, sollte das Ergebnis wie folgt aussehen:</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image23.png" alt="image" width="644" height="568" border="0" /></p>
<p>Wenn Xdebug nicht richtig installier ist, sollte man überprüfen, ob die Pfadangabe und der Dateiname der Xebug DLL in der PHP.INI richtig angegeben sind.</p>
<h3>PhpStorm für das Debugging konfigurieren</h3>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image24.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb5.png" alt="image" width="298" height="484" border="0" /></a></p>
<p>Wir öffnen den Dialog “Edit Configurations”</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image25.png" alt="image" width="644" height="513" border="0" /></p>
<p>Nun fügen wir eine neue Konfiguration hinzu:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image26.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb6.png" alt="image" width="382" height="484" border="0" /></a></p>
<p>Eine PHP Web Application Konfiguration</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image27.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb7.png" alt="image" width="611" height="484" border="0" /></a></p>
<p>Im Feld unnamed geben wir unserer Konfiguration einen Namen. Zum Beispiel IIS.</p>
<p>Dann müssen wir einen Server auswählen (da wir aber noch keinen Konfiguriert haben, müssen wir zuerst einmal einen neu anlegen).</p>
<p>Hier Dialog zum einrichten eines neuen Server öffnen:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image28.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb8.png" alt="image" width="644" height="175" border="0" /></a></p>
<p>Dann im Dialog auf das + um einen neuen Server anzulegen:</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image29.png" alt="image" width="644" height="529" border="0" /></p>
<p>Hier der bereits ausgefüllte Dialog:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image30.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb9.png" alt="image" width="644" height="528" border="0" /></a></p>
<p>Eingabe bestätigen und anschließend folgende Eingaben noch ergänzen, siehe Beschreibung unterhalb der Abbildung.</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image31.png" alt="image" width="644" height="510" border="0" /></p>
<p>Der Konfiguration einen Namen geben (z.B. LocalIISWordPress)</p>
<p>Und die StartUrl um WordPress ergänzen, so dass der korrekte Link (http://localhost/wordpress) unter der Start URL angezeigt wird.</p>
<p>Das sollte dann so aussehen:</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image32.png" alt="image" width="644" height="512" border="0" /></p>
<p>Dann bestätigen wir auch diesen Dialog</p>
<p>Und wenn wir nun auf den RUN Button drücken ….</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image33.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb10.png" alt="image" width="644" height="121" border="0" /></a></p>
<p>Sollte sich der Default Browser mit der WordPress Seite automatisch öffnen.</p>
<p>Eigentlich sollte das setzen von Breakpoint nun auch schon funktionieren, probieren wir das doch mal indem wir einen Breakpoint auf die Zeile phpinfo() setzen die wir in der index.php eingefügt haben.</p>
<p><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image34.png" alt="image" width="644" height="484" border="0" /></p>
<p>Einen Breakpoint kann man übrigens ganz einfach dadurch setzen, indem man mit der Maus an die Stelle klickt auf die der Rote Pfeil zeigt.</p>
<p>Und wenn wir nun anstelle des RUN Button, den DEBUG Button drücken …..</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/12/image35.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/12/image_thumb11.png" alt="image" width="644" height="117" border="0" /></a></p>
<p>Richtig, der Programmablauf bleibt am Breakpoint stehen und wartet darauf das wir den Programmablauf fortsetzen.</p>
<p>So und nun viel Spaß beim PHP Debugging.</p>
<div class="google_plus_one"><g:plusone size="medium" count="true" url="http://blog.schelian.de/2011/12/php-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug/"></g:plusone></div><div align="right"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>

<a href="http://twitter.com/share?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fphp-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug%2F&amp;url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fphp-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug%2F" target="_blank" rel="nofollow" title="Twitter"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/twitter.png" alt="Twitter" title="Twitter" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fphp-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug%2F&amp;title=PHP+Debugging+f%C3%BCr+.NET+Dummies+%28IIS+-+WordPress+-+PhpStorm+-+Xdebug%29" target="_blank" rel="nofollow" title="del.icio.us"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/delicious2.png" alt="del.icio.us" title="del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fphp-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug%2F&amp;title=PHP+Debugging+f%C3%BCr+.NET+Dummies+%28IIS+-+WordPress+-+PhpStorm+-+Xdebug%29" target="_blank" rel="nofollow" title="Digg"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/digg.png" alt="Digg" title="Digg" /></a>
<a href="http://facebook.com/sharer.php?u=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fphp-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug%2F&amp;t=PHP+Debugging+f%C3%BCr+.NET+Dummies+%28IIS+-+WordPress+-+PhpStorm+-+Xdebug%29" target="_blank" rel="nofollow" title="Facebook"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/facebook.png" alt="Facebook" title="Facebook" /></a>
<a href="http://www.linkedin.com/shareArticle?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fphp-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug%2F&amp;title=PHP+Debugging+f%C3%BCr+.NET+Dummies+%28IIS+-+WordPress+-+PhpStorm+-+Xdebug%29" target="_blank" rel="nofollow" title="linked-in"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/linkedin.png" alt="linked-in" title="linked-in" /></a>
<a href="http://buzz.yahoo.com/submit?submitUrl=PHP+Debugging+f%C3%BCr+.NET+Dummies+%28IIS+-+WordPress+-+PhpStorm+-+Xdebug%29&amp;u=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fphp-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug%2F" target="_blank" rel="nofollow" title="Yahoo Buzz"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/yahoo.png" alt="Yahoo Buzz" title="Yahoo Buzz" /></a>
<a href="http://stumbleupon.com/submit?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F12%2Fphp-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug%2F&amp;title=PHP+Debugging+f%C3%BCr+.NET+Dummies+%28IIS+-+WordPress+-+PhpStorm+-+Xdebug%29&amp;newcomment=PHP+Debugging+f%C3%BCr+.NET+Dummies+%28IIS+-+WordPress+-+PhpStorm+-+Xdebug%29" target="_blank" rel="nofollow" title="StumbleUpon"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/su.png" alt="StumbleUpon" title="StumbleUpon" /></a>



]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2011/12/php-debugging-fuer-net-dummies-iis-wordpress-phpstorm-xdebug/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Alles WiX oder was &#8211; Windows Installer XML toolset für Dummies</title>
		<link>http://blog.schelian.de/2011/11/alles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies/</link>
		<comments>http://blog.schelian.de/2011/11/alles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 16:25:21 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[VS2010]]></category>
		<category><![CDATA[WiX]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/?p=1786</guid>
		<description><![CDATA[Im Zuge der Zukunftssicherung (Heute nennt man das Refactoring) eines meiner älteren aber immer noch aktiven Projekte, einem Windows Forms Projekt sollte es dieses mal nicht nur dem eigentlichen Code sondern dem gesamten Build und Deployment Prozess an den Kragen &#8230; <a href="http://blog.schelian.de/2011/11/alles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Im Zuge der Zukunftssicherung (Heute nennt man das Refactoring) eines meiner älteren aber immer noch aktiven Projekte, einem Windows Forms Projekt sollte es dieses mal nicht nur dem eigentlichen Code sondern dem gesamten Build und Deployment Prozess an den Kragen gehen.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/11/image.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border-width: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/11/image_thumb.png" alt="image" width="117" height="88" align="left" border="0" /></a>Mit den, bis zur Visual Studio 2010 enthaltenen, und Stand Heute mit der nächsten Visual Studio Version nicht mehr unterstützen, “Visual Studio Setup Projekte”, war ich eigentlich noch nie wirklich zufrieden. Also muss etwas neues her, mit dem ich dieses ungeliebte Setup Projekt ersetzen kann und mein Projekt auch noch mit der nächsten Visual Studio Version weiter entwickeln und distribuieren kann.</p>
<p>Nach ein wenig Recherche und ein wenig Gezwitscher auf Twitter stand fest, dass <a href="http://wix.sourceforge.net/" target="_blank">WiX</a> wohl die beste Lösung sei um das Deployment der Anwendung durchzuführen.</p>
<p><a href="http://wix.sourceforge.net/" target="_blank">WiX</a> ist ein von Microsoft initiiertes Open Source Projekt dass unter anderem von Microsoft selbst für die  Distribution von Microsoft Office verwendet wird.</p>
<p>Nachdem klar war, das <a href="http://wix.sourceforge.net/" target="_blank">WiX</a> in Zukunft bei mir für die Installation meines Projektes zuständig sein soll, habe ich über Twitter von <a href="http://www.cayas.de/" target="_blank">Sebastian Seidel</a> einen Link auf einen <a href="http://www.aspnetzone.de/blogs/juergengutsch/archive/2011/03/08/vom-visual-studio-zum-wix-setup-in-5-einfachen-schritten.aspx" target="_blank">Beitrag</a> erhalten in welchem beschrieben wird wie man in 5 einfachen Schritten aus einem Visual Studio Setup ein <a href="http://wix.sourceforge.net/" target="_blank">WiX</a> Setup Projekt machen kann.</p>
<p>Ich bin dann dieser Anleitung gefolgt und habe die Konvertierung und Änderungen laut dem oben genannten Beitrag durchgeführt.</p>
<p>Wobei ich sagen muss, dass diese Konvertierung zwar ganz schön ist, aber leider nicht so ohne weiteres direkt zum Erfolg führt.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/11/image1.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; float: right; padding-top: 0px; border-width: 0px;" title="image" src="http://blog.schelian.de/wp-content/uploads/2011/11/image_thumb1.png" alt="image" width="210" height="83" align="right" border="0" /></a>Ich habe dann mit ein wenig Hilfe von Sebastian, Danke noch mal dafür, relativ schnell, erst einmal ein generell funktionierendes Setup mit WiX zum laufen bekommen. Leider noch ohne wirklich zu wissen wie WiX tatsächlich funktioniert und wie umfangreich WiX in Wirklichkeit ist.</p>
<p>Da ich aber nicht so leicht zufrieden zu stellen bin und mir das WiX Setup,  welches aus dem decompilierten alten Setup erstellt wurde, nicht gefallen hat (da waren zu viele statische Angaben enthalten und es hatte keine echte nachvollziehbare Struktur) habe ich mich mit WiX näher beschäftigt.</p>
<p>Nachdem ich ein paar Tage mit WiX gearbeitet habe, würde ich sagen, dass es sich nicht lohnt ein Setup Projekt zu decompilieren um dieses dann manuell nachzuarbeiten.</p>
<p>Meiner Meinung nach ist es einfacher ein Basistemplate mit den wichtigsten Funktionalitäten, gepaart mit ein wenig Grundwissen über WiX zu nehmen und sich das benötigte Setup Projekt manuell zu erstellen.</p>
<p>Und genau ein solches Basistemplate möchte ich hier zusammen mit dem notwendigen Basiswissen zu WiX vorstellen und vermitteln.</p>
<p>Wer WiX noch nicht auf seinem Rechner installiert hat, sollte das nun aber spätestens nachholen.</p>
<p><a href="http://wix.codeplex.com/releases/view/60102" target="_blank">Hier der Link zum Download von WiX</a></p>
<p>Nachdem man WiX installiert hat und Visual Studio startet, findet man dort neue Projektvorlagen:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/11/SNAGHTMLb687d8.png"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="SNAGHTMLb687d8" src="http://blog.schelian.de/wp-content/uploads/2011/11/SNAGHTMLb687d8_thumb.png" alt="SNAGHTMLb687d8" width="244" height="170" border="0" /></a></p>
<p>In diesem Beitrag dreht sich alles nur um das eigentliche Setup Projekt die anderen Projekt Vorlagen sind dann eher für die Fortgeschrittenen.</p>
<p>Um die Funktionsweise von WiX direkt selbst ausprobieren zu können, habe ich ein Testprojekt erstellt dass sowohl eine Windows Forms Anwendung, wie eine Class Library und das zugehörige Wix Setup Projekt in einer Solution enthält.</p>
<p>Also einfach die Solution (VS2010) herunterladen, entpacken, BS starten und loslegen.</p>
<p>Der Einfachheit halber habe ich alle Erklärungen direkt als Kommentar in das WiX Skript aufgenommen.</p>
<p>So hier das WiX Script zum anschauen. Im Anschluss folgt dann auch noch der Link zum herunterladen der gesamten Test Solution.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;Wix xmlns=&quot;http://schemas.microsoft.com/wix/2006/wi&quot;&gt;
  &lt;!--  &lt;?define Manufactor = &quot;Hans-Peter Schelian&quot;?&gt;
        Anstelle den Manufactor an mehreren Stellen anzugeben weise ich hier lieber einer Variablen den Wert zu
        und verwende im weiteren Verlauf einfach die Variable
  --&gt;
  &lt;!--  &lt;?define UpgradeGuid = &quot;{3B563A68-99BC-4528-9356-295ADB67909A}&quot;?&gt;
        Ganz Wichtig, die Guid für den UpgradeCode darf nach der ersten Installation nicht mehr geändert werden
        aus diesem Grund weise ich diese Guid einer Variablen zu die ich dann im weiteren Verlauf im Bereich
        &lt;Product UpgradeCode=&quot;$(var.UpgradeGuid)&quot; /&gt; und  im Bereich &lt;Upgrade Id=&quot;$(var.UpgradeGuid)&quot; anstelle
        der Eingabe der eigentlichen Guid verwenden kann.
  --&gt;

  &lt;!-- Hier nun alle Defines die durch den Präprozessor aufgelöst werden --&gt;
  &lt;?define Manufactor = &quot;Hans-Peter Schelian&quot;?&gt;
  &lt;?define UpgradeGuid = &quot;{3B563A68-99BC-4528-9356-295ADB67909A}&quot;?&gt;

  &lt;!--  Erklärungen zum Bereich &lt;Product&gt; Siehe auch http://wix.sourceforge.net/manual-wix3/wix_xsd_product.htm

        Id=&quot;*&quot; Mit dem + wird erreicht, dass bei jedem erzeugen des Setup eine neue Guid erstellt wird.
          Man könnte natürlich auch alternativ eine feste Guid vergeben, dass würde dann so ausssehen:
          Id=&quot;{2BE1FDE8-FAEE-48B5-AA08-FD2FE26D7FB2}&quot;

        Name=&quot;WiXDemoProjekt&quot; Name des Projektes wie es in &quot;Programme und Funktionen&quot; angezeigt wird

        Version=&quot;!(bind.FileVersion.MyApplicationFile)&quot; - Das ist die Programmversion des Produktes,
          entweder man muss die Version manuell angeben: Version=&quot;1.0.1.1&quot; oder man kann wie ich es hier
          demonstriere, Binder Variablen des WiX Linker verwenden um Dynamisch die Vesionsnummer aus
          einer beliebiegen Datei des Projektes zu ermitteln.
          Im Beispiel verwende ich die Möglichkeit die Version welche mit [assembly: AssemblyFileVersion(&quot;1.0.0.0&quot;)]
          in der AssemblyInfo gesetzt wurde aus der Datei auszulesen.

        Manufacturer=&quot;$(var.Manufactor)&quot; Zuweisung des in der Präprozessor Variablen gespeicherten Herstellers,
          alternativ kann man natürlich auch eine manuelle Zuweiung Manufacturer=&quot;Hans-Peter Schelian&quot; vornehmen

        UpgradeCode=&quot;$(var.UpgradeGuid)&quot;&gt; Zuweisung der in der Präprozessor Variablen gespeicherten Guid,
          alternativ kann man die Zuweisung UpgradeCode=&quot;{2BE1FDE8-FAEE-48B5-AA08-FD2FE26D7FB2}&quot;&gt; auch manuell
          durchführen.
  --&gt;
  &lt;Product
  Id=&quot;*&quot;
  Name=&quot;WiXDemoProjekt&quot;
  Language=&quot;1033&quot;
  Version=&quot;!(bind.FileVersion.MyApplicationFile)&quot;
  Manufacturer=&quot;$(var.Manufactor)&quot;
  UpgradeCode=&quot;$(var.UpgradeGuid)&quot;&gt;

    &lt;!-- Erklärungen zum Bereich &lt;Package&gt; http://wix.sourceforge.net/manual-wix3/wix_xsd_package.htm
      InstallerVersion=&quot;200&quot; Ab Windows Installer 2.0
      Compressed=&quot;yes&quot; - So werden die Dateien im MSI File komprimiert
      Description=&quot;Installiert das WiXDemoProjekt&quot; - Eine Beschreibung für das Installer Package
      Manufacturer=&quot;Hans-Peter Schelian&quot; - Und wieder der Hersteller siehe auch &lt;Procuct Manufacturer=&quot;&quot; /&gt;
      Comments=&quot;Ich wünsche allen viel Spaß mit diesem Beispiel&quot; - Das was es bedeutet ein Kommentar
    --&gt;
    &lt;Package
    InstallerVersion=&quot;200&quot;
    Compressed=&quot;yes&quot;
    Description=&quot;Installiert das WiXDemoProjekt&quot;
    Manufacturer=&quot;$(var.Manufactor)&quot;
    Comments=&quot;Ich wünsche allen viel Spaß mit diesem Beispiel&quot;
  /&gt;

    &lt;!-- Erklärungen zum Bereich &lt;Media&gt; Siehe auch http://wix.sourceforge.net/manual-wix3/wix_xsd_media.htm
    --&gt;
    &lt;Media
    Id=&quot;1&quot;
    Cabinet=&quot;media1.cab&quot;
    EmbedCab=&quot;yes&quot;
  /&gt;

    &lt;!-- ARP Support Oder wie konfiguriert man Add/Remove Programs mit dem Windows Installer
        Siehe auch http://msdn.microsoft.com/en-us/library/aa368032.aspx
    --&gt;
    &lt;Property Id=&quot;ARPHELPTELEPHONE&quot; Value=&quot;XXXXX/XXXXXXX&quot; /&gt;
    &lt;Property Id=&quot;ARPHELPLINK&quot; Value=&quot;http://blog.schelian.de&quot; /&gt;
    &lt;Property Id=&quot;ARPCONTACT&quot; Value=&quot;Schelian IT Beratung&quot; /&gt;
    &lt;Property Id=&quot;ARPCOMMENTS&quot; Value=&quot;Alles WiX oder was&quot; /&gt;
    &lt;Property Id=&quot;ARPURLINFOABOUT&quot; Value=&quot;http://www.schelian.de&quot; /&gt;

    &lt;!-- Erklärungen zum Bereich &lt;Upgrade&gt;
        Upgrade Id=&quot;$(var.UpgradeGuid)&quot;&gt; hier Zuweisung durch Präprozessor Variable, siehe auch Hinweise
          zu define UpgradeGuid

        &lt;UpgradeVersion Minimum=&quot;!(bind.FileVersion.MyApplicationFile)&quot; - Hier wird festgestellt ob
          bereits ein neueres Produkt (Neuere Version) installiert ist.

        &lt;UpgradeVersion Minimum=&quot;0.1.0.0&quot; - Prüfung ob bereits eine frühere Version installiert ist

        &lt;UpgradeVersion Minimum=&quot;1.0.0.0&quot; Maximum=&quot;99.0.0.0&quot; - Ist das Prpdukt in welcher Versio auch immer
            bereits auf dem Rechner installiert, dann setzt die internet Variable PREVIOUSVERSIONSINSTALLED,
            dadurch wird verhindert, dass selbst dann wenn man eine Version die nicht als Upgrade gilt
            (nur im vierten Bereich) der Versionsnummer geändert ist, nicht dazu führt, dass es zu doppelten
            Einträgen im Add/Remove Programms kommt.
    --&gt;
    &lt;Upgrade Id=&quot;$(var.UpgradeGuid)&quot;&gt;
      &lt;UpgradeVersion Minimum=&quot;!(bind.FileVersion.MyApplicationFile)&quot;
                      IncludeMinimum=&quot;no&quot;
                      OnlyDetect=&quot;yes&quot;
                      Language=&quot;1033&quot;
                      Property=&quot;NEWPRODUCTFOUND&quot; /&gt;
      &lt;UpgradeVersion Minimum=&quot;0.1.0.0&quot;
                      IncludeMinimum=&quot;yes&quot;
                      Maximum=&quot;!(bind.FileVersion.MyApplicationFile)&quot;
                      IncludeMaximum=&quot;no&quot;
                      Language=&quot;1033&quot;
                      Property=&quot;UPGRADEFOUND&quot; /&gt;
      &lt;UpgradeVersion Minimum=&quot;1.0.0.0&quot; Maximum=&quot;99.0.0.0&quot;
         Property=&quot;PREVIOUSVERSIONSINSTALLED&quot;
         IncludeMinimum=&quot;yes&quot; IncludeMaximum=&quot;no&quot; /&gt;
    &lt;/Upgrade&gt;

    &lt;!-- So nun wird die Verzeichnis Struktur für die Installation aufgebaut
      &lt;Directory Id=&quot;TARGETDIR&quot; Name=&quot;SourceDir&quot;&gt; Diese Zeile setzt das Root Verzeichnis der Installation
        &quot;\&quot;
      &lt;Directory Id=&quot;ProgramFilesFolder&quot;&gt; verwendet eine durch den Windows Installer vordefinierte Id zur
        Verwendung der Standard Programmpfads.
        &quot;C:\Program Files&quot;
      &lt;Directory Id=&quot;CompanyFolder&quot; Name=&quot;Schelian IT Beratung&quot;&gt;
        &quot;C:\Program Files\Schelian IT Beratung\&quot;

      &lt;Directory Id=&quot;INSTALLLOCATION&quot; Name=&quot;WiXDemoProjekt&quot;&gt;
        &quot;C:\Program Files\Schelian IT Beratung\WiXDemoProjekt\&quot;
    --&gt;
    &lt;Directory Id=&quot;TARGETDIR&quot; Name=&quot;SourceDir&quot;&gt;
      &lt;Directory Id=&quot;ProgramFilesFolder&quot;&gt;
        &lt;Directory Id=&quot;CompanyFolder&quot; Name=&quot;Schelian IT Beratung&quot;&gt;
          &lt;Directory Id=&quot;INSTALLLOCATION&quot; Name=&quot;WiXDemoProjekt&quot;&gt;
            &lt;!-- Und dahinein packen wir eine Component, in diesem Fall Unser Ausführbares Programm
                Jede Component muss eine eindeutige Id bestzen, diese wird weiter unter verwendet um die Component
                einem Feature zuzuordnen.
                Eine Component sollte eine Guid besitzten, damit es später Möglich ist anhand dieser Guid die Datei
                eindeutig zu identifizieren, damit man mit dem MS Installer, eine Reparatur einer vorhandenen Installation
                durchführen kann.
            --&gt;
            &lt;Component Id=&quot;ProductComponent&quot; Guid=&quot;{4A5619DF-5841-48EC-8D7C-D368718C6D1A}&quot;&gt;
              &lt;!-- Innerhalb der Komponente bestimmen wir dann die zu installierende Datei
                  Jedes File muss einen eindeutige Id besitzen, der Name ist der Dateiname am Zielort und
                  mit Source wird die Quelle der Datei angegeben.

                  Name=&quot;$(var.WixDemoProjekt.TargetFileName)&quot; nutzt die Möglichkeit den Zielnamen aus dem
                  Visual Studio Projekt zu übernehmen, dass hat den Vorteil, dass man sich keine Gedanken
                  darüber machen muss das Setup anfassen zu müssen, wennm man den Ausgabe Namen im VS Projekt
                  ändert.

                  Source=&quot;$(var.WixDemoProjekt.TargetPath)&quot; nutzt ebenfalls die Möglicheit der Visual Studio
                  Project References und Variablen.
                  Siehe auch http://wix.sourceforge.net/manual-wix3/votive_project_references.htm
                  Man miuss übrigens um diese References nutzen zu können im WiX Setup Projekt eine Reference auf das
                  Visual Studio Projekt setzen.

                  KeyPath=&quot;yes&quot; Für nähere Informatinonen siehe http://wix.sourceforge.net/manual-wix3/wix_xsd_file.htm
              --&gt;
              &lt;File Id=&quot;MyApplicationFile&quot; Name=&quot;$(var.WixDemoProjekt.TargetFileName)&quot; Source=&quot;$(var.WixDemoProjekt.TargetPath)&quot; KeyPath=&quot;yes&quot;&gt;
                &lt;!-- Dann legen wir doch gleich noch einen Desktop Shortcut für das Projekt an. --&gt;
                &lt;Shortcut Advertise=&quot;yes&quot; Id=&quot;DesktopShortCut&quot; Name=&quot;WiXDemoProjekt&quot; Directory=&quot;DesktopFolder&quot; WorkingDirectory=&quot;INSTALLLOCATION&quot; Description=&quot;WiXDemoProjekt Programm ausführen&quot; Icon=&quot;Icon.exe&quot;&gt;
                  &lt;!-- Und dieses Icon soll für den Shortcut verwendet werden --&gt;
                  &lt;Icon Id=&quot;Icon.exe&quot; SourceFile=&quot;$(var.WixDemoProjekt.TargetPath)&quot; /&gt;
                &lt;/Shortcut&gt;
              &lt;/File&gt;
            &lt;/Component&gt;
            &lt;!-- Nun muss für jedes weitere File dass installiert werden soll, eine Component erstellt werden
                Es wäre auch möglich mehrere Files in einer Component zusammenzufassen, allerdings würde ich das
                nur empfehlen, wenn man tgatsächlich einzeln zu installierende Feature implementiert, die je
                Component aus mehereren Dateien bestehen.
            --&gt;
            &lt;Component Id=&quot;WiXDemoLib&quot; Guid=&quot;{777028E8-DA56-400E-9C71-844AE328E8BF}&quot;&gt;
              &lt;!-- Hier nun die zu installierende Datei der Component hinzufügen --&gt;
              &lt;File Id=&quot;WiXDemoLib&quot; Name=&quot;WiXDemoLib.dll&quot; Source=&quot;$(var.WixDemoProjekt.TargetDir)WiXDemoLib.dll&quot; KeyPath=&quot;yes&quot; /&gt;
            &lt;/Component&gt;
            &lt;!-- Beispiel wie man eine App.Config in das Setup aufnehmen und während der Setup Erstellung umbenennen kann
                Hier wird aus der app.config die WixDemoProjekt.Exe.Config
            --&gt;
            &lt;Component Id=&quot;app.config&quot; Guid=&quot;{EE4CA09D-2C10-48E4-946A-D8B9242F557E}&quot;&gt;
              &lt;File Id=&quot;app.config&quot; Name=&quot;WixDemoProjekt.Exe.Config&quot; Source=&quot;$(var.WixDemoProjekt.ProjectDir)app.config&quot; KeyPath=&quot;yes&quot; /&gt;
            &lt;/Component&gt;
            &lt;!-- Und hier ein Beispiel wie man Datei in Unterverzeichnis am Zielort kopieren kann--&gt;
            &lt;Directory Id=&quot;IMAGEFOLDER&quot; Name=&quot;Images&quot;&gt;
              &lt;Component Id=&quot;WiX.image&quot; Guid=&quot;{ACD0322F-8170-4C67-84BC-161FCEE6274A}&quot;&gt;
                &lt;File Id=&quot;WiX.image&quot; Name=&quot;wixlogo.png&quot; Source=&quot;$(var.WixDemoProjekt.TargetDir)images\wixlogo.png&quot; KeyPath=&quot;yes&quot; /&gt;
              &lt;/Component&gt;
            &lt;/Directory&gt;
          &lt;/Directory&gt;
        &lt;/Directory&gt;
      &lt;/Directory&gt;

      &lt;!-- Verknüpfungen im Startmenü setzen
          Siehe auch http://wix.sourceforge.net/manual-wix3/create_start_menu_shortcut.htm
      --&gt;
      &lt;Directory Id=&quot;ProgramMenuFolder&quot;&gt;
        &lt;Directory Id=&quot;MyShortCutsDir&quot; Name=&quot;WiXDemoProjekt&quot;&gt;
          &lt;Component Id=&quot;ShortCutComponent&quot; Guid=&quot;{B51BC276-F509-4F25-9738-EE176445D073}&quot;&gt;
            &lt;Shortcut Id=&quot;ProgShortCut&quot; Name=&quot;WiXDemoProjekt&quot; Description=&quot;WiXDemoProjekt Programm Verkmüpfung&quot; Target=&quot;[INSTALLLOCATION]WixDemoProjekt.Exe&quot;&gt;&lt;/Shortcut&gt;
            &lt;Shortcut Id=&quot;UninstallShortCut&quot; Name=&quot;Uninstall WiXDemoProjekt&quot; Target=&quot;[System64Folder]msiexec.exe&quot; Arguments=&quot;/x [ProductCode]&quot;/&gt;
            &lt;RemoveFolder Id=&quot;RemoveMyShortCuts&quot; On=&quot;uninstall&quot;/&gt;
            &lt;RegistryValue Root=&quot;HKCU&quot; Key=&quot;Software\Schelian IT Beratung\WiXDemoProjekt&quot; Name=&quot;installed&quot; Type=&quot;integer&quot; Value=&quot;1&quot; KeyPath=&quot;yes&quot;/&gt;
          &lt;/Component&gt;
        &lt;/Directory&gt;
      &lt;/Directory&gt;
      &lt;!-- Wird benötigt um den Desktop Shortcut anlegen zu können --&gt;
      &lt;Directory Id=&quot;DesktopFolder&quot; Name=&quot;Desktop&quot; /&gt;
    &lt;/Directory&gt;

    &lt;!-- Feature Bereich hier als Basistemplate nur ein Feature (Alles installieren)
        Siehe auch http://wix.sourceforge.net/manual-wix3/wix_xsd_feature.htm
    --&gt;
    &lt;Feature Id=&quot;ProductFeature&quot; Title=&quot;WiXDemoProjekt&quot; Level=&quot;1&quot;&gt;
      &lt;ComponentRef Id=&quot;ProductComponent&quot; /&gt;
      &lt;ComponentRef Id=&quot;WiXDemoLib&quot; /&gt;
      &lt;ComponentRef Id=&quot;app.config&quot; /&gt;
      &lt;ComponentRef Id=&quot;WiX.image&quot; /&gt;
      &lt;ComponentRef Id=&quot;ShortCutComponent&quot; /&gt;
    &lt;/Feature&gt;

    &lt;!-- Das was nun folgt ist schon ein wenig Finetuning CustomActions
        siehe auch http://wix.sourceforge.net/manual-wix3/wix_xsd_customaction.htm
    --&gt;
    &lt;!-- Keinen Downgrade zulassen --&gt;
    &lt;CustomAction Id=&quot;PreventDowngrading&quot;
                  Error=&quot;Es ist bereits eine neuere Version instlliert.&quot; /&gt;

    &lt;!-- Nun noch die auszuführende Reihenfolg angeben
        siehe auch http://wix.sourceforge.net/manual-wix3/wix_xsd_installexecutesequence.htm
    --&gt;
    &lt;InstallExecuteSequence&gt;
      &lt;Custom Action=&quot;PreventDowngrading&quot;
              After=&quot;FindRelatedProducts&quot;&gt;NEWPRODUCTFOUND&lt;/Custom&gt;
      &lt;RemoveExistingProducts After=&quot;InstallFinalize&quot; /&gt;
    &lt;/InstallExecuteSequence&gt;

    &lt;!-- Wenn ein neueres Produkt gerunden wurde, soll das auch in der UI ausgegeben werden
        siehe auch http://wix.sourceforge.net/manual-wix3/wix_xsd_installuisequence.htm
    --&gt;
    &lt;InstallUISequence&gt;
      &lt;Custom Action=&quot;PreventDowngrading&quot;
              After=&quot;FindRelatedProducts&quot;&gt;NEWPRODUCTFOUND&lt;/Custom&gt;
    &lt;/InstallUISequence&gt;

    &lt;!-- So kann man eine eigene Lizenzmeldung ausgeben --&gt;
    &lt;WixVariable Id='WixUILicenseRtf' Overridable='yes' Value='$(var.WixDemoProjekt.ProjectDir)Lizenzbestimmungen.rtf'/&gt;

    &lt;!-- UI Definition für Minimales Setup
    Um diese UI Definition vornehmen zu können,
    muss im WiX Projekt die WixUIExtension.dll als Reference hinzugefügt werden
    --&gt;
    &lt;UIRef Id=&quot;WixUI_Minimal&quot; /&gt;
    &lt;UIRef Id=&quot;WixUI_ErrorProgressText&quot; /&gt;
  &lt;/Product&gt;
&lt;/Wix&gt;
</pre>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/11/WixDemoProjekt.zip">WixDemoProjekt (VS2010 Solution)</a></p>
<div class="google_plus_one"><g:plusone size="medium" count="true" url="http://blog.schelian.de/2011/11/alles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies/"></g:plusone></div><div align="right"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>

<a href="http://twitter.com/share?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F11%2Falles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies%2F&amp;url=http%3A%2F%2Fblog.schelian.de%2F2011%2F11%2Falles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies%2F" target="_blank" rel="nofollow" title="Twitter"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/twitter.png" alt="Twitter" title="Twitter" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F11%2Falles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies%2F&amp;title=Alles+WiX+oder+was+-+Windows+Installer+XML+toolset+f%C3%BCr+Dummies" target="_blank" rel="nofollow" title="del.icio.us"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/delicious2.png" alt="del.icio.us" title="del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.schelian.de%2F2011%2F11%2Falles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies%2F&amp;title=Alles+WiX+oder+was+-+Windows+Installer+XML+toolset+f%C3%BCr+Dummies" target="_blank" rel="nofollow" title="Digg"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/digg.png" alt="Digg" title="Digg" /></a>
<a href="http://facebook.com/sharer.php?u=http%3A%2F%2Fblog.schelian.de%2F2011%2F11%2Falles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies%2F&amp;t=Alles+WiX+oder+was+-+Windows+Installer+XML+toolset+f%C3%BCr+Dummies" target="_blank" rel="nofollow" title="Facebook"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/facebook.png" alt="Facebook" title="Facebook" /></a>
<a href="http://www.linkedin.com/shareArticle?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F11%2Falles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies%2F&amp;title=Alles+WiX+oder+was+-+Windows+Installer+XML+toolset+f%C3%BCr+Dummies" target="_blank" rel="nofollow" title="linked-in"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/linkedin.png" alt="linked-in" title="linked-in" /></a>
<a href="http://buzz.yahoo.com/submit?submitUrl=Alles+WiX+oder+was+-+Windows+Installer+XML+toolset+f%C3%BCr+Dummies&amp;u=http%3A%2F%2Fblog.schelian.de%2F2011%2F11%2Falles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies%2F" target="_blank" rel="nofollow" title="Yahoo Buzz"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/yahoo.png" alt="Yahoo Buzz" title="Yahoo Buzz" /></a>
<a href="http://stumbleupon.com/submit?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F11%2Falles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies%2F&amp;title=Alles+WiX+oder+was+-+Windows+Installer+XML+toolset+f%C3%BCr+Dummies&amp;newcomment=Alles+WiX+oder+was+-+Windows+Installer+XML+toolset+f%C3%BCr+Dummies" target="_blank" rel="nofollow" title="StumbleUpon"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/su.png" alt="StumbleUpon" title="StumbleUpon" /></a>



]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2011/11/alles-wix-oder-was-windows-installer-xml-toolset-fuer-dummies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nomen est Omen &#8211; 1. Treffen des .NET Rheinhessen Stammtisch im Restaurant Zw&#246;lf Apostel in Alzey</title>
		<link>http://blog.schelian.de/2011/10/nomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey/</link>
		<comments>http://blog.schelian.de/2011/10/nomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 12:58:48 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Allgemeines]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/2011/10/nomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey/</guid>
		<description><![CDATA[Nicht mal mehr eine Woche, dann findet das 1. Treffen des .NET Rheinhessen Stammtischs statt. Einzelheiten dazu findet Ihr in meinem ersten Post dazu. Um diesem Treffen einen angemessenen Rahmen zu geben, haben wir (das sind noch immer Sascha Dittmann &#8230; <a href="http://blog.schelian.de/2011/10/nomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Nicht mal mehr eine Woche, dann findet das 1. Treffen des .NET Rheinhessen Stammtischs statt.</p>
<p><a href="http://blog.schelian.de/2011/09/der-weie-fleck-muss-weg-net-stammtisch-rheinhessen/" target="_blank">Einzelheiten dazu findet Ihr in meinem ersten Post dazu.</a></p>
<p>Um diesem Treffen einen angemessenen Rahmen zu geben, haben wir (das sind noch immer <a href="http://www.xing.com/profile/Sascha_Dittmann" target="_blank">Sascha Dittmann</a> und <a href="http://www.xing.com/profile/HansPeter_Schelian" target="_blank">ich</a>&nbsp;<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.schelian.de/wp-content/uploads/2011/10/wlEmoticon-smile.png">) bei der Auswahl der Lokation selbstverständlich darauf geachtet eine Lokation mit einem würdigen Namen zu finden.</p>
<blockquote><p>Ich denke dass ist uns gelungen.</p>
</blockquote>
<p>Das Treffen findet im Restaurant <strong>“Zwölf Apostel” </strong>in Alzey statt.</p>
<p>Das Restaurant befindet sich inmitten der Innenstadt, direkt am <a href="http://www.gerry-jansen-theater.de/" target="_blank">Gerry Jansen Theater</a>. Parklätze sind <strong>nicht direkt</strong> vor dem Restaurant vorhanden. </p>
<p>Es gibt jedoch mehrere Parkplätze in der Nähe, siehe nachfolgende Abbildung.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/10/image.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.schelian.de/wp-content/uploads/2011/10/image_thumb.png" width="459" height="430"></a></p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/10/image1.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" align="left" src="http://blog.schelian.de/wp-content/uploads/2011/10/image_thumb1.png" width="24" height="24"></a> Restaurant Zwölf Apostel</p>
<p><font color="#ff0000"><strong>A</strong></font>) Parkplatz am Obermarkt (3 Gehminuten)<br /><font color="#ff0000"><strong>B</strong></font>) Parkplatz Ostdeutsche Straße (5 Gehminuten)<br /><font color="#ff0000"><strong>C</strong></font>) Parkplätze am Straßenrand Sankt-Georgen-Straße (2 Gehminuten)</p>
<p><u><strong>Hinweise zu den Parkmöglichkeiten</strong></u>:<br />In der Sankt-Georgen-Straße sind nur 5 Parkplätze und meisten belegt, doch auf dem Obermarkt sollten eigentlich genügend Parkplätze vorhanden sein. <br />Sollte am Obermarkt wirklich alles belegt sein, gibt es auf der Ostdeutschen Straße&nbsp; Ecke Raugrafenstraße einen großen Parkplatz auf dem Abends immer genügend Platz vorhanden ist.</p>
<p><u><strong>So nun noch einmal alle Fakten im Überblick:</strong></u></p>
<p><a href="http://www.xing.com/net/dotnetrheinhessen" target="_blank"><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=".NET Rheinhessen Stammtisch - XING Gruppe" border="0" alt=".NET Rheinhessen Stammtisch - XING Gruppe" src="http://blog.schelian.de/wp-content/uploads/2011/10/UGRheinhessen-Gruppenlogo.jpg" width="237" height="73"></a></p>
<p><strong>Mittwoch 19.10.2011 um 18:30 Uhr</strong></p>
<p><strong>Zwölf Apostel<br />Hellgasse 7<br />55232 Alzey</strong></p>
<p><strong><a href="http://maps.google.de/maps?hl=de&amp;newwindow=1&amp;rlz=1C1CHFX_deDE442DE442&amp;nord=1&amp;gs_upl=&amp;bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&amp;ion=1&amp;biw=942&amp;bih=912&amp;um=1&amp;ie=UTF-8&amp;cid=0,0,8538593804977845446&amp;fb=1&amp;hq=gerry+jansen+alzey+theater&amp;gl=de&amp;daddr=Hellgasse+7,+55232+Alzey&amp;geocode=0,49.745240,8.113950&amp;ei=AteWTuv3LY_04QTMm-y7BA&amp;sa=X&amp;oi=local_result&amp;ct=directions-to&amp;resnum=1&amp;ved=0CDsQngIwAA" target="_blank">Routenplaner</a></strong></p>
<p>Bis Mittwoch !!</p>
<div class="google_plus_one"><g:plusone size="medium" count="true" url="http://blog.schelian.de/2011/10/nomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey/"></g:plusone></div><div align="right"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>

<a href="http://twitter.com/share?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F10%2Fnomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey%2F&amp;url=http%3A%2F%2Fblog.schelian.de%2F2011%2F10%2Fnomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey%2F" target="_blank" rel="nofollow" title="Twitter"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/twitter.png" alt="Twitter" title="Twitter" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F10%2Fnomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey%2F&amp;title=Nomen+est+Omen+-+1.+Treffen+des+.NET+Rheinhessen+Stammtisch+im+Restaurant+Zw%26ouml%3Blf+Apostel+in+Alzey" target="_blank" rel="nofollow" title="del.icio.us"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/delicious2.png" alt="del.icio.us" title="del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.schelian.de%2F2011%2F10%2Fnomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey%2F&amp;title=Nomen+est+Omen+-+1.+Treffen+des+.NET+Rheinhessen+Stammtisch+im+Restaurant+Zw%26ouml%3Blf+Apostel+in+Alzey" target="_blank" rel="nofollow" title="Digg"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/digg.png" alt="Digg" title="Digg" /></a>
<a href="http://facebook.com/sharer.php?u=http%3A%2F%2Fblog.schelian.de%2F2011%2F10%2Fnomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey%2F&amp;t=Nomen+est+Omen+-+1.+Treffen+des+.NET+Rheinhessen+Stammtisch+im+Restaurant+Zw%26ouml%3Blf+Apostel+in+Alzey" target="_blank" rel="nofollow" title="Facebook"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/facebook.png" alt="Facebook" title="Facebook" /></a>
<a href="http://www.linkedin.com/shareArticle?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F10%2Fnomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey%2F&amp;title=Nomen+est+Omen+-+1.+Treffen+des+.NET+Rheinhessen+Stammtisch+im+Restaurant+Zw%26ouml%3Blf+Apostel+in+Alzey" target="_blank" rel="nofollow" title="linked-in"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/linkedin.png" alt="linked-in" title="linked-in" /></a>
<a href="http://buzz.yahoo.com/submit?submitUrl=Nomen+est+Omen+-+1.+Treffen+des+.NET+Rheinhessen+Stammtisch+im+Restaurant+Zw%26ouml%3Blf+Apostel+in+Alzey&amp;u=http%3A%2F%2Fblog.schelian.de%2F2011%2F10%2Fnomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey%2F" target="_blank" rel="nofollow" title="Yahoo Buzz"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/yahoo.png" alt="Yahoo Buzz" title="Yahoo Buzz" /></a>
<a href="http://stumbleupon.com/submit?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F10%2Fnomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey%2F&amp;title=Nomen+est+Omen+-+1.+Treffen+des+.NET+Rheinhessen+Stammtisch+im+Restaurant+Zw%26ouml%3Blf+Apostel+in+Alzey&amp;newcomment=Nomen+est+Omen+-+1.+Treffen+des+.NET+Rheinhessen+Stammtisch+im+Restaurant+Zw%26ouml%3Blf+Apostel+in+Alzey" target="_blank" rel="nofollow" title="StumbleUpon"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/su.png" alt="StumbleUpon" title="StumbleUpon" /></a>



]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2011/10/nomen-est-omen-1-treffen-des-net-rheinhessen-stammtisch-im-restaurant-zwlf-apostel-in-alzey/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Google + &#8211; Anwendungsfall Logbuch</title>
		<link>http://blog.schelian.de/2011/09/google-anwendungsfall-logbuch/</link>
		<comments>http://blog.schelian.de/2011/09/google-anwendungsfall-logbuch/#comments</comments>
		<pubDate>Fri, 30 Sep 2011 09:14:49 +0000</pubDate>
		<dc:creator>Hans-Peter Schelian</dc:creator>
				<category><![CDATA[Tips und Tricks]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://blog.schelian.de/2011/09/google-anwendungsfall-logbuch/</guid>
		<description><![CDATA[Ich möchte Heute darüber schreiben wie man Google + “sinnvoll als Logbuch” und nicht nur ausschließlich dafür nutzen kann, um Informationen mit bestimmten Kreisen oder der Öffentlichkeit zu teilen. Seit einigen Woche kann man auch Es gibt zwar keine #HashTags &#8230; <a href="http://blog.schelian.de/2011/09/google-anwendungsfall-logbuch/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ich möchte Heute darüber schreiben wie man Google + “sinnvoll als Logbuch” und nicht nur ausschließlich dafür nutzen kann, um Informationen mit bestimmten Kreisen oder der Öffentlichkeit zu teilen.</p>
<p>Seit einigen Woche kann man auch </p>
<p><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="In Google+ suchen" border="0" alt="In Google+ suchen" src="http://blog.schelian.de/wp-content/uploads/2011/09/image6.png" width="392" height="42"></p>
<p>Es gibt zwar keine #HashTags aber eigentlich sind diese auch gar nicht unbedingt notwendig, es geht auch ohne, wie wir gleich sehen werden.</p>
<p>Ich möchte bestimmte Ereignisse auf Google+ hinterlegen, diese je nach Art des Ereignisses, entweder mit bestimmten Leuten oder der Öffentlichkeit teilen, oder einfach nur für mich zur späteren Erinnerung festhalten.</p>
<p>Natürlich gehe ich an dieser Stelle davon aus, dass Google meine Daten nur denjenigen Zugängig macht, denen ich es erlaube (Circles), und auch sonst nichts mit meinen Daten anstellt, was ich nicht möchte (Die Hoffnung stirbt ja bekanntlich zuletzt <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.schelian.de/wp-content/uploads/2011/09/wlEmoticon-smile.png"> ). </p>
<p>Aber das ist ein anderes Thema, dass ich hier nicht weiter vertiefen möchte. Wer also gar kein Vertrauen oder einfach nur zu viel misstrauen hat, soll halt keine Daten G+ anvertrauen. Und besser gar nichts im Internet haben, vor allem nicht auf Facebook, aber dass ist auch ein anderes Thema.</p>
<p>So nun aber zur Auflösung wie ich G+ als Logbuch verwende:</p>
<p>Als erstes muss ich mir ein Kürzel für mein Logbuch ausdenken, und zwar eines, dass vermutlich nicht sehr häufig in meinen anderen Beiträgen vorkommt. Das kann auch der Begriff “Logbuch” sein, wenn man nicht in allen Beiträgen über Logbücher schreibt.</p>
<p>Dann erstellt ich die Beiträge die in meinem Logbuch erscheinen sollen im Format:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/09/image7.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.schelian.de/wp-content/uploads/2011/09/image_thumb5.png" width="567" height="225"></a></p>
<p>Nun kann ich den Beitrag für beliebige Kreise freigeben und ihn teilen.</p>
<p>Wie kann ich nun aber Logbuch Einträge erstellen, die nur für mich (und Google <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.schelian.de/wp-content/uploads/2011/09/wlEmoticon-smile.png"> ) sind?</p>
<p>Ich erstelle mir einen Kreis, zum Beispiel den Kreis “Privat”&nbsp; und füge <strong>keine</strong> Personen in diesem Kreis hinzu.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/09/image8.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.schelian.de/wp-content/uploads/2011/09/image_thumb6.png" width="169" height="163"></a></p>
<p>Somit habe ich einen Kreis den ich zum Teilen von Nachrichten verwenden kann, dessen Nachrichten aber nur ich lesen kann.</p>
<p>Nun sind alle Vorbereitungen getroffen um Logbuch Einträge erstellen zu können die entweder nur von mir oder auch von bestimmten Kreisen gelesen werden können.</p>
<p>Aber was wäre ein Logbuch wenn man die Einträge eines Logbuchs nicht auch Chronologisch anzeigen lassen könnte, und nur meine Logbuch Einträge.</p>
<p>Dazu kommt nun die Google+ Suche ins Spiel.</p>
<p>In das Suchfeld gebe ich das Logbuch Kürzel zusammen mit meinem G+ Profilnamen bzw. meinem Nachnamen ein, also für mein Logbuch sieht das so aus:</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/09/image9.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.schelian.de/wp-content/uploads/2011/09/image_thumb7.png" width="392" height="40"></a></p>
<p>Nachdem man die Suche das erste mal ausgeführt hat, bietet G+ einem an, dass man diese Suche speichern kann.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/09/image10.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.schelian.de/wp-content/uploads/2011/09/image_thumb8.png" width="579" height="70"></a></p>
<p>Und das machen wir auch.</p>
<p>Wenn man eine Suche speichert wird einem zum Wideraufruf der Suche ein Link auf der linken Seite unterhalb der Stream Auswahl angezeigt, diesen kann man dann jederzeit verwenden um sich sein Logbuch anzeigen zu lassen.</p>
<p><a href="http://blog.schelian.de/wp-content/uploads/2011/09/image11.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 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.schelian.de/wp-content/uploads/2011/09/image_thumb9.png" width="125" height="244"></a></p>
<p>So und nun viel Spaß mit dem G+ Logbuch</p>
<div class="google_plus_one"><g:plusone size="medium" count="true" url="http://blog.schelian.de/2011/09/google-anwendungsfall-logbuch/"></g:plusone></div><div align="right"><a href="http://twitter.com/SchelianHP" target="_blank"><img src="http://blog.schelian.de/wp-content/plugins/igit-follow-me-after-post-button-new/twitter11.png" /></a></div>

<a href="http://twitter.com/share?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F09%2Fgoogle-anwendungsfall-logbuch%2F&amp;url=http%3A%2F%2Fblog.schelian.de%2F2011%2F09%2Fgoogle-anwendungsfall-logbuch%2F" target="_blank" rel="nofollow" title="Twitter"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/twitter.png" alt="Twitter" title="Twitter" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F09%2Fgoogle-anwendungsfall-logbuch%2F&amp;title=Google+%2B+-+Anwendungsfall+Logbuch" target="_blank" rel="nofollow" title="del.icio.us"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/delicious2.png" alt="del.icio.us" title="del.icio.us" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fblog.schelian.de%2F2011%2F09%2Fgoogle-anwendungsfall-logbuch%2F&amp;title=Google+%2B+-+Anwendungsfall+Logbuch" target="_blank" rel="nofollow" title="Digg"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/digg.png" alt="Digg" title="Digg" /></a>
<a href="http://facebook.com/sharer.php?u=http%3A%2F%2Fblog.schelian.de%2F2011%2F09%2Fgoogle-anwendungsfall-logbuch%2F&amp;t=Google+%2B+-+Anwendungsfall+Logbuch" target="_blank" rel="nofollow" title="Facebook"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/facebook.png" alt="Facebook" title="Facebook" /></a>
<a href="http://www.linkedin.com/shareArticle?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F09%2Fgoogle-anwendungsfall-logbuch%2F&amp;title=Google+%2B+-+Anwendungsfall+Logbuch" target="_blank" rel="nofollow" title="linked-in"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/linkedin.png" alt="linked-in" title="linked-in" /></a>
<a href="http://buzz.yahoo.com/submit?submitUrl=Google+%2B+-+Anwendungsfall+Logbuch&amp;u=http%3A%2F%2Fblog.schelian.de%2F2011%2F09%2Fgoogle-anwendungsfall-logbuch%2F" target="_blank" rel="nofollow" title="Yahoo Buzz"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/yahoo.png" alt="Yahoo Buzz" title="Yahoo Buzz" /></a>
<a href="http://stumbleupon.com/submit?url=http%3A%2F%2Fblog.schelian.de%2F2011%2F09%2Fgoogle-anwendungsfall-logbuch%2F&amp;title=Google+%2B+-+Anwendungsfall+Logbuch&amp;newcomment=Google+%2B+-+Anwendungsfall+Logbuch" target="_blank" rel="nofollow" title="StumbleUpon"><img src="http://blog.schelian.de/wp-content/plugins/wp-most-simple-social-bookmarks/images/su.png" alt="StumbleUpon" title="StumbleUpon" /></a>



]]></content:encoded>
			<wfw:commentRss>http://blog.schelian.de/2011/09/google-anwendungsfall-logbuch/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

