<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Bodo&#39;s Dynamics NAV Blog</title>
		<link>http://www.comporsys.de/dynamics-nav-blog/</link>
		<atom:link href="http://www.comporsys.de/dynamics-nav-blog/" rel="self" type="application/rss+xml" />
		<description></description>

		
		<item>
			<title>Dynamics NAV und das Ausdrucken externer Dateien</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/dynamics-nav-und-das-ausdrucken-externer-dateien/</link>
			<description>&lt;p&gt;Durch Zufall bin ich auf &lt;a href=&quot;http://www.msdynamics.de/&quot;&gt;msdynamics.de&lt;/a&gt; über einen Artikel gestolpert, der die unterschiedlichen Möglichkeiten diskutiert, externe Dateien (z.B. PDFs, Word-Dokumente, Excel-Dokumente) direkt aus Dynamics NAV zu drucken: &lt;a href=&quot;http://www.msdynamics.de/viewtopic.php?f=14&amp;amp;t=1950&quot;&gt;http://www.msdynamics.de/viewtopic.php?f=14&amp;amp;t=1950&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Seit mit Dynamics NAV 2009 R2 der DotNet-Datentyp eingeführt wurde, können wir diesen Möglichkeiten noch eine weitere Variante hinzufügen: Die direkte Verwendung der .NET Framework Process-Klasse (&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/ccf1tfx0.aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/ccf1tfx0.aspx&lt;/a&gt;) und der ProcessStartInfo-Klasse (&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Mit &lt;em&gt;Process.Start&lt;/em&gt; wird die mit der Endung (z.B. .pdf, .docx, .xlsx) der zu druckenden Datei verknüpfte Anwendung gestartet. Das &lt;em&gt;StartInfo.Verb&lt;/em&gt; „PrintTo“ sorgt dafür, dass die Datei automatisch auf dem angegebenen Drucker ausgegeben wird. Alternativ können Sie auch „Print“ verwenden. Dann erfolgt die Ausgabe immer auf dem Standarddrucker. &lt;em&gt;Process.WaitForExit&lt;/em&gt; wartet maximal die angegebene Dauer in Millisekunden. Bis dahin muss die Anwendung das  Dokument an den Drucker übertragen haben. Bei sehr großen Dokumenten müssen Sie eventuell den Timeout-Parameter höher setzen.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage600384-blog042012.png&quot; width=&quot;600&quot; height=&quot;384&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Den vollständigen Quellcode können Sie hier herunterladen: &lt;a href=&quot;http://www.comporsys.de/assets/blog/Codeunit 50.507 Print Document.txt&quot; target=&quot;_blank&quot;&gt;Codeunit 50.507 Print Document.txt&lt;/a&gt;&lt;/p&gt;</description>
			<pubDate>Fri, 20 Apr 2012 10:07:47 +0200</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/dynamics-nav-und-das-ausdrucken-externer-dateien/</guid>
		</item>
		
		<item>
			<title>Fehlende Icons in der Toolbar der Seitenansicht für die Berichte</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/fehlende-icons-in-der-toolbar-der-seitenansicht-fuer-die-berichte/</link>
			<description>&lt;p&gt;Sicherlich sind Ihnen auch schon die beiden unterschiedlichen Varianten der Toolbar in der Seitenansicht für die Berichte des Role Tailored Client von Dynamics NAV 2009 aufgefallen.&lt;/p&gt;
&lt;p&gt;Variante 1:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage60031-blog0312-image1.png&quot; width=&quot;600&quot; height=&quot;31&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Variante 2:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage60031-blog0312-image2.png&quot; width=&quot;600&quot; height=&quot;31&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;In der Variante 2 fehlen die Icons für „Drucken“, „Drucklayout“, „Seite einrichten“ und „Speichern unter“.&lt;/p&gt;
&lt;p&gt;Ursache? Sobald in der Programmierung des Berichts die Funktion CurrReport.PREVIEW verwendet wird, zeigt der Role Tailored Client die Variante 2 an.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ach! (Loriot, 1923 – 2011)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
			<pubDate>Sat, 10 Mar 2012 13:50:54 +0100</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/fehlende-icons-in-der-toolbar-der-seitenansicht-fuer-die-berichte/</guid>
		</item>
		
		<item>
			<title>Dynamics NAV Web Services und die Reihenfolge der Ereignistrigger</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/dynamics-nav-web-services-und-die-reihenfolge-der-ereignistrigger/</link>
			<description>&lt;p&gt;&lt;strong&gt;Annahme&lt;/strong&gt;: Wir haben einen Web Service auf Basis eine Page (Property PageType=List, Editable=Yes) veröffentlicht.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quizfrage&lt;/strong&gt;: In welcher Reihenfolge werden beim Aufruf einer Web Service Methode die Ereignistrigger der Page und der zugrundeliegende Datenbanktabelle ausgelöst?&lt;/p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; width=&quot;617&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Web Service - Create&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Nr.&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Objekt&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Ereignis&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Hinweis&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnInit&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Falls Sie versuchen sollten, in diesem Ereignistrigger in die   Datenbank zu schreiben, bekommen Sie die Fehlermeldung „Sie können keine   Änderungen an der Datenbank vornehmen, ehe eine Transaktion gestartet wurde.“&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnOpenPage&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; width=&quot;617&quot; valign=&quot;top&quot;&gt;
&lt;p align=&quot;center&quot;&gt;Impliziter Start der   Datenbanktransaktion&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnNewRecord&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Table&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&amp;lt;Column Name&amp;gt;   - OnValidate&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Auf dem Table-Objekte wird das OnValidate-Ereignis der   Primärschlüsselspalte ausgelöst.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&amp;lt;Column Name&amp;gt;   - OnValidate&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Auf dem Page-Objekt wird das OnValidate-Ereignis der   Primärschlüsselspalte ausgelöst.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnInsertRecord&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Table&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnInsert&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Table&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&amp;lt;Column Name&amp;gt;   - OnValidate&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Gem. der Reihenfolge der Spalten auf dem Page-Objekt werden die   OnValidate-Ereignisse aller Spalten ausgelöst, deren Werte Sie gesetzt haben.   Jeweils zunächst das OnValidate-Ereignis des Table-Objekts und anschließend   des Page-Objekts.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;9&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&amp;lt;Column Name&amp;gt; - OnValidate&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Siehe oben.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;10&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnModifyRecord&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;11&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Table&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnModify&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; width=&quot;617&quot; valign=&quot;top&quot;&gt;
&lt;p align=&quot;center&quot;&gt;Implizites COMMIT der   Datenbanktransaktion&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;12&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnAfterGetRecord&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Falls Sie versuchen sollten, in diesem Ereignistrigger in die   Datenbank zu schreiben, bekommen Sie die Fehlermeldung „Sie können keine   Änderungen an der Datenbank vornehmen, ehe eine Transaktion gestartet wurde.“&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt; &lt;/p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; width=&quot;617&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Web Service - Update&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Nr.&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Objekt&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Trigger&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Hinweis&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnInit&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Falls Sie versuchen sollten, in diesem Ereignistrigger in die   Datenbank zu schreiben, bekommen Sie die Fehlermeldung „Sie können keine   Änderungen an der Datenbank vornehmen, ehe eine Transaktion gestartet wurde.“&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnOpenPage&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; width=&quot;617&quot; valign=&quot;top&quot;&gt;
&lt;p align=&quot;center&quot;&gt;Impliziter Start der   Datenbanktransaktion&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnAfterGetRecord&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Falls Sie versuchen sollten, in diesem Ereignistrigger in die   Datenbank zu schreiben, bekommen Sie die Fehlermeldung „Sie können keine   Änderungen an der Datenbank vornehmen, ehe eine Transaktion gestartet wurde.“&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Table&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&amp;lt;Column Name&amp;gt;   - OnValidate&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Gem. der Reihenfolge der Spalten auf dem Page-Objekt werden die   OnValidate-Ereignisse aller Spalten ausgelöst, deren Werte Sie geändert   haben. Jeweils zunächst das OnValidate-Ereignis des Table-Objekts und   anschließend des Page-Objekts.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&amp;lt;Column Name&amp;gt;   - OnValidate&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Siehe oben.&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;6&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnModifyRecord&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;7&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Table&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnModify&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; width=&quot;617&quot; valign=&quot;top&quot;&gt;
&lt;p align=&quot;center&quot;&gt;Implizites COMMIT der   Datenbanktransaktion&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;8&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnAfterGetRecord&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Falls Sie versuchen sollten, in diesem Ereignistrigger in die Datenbank   zu schreiben, bekommen Sie die Fehlermeldung „Sie können keine Änderungen an   der Datenbank vornehmen, ehe eine Transaktion gestartet wurde.“&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt; &lt;/p&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; width=&quot;617&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Web Service - Delete&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Nr.&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Objekt&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Trigger&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;&lt;strong&gt;Hinweis&lt;/strong&gt;&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;1&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnInit&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Falls Sie versuchen sollten, in diesem Ereignistrigger in die   Datenbank zu schreiben, bekommen Sie die Fehlermeldung „Sie können keine   Änderungen an der Datenbank vornehmen, ehe eine Transaktion gestartet wurde.“&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;2&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnOpenPage&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; width=&quot;617&quot; valign=&quot;top&quot;&gt;
&lt;p align=&quot;center&quot;&gt;Impliziter Start der   Datenbanktransaktion&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;3&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnAfterGetRecord&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Falls Sie versuchen sollten, in diesem Ereignistrigger in die   Datenbank zu schreiben, bekommen Sie die Fehlermeldung „Sie können keine   Änderungen an der Datenbank vornehmen, ehe eine Transaktion gestartet wurde.“&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;4&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Page&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnDeleteRecord&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;width: 64px;&quot; align=&quot;center&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;5&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;76&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;Table&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;126&quot; valign=&quot;top&quot;&gt;
&lt;p&gt;OnDelete&lt;/p&gt;
&lt;/td&gt;
&lt;td width=&quot;352&quot; valign=&quot;top&quot;&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; width=&quot;617&quot; valign=&quot;top&quot;&gt;
&lt;p align=&quot;center&quot;&gt;Implizites COMMIT der   Datenbanktransaktion&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Schlussbemerkung: Der Test basiert auf der Version 2009 R2, Build 32441.&lt;/p&gt;
&lt;p&gt;Bemerkenswert ist&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;dass im Fall der Create()-Methode eine Kombination aus Rec.INSERT() und Rec.MODIFY() durchlaufen wird und &lt;/li&gt;
&lt;li&gt;dass in keinem Fall das OnClosePage-Ereignis ausgelöst wird.&lt;/li&gt;
&lt;/ol&gt;</description>
			<pubDate>Mon, 13 Feb 2012 21:26:14 +0100</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/dynamics-nav-web-services-und-die-reihenfolge-der-ereignistrigger/</guid>
		</item>
		
		<item>
			<title>Der Unterschied zwischen den Sicherheitsmodellen Standard und Enhanced</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/der-unterschied-zwischen-den-sicherheitsmodellen-standard-und-enhanced/</link>
			<description>&lt;p&gt;In meinen Schulungen für angehende Dynamics NAV Entwickler wird regelmäßig die Frage gestellt, worin der Unterschied zwischen den Sicherheitsmodellen Standard und Enhanced der Datenbank besteht. Antwort:&lt;/p&gt;
&lt;p&gt;Zunächst grundsätzliches. Der NAV Client nutzt für den Zugriff auf die SQL Server Datenbank das Konzept der Anwendungsrollen (siehe dazu &lt;a href=&quot;http://msdn.microsoft.com/de-de/library/ms190998.aspx&quot;&gt;http://msdn.microsoft.com/de-de/library/ms190998.aspx&lt;/a&gt;). Die in NAV eingerichteten Datenbank- und Windows-Anmeldungen haben keine Berechtigungen für die Datenbanktabellen, sondern tragen lediglich die SQL Server Rolle Public. D.h. nach erfolgreicher Anmeldung des NAV Clients über einen Datenbank- bzw. Windows-Benutzer, erfolgt der Zugriff auf die Datenbanktabellen über die Anwendungsrolle. Das Kennwort der Anwendungsrolle kennt nur der NAV Client, so dass die Anwendungsrolle nicht von anderen Anwendungen genutzt werden kann. Gleichzeitig können die Benutzer mit ihrer Benutzerkennung über ein externes Tool nicht auf die NAV Tabellen zugreifen.&lt;/p&gt;
&lt;p&gt;Die Anwendungsrollen finden wir im SQL Server Management Studio unter Datenbanken -&amp;gt; [Name der Datenbank] -&amp;gt; Sicherheit -&amp;gt; Rollen -&amp;gt; Anwendungsrollen.&lt;/p&gt;
&lt;p&gt;Und nun zum Unterschied zwischen den Sicherheitsmodellen Standard und Enhanced. Wenn wir Standard einstellen, gibt es genau eine einzige Anwendungsrolle und diese wird von allen Benutzern verwendet. Wenn wir Enhanced einstellen, verwendet jeder Benutzer eine eigene Anwendungsrolle.&lt;/p&gt;
&lt;p&gt;Das bedeutet für das Sicherheitsmodell Standard:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Die eine Anwendungsrolle hat die Berechtigungen zum Lesen, Einfügen, Ändern und Löschen von Datensätzen für alle Datenbanktabellen.&lt;/li&gt;
&lt;li&gt;Die tatsächlichen Berechtigungen eines Benutzers gemäß seiner NAV Rollen werden vom NAV Client geprüft.&lt;/li&gt;
&lt;li&gt;Wenn wir eine neue Datenbanktabelle anlegen, wird diese automatisch der Anwendungsrolle hinzugefügt. Das gilt sowohl für das Anlegen über den Table Designer als auch bei Importieren von Tabellen über das Import Worksheet (.fob und .txt).&lt;/li&gt;
&lt;li&gt;Synchronisieren (Extras -&amp;gt; Zugriffsrechte -&amp;gt; Synchronisieren im NAV Client) löscht die Anwendungsrolle und baut diese neu auf.&lt;/li&gt;
&lt;li&gt;Wir können unsere Active Directory Gruppen als Windows-Anmeldungen verwenden.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Das bedeutet für das Sicherheitsmodell Enhanced:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Jede Anwendungsrolle bildet genau die Berechtigungen eines Benutzers gemäß der Zugriffsrechte seiner NAV Rollen ab.&lt;/li&gt;
&lt;li&gt;Die Prüfung der Berechtigungen kann daher vom SQL Server übernommen werden und muss nicht durch den NAV Client erfolgen.&lt;/li&gt;
&lt;li&gt;Wenn wir eine neue Datenbanktabelle anlegen, wird diese &lt;span style=&quot;text-decoration: underline;&quot;&gt;nicht&lt;/span&gt; automatisch den Anwendungsrollen hinzugefügt. D.h., wir müssen anschließend alle Benutzerkennungen synchronisieren. Damit werden alle Anwendungsrollen gelöscht und neu aufgebaut.&lt;/li&gt;
&lt;li&gt;Wenn wir die Zugriffsrechte einer NAV Rolle ändern, müssen wir alle Benutzerkennungen synchronisieren, die diese NAV Rolle verwenden.&lt;/li&gt;
&lt;li&gt;Wenn wir die NAV Rollenzuordnung einer einzelnen Benutzerkennung ändern, müssen wir diese Benutzerkennung synchronisieren.&lt;/li&gt;
&lt;li&gt;Um einzelne Benutzerkennungen zu synchronisieren, können wir „Einfache Anmeldung synchronisieren“ wählen. Dazu die Datenbank- bzw. Windows-Anmeldungen öffnen und die gewünschte Benutzerkennung auswählen.&lt;/li&gt;
&lt;li&gt;Wir können nicht mit Active Directory Gruppen arbeiten. Es ist zwingend notwendig, für jede Benutzerkennung eine eigene Windows-Anmeldung zu haben.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Fazit: Der administrative Aufwand ist mit dem Sicherheitsmodell Enhanced deutlich höher. Und wir haben gegenüber dem Sicherheitsmodell Standard keine Vorteile, sondern eher Nachteile, da wir auch keine Active Directory Gruppen verwenden können. Ich rate daher jedem zur Verwendung des Sicherheitsmodells Standard. Und bitte daran denken, dass bei einer neuen Datenbank die Standardeinstellung Enhanced und nicht Standard ist…&lt;/p&gt;
&lt;p&gt;PS: Es würde mich nicht wundern, wenn Microsoft mit NAV „7“ das Konzept der Anwendungsrollen nicht mehr verwenden wird.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
			<pubDate>Fri, 13 Jan 2012 13:49:47 +0100</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/der-unterschied-zwischen-den-sicherheitsmodellen-standard-und-enhanced/</guid>
		</item>
		
		<item>
			<title>NAV 2009 R2 – Login-Dialog für den Role Tailored Client</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-r2-login-dialog-fuer-den-role-tailored-client/</link>
			<description>&lt;p&gt;Wenn sich mehrere Anwender einen PC-Arbeitsplatz teilen, taucht regelmäßig die Anforderung auf, dass sich jeder Anwender mit seinem eigenen Benutzernamen an Dynamics NAV anmelden soll - und zwar ohne die Anmeldung an Windows zu wechseln.&lt;/p&gt;
&lt;p&gt;Mit NAV 2009 R2 hat Microsoft diese Möglichkeit geschaffen. Der neue Parameter „ClientCredentialType“ in der Konfigurationsdatei „ClientUserSettings.config“ kann für diese Zwecke verwendet werden. Ändern Sie einfach den Wert von „Windows“ auf „UserName“:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br/&gt; &amp;lt;configuration&amp;gt;&lt;br/&gt;  &amp;lt;appSettings&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;Server&quot; value=&quot;SPIDERMAN&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;ServerInstance&quot; value=&quot;DynamicsNAV&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;ServerPort&quot; value=&quot;7046&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;ProtectionLevel&quot; value=&quot;EncryptAndSign&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;UrlHistory&quot; value=&quot;&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;CompressionThreshold&quot; value=&quot;64&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;ChunkSize&quot; value=&quot;28&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;AllowNtlm&quot; value=&quot;true&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;ServicePrincipalNameRequired&quot; value=&quot;true&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;OpenConnectionTimeout&quot; value=&quot;00:00:30&quot; /&amp;gt;&lt;br/&gt;   &lt;strong&gt;&amp;lt;add key=&quot;ClientCredentialType&quot; value=&quot;UserName&quot; /&amp;gt;&lt;/strong&gt;&lt;br/&gt;   &amp;lt;add key=&quot;DnsIdentity&quot; value=&quot;&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;UnknownSpnHint&quot; value=&quot;(net.tcp://spiderman:7046/DynamicsNAV/Service)=Spn;&quot; /&amp;gt;&lt;br/&gt;  &amp;lt;/appSettings&amp;gt;&lt;br/&gt; &amp;lt;/configuration&amp;gt;&lt;/div&gt;
&lt;p&gt;Die Konfigurationsdatei finden Sie im Verzeichnis „C:\Users\&amp;lt;Benutzername&amp;gt;\AppData\Local\Microsoft\Microsoft Dynamics NAV“ (Hinweis: Das Verzeichnis „AppData“ wird standardmäßig nicht angezeigt. Der Verzeichnisname gilt nur für Windows 7 und Windows Server 2008 R2).&lt;/p&gt;
&lt;p&gt;Im Ergebnis bekommen Sie beim Start des Role Tailored Client einen Login-Dialog:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog122011-1.png&quot; width=&quot;238&quot; height=&quot;247&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;</description>
			<pubDate>Sat, 17 Dec 2011 13:58:57 +0100</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-r2-login-dialog-fuer-den-role-tailored-client/</guid>
		</item>
		
		<item>
			<title>[UPDATE] NAV 2009 – Kritischer Fehler in Berichten für den Role Tailored Client</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/update-nav-2009-kritischer-fehler-in-berichten-fuer-den-role-tailored-client/</link>
			<description>&lt;p&gt;&lt;strong&gt;[Update zu &lt;a href=&quot;http://www.comporsys.de/dynamics-nav-blog/nav-2009-kritischer-fehler-in-berichten-fuer-den-role-tailored-client/&quot;&gt;NAV 2009 - Kritischer Fehler in Berichten für den Role Tailored Client&lt;/a&gt;]&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Microsoft Support hat dieses Verhalten bestätigt. Betroffen ist nicht nur der Datentyp Decimal wie im Artikel beschrieben, sondern auch der Datentyp Date. Die Ursache liegt in der Interpretation der Filterangabe durch den Dynamics NAV Server. Dieser erwartet die Filterangabe im XML Format (siehe dazu die Beschreibung in der Microsoft Dynamics NAV Dokumentation zum Property „Format“). Diese Erwartung kollidiert mit dem eingegebenen Format. Während es bei Date zur Laufzeit zu der Fehlermeldung „Mindestens ein Filter ist ungültig und wird ignoriert“ kommt, wird Decimal falsch interpretiert und der Bericht ohne Fehlermeldung ausgeführt.&lt;/p&gt;
&lt;p&gt;Microsoft wird dieses Verhalten nicht ändern, und empfiehlt auf die Verwendung von Date und Decimal Filterkriterien in der Eigenschaft DataItemTableView zu verzichten. Stattdessen soll der Filter im Trigger OnPreDataItem über SETFILTER gesetzt werden.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;</description>
			<pubDate>Thu, 15 Dec 2011 13:54:48 +0100</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/update-nav-2009-kritischer-fehler-in-berichten-fuer-den-role-tailored-client/</guid>
		</item>
		
		<item>
			<title>NAV 2009 – Kritischer Fehler in Berichten für den Role Tailored Client</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-kritischer-fehler-in-berichten-fuer-den-role-tailored-client/</link>
			<description>&lt;p&gt;&lt;strong&gt;[Update vom 15. Dezember 2011]&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Microsoft Support hat dieses Verhalten bestätigt. Betroffen ist nicht  nur der Datentyp Decimal wie unten beschrieben, sondern auch der  Datentyp Date. Die Ursache liegt in der Interpretation der Filterangabe  durch den Dynamics NAV Server. Dieser erwartet die Filterangabe im XML  Format (siehe dazu die Beschreibung in der Microsoft Dynamics NAV  Dokumentation zum Property „Format“). Diese Erwartung kollidiert mit dem  eingegebenen Format. Während es bei Date zur Laufzeit zu der  Fehlermeldung „Mindestens ein Filter ist ungültig und wird ignoriert“  kommt, wird Decimal falsch interpretiert und der Bericht ohne  Fehlermeldung ausgeführt.&lt;/p&gt;
&lt;p&gt;Microsoft wird dieses Verhalten nicht ändern, und empfiehlt auf die  Verwendung von Date und Decimal Filterkriterien in der Eigenschaft  DataItemTableView zu verzichten. Stattdessen soll der Filter im Trigger  OnPreDataItem über SETFILTER gesetzt werden.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[Originaltext]&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In einem aktuellen Upgrade-Projekt auf Dynamics NAV 2009 R2 sind wir über einen kritischen Fehler in den Berichten für den Role Tailored Client gestolpert.&lt;/p&gt;
&lt;p&gt;Falls Sie auf einem Report-DataItem über die Eigenschaft DataItemTableView einen Filter auf eine Spalte vom Typ Decimal legen, wird der Filter nicht korrekt angewendet, wenn es sich bei dem Filterwert um einen Dezimalwert mit Nachkommastellen handelt.&lt;/p&gt;
&lt;p&gt;Der Beispielbericht (&lt;a href=&quot;http://www.comporsys.de/assets/blog/Report 50.006 GL Entry List.txt&quot; target=&quot;_blank&quot;&gt;Download hier&lt;/a&gt;) zeigt eine einfache Liste der Sachposten der CRONUS AG. Dabei ist ein Filter aktiv, der nur die Sachposten anzeigt, deren Betrag &amp;gt; 10.000,50 EUR ist.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog112011-image1.png&quot; width=&quot;522&quot; height=&quot;342&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Wenn Sie die beiden Screenshots unten vergleichen, stellen Sie fest, dass die gelb markierten Posten in der Seitenansicht des Role Tailored Client fehlen.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog112011-image2.png&quot; width=&quot;593&quot; height=&quot;463&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Die Abbildung oben zeigt das Ergebnis in der Seitenansicht des Dynamics NAV Role Tailored Client.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage593600-blog112011-image3.gif&quot; width=&quot;593&quot; height=&quot;600&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Die Abbildung oben zeigt das Ergebnis in der Seitenansicht des Dynamis NAV Classic Client.&lt;/p&gt;
&lt;p&gt;Wenn Sie den Filter in der DataItemTableView-Eigenschaft auf einen ganzzahligen Wert ändern, z.B. Betrag &amp;gt; 10.000, ist die Berichtsausführung korrekt.&lt;/p&gt;
&lt;p&gt;Wir werden das Problem Microsoft melden. Sobald ich Neuigkeiten zu diesem Thema habe, werde ich diese hier berichten.&lt;/p&gt;</description>
			<pubDate>Sat, 19 Nov 2011 20:41:27 +0100</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-kritischer-fehler-in-berichten-fuer-den-role-tailored-client/</guid>
		</item>
		
		<item>
			<title>NAV 2009 – Security Filter, Buchungsdatum und Rec.READPERMISSION</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-security-filter-buchungsdatum-und-rec-readpermission/</link>
			<description>&lt;p&gt;Szenario: Der Betriebsprüfer vom Finanzamt steht vor der Tür. Es soll das Geschäftsjahr 2010 geprüft werden. Ihre Aufgabe ist es, eine Dynamics NAV Rolle für den Betriebsprüfer einzurichten und dabei die Zugriffsrechte auf das Geschäftsjahr 2010 einzuschränken.&lt;/p&gt;
&lt;p&gt;Für diese Art von Anforderungen kennt Dynamics NAV das Konzept der Security Filter. Security Filter definieren Sie in den Zugriffsrechten für Table Data-Objekte. Die unten stehende Abbildung zeigt die Definition für die Sachposten mit der Einschränkung des Buchungsdatums auf das Geschäftsjahr 2010. Wir haben für den Betriebsprüfer eine Rolle „FA“ (Finanzamt) angelegt. Die zusätzlichen Berechtigungen für die Table Data-Objekte Währung, Sachkonto und Bemerkungszeile sind notwendig, um den Kontenplan bzw. die Sachkontoarte öffnen zu können.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage600171-blog10-image1.png&quot; width=&quot;600&quot; height=&quot;171&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Zusammen mit der vordefinierten Rolle „ALLE“ des Demomandanten CRONUS AG sind die Berechtigungen ausreichend. Könnte man meinen.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog10-image2.png&quot; width=&quot;481&quot; height=&quot;197&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Allerdings kommt es beim Öffnen des Kontenplans zu folgender Fehlermeldung:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog10-image3.png&quot; width=&quot;410&quot; height=&quot;144&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Was ist die Ursache? Auf dem Kontenplan haben wir u.a. das Flow Field „Saldo“. Bekanntlich berechnet sich der Saldo aus allen Sachposten des Kontos. Da wir den Zugriff auf die Sachposten über den Security Filter eingeschränkt haben, können nicht mehr alle Sachposten gelesen werden und Dynamics NAV bringt die Fehlermeldung „Sie haben keine Berechtigung zum Lesen der Tabelle Sachposten“.&lt;/p&gt;
&lt;p&gt;Und die Lösung? Wir brauchen eine zweite Rolle „FA-INDIREKT“ (Finanzamt – indirekte Rechte), mit der wir indirekte Leserechte auf die Sachposten erteilen, ohne einen Security Filter zu setzen. Damit erlauben wir dem Flow Field sich zu berechnen.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage600171-blog10-image4.png&quot; width=&quot;600&quot; height=&quot;171&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Die neue Rolle weisen wir ebenfalls unserem Benutzer zu.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog10-image5.png&quot; width=&quot;481&quot; height=&quot;197&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Jetzt kann der Betriebsprüfer den Kontenplan öffnen. Die Spalte Saldo zeigt zwar per Definition immer den aktuellen Saldo an, wenn Sie allerdings den Drill Down auf die Sachposten machen, werden nur die Bewegungen des Geschäftsjahres 2010 angezeigt.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage600232-blog10-image6.png&quot; width=&quot;600&quot; height=&quot;232&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Diese Lösung lässt sich noch verfeinern: 1) Die Spalte „Saldo bis Datum“ soll immer den Saldo per Ende der Prüfungsperiode anzeigen. 2) Der Betriebsprüfer soll nicht die Möglichkeit haben, durch das Setzen des Flow Filters „Datumsfilter“ in der Spalte „Bewegung“ einen Wert für eine Bewegung außerhalb der Prüfungsperiode anzuzeigen.&lt;/p&gt;
&lt;p&gt;Beide Anforderungen lassen sich erfüllen, wenn wir einen Security Filter für Sachkonto definieren und den Datumsfilter auf das Geschäftsjahr 2010 einschränken.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage600171-blog10-image7.png&quot; width=&quot;600&quot; height=&quot;171&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Geschafft. Könnte man meinen. Leider sind Teile des Dynamics NAV Standards nicht für den Einsatz von Security Filtern vorbereitet. So zum Beispiel das Navigate-Formular. Wenn Sie auf einem beliebigen Sachposten stehen und „Navigate“ ausführen, bekommen Sie die folgende Fehlermeldung:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog10-image8.png&quot; width=&quot;415&quot; height=&quot;144&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Die Fehlermeldung kann einen wundern. Zumindest der eine Sachposten auf dem wir aktuell stehen, enthält unsere Kombination aus Belegnummer und Buchungsdatum. Ein Blick hinter die Kulissen des Navigate-Formulars verrät das Problem (Funktion „FindRecords“):&lt;/p&gt;
&lt;p class=&quot;code&quot;&gt;...&lt;br/&gt; IF GLEntry.READPERMISSION THEN BEGIN&lt;br/&gt;   GLEntry.RESET;&lt;br/&gt;   GLEntry.SETCURRENTKEY(&quot;Document No.&quot;,&quot;Posting Date&quot;); &lt;br/&gt;   GLEntry.SETFILTER(&quot;Document No.&quot;,DocNoFilter);&lt;br/&gt;   GLEntry.SETFILTER(&quot;Posting Date&quot;,PostingDateFilter);&lt;br/&gt;   InsertIntoDocEntry(&lt;br/&gt;     DATABASE::&quot;G/L Entry&quot;,0,GLEntry.TABLECAPTION,GLEntry.COUNT);&lt;br/&gt; END;&lt;br/&gt; ...&lt;/p&gt;
&lt;p&gt;Rec.READPERMISSION liefert FALSE zurück, wenn für die Tabelle ein Security Filter definiert ist. In solchen Fällen muss vorher Rec.SETPERMISSIONFILTER aufgerufen werden. Gleichzeitig dürfen wir danach kein Rec.RESET machen, damit der Rec.COUNT auch den Security Filter berücksichtigt und nicht die bekannte Fehlermeldung „Sie haben keine Berechtigung zum Lesen der Tabelle Sachposten“ liefert. Der Programmcode kann also wie folgt umgebaut werden:&lt;/p&gt;
&lt;p class=&quot;code&quot;&gt;// --- 001&lt;br/&gt; GLEntry.RESET;&lt;br/&gt; GLEntry.SETPERMISSIONFILTER;&lt;br/&gt; // +++ 001&lt;br/&gt; IF GLEntry.READPERMISSION THEN BEGIN&lt;br/&gt;   // --- 001&lt;br/&gt;   // GLEntry.RESET;&lt;br/&gt;   // +++ 001&lt;br/&gt;   GLEntry.SETCURRENTKEY(&quot;Document No.&quot;,&quot;Posting Date&quot;);&lt;br/&gt;   GLEntry.SETFILTER(&quot;Document No.&quot;,DocNoFilter);&lt;br/&gt;   GLEntry.SETFILTER(&quot;Posting Date&quot;,PostingDateFilter);&lt;br/&gt;   InsertIntoDocEntry(&lt;br/&gt;     DATABASE::&quot;G/L Entry&quot;,0,GLEntry.TABLECAPTION,GLEntry.COUNT);&lt;br/&gt; END;&lt;/p&gt;
&lt;p&gt;Doch halt. Es geht auch anders. Weiter oben haben wir mit der Rolle „FA-INDIREKT“ indirekte Leserechte für die Sachposten definiert. Diese Berechtigung können wir nutzen, wenn wir dem Navigate-Formular über das Permissions-Property Leserechte auf die Sachposten einräumen:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog10-image9.png&quot; width=&quot;493&quot; height=&quot;185&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Beide Varianten führen zum Erfolg.&lt;/p&gt;
&lt;p&gt;Epilog.  Das hier vorgestellte Konzept müssen Sie selbstverständlich auf Debitoren, Debitorenposten, detaillierte Debitorenposten, Kreditoren, Kreditorenposten, detaillierte Kreditorenposten und nicht zu vergessen, die Mehrwertsteuerposten, übertragen.&lt;/p&gt;</description>
			<pubDate>Mon, 24 Oct 2011 12:53:49 +0200</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-security-filter-buchungsdatum-und-rec-readpermission/</guid>
		</item>
		
		<item>
			<title>NAV 2009 – Funktion FORMAT, Datentyp OPTION und unterschiedliches Verhalten von Classic Client und Role Tailored Client</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-funktion-format-datentyp-option-und-unterschiedliches-verhalten-von-classic-client-und-role-tailored-client/</link>
			<description>&lt;p&gt;Der folgende Quellcode erscheint auf den ersten Blick unverdächtig, führt allerdings bei der Ausführung über den NAV Server, d.h. über den Role Tailored Client oder über einen Web Service, zu einer Fehlermeldung:&lt;/p&gt;&amp;#13;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog091111-1.png&quot; width=&quot;416&quot; height=&quot;256&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;&amp;#13;
&lt;p&gt;Kurze Erläuterung des Quellcodes: Wir nehmen eine Variable SalesHeader vom Typ Record der Tabelle 36, setzen den Status auf „Freigegeben“, lesen anschließend diesen Status über die Datentypen RecordRef und FieldRef wieder aus, weisen den Wert der Variable OptionNo vom Typ Integer zu und zeigen das Ergebnis an.&lt;/p&gt;&amp;#13;
&lt;p&gt;Leider fliegt Ihnen eine Fehlermeldung um die Ohren, wenn Sie diesen Code über den Role Tailored Client (oder über einen Web Service) ausführen:&lt;/p&gt;&amp;#13;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog091111-2.png&quot; width=&quot;246&quot; height=&quot;102&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;&amp;#13;
&lt;p&gt;Wo liegt das Problem? Der Ausdruck „FORMAT(FldRef.VALUE)“ liefert den Wert „Freigegeben“ also den OptionCaption zurück. Darüber kann man sich wundern. Dynamics NAV Versionen vor 2009 und der Classic Client von NAV 2009 liefern für den gleichen Ausdruck den Index der Option zurück. Das können Sie einfach testen, in dem Sie den Quellcode oben über den Classic Client ausführen:&lt;/p&gt;&amp;#13;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog091111-3.png&quot; width=&quot;162&quot; height=&quot;129&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;&amp;#13;
&lt;p&gt;Dieses Problem ist bei Microsoft bekannt und unter der Bug-ID 208030 registriert. Es soll mit einem  Hotfix für Dynamics NAV 2009 SP1 bzw. R2 behoben werden. Sobald dieser Hotfix verfügbar ist, werde ich einen entsprechenden Link an dieser Stelle veröffentlichen.&lt;/p&gt;&amp;#13;
&lt;p&gt;Als Workaround bis zur Veröffentlichung des Hotfix müssen Sie die Zeile „EVALUATE(OptionNo, FORMAT(FldRef.VALUE));“ durch „OptionNo := FldRef.VALUE;“ ersetzen. Die implizite Typumwandlung führt in beiden Welten zum gleichen Ergebnis.&lt;/p&gt;&amp;#13;
&lt;p&gt;Mein besonderer Dank gilt Tobias. Wenn er mir nicht den Tipp gegeben hätte, das Änderungsprotokoll auszuschalten, würde ich wahrscheinlich heute noch nach dem Fehler suchen. In Codeunit 423 Change Log Management ist mit Dynamics NAV 2009 genau der oben beschriebene Workaround von Microsoft eingebaut worden. Nur leider war unser Quellcode noch auf Basis von Version 4…&lt;/p&gt;&amp;#13;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog091111-4.png&quot; width=&quot;504&quot; height=&quot;318&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;&amp;#13;
&lt;p&gt; &lt;/p&gt;</description>
			<pubDate>Mon, 12 Sep 2011 17:03:54 +0200</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-funktion-format-datentyp-option-und-unterschiedliches-verhalten-von-classic-client-und-role-tailored-client/</guid>
		</item>
		
		<item>
			<title>NAV 2009 – Quellcode des Transformation Tools veröffentlicht</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-quellcode-des-transformation-tools-veroeffentlicht/</link>
			<description>&lt;p&gt;Microsoft hat bereits am 5. Juli den Quellcode des Transformation Tools veröffentlicht - nur hat es kaum einer bemerkt.&lt;/p&gt;
&lt;p&gt;Man sieht es diesem Link &lt;a href=&quot;http://www.microsoft.com/download/en/details.aspx?id=26681&quot;&gt;http://www.microsoft.com/download/en/details.aspx?id=26681&lt;/a&gt; und der Beschreibung auch wirklich nicht direkt an, aber hinter diesem Download verbirgt sich wirklich der Quellcode.&lt;/p&gt;
&lt;p&gt;Anhand des Quellcodes lässt sich das eine oder andere Mysterium des Transformation Tools aufklären.&lt;/p&gt;
&lt;p&gt;Ein Beispiel: Aufgrund welcher Information setzt das Transformation Tool das Group-Property „ShowAsTree“ einer Page auf „Yes“?&lt;/p&gt;
&lt;p&gt;Die Antwort finden Sie, wenn Sie einen Blick in die Datei „PageControl.cs“ des Projektes „ObjectTransformation“ werfen. Dort finden Sie die folgende Funktion:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;private static void SetTreeViewProperties()&lt;br/&gt; {&lt;br/&gt;   MetadataDocumentManagement metaDataDocMgt = MetadataDocumentManagement.Instance;&lt;br/&gt;   XmlNode expansionControl = metaDataDocMgt.XmlCurrentFormNode.SelectSingleNode(&lt;br/&gt;     @&quot;.//a:Group/a:Properties[../a:Control/a:Properties/a:&lt;strong&gt;BitmapList = '47,46'&lt;/strong&gt;]&quot;,&lt;br/&gt;     metaDataDocMgt.XmlNamespaceMgt);&lt;br/&gt;  &lt;br/&gt;   if (expansionControl != null)&lt;br/&gt;   {&lt;br/&gt;     expansionControl.AppendChild(XmlUtility.CreateXmlElement(&quot;ShowAsTree&quot;, &quot;Yes&quot;));&lt;br/&gt;   }&lt;br/&gt;  &lt;br/&gt;   RemoveThisNodeFromParent(metaDataDocMgt.XmlCurrentFormNode.SelectSingleNode(&lt;br/&gt;     @&quot;.//a:Group//a:Control[./a:Properties/a:BitmapList = '47,46']&quot;,&lt;br/&gt;     metaDataDocMgt.XmlNamespaceMgt));&lt;br/&gt; }&lt;/div&gt;
&lt;p&gt;Auch wenn Sie kein Experte für C# oder XPath-Ausdrücke sind, werden Sie feststellen, dass das Setzen der Properties von der BitmapList und den &lt;strong&gt;Bitmaps 47 und 46&lt;/strong&gt; abhängt. Das Plus-Icon und das Minus-Icon werden zum Aufklappen und Zusammenklappen verwendet. Zur Veranschaulichung, es handelt sich um die folgenden Bitmaps:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog081911-1.png&quot; width=&quot;324&quot; height=&quot;113&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;In die Falle stolpern Sie dann, wenn Sie eine Transformation einer NAV Installation der Version 4 durchführen. In der Version 4 wurden nämlich noch die&lt;strong&gt; Bitmaps 16 und 4&lt;/strong&gt; zum Aufklappen und Zusammenklappen verwendet:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog081911-2.png&quot; width=&quot;324&quot; height=&quot;109&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Fazit: Ohne die Bitmaps zu ändern, werden Sie das Transformation Tool nicht dazu bewegen, das „ShowAsTree“-Property korrekt zu setzen.&lt;/p&gt;</description>
			<pubDate>Fri, 19 Aug 2011 10:48:28 +0200</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-quellcode-des-transformation-tools-veroeffentlicht/</guid>
		</item>
		
		<item>
			<title>NAV 2009 – Copy &amp; Paste und böse Zeichen in Text- und Code-Feldern</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-copy-and-paste-und-boese-zeichen-in-text-und-code-feldern/</link>
			<description>&lt;p&gt;In den Zeiten zunehmender Beliebtheit von Copy &amp;amp; Paste möchte auch ich mich diesem Thema annehmen und auf ein Problem im Zusammenhang mit Dynamics NAV hinweisen.&lt;/p&gt;
&lt;p&gt;Machen wir ein Beispiel. Besuchen Sie unser Impressum (&lt;a href=&quot;http://www.comporsys.de/../../../../../impressum&quot;&gt;http://www.comporsys.de/impressum&lt;/a&gt;) und kopieren den Firmennamen „Comporsys Hansa GmbH“ (Namen markieren und dann Strg+C drücken). Danach starten Sie den NAV 2009 Classic Client, legen einen neuen Debitor an und fügen den gerade kopierten Inhalt ein (Strg+V). Das Ergebnis sieht wie folgt aus:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog081211-1.png&quot; width=&quot;477&quot; height=&quot;262&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Ich habe in der Abbildung oben extra den Namen markiert, damit das Problem offensichtlich wird. Beim Kopieren sind zwei nicht sichtbare Zeichen mit kopiert worden: Carriage Return (ASCII Code 13) und Line Feed (ASCII Code 10). Böse Zeichen.&lt;/p&gt;
&lt;p&gt;Wenn Sie diesen Zeichen nicht entfernen, haben Sie den Salat, sobald Sie zum Beispiel die Daten als Textdatei exportieren. Dann haben Sie unerwartete Zeilenumbrüche in der Textdatei. Das führt unter anderem beim GDPdU-Export zu Programmfehlern, die sehr schwer zu lokalisieren sind.&lt;/p&gt;
&lt;p&gt;Wie sieht die Lösung aus?&lt;/p&gt;
&lt;p&gt;In Codeunit 1 finden Sie eine Funktion „MakeText“. Diese Funktion wird vom NAV Client aufgerufen, wenn Sie Zeichen in einem Text-Feld eingeben. Und hier ist die richtige Stelle einzugreifen, um die bösen Zeichen aus dem Text zu entfernen. Dazu rufen wir unsere eigene Funktion „RemoveBadChars“ auf. Siehe unten.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog081211-2.png&quot; width=&quot;585&quot; height=&quot;361&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Der Quellcode der Funktion „RemoveBadChars“ sieht wie folgt aus. Neben den bereits genannten Zeichen Carriage Return und Line Feed entfernen wir auch noch das Tabulator-Zeichen.&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;PROCEDURE RemoveBadChars@1000000001(t@1000000000 : Text[250]) : Text[250];&lt;br/&gt;   VAR&lt;br/&gt;     Ch@1000000001 : Text[3];&lt;br/&gt;   BEGIN&lt;br/&gt;     Ch[1] := 9;   // TAB&lt;br/&gt;     Ch[2] := 10;  // LF&lt;br/&gt;     Ch[3] := 13;  // CR&lt;br/&gt;     EXIT(DELCHR(t, '=', Ch));&lt;br/&gt;   END;&lt;/div&gt;
&lt;p&gt;Und wie sieht die Lösung für Code-Felder aus? Eine Funktion „MakeCode“ gibt es in Codeunit 1 nicht. Sie können diese aber mit der ID 109 erstellen. Diese Funktion wird der NAV Client dann aufrufen.&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;PROCEDURE MakeCode@109(VAR CodeText@1000000000 : Text[250]) : Integer;&lt;br/&gt;   BEGIN&lt;br/&gt;     CodeText := RemoveBadChars(CodeText);&lt;br/&gt;     EXIT(0);&lt;br/&gt;   END;&lt;/div&gt;
&lt;p&gt;PS: Der NAV 2009 Role Tailored Client kennt das Problem der bösen Zeichen nicht.&lt;/p&gt;</description>
			<pubDate>Fri, 12 Aug 2011 09:57:02 +0200</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-copy-and-paste-und-boese-zeichen-in-text-und-code-feldern/</guid>
		</item>
		
		<item>
			<title>NAV 2009 – Unerwartetes Verhalten von Codeunit.RUN</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-unerwartetes-verhalten-von-codeunit-run/</link>
			<description>&lt;p&gt;Heute schreibt mein lieber Kollege Christian: In der Microsoft Dynamics NAV Dokumentation (C/SIDE Reference Guide) können Sie über die Funktion Codeunit.RUN nachlesen:&lt;/p&gt;
&lt;p&gt;[Ok :=] Codeunit.RUN(Number[, Record])&lt;/p&gt;
&lt;p&gt;&lt;em&gt;“…If you include the return value and an error occurs, the calling C/AL code continues to run. This means that you must handle any errors.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Das ist leider nur die halbe Wahrheit. Ein durch Rec.INSERT ausgelöster Fehler, bricht die Verarbeitung im Gegensatz zur Beschreibung ab und der aufrufende C/AL Code wird nicht weiter ausgeführt. Das können Sie mit dem folgenden Beispielcode nachstellen.&lt;/p&gt;
&lt;p&gt;Die Codeunit 50503 „Run Insert Demo Record“ simuliert den Aufruf…&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;OBJECT Codeunit 50503 Run Insert Demo Record&lt;br/&gt; {&lt;br/&gt;   OBJECT-PROPERTIES&lt;br/&gt;   {&lt;br/&gt;     Date=12.07.11;&lt;br/&gt;     Time=14:46:29;&lt;br/&gt;     Modified=Yes;&lt;br/&gt;     Version List=BLOG;&lt;br/&gt;   }&lt;br/&gt;   PROPERTIES&lt;br/&gt;   {&lt;br/&gt;    &amp;gt;&lt;br/&gt;             IsOk@1000000000 : Boolean;&lt;br/&gt;           BEGIN&lt;br/&gt;             IsOk := CODEUNIT.RUN(CODEUNIT::&quot;Insert Demo Record&quot;);&lt;br/&gt;             IF IsOk THEN BEGIN&lt;br/&gt;               MESSAGE('Ok');&lt;br/&gt;             END ELSE BEGIN&lt;br/&gt;               MESSAGE('Error: %1', GETLASTERRORTEXT);&lt;br/&gt;             END;&lt;br/&gt;           END;&lt;br/&gt;  &lt;br/&gt;   }&lt;br/&gt;   CODE&lt;br/&gt;   {&lt;br/&gt;  &lt;br/&gt;     BEGIN&lt;br/&gt;     END.&lt;br/&gt;   }&lt;br/&gt; }&lt;/div&gt;
&lt;p&gt;…von Codeunit 50502 „Insert Demo Record“, die einen Datensatz einfügt…&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;OBJECT Codeunit 50502 Insert Demo Record&lt;br/&gt; {&lt;br/&gt;   OBJECT-PROPERTIES&lt;br/&gt;   {&lt;br/&gt;     Date=12.07.11;&lt;br/&gt;     Time=14:46:37;&lt;br/&gt;     Modified=Yes;&lt;br/&gt;     Version List=BLOG;&lt;br/&gt;   }&lt;br/&gt;   PROPERTIES&lt;br/&gt;   {&lt;br/&gt;    &amp;gt;&lt;br/&gt;             Demo@1000000000 : Record 50500;&lt;br/&gt;           BEGIN&lt;br/&gt;             // ERROR('Hello World!');&lt;br/&gt;             Demo.INIT;&lt;br/&gt;             Demo.INSERT;&lt;br/&gt;           END;&lt;br/&gt;  &lt;br/&gt;   }&lt;br/&gt;   CODE&lt;br/&gt;   {&lt;br/&gt;  &lt;br/&gt;     BEGIN&lt;br/&gt;     END.&lt;br/&gt;   }&lt;br/&gt; }&lt;/div&gt;
&lt;p&gt;…in die Tabelle 50500 „Demo“.&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;OBJECT Table 50500 Demo&lt;br/&gt; {&lt;br/&gt;   OBJECT-PROPERTIES&lt;br/&gt;   {&lt;br/&gt;     Date=12.07.11;&lt;br/&gt;     Time=14:39:33;&lt;br/&gt;     Modified=Yes;&lt;br/&gt;     Version List=BLOG;&lt;br/&gt;   }&lt;br/&gt;   PROPERTIES&lt;br/&gt;   {&lt;br/&gt;   }&lt;br/&gt;   FIELDS&lt;br/&gt;   {&lt;br/&gt;     { 1   ;   ;Entry No.           ;Integer        }&lt;br/&gt;   }&lt;br/&gt;   KEYS&lt;br/&gt;   {&lt;br/&gt;     {    ;Entry No.                               ;Clustered=Yes }&lt;br/&gt;   }&lt;br/&gt;   FIELDGROUPS&lt;br/&gt;   {&lt;br/&gt;   }&lt;br/&gt;   CODE&lt;br/&gt;   {&lt;br/&gt;  &lt;br/&gt;     BEGIN&lt;br/&gt;     END.&lt;br/&gt;   }&lt;br/&gt; }&lt;/div&gt;
&lt;p&gt;Den Quellcode finden Sie auch hier zum &lt;a href=&quot;http://www.comporsys.de/assets/blog/Codeunit.RUN.txt&quot; target=&quot;_blank&quot;&gt;Download&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Wenn Sie die Codeunit 50503 „Run Insert Demo Record“ zweimal aufrufen, erhalten Sie beim zweiten Aufruf die Fehlermeldung, dass der Datensatz bereits existiert. Das sollte einen nicht wundern. Wundern sollte einen, dass die Verarbeitung abgebrochen wird:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog07-2.png&quot; width=&quot;194&quot; height=&quot;157&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Das ist nicht das erwartete Verhalten. Das erwartete Verhalten können Sie simulieren, wenn Sie in der Codeunit 50502 „Insert Demo Record“ die Kommentarzeile mit dem „Hello World!“-Error ein kommentieren. Dann bekommen Sie die folgende Mitteilung:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog07-3.png&quot; width=&quot;162&quot; height=&quot;129&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Weitere Nachforschungen haben folgendes ergeben:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Von diesem Verhalten sind zumindest die Versionen NAV 2009 SP1 und R2 betroffen. Ältere Versionen haben wir nicht getestet. &lt;/li&gt;
&lt;li&gt;Es scheint nur ein Problem von Rec.INSERT zu sein. Fehler durch ERROR oder auch Rec.MODIFY oder Rec.DELETE verhalten sich wie erwartet. &lt;/li&gt;
&lt;li&gt;Nur der NAV Client für den SQL Server ist betroffen. Der vom Aussterben bedrohte NAV Client „fin.exe“ verhält sich wie erwartet. &lt;/li&gt;
&lt;/ul&gt;</description>
			<pubDate>Mon, 18 Jul 2011 12:21:20 +0200</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-unerwartetes-verhalten-von-codeunit-run/</guid>
		</item>
		
		<item>
			<title>NAV 2009 – Notizen und Benachrichtigungen an Active Directory Gruppen</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-notizen-und-benachrichtigungen-an-active-directory-gruppen/</link>
			<description>&lt;p&gt;Mit dem NAV 2009 Role Tailored Client hat Microsoft die Notizen erfunden, die man an jeden beliebigen Datensatz hängen kann, und gleichzeitig die Möglichkeit geschaffen, andere Benutzer über die angehängte Notiz zu benachrichtigen.&lt;/p&gt;
&lt;p&gt;Dabei werden bei der Auswahl des Benachrichtigungsempfängers die eingerichteten Windows Anmeldungen angezeigt. Sowohl die Active Directory Benutzer (z.B. der Administrator) als auch die Active Directory Gruppen (z.B. das Dynamics NAV Team), wie die folgende Abbildung zeigt:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog07-1.png&quot; width=&quot;185&quot; height=&quot;266&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Unglücklicherweise verschwinden Benachrichtigungen an Active Directory Gruppen im Nirwana und werden nicht den Gruppenmitgliedern zugestellt.&lt;/p&gt;
&lt;p&gt;Diese Einschränkung wollte ich durch eine kleine Umbaumaßnahme beseitigen und bin dabei zunächst auf ein anderes Problem gestoßen, dass ich in meinem letzten Artikel dokumentiert habe: &lt;a href=&quot;http://www.comporsys.de/dynamics-nav-blog/nav-2009-interner-fehler-12-in-modul-40/&quot;&gt;NAV 2009 – Interner Fehler 12 in Modul 40&lt;/a&gt;. Mit Hilfe der dort entwickelten .NET Assembly ist der Rest allerdings ein Kinderspiel.&lt;/p&gt;
&lt;p&gt;Die Notizen werden in der Tabelle 2000000068 Record Link gespeichert. Wir müssen daher nur das OnInsert-Ereignis dieser Tabelle so erweitern, dass Record Links für alle Mitglieder der gewählten Active Directory Gruppe generiert werden.&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;OnInsert-Trigger&lt;br/&gt; RecordLink    Record Record Link &lt;br/&gt; Search        DotNet 'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.Search&lt;br/&gt; List          DotNet 'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsGroupMemberList&lt;br/&gt; Member        DotNet 'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsGroupMember&lt;br/&gt; WinObj        DotNet 'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsObject&lt;br/&gt; i             Integer&lt;br/&gt;  &lt;br/&gt; // --- 001&lt;br/&gt; IF NOT Notify THEN BEGIN&lt;br/&gt;   EXIT;&lt;br/&gt; END;&lt;br/&gt;  &lt;br/&gt; Search := Search.Search('comporsys-hansa');  // ToDo: Servername sollte konfigurierbar sein&lt;br/&gt; WinObj := Search.FindUserOrGroup(&quot;To User ID&quot;);&lt;br/&gt; IF WinObj.Type = 'user' THEN BEGIN&lt;br/&gt;   EXIT;&lt;br/&gt; END;&lt;br/&gt;  &lt;br/&gt; List := Search.FindGroupMember(&quot;To User ID&quot;);&lt;br/&gt; FOR i := 0 TO List.Count - 1 DO BEGIN&lt;br/&gt;   Member := List.Item(i);&lt;br/&gt;   CLEAR(RecordLink);&lt;br/&gt;   RecordLink.COPY(Rec);&lt;br/&gt;   RecordLink.&quot;To User ID&quot; := Member.MemberId;&lt;br/&gt;   RecordLink.INSERT;&lt;br/&gt; END;&lt;br/&gt; // +++ 001&lt;/div&gt;
&lt;p&gt;Hierzu nur noch folgende Anmerkungen:&lt;/p&gt;
&lt;p&gt;1) Der Primärschlüssel „Link ID“ der Tabelle Record Link ist auf „AutoIncrement“ gesetzt und muss bzw. darf daher nicht manuell gesetzt werden.&lt;br/&gt;2) Die Methode COPY() des Record-Datentyps kopiert auch den Inhalt der BLOB-Spalte „Note“ um.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div id=&quot;_mcePaste&quot; style=&quot;position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;&quot;&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:WordDocument&gt; &lt;w:View&gt;Normal&lt;/w:View&gt; &lt;w:Zoom&gt;0&lt;/w:Zoom&gt; &lt;w:TrackMoves /&gt; &lt;w:TrackFormatting /&gt; &lt;w:HyphenationZone&gt;21&lt;/w:HyphenationZone&gt; &lt;w:PunctuationKerning /&gt; &lt;w:ValidateAgainstSchemas /&gt; &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt; &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt; &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt; &lt;w:DoNotPromoteQF /&gt; &lt;w:LidThemeOther&gt;DE&lt;/w:LidThemeOther&gt; &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt; &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt; &lt;w:Compatibility&gt; &lt;w:BreakWrappedTables /&gt; &lt;w:SnapToGridInCell /&gt; &lt;w:WrapTextWithPunct /&gt; &lt;w:UseAsianBreakRules /&gt; &lt;w:DontGrowAutofit /&gt; &lt;w:SplitPgBreakAndParaMark /&gt; &lt;w:DontVertAlignCellWithSp /&gt; &lt;w:DontBreakConstrainedForcedTables /&gt; &lt;w:DontVertAlignInTxbx /&gt; &lt;w:Word11KerningPairs /&gt; &lt;w:CachedColBalance /&gt; &lt;/w:Compatibility&gt; &lt;m:mathPr&gt; &lt;m:mathFont m:val=&quot;Cambria Math&quot; /&gt; &lt;m:brkBin m:val=&quot;before&quot; /&gt; &lt;m:brkBinSub m:val=&quot;&amp;#45;-&quot; /&gt; &lt;m:smallFrac m:val=&quot;off&quot; /&gt; &lt;m:dispDef /&gt; &lt;m:lMargin m:val=&quot;0&quot; /&gt; &lt;m:rMargin m:val=&quot;0&quot; /&gt; &lt;m:defJc m:val=&quot;centerGroup&quot; /&gt; &lt;m:wrapIndent m:val=&quot;1440&quot; /&gt; &lt;m:intLim m:val=&quot;subSup&quot; /&gt; &lt;m:naryLim m:val=&quot;undOvr&quot; /&gt; &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:LatentStyles DefLockedState=&quot;false&quot; DefUnhideWhenUsed=&quot;true&quot;   DefSemiHidden=&quot;true&quot; DefQFormat=&quot;false&quot; DefPriority=&quot;99&quot;   LatentStyleCount=&quot;267&quot;&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;0&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Normal&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;heading 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 7&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 8&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 9&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 7&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 8&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 9&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;35&quot; QFormat=&quot;true&quot; Name=&quot;caption&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;10&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Title&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; Name=&quot;Default Paragraph Font&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;11&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtitle&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;22&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Strong&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;20&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Emphasis&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;59&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Table Grid&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Placeholder Text&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;No Spacing&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Revision&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;34&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;List Paragraph&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;29&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Quote&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;30&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Quote&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;19&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Emphasis&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;21&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Emphasis&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;31&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Reference&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;32&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Reference&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;33&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Book Title&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;37&quot; Name=&quot;Bibliography&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; QFormat=&quot;true&quot; Name=&quot;TOC Heading&quot; /&gt; &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt; &lt;mce:style&gt;&lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:&quot;Normale Tabelle&quot;; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin-top:0cm; 	mso-para-margin-right:0cm; 	mso-para-margin-bottom:10.0pt; 	mso-para-margin-left:0cm; 	line-height:115%; 	mso-pagination:widow-orphan; 	font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:&quot;Times New Roman&quot;; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi;} --&gt;
&lt;div style=&quot;mso-element:para-border-div;border:solid windowtext 1.0pt; mso-border-alt:solid windowtext .5pt;padding:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;OnInsert-Trigger&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;tab-stops:70.9pt;border:none;mso-border-alt:solid windowtext .5pt; padding:0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size:8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language: EN-US&quot;&gt;RecordLink&lt;span style=&quot;mso-tab-count:1&quot;&gt;    &lt;/span&gt;Record&lt;span style=&quot;mso-tab-count:1&quot;&gt; &lt;/span&gt;Record Link&lt;span style=&quot;mso-tab-count:1&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;tab-stops:70.9pt;border:none;mso-border-alt:solid windowtext .5pt; padding:0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size:8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language: EN-US&quot;&gt;Search&lt;span style=&quot;mso-tab-count:1&quot;&gt;        &lt;/span&gt;DotNet&lt;span style=&quot;mso-tab-count:1&quot;&gt; &lt;/span&gt;'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.Search&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;tab-stops:70.9pt;border:none;mso-border-alt:solid windowtext .5pt; padding:0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size:8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language: EN-US&quot;&gt;List&lt;span style=&quot;mso-tab-count:1&quot;&gt;          &lt;/span&gt;DotNet&lt;span style=&quot;mso-tab-count:1&quot;&gt; &lt;/span&gt;'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsGroupMemberList&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;tab-stops:70.9pt;border:none;mso-border-alt:solid windowtext .5pt; padding:0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size:8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language: EN-US&quot;&gt;Member&lt;span style=&quot;mso-tab-count:1&quot;&gt;        &lt;/span&gt;DotNet&lt;span style=&quot;mso-tab-count:1&quot;&gt; &lt;/span&gt;'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsGroupMember&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;tab-stops:70.9pt;border:none;mso-border-alt:solid windowtext .5pt; padding:0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size:8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language: EN-US&quot;&gt;WinObj&lt;span style=&quot;mso-tab-count:1&quot;&gt;        &lt;/span&gt;DotNet&lt;span style=&quot;mso-tab-count:1&quot;&gt; &lt;/span&gt;'Comporsys.LdapSearch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=bdf4f6702c4e909e'.Comporsys.LdapSearch.WindowsObject&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;tab-stops:70.9pt;border:none;mso-border-alt:solid windowtext .5pt; padding:0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size:8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language: EN-US&quot;&gt;i&lt;span style=&quot;mso-tab-count:1&quot;&gt;             &lt;/span&gt;Integer&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;// --- 001&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;IF NOT Notify THEN BEGIN&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;  &lt;/span&gt;EXIT;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;END;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;Search := Search.Search('comporsys-hansa');&lt;span style=&quot;mso-spacerun:yes&quot;&gt;  &lt;/span&gt;// ToDo: Servername sollte konfigurierbar sein&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;WinObj := Search.FindUserOrGroup(&quot;To User ID&quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;IF WinObj.Type = 'user' THEN BEGIN&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;  &lt;/span&gt;EXIT;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;END;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;List := Search.FindGroupMember(&quot;To User ID&quot;);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;FOR i := 0 TO List.Count - 1 DO BEGIN&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;  &lt;/span&gt;Member := List.Item(i);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;  &lt;/span&gt;CLEAR(RecordLink);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;  &lt;/span&gt;RecordLink.COPY(Rec);&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;  &lt;/span&gt;RecordLink.&quot;To User ID&quot; := Member.MemberId;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size: 8.0pt;line-height:115%;font-family:&amp;quot;Courier New&amp;quot;;mso-ansi-language:EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun:yes&quot;&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size:8.0pt; line-height:115%;font-family:&amp;quot;Courier New&amp;quot;&quot;&gt;RecordLink.INSERT;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size:8.0pt; line-height:115%;font-family:&amp;quot;Courier New&amp;quot;&quot;&gt;END;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom:0cm;margin-bottom:.0001pt; mso-add-space:auto;border:none;mso-border-alt:solid windowtext .5pt;padding: 0cm;mso-padding-alt:1.0pt 4.0pt 1.0pt 4.0pt&quot;&gt;&lt;span style=&quot;font-size:8.0pt; line-height:115%;font-family:&amp;quot;Courier New&amp;quot;&quot;&gt;// +++ 001&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
			<pubDate>Mon, 11 Jul 2011 20:27:09 +0200</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-notizen-und-benachrichtigungen-an-active-directory-gruppen/</guid>
		</item>
		
		<item>
			<title>NAV 2009 – Interner Fehler 12 in Modul 40</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-interner-fehler-12-in-modul-40/</link>
			<description>&lt;p&gt;Am Sonntagvormittag befasste ich mich mit einer doch gefühlt einfachen Aufgabe: Zu ermitteln, welche Benutzer Mitglied einer Active Directory Gruppe sind, kann nicht schwierig sein. Dynamics NAV kennt dafür eine virtuelle Tabelle „Windows Group Member“ (2000000052). Erstellen Sie ein Formular für diese Tabelle und Sie können sich die Mitglieder einer Gruppe anzeigen lassen:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog061911-1.png&quot; width=&quot;419&quot; height=&quot;172&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Wenn Sie auf Basis dieser Tabelle eine List-Page für den Role Tailored Client erstellen und diese starten, bekommen Sie die Fehlermeldung „Interner Fehler 12 in Modul 40“:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog061911-2.png&quot; width=&quot;303&quot; height=&quot;157&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Das Problem ist gar nicht so sehr die Page, wie weitere Tests gezeigt haben, sondern die Tatsache, dass Sie über den Role Tailored Client zwar ein Rec.FIND (Rec.FINDFIRST, Rec.FINDLAST oder Rec.FINDSET) auf diese Tabelle ausführen können, aber ein Rec.NEXT die Fehlermeldung auslöst. Und der Rec.FIND funktioniert auch nur dann, wenn kein Filter gesetzt ist. Weitere virtuelle Tabellen wie z.B. „Windows Object“ (2000000050) sind ebenfalls von diesem Fehler betroffen.&lt;/p&gt;
&lt;p&gt;Eingeleitete Sofortmaßnahmen:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Eine Aktualisierung auf den letzten Hotfix für Dynamics NAV 2009 R2 (Build 32441) hat keine Besserung gebracht.&lt;/li&gt;
&lt;li&gt;Sich an den Systemadministrator zu wenden, wie in der Fehlermeldung empfohlen, wird wohl auch keine Hilfe bringen.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Und so langsam dämmert es mir, dass die Lösung der vermeintlich einfachen Aufgabe, die Mitglieder einer Active Directory Gruppe anzuzeigen, wohl doch mehr Zeit als nur den Vormittag in Anspruch nehmen wird.&lt;/p&gt;
&lt;p&gt;Wie sieht die Lösung aus? Der Zugriff auf einen Verzeichnisdienst wie Active Directory erfolgt über LDAP (Lightweight Directory Access Protocol). Eine sehr gute Einführung in dieses Thema finden Sie hier: &lt;a href=&quot;http://www.selfadsi.de/&quot;&gt;http://www.selfadsi.de&lt;/a&gt;. Auf weitere Erläuterungen zu LDAP verzichte ich daher. Die Idee ist also, eine .NET Assembly zu erfinden, die den Zugriff auf das Active Directory über LDAP implementiert und uns die benötigten Daten liefert, um die Tabelle „Windows Group Member“ zu füllen, zumindest temporär. Den ganzen Quellcode möchte ich hier aus Platzgründen nicht abdrucken. &lt;a href=&quot;http://www.comporsys.de/assets/blog/LdapSearchDemo.zip&quot; target=&quot;_blank&quot;&gt;Das vollständige Visual Studio 2008 Projekt finden Sie daher hier zum Download&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bitte denken Sie daran, für die Installation der .NET Assembly die Datei „Comporsys.LdapSearch.dll“ sowohl in das „Add-Ins“ Verzeichnis des Classic Clients als auch des Servers zu kopieren.&lt;/p&gt;
&lt;p&gt;Mit den Klassen der .NET Assembly können Sie anschließend die folgende &lt;a href=&quot;http://www.comporsys.de/assets/blog/Page50503.txt&quot; target=&quot;_blank&quot;&gt;List-Page 50503&lt;/a&gt; aufbauen. Die Funktion „Fill()“ füllt dabei die virtuelle Tabelle „Windows Group Member“, die wir temporär für &lt;a href=&quot;http://www.comporsys.de/assets/blog/Page50503.txt&quot; target=&quot;_blank&quot;&gt;diese Page&lt;/a&gt; verwenden.&lt;/p&gt;
&lt;p&gt;Starten Sie die Page und Sie erhalten das gewünschte Ergebnis:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog061911-3.png&quot; width=&quot;431&quot; height=&quot;272&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Für die Leser, die sich fragen sollten, wozu ich diese Funktionalität überhaupt benötige: Fortsetzung folgt in meinem nächsten Artikel.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
			<pubDate>Sun, 19 Jun 2011 17:54:59 +0200</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-interner-fehler-12-in-modul-40/</guid>
		</item>
		
		<item>
			<title>NAV 2009 Form Transformation – Wo sind die deutschen (DEU) Captions hin?</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-form-transformation-wo-sind-die-deutschen-deu-captions-hin/</link>
			<description>&lt;p&gt;Sicherlich haben Sie bereits mit dem Form Transformation Tool für Dynamics NAV 2009 gearbeitet, um aus einem Form-Objekt ein Page-Objekt zu generieren. Dabei wird Ihnen aufgefallen sein, dass bei der Umwandlung eines Form-Objektes des Standards, die deutschen (DEU) Captions der Actions in der Action Pane und der Command Bar teilweise flöten gehen. Das Beispiel unten zeigt dieses Problem beispielhaft für die Sachkontokarte (Form ID 17) nach ihrer Transformation:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage600351-blog-240511-1.png&quot; width=&quot;600&quot; height=&quot;351&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Woran liegt das? Das Form Transformation Tool von Dynamics NAV 2009 liefert schlicht und ergreifend keine deutschen (DEU) Captions mit. Und damit bekommen alle Actions, die im Rahmen der Transformation zusätzlich einer Karte oder Übersicht hinzugefügt werden, nur englische (ENU) Captions. Schade. Siehe Abbildung unten:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage600222-blog-240511-2.png&quot; width=&quot;600&quot; height=&quot;222&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Wenn Sie sich jetzt fragen sollten, wie denn wohl die deutschen (DEU) Captions ihren Weg auf die Page-Objekte gefunden haben (immerhin ist die Demo-Datenbank CRONUS AG ja vollständig übersetzt): Offensichtlich wurden bei der Lokalisierung von Dynamics NAV 2009 die Page-Objekte lokalisiert und nicht die Transformationsregeln des Form Transformation Tools. Sehr schade.&lt;/p&gt;
&lt;p&gt;Die Lösung. Eine Stapelverarbeitung holt die Übersetzung nach. Dazu werden die Captions von den Objekten geholt und als zusätzliche CaptionML auf den Page Actions hinterlegt.&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;Stapelverarbeitung Report &amp;amp;nbsp;50007 Fill Page Action - CaptionML&quot; href=&quot;http://www.comporsys.de/assets/blog/report50007.txt&quot; target=&quot;_blank&quot;&gt;Stapelverarbeitung Report  50007 Fill Page Action - CaptionML&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Wenn Sie die Stapelverarbeitung ausführen, werden die fehlenden deutschen (DEU) Captions eingetragen, wie die Abbildung unten zeigt:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage600222-blog-240511-3.png&quot; width=&quot;600&quot; height=&quot;222&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Und nach erneuter Transformation sieht auch unsere Sachkontokarte wieder so aus wie sie aussehen soll:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/_resampled/resizedimage600351-blog-240511-4.png&quot; width=&quot;600&quot; height=&quot;351&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS: Vielen Dank an Silas für die Programmierung der Stapelverarbeitung.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
			<pubDate>Tue, 24 May 2011 09:21:19 +0200</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-form-transformation-wo-sind-die-deutschen-deu-captions-hin/</guid>
		</item>
		
		<item>
			<title>NAV 2009 und die Frage, warum die Anzahl der Inforegister PAGE.RUNMODAL beeinflusst</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-und-die-frage-warum-die-anzahl-der-inforegister-page-runmodal-beeinflusst/</link>
			<description>&lt;p&gt;Heute habe ich mich über einen Bug in NAV 2009 R2 geärgert, den ich an dieser Stelle nicht undokumentiert lassen möchte. Der Aufruf einer einfachen Card Page mit PAGE.RUNMODAL hat mich fast an den Rand der Verzweiflung gebracht.&lt;/p&gt;
&lt;p&gt;Für das folgende Beispiel habe ich die Tabelle „Country/Region“ genommen und eine schlichte Card Page „Country Card Sample 1“ gebaut:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog041711-1.png&quot; width=&quot;570&quot; height=&quot;181&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Wenn Sie diese Page mit PAGE.RUN(PAGE::“Country Card Sample 1“) starten, wird es niemanden überraschen, dass das Ergebnis wie folgt aussieht:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog041711-2.png&quot; width=&quot;408&quot; height=&quot;207&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Starten Sie die gleiche Page mit PAGE.RUN&lt;strong&gt;MODAL&lt;/strong&gt;(PAGE::“Country Card Sample 1“) sollte man sich nicht über das automatische Auftauchen der Schaltflächen „Ok“ und „Abbrechen“ wundern. Das ist ja die Idee von „RUNMODAL“. Wundern sollte man sich aber über das Verschwinden des Inforegisters „Allgemein“:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog041711-3.png&quot; width=&quot;408&quot; height=&quot;171&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Wohin ist das Inforegister verschwunden? Man weiß es nicht. Nach der Verschwendung von einigen Stunden Lebenszeit kam mir die Idee, ob das Verschwinden nicht etwas mit der Anzahl der Inforegister zu tun hat. Und tatsächlich. Wenn Sie ein zweites Inforegister „Details“ einbauen, bleiben die Inforegister auch bei einem Aufruf mit PAGE.RUNMODAL erhalten. Siehe dazu das zweite Beispiel „Country Card Sample 2“:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog041711-4.png&quot; width=&quot;570&quot; height=&quot;198&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Aufruf mit PAGE.RUN&lt;strong&gt;MODAL&lt;/strong&gt;(PAGE::“Country Card Sample 2“). Alles in Ordnung:&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog041711-5.png&quot; width=&quot;385&quot; height=&quot;218&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Fazit. Es gibt Diebe, die nicht bestraft werden und dem Menschen doch das Kostbarste stehlen: Die Zeit. (Napoleon Bonaparte, 1769 &lt;/em&gt;–&lt;em&gt; 1821)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;br/&gt;&lt;/em&gt;&lt;/p&gt;</description>
			<pubDate>Mon, 18 Apr 2011 21:09:35 +0200</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-und-die-frage-warum-die-anzahl-der-inforegister-page-runmodal-beeinflusst/</guid>
		</item>
		
		<item>
			<title>NAV 2009 Web Services und das Geheimnis der Extension Codeunits</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/nav-2009-web-services-und-das-geheimnis-der-extension-codeunits/</link>
			<description>&lt;p&gt;Wenn Sie einen Web Service auf Basis einer Page veröffentlichen, bekommen Sie einen Standardsatz an Methoden zum Lesen und Schreiben des „SourceTable“ der Page.&lt;/p&gt;
&lt;p&gt;Wenn Sie diesen Standardsatz um eigene Methoden ergänzen wollen, müssen Sie eine so genannte Extension Codeunit implementieren. Dabei gelten die folgenden Regeln:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Eine Extension Codeunit muss unter dem gleichen Servicenamen wie der Page-basierende Web Service in der Liste der Web Services eingetragen werden.&lt;/li&gt;
&lt;li&gt;Das Attribut „Veröffentlicht“ muss für die Extension Codeunit nicht gesetzt sein.&lt;/li&gt;
&lt;li&gt;Nur Funktionen deren erster Parameter vom Typ des „SourceTable“ des Page-Objektes ist, werden als Web Service Methoden veröffentlicht. &lt;/li&gt;
&lt;/ul&gt;&lt;p&gt; Das folgende Beispiel soll die Verwendung veranschaulichen. Wir veröffentlichen einen Web Service zum Lesen unserer gebuchten Rechnungen. Damit es übersichtlich bleibt, nur mit einer minimalen Anzahl von Feldern.&lt;/p&gt;
&lt;p&gt;1. Los geht es mit der Page für den Sales Invoice Header. Beachten Sie bitte, dass ich bei den Namen die Sonderzeichen (Punkte und Leerzeichen) entfernt habe. Das ist nicht zwingend notwendig, da Sonderzeichen automatisch durch Unterstriche ersetzt werden. Mir gefallen nur die Unterstriche nicht.&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;OBJECT Page 50500 Sales Invoice Service&lt;br/&gt; {&lt;br/&gt;   OBJECT-PROPERTIES&lt;br/&gt;   {&lt;br/&gt;     Date=05.03.11;&lt;br/&gt;     Time=12:00:00;&lt;br/&gt;     Modified=Yes;&lt;br/&gt;     Version List=;&lt;br/&gt;   }&lt;br/&gt;   PROPERTIES&lt;br/&gt;   {&lt;br/&gt;     Editable=No;&lt;br/&gt;     SourceTable=Table112;&lt;br/&gt;     PageType=List;&lt;br/&gt;   }&lt;br/&gt;   CONTROLS&lt;br/&gt;   {&lt;br/&gt;     { 1000000000;0;Container;&lt;br/&gt;                 ContainerType=ContentArea }&lt;br/&gt;  &lt;br/&gt;     { 1000000001;1;Group  ;&lt;br/&gt;                 Name=Group;&lt;br/&gt;                 GroupType=Repeater }&lt;br/&gt;  &lt;br/&gt;     { 1000000002;2;Field  ;&lt;br/&gt;                 Name=No;&lt;br/&gt;                 SourceExpr=&quot;No.&quot; }&lt;br/&gt;  &lt;br/&gt;     { 1000000003;2;Field  ;&lt;br/&gt;                 Name=SellToName;&lt;br/&gt;                 SourceExpr=&quot;Sell-to Customer Name&quot; }&lt;br/&gt;  &lt;br/&gt;   }&lt;br/&gt;   CODE&lt;br/&gt;   {&lt;br/&gt;  &lt;br/&gt;     BEGIN&lt;br/&gt;     END.&lt;br/&gt;   }&lt;br/&gt; }&lt;/div&gt;
&lt;p&gt;2. Als nächstes brauchen wir einen XmlPort, um die Sales Invoice Lines liefern zu können. Beachten Sie bitte, dass die Angabe des „DefaultNamespace“ zwingend notwendig ist.&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;OBJECT XMLport 50500 Sales Invoice Lines&lt;br/&gt; {&lt;br/&gt;   OBJECT-PROPERTIES&lt;br/&gt;   {&lt;br/&gt;     Date=05.03.11;&lt;br/&gt;     Time=12:00:00;&lt;br/&gt;     Modified=Yes;&lt;br/&gt;     Version List=;&lt;br/&gt;   }&lt;br/&gt;   PROPERTIES&lt;br/&gt;   {&lt;br/&gt;     Format/Evaluate=XML Format/Evaluate;&lt;br/&gt;     DefaultNamespace=urn:microsoft-dynamics-nav/xmlports/SalesInvoiceLines;&lt;br/&gt;     UseDefaultNamespace=Yes;&lt;br/&gt;   }&lt;br/&gt;   ELEMENTS&lt;br/&gt;   {&lt;br/&gt;     { [{230B615F-189A-450A-88CD-444BFF23CD57}];  ;SalesInvoiceLines   ;Element ;Text    ;&lt;br/&gt;                                                   VariableName=SalesInvoiceLines }&lt;br/&gt;  &lt;br/&gt;     { [{C89F38A1-E7AF-475F-AE8F-8C6E1C96E0AE}];1 ;SalesInvoiceLine    ;Element ;Table   ;&lt;br/&gt;                                                   VariableName=SalesInvoiceLine;&lt;br/&gt;                                                   SourceTable=Table113 }&lt;br/&gt;  &lt;br/&gt;     { [{D36EF3F5-FA9F-42B0-BD9B-CACB89CC9899}];2 ;DocumentNo          ;Element ;Field   ;&lt;br/&gt;                                                   DataType=Code;&lt;br/&gt;                                                   SourceField=SalesInvoiceLine::Document No. }&lt;br/&gt;  &lt;br/&gt;     { [{8859EBB5-7732-4F35-B6B3-AA53C464EEB5}];2 ;LineNo              ;Element ;Field   ;&lt;br/&gt;                                                   DataType=Integer;&lt;br/&gt;                                                   SourceField=SalesInvoiceLine::Line No. }&lt;br/&gt;   }&lt;br/&gt;   EVENTS&lt;br/&gt;   {&lt;br/&gt;   }&lt;br/&gt;   REQUESTPAGE&lt;br/&gt;   {&lt;br/&gt;     PROPERTIES&lt;br/&gt;     {&lt;br/&gt;     }&lt;br/&gt;     CONTROLS&lt;br/&gt;     {&lt;br/&gt;     }&lt;br/&gt;   }&lt;br/&gt;   CODE&lt;br/&gt;   {&lt;br/&gt;     BEGIN&lt;br/&gt;     END.&lt;br/&gt;   }&lt;br/&gt; }&lt;/div&gt;
&lt;p&gt;3. Und nun können wir die Extension Codeunit bauen. Da bei der Veröffentlichung der Funktion „GetLines()“ als Web Service Methode der erste Parameter zum „Key“ wird, habe ich ihn auch so benannt. Auch wenn das für eine Variable vom Typ „Record“ ungewöhnlich klingen mag. Weitere „Record“-Variablen als Parameter sind nicht zulässig. Daher verwenden wir einen XmlPort, um die Rechnungszeilen zu liefern.&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;OBJECT Codeunit 50500 Sales Invoice Service&lt;br/&gt; {&lt;br/&gt;   OBJECT-PROPERTIES&lt;br/&gt;   {&lt;br/&gt;     Date=05.03.11;&lt;br/&gt;     Time=12:00:00;&lt;br/&gt;     Modified=Yes;&lt;br/&gt;     Version List=;&lt;br/&gt;   }&lt;br/&gt;   PROPERTIES&lt;br/&gt;   {&lt;br/&gt;    &amp;gt;&lt;br/&gt;           END;&lt;br/&gt;   }&lt;br/&gt;   CODE&lt;br/&gt;   {&lt;br/&gt;  &lt;br/&gt;     PROCEDURE GetLines@1000000000(Key@1000000000 : Record 112;VAR SalesInvoiceLines@1000000001 : XMLport 50500);&lt;br/&gt;     VAR&lt;br/&gt;       SalesInvoiceLine@1000000002 : Record 113;&lt;br/&gt;     BEGIN&lt;br/&gt;       SalesInvoiceLine.SETRANGE(&quot;Document No.&quot;, Key.&quot;No.&quot;);&lt;br/&gt;       SalesInvoiceLines.SETTABLEVIEW(SalesInvoiceLine);&lt;br/&gt;     END;&lt;br/&gt;  &lt;br/&gt;     BEGIN&lt;br/&gt;     END.&lt;br/&gt;   }&lt;br/&gt; }&lt;/div&gt;
&lt;p&gt;4. Wir schreiten zur Veröffentlichung.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog3.png&quot; width=&quot;428&quot; height=&quot;264&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;5. Kontrollieren die Veröffentlichung im Visual Studio 2008.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog4.png&quot; width=&quot;530&quot; height=&quot;373&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;6. Und schreiben uns ein kleines VisualBasic.NET Programm zum Testen. Die Rechnung „103007“ sollte es in jeder CRONUS AG geben.&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;Module Application&lt;br/&gt;  &lt;br/&gt;     Sub Main()&lt;br/&gt;  &lt;br/&gt;         Dim ws As SalesInvoiceServiceNAV.SalesInvoice_Service = Nothing&lt;br/&gt;  &lt;br/&gt;         Try&lt;br/&gt;             ws = New SalesInvoiceServiceNAV.SalesInvoice_Service&lt;br/&gt;             ws.UseDefaultCredentials = True&lt;br/&gt;             ws.Url = &quot;http://spiderman:7047/DynamicsNAV/WS/CRONUS AG/Page/SalesInvoice&quot;&lt;br/&gt;  &lt;br/&gt;             Dim invoice As SalesInvoiceServiceNAV.SalesInvoice&lt;br/&gt;             invoice = ws.Read(&quot;103007&quot;)&lt;br/&gt;  &lt;br/&gt;             If Not invoice Is Nothing Then&lt;br/&gt;  &lt;br/&gt;                 Console.WriteLine(&quot;Rechnung &quot; &amp;amp; invoice.No &amp;amp; &quot; an &quot; &amp;amp; invoice.SellToName)&lt;br/&gt;  &lt;br/&gt;                 Dim lines As New SalesInvoiceServiceNAV.SalesInvoiceLines&lt;br/&gt;                 ws.GetLines(invoice.Key, lines)&lt;br/&gt;  &lt;br/&gt;                 For i As Integer = 0 To lines.SalesInvoiceLine.Length - 1&lt;br/&gt;                     Dim line As SalesInvoiceServiceNAV.SalesInvoiceLine&lt;br/&gt;                     line = lines.SalesInvoiceLine(i)&lt;br/&gt;                     Console.WriteLine(&quot;Rechnung &quot; &amp;amp; line.DocumentNo &amp;amp; &quot; Zeile &quot; &amp;amp; line.LineNo)&lt;br/&gt;                 Next&lt;br/&gt;  &lt;br/&gt;             End If&lt;br/&gt;  &lt;br/&gt;         Catch ex As Exception&lt;br/&gt;             Throw&lt;br/&gt;         Finally&lt;br/&gt;             If Not ws Is Nothing Then&lt;br/&gt;                 ws.Dispose()&lt;br/&gt;             End If&lt;br/&gt;         End Try&lt;br/&gt;  &lt;br/&gt;         Console.ReadKey()&lt;br/&gt;  &lt;br/&gt;     End Sub&lt;br/&gt;  &lt;br/&gt; End Module&lt;/div&gt;
&lt;p&gt;7. Ich habe fertig.&lt;/p&gt;</description>
			<pubDate>Fri, 04 Mar 2011 12:52:29 +0100</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/nav-2009-web-services-und-das-geheimnis-der-extension-codeunits/</guid>
		</item>
		
		<item>
			<title>Der NAV-Client zeigt in der Übersicht der aktiven Sessions nur die eigene Session an</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/der-nav-client-zeigt-in-der-uebersicht-der-aktiven-sessions-nur-die-eigene-session-an/</link>
			<description>&lt;p&gt;Kennen Sie in Microsoft Dynamics NAV 2009 SP1 und NAV 2009 R2 das Phänomen, dass die Datenbankinformationen als aktive Sessions nur die eigene Session anzeigen und nicht mehr alle Sessions wie in früheren Versionen?&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.comporsys.de/assets/blog/blog2_9.png&quot; width=&quot;505&quot; height=&quot;291&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Damit alle Benutzer und nicht nur Benutzer mit der Systemrolle „sysadmin“ alle aktiven Sessions sehen, muss das Traceflag 4616 für den SQL Server gesetzt sein. Während NAV 2009 (ohne Servicepack) und ältere Versionen beim Start des NAV-Clients noch eine Fehlermeldung ausgeben, wenn das Traceflag nicht gesetzt ist, erscheint bei den Versionen NAV 2009 SP1 und NAV 2009 R2 keine Fehlermeldung mehr.&lt;/p&gt;
&lt;p&gt;Um dieses Verhalten zu verstehen, müssen wir zwei Dinge klären: Erstens, woher kommen die Informationen über die aktiven Sessions? Und zweitens, mit welchen Berechtigungen greift der NAV-Client darauf zu?&lt;/p&gt;
&lt;p&gt;Für die Anzeige der aktiven Sessions verwendet der NAV-Client die Sicht [dbo].[Session] in der NAV-Datenbank. Diese Sicht wiederum verwendet die Systemsicht [dbo].[sysprocesses] in der MASTER-Datenbank des SQL Servers, um die aktiven Sessions zu ermitteln.&lt;/p&gt;
&lt;p&gt;Für Zugriffe auf den SQL Server verwendet der NAV-Client eine Anwendungsrolle. Wenn Sie das Sicherheitsmodell „Standard“ für Ihre NAV-Datenbank eingestellt haben, lautet der Name der Anwendungsrolle [$ndo$shadow]. Diese wird für alle Benutzer verwendet.&lt;/p&gt;
&lt;p&gt;Und damit haben wir auch die Ursache unseres Problems ermittelt. Anwendungsrollen stellen ein potentielles Sicherheitsrisiko dar, da das Kennwort der Anwendungsrolle im NAV-Client steckt und damit theoretisch von cleveren Schurken ausgespäht werden kann. Der Zugriff auf Systemtabellen des SQL Servers ist daher für Anwendungsrollen verboten bzw. eingeschränkt.&lt;/p&gt;
&lt;p&gt;Durch das Setzen von Traceflag 4616 machen Sie die Systemtabellen für Anwendungsrollen zugänglich. Siehe dazu die Dokumentation zum SQL Server unter &lt;a href=&quot;http://msdn.microsoft.com/de-de/library/ms188396.aspx&quot;&gt;http://msdn.microsoft.com/de-de/library/ms188396.aspx&lt;/a&gt;. Wie Sie das Traceflag als Startoption für den SQL Server setzen, können Sie hier nachlesen: &lt;a href=&quot;http://msdn.microsoft.com/de-de/library/ms190737.aspx&quot;&gt;http://msdn.microsoft.com/de-de/library/ms190737.aspx&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
			<pubDate>Fri, 11 Feb 2011 11:41:26 +0100</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/der-nav-client-zeigt-in-der-uebersicht-der-aktiven-sessions-nur-die-eigene-session-an/</guid>
		</item>
		
		<item>
			<title>Der NAV-Client versucht, eine externe Komponente auszuführen</title>
			<link>http://www.comporsys.de/dynamics-nav-blog/der-nav-client-versucht-eine-externe-komponente-auszufuehren/</link>
			<description>&lt;p&gt;Kennen Sie die in Microsoft Dynamics NAV 2009 R2 neue Warnmeldung „Der NAV-Client versucht, eine externe Komponente auszuführen“?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.comporsys.de/../../../assets/blog/blog1.png&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Offensichtlich hat Microsoft die Option „Zulassen und nicht mehr fragen“ nicht implementiert, so dass diese Warnmeldung jedes Mal aufs Neue erscheint. Ärgerlich. Frage: Warum ist diese Option nicht implementiert? Antwort: Weil diese Option überflüssig ist, wenn sich NAV Client und Dynamics NAV Server nur ausreichend vertrauen.&lt;/p&gt;
&lt;p&gt;Mit Microsoft Dynamics NAV 2009 R2 wird einer neuer Datentyp „DotNet“ eingeführt. Mit Hilfe dieses Datentyps haben wir als NAV Entwickler eine elegante Möglichkeit, .NET-Assemblies in die C/AL Programmierung zu integrieren.&lt;/p&gt;
&lt;p&gt;Bauen wir ein einfaches Beispiel und lassen uns den Maschinennamen mit Hilfe des Properties „MachineName“ der Klasse „System.Environment“ der Assembly „mscorlib“ anzeigen:&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;p&gt;OBJECT Codeunit 50000 System Environment &lt;br/&gt; {&lt;br/&gt;   OBJECT-PROPERTIES&lt;br/&gt;   {&lt;br/&gt;     Date=11.01.11;&lt;br/&gt;     Time=10:30:00;&lt;br/&gt;     Modified=Yes;&lt;br/&gt;     Version List=;&lt;br/&gt;   }&lt;br/&gt;   PROPERTIES&lt;br/&gt;   {&lt;br/&gt;             SystemEnvironment@1000000000 : DotNet &quot;'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.System.Environment&quot;;&lt;br/&gt;             MachineName@1000000001 : Text[30];&lt;br/&gt;           BEGIN&lt;br/&gt;             MachineName := SystemEnvironment.MachineName;&lt;br/&gt;             MESSAGE('MachineName = %1', MachineName);&lt;br/&gt;           END;&lt;br/&gt;   }&lt;br/&gt;   CODE&lt;br/&gt;   {&lt;br/&gt;     BEGIN&lt;br/&gt;     END.&lt;br/&gt;   }&lt;br/&gt; }&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Welcher Maschinenname wird angezeigt? Richtig! Der Name der Maschine, auf der der Dynamics NAV Server läuft und nicht der Name unseres NAV Clients.&lt;/p&gt;
&lt;p&gt;Der Grund ist das Property „RunOnClient“ der DotNet-Variable „SystemEnvironment“. Dieses Property steht standardmäßig auf „No“, so dass die Codeausführung auf dem Dynamics NAV Server und nicht auf dem NAV Client läuft.&lt;/p&gt;
&lt;p&gt;Ändern wir dieses Property auf „Yes“, läuft die Codeausführung auf dem NAV Client. Allerdings erst, wenn wir die Warnmeldung oben quittiert haben. Damit kommen wir auf unsere eigentliche Fragestellung zurück, wie wir diese Warnmeldung unterdrücken.&lt;/p&gt;
&lt;p&gt;Die Lösung besteht darin, den NAV Client zu einer Kerberos-Authentifizierung anstelle einer NTLM-Authentifizierung gegenüber dem Dynamics NAV Server zu bewegen. Dazu öffnen wir die Konfigurationsdatei „ClientUserSettings.config“ für den NAV Client im Verzeichnis „C:\Users\&amp;lt;Benutzername&amp;gt;\AppData\Local\Microsoft\Microsoft Dynamics NAV“ (Hinweis: Das Verzeichnis „AppData“ wird standardmäßig nicht angezeigt. Der Verzeichnisname gilt nur für Windows 7 und Windows Server 2008 R2). Und ändern den Eintrag für „ServicePrincipalNameRequired“ von „false“ auf „true“. Damit vertrauen sich NAV Client und Dynamics NAV Server und die Warnmeldung wird nicht mehr angezeigt.&lt;/p&gt;
&lt;div class=&quot;code&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&lt;br/&gt; &amp;lt;configuration&amp;gt;&lt;br/&gt;  &amp;lt;appSettings&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;Server&quot; value=&quot;SPIDERMAN&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;ServerInstance&quot; value=&quot;DynamicsNAV&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;ServerPort&quot; value=&quot;7046&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;ProtectionLevel&quot; value=&quot;EncryptAndSign&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;UrlHistory&quot; value=&quot;&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;CompressionThreshold&quot; value=&quot;64&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;ChunkSize&quot; value=&quot;28&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;AllowNtlm&quot; value=&quot;true&quot; /&amp;gt;&lt;br/&gt;   &lt;strong&gt;&amp;lt;add key=&quot;ServicePrincipalNameRequired&quot; value=&quot;true&quot; /&amp;gt;&lt;/strong&gt;&lt;br/&gt;   &amp;lt;add key=&quot;OpenConnectionTimeout&quot; value=&quot;00:00:30&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;ClientCredentialType&quot; value=&quot;Windows&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;DnsIdentity&quot; value=&quot;&quot; /&amp;gt;&lt;br/&gt;   &amp;lt;add key=&quot;UnknownSpnHint&quot; value=&quot;(net.tcp://spiderman:7046/DynamicsNAV/Service)=Spn;&quot; /&amp;gt;&lt;br/&gt;  &amp;lt;/appSettings&amp;gt;&lt;br/&gt; &amp;lt;/configuration&amp;gt;&lt;br/&gt;  &lt;br/&gt;&lt;/div&gt;</description>
			<pubDate>Tue, 11 Jan 2011 14:19:17 +0100</pubDate>
			
			
			<guid>http://www.comporsys.de/dynamics-nav-blog/der-nav-client-versucht-eine-externe-komponente-auszufuehren/</guid>
		</item>
		

	</channel>
</rss>
