<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Aku's AX Blog</title>
    <link>http://blog.ak-home.net/</link>
    <description>...feel the spirit of Microsoft Dynamics AX</description>
    <language>de</language>
    <copyright>Axel Kühn</copyright>
    <lastBuildDate>Sat, 27 Feb 2010 15:21:20 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>kuehn@ak-home.net</managingEditor>
    <webMaster>kuehn@ak-home.net</webMaster>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=cb09a7f7-edac-451d-8abe-26145ed8cb05</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,cb09a7f7-edac-451d-8abe-26145ed8cb05.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,cb09a7f7-edac-451d-8abe-26145ed8cb05.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=cb09a7f7-edac-451d-8abe-26145ed8cb05</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Beim Entwickeln und/oder Testen von AIF-Service, welche als Webservice bereit gestellt
werden, entstehen oftmals (mindestens) 2 Fragestellungen.
</p>
        <ol>
          <li>
Wie kann die Nachricht betrachtet werden, welche zwischen den System über den Webservice
ausgetauscht wird? 
</li>
          <li>
Wie lässt sich der Webservice-Aufruf debuggen?</li>
        </ol>
        <p>
Leider werden diese Fragen bei einer Suche im Internet oft mit “Geht nicht” beantwortet.<br />
Dies ist so allerdings nicht richtig.
</p>
        <p>
Es ist z.B. möglich, für alle Webserviceaufrufe eine Tracing-File zu erzeugen, welches
u.A. auch die Nachricht protokolliert, die von oder zu Dynamics AX geschickt wurde.<br />
Um das Tracing zu aktivieren müssen nur entsprechende Einstellungen in der web.config
des Webservices vorgenommen werden.
</p>
        <p>
Wie dies im Detail funktioniert beschreibt dieses kleine <a href="http://msdn.microsoft.com/en-us/library/cc967372.aspx">How-To</a> des
Microsoft Dynamics Developer Centers im MSDN.<br /><a title="http://msdn.microsoft.com/en-us/library/cc967372.aspx" href="http://msdn.microsoft.com/en-us/library/cc967372.aspx">http://msdn.microsoft.com/en-us/library/cc967372.aspx</a></p>
        <p>
Es ist ebenfalls möglich, die Webserviceaufrufe zu debuggen.
</p>
        <p>
Allerdings müssten hierfür einige Schritte beachtet werden, damit das Debuggen von
Webserviceaufrufen auch für X++ Code funktioniert.<br />
Eine detaillierte Anleitung hierzu ist am Ende des Whitepapers “<a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=90388b14-fb8c-4633-a255-28ff7146c5b2">Tips
for Creating Services in Microsoft Dynamics AX 2009</a>” zu finden.<br /><a title="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=90388b14-fb8c-4633-a255-28ff7146c5b2" href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=90388b14-fb8c-4633-a255-28ff7146c5b2">http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;FamilyID=90388b14-fb8c-4633-a255-28ff7146c5b2</a></p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=cb09a7f7-edac-451d-8abe-26145ed8cb05" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Dynamics AX AIF Webservices &amp;ndash; Entwickeln und Testen</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,cb09a7f7-edac-451d-8abe-26145ed8cb05.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,cb09a7f7-edac-451d-8abe-26145ed8cb05.aspx</link>
      <pubDate>Sat, 27 Feb 2010 15:21:20 GMT</pubDate>
      <description>&lt;p&gt;
Beim Entwickeln und/oder Testen von AIF-Service, welche als Webservice bereit gestellt
werden, entstehen oftmals (mindestens) 2 Fragestellungen.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Wie kann die Nachricht betrachtet werden, welche zwischen den System über den Webservice
ausgetauscht wird? 
&lt;li&gt;
Wie lässt sich der Webservice-Aufruf debuggen?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Leider werden diese Fragen bei einer Suche im Internet oft mit “Geht nicht” beantwortet.&lt;br&gt;
Dies ist so allerdings nicht richtig.
&lt;/p&gt;
&lt;p&gt;
Es ist z.B. möglich, für alle Webserviceaufrufe eine Tracing-File zu erzeugen, welches
u.A. auch die Nachricht protokolliert, die von oder zu Dynamics AX geschickt wurde.&lt;br&gt;
Um das Tracing zu aktivieren müssen nur entsprechende Einstellungen in der web.config
des Webservices vorgenommen werden.
&lt;/p&gt;
&lt;p&gt;
Wie dies im Detail funktioniert beschreibt dieses kleine &lt;a href="http://msdn.microsoft.com/en-us/library/cc967372.aspx"&gt;How-To&lt;/a&gt; des
Microsoft Dynamics Developer Centers im MSDN.&lt;br&gt;
&lt;a title=http://msdn.microsoft.com/en-us/library/cc967372.aspx href="http://msdn.microsoft.com/en-us/library/cc967372.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc967372.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Es ist ebenfalls möglich, die Webserviceaufrufe zu debuggen.
&lt;/p&gt;
&lt;p&gt;
Allerdings müssten hierfür einige Schritte beachtet werden, damit das Debuggen von
Webserviceaufrufen auch für X++ Code funktioniert.&lt;br&gt;
Eine detaillierte Anleitung hierzu ist am Ende des Whitepapers “&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=90388b14-fb8c-4633-a255-28ff7146c5b2"&gt;Tips
for Creating Services in Microsoft Dynamics AX 2009&lt;/a&gt;” zu finden.&lt;br&gt;
&lt;a title=http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=90388b14-fb8c-4633-a255-28ff7146c5b2 href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=90388b14-fb8c-4633-a255-28ff7146c5b2"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=90388b14-fb8c-4633-a255-28ff7146c5b2&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=cb09a7f7-edac-451d-8abe-26145ed8cb05" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,cb09a7f7-edac-451d-8abe-26145ed8cb05.aspx</comments>
      <category>Dynamics Ax;Dynamics AX/AIF;Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=cea0552b-b96e-48ba-884b-c82bd2538b07</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,cea0552b-b96e-48ba-884b-c82bd2538b07.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,cea0552b-b96e-48ba-884b-c82bd2538b07.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=cea0552b-b96e-48ba-884b-c82bd2538b07</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Um Datensätze in Microsoft Dynamics AX, welche z.B. auf einer Maske angezeigt werden,
entsprechend seiner Anforderungen einzuschränken (zu filtern) muss die Query (Abfrageobjekt)
durch Erstellung von Ranges (Abfrageeinschränkungsobjekt) entsprechend “manipuliert”
werden.<br />
Hierfür wird z.B. die Query einer Maskendatenquell (DataSource) verwendet und für
diese eine neue Range definiert:
</p>
        <p>
Beispiel:
</p>
        <p>
        </p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> init()</pre>
          <pre>{</pre>
          <pre class="alt">    QueryBuildRange     range;</pre>
          <pre>    ;</pre>
          <pre class="alt">    super();</pre>
          <pre>
          </pre>
          <pre class="alt">    range = CustTable_ds.query().dataSourceTable(tablenum(CustTable)).addRange(fieldnum(CustTable, AccountNum));</pre>
          <pre>    range.<span class="kwrd">value</span>(<span class="str">"1101"</span>);</pre>
          <pre class="alt">}</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
        </p>
        <p>
Im Dynamics AX Standard kann ähnlicher X++ Quelltext in vielen Masken gefunden werden,
da dies der “Standard-Weg” zum Einschränken von Datensatzabfragen bei Masken oder
auch Reports ist.<br />
Ebenso wird dieses Vorgehen auch in den Schulungsunterlagen, in der Entwicklerhilfe
und anderen Stellen beschrieben.
</p>
        <p>
Leider hat dieses Vorgehen eine kleine aber teilweise sehr störende Beschränkung.<br />
Über diesen Weg ist es nicht möglich, alle Abfrageeinschränkungen welche durch X++
Quellcode “gesetzt” wurden und Einschränkungen, welche durch einen Benutzer mittels
der Standardfilterfunktion von Dynamics AX definiert wurden, zu berücksichtigen. Beim
einer Datenaktualisierung (Aufruf von DataSource.executeQuery) gehen die von einem
Benutzer definierten Abfrageeinschränkungen verloren. 
</p>
        <p>
Dies ist darin begründet, dass es nicht nur ein DataSoucre.query-Objekt, sondern auch
ein DataSource.queryrun().query-Objekt gibt.<br />
Diese beiden “Query-Objekte” sind jeweils unterschiedliche Objekte, bzw. Objektinstanzen.
</p>
        <p>
Das DataSource.query-Objekt ist das “Basisabfrageobjekt”, welches durch einen Benutzer,
mittels der Filterfunktionalität des Standards, nicht verändert werden kann (nur durch
X++ Code).<br />
Alle durch den Benutzer vorgenommenen Änderungen an der “Basisabfrage” werden in dem
Query-Objekt von DataSource-queryrun() “gespeichert”.<br />
Dies kann unter Anderem durch Betrachtung des SQL-Statements, welches durch ein Query-Objekt
bereit gestellt wird nachgewiesen werden.
</p>
        <p>
Beispiel:
</p>
        <p>
Aufruf einer Maske mit einer durch X++ Code modifizierten Abfrage (Query).<br />
Anmerkung: Beim Aufruf der Maske wird in der “Init-Methode” eine Range (CustGroup
= “10”) gesetzt.
</p>
        <pre class="csharpcode">range = CustTable_ds.query().dataSourceTable(tablenum(CustTable)).addRange(fieldnum(CustTable, CustGroup));
range.<span class="kwrd">value</span>(<span class="str">"10"</span>);</pre>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/QueryVSQueryRunQuery_1.jpg" target="_blank">
            <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="QueryVSQueryRunQuery_1" border="0" alt="QueryVSQueryRunQuery_1" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/QueryVSQueryRunQuery_1_thumb.jpg" width="244" height="110" />
          </a>
        </p>
        <p>
Durch den Benutzer wird nun mittels der Dynamics AX Standard-Filterfunktion die Abfrage
bzw. deren Einschränkung(en) angepasst/verändert.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/QueryVSQueryRunQuery_2.jpg" target="_blank">
            <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="QueryVSQueryRunQuery_2" border="0" alt="QueryVSQueryRunQuery_2" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/QueryVSQueryRunQuery_2_thumb.jpg" width="244" height="111" />
          </a>
        </p>
        <p>
Hierdurch ist zu beobachten, das sich zwar das SQL-Statement des DataSource.queryrun().query-Objekts,
aber nicht das SQL-Statement des DataSoucre.query-Objekts ändert.<br />
Da bei einem Aufruf von DataSource.executeQuery allerdings immer das DataSource.query-Objekt
verwendet wird, gehen die durch den Benutzer gewählten Abfrageeinschränkungen verloren.
</p>
        <p>
Wie ist es nun aber möglich, die von einem Benutzer gewählten Abfrageeinschränkungen/Filtereinstellung
doch zu berücksichtigen?
</p>
        <p>
Da alle Abfrageeinschränkungen, welche von einem Benutzer gewählt wurden, in dem Query-Objekt
von DataSource.queryrun() “gespeichert” werden und somit auch im X++ Code zur Verfügung
stehen ist dies recht einfach.<br />
Es muss einfach das Query-Objekt von DataSource.queryrun() genommen werden, um die
gewünschten Ranges ergenzt werden und schließlich dass Query-Objekt der DataSource
überschrieben werden.
</p>
        <p>
Beispiel:
</p>
        <p>
Basis ist eine einfach Maske, welche alle Kundendatensätze anzeigt.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/ShowQuery_1.jpg" target="_blank">
            <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="ShowQuery_1" border="0" alt="ShowQuery_1" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/ShowQuery_1_thumb.jpg" width="244" height="74" />
          </a>
        </p>
        <p>
Dieser Maske/Abfrage wird nun durch die Standard-Filterfunktion (Benutzerfilter) eine
neue Abfrageeinschränkung hinzugefügt (Kundennummer = 1101 und 2001).
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/ShowQuery_2.jpg" target="_blank">
            <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="ShowQuery_2" border="0" alt="ShowQuery_2" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/ShowQuery_2_thumb.jpg" width="244" height="68" />
          </a>
        </p>
        <p>
        </p>
        <p>
Wie zuvor beschrieben, wird nun eine neue Abfrageeinschränkung mit X++ Code auf dem
Query-Objekt von DataSource.queryrun “gesetzt” und das Query-Objekt der DataSource
mit diesem überschrieben. 
</p>
        <p>
        </p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">void</span> clicked()</pre>
          <pre>{</pre>
          <pre class="alt">    Query               query;</pre>
          <pre>    QueryBuildRange     range;</pre>
          <pre class="alt">    ;</pre>
          <pre>    super();</pre>
          <pre class="alt"> </pre>
          <pre>    query = CustTable_ds.queryRun().query();</pre>
          <pre class="alt"> </pre>
          <pre>    range = query.dataSourceTable(tablenum(CustTable)).addRange(fieldnum(CustTable, CustGroup));</pre>
          <pre class="alt">    range.<span class="kwrd">value</span>(<span class="str">"10"</span>);</pre>
          <pre> </pre>
          <pre class="alt">    CustTable_ds.query(query);</pre>
          <pre> </pre>
          <pre class="alt">    CustTable_ds.executeQuery();</pre>
          <pre>}</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
        </p>
        <p>
Dies hat zur Folge, dass die durch den Benutzer gewählten Abfrageeinschränkungen,
wie zu sehen, weiterhin berücksichtigt werden.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/AddRange_2.jpg" target="_blank">
            <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="AddRange_2" border="0" alt="AddRange_2" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/AddRange_2_thumb.jpg" width="244" height="69" />
          </a>
        </p>
        <p>
Alternativ zur Verwendung der Abfrageeinschränkung (Range) “direkt” über das Query-Objekt
kann auch mit einem oder mehreren Filtern gearbeitet werden.<br />
Diese unterliegen im Gegensatz zu den Query-Objekt aber einigen Einschränkungen, sodass
diese nicht in jeder Situation verwendet werden können.
</p>
        <p>
Der folgende X++ Code zeigt, wie ein Filter gesetzt werden kann.
</p>
        <p>
        </p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">void</span> clicked()</pre>
          <pre>{</pre>
          <pre class="alt">    Query               query;</pre>
          <pre>    QueryBuildRange     range;</pre>
          <pre class="alt">    ;</pre>
          <pre>    super();</pre>
          <pre class="alt"> </pre>
          <pre>    CustTable_ds.filter(fieldnum(CustTable, CustGroup), <span class="str">"10"</span>);</pre>
          <pre class="alt">}</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
        </p>
        <p>
Wird eine Abfrage auf diese Art und Weise eingeschränkt, ist der Aufruf von DataSource.executeQuery()
unnötig, da die Datenaktualisierung bereits im Hintergrund durch den Filter-Aufruf
durchgeführt wird.<br />
Filter einer DataSource funktionieren vom Prinzip her wie die Standardfilter, welche
durch einen Benutzer in Dynamics AX gesetzt werden können.<br />
Dies hat zur Folge, dass sich diese ebenfalls nur auf das Query-Objekt von DataSource.queryrun()
auswirken und somit DataSource.query nicht beeinflussen.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/Add_Filter.jpg" target="_blank">
            <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Add_Filter" border="0" alt="Add_Filter" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/Add_Filter_thumb.jpg" width="244" height="68" />
          </a>
        </p>
        <p>
Mit der Methode DataSource.removeFilter können die gesetzten Filter wieder gelöscht
werden.<br />
Leider werden hierdurch alle gesetzten Filter gelöscht, sodass nach diesem Aufruf
unter Umständen einige bereits gesetzte Filter erneut gesetzt werden müssen, um das
gewünschte Abfrageergebnis zu erhalten.
</p>
        <p>
Welche der gezeigten Methoden, zum Einschränken von Abfragen, aber nun der beste oder
bessere Weg ist, muss von Fall zu Fall entschieden werden.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=cea0552b-b96e-48ba-884b-c82bd2538b07" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Dynamics AX &amp;ndash; Query-Ranges und Filtereinstellungen des Benutzers</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,cea0552b-b96e-48ba-884b-c82bd2538b07.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,cea0552b-b96e-48ba-884b-c82bd2538b07.aspx</link>
      <pubDate>Wed, 03 Feb 2010 19:49:23 GMT</pubDate>
      <description>&lt;p&gt;
Um Datensätze in Microsoft Dynamics AX, welche z.B. auf einer Maske angezeigt werden,
entsprechend seiner Anforderungen einzuschränken (zu filtern) muss die Query (Abfrageobjekt)
durch Erstellung von Ranges (Abfrageeinschränkungsobjekt) entsprechend “manipuliert”
werden.&lt;br&gt;
Hierfür wird z.B. die Query einer Maskendatenquell (DataSource) verwendet und für
diese eine neue Range definiert:
&lt;/p&gt;
&lt;p&gt;
Beispiel:
&lt;/p&gt;
&lt;p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; init()&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    QueryBuildRange     range;&lt;/pre&gt;
&lt;pre&gt;    ;&lt;/pre&gt;
&lt;pre class=alt&gt;    super();&lt;/pre&gt;
&lt;pre&gt;    &lt;/pre&gt;
&lt;pre class=alt&gt;    range = CustTable_ds.query().dataSourceTable(tablenum(CustTable)).addRange(fieldnum(CustTable, AccountNum));&lt;/pre&gt;
&lt;pre&gt;    range.&lt;span class=kwrd&gt;value&lt;/span&gt;(&lt;span class=str&gt;"1101"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class=alt&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Im Dynamics AX Standard kann ähnlicher X++ Quelltext in vielen Masken gefunden werden,
da dies der “Standard-Weg” zum Einschränken von Datensatzabfragen bei Masken oder
auch Reports ist.&lt;br&gt;
Ebenso wird dieses Vorgehen auch in den Schulungsunterlagen, in der Entwicklerhilfe
und anderen Stellen beschrieben.
&lt;/p&gt;
&lt;p&gt;
Leider hat dieses Vorgehen eine kleine aber teilweise sehr störende Beschränkung.&lt;br&gt;
Über diesen Weg ist es nicht möglich, alle Abfrageeinschränkungen welche durch X++
Quellcode “gesetzt” wurden und Einschränkungen, welche durch einen Benutzer mittels
der Standardfilterfunktion von Dynamics AX definiert wurden, zu berücksichtigen. Beim
einer Datenaktualisierung (Aufruf von DataSource.executeQuery) gehen die von einem
Benutzer definierten Abfrageeinschränkungen verloren. 
&lt;/p&gt;
&lt;p&gt;
Dies ist darin begründet, dass es nicht nur ein DataSoucre.query-Objekt, sondern auch
ein DataSource.queryrun().query-Objekt gibt.&lt;br&gt;
Diese beiden “Query-Objekte” sind jeweils unterschiedliche Objekte, bzw. Objektinstanzen.
&lt;/p&gt;
&lt;p&gt;
Das DataSource.query-Objekt ist das “Basisabfrageobjekt”, welches durch einen Benutzer,
mittels der Filterfunktionalität des Standards, nicht verändert werden kann (nur durch
X++ Code).&lt;br&gt;
Alle durch den Benutzer vorgenommenen Änderungen an der “Basisabfrage” werden in dem
Query-Objekt von DataSource-queryrun() “gespeichert”.&lt;br&gt;
Dies kann unter Anderem durch Betrachtung des SQL-Statements, welches durch ein Query-Objekt
bereit gestellt wird nachgewiesen werden.
&lt;/p&gt;
&lt;p&gt;
Beispiel:
&lt;/p&gt;
&lt;p&gt;
Aufruf einer Maske mit einer durch X++ Code modifizierten Abfrage (Query).&lt;br&gt;
Anmerkung: Beim Aufruf der Maske wird in der “Init-Methode” eine Range (CustGroup
= “10”) gesetzt.
&lt;/p&gt;
&lt;pre class=csharpcode&gt;range = CustTable_ds.query().dataSourceTable(tablenum(CustTable)).addRange(fieldnum(CustTable, CustGroup));
range.&lt;span class=kwrd&gt;value&lt;/span&gt;(&lt;span class=str&gt;"10"&lt;/span&gt;);&lt;/pre&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/QueryVSQueryRunQuery_1.jpg" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=QueryVSQueryRunQuery_1 border=0 alt=QueryVSQueryRunQuery_1 src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/QueryVSQueryRunQuery_1_thumb.jpg" width=244 height=110&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Durch den Benutzer wird nun mittels der Dynamics AX Standard-Filterfunktion die Abfrage
bzw. deren Einschränkung(en) angepasst/verändert.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/QueryVSQueryRunQuery_2.jpg" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=QueryVSQueryRunQuery_2 border=0 alt=QueryVSQueryRunQuery_2 src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/QueryVSQueryRunQuery_2_thumb.jpg" width=244 height=111&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Hierdurch ist zu beobachten, das sich zwar das SQL-Statement des DataSource.queryrun().query-Objekts,
aber nicht das SQL-Statement des DataSoucre.query-Objekts ändert.&lt;br&gt;
Da bei einem Aufruf von DataSource.executeQuery allerdings immer das DataSource.query-Objekt
verwendet wird, gehen die durch den Benutzer gewählten Abfrageeinschränkungen verloren.
&lt;/p&gt;
&lt;p&gt;
Wie ist es nun aber möglich, die von einem Benutzer gewählten Abfrageeinschränkungen/Filtereinstellung
doch zu berücksichtigen?
&lt;/p&gt;
&lt;p&gt;
Da alle Abfrageeinschränkungen, welche von einem Benutzer gewählt wurden, in dem Query-Objekt
von DataSource.queryrun() “gespeichert” werden und somit auch im X++ Code zur Verfügung
stehen ist dies recht einfach.&lt;br&gt;
Es muss einfach das Query-Objekt von DataSource.queryrun() genommen werden, um die
gewünschten Ranges ergenzt werden und schließlich dass Query-Objekt der DataSource
überschrieben werden.
&lt;/p&gt;
&lt;p&gt;
Beispiel:
&lt;/p&gt;
&lt;p&gt;
Basis ist eine einfach Maske, welche alle Kundendatensätze anzeigt.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/ShowQuery_1.jpg" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=ShowQuery_1 border=0 alt=ShowQuery_1 src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/ShowQuery_1_thumb.jpg" width=244 height=74&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Dieser Maske/Abfrage wird nun durch die Standard-Filterfunktion (Benutzerfilter) eine
neue Abfrageeinschränkung hinzugefügt (Kundennummer = 1101 und 2001).
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/ShowQuery_2.jpg" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=ShowQuery_2 border=0 alt=ShowQuery_2 src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/ShowQuery_2_thumb.jpg" width=244 height=68&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Wie zuvor beschrieben, wird nun eine neue Abfrageeinschränkung mit X++ Code auf dem
Query-Objekt von DataSource.queryrun “gesetzt” und das Query-Objekt der DataSource
mit diesem überschrieben. 
&lt;/p&gt;
&lt;p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;void&lt;/span&gt; clicked()&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    Query               query;&lt;/pre&gt;
&lt;pre&gt;    QueryBuildRange     range;&lt;/pre&gt;
&lt;pre class=alt&gt;    ;&lt;/pre&gt;
&lt;pre&gt;    super();&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    query = CustTable_ds.queryRun().query();&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    range = query.dataSourceTable(tablenum(CustTable)).addRange(fieldnum(CustTable, CustGroup));&lt;/pre&gt;
&lt;pre class=alt&gt;    range.&lt;span class=kwrd&gt;value&lt;/span&gt;(&lt;span class=str&gt;"10"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;    CustTable_ds.query(query);&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;    CustTable_ds.executeQuery();&lt;/pre&gt;
&lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Dies hat zur Folge, dass die durch den Benutzer gewählten Abfrageeinschränkungen,
wie zu sehen, weiterhin berücksichtigt werden.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/AddRange_2.jpg" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=AddRange_2 border=0 alt=AddRange_2 src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/AddRange_2_thumb.jpg" width=244 height=69&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Alternativ zur Verwendung der Abfrageeinschränkung (Range) “direkt” über das Query-Objekt
kann auch mit einem oder mehreren Filtern gearbeitet werden.&lt;br&gt;
Diese unterliegen im Gegensatz zu den Query-Objekt aber einigen Einschränkungen, sodass
diese nicht in jeder Situation verwendet werden können.
&lt;/p&gt;
&lt;p&gt;
Der folgende X++ Code zeigt, wie ein Filter gesetzt werden kann.
&lt;/p&gt;
&lt;p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;void&lt;/span&gt; clicked()&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    Query               query;&lt;/pre&gt;
&lt;pre&gt;    QueryBuildRange     range;&lt;/pre&gt;
&lt;pre class=alt&gt;    ;&lt;/pre&gt;
&lt;pre&gt;    super();&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    CustTable_ds.filter(fieldnum(CustTable, CustGroup), &lt;span class=str&gt;"10"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class=alt&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Wird eine Abfrage auf diese Art und Weise eingeschränkt, ist der Aufruf von DataSource.executeQuery()
unnötig, da die Datenaktualisierung bereits im Hintergrund durch den Filter-Aufruf
durchgeführt wird.&lt;br&gt;
Filter einer DataSource funktionieren vom Prinzip her wie die Standardfilter, welche
durch einen Benutzer in Dynamics AX gesetzt werden können.&lt;br&gt;
Dies hat zur Folge, dass sich diese ebenfalls nur auf das Query-Objekt von DataSource.queryrun()
auswirken und somit DataSource.query nicht beeinflussen.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/Add_Filter.jpg" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Add_Filter border=0 alt=Add_Filter src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXQueryRangesundFiltereinstellun_10B74/Add_Filter_thumb.jpg" width=244 height=68&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Mit der Methode DataSource.removeFilter können die gesetzten Filter wieder gelöscht
werden.&lt;br&gt;
Leider werden hierdurch alle gesetzten Filter gelöscht, sodass nach diesem Aufruf
unter Umständen einige bereits gesetzte Filter erneut gesetzt werden müssen, um das
gewünschte Abfrageergebnis zu erhalten.
&lt;/p&gt;
&lt;p&gt;
Welche der gezeigten Methoden, zum Einschränken von Abfragen, aber nun der beste oder
bessere Weg ist, muss von Fall zu Fall entschieden werden.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=cea0552b-b96e-48ba-884b-c82bd2538b07" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,cea0552b-b96e-48ba-884b-c82bd2538b07.aspx</comments>
      <category>Dynamics Ax;Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=2cd736a1-d273-4db7-ad73-9d80ab89c4ed</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,2cd736a1-d273-4db7-ad73-9d80ab89c4ed.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,2cd736a1-d273-4db7-ad73-9d80ab89c4ed.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=2cd736a1-d273-4db7-ad73-9d80ab89c4ed</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Oftmals besteht die Anforderung, über einen Zeitgesteuerten Job (Batchjob), das Generieren
von statistischen Berichten, welche in einer Datei gespeichert werden soll, zu automatisieren.
</p>
        <p>
Microsoft Dynamics AX stellt hierfür die Möglichkeit bereit, jeden Bericht mithilfe
der Stapelverarbeitung zu einem definierten Zeitpunkt zu generieren und in einer Datei,
z.B. in einem Netzwerklaufwerk, bereit zu stellen.<br />
Soweit stellt dies kein Problem dar, da über den Standard von Dynamics AX diese Anforderung
ohne weiteres erfüllt werden kann.
</p>
        <p>
Leider wird hierbei oft vergessen, dass  der entsprechende Batchserver (AOS)
so konfiguriert werden muss, dass dieser das “Drucken auf dem Server” zulassen muss.<br />
Dies ist eine Einstellungsoption des Serverkonfigurations-Utilities.
</p>
        <p>
Weiterhin sollte bei der Angabe der Datei bzw. des Speicherortes der Datei immer ein
UNC-Pfad verwendet werden, da die eigentlich Ausführung des Berichtes und somit auch
die Erstellung der Datei über das Benutzerkonto des AOS-Dienstes geschieht.
</p>
        <p>
Dies bedingt auch, dass entsprechende Berechtigungen für das Dienstkonto des Batchservers
(AOS) für das freigegebene Verzeichnis vergeben werden müssen, damit die Datei und
somit der Bericht erfolgreich erstellt werden kann.
</p>
        <p>
Eine weiterführende <a href="http://blogs.msdn.com/emeadaxsupport/archive/2009/07/15/test.aspx">Beschreibung</a> hierzu
ist auch im <a href="http://blogs.msdn.com/emeadaxsupport/default.aspx">EMEA Dynamics
AX Support Blog</a> zu finden.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=2cd736a1-d273-4db7-ad73-9d80ab89c4ed" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Dynamics AX &amp;ndash; Batchserver, Berichte und Drucken in Dateien</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,2cd736a1-d273-4db7-ad73-9d80ab89c4ed.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,2cd736a1-d273-4db7-ad73-9d80ab89c4ed.aspx</link>
      <pubDate>Mon, 25 Jan 2010 20:04:57 GMT</pubDate>
      <description>&lt;p&gt;
Oftmals besteht die Anforderung, über einen Zeitgesteuerten Job (Batchjob), das Generieren
von statistischen Berichten, welche in einer Datei gespeichert werden soll, zu automatisieren.
&lt;/p&gt;
&lt;p&gt;
Microsoft Dynamics AX stellt hierfür die Möglichkeit bereit, jeden Bericht mithilfe
der Stapelverarbeitung zu einem definierten Zeitpunkt zu generieren und in einer Datei,
z.B. in einem Netzwerklaufwerk, bereit zu stellen.&lt;br&gt;
Soweit stellt dies kein Problem dar, da über den Standard von Dynamics AX diese Anforderung
ohne weiteres erfüllt werden kann.
&lt;/p&gt;
&lt;p&gt;
Leider wird hierbei oft vergessen, dass&amp;nbsp; der entsprechende Batchserver (AOS)
so konfiguriert werden muss, dass dieser das “Drucken auf dem Server” zulassen muss.&lt;br&gt;
Dies ist eine Einstellungsoption des Serverkonfigurations-Utilities.
&lt;/p&gt;
&lt;p&gt;
Weiterhin sollte bei der Angabe der Datei bzw. des Speicherortes der Datei immer ein
UNC-Pfad verwendet werden, da die eigentlich Ausführung des Berichtes und somit auch
die Erstellung der Datei über das Benutzerkonto des AOS-Dienstes geschieht.
&lt;/p&gt;
&lt;p&gt;
Dies bedingt auch, dass entsprechende Berechtigungen für das Dienstkonto des Batchservers
(AOS) für das freigegebene Verzeichnis vergeben werden müssen, damit die Datei und
somit der Bericht erfolgreich erstellt werden kann.
&lt;/p&gt;
&lt;p&gt;
Eine weiterführende &lt;a href="http://blogs.msdn.com/emeadaxsupport/archive/2009/07/15/test.aspx"&gt;Beschreibung&lt;/a&gt; hierzu
ist auch im &lt;a href="http://blogs.msdn.com/emeadaxsupport/default.aspx"&gt;EMEA Dynamics
AX Support Blog&lt;/a&gt; zu finden.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=2cd736a1-d273-4db7-ad73-9d80ab89c4ed" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,2cd736a1-d273-4db7-ad73-9d80ab89c4ed.aspx</comments>
      <category>Allgemein;Dynamics Ax;Dynamics Ax/Administration;Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=74734dd3-3ce8-4ad9-bc29-2503a0f866aa</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,74734dd3-3ce8-4ad9-bc29-2503a0f866aa.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,74734dd3-3ce8-4ad9-bc29-2503a0f866aa.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=74734dd3-3ce8-4ad9-bc29-2503a0f866aa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In Microsoft Dynamics AX wird das Args-Objekt dazu verwendet, Informationen z.B. an
eine aufzurufende Maske oder Klasse zu übergeben.
</p>
        <p>
Mittels des Args-Objektes ist es z.B. möglich, den auf einer Maske ausgewählten Datensatz
an die Aufzurufende (Unter)Maske zu übergeben, um mit diesem die Darstellung und/oder
Funktionen der Maske anzupassen.<br />
Oft wird dieses Vorgehen dazu verwendet, Abfragen (Queries) entsprechend einzugrenzen,
damit nur relevante Informationen verarbeitet werden.<br />
Eine beispielhafte Anforderung hierfür könnte sein, alle Aufträge des zuvor ausgewählten
Kunden in einer neuen Maske anzuzeigen.
</p>
        <p>
Manchmal ist aber notwendig, nicht nur den Aufrufer (oder den gewählten Datensatz),
sondern auch dessen Aufrufer zu kennen, um bestimme Funktionalitäten erstellen oder
implementieren zu können.<br />
Herbei kann es sein, dass der ausgewählter Datensatz über mehrere Aufrufebenen übergeben
werden muss und der direkte Aufrufer dennoch bekannt sein muss.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXDenAufruferdesAufrufersbestimm_10DB3/GetTheCallerOfTheCaller_Schema.jpg" target="_blank">
            <img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="GetTheCallerOfTheCaller_Schema" border="0" alt="GetTheCallerOfTheCaller_Schema" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXDenAufruferdesAufrufersbestimm_10DB3/GetTheCallerOfTheCaller_Schema_thumb.jpg" width="244" height="105" />
          </a>
        </p>
        <p>
Nehmen wir an, es existiert eine Hauptmaske, auf der ein Kundendatensatz ausgewählten
werden kann. Auf einer weiteren Maske (1. Maske), sollen nun alle Aufträge des ausgewählten
Kunden angezeigt werden. Diese Maske soll über die Hauptmaske aufgerufen werden. Über
eine 2. Maske, welche über die 1. Maske aufgerufen werden soll, sollen die Adressdaten
des Kunden angezeigt werden.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXDenAufruferdesAufrufersbestimm_10DB3/GetTheCallerOfTheCaller2_2.jpg" target="_blank">
            <img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="GetTheCallerOfTheCaller2" border="0" alt="GetTheCallerOfTheCaller2" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXDenAufruferdesAufrufersbestimm_10DB3/GetTheCallerOfTheCaller2_thumb.jpg" width="244" height="107" />
          </a>
        </p>
        <p>
Um nun die benötigten Information, ausgewählter Kunden in der Hauptmaske, auf der
2. Maske zur Verfügung zu haben, muss über das FormRun-Objekt der 1. Maske der Aufrufer
(Caller) dieser Maske bestimmt werden.
</p>
        <p>
Beispiel (Init-Methode der 2. Maske):
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> init()</pre>
          <pre>{</pre>
          <pre class="alt">    Object          callerDataSource;</pre>
          <pre>    FormRun         callerFormRun;</pre>
          <pre class="alt">    common          callerRecord;</pre>
          <pre>    common          callerRecordOfCallerRecord;</pre>
          <pre class="alt">    ;</pre>
          <pre>    super();</pre>
          <pre class="alt"> </pre>
          <pre>
            <span class="kwrd">if</span>(element.args() &amp;&amp; element.args().dataset())</pre>
          <pre class="alt">    {</pre>
          <pre>        callerRecord = element.args().record();</pre>
          <pre class="alt">        callerDataSource = callerRecord.dataSource();</pre>
          <pre>        callerFormRun = element.args().caller();</pre>
          <pre class="alt"> </pre>
          <pre>        callerRecordOfCallerRecord = callerFormRun.args().record();</pre>
          <pre class="alt"> </pre>
          <pre>        CtrlCallerTable.text(tableid2name(callerRecord.TableId));</pre>
          <pre class="alt">        CtrlCallerOdCallerTable.text(tableid2name(callerRecordOfCallerRecord.TableId));</pre>
          <pre>    }</pre>
          <pre class="alt">}</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
 
</p>
        <p>
        </p>
        <p>
Sicherlicht läßt sich das in dem Beispiel beschriebene Verhalten auch anders (oder
eleganter) Lösen. Dieses Beispiel wurde nur gewählt, um den Ablauf oder die notwendigen
Schritte zu demonstrieren, wie Aufrufer über mehrere Ebenen bestimmt werden können.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=74734dd3-3ce8-4ad9-bc29-2503a0f866aa" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Dynamics AX &amp;ndash; Den Aufrufer des Aufrufers bestimmen</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,74734dd3-3ce8-4ad9-bc29-2503a0f866aa.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,74734dd3-3ce8-4ad9-bc29-2503a0f866aa.aspx</link>
      <pubDate>Sun, 24 Jan 2010 19:00:59 GMT</pubDate>
      <description>&lt;p&gt;
In Microsoft Dynamics AX wird das Args-Objekt dazu verwendet, Informationen z.B. an
eine aufzurufende Maske oder Klasse zu übergeben.
&lt;/p&gt;
&lt;p&gt;
Mittels des Args-Objektes ist es z.B. möglich, den auf einer Maske ausgewählten Datensatz
an die Aufzurufende (Unter)Maske zu übergeben, um mit diesem die Darstellung und/oder
Funktionen der Maske anzupassen.&lt;br&gt;
Oft wird dieses Vorgehen dazu verwendet, Abfragen (Queries) entsprechend einzugrenzen,
damit nur relevante Informationen verarbeitet werden.&lt;br&gt;
Eine beispielhafte Anforderung hierfür könnte sein, alle Aufträge des zuvor ausgewählten
Kunden in einer neuen Maske anzuzeigen.
&lt;/p&gt;
&lt;p&gt;
Manchmal ist aber notwendig, nicht nur den Aufrufer (oder den gewählten Datensatz),
sondern auch dessen Aufrufer zu kennen, um bestimme Funktionalitäten erstellen oder
implementieren zu können.&lt;br&gt;
Herbei kann es sein, dass der ausgewählter Datensatz über mehrere Aufrufebenen übergeben
werden muss und der direkte Aufrufer dennoch bekannt sein muss.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXDenAufruferdesAufrufersbestimm_10DB3/GetTheCallerOfTheCaller_Schema.jpg" target=_blank&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=GetTheCallerOfTheCaller_Schema border=0 alt=GetTheCallerOfTheCaller_Schema src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXDenAufruferdesAufrufersbestimm_10DB3/GetTheCallerOfTheCaller_Schema_thumb.jpg" width=244 height=105&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Nehmen wir an, es existiert eine Hauptmaske, auf der ein Kundendatensatz ausgewählten
werden kann. Auf einer weiteren Maske (1. Maske), sollen nun alle Aufträge des ausgewählten
Kunden angezeigt werden. Diese Maske soll über die Hauptmaske aufgerufen werden. Über
eine 2. Maske, welche über die 1. Maske aufgerufen werden soll, sollen die Adressdaten
des Kunden angezeigt werden.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXDenAufruferdesAufrufersbestimm_10DB3/GetTheCallerOfTheCaller2_2.jpg" target=_blank&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=GetTheCallerOfTheCaller2 border=0 alt=GetTheCallerOfTheCaller2 src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsAXDenAufruferdesAufrufersbestimm_10DB3/GetTheCallerOfTheCaller2_thumb.jpg" width=244 height=107&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Um nun die benötigten Information, ausgewählter Kunden in der Hauptmaske, auf der
2. Maske zur Verfügung zu haben, muss über das FormRun-Objekt der 1. Maske der Aufrufer
(Caller) dieser Maske bestimmt werden.
&lt;/p&gt;
&lt;p&gt;
Beispiel (Init-Methode der 2. Maske):
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; init()&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    Object          callerDataSource;&lt;/pre&gt;
&lt;pre&gt;    FormRun         callerFormRun;&lt;/pre&gt;
&lt;pre class=alt&gt;    common          callerRecord;&lt;/pre&gt;
&lt;pre&gt;    common          callerRecordOfCallerRecord;&lt;/pre&gt;
&lt;pre class=alt&gt;    ;&lt;/pre&gt;
&lt;pre&gt;    super();&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=kwrd&gt;if&lt;/span&gt;(element.args() &amp;amp;&amp;amp; element.args().dataset())&lt;/pre&gt;
&lt;pre class=alt&gt;    {&lt;/pre&gt;
&lt;pre&gt;        callerRecord = element.args().record();&lt;/pre&gt;
&lt;pre class=alt&gt;        callerDataSource = callerRecord.dataSource();&lt;/pre&gt;
&lt;pre&gt;        callerFormRun = element.args().caller();&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;        callerRecordOfCallerRecord = callerFormRun.args().record();&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;        CtrlCallerTable.text(tableid2name(callerRecord.TableId));&lt;/pre&gt;
&lt;pre class=alt&gt;        CtrlCallerOdCallerTable.text(tableid2name(callerRecordOfCallerRecord.TableId));&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;pre class=alt&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Sicherlicht läßt sich das in dem Beispiel beschriebene Verhalten auch anders (oder
eleganter) Lösen. Dieses Beispiel wurde nur gewählt, um den Ablauf oder die notwendigen
Schritte zu demonstrieren, wie Aufrufer über mehrere Ebenen bestimmt werden können.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=74734dd3-3ce8-4ad9-bc29-2503a0f866aa" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,74734dd3-3ce8-4ad9-bc29-2503a0f866aa.aspx</comments>
      <category>Dynamics Ax;Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=a0f445dc-1961-43b9-a7ff-fdfdbfb2cb86</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,a0f445dc-1961-43b9-a7ff-fdfdbfb2cb86.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,a0f445dc-1961-43b9-a7ff-fdfdbfb2cb86.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a0f445dc-1961-43b9-a7ff-fdfdbfb2cb86</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Notizen, Dokumente oder Dateien werden in Dynamics AX mithilfe des “Dokumentenmanagement-Systems”
verwaltet.
</p>
        <p>
Zu jedem beliebigen Datensatz einer beliebigen Tabelle (z.B. CustTable -&gt; Debitoren)
können beliebig viele Notizen oder Dokumente hinterlegt werden.<br />
Per Benutzeroberfläche kann die entsprechende Funktionalität über die Menüleiste der
Masken aufgerufen werden.
</p>
        <p>
Das folgende Beispiel zeigt wie dies auch per Programmcode erfolgen kann:
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">static</span>
            <span class="kwrd">void</span> AKU_CreateDocuRefNote(Args
_args)</pre>
          <pre>{</pre>
          <pre class="alt">    CustTable       custTable;</pre>
          <pre>    DocuRef         docuRef;</pre>
          <pre class="alt">    DocuType        docuType;</pre>
          <pre>    ;</pre>
          <pre class="alt">    custTable = CustTable::find(<span class="str">"1101"</span>);</pre>
          <pre>    docuType  = DocuType::find(<span class="str">"Note"</span>);</pre>
          <pre class="alt">
          </pre>
          <pre>
            <span class="kwrd">if</span>(custTable &amp;&amp; docuType)</pre>
          <pre class="alt">    {</pre>
          <pre>        docuRef.initValue();</pre>
          <pre class="alt">
          </pre>
          <pre>        docuRef.RefTableId   = custTable.TableId;</pre>
          <pre class="alt">        docuRef.RefRecId     = custTable.RecId;</pre>
          <pre>        docuRef.RefCompanyId = custTable.dataAreaId;</pre>
          <pre class="alt"> </pre>
          <pre>        docuRef.TypeId       = docuType.TypeId;</pre>
          <pre class="alt">
          </pre>
          <pre>        docuRef.Restriction  = DocuRestriction::External;</pre>
          <pre class="alt">
          </pre>
          <pre>        docuRef.Name         = <span class="str">"Name der Notiz"</span>;</pre>
          <pre class="alt">        docuRef.Notes        = <span class="str">"Text (Inhalt) der
Notiz"</span>;</pre>
          <pre>        docuRef.insert();</pre>
          <pre class="alt">    }</pre>
          <pre>}</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=a0f445dc-1961-43b9-a7ff-fdfdbfb2cb86" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Dynamics AX - Erstellen von Notizen</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,a0f445dc-1961-43b9-a7ff-fdfdbfb2cb86.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,a0f445dc-1961-43b9-a7ff-fdfdbfb2cb86.aspx</link>
      <pubDate>Fri, 22 Jan 2010 18:29:40 GMT</pubDate>
      <description>&lt;p&gt;
Notizen, Dokumente oder Dateien werden in Dynamics AX mithilfe des “Dokumentenmanagement-Systems”
verwaltet.
&lt;/p&gt;
&lt;p&gt;
Zu jedem beliebigen Datensatz einer beliebigen Tabelle (z.B. CustTable -&amp;gt; Debitoren)
können beliebig viele Notizen oder Dokumente hinterlegt werden.&lt;br&gt;
Per Benutzeroberfläche kann die entsprechende Funktionalität über die Menüleiste der
Masken aufgerufen werden.
&lt;/p&gt;
&lt;p&gt;
Das folgende Beispiel zeigt wie dies auch per Programmcode erfolgen kann:
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;static&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; AKU_CreateDocuRefNote(Args
_args)&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    CustTable       custTable;&lt;/pre&gt;
&lt;pre&gt;    DocuRef         docuRef;&lt;/pre&gt;
&lt;pre class=alt&gt;    DocuType        docuType;&lt;/pre&gt;
&lt;pre&gt;    ;&lt;/pre&gt;
&lt;pre class=alt&gt;    custTable = CustTable::find(&lt;span class=str&gt;"1101"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;    docuType  = DocuType::find(&lt;span class=str&gt;"Note"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;/pre&gt;
&lt;pre&gt;    &lt;span class=kwrd&gt;if&lt;/span&gt;(custTable &amp;amp;&amp;amp; docuType)&lt;/pre&gt;
&lt;pre class=alt&gt;    {&lt;/pre&gt;
&lt;pre&gt;        docuRef.initValue();&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;/pre&gt;
&lt;pre&gt;        docuRef.RefTableId   = custTable.TableId;&lt;/pre&gt;
&lt;pre class=alt&gt;        docuRef.RefRecId     = custTable.RecId;&lt;/pre&gt;
&lt;pre&gt;        docuRef.RefCompanyId = custTable.dataAreaId;&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;        docuRef.TypeId       = docuType.TypeId;&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;/pre&gt;
&lt;pre&gt;        docuRef.Restriction  = DocuRestriction::External;&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;/pre&gt;
&lt;pre&gt;        docuRef.Name         = &lt;span class=str&gt;"Name der Notiz"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class=alt&gt;        docuRef.Notes        = &lt;span class=str&gt;"Text (Inhalt) der Notiz"&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;        docuRef.insert();&lt;/pre&gt;
&lt;pre class=alt&gt;    }&lt;/pre&gt;
&lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=a0f445dc-1961-43b9-a7ff-fdfdbfb2cb86" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,a0f445dc-1961-43b9-a7ff-fdfdbfb2cb86.aspx</comments>
      <category>Dynamics Ax;Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=6395e9fa-5f88-4509-a72e-0df74954fddf</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,6395e9fa-5f88-4509-a72e-0df74954fddf.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,6395e9fa-5f88-4509-a72e-0df74954fddf.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6395e9fa-5f88-4509-a72e-0df74954fddf</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Für Debitoren (Kunden) kann in Microsoft Dynamics AX ein Kreditlimit vergeben/eingestellt
werden.
</p>
        <p>
In der Auftragsmaske wird bei Anlage eines Auftrag (in Abhängigkeit der Kreditlimit-Einstellungen)
das verbleibende Kreditlimit berechnet und der Auftragswert gegen dieses geprüft.<br />
Bei Überschreitung des Kreditlimits wird eine entsprechende Warnung oder ein entsprechender
Fehler ausgegeben.
</p>
        <p>
Die Funktion zur Überprüfung des Kreditlimits kann auch manuell, durch  eine
entsprechende Funktion auf der Auftragsmaske, aufgerufen werden.
</p>
        <p>
Soll das verbleibende Kreditlimit mit X++ Code berechnet werden, muss leider eine
“Kleinigkeit” beachtet werden, die so auf den ersten Blick nicht immer ersichtlich
ist bzw. für Verwirrung sorgen kann.
</p>
        <p>
Die Berechnung des verfügbaren Kreditrahmens oder des verbleibenden Kreditlimits ist
durch die alleinige Angabe eines Debitors nicht möglich.<br />
Es muss immer ein entsprechender Auftrag “vorhanden” sein um diese auszuführen zu
können.
</p>
        <p>
Berechtigterweise stellt sich die Frage, wie das verbleibende Kreditlimit eines Debitors
berechnet werden kann, wenn keine “Beziehung” zu einem Auftrag besteht bzw. wenn kein
Auftrag angegeben werden kann.<br />
Hierfür muss ein kleiner “Trick” angewendet werden, der nichts anderes macht, als
einen neuen “SalesTable” Datensatz zu initialisieren, diesen aber nicht zu speichern.<br />
Ist der “SalesTable” Datensatz initialisiert kann mithilfe der beiden Klassen “SalesTotals”
und “CustCreditLimit” der verfügbare Kreditrahmen berechnet werden.
</p>
        <p>
Beispiel:
</p>
        <div class="csharpcode">
          <pre class="alt">    CustTable               custTable = CustTable::find(<span class="str">"1101"</span>);</pre>
          <pre>    CustCreditLimit         custCreditLimit;</pre>
          <pre class="alt">    SalesTotals             salesTotals;</pre>
          <pre>    SalesTable              salesTable;</pre>
          <pre class="alt">    AmountMST               balanceEstimate;</pre>
          <pre>    AmountMst               creditRemain;</pre>
          <pre class="alt">    ;</pre>
          <pre>    salesTable.CustAccount  = custTable.AccountNum;</pre>
          <pre class="alt">    salesTable.initFromCustTable();</pre>
          <pre> </pre>
          <pre class="alt">    salesTotals = SalesTotals::construct(salesTable);</pre>
          <pre>    salesTotals.calc();</pre>
          <pre class="alt"> </pre>
          <pre>    custCreditLimit = CustCreditLimit::construct(salesTable);</pre>
          <pre class="alt">    balanceEstimate = custCreditLimit.balanceEstimate();</pre>
          <pre>
            <span class="kwrd">if</span>(custCreditLimit.useEstimated())</pre>
          <pre class="alt">    {</pre>
          <pre>        creditRemain -= balanceEstimate;</pre>
          <pre class="alt">    }</pre>
          <pre> </pre>
          <pre class="alt">    creditRemain += conpeek(salesTotals.displayFieldsCurrency(CustTable.Currency), TradeTotals::posFreeValue());</pre>
          <pre> </pre>
          <pre class="alt"> </pre>
          <pre>    info(strfmt(<span class="str">"Verbleibendes Kreditlimit: %1"</span>, creditRemain));</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=6395e9fa-5f88-4509-a72e-0df74954fddf" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Ermittlung des verbleibenden Kreditlimits</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,6395e9fa-5f88-4509-a72e-0df74954fddf.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,6395e9fa-5f88-4509-a72e-0df74954fddf.aspx</link>
      <pubDate>Wed, 30 Dec 2009 10:16:18 GMT</pubDate>
      <description>&lt;p&gt;
Für Debitoren (Kunden) kann in Microsoft Dynamics AX ein Kreditlimit vergeben/eingestellt
werden.
&lt;/p&gt;
&lt;p&gt;
In der Auftragsmaske wird bei Anlage eines Auftrag (in Abhängigkeit der Kreditlimit-Einstellungen)
das verbleibende Kreditlimit berechnet und der Auftragswert gegen dieses geprüft.&lt;br&gt;
Bei Überschreitung des Kreditlimits wird eine entsprechende Warnung oder ein entsprechender
Fehler ausgegeben.
&lt;/p&gt;
&lt;p&gt;
Die Funktion zur Überprüfung des Kreditlimits kann auch manuell, durch&amp;nbsp; eine
entsprechende Funktion auf der Auftragsmaske, aufgerufen werden.
&lt;/p&gt;
&lt;p&gt;
Soll das verbleibende Kreditlimit mit X++ Code berechnet werden, muss leider eine
“Kleinigkeit” beachtet werden, die so auf den ersten Blick nicht immer ersichtlich
ist bzw. für Verwirrung sorgen kann.
&lt;/p&gt;
&lt;p&gt;
Die Berechnung des verfügbaren Kreditrahmens oder des verbleibenden Kreditlimits ist
durch die alleinige Angabe eines Debitors nicht möglich.&lt;br&gt;
Es muss immer ein entsprechender Auftrag “vorhanden” sein um diese auszuführen zu
können.
&lt;/p&gt;
&lt;p&gt;
Berechtigterweise stellt sich die Frage, wie das verbleibende Kreditlimit eines Debitors
berechnet werden kann, wenn keine “Beziehung” zu einem Auftrag besteht bzw. wenn kein
Auftrag angegeben werden kann.&lt;br&gt;
Hierfür muss ein kleiner “Trick” angewendet werden, der nichts anderes macht, als
einen neuen “SalesTable” Datensatz zu initialisieren, diesen aber nicht zu speichern.&lt;br&gt;
Ist der “SalesTable” Datensatz initialisiert kann mithilfe der beiden Klassen “SalesTotals”
und “CustCreditLimit” der verfügbare Kreditrahmen berechnet werden.
&lt;/p&gt;
&lt;p&gt;
Beispiel:
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;    CustTable               custTable = CustTable::find(&lt;span class=str&gt;"1101"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;    CustCreditLimit         custCreditLimit;&lt;/pre&gt;
&lt;pre class=alt&gt;    SalesTotals             salesTotals;&lt;/pre&gt;
&lt;pre&gt;    SalesTable              salesTable;&lt;/pre&gt;
&lt;pre class=alt&gt;    AmountMST               balanceEstimate;&lt;/pre&gt;
&lt;pre&gt;    AmountMst               creditRemain;&lt;/pre&gt;
&lt;pre class=alt&gt;    ;&lt;/pre&gt;
&lt;pre&gt;    salesTable.CustAccount  = custTable.AccountNum;&lt;/pre&gt;
&lt;pre class=alt&gt;    salesTable.initFromCustTable();&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;    salesTotals = SalesTotals::construct(salesTable);&lt;/pre&gt;
&lt;pre&gt;    salesTotals.calc();&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    custCreditLimit = CustCreditLimit::construct(salesTable);&lt;/pre&gt;
&lt;pre class=alt&gt;    balanceEstimate = custCreditLimit.balanceEstimate();&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=kwrd&gt;if&lt;/span&gt;(custCreditLimit.useEstimated())&lt;/pre&gt;
&lt;pre class=alt&gt;    {&lt;/pre&gt;
&lt;pre&gt;        creditRemain -= balanceEstimate;&lt;/pre&gt;
&lt;pre class=alt&gt;    }&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;    creditRemain += conpeek(salesTotals.displayFieldsCurrency(CustTable.Currency), TradeTotals::posFreeValue());&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    info(strfmt(&lt;span class=str&gt;"Verbleibendes Kreditlimit: %1"&lt;/span&gt;, creditRemain));&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=6395e9fa-5f88-4509-a72e-0df74954fddf" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,6395e9fa-5f88-4509-a72e-0df74954fddf.aspx</comments>
      <category>Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=6fdc3bfb-c749-43ab-9f38-ee298c5ef6ff</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,6fdc3bfb-c749-43ab-9f38-ee298c5ef6ff.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,6fdc3bfb-c749-43ab-9f38-ee298c5ef6ff.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6fdc3bfb-c749-43ab-9f38-ee298c5ef6ff</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Am 23. und 24. November 2009 fand der Dynamics Technical Airlift 2009 im Hotel
The Westin Grand München Arabellapark in München statt.<br />
Wie auch schon im letzten Jahr, richtete sich die Veranstaltung an die eher technisch
ausgerichteten Personen (Consultants/Entwickler) aus der Dynamics-Partner-Gemeinde
(Dynamics AX, Dynamics NAV und Dynamics CRM). 
</p>
        <p>
          <table border="0" cellspacing="0" cellpadding="0" width="100%">
            <tbody>
              <tr>
                <td valign="top" width="70%">
                  <p>
Ich selbst durfte in diesem Jahr wieder als ATE (Ask the Expert) an dieser Veranstaltung
teilnehmen und mich u.a. in einer eigenen Session, zusammen mit den anderen Experten,
den Fragen der Teilnehmer “stellen”.
</p>
                  <p>
Wie schon in den letzten Jahren, gab es viele produktbezogene “Break-Out-Sessions”,
die sich in diesem Jahr erstmals nicht nur mit technischen Themen befassten.<br />
Insgesamt denke ich, dass es wieder eine gelungene Veranstaltung war. Sicherlich waren
einige Session für den einen oder anderen nicht in der gewünschte technische Tiefe,
lieferten aber einen guten "Know-How Refresh".<br />
Es ist meist auch schwer, mit einer speziellen Session oder einem speziellen
Thema, bei einer solch großen Veranstalltung, immer jeden ansprechen zu können.<br />
Ich hatte jedenfalls das Gefühl, dass, gerade für Einsteiger oder “Jung-Professionals”,
wirklich gute Themen behandelt wurden.
</p>
                  <p>
Durch den gemeinsamen Informationsaustausch, u.a. auch durch den ATE-Stand, und die
vielen Gespräche mit Personen aus der Dynamics-Gemeinde wurde die Veranstaltung positiv
abgerundet.
</p>
                </td>
                <td valign="top" width="30%" align="middle">
                  <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsTechnicalAirlift2009Rckblick_F6BA/ATE_AIrlift2009_2.jpg" target="_blank">
                    <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="ATE_AIrlift2009" border="0" alt="ATE_AIrlift2009" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsTechnicalAirlift2009Rckblick_F6BA/ATE_AIrlift2009_thumb.jpg" width="244" height="166" />
                  </a>
                </td>
              </tr>
            </tbody>
          </table>
        </p>
        <p>
Da Meinungen ja bekanntlich weit auseinander gehen, möchte ich jeden einzelnen bitten,
seine Eindrücke und Meinungen zu dem Dynamics Technical Airlift 2009 kurz zu schildern.<br />
Besonders die Meinungen über die “Ask-The-Expert Session”, welche am ersten Tag statt
fand würden mich interessieren.
</p>
        <p>
Wer dies nicht "öffentlich", z.B. durch die Kommentarfunktion machen möchte, kann
mir auch gerne eine Email schreiben (<a href="javascript:var e1='%61%6b%2d%68%6f%6d%65%2e%6e%65%74',e2='mailto: ', e3='%6b%75%65%68%6e';var e0=e2+e3+'%40'+e1+'?Subject=Comments on: Aku\'s Ax Blog - Dynamics Airlift 2009';(window.location?window.location.replace(e0):document.write(e0));">Email
me</a>).<br />
Bitte beachtet, dass alle Kommentare erst durch mich "überprüft" werden müssen, bevor
sie angezeigt werden.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=6fdc3bfb-c749-43ab-9f38-ee298c5ef6ff" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Dynamics Technical Airlift 2009 - R&amp;uuml;ckblick</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,6fdc3bfb-c749-43ab-9f38-ee298c5ef6ff.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,6fdc3bfb-c749-43ab-9f38-ee298c5ef6ff.aspx</link>
      <pubDate>Sat, 28 Nov 2009 16:55:50 GMT</pubDate>
      <description>&lt;p&gt;
Am 23. und 24. November 2009 fand der Dynamics Technical Airlift 2009 im&amp;nbsp;Hotel
The Westin Grand München Arabellapark in München statt.&lt;br&gt;
Wie auch schon im letzten Jahr, richtete sich die Veranstaltung an die eher technisch
ausgerichteten Personen (Consultants/Entwickler) aus der Dynamics-Partner-Gemeinde
(Dynamics AX, Dynamics NAV und Dynamics CRM). 
&lt;/p&gt;
&lt;p&gt;
&lt;table border=0 cellspacing=0 cellpadding=0 width="100%"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=top width="70%"&gt;
&lt;p&gt;
Ich selbst durfte in diesem Jahr wieder als ATE (Ask the Expert) an dieser Veranstaltung
teilnehmen und mich u.a. in einer eigenen Session, zusammen mit den anderen Experten,
den Fragen der Teilnehmer “stellen”.
&lt;/p&gt;
&lt;p&gt;
Wie schon in den letzten Jahren, gab es viele produktbezogene “Break-Out-Sessions”,
die sich in diesem Jahr erstmals nicht nur mit technischen Themen befassten.&lt;br&gt;
Insgesamt denke ich, dass es wieder eine gelungene Veranstaltung war. Sicherlich waren
einige Session für den einen oder anderen nicht in der gewünschte technische Tiefe,
lieferten aber einen guten "Know-How Refresh".&lt;br&gt;
Es ist&amp;nbsp;meist auch schwer, mit einer speziellen Session oder einem speziellen
Thema, bei einer solch großen Veranstalltung, immer jeden ansprechen zu können.&lt;br&gt;
Ich hatte jedenfalls das Gefühl, dass, gerade für Einsteiger oder “Jung-Professionals”,
wirklich gute Themen behandelt wurden.
&lt;/p&gt;
&lt;p&gt;
Durch den gemeinsamen Informationsaustausch, u.a. auch durch den ATE-Stand, und die
vielen Gespräche mit Personen aus der Dynamics-Gemeinde wurde die Veranstaltung positiv
abgerundet.
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign=top width="30%" align=middle&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsTechnicalAirlift2009Rckblick_F6BA/ATE_AIrlift2009_2.jpg" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=ATE_AIrlift2009 border=0 alt=ATE_AIrlift2009 src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/DynamicsTechnicalAirlift2009Rckblick_F6BA/ATE_AIrlift2009_thumb.jpg" width=244 height=166&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
Da Meinungen ja bekanntlich weit auseinander gehen, möchte ich jeden einzelnen bitten,
seine Eindrücke und Meinungen zu dem Dynamics Technical Airlift 2009 kurz zu schildern.&lt;br&gt;
Besonders die Meinungen über die “Ask-The-Expert Session”, welche am ersten Tag statt
fand würden mich interessieren.
&lt;/p&gt;
&lt;p&gt;
Wer dies nicht "öffentlich", z.B. durch die Kommentarfunktion machen möchte, kann
mir auch gerne eine Email schreiben (&lt;a href="javascript:var e1='%61%6b%2d%68%6f%6d%65%2e%6e%65%74',e2='mailto: ', e3='%6b%75%65%68%6e';var e0=e2+e3+'%40'+e1+'?Subject=Comments on: Aku\'s Ax Blog - Dynamics Airlift 2009';(window.location?window.location.replace(e0):document.write(e0));"&gt;Email
me&lt;/a&gt;).&lt;br&gt;
Bitte beachtet, dass alle Kommentare erst durch mich "überprüft" werden müssen, bevor
sie angezeigt werden.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=6fdc3bfb-c749-43ab-9f38-ee298c5ef6ff" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,6fdc3bfb-c749-43ab-9f38-ee298c5ef6ff.aspx</comments>
      <category>Allgemein;Dynamics Ax</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=463091a5-37b1-4375-9b57-6501ff8a1962</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,463091a5-37b1-4375-9b57-6501ff8a1962.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,463091a5-37b1-4375-9b57-6501ff8a1962.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=463091a5-37b1-4375-9b57-6501ff8a1962</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In Microsoft Dynamics AX beziehen Masken ihre Daten, oder anders gesagt die Daten
welche sie anzeigen, über so genannte DataSources.<br />
In einer DataSource sind somit die aktuellen auf der Maske angezeigten Daten (lokal)
gespeichert.
</p>
        <p>
Zugriff auf den jeweils aktuell ausgewählten Datensatz erhält man üblicherweise über
genau diese DataSource.<br />
Der ausgewählte Datensatz kann unter anderem auch, z.B. durch ein MenuItem(Button),
an eine Funktion oder andere Maske übergeben werden.<br />
Hierfür muss nur die Eigenschaft “DataSource”, in diesem Beispiel des MenuItem(Button),
entsprechend eingestellt sein.
</p>
        <p>
Ist keine DataSource in den Eigenschaften hinterlegt wird immer die erste DataSource
der Query verwendet bzw. dessen aktiver Datensatz übergeben.<br />
In der Regel ist dies die DataSource, welche beim Erstellen der Maske als erstes hinzugefügt
oder erstellt wurde (Ausnahme ist hier eine eventuelle Manipulation der Query per
Programmcode).
</p>
        <p>
Dieses Vorgehen ist für 90% aller Fälle das wohl am besten geeignete Vorgehen und
wird in dieser Weise auch vom Dynamics AX Standard verwendet.<br />
Leider gibt es Anwendungsfälle, bei denen diese “starre Verbindung” von DataSource
und z.B. Button oder MenuItem nicht funktioniert, beziehungsweise nicht zum gewünschten
Ergebnis führt.
</p>
        <p>
Angenommen man hat eine Maske mit zwei DataSources (CustTable und SalesTable), deren
Daten über zwei Grids angezeigt werden, sowie einen Button, welcher eine Operation
mit dem zuletzt ausgewählten Datensatz (unabhängig von der DataSource) durchführen
soll.<br />
Wenn ein Datensatz der DataSource “CustTable” selektiert wurde, soll dieser verarbeitet
werden.<br />
Ist zuletzt ein Datensatz der DataSource “SalesTable” selektiert wurden, soll die
Operation mit diesem Datensatz erfolgen.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_2.jpg" target="_blank">
            <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Maske" border="0" alt="Maske" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_thumb.jpg" width="187" height="244" />
          </a>
        </p>
        <p>
Bei dieser Anforderung ergibt sich das Problem, dass die Standardvorgehensweise zur
Abfrage des selektierten Datensatzes nicht funktioniert, da hierfür eine der DataSources
“direkt” angesprochen werden muss.<br />
Welche DataSource nun aber die “aktive” ist, lässt sich leider nicht ermitteln, da
standardmäßig jede DataSource einen “aktiven” Datensatz hat und somit eine Unterscheidung,
ob der Aufruf für die “CustTable” oder “SalesTable” erfolgen soll, nicht möglich ist.
</p>
        <p>
Über die Methode “docCursor” der Klasse FormRun bietet sich eine zweite Möglichkeit,
den aktiven (ausgewählten) Datensatz zu ermitteln.<br />
Dieses Vorgehen wird z.B. vom Dokumentenmangement (Form “DocuView”) verwendet, um
den zuletzt gewählten Datensatz zu ermitteln und somit die dem Datensatz zugeordneten
Dokumente anzuzeigen.
</p>
        <p>
Leider scheidet dieser Weg ebenfalls aus, da ein “Click” auf den Button zur Folge
hat, dass der jeweils aktive Datensatz der “Button-DataSource” durch die Methode “docCursor”
zurück geben wird.<br />
Dies ist soweit auch logisch, da ein Button immer einer DataSource zugeordnet ist
(entweder über Angabe in der entsprechenden Eigenschaft des Buttons oder, wenn nicht
festgelegt, die erste DataSource der Query). 
</p>
        <p>
Wie ist es nun aber möglich, dennoch den zuletzt selektierten (ausgewählten) Datensatz
zu ermitteln, wenn die im Standard verwendeten Wege nicht funktionieren?
</p>
        <p>
Um das gewünschte Ziel zu erfüllen (bestimmen, welcher der zuletzt selektierte Datensatz
ist) muss eine kleine funktionale Erweiterung der “Info” Klasse durchgeführt werden.
</p>
        <p>
Zuerst müssen in der “classDeclaration” der Klasse “Info” zwei neue Variablen/Buffer
zum Speichern des selektierten Datensatzes erstellt werden. 
<br /></p>
        <div class="csharpcode">
          <pre class="alt">final <span class="kwrd">class</span> Info
extends xInfo</pre>
          <pre>{</pre>
          <pre class="alt">    #SysTaskRecorderMacro</pre>
          <pre> </pre>
          <pre class="alt">    ObjectIdent         docuView;</pre>
          <pre>    ObjectIdent         lastActivatedForm;</pre>
          <pre class="alt"> </pre>
          <pre>    ...</pre>
          <pre class="alt"> </pre>
          <pre>
            <span class="rem">// New code --&gt; </span>
          </pre>
          <pre class="alt">    Common                  lastSelectedRecord;</pre>
          <pre>    Common                  selectedRecord;</pre>
          <pre class="alt">
            <span class="rem">//New code &lt;--</span>
          </pre>
          <pre> </pre>
          <pre class="alt">    #Define.CurrentVersion(1)</pre>
          <pre>}</pre>
          <pre> </pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
Nun müssen noch einige neue Methoden für die Klasse “Info” erstellt werden, damit
die Variablen/Buffer geschrieben, abgefragt und gelöscht werden können.<br /></p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> setLastSelectedRecord(FormRun
_formRun)</pre>
          <pre>{</pre>
          <pre class="alt">    ;</pre>
          <pre>
            <span class="kwrd">if</span>(_formRun.docCursor())</pre>
          <pre class="alt">    {</pre>
          <pre>
            <span class="kwrd">if</span>(lastSelectedRecord)</pre>
          <pre class="alt">        {</pre>
          <pre>            lastSelectedRecord = selectedRecord;</pre>
          <pre class="alt">        }</pre>
          <pre>
            <span class="kwrd">else</span>
          </pre>
          <pre class="alt">        {</pre>
          <pre>
            <span class="rem">//Only get the record data, not the cursor</span>
          </pre>
          <pre class="alt">            lastSelectedRecord = _formRun.docCursor().data();</pre>
          <pre>        }</pre>
          <pre class="alt"> </pre>
          <pre>
            <span class="rem">//Only get the record data, not the cursor</span>
          </pre>
          <pre class="alt">        selectedRecord = _formRun.docCursor().data();</pre>
          <pre>    }</pre>
          <pre class="alt">}</pre>
        </div>
        <div class="csharpcode"> 
</div>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> clearLastSelectedRecord()</pre>
          <pre>{</pre>
          <pre class="alt">    ;</pre>
          <pre>    lastSelectedRecord.clear();</pre>
          <pre class="alt">    selectedRecord.clear();</pre>
          <pre>}</pre>
          <pre> </pre>
          <div class="csharpcode">
            <pre class="alt">common lastSelectedRecord()</pre>
            <pre>{</pre>
            <pre class="alt">    ;</pre>
            <pre>
              <span class="kwrd">return</span> lastSelectedRecord;</pre>
            <pre class="alt">}</pre>
          </div>
          <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        </div>
        <p>
 
</p>
        <p>
Zum Schluss müssen diese neu erstellten Methoden noch entsprechend in der Methode
“formNotify” aufgerufen werden.
</p>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">void</span> formNotify(FormRun
formRun,FormNotify <span class="kwrd">event</span>)</pre>
          <pre>{</pre>
          <pre class="alt">
            <span class="kwrd">switch</span> (<span class="kwrd">event</span>)</pre>
          <pre>    {</pre>
          <pre class="alt">
            <span class="kwrd">case</span> FormNotify::Activate:</pre>
          <pre>
            <span class="kwrd">this</span>.activate(formRun);</pre>
          <pre class="alt">
            <span class="kwrd">if</span> (docu)</pre>
          <pre>                docu.reSearch(formRun);</pre>
          <pre class="alt">
            <span class="rem">//New code --&gt;</span>
          </pre>
          <pre>
            <span class="kwrd">this</span>.setLastSelectedRecord(formRun);</pre>
          <pre class="alt">
            <span class="rem">//New code &lt;--</span>
          </pre>
          <pre>
            <span class="kwrd">break</span>;</pre>
          <pre class="alt">
            <span class="kwrd">case</span> FormNotify::DeActivate:</pre>
          <pre>
            <span class="kwrd">break</span>;</pre>
          <pre class="alt">
            <span class="kwrd">case</span> FormNotify::Open:</pre>
          <pre>
            <span class="kwrd">this</span>.open(formRun);</pre>
          <pre class="alt">
            <span class="kwrd">if</span> (docu)</pre>
          <pre>                docu.set(formRun);</pre>
          <pre class="alt">
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="kwrd">case</span> FormNotify::Close:</pre>
          <pre class="alt">
            <span class="kwrd">this</span>.close(formRun);</pre>
          <pre>
            <span class="kwrd">if</span> (docu)</pre>
          <pre class="alt">                docu.clear(formRun);</pre>
          <pre>
            <span class="rem">//New code --&gt;</span>
          </pre>
          <pre class="alt">
            <span class="kwrd">this</span>.clearLastSelectedRecord();</pre>
          <pre>
            <span class="rem">//New code &lt;--</span>
          </pre>
          <pre class="alt">
            <span class="kwrd">break</span>;</pre>
          <pre>
            <span class="kwrd">case</span> FormNotify::RecordChange:</pre>
          <pre class="alt">
            <span class="kwrd">if</span> (docu)</pre>
          <pre>                docu.reSearch(formRun);</pre>
          <pre class="alt">
            <span class="rem">//New code --&gt;</span>
          </pre>
          <pre>
            <span class="kwrd">this</span>.setLastSelectedRecord(formRun);</pre>
          <pre class="alt">
            <span class="rem">//New code &lt;--</span>
          </pre>
          <pre> </pre>
          <pre class="alt">
            <span class="kwrd">if</span> (formRun.isWorkflowEnabled())</pre>
          <pre>            {</pre>
          <pre class="alt">
            <span class="rem">// only refresh controls if current
ds equals workflow data source</span>
          </pre>
          <pre>
            <span class="kwrd">if</span> (formRun.objectSet().name() == formRun.workflowDataSource().name())</pre>
          <pre class="alt">                    formRun.updateWorkflowControls();</pre>
          <pre>            }</pre>
          <pre class="alt"> </pre>
          <pre>
            <span class="kwrd">break</span>;</pre>
          <pre class="alt">
            <span class="kwrd">case</span> FormNotify::NoteClicked:</pre>
          <pre>
            <span class="kwrd">if</span> (docu)</pre>
          <pre class="alt">                docu.note(formRun);</pre>
          <pre>
            <span class="kwrd">break</span>;</pre>
          <pre class="alt">    }</pre>
          <pre>}</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <pre class="csharpcode">Durch diese kleine Codeänderung kann nun der zuletzt ausgewählte Datensatz, unabhängig von einer DataSource, abgefragt werden.<br /></pre>
        <div class="csharpcode">
          <pre class="alt">
            <span class="kwrd">void</span> clicked()</pre>
          <pre>{</pre>
          <pre class="alt">    Common      currentRecord;</pre>
          <pre>    DictTable   dictTable;</pre>
          <pre class="alt">    ;</pre>
          <pre>    super();</pre>
          <pre class="alt">
            <span class="rem">//Get the last selected record</span>
          </pre>
          <pre>    currentRecord = infolog.lastSelectedRecord();</pre>
          <pre class="alt"> </pre>
          <pre>    dictTable = <span class="kwrd">new</span> DictTable(currentRecord.TableId);</pre>
          <pre class="alt"> </pre>
          <pre>    setPrefix(tableid2name(currentRecord.TableId));</pre>
          <pre class="alt">    info(strfmt(<span class="str">"%1 - %2"</span>, currentRecord.(dictTable.titleField1()),
currentRecord.(dictTable.titleField2())));</pre>
          <pre>}</pre>
          <pre>
            <br />
Bezogen auf die zuvor beschrieben Anforderung könnte das Ergebnis so aussehen.</pre>
          <pre> </pre>
        </div>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_CustTable_2.jpg" target="_blank">
            <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Maske_CustTable" border="0" alt="Maske_CustTable" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_CustTable_thumb.jpg" width="244" height="184" />
          </a>  <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_SalesTable_2.jpg" target="_blank"><img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Maske_SalesTable" border="0" alt="Maske_SalesTable" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_SalesTable_thumb.jpg" width="244" height="184" /></a></p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=463091a5-37b1-4375-9b57-6501ff8a1962" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Microsoft Dynamics AX &amp;ndash; Den zuletzt ausgew&amp;auml;hlten Datensatz ermitteln</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,463091a5-37b1-4375-9b57-6501ff8a1962.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,463091a5-37b1-4375-9b57-6501ff8a1962.aspx</link>
      <pubDate>Sat, 24 Oct 2009 16:45:25 GMT</pubDate>
      <description>&lt;p&gt;
In Microsoft Dynamics AX beziehen Masken ihre Daten, oder anders gesagt die Daten
welche sie anzeigen, über so genannte DataSources.&lt;br&gt;
In einer DataSource sind somit die aktuellen auf der Maske angezeigten Daten (lokal)
gespeichert.
&lt;/p&gt;
&lt;p&gt;
Zugriff auf den jeweils aktuell ausgewählten Datensatz erhält man üblicherweise über
genau diese DataSource.&lt;br&gt;
Der ausgewählte Datensatz kann unter anderem auch, z.B. durch ein MenuItem(Button),
an eine Funktion oder andere Maske übergeben werden.&lt;br&gt;
Hierfür muss nur die Eigenschaft “DataSource”, in diesem Beispiel des MenuItem(Button),
entsprechend eingestellt sein.
&lt;/p&gt;
&lt;p&gt;
Ist keine DataSource in den Eigenschaften hinterlegt wird immer die erste DataSource
der Query verwendet bzw. dessen aktiver Datensatz übergeben.&lt;br&gt;
In der Regel ist dies die DataSource, welche beim Erstellen der Maske als erstes hinzugefügt
oder erstellt wurde (Ausnahme ist hier eine eventuelle Manipulation der Query per
Programmcode).
&lt;/p&gt;
&lt;p&gt;
Dieses Vorgehen ist für 90% aller Fälle das wohl am besten geeignete Vorgehen und
wird in dieser Weise auch vom Dynamics AX Standard verwendet.&lt;br&gt;
Leider gibt es Anwendungsfälle, bei denen diese “starre Verbindung” von DataSource
und z.B. Button oder MenuItem nicht funktioniert, beziehungsweise nicht zum gewünschten
Ergebnis führt.
&lt;/p&gt;
&lt;p&gt;
Angenommen man hat eine Maske mit zwei DataSources (CustTable und SalesTable), deren
Daten über zwei Grids angezeigt werden, sowie einen Button, welcher eine Operation
mit dem zuletzt ausgewählten Datensatz (unabhängig von der DataSource) durchführen
soll.&lt;br&gt;
Wenn ein Datensatz der DataSource “CustTable” selektiert wurde, soll dieser verarbeitet
werden.&lt;br&gt;
Ist zuletzt ein Datensatz der DataSource “SalesTable” selektiert wurden, soll die
Operation mit diesem Datensatz erfolgen.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_2.jpg" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Maske border=0 alt=Maske src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_thumb.jpg" width=187 height=244&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Bei dieser Anforderung ergibt sich das Problem, dass die Standardvorgehensweise zur
Abfrage des selektierten Datensatzes nicht funktioniert, da hierfür eine der DataSources
“direkt” angesprochen werden muss.&lt;br&gt;
Welche DataSource nun aber die “aktive” ist, lässt sich leider nicht ermitteln, da
standardmäßig jede DataSource einen “aktiven” Datensatz hat und somit eine Unterscheidung,
ob der Aufruf für die “CustTable” oder “SalesTable” erfolgen soll, nicht möglich ist.
&lt;/p&gt;
&lt;p&gt;
Über die Methode “docCursor” der Klasse FormRun bietet sich eine zweite Möglichkeit,
den aktiven (ausgewählten) Datensatz zu ermitteln.&lt;br&gt;
Dieses Vorgehen wird z.B. vom Dokumentenmangement (Form “DocuView”) verwendet, um
den zuletzt gewählten Datensatz zu ermitteln und somit die dem Datensatz zugeordneten
Dokumente anzuzeigen.
&lt;/p&gt;
&lt;p&gt;
Leider scheidet dieser Weg ebenfalls aus, da ein “Click” auf den Button zur Folge
hat, dass der jeweils aktive Datensatz der “Button-DataSource” durch die Methode “docCursor”
zurück geben wird.&lt;br&gt;
Dies ist soweit auch logisch, da ein Button immer einer DataSource zugeordnet ist
(entweder über Angabe in der entsprechenden Eigenschaft des Buttons oder, wenn nicht
festgelegt, die erste DataSource der Query). 
&lt;/p&gt;
&lt;p&gt;
Wie ist es nun aber möglich, dennoch den zuletzt selektierten (ausgewählten) Datensatz
zu ermitteln, wenn die im Standard verwendeten Wege nicht funktionieren?
&lt;/p&gt;
&lt;p&gt;
Um das gewünschte Ziel zu erfüllen (bestimmen, welcher der zuletzt selektierte Datensatz
ist) muss eine kleine funktionale Erweiterung der “Info” Klasse durchgeführt werden.
&lt;/p&gt;
&lt;p&gt;
Zuerst müssen in der “classDeclaration” der Klasse “Info” zwei neue Variablen/Buffer
zum Speichern des selektierten Datensatzes erstellt werden. 
&lt;br&gt;
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;final &lt;span class=kwrd&gt;class&lt;/span&gt; Info extends
xInfo&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    #SysTaskRecorderMacro&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;    ObjectIdent         docuView;&lt;/pre&gt;
&lt;pre&gt;    ObjectIdent         lastActivatedForm;&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    ...&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=rem&gt;// New code --&amp;gt; &lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;    Common                  lastSelectedRecord;&lt;/pre&gt;
&lt;pre&gt;    Common                  selectedRecord;&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=rem&gt;//New code &amp;lt;--&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;    #Define.CurrentVersion(1)&lt;/pre&gt;
&lt;pre&gt;}&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
Nun müssen noch einige neue Methoden für die Klasse “Info” erstellt werden, damit
die Variablen/Buffer geschrieben, abgefragt und gelöscht werden können.&lt;br&gt;
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;private&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; setLastSelectedRecord(FormRun
_formRun)&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    ;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=kwrd&gt;if&lt;/span&gt;(_formRun.docCursor())&lt;/pre&gt;
&lt;pre class=alt&gt;    {&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;if&lt;/span&gt;(lastSelectedRecord)&lt;/pre&gt;
&lt;pre class=alt&gt;        {&lt;/pre&gt;
&lt;pre&gt;            lastSelectedRecord = selectedRecord;&lt;/pre&gt;
&lt;pre class=alt&gt;        }&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;else&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;        {&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=rem&gt;//Only get the record data, not the cursor&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;            lastSelectedRecord = _formRun.docCursor().data();&lt;/pre&gt;
&lt;pre&gt;        }&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=rem&gt;//Only get the record data, not the cursor&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;        selectedRecord = _formRun.docCursor().data();&lt;/pre&gt;
&lt;pre&gt;    }&lt;/pre&gt;
&lt;pre class=alt&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;div class=csharpcode&gt;&amp;nbsp;
&lt;/div&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;private&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; clearLastSelectedRecord()&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    ;&lt;/pre&gt;
&lt;pre&gt;    lastSelectedRecord.clear();&lt;/pre&gt;
&lt;pre class=alt&gt;    selectedRecord.clear();&lt;/pre&gt;
&lt;pre&gt;}&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;common lastSelectedRecord()&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    ;&lt;/pre&gt;
&lt;pre&gt;    &lt;span class=kwrd&gt;return&lt;/span&gt; lastSelectedRecord;&lt;/pre&gt;
&lt;pre class=alt&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Zum Schluss müssen diese neu erstellten Methoden noch entsprechend in der Methode
“formNotify” aufgerufen werden.
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;void&lt;/span&gt; formNotify(FormRun
formRun,FormNotify &lt;span class=kwrd&gt;event&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=kwrd&gt;switch&lt;/span&gt; (&lt;span class=kwrd&gt;event&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;    {&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;case&lt;/span&gt; FormNotify::Activate:&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;this&lt;/span&gt;.activate(formRun);&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=kwrd&gt;if&lt;/span&gt; (docu)&lt;/pre&gt;
&lt;pre&gt;                docu.reSearch(formRun);&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=rem&gt;//New code --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;this&lt;/span&gt;.setLastSelectedRecord(formRun);&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=rem&gt;//New code &amp;lt;--&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;case&lt;/span&gt; FormNotify::DeActivate:&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;case&lt;/span&gt; FormNotify::Open:&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;this&lt;/span&gt;.open(formRun);&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=kwrd&gt;if&lt;/span&gt; (docu)&lt;/pre&gt;
&lt;pre&gt;                docu.set(formRun);&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=kwrd&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;case&lt;/span&gt; FormNotify::Close:&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=kwrd&gt;this&lt;/span&gt;.close(formRun);&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;if&lt;/span&gt; (docu)&lt;/pre&gt;
&lt;pre class=alt&gt;                docu.clear(formRun);&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=rem&gt;//New code --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=kwrd&gt;this&lt;/span&gt;.clearLastSelectedRecord();&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=rem&gt;//New code &amp;lt;--&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=kwrd&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;        &lt;span class=kwrd&gt;case&lt;/span&gt; FormNotify::RecordChange:&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=kwrd&gt;if&lt;/span&gt; (docu)&lt;/pre&gt;
&lt;pre&gt;                docu.reSearch(formRun);&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=rem&gt;//New code --&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;this&lt;/span&gt;.setLastSelectedRecord(formRun);&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=rem&gt;//New code &amp;lt;--&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;            &lt;span class=kwrd&gt;if&lt;/span&gt; (formRun.isWorkflowEnabled())&lt;/pre&gt;
&lt;pre&gt;            {&lt;/pre&gt;
&lt;pre class=alt&gt;                &lt;span class=rem&gt;// only refresh controls if current
ds equals workflow data source&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;                &lt;span class=kwrd&gt;if&lt;/span&gt; (formRun.objectSet().name() == formRun.workflowDataSource().name())&lt;/pre&gt;
&lt;pre class=alt&gt;                    formRun.updateWorkflowControls();&lt;/pre&gt;
&lt;pre&gt;            }&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class=alt&gt;        &lt;span class=kwrd&gt;case&lt;/span&gt; FormNotify::NoteClicked:&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;if&lt;/span&gt; (docu)&lt;/pre&gt;
&lt;pre class=alt&gt;                docu.note(formRun);&lt;/pre&gt;
&lt;pre&gt;            &lt;span class=kwrd&gt;break&lt;/span&gt;;&lt;/pre&gt;
&lt;pre class=alt&gt;    }&lt;/pre&gt;
&lt;pre&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;pre class=csharpcode&gt;Durch diese kleine Codeänderung kann nun der zuletzt ausgewählte Datensatz, unabhängig von einer DataSource, abgefragt werden.&lt;br&gt;
&lt;/pre&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;&lt;span class=kwrd&gt;void&lt;/span&gt; clicked()&lt;/pre&gt;
&lt;pre&gt;{&lt;/pre&gt;
&lt;pre class=alt&gt;    Common      currentRecord;&lt;/pre&gt;
&lt;pre&gt;    DictTable   dictTable;&lt;/pre&gt;
&lt;pre class=alt&gt;    ;&lt;/pre&gt;
&lt;pre&gt;    super();&lt;/pre&gt;
&lt;pre class=alt&gt;    &lt;span class=rem&gt;//Get the last selected record&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;    currentRecord = infolog.lastSelectedRecord();&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    dictTable = &lt;span class=kwrd&gt;new&lt;/span&gt; DictTable(currentRecord.TableId);&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;    setPrefix(tableid2name(currentRecord.TableId));&lt;/pre&gt;
&lt;pre class=alt&gt;    info(strfmt(&lt;span class=str&gt;"%1 - %2"&lt;/span&gt;, currentRecord.(dictTable.titleField1()),
currentRecord.(dictTable.titleField2())));&lt;/pre&gt;
&lt;pre&gt;}&lt;/pre&gt;
&lt;pre&gt;
&lt;br&gt;
Bezogen auf die zuvor beschrieben Anforderung könnte das Ergebnis so aussehen.&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_CustTable_2.jpg" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Maske_CustTable border=0 alt=Maske_CustTable src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_CustTable_thumb.jpg" width=244 height=184&gt;&lt;/a&gt;&amp;nbsp; &lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_SalesTable_2.jpg" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=Maske_SalesTable border=0 alt=Maske_SalesTable src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/MicrosoftDynamicsAXDenzuletztausgewhlten_10F66/Maske_SalesTable_thumb.jpg" width=244 height=184&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=463091a5-37b1-4375-9b57-6501ff8a1962" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,463091a5-37b1-4375-9b57-6501ff8a1962.aspx</comments>
      <category>Dynamics Ax;Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=d34c10cc-83a9-45fd-a24a-1ece9e40671d</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,d34c10cc-83a9-45fd-a24a-1ece9e40671d.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,d34c10cc-83a9-45fd-a24a-1ece9e40671d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=d34c10cc-83a9-45fd-a24a-1ece9e40671d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In Microsoft Dynamics AX existiert ein Feature, um Aufgaben (Jobs), welche durch entsprechende
Klassen bereit gestellt werden, zu planen und zu einem geplanten Zeitpunkt auszuführen.<br />
Dies wird in Dynamics AX als Stapelverarbeitung (Batch-Framework) bezeichnet.
</p>
        <p>
Jeder Stapelverarbeitungsauftrag verfügt über einen Status, der angibt, in welchem
“Zustand” sich der jeweilige Stapelverarbeitungsauftrag befindet.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs.jpg" target="_blank">
            <img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="BatchJobs" border="0" alt="BatchJobs" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs_thumb.jpg" width="244" height="81" />
          </a>
        </p>
        <p>
Über die Funktion, “Funktionen –&gt; Status ändern” kann dieser Status durch den Benutzer
geändert werden.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs_statusaendern_2.jpg" target="_blank">
            <img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="BatchJobs_statusaendern" border="0" alt="BatchJobs_statusaendern" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs_statusaendern_thumb.jpg" width="244" height="81" />
          </a>
        </p>
        <p>
Beim Auswählen des “neuen” Status ist leider ein wenig Vorsicht geboten, da bei einem
falschen Klick der gesamte Stapelverarbeitungsauftrag unbrauchbar gemacht werden kann.<br />
Drückt man zufällig nicht auf einen der durch die Maske angebotenen Werte, so wird
der Status der Stapelverarbeitungsauftrags gelöscht.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs_OhneStatus_2.jpg" target="_blank">
            <img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="BatchJobs_OhneStatus" border="0" alt="BatchJobs_OhneStatus" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs_OhneStatus_thumb.jpg" width="244" height="81" />
          </a>
        </p>
        <p>
Das unschöne hierbei ist, dass dieses “Status löschen “nicht mehr rückgängig gemacht
werden kann (jedenfalls nicht durch die Dynamics AX Masken).<br />
Bei dem Versuch, wieder einen korrekten Status zu vergeben (ebenfalls über die Funktion
“Status ändern”) wird leider nicht der gewünschte Status gesetzt, sondern eine Fehlermeldung
ausgegeben.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/Fehlermeldung_BatchStatus.jpg" target="_blank">
            <img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="Fehlermeldung_BatchStatus" border="0" alt="Fehlermeldung_BatchStatus" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/Fehlermeldung_BatchStatus_thumb.jpg" width="244" height="130" />
          </a>
        </p>
        <p>
Die einzige Möglichkeit, wieder eine korrekten Status zu setzten, besteht leider darin,
einen kleinen Job zu schreiben (mit X++), welcher den Status per Programmcode ändert.
</p>
        <p>
Ist gerade kein Entwickler “zur Hand”, besteht nur die Möglichkeit, den Stapelverarbeitungsauftrag
zu löschen und erneut anzulegen (dies kann aber von Fall zu Fall sehr aufwändig sein).
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=d34c10cc-83a9-45fd-a24a-1ece9e40671d" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Vorsicht beim Ändern des Status von Stapelverarbeitungsaufträgen</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,d34c10cc-83a9-45fd-a24a-1ece9e40671d.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,d34c10cc-83a9-45fd-a24a-1ece9e40671d.aspx</link>
      <pubDate>Mon, 19 Oct 2009 18:41:39 GMT</pubDate>
      <description>&lt;p&gt;
In Microsoft Dynamics AX existiert ein Feature, um Aufgaben (Jobs), welche durch entsprechende
Klassen bereit gestellt werden, zu planen und zu einem geplanten Zeitpunkt auszuführen.&lt;br&gt;
Dies wird in Dynamics AX als Stapelverarbeitung (Batch-Framework) bezeichnet.
&lt;/p&gt;
&lt;p&gt;
Jeder Stapelverarbeitungsauftrag verfügt über einen Status, der angibt, in welchem
“Zustand” sich der jeweilige Stapelverarbeitungsauftrag befindet.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs.jpg" target=_blank&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=BatchJobs border=0 alt=BatchJobs src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs_thumb.jpg" width=244 height=81&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Über die Funktion, “Funktionen –&amp;gt; Status ändern” kann dieser Status durch den Benutzer
geändert werden.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs_statusaendern_2.jpg" target=_blank&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=BatchJobs_statusaendern border=0 alt=BatchJobs_statusaendern src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs_statusaendern_thumb.jpg" width=244 height=81&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Beim Auswählen des “neuen” Status ist leider ein wenig Vorsicht geboten, da bei einem
falschen Klick der gesamte Stapelverarbeitungsauftrag unbrauchbar gemacht werden kann.&lt;br&gt;
Drückt man zufällig nicht auf einen der durch die Maske angebotenen Werte, so wird
der Status der Stapelverarbeitungsauftrags gelöscht.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs_OhneStatus_2.jpg" target=_blank&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=BatchJobs_OhneStatus border=0 alt=BatchJobs_OhneStatus src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/BatchJobs_OhneStatus_thumb.jpg" width=244 height=81&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Das unschöne hierbei ist, dass dieses “Status löschen “nicht mehr rückgängig gemacht
werden kann (jedenfalls nicht durch die Dynamics AX Masken).&lt;br&gt;
Bei dem Versuch, wieder einen korrekten Status zu vergeben (ebenfalls über die Funktion
“Status ändern”) wird leider nicht der gewünschte Status gesetzt, sondern eine Fehlermeldung
ausgegeben.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/Fehlermeldung_BatchStatus.jpg" target=_blank&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title=Fehlermeldung_BatchStatus border=0 alt=Fehlermeldung_BatchStatus src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/VorsichtbeimnderndesStatusvonStapelverar_11DAB/Fehlermeldung_BatchStatus_thumb.jpg" width=244 height=130&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Die einzige Möglichkeit, wieder eine korrekten Status zu setzten, besteht leider darin,
einen kleinen Job zu schreiben (mit X++), welcher den Status per Programmcode ändert.
&lt;/p&gt;
&lt;p&gt;
Ist gerade kein Entwickler “zur Hand”, besteht nur die Möglichkeit, den Stapelverarbeitungsauftrag
zu löschen und erneut anzulegen (dies kann aber von Fall zu Fall sehr aufwändig sein).
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=d34c10cc-83a9-45fd-a24a-1ece9e40671d" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,d34c10cc-83a9-45fd-a24a-1ece9e40671d.aspx</comments>
      <category>Allgemein;Dynamics Ax;Dynamics Ax/Administration;Dynamics AX/Dynamics AX 2009</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=b1d817ac-9fd1-4653-9994-3fc7cb02f4ec</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,b1d817ac-9fd1-4653-9994-3fc7cb02f4ec.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,b1d817ac-9fd1-4653-9994-3fc7cb02f4ec.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b1d817ac-9fd1-4653-9994-3fc7cb02f4ec</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wie bereits an mehreren Stellen angekündigt, hat Microsoft das HotFix Rollup 3 für
Microsoft Dynamics AX 2009 (RTM und SP1) veröffentlicht.
</p>
        <p>
Alle Microsoft Dynamics AX Kunden und Partner können das Hotfix Rollup über das Customer
Source bzw. Partner Source beziehen.
</p>
        <p>
          <a href="https://mbs.microsoft.com/knowledgebase/KBDisplay.aspx?scid=kb$en-us$974407&amp;wa=wsignin1.0">HotFix
Rollup 3 für Dynamics AX 2009 RTM</a> (KB974407)
</p>
        <p>
          <a href="https://mbs.microsoft.com/knowledgebase/KBDisplay.aspx?scid=kb$en-us$974409&amp;wa=wsignin1.0">HotFix
Rollup 3 für Dynamics AX 2009 SP1</a> (KB974409)
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=b1d817ac-9fd1-4653-9994-3fc7cb02f4ec" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Microsoft Dynamics AX 2009 Hotfix Rollup 3 erschienen</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,b1d817ac-9fd1-4653-9994-3fc7cb02f4ec.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,b1d817ac-9fd1-4653-9994-3fc7cb02f4ec.aspx</link>
      <pubDate>Thu, 01 Oct 2009 06:48:49 GMT</pubDate>
      <description>&lt;p&gt;
Wie bereits an mehreren Stellen angekündigt, hat Microsoft das HotFix Rollup 3 für
Microsoft Dynamics AX 2009 (RTM und SP1) veröffentlicht.
&lt;/p&gt;
&lt;p&gt;
Alle Microsoft Dynamics AX Kunden und Partner können das Hotfix Rollup über das Customer
Source bzw. Partner Source beziehen.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://mbs.microsoft.com/knowledgebase/KBDisplay.aspx?scid=kb$en-us$974407&amp;amp;wa=wsignin1.0"&gt;HotFix
Rollup 3 für Dynamics AX 2009 RTM&lt;/a&gt; (KB974407)
&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://mbs.microsoft.com/knowledgebase/KBDisplay.aspx?scid=kb$en-us$974409&amp;amp;wa=wsignin1.0"&gt;HotFix
Rollup 3 für Dynamics AX 2009 SP1&lt;/a&gt; (KB974409)
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=b1d817ac-9fd1-4653-9994-3fc7cb02f4ec" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,b1d817ac-9fd1-4653-9994-3fc7cb02f4ec.aspx</comments>
      <category>Allgemein;Dynamics Ax;Dynamics Ax/Administration;Dynamics AX/Dynamics AX 2009</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=337a6675-9f17-45f8-b620-c47081ec4e8e</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,337a6675-9f17-45f8-b620-c47081ec4e8e.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,337a6675-9f17-45f8-b620-c47081ec4e8e.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=337a6675-9f17-45f8-b620-c47081ec4e8e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In mehreren Artikeln wurde bereits beschrieben, wie LookupForms erstellt werden müssen,
um alle Funktionen bereit zu stellen, die auch durch einen Standard-Lookup bereit
gestellt werden.
</p>
        <p>
Ein guter <a href="http://axaptapedia.com/Lookup_Form">Artikel</a> ist zum Beispiel
auf <a href="http://axaptapedia.com">Axaptapedia</a> zu finden:<br /><a href="http://axaptapedia.com/Lookup_Form">http://axaptapedia.com/Lookup_Form</a></p>
        <p>
Leider wurde in diesem Artikel auf eine Kleinigkeit nicht hingewiesen, die allerdings
für sehr viel Verwirrung sorgen kann.
</p>
        <p>
Um beim Öffnen des Lookups den bereits eingetragenen Wert zu selektieren (in dem Control
der aufrufenden Maske), müssen wie in dem Artikel beschrieben, die Methoden „executeQuery“
und „init“ der DataSource der Lookup-Maske überschrieben werden.
</p>
        <p>
Beispiel:
</p>
        <p>
        </p>
        <pre class="csharpcode">
          <span class="kwrd">public</span>
          <span class="kwrd">void</span> executeQuery()
{ FormStringControl callerControl = SysTableLookup::getCallerStringControl(element.args());
; super(); xyz_ds.findValue(fieldnum(xyz,id),callerControl.text()); } <span class="kwrd">public</span><span class="kwrd">void</span> init()
{ Query q = <span class="kwrd">new</span> Query(); QueryBuildDataSource qbds; ; super();
qbds = q.addDataSource(tablenum(xyz)); qbds.orderMode(OrderMode::OrderBy); qbds.addSortField(fieldNum(xyz,some_other_field)); <span class="kwrd">this</span>.query(q);
} </pre>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
        </p>
        <p>
Es wird auch beschrieben, dass in der Methode “init” der Datasource eigene Ranges
oder Sortings definiert werden können.<br />
Dies ist soweit auch richtig, allerdings mit einer Ausnahme.
</p>
        <p>
Wird auf dem Feld, welches bei dem Aufruf von „Datasource.findValue“ in der Methode
„init“ angegeben wurde (sollte auch immer das Feld sein, dessen Wert durch den Lookup
ausgewählt wird), eine Range definiert, so funktioniert die Selektion des zuvor gewählten
Wertes nicht mehr und es wird immer der erste Wert im Lookup selektiert bzw. ausgewählt.
</p>
        <p>
Beispiel:
</p>
        <p>
        </p>
        <pre class="csharpcode">
          <span class="kwrd">public</span>
          <span class="kwrd">void</span> executeQuery()
{ FormStringControl callerControl = SysTableLookup::getCallerStringControl(element.args());
; super(); xyz_ds.findValue(fieldnum(xyz,id),callerControl.text()); } <span class="kwrd">public</span><span class="kwrd">void</span> init()
{ Query q = <span class="kwrd">new</span> Query(); QueryBuildDataSource qbds; QueryBuildRange
range; ; super(); qbds = q.addDataSource(tablenum(xyz)); qbds.orderMode(OrderMode::OrderBy);
qbds.addSortField(fieldNum(xyz,some_other_field)); range = qbds.addRange(fieldnum(xyz,id));
range.<span class="kwrd">value</span>(SysQuery::valueNot(&lt;someValue&gt;)); <span class="kwrd">this</span>.query(q);
} </pre>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
        </p>
        <p>
Dieses Verhalten lässt sich allerdings umgehen, wenn anstelle des Aufrufs von “DataSource.findValue”
in der „ExecuteQuery“ Methode der DataSource der Aufruf von „DataSoucre.findRecord“
verwendet wird.<br />
Hierfür muss aber der entsprechende Datensatz des zuvor oder bereits ausgewählten
Wertes ermittelt werden um diesen beim Aufruf von „DataSource.findRecord“ als Parameter
zu übergeben.
</p>
        <p>
Beispiel:
</p>
        <pre class="csharpcode">
          <span class="kwrd">public</span>
          <span class="kwrd">void</span> executeQuery()
{ FormStringControl callerControl; Xyz xyzRecord; ; callerControl = SysTableLookup::getCallerStringControl(element.args());
xyzRecord = Xyz::find(callerControl.text()); super(); xyz_ds.findRecord(xyzRecord);
} <span class="kwrd">public</span><span class="kwrd">void</span> init() { Query q
= <span class="kwrd">new</span> Query(); QueryBuildDataSource qbds; QueryBuildRange
range; ; super(); qbds = q.addDataSource(tablenum(xyz)); qbds.orderMode(OrderMode::OrderBy);
qbds.addSortField(fieldNum(xyz,some_other_field)); range = qbds.addRange(fieldnum(xyz,id));
range.<span class="kwrd">value</span>(SysQuery::valueNot(&lt;someValue&gt;)); <span class="kwrd">this</span>.query(q);
}</pre>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
Es muss also darauf geachtet werden, ob eine Einschränkung (Range) auf dem „ID-Feld“
benötigt wird oder nicht.
</p>
        <p>
Wird keine Einschränkung benötigt, kann, wie in dem Artikel auf Axaptapedia beschrieben,
mit „DataSource.findValue“ gearbeitet werden um den entsprechenden Datensatz zu selektieren.<br />
Wird aber eine solche Einschränkung benötigt, muss mit „DataSoucre.findRecord“ gearbeitet
werden.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=337a6675-9f17-45f8-b620-c47081ec4e8e" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Dynamics AX LookupForms &amp;ndash; FindValue und Range auf gleichem Feld</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,337a6675-9f17-45f8-b620-c47081ec4e8e.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,337a6675-9f17-45f8-b620-c47081ec4e8e.aspx</link>
      <pubDate>Thu, 17 Sep 2009 20:48:11 GMT</pubDate>
      <description>&lt;p&gt;
In mehreren Artikeln wurde bereits beschrieben, wie LookupForms erstellt werden müssen,
um alle Funktionen bereit zu stellen, die auch durch einen Standard-Lookup bereit
gestellt werden.
&lt;/p&gt;
&lt;p&gt;
Ein guter &lt;a href="http://axaptapedia.com/Lookup_Form"&gt;Artikel&lt;/a&gt; ist zum Beispiel
auf &lt;a href="http://axaptapedia.com"&gt;Axaptapedia&lt;/a&gt; zu finden:&lt;br&gt;
&lt;a href="http://axaptapedia.com/Lookup_Form"&gt;http://axaptapedia.com/Lookup_Form&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Leider wurde in diesem Artikel auf eine Kleinigkeit nicht hingewiesen, die allerdings
für sehr viel Verwirrung sorgen kann.
&lt;/p&gt;
&lt;p&gt;
Um beim Öffnen des Lookups den bereits eingetragenen Wert zu selektieren (in dem Control
der aufrufenden Maske), müssen wie in dem Artikel beschrieben, die Methoden „executeQuery“
und „init“ der DataSource der Lookup-Maske überschrieben werden.
&lt;/p&gt;
&lt;p&gt;
Beispiel:
&lt;/p&gt;
&lt;p&gt;
&lt;pre class=csharpcode&gt;&lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; executeQuery()
{ FormStringControl callerControl = SysTableLookup::getCallerStringControl(element.args());
; super(); xyz_ds.findValue(fieldnum(xyz,id),callerControl.text()); } &lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; init()
{ Query q = &lt;span class=kwrd&gt;new&lt;/span&gt; Query(); QueryBuildDataSource qbds; ; super();
qbds = q.addDataSource(tablenum(xyz)); qbds.orderMode(OrderMode::OrderBy); qbds.addSortField(fieldNum(xyz,some_other_field)); &lt;span class=kwrd&gt;this&lt;/span&gt;.query(q);
} &lt;/pre&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Es wird auch beschrieben, dass in der Methode “init” der Datasource eigene Ranges
oder Sortings definiert werden können.&lt;br&gt;
Dies ist soweit auch richtig, allerdings mit einer Ausnahme.
&lt;/p&gt;
&lt;p&gt;
Wird auf dem Feld, welches bei dem Aufruf von „Datasource.findValue“ in der Methode
„init“ angegeben wurde (sollte auch immer das Feld sein, dessen Wert durch den Lookup
ausgewählt wird), eine Range definiert, so funktioniert die Selektion des zuvor gewählten
Wertes nicht mehr und es wird immer der erste Wert im Lookup selektiert bzw. ausgewählt.
&lt;/p&gt;
&lt;p&gt;
Beispiel:
&lt;/p&gt;
&lt;p&gt;
&lt;pre class=csharpcode&gt;&lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; executeQuery()
{ FormStringControl callerControl = SysTableLookup::getCallerStringControl(element.args());
; super(); xyz_ds.findValue(fieldnum(xyz,id),callerControl.text()); } &lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; init()
{ Query q = &lt;span class=kwrd&gt;new&lt;/span&gt; Query(); QueryBuildDataSource qbds; QueryBuildRange
range; ; super(); qbds = q.addDataSource(tablenum(xyz)); qbds.orderMode(OrderMode::OrderBy);
qbds.addSortField(fieldNum(xyz,some_other_field)); range = qbds.addRange(fieldnum(xyz,id));
range.&lt;span class=kwrd&gt;value&lt;/span&gt;(SysQuery::valueNot(&amp;lt;someValue&amp;gt;)); &lt;span class=kwrd&gt;this&lt;/span&gt;.query(q);
} &lt;/pre&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Dieses Verhalten lässt sich allerdings umgehen, wenn anstelle des Aufrufs von “DataSource.findValue”
in der „ExecuteQuery“ Methode der DataSource der Aufruf von „DataSoucre.findRecord“
verwendet wird.&lt;br&gt;
Hierfür muss aber der entsprechende Datensatz des zuvor oder bereits ausgewählten
Wertes ermittelt werden um diesen beim Aufruf von „DataSource.findRecord“ als Parameter
zu übergeben.
&lt;/p&gt;
&lt;p&gt;
Beispiel:&lt;pre class=csharpcode&gt;&lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; executeQuery()
{ FormStringControl callerControl; Xyz xyzRecord; ; callerControl = SysTableLookup::getCallerStringControl(element.args());
xyzRecord = Xyz::find(callerControl.text()); super(); xyz_ds.findRecord(xyzRecord);
} &lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; init() { Query q = &lt;span class=kwrd&gt;new&lt;/span&gt; Query();
QueryBuildDataSource qbds; QueryBuildRange range; ; super(); qbds = q.addDataSource(tablenum(xyz));
qbds.orderMode(OrderMode::OrderBy); qbds.addSortField(fieldNum(xyz,some_other_field));
range = qbds.addRange(fieldnum(xyz,id)); range.&lt;span class=kwrd&gt;value&lt;/span&gt;(SysQuery::valueNot(&amp;lt;someValue&amp;gt;)); &lt;span class=kwrd&gt;this&lt;/span&gt;.query(q);
}&lt;/pre&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
Es muss also darauf geachtet werden, ob eine Einschränkung (Range) auf dem „ID-Feld“
benötigt wird oder nicht.
&lt;/p&gt;
&lt;p&gt;
Wird keine Einschränkung benötigt, kann, wie in dem Artikel auf Axaptapedia beschrieben,
mit „DataSource.findValue“ gearbeitet werden um den entsprechenden Datensatz zu selektieren.&lt;br&gt;
Wird aber eine solche Einschränkung benötigt, muss mit „DataSoucre.findRecord“ gearbeitet
werden.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=337a6675-9f17-45f8-b620-c47081ec4e8e" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,337a6675-9f17-45f8-b620-c47081ec4e8e.aspx</comments>
      <category>Dynamics Ax;Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=c81d98ab-1803-4da5-beae-cd03aa116b10</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,c81d98ab-1803-4da5-beae-cd03aa116b10.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,c81d98ab-1803-4da5-beae-cd03aa116b10.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c81d98ab-1803-4da5-beae-cd03aa116b10</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wird Microsoft Dynamics AX 2009 mit Windows Server 2008 und SQL Server 2008 installiert,
kann es zu einem Problem bei Bereitstellen der ODC-Dateien kommen. 
</p>
        <p>
Nach dem Aufruf der Funktion „ODC-Dateien bereitstellen“ meldet Dynamics AX 2009 einen
Fehler im Infolog. 
</p>
        <p>
        </p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/FehlerbeimBereitstellenderODCDateien_D429/ODC_Error_2.gif" target="_blank">
            <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="ODC_Error" border="0" alt="ODC_Error" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/FehlerbeimBereitstellenderODCDateien_D429/ODC_Error_thumb.gif" width="244" height="18" />
          </a>
        </p>
        <p>
        </p>
        <p>
Diese Fehlermeldung wird ebenfalls im Ereignislog von Windows protokolliert. 
</p>
        <p>
        </p>
        <p>
Laut einem Artikel im EMEA Dynamics AX Support Blog ist hierfür ein Hot Fix erhältlich.<br /><a href="https://blogs.msdn.com/emeadaxsupport/archive/2009/04/23/unable-to-deploy-odc-files-to-enterprise-portal-even-after-installing-hotfix-kb960158.aspx">https://blogs.msdn.com/emeadaxsupport/archive/2009/04/23/unable-to-deploy-odc-files-to-enterprise-portal-even-after-installing-hotfix-kb960158.aspx</a></p>
        <p>
        </p>
        <p>
Wurde allerdings schon das Hot Fix Rollup 2 für Dynamics AX 2009 (SP1) installiert,
wird das beschriebene Hot Fix nicht mehr benötigt. 
</p>
        <p>
        </p>
        <p>
Um nun die ODC-Dateien erfolgreich bereitstellen zu können muss wie folgt vorgegangen
werden: 
</p>
        <ul>
          <li>
Das bereits installierte Enterprise-Portal muss aktualisiert werden<br />
(Verwaltung/Einstellungen/Internet/Enterprise Portal/Bereitstellungen verwalten/ Button
„Aktualisieren“ wählen) 
</li>
          <li>
Nun (sicherheitshalber) den IIS neu starten, z.B. durch Aufruf von „iisreset“ 
</li>
          <li>
Anschließend können die ODC-Dateien bereit gestellt werden.<br />
(Verwaltung/Einstellungen/Unternehmensanalyse/OLAP/Olap-Verwaltung/ Button „ODC-Dateien
bereitstellen“ wählen)</li>
        </ul>
        <p>
        </p>
        <p>
Ob das Bereitstellen der ODC-Dateien funktioniert hat, kann überprüft werden, indem
man kontrolliert, ob die entsprechende Bibliothek im SharePoint die ODC Dateien enthält.<br />
http://&lt;servername&gt;/websites/DynamicsAx/Data%20Connections/Forms/AllItems.aspx 
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=c81d98ab-1803-4da5-beae-cd03aa116b10" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Fehler beim Bereitstellen der ODC-Dateien</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,c81d98ab-1803-4da5-beae-cd03aa116b10.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,c81d98ab-1803-4da5-beae-cd03aa116b10.aspx</link>
      <pubDate>Sat, 12 Sep 2009 13:11:03 GMT</pubDate>
      <description>&lt;p&gt;
Wird Microsoft Dynamics AX 2009 mit Windows Server 2008 und SQL Server 2008 installiert,
kann es zu einem Problem bei Bereitstellen der ODC-Dateien kommen. 
&lt;p&gt;
Nach dem Aufruf der Funktion „ODC-Dateien bereitstellen“ meldet Dynamics AX 2009 einen
Fehler im Infolog. 
&lt;p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/FehlerbeimBereitstellenderODCDateien_D429/ODC_Error_2.gif" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title=ODC_Error border=0 alt=ODC_Error src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/FehlerbeimBereitstellenderODCDateien_D429/ODC_Error_thumb.gif" width=244 height=18&gt;&lt;/a&gt; 
&lt;p&gt;
&lt;p&gt;
Diese Fehlermeldung wird ebenfalls im Ereignislog von Windows protokolliert. 
&lt;p&gt;
&lt;p&gt;
Laut einem Artikel im EMEA Dynamics AX Support Blog ist hierfür ein Hot Fix erhältlich.&lt;br&gt;
&lt;a href="https://blogs.msdn.com/emeadaxsupport/archive/2009/04/23/unable-to-deploy-odc-files-to-enterprise-portal-even-after-installing-hotfix-kb960158.aspx"&gt;https://blogs.msdn.com/emeadaxsupport/archive/2009/04/23/unable-to-deploy-odc-files-to-enterprise-portal-even-after-installing-hotfix-kb960158.aspx&lt;/a&gt; 
&lt;p&gt;
&lt;p&gt;
Wurde allerdings schon das Hot Fix Rollup 2 für Dynamics AX 2009 (SP1) installiert,
wird das beschriebene Hot Fix nicht mehr benötigt. 
&lt;p&gt;
&lt;p&gt;
Um nun die ODC-Dateien erfolgreich bereitstellen zu können muss wie folgt vorgegangen
werden: 
&lt;ul&gt;
&lt;li&gt;
Das bereits installierte Enterprise-Portal muss aktualisiert werden&lt;br&gt;
(Verwaltung/Einstellungen/Internet/Enterprise Portal/Bereitstellungen verwalten/ Button
„Aktualisieren“ wählen) 
&lt;li&gt;
Nun (sicherheitshalber) den IIS neu starten, z.B. durch Aufruf von „iisreset“ 
&lt;li&gt;
Anschließend können die ODC-Dateien bereit gestellt werden.&lt;br&gt;
(Verwaltung/Einstellungen/Unternehmensanalyse/OLAP/Olap-Verwaltung/ Button „ODC-Dateien
bereitstellen“ wählen)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;p&gt;
Ob das Bereitstellen der ODC-Dateien funktioniert hat, kann überprüft werden, indem
man kontrolliert, ob die entsprechende Bibliothek im SharePoint die ODC Dateien enthält.&lt;br&gt;
http://&amp;lt;servername&amp;gt;/websites/DynamicsAx/Data%20Connections/Forms/AllItems.aspx 
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=c81d98ab-1803-4da5-beae-cd03aa116b10" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,c81d98ab-1803-4da5-beae-cd03aa116b10.aspx</comments>
      <category>Dynamics Ax;Dynamics Ax/Administration;Dynamics AX/Dynamics AX 2009</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=c0d1ce07-183b-4f76-9429-79fdab005cf2</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,c0d1ce07-183b-4f76-9429-79fdab005cf2.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,c0d1ce07-183b-4f76-9429-79fdab005cf2.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=c0d1ce07-183b-4f76-9429-79fdab005cf2</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Ab sofort führt mein Arbeitgeber, die Firma AX Solutions GmbH, einmal in der Woche
(mittwochs 15:30 - 16:30 Uhr) eine kostenlose <a href="http://www.ax-solutions.de/kostenlose-experten-sprechstunde-zu-microsoft-dynamics-ax-.html">„Experten-Sprechstunde“</a> durch.
</p>
        <p>
Diese „Sprechstunde“ richtet sich an Microsoft Dynamics AX Bestandskunden sowie Interessenten
die Antworten auf bisher unbeantwortete Fragen oder einen Rat zu einer speziellen
Problemstellung suchen.
</p>
        <p>
Unter anderem werde auch ich diese Sprechstunden abhalten und versuchen nach besten
Wissen und Gewissen Rat zu geben. Sicherlich wird sich nicht jede Problemstellung
Ad-hoc lösen lassen. Ich bin aber sicher, dass der gemeinsame Dialog zumindest Lösungsoptionen
aufzeigen wird.
</p>
        <p>
Guter Rat ist Sprichwörtlich teuer. Diesmal aber nicht, denn die Dynamics AX
Sprechstunde ist kostenlos.<br />
Auf die sonst übliche Praxisgebühr in Höhe von 10,- EUR pro Quartal wird verzichtet.
:-)
</p>
        <p>
Da die Sprechstunden in einem 1:1 Gespräch durchgeführt werden, und möglichst vielen
Ratsuchenden die Möglichkeit gegeben werden soll diese zu nutzen, ist jede Sprechstunde
auf 60 Minuten begrenzt.
</p>
        <p>
Ratsuchende bzw. Interessierte möchte ich bitte, sich unter folgendem <a href="http://www.ax-solutions.de/kontaktformular.html">Link:</a> (http://www.ax-solutions.de/kontaktformular.html)
mit dem Stichwort „Dynamics AX – Sprechstunde“ anzumelden.
</p>
        <p>
Weitere Informationen können über die  <a href="http://www.ax-solutions.de/kostenlose-experten-sprechstunde-zu-microsoft-dynamics-ax-.html">Webseite
der AX Solutions GmbH</a> bezogen werden.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=c0d1ce07-183b-4f76-9429-79fdab005cf2" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Kostenlose Dynamics AX Sprechstunde</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,c0d1ce07-183b-4f76-9429-79fdab005cf2.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,c0d1ce07-183b-4f76-9429-79fdab005cf2.aspx</link>
      <pubDate>Thu, 03 Sep 2009 14:06:30 GMT</pubDate>
      <description>&lt;p&gt;
Ab sofort führt mein Arbeitgeber, die Firma AX Solutions GmbH, einmal in der Woche
(mittwochs 15:30 - 16:30 Uhr) eine kostenlose &lt;a href="http://www.ax-solutions.de/kostenlose-experten-sprechstunde-zu-microsoft-dynamics-ax-.html"&gt;„Experten-Sprechstunde“&lt;/a&gt; durch.
&lt;/p&gt;
&lt;p&gt;
Diese „Sprechstunde“ richtet sich an Microsoft Dynamics AX Bestandskunden sowie Interessenten
die Antworten auf bisher unbeantwortete Fragen oder einen Rat zu einer speziellen
Problemstellung suchen.
&lt;/p&gt;
&lt;p&gt;
Unter anderem werde auch ich diese Sprechstunden abhalten und versuchen nach besten
Wissen und Gewissen Rat zu geben. Sicherlich wird sich nicht jede Problemstellung
Ad-hoc lösen lassen. Ich bin aber sicher, dass der gemeinsame Dialog zumindest Lösungsoptionen
aufzeigen wird.
&lt;/p&gt;
&lt;p&gt;
Guter Rat ist Sprichwörtlich teuer. Diesmal aber nicht, denn die&amp;nbsp;Dynamics AX
Sprechstunde ist kostenlos.&lt;br&gt;
Auf die sonst übliche Praxisgebühr in Höhe von 10,- EUR pro Quartal wird verzichtet.
:-)
&lt;/p&gt;
&lt;p&gt;
Da die Sprechstunden in einem 1:1 Gespräch durchgeführt werden, und möglichst vielen
Ratsuchenden die Möglichkeit gegeben werden soll diese zu nutzen, ist jede Sprechstunde
auf 60 Minuten begrenzt.
&lt;/p&gt;
&lt;p&gt;
Ratsuchende bzw. Interessierte möchte ich bitte, sich unter folgendem &lt;a href="http://www.ax-solutions.de/kontaktformular.html"&gt;Link:&lt;/a&gt; (http://www.ax-solutions.de/kontaktformular.html)
mit dem Stichwort „Dynamics AX – Sprechstunde“ anzumelden.
&lt;/p&gt;
&lt;p&gt;
Weitere Informationen können über die&amp;nbsp; &lt;a href="http://www.ax-solutions.de/kostenlose-experten-sprechstunde-zu-microsoft-dynamics-ax-.html"&gt;Webseite
der AX Solutions GmbH&lt;/a&gt; bezogen werden.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=c0d1ce07-183b-4f76-9429-79fdab005cf2" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,c0d1ce07-183b-4f76-9429-79fdab005cf2.aspx</comments>
      <category>Allgemein;Dynamics Ax;Dynamics AX/Dynamics AX 2009</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=35934578-3dff-4555-b3d3-8ca2338ca6ed</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,35934578-3dff-4555-b3d3-8ca2338ca6ed.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,35934578-3dff-4555-b3d3-8ca2338ca6ed.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=35934578-3dff-4555-b3d3-8ca2338ca6ed</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wie schon die erste Auflage des Buches „Inside Dynamics AX“ ist dieses Buch eine sehr
gute Ergänzung zu den von Microsoft angebotenen Schulungsunterlagen (Development 1-4). 
<br /><br />
Angefangen bei der Architektur, der Entwicklungsumgebung und –Tools, bis hin zu Code
Upgrades beschreibt dieses Buch alle Themen die für einen AX Entwickler von Bedeutung
sind.<br /><br />
Nicht nur alle neuen Features von Dynamics AX 2009, z.B. Dynamics AX Reporting Services
oder Workflows, sondern auch ältere Features wie z.B. das Application Integration
Framework (AIF), werden wesentlich detaillierter beschrieben als an anderen Stellen.<br /><br />
Leider gibt es auch Bereiche, die nicht so detailliert besprochen werden bzw. wo einige
Fragen nicht gänzlich beantwortet werden.<br />
Ein Beispiel hierfür ist die .NET Integration. Zwar wird der Business Connector ausreichend
beschrieben, aber das Thema CLR-Interoperability wird leider nur sehr knapp behandelt. 
<br /><br />
Einige Kapitel wurden im Vergleich zu der ersten Auflage des Buches gänzlich überarbeitet.<br />
Beispielhaft sei das Kapitel über Form Customizations genannt, welches komplett neu
geschrieben wurde.<br /><br />
Leider hat dies auch zur Folge, dass einige sehr gut Beschriebene Themen, wie Beispielweise
das dynamische Anpassungen von Masken mit X++,<br />
jetzt nicht mehr behandelt werden.<br /><br />
Was dieses Buch aber nicht beschreibt oder behandelt, sind die Klassen, Tabellen,
API‘s, etc. des Microsoft Dynamics AX Standards.<br />
Dies würde allerdings auch den Rahmen des Buches mehr als sprengen.<br /><br />
In der Gesamtbetrachtung ist die neue Auflage von Inside Microsoft Dynamics AX eins
der besten technischen Bücher über Microsoft Dynamics AX.<br />
Kein Buch geht soweit in die Tiefe wie dieses. Egal ob Anfänger oder erfahrener Entwickler,
für jeden ist etwas dabei.<br /><br />
Auch wer schon die erste Auflage von Inside Microsoft Dynamics AX gelesen hat, wird
viele neue Themen finden.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=35934578-3dff-4555-b3d3-8ca2338ca6ed" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Inside Microsoft Dynamics AX 2009 &amp;ndash; Rezension</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,35934578-3dff-4555-b3d3-8ca2338ca6ed.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,35934578-3dff-4555-b3d3-8ca2338ca6ed.aspx</link>
      <pubDate>Thu, 30 Jul 2009 12:28:50 GMT</pubDate>
      <description>&lt;p&gt;
Wie schon die erste Auflage des Buches „Inside Dynamics AX“ ist dieses Buch eine sehr
gute Ergänzung zu den von Microsoft angebotenen Schulungsunterlagen (Development 1-4). 
&lt;br&gt;
&lt;br&gt;
Angefangen bei der Architektur, der Entwicklungsumgebung und –Tools, bis hin zu Code
Upgrades beschreibt dieses Buch alle Themen die für einen AX Entwickler von Bedeutung
sind.&lt;br&gt;
&lt;br&gt;
Nicht nur alle neuen Features von Dynamics AX 2009, z.B. Dynamics AX Reporting Services
oder Workflows, sondern auch ältere Features wie z.B. das Application Integration
Framework (AIF), werden wesentlich detaillierter beschrieben als an anderen Stellen.&lt;br&gt;
&lt;br&gt;
Leider gibt es auch Bereiche, die nicht so detailliert besprochen werden bzw. wo einige
Fragen nicht gänzlich beantwortet werden.&lt;br&gt;
Ein Beispiel hierfür ist die .NET Integration. Zwar wird der Business Connector ausreichend
beschrieben, aber das Thema CLR-Interoperability wird leider nur sehr knapp behandelt. 
&lt;br&gt;
&lt;br&gt;
Einige Kapitel wurden im Vergleich zu der ersten Auflage des Buches gänzlich überarbeitet.&lt;br&gt;
Beispielhaft sei das Kapitel über Form Customizations genannt, welches komplett neu
geschrieben wurde.&lt;br&gt;
&lt;br&gt;
Leider hat dies auch zur Folge, dass einige sehr gut Beschriebene Themen, wie Beispielweise
das dynamische Anpassungen von Masken mit X++,&lt;br&gt;
jetzt nicht mehr behandelt werden.&lt;br&gt;
&lt;br&gt;
Was dieses Buch aber nicht beschreibt oder behandelt, sind die Klassen, Tabellen,
API‘s, etc. des Microsoft Dynamics AX Standards.&lt;br&gt;
Dies würde allerdings auch den Rahmen des Buches mehr als sprengen.&lt;br&gt;
&lt;br&gt;
In der Gesamtbetrachtung ist die neue Auflage von Inside Microsoft Dynamics AX eins
der besten technischen Bücher über Microsoft Dynamics AX.&lt;br&gt;
Kein Buch geht soweit in die Tiefe wie dieses. Egal ob Anfänger oder erfahrener Entwickler,
für jeden ist etwas dabei.&lt;br&gt;
&lt;br&gt;
Auch wer schon die erste Auflage von Inside Microsoft Dynamics AX gelesen hat, wird
viele neue Themen finden.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=35934578-3dff-4555-b3d3-8ca2338ca6ed" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,35934578-3dff-4555-b3d3-8ca2338ca6ed.aspx</comments>
      <category>Allgemein;Dynamics Ax;Dynamics AX/Dynamics AX 2009;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=77377305-e7da-4288-a90b-0e32ac3aad0d</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,77377305-e7da-4288-a90b-0e32ac3aad0d.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,77377305-e7da-4288-a90b-0e32ac3aad0d.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=77377305-e7da-4288-a90b-0e32ac3aad0d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wird die Eigenschaft(Property) “AllowEditOnCreate” eines Tabellenfeldes auf den Wert
“No” gesetzt, ist es nicht möglich,<br />
Werte für dieses Tabellenfeld über das AIF (Application Integration Framework) zu
schreiben (Insert-Operation).
</p>
        <p>
Alle Tabellenfelder, welche diese Eigenschaft auf “No” gesetzt haben, werden durch
das AIF automatisch auf deren Default-Wert gesetzt und jegliche Wert der AIF Nachricht
werden ignoriert.<br />
Dies hat zur Folge, dass wenn das Tabellenfeld kein Enum ist, das Tabellenfeld immer
leer ist.
</p>
        <p>
Da dieser Automatismus schon vor Ausführung der AX&lt;Table&gt; Klasse greift, der
Wert also schon beim Ausführen der entsprechenden Parm-Methode “leer” ist,<br />
kann dieses Verhalten ohne Änderung der AIF-Basis Klassen nicht geändert werden.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=77377305-e7da-4288-a90b-0e32ac3aad0d" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Tabellenfeldeigenschaft AllowEditOnCreate und das Application Integration Framework</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,77377305-e7da-4288-a90b-0e32ac3aad0d.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,77377305-e7da-4288-a90b-0e32ac3aad0d.aspx</link>
      <pubDate>Wed, 29 Jul 2009 23:09:08 GMT</pubDate>
      <description>&lt;p&gt;
Wird die Eigenschaft(Property) “AllowEditOnCreate” eines Tabellenfeldes auf den Wert
“No” gesetzt, ist es nicht möglich,&lt;br&gt;
Werte für dieses Tabellenfeld über das AIF (Application Integration Framework) zu
schreiben (Insert-Operation).
&lt;/p&gt;
&lt;p&gt;
Alle Tabellenfelder, welche diese Eigenschaft auf “No” gesetzt haben, werden durch
das AIF automatisch auf deren Default-Wert gesetzt und jegliche Wert der AIF Nachricht
werden ignoriert.&lt;br&gt;
Dies hat zur Folge, dass wenn das Tabellenfeld kein Enum ist, das Tabellenfeld immer
leer ist.
&lt;/p&gt;
&lt;p&gt;
Da dieser Automatismus schon vor Ausführung der AX&amp;lt;Table&amp;gt; Klasse greift, der
Wert also schon beim Ausführen der entsprechenden Parm-Methode “leer” ist,&lt;br&gt;
kann dieses Verhalten ohne Änderung der AIF-Basis Klassen nicht geändert werden.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=77377305-e7da-4288-a90b-0e32ac3aad0d" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,77377305-e7da-4288-a90b-0e32ac3aad0d.aspx</comments>
      <category>Dynamics AX/AIF;Dynamics AX/Dynamics AX 2009;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=43c4e152-1290-400d-a404-8f4f16cf195c</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,43c4e152-1290-400d-a404-8f4f16cf195c.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,43c4e152-1290-400d-a404-8f4f16cf195c.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=43c4e152-1290-400d-a404-8f4f16cf195c</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Egal ob Anfänger oder schon erfahrener Dynamics AX Entwickler.<br />
Von Zeit zu Zeit tauchen immer die gleichen Fragen und/oder Problemstellungen auf.
</p>
        <p>
Was immer mal wieder in Foren oder Newsgroups zu lesen ist, ist die Frage, wie die
Berechnung des Artikelpreises für eine Debitor mit X++ Code durchgeführt werden kann.<br />
Der Standard von Microsoft Dynamics AX bringt zwar eine Maske zur “Preisabfrage” mit
sich, welche diese Problemstellung eigentlich schon löst, allerdings ist es manchmal<br />
notwendig, die Preisberechnung z.B. in einer Klasse durchzuführen, um mit dem Ergebnis
weitere Operationen durchführen zu können.
</p>
        <p>
          <a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/PreisberechnungeninMicrosoftDynamicsAX_10349/Maske_Preise.jpg" target="_blank">
            <img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Maske zur Preisberechnung" border="0" alt="Maske zur Preisberechnung" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/PreisberechnungeninMicrosoftDynamicsAX_10349/Maske_Preise_thumb.jpg" width="244" height="127" />
          </a>
        </p>
        <p>
Da in Dynamics AX Preise für einen Artikel nicht nur “direkt” im Artikelstamm, sondern
auch in den Handelsvereinbarungen, hinterlegt werden können, stellt der Standard von<br />
Dynamics AX die Klasse “PriceDisc” zur Verfügung, welche alle Möglichkeiten der Preispflege
berücksichtig.<br />
Unter Anderem werden auch Rabatte bzw. Zuschläge der Handelsvereinbarungen durch diese
Klasse berücksichtigt.
</p>
        <p>
Die Klasse “PriceDisc” stellt die statische Methode “actualSalesPriceDisc” bereit.
Mit dieser können z.B. der Verkaufspreis pro Preiseinheit, der Rabatt oder die Zuschläge<br />
berechnet und/oder ermittelt werden.<br />
Durch eine zweite statische Methode “price2Amount” lässt sich anschließend der Nettobetrag
eines Artikels ausrechnen.
</p>
        <p>
Beispiel:<br /></p>
        <div class="csharpcode">
          <pre class="alt">CustTable               custTable = CustTable::find(<span class="str">"5010"</span>);</pre>
          <pre>InventTable             inventTable = InventTable::find(<span class="str">"1000"</span>);</pre>
          <pre class="alt">Qty                     qty = 1.00;</pre>
          <pre> </pre>
          <pre class="alt">SalesPrice              salesPrice; <span class="rem">// Verkaufspreis
je Preiseinheit</span></pre>
          <pre>PriceMarkup             salesMarkup; <span class="rem">//Preis sonst. Zuschläge</span></pre>
          <pre class="alt">PriceUnit               priceUnit; <span class="rem">// Preiseinheit</span></pre>
          <pre>SalesLineDisc           salesLineDisc; <span class="rem">// Rabatt</span></pre>
          <pre class="alt">SalesLinePercent        salesLinePercent;</pre>
          <pre>DiscPct                 percent1;</pre>
          <pre class="alt">DiscPct                 percent2;</pre>
          <pre>PriceDiscTable          actualPrice; <span class="rem">// Gefundener Datensatz
der Handelsvereinbarung (Verkaufspreis)</span></pre>
          <pre class="alt">PriceDiscTable          actualDisc; <span class="rem">// Gefundener
Datensatz der Handelsvereinbarung (Rabatte)</span></pre>
          <pre>AmountCur               lineAmount; <span class="rem">// Nettobetrag</span></pre>
          <pre class="alt">;</pre>
          <pre>[salesPrice, salesMarkup, priceUnit,</pre>
          <pre class="alt"> salesLineDisc, salesLinePercent, percent1,</pre>
          <pre> percent2, actualPrice, actualDisc] = PriceDisc::actualSalesPriceDisc(custTable, inventTable, qty);</pre>
          <pre class="alt"> </pre>
          <pre>lineAmount = PriceDisc::price2Amount(salesPrice, priceUnit, salesLineDisc, qty,</pre>
          <pre class="alt">                                     qty, salesMarkup, salesLinePercent,</pre>
          <pre>                                     custTable.Currency, 0);</pre>
        </div>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=43c4e152-1290-400d-a404-8f4f16cf195c" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Preisberechnungen in Microsoft Dynamics AX</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,43c4e152-1290-400d-a404-8f4f16cf195c.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,43c4e152-1290-400d-a404-8f4f16cf195c.aspx</link>
      <pubDate>Wed, 29 Jul 2009 16:48:40 GMT</pubDate>
      <description>&lt;p&gt;
Egal ob Anfänger oder schon erfahrener Dynamics AX Entwickler.&lt;br&gt;
Von Zeit zu Zeit tauchen immer die gleichen Fragen und/oder Problemstellungen auf.
&lt;/p&gt;
&lt;p&gt;
Was immer mal wieder in Foren oder Newsgroups zu lesen ist, ist die Frage, wie die
Berechnung des Artikelpreises für eine Debitor mit X++ Code durchgeführt werden kann.&lt;br&gt;
Der Standard von Microsoft Dynamics AX bringt zwar eine Maske zur “Preisabfrage” mit
sich, welche diese Problemstellung eigentlich schon löst, allerdings ist es manchmal&lt;br&gt;
notwendig, die Preisberechnung z.B. in einer Klasse durchzuführen, um mit dem Ergebnis
weitere Operationen durchführen zu können.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/WindowsLiveWriter/PreisberechnungeninMicrosoftDynamicsAX_10349/Maske_Preise.jpg" target=_blank&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="Maske zur Preisberechnung" border=0 alt="Maske zur Preisberechnung" src="http://blog.ak-home.net/content/binary/WindowsLiveWriter/PreisberechnungeninMicrosoftDynamicsAX_10349/Maske_Preise_thumb.jpg" width=244 height=127&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
Da in Dynamics AX Preise für einen Artikel nicht nur “direkt” im Artikelstamm, sondern
auch in den Handelsvereinbarungen, hinterlegt werden können, stellt der Standard von&lt;br&gt;
Dynamics AX die Klasse “PriceDisc” zur Verfügung, welche alle Möglichkeiten der Preispflege
berücksichtig.&lt;br&gt;
Unter Anderem werden auch Rabatte bzw. Zuschläge der Handelsvereinbarungen durch diese
Klasse berücksichtigt.
&lt;/p&gt;
&lt;p&gt;
Die Klasse “PriceDisc” stellt die statische Methode “actualSalesPriceDisc” bereit.
Mit dieser können z.B. der Verkaufspreis pro Preiseinheit, der Rabatt oder die Zuschläge&lt;br&gt;
berechnet und/oder ermittelt werden.&lt;br&gt;
Durch eine zweite statische Methode “price2Amount” lässt sich anschließend der Nettobetrag
eines Artikels ausrechnen.
&lt;/p&gt;
&lt;p&gt;
Beispiel:&lt;br&gt;
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre class=alt&gt;CustTable               custTable = CustTable::find(&lt;span class=str&gt;"5010"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;InventTable             inventTable = InventTable::find(&lt;span class=str&gt;"1000"&lt;/span&gt;);&lt;/pre&gt;
&lt;pre class=alt&gt;Qty                     qty = 1.00;&lt;/pre&gt;
&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class=alt&gt;SalesPrice              salesPrice; &lt;span class=rem&gt;// Verkaufspreis
je Preiseinheit&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;PriceMarkup             salesMarkup; &lt;span class=rem&gt;//Preis sonst. Zuschläge&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;PriceUnit               priceUnit; &lt;span class=rem&gt;// Preiseinheit&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;SalesLineDisc           salesLineDisc; &lt;span class=rem&gt;// Rabatt&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;SalesLinePercent        salesLinePercent;&lt;/pre&gt;
&lt;pre&gt;DiscPct                 percent1;&lt;/pre&gt;
&lt;pre class=alt&gt;DiscPct                 percent2;&lt;/pre&gt;
&lt;pre&gt;PriceDiscTable          actualPrice; &lt;span class=rem&gt;// Gefundener Datensatz
der Handelsvereinbarung (Verkaufspreis)&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;PriceDiscTable          actualDisc; &lt;span class=rem&gt;// Gefundener Datensatz
der Handelsvereinbarung (Rabatte)&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;AmountCur               lineAmount; &lt;span class=rem&gt;// Nettobetrag&lt;/span&gt;&lt;/pre&gt;
&lt;pre class=alt&gt;;&lt;/pre&gt;
&lt;pre&gt;[salesPrice, salesMarkup, priceUnit,&lt;/pre&gt;
&lt;pre class=alt&gt; salesLineDisc, salesLinePercent, percent1,&lt;/pre&gt;
&lt;pre&gt; percent2, actualPrice, actualDisc] = PriceDisc::actualSalesPriceDisc(custTable, inventTable, qty);&lt;/pre&gt;
&lt;pre class=alt&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;lineAmount = PriceDisc::price2Amount(salesPrice, priceUnit, salesLineDisc, qty,&lt;/pre&gt;
&lt;pre class=alt&gt;                                     qty, salesMarkup, salesLinePercent,&lt;/pre&gt;
&lt;pre&gt;                                     custTable.Currency, 0);&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=43c4e152-1290-400d-a404-8f4f16cf195c" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,43c4e152-1290-400d-a404-8f4f16cf195c.aspx</comments>
      <category>Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=38a9bff0-2bfd-492b-b323-9cb6f4750289</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,38a9bff0-2bfd-492b-b323-9cb6f4750289.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,38a9bff0-2bfd-492b-b323-9cb6f4750289.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=38a9bff0-2bfd-492b-b323-9cb6f4750289</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Die neue oder zweite Auflage von "Inside Mircosoft Dynamics AX" ist vor wenigen Tage
erschienen.
</p>
        <p>
          <a href="http://www.amazon.de/Inside-Microsoft-Dynamics%C2%AE-AX-2009/dp/0735626456/ref=sr_1_1?ie=UTF8&amp;s=books-intl-de&amp;qid=1245351262&amp;sr=8-1">Inside
Mircosoft Dynamics AX 2009</a>
        </p>
        <p>
Wie auch schon die erste Auflage des Buches, welche auf der Version 4.0 von Microsoft
Dynamics AX basierte, ist diese Buch in erster Linie für Entwickler gedacht.<br />
Die aktuelle Auflage umfasst gut 100 Seiten mehr als die erste Auflage und ist leider
auch im Preis etwas teurer.
</p>
        <p>
Weitere Informationen über den Inhalt können z.B. auf den Seiten von <a href="http://www.amazon.de/Inside-Microsoft-Dynamics%C2%AE-AX-2009/dp/0735626456/ref=sr_1_1?ie=UTF8&amp;s=books-intl-de&amp;qid=1245351262&amp;sr=8-1">Amazon</a> entnommen
werden.
</p>
        <p>
Es ist zu hoffen, dass sich diese Auflage auf gleichem Level wie die erste Auflage
bewegt und somit zu einem "Must-Have" oder "Must-Read" für AX Entwickler wird.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=38a9bff0-2bfd-492b-b323-9cb6f4750289" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Neues Buch - Inside Microsoft Dynamics AX 2009</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,38a9bff0-2bfd-492b-b323-9cb6f4750289.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,38a9bff0-2bfd-492b-b323-9cb6f4750289.aspx</link>
      <pubDate>Thu, 18 Jun 2009 18:56:05 GMT</pubDate>
      <description>&lt;p&gt;
Die neue oder zweite Auflage von "Inside Mircosoft Dynamics AX" ist vor wenigen Tage
erschienen.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.amazon.de/Inside-Microsoft-Dynamics%C2%AE-AX-2009/dp/0735626456/ref=sr_1_1?ie=UTF8&amp;amp;s=books-intl-de&amp;amp;qid=1245351262&amp;amp;sr=8-1"&gt;Inside
Mircosoft Dynamics AX 2009&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Wie auch schon die erste Auflage des Buches, welche auf der Version 4.0 von Microsoft
Dynamics AX basierte, ist diese Buch in erster Linie für Entwickler gedacht.&lt;br&gt;
Die aktuelle Auflage umfasst gut 100 Seiten mehr als die erste Auflage und ist leider
auch im Preis etwas teurer.
&lt;/p&gt;
&lt;p&gt;
Weitere Informationen über den Inhalt können z.B. auf den Seiten von &lt;a href="http://www.amazon.de/Inside-Microsoft-Dynamics%C2%AE-AX-2009/dp/0735626456/ref=sr_1_1?ie=UTF8&amp;amp;s=books-intl-de&amp;amp;qid=1245351262&amp;amp;sr=8-1"&gt;Amazon&lt;/a&gt; entnommen
werden.
&lt;/p&gt;
&lt;p&gt;
Es ist zu hoffen, dass sich diese Auflage auf gleichem Level wie die erste Auflage
bewegt und somit zu einem "Must-Have" oder "Must-Read" für AX Entwickler wird.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=38a9bff0-2bfd-492b-b323-9cb6f4750289" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,38a9bff0-2bfd-492b-b323-9cb6f4750289.aspx</comments>
      <category>Allgemein;Dynamics Ax;Dynamics AX/Dynamics AX 2009;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=4d8c906e-3eb6-440f-a1da-973c3c0d3958</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,4d8c906e-3eb6-440f-a1da-973c3c0d3958.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,4d8c906e-3eb6-440f-a1da-973c3c0d3958.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=4d8c906e-3eb6-440f-a1da-973c3c0d3958</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Heute bin ich, bei einem meiner "Streifzüge" durch das Internet, auf eine neue Seite
zum Thema Dynamics gestoßen.
</p>
        <p>
Diese neue Seite heißt <a href="http://www.dynamicsworld.co.uk">DynamicsWorld</a>.
</p>
        <p>
Als einer der ersten Einträge, wurde dort eine Liste der 100 einflussreichsten Menschen,
bezogen auf Microsoft Dynamics, veröffentlicht.<br />
Wie diese Liste erstellt wurde, bzw. welche Kriterien zur Erstellung dieser Liste
verwendet/berücksichtigt wurde ist ebenfalls beschrieben.
</p>
        <p>
Nach einem Blick auf diese Liste war ich sehr erstaunt.<br />
Unter Position 62 ist folgendes zu lesen (Orginalauszug):
</p>
        <p style="TEXT-ALIGN: justify; FONT-SIZE: 12pt" class="MsoNormal" align="justify">
          <font style="FONT-SIZE: 14pt" size="4">Axel Kühn </font>
        </p>
        <p style="TEXT-ALIGN: justify; FONT-SIZE: 12pt" class="MsoNormal" align="justify">
          <font style="FONT-SIZE: 12pt" size="3">One of the German Dynamics AX developers who
has resisted the temptation to fall in to the arms of SAP. He has been a regular contributor
to the GLS layer for Germany and is involved in some of the largest AX implementations,
his blog blog.ak-home.net regularly has a readership of over 3000 AX developers and
consultants. </font>
        </p>
        <p>
Der orginale Eintrag ist <a href="http://www.dynamicsworld.co.uk/page009.html">hier</a> zu
finden.
</p>
        <p>
Ich freue mich zu lesen, dass meine Bemühungen und Beiträge zu der Microsoft Dynamics
Community so hoch bewertet werden.
</p>
        <p>
 
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=4d8c906e-3eb6-440f-a1da-973c3c0d3958" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>DynamicsWorld - Microsoft Dynamics Top 100 Influential People </title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,4d8c906e-3eb6-440f-a1da-973c3c0d3958.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,4d8c906e-3eb6-440f-a1da-973c3c0d3958.aspx</link>
      <pubDate>Thu, 11 Jun 2009 17:55:22 GMT</pubDate>
      <description>&lt;p&gt;
Heute bin ich, bei einem meiner "Streifzüge" durch das Internet, auf eine neue Seite
zum Thema Dynamics gestoßen.
&lt;/p&gt;
&lt;p&gt;
Diese neue Seite heißt &lt;a href="http://www.dynamicsworld.co.uk"&gt;DynamicsWorld&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Als einer der ersten Einträge, wurde dort eine Liste der 100 einflussreichsten Menschen,
bezogen auf Microsoft Dynamics, veröffentlicht.&lt;br&gt;
Wie diese Liste erstellt wurde, bzw. welche Kriterien zur Erstellung dieser Liste
verwendet/berücksichtigt wurde&amp;nbsp;ist ebenfalls beschrieben.
&lt;/p&gt;
&lt;p&gt;
Nach einem Blick auf diese Liste war ich sehr erstaunt.&lt;br&gt;
Unter Position 62 ist folgendes zu lesen (Orginalauszug):
&lt;/p&gt;
&lt;p style="TEXT-ALIGN: justify; FONT-SIZE: 12pt" class=MsoNormal align=justify&gt;
&lt;font style="FONT-SIZE: 14pt" size=4&gt;Axel Kühn &lt;/font&gt;
&lt;/p&gt;
&lt;p style="TEXT-ALIGN: justify; FONT-SIZE: 12pt" class=MsoNormal align=justify&gt;
&lt;font style="FONT-SIZE: 12pt" size=3&gt;One of the German Dynamics AX developers who
has resisted the temptation to fall in to the arms of SAP. He has been a regular contributor
to the GLS layer for Germany and is involved in some of the largest AX implementations,
his blog blog.ak-home.net regularly has a readership of over 3000 AX developers and
consultants. &lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Der orginale Eintrag ist &lt;a href="http://www.dynamicsworld.co.uk/page009.html"&gt;hier&lt;/a&gt; zu
finden.
&lt;/p&gt;
&lt;p&gt;
Ich freue mich zu lesen, dass meine Bemühungen und Beiträge zu der Microsoft Dynamics
Community so hoch bewertet werden.
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=4d8c906e-3eb6-440f-a1da-973c3c0d3958" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,4d8c906e-3eb6-440f-a1da-973c3c0d3958.aspx</comments>
      <category>Allgemein;Dynamics Ax</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=06d4c0c2-9748-4a05-bcae-0925f08fee2f</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,06d4c0c2-9748-4a05-bcae-0925f08fee2f.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,06d4c0c2-9748-4a05-bcae-0925f08fee2f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=06d4c0c2-9748-4a05-bcae-0925f08fee2f</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In dem Artikel "<a href="http://blog.ak-home.net/PermaLink,guid,3d8d3d4a-130a-4b2f-8a9e-1328ea6d50c8.aspx">Anzeige
von Lagerdimensionen auf Masken</a>" wurde bereits gezeigt, was zu tun ist, um
die Anzeige von Lagerdimensionen auf Masken dynamisch anpassen zu können bzw. das
Standardverhalten für die Anzeige von Lagerdimensionen zu implementieren.
</p>
        <p>
Manchmal soll eine ähnliche Funktionalität auch für Berichte bereit gestellt werden,
um zum Beispiel vor der Berichtserstellung auswählen zu können, welche Lagerdimensionen
auf dem Bericht(Report) angedruckt werden.<br />
Auch hierfür sind im Dynamics AX Standard die entsprechenden Funktionalitäten (oder
besser Klassen) bereits vorhanden, sodass diese nur verwendet werden müssen.
</p>
        <p>
Als Ausgangsbasis für den Bericht dient ebenfalls die Tabelle „AKU_DemoTable“.<br /><img border="0" src="http://blog.ak-home.net/content/binary/Tabelle.jpg" /></p>
        <p>
Der Bericht soll nun, die in dieser Tabelle gespeicherten Datensätze andrucken/ausgeben.<br /><img border="0" src="http://blog.ak-home.net/content/binary/Report.jpg" /></p>
        <p>
Wie bei Masken, muss auch für einen Bericht, die Query entsprechend um die Tabelle
InventDim ergänzt werden.<br />
Hierbei ist zu beachten, dass die Eigenschaften (Properties) „FetchMode“ auf „1:1“
und „Relations“ auf „Yes“ gesetzt werden.<br /><img border="0" src="http://blog.ak-home.net/content/binary/Report_Datasource_Properties.jpg" /></p>
        <p>
Als nächstes muss nun, ebenfalls analog zu dem Vorgehen bei Masken, die Feldgruppe
„InventoryDimensions“ in den Designzweig des Reports aufgenommen werden.<br />
Beispielhaft wird diese in einem Body-Element erstellt.<br /><img border="0" src="http://blog.ak-home.net/content/binary/Report_Body.jpg" /></p>
        <p>
Nun müssen noch einige Anpassungen an den Methoden des Berichts durchgeführt werden,
damit das gewünschte Ergebnis erreicht werden kann.<br />
Bezogen auf die Möglichkeit, die zu druckenden Lagerdimensionen bestimmen zu können,
müssen die Methoden „classDeclaration“, „run“, „dialog“ und „getFromDialog“ wie folgt
überschrieben werden.<br />
Auch das Überschreiben der Methoden „pack“ und „unpack“ ist hilfreich (für die Lagerdimensionsanzeige
nicht zwingend erforderlich), da über diese die Speicherung der „Nutzungsdaten“ realisiert
wird.
</p>
        <p>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span>
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">class</span> ReportRun
extends ObjectRun<br />
{<br />
   InventDimParm inventDimParm;<br />
   DialogRunbase dialog;<br />
   DialogGroup dialogInventoryDimensions;<br /><br /><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">   #define</span>.CurrentVersion(1)<br />
   #localmacro.CurrentList<br />
      inventDimParm<br />
   #endmacro<br />
}</span>
        </p>
        <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
          <p>
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
              <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> updateDesign()<br />
{<br />
   ;<br />
   InventDimCtrl::updateReportVisible(element, inventDimParm);<br />
}</span>
          </p>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
            <p>
              <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
                <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span>
                <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">void</span> run()<br />
{<br />
   ;<br /><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">   this</span>.updateDesign();<br />
   super();<br />
}</span>
            </p>
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
              <p>
                <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
                  <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span> Object
dialog(Object _dialog)<br />
{<br />
   ;<br />
   dialog <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> _dialog;<br />
   dialogInventoryDimensions <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> inventDimParm.addFieldsToDialog(dialog,<span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"@SYS53654"</span>,<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">true</span>, <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">false</span>, <span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px">"@SYS102592"</span>);<br /><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">   return</span> dialog;<br />
}</span>
              </p>
              <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
                <p>
                  <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
                    <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span> boolean
getFromDialog()<br />
{<br />
   ;<br />
   inventDimParm.getFromDialog(dialog, dialogInventoryDimensions);<br /><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">   return</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">true</span>;<br />
}</span>
                </p>
                <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
                  <p>
                    <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
                      <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span> container
pack()<br />
{<br /><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">   return</span> [#CurrentVersion,
#CurrentList];<br />
}</span>
                  </p>
                  <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
                    <p>
                      <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
                        <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">public</span> boolean
unpack(container packedClass)<br />
{<br />
   Version version <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> RunBase::getVersion(packedClass);<br />
   ;<br /><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">   switch</span>(version)<br />
   {<br /><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">      case</span> #CurrentVersion:<br />
         [version,#CurrentList] <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">=</span> packedClass;<br /><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">         break</span>;<br /><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">      default</span>:<br /><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">         return</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">false</span>;<br />
   }<br /><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">   return</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">true</span>;<br />
}</span>
                    </p>
                  </span>
                </span>
              </span>
            </span>
          </span>
        </span>
        <p>
Wird nun der Bericht geöffnet, zum Beispiel über ein MenuItem, kann in einem Dialog
ausgewählt werden, welche Lagerdimensionen auf dem Report angedruckt werden sollen.<br /></p>
        <p>
          <img border="0" src="http://blog.ak-home.net/content/binary/Report_Dialog.jpg" />
        </p>
        <p>
Der ausgegebene Bericht(Report) sieht, unter Berücksichtigung der im Dialog gewählten
Einstellungen, wie folgt aus.<br /><img border="0" src="http://blog.ak-home.net/content/binary/Report_Ausgabe.jpg" /></p>
        <p>
Das vorgestellt Bespiel steht <a href="http://blog.ak-home.net/content/binary/AKU_Demo_InventDimRep.rar"><font color="#000099">hier</font></a> als
Download bereit um die einzelnen Schritte genau ansehen/nachvollziehen zu können.<br /></p>
        <a href="http://blog.ak-home.net/content/binary/AKU_Demo_InventDimRep.rar">AKU_Demo_InventDimRep.rar
(1,99 KB)</a>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=06d4c0c2-9748-4a05-bcae-0925f08fee2f" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Anzeige von Lagerdimensionen auf Berichten</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,06d4c0c2-9748-4a05-bcae-0925f08fee2f.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,06d4c0c2-9748-4a05-bcae-0925f08fee2f.aspx</link>
      <pubDate>Sat, 04 Apr 2009 17:24:53 GMT</pubDate>
      <description>&lt;p&gt;
In dem&amp;nbsp;Artikel "&lt;a href="http://blog.ak-home.net/PermaLink,guid,3d8d3d4a-130a-4b2f-8a9e-1328ea6d50c8.aspx"&gt;Anzeige
von Lagerdimensionen auf Masken&lt;/a&gt;"&amp;nbsp;wurde bereits gezeigt, was zu tun ist, um
die Anzeige von Lagerdimensionen auf Masken dynamisch anpassen zu können bzw. das
Standardverhalten für die Anzeige von Lagerdimensionen zu implementieren.
&lt;/p&gt;
&lt;p&gt;
Manchmal soll eine ähnliche Funktionalität auch für Berichte bereit gestellt werden,
um zum Beispiel vor der Berichtserstellung auswählen zu können, welche Lagerdimensionen
auf dem Bericht(Report)&amp;nbsp;angedruckt werden.&lt;br&gt;
Auch hierfür sind im Dynamics AX Standard die entsprechenden Funktionalitäten (oder
besser Klassen) bereits vorhanden, sodass diese nur verwendet werden müssen.
&lt;/p&gt;
&lt;p&gt;
Als Ausgangsbasis für den Bericht dient ebenfalls die Tabelle „AKU_DemoTable“.&lt;br&gt;
&lt;img border=0 src="http://blog.ak-home.net/content/binary/Tabelle.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
Der Bericht soll nun, die in dieser Tabelle gespeicherten Datensätze andrucken/ausgeben.&lt;br&gt;
&lt;img border=0 src="http://blog.ak-home.net/content/binary/Report.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
Wie bei Masken, muss auch für einen Bericht, die Query entsprechend um die Tabelle
InventDim ergänzt werden.&lt;br&gt;
Hierbei ist zu beachten, dass die Eigenschaften (Properties) „FetchMode“ auf „1:1“
und „Relations“ auf „Yes“ gesetzt werden.&lt;br&gt;
&lt;img border=0 src="http://blog.ak-home.net/content/binary/Report_Datasource_Properties.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
Als nächstes muss nun, ebenfalls analog zu dem Vorgehen bei Masken, die Feldgruppe
„InventoryDimensions“ in den Designzweig des Reports aufgenommen werden.&lt;br&gt;
Beispielhaft wird diese in einem Body-Element erstellt.&lt;br&gt;
&lt;img border=0 src="http://blog.ak-home.net/content/binary/Report_Body.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
Nun müssen noch einige Anpassungen an den Methoden des Berichts durchgeführt werden,
damit das gewünschte Ergebnis erreicht werden kann.&lt;br&gt;
Bezogen auf die Möglichkeit, die zu druckenden Lagerdimensionen bestimmen zu können,
müssen die Methoden „classDeclaration“, „run“, „dialog“ und „getFromDialog“ wie folgt
überschrieben werden.&lt;br&gt;
Auch das Überschreiben der Methoden „pack“ und „unpack“ ist hilfreich (für die Lagerdimensionsanzeige
nicht zwingend erforderlich), da über diese die Speicherung der „Nutzungsdaten“ realisiert
wird.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;class&lt;/span&gt; ReportRun
extends ObjectRun&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;InventDimParm inventDimParm;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;DialogRunbase dialog;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;DialogGroup dialogInventoryDimensions;&lt;br&gt;
&lt;br&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;#define&lt;/span&gt;.CurrentVersion(1)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;#localmacro.CurrentList&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inventDimParm&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;#endmacro&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt; 
&lt;p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; updateDesign()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;InventDimCtrl::updateReportVisible(element, inventDimParm);&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt; 
&lt;p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;void&lt;/span&gt; run()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;;&lt;br&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;this&lt;/span&gt;.updateDesign();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;super();&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt; 
&lt;p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; Object
dialog(Object _dialog)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;dialog &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; _dialog;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;dialogInventoryDimensions &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; inventDimParm.addFieldsToDialog(dialog,&lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"@SYS53654"&lt;/span&gt;,&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;true&lt;/span&gt;, &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;false&lt;/span&gt;, &lt;span style="BACKGROUND-COLOR: #e4e4e4; FONT-FAMILY: Courier New; COLOR: #666666; FONT-SIZE: 11px"&gt;"@SYS102592"&lt;/span&gt;);&lt;br&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/span&gt; dialog;&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt; 
&lt;p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; boolean
getFromDialog()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;inventDimParm.getFromDialog(dialog, dialogInventoryDimensions);&lt;br&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;true&lt;/span&gt;;&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt; 
&lt;p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; container
pack()&lt;br&gt;
{&lt;br&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/span&gt; [#CurrentVersion,
#CurrentList];&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt; 
&lt;p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;public&lt;/span&gt; boolean
unpack(container packedClass)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Version version &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; RunBase::getVersion(packedClass);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;;&lt;br&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&lt;/span&gt;(version)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&lt;/span&gt; #CurrentVersion:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[version,#CurrentList] &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;=&lt;/span&gt; packedClass;&lt;br&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;/span&gt;;&lt;br&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default&lt;/span&gt;:&lt;br&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;false&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;true&lt;/span&gt;;&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 
&lt;p&gt;
Wird nun der Bericht geöffnet, zum Beispiel über ein MenuItem, kann in einem Dialog
ausgewählt werden, welche Lagerdimensionen auf dem Report angedruckt werden sollen.&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img border=0 src="http://blog.ak-home.net/content/binary/Report_Dialog.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
Der ausgegebene Bericht(Report) sieht, unter Berücksichtigung der im Dialog gewählten
Einstellungen, wie folgt aus.&lt;br&gt;
&lt;img border=0 src="http://blog.ak-home.net/content/binary/Report_Ausgabe.jpg"&gt;
&lt;/p&gt;
&lt;p&gt;
Das vorgestellt Bespiel steht &lt;a href="http://blog.ak-home.net/content/binary/AKU_Demo_InventDimRep.rar"&gt;&lt;font color=#000099&gt;hier&lt;/font&gt;&lt;/a&gt; als
Download bereit um die einzelnen Schritte genau ansehen/nachvollziehen zu können.&lt;br&gt;
&lt;/p&gt;
&lt;a href="http://blog.ak-home.net/content/binary/AKU_Demo_InventDimRep.rar"&gt;AKU_Demo_InventDimRep.rar
(1,99 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=06d4c0c2-9748-4a05-bcae-0925f08fee2f" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,06d4c0c2-9748-4a05-bcae-0925f08fee2f.aspx</comments>
      <category>Dynamics Ax;Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo;Dynamics Ax/Programmierung;Dynamics Ax/Programmierung, Dynamics Ax/HowTo</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=fd018139-6a7c-4cc3-9c20-2beb9449d933</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,fd018139-6a7c-4cc3-9c20-2beb9449d933.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,fd018139-6a7c-4cc3-9c20-2beb9449d933.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=fd018139-6a7c-4cc3-9c20-2beb9449d933</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Heute erhielt ich von Microsoft die erfreuliche Nachricht, dass ich ein weiteres Jahr
den Titel Microsoft Most Valuable Professional tragen darf.
</p>
        <p>
Ich fühle mich geehrt, diese Auszeichnung nun schon zum 2ten mal (in Folge) erhalten
zu haben.
</p>
        <p>
Ich möchte mich an dieser Stelle bei allen bedanken, die mich in den letzten Monaten
immer wieder tatkräftig unterstützt haben.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=fd018139-6a7c-4cc3-9c20-2beb9449d933" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Microsoft MVP 2009 (Dynamics AX)</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,fd018139-6a7c-4cc3-9c20-2beb9449d933.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,fd018139-6a7c-4cc3-9c20-2beb9449d933.aspx</link>
      <pubDate>Wed, 01 Apr 2009 18:34:59 GMT</pubDate>
      <description>&lt;p&gt;
Heute erhielt ich von Microsoft die erfreuliche Nachricht, dass ich ein weiteres Jahr
den Titel Microsoft Most Valuable Professional tragen darf.
&lt;/p&gt;
&lt;p&gt;
Ich fühle mich geehrt, diese Auszeichnung nun schon zum 2ten mal (in Folge) erhalten
zu haben.
&lt;/p&gt;
&lt;p&gt;
Ich möchte mich an dieser Stelle bei allen bedanken, die mich in den letzten Monaten
immer wieder tatkräftig unterstützt haben.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=fd018139-6a7c-4cc3-9c20-2beb9449d933" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,fd018139-6a7c-4cc3-9c20-2beb9449d933.aspx</comments>
      <category>Allgemein</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=3d8d3d4a-130a-4b2f-8a9e-1328ea6d50c8</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,3d8d3d4a-130a-4b2f-8a9e-1328ea6d50c8.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,3d8d3d4a-130a-4b2f-8a9e-1328ea6d50c8.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3d8d3d4a-130a-4b2f-8a9e-1328ea6d50c8</wfw:commentRss>
      <title>Anzeige von Lagerdimensionen auf Masken</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,3d8d3d4a-130a-4b2f-8a9e-1328ea6d50c8.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,3d8d3d4a-130a-4b2f-8a9e-1328ea6d50c8.aspx</link>
      <pubDate>Fri, 13 Mar 2009 16:50:59 GMT</pubDate>
      <description>&lt;p&gt;
Im Standard von Microsoft Dynamics AX besteht auf jeder Maske, auf der Artikel und
deren Lagerdimensionen angezeigt werden, die Möglichkeit, die Lagerdimensionen, bzw.
die angezeigten Felder der Lagerdimensionen, über die Funktion "Lager-Dimensionenanzeige"
entsprechend zu steuern.
&lt;/p&gt;
&lt;p&gt;
Die einzelnen Elemente (Felder) der Lagerdimension können über diese Funktion ein-
bzw. ausgebledet werden.
&lt;/p&gt;
&lt;p&gt;
Weiterhin ist es auch möglich, durch Parametrisierung zu bestimmen, ob ein Feld einer
Lagerdimension eingeben werden muss (Mussfeld) oder ob überhaupt eine Eingabe möglich
ist.
&lt;/p&gt;
&lt;p&gt;
Ein gutes Beispiel hierfür ist die Maske "Aufträge".
&lt;/p&gt;
&lt;p&gt;
Wie ist es nun, wenn eine neue&amp;nbsp;Maske erstellt werden soll, welche Artikelinformation
und Lagerdimensionen anzeigen soll?&lt;br&gt;
Wie genau muss vorgegangen werden,&amp;nbsp;um die bereits an vielen Stellen im Standard
verwendete Funktionalität auch für die selbst erstellte Maske bereitzustellen?&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Gehen wir einmal davon aus, es wurde eine neue Tabelle erstellt, welche die Artikelnummer
(ItemId)&amp;nbsp;und die Lagerdimensionsnummer (InventDimId)&amp;nbsp;speichert.&lt;br&gt;
Für diese Tabelle soll eine Maske erstellt werden, úm dem Benutzer die Möglichkeit
zu geben, Datensätze zu erfassen, zu ändern oder einfach nur anzuzeigen.
&lt;/p&gt;
&lt;p&gt;
Dies könnte z.B. so aussehen:&lt;br&gt;
&lt;img src="http://blog.ak-home.net/content/binary/CreateTableAndForm.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Um nun die Funktion der Lagerdimensionensteuerung einzubauen muss zuerst die Tabelle
InventDim als DataSource der Maske hinzugefügt werden.&lt;br&gt;
Anschließend müssen die Eigenschaften (Properties)&amp;nbsp;der DataSource noch auf folgende
Werte geändert werden.
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;Name&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ebe9ed; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;InventDim&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow: 1"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;JoinSource&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ebe9ed; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;Haupt-Datenquelle (hier: AKUDemoTable)&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow: 2"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;LinkType&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ebe9ed; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;InnerJoin&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow: 3"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;DelayActive&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ebe9ed; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;No&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow: 4"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;InsertAtEnd&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ebe9ed; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;No&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow: 5; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;InsertIfEmpty&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ebe9ed; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;No&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.ak-home.net/content/binary/InventDimProperties.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Nun muss&amp;nbsp;eine neue ButtonGroup (Name: "Inventory") im Designzweig der Maske erstellt
werden. Diese sollte das LAbel "Lager" zugewiesen werden.&lt;br&gt;
Nun noch das MenuItem "InventDimParmFixed" in diese ButtonGroup ziehen (z.B. per drag
&amp;amp; drop aus dem AOT) und dem so erstellten MenuItemButton folgende Eigenschaften
zuweisen.
&lt;/p&gt;
&lt;p&gt;
&lt;table class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellspacing=0 cellpadding=0 border=1&gt;
&lt;tbody&gt;
&lt;tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;Name&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ebe9ed; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;InventDimParmFixed&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow: 1"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;MenuItemName&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ebe9ed; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;InventDimParmFixed&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style="mso-yfti-irow: 2; mso-yfti-lastrow: yes"&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;DataSource&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ebe9ed; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ebe9ed; WIDTH: 230.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-themecolor: text1; mso-border-left-alt: solid black .5pt; mso-border-left-themecolor: text1; mso-border-top-alt: solid black .5pt; mso-border-top-themecolor: text1; mso-border-bottom-themecolor: text1; mso-border-right-themecolor: text1" valign=top width=307&gt;
&lt;p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: normal"&gt;
&lt;font color=#000000&gt;&lt;font face=Calibri&gt;Haupt-Datenquelle (hier: AKUDemoTable)&lt;o:p&gt;&lt;/o:p&gt;
&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.ak-home.net/content/binary/MenuItemButtonInventDimParmFixed.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Über das MenuItem (oder genauer über den erstellten MenuItemButton) wird nun wie im
Standard, die Maske "Lagerdimensionen" zu öffnen.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.ak-home.net/content/binary/FormWithDimSelection.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Allerdings öffnet sich die Maske „Lagerdimensionen“ noch nicht wie gewünscht über
den MenuItemButton. Hierfür sind noch weitere Anpassungen notwendig.
&lt;/p&gt;
&lt;p&gt;
Damit sich die Maske „Lagerdimensionen“ wie gewünscht öffnet muss die neue Maske die
Methode „inventDimSetupObject“ implementieren welche eine Instanz von „InventDimCtrl_Frm“
zurück gibt.
&lt;/p&gt;
&lt;p&gt;
Die Klasse „InventDimCtrl_Frm“, bzw. eine der von ihr abgeleiteten Klassen, steuert
z.B. welche Lagerdimensionen für den aktuellen Datensatz zulässig sind oder welche
Dimensionen für den aktuellen Datensatz angegeben werden müssen, damit dieser gespeichert
werden kann.
&lt;/p&gt;
&lt;p&gt;
Da über die Parametrisierung der Lagersteuerungsgruppen und der Modulparameter hierfür
durchaus unterschiedliche Einstellungen gewählt werden können, sind in Dynamics AX
etliche Ableitungen dieser Klasse vorhanden (jede wird für eine oder mehrere andere
Masken verwendet).
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.ak-home.net/content/binary/InventDimCtrl_Frm.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Je nachdem, was für eine Funktionalität bzw. was für ein Business-Prozess erstellt
werden soll, kann entweder eine der bereits im Standard vorhandenen Klassen verwendet
werden oder es muss eine neue Klasse geschrieben werden, um die benötigte Funktionalität
zu liefern (z.B. welche Dimensionen immer angezeigt werden müssen).
&lt;/p&gt;
&lt;p&gt;
Das Erstellen einer neuen Klasse, welche von „InventDimCtrl_Frm“ abgeleitet&amp;nbsp;
ist, ist recht einfach.
&lt;/p&gt;
&lt;p&gt;
Es sollte immer die Methode „new“ überschrieben werden und mindestens die statischen
Methoden „construct“ und „newFromForm“ erstellt werden. 
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; AKUInventDimCtrl_Frm_Demo
extends InventDimCtrl_Frm&lt;br&gt;
{&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;protected&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt;()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; super();&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; AKUInventDimCtrl_Frm_Demo
construct()&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
return&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; AKUInventDimCtrl_Frm_Demo();&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; AKUInventDimCtrl_Frm_Demo
newFromForm(FormRun _formRun)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; AKUInventDimCtrl_Frm_Demo inventDimCtrl &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; AKUInventDimCtrl_Frm_Demo::construct();&lt;br&gt;
&amp;nbsp; InventDimAxFormAdapter adapter &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; InventDimAxFormAdapter::newFromForm(_formRun);&lt;br&gt;
&amp;nbsp; ;&lt;br&gt;
&amp;nbsp; inventDimCtrl.parmCallingElement(adapter);&lt;br&gt;
&amp;nbsp; inventDimCtrl.init();&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
return&lt;/span&gt; inventDimCtrl;&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Weiterhin können noch andere Methoden überschrieben werden, um z.B. zu steuern, welche
Felder der Tabelle „InventDim“ beim Aufruf der Maske angezeigt werden sollen.&lt;br&gt;
Weitere Informationen hierzu sind im Microsoft Dynamics AX Developer Center zu finden: &lt;a href="http://msdn.microsoft.com/en-us/library/cc618009.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc618009.aspx&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;NoYes
mustShowGridField(fieldId _dimFieldId)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; NoYes ret;&lt;br&gt;
&lt;br&gt;
&amp;nbsp; ret &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; super(_dimFieldId);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
//always show InventLocationId in Grid&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
if&lt;/span&gt;(_dimfieldId == fieldnum(InventDim, InventLocationId))&lt;br&gt;
&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ret &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; NoYes::Yes;&lt;br&gt;
&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
return&lt;/span&gt; ret;&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Wie zuvor beschrieben muss nun die Methode „inventDimSetupObject“ auf der Maske implementiert
werden. Das diese eine Instanz von „InventDimCtrl_Frm“ zurück geben muss, ist diese
ebenfalls zu erzeugen. Als erstes muss eine Objektvariable für das „InventDimCtrl_Frm“
Objekt erstellt werden.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; FormRun
extends ObjectRun&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; InventDimCtrl_Frm inventDimFormSetup;&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Anschließend kann die Methode „inventDimSetupObject“ erstellt werden.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Object
inventDimSetupObject()&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
return&lt;/span&gt; inventDimFormSetup;&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Da die Objektvariable durch diesen Quelltext noch nicht initialisiert wird, muss noch
entsprechender Code zur Initialisierung geschrieben werden.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; updateDesign(InventDimFormDesignUpdate
mode)&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; inventDimParm inventDimParmShow;&lt;br&gt;
&amp;nbsp; inventDimParm inventDimParmEnabled;&lt;br&gt;
&amp;nbsp; ;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
switch&lt;/span&gt; (mode)&lt;br&gt;
&amp;nbsp; {&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
case&lt;/span&gt; InventDimFormDesignUpdate::Init :&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
if&lt;/span&gt; (!inventDimFormSetup)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inventDimFormSetup &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; AKUInventDimCtrl_Frm_Demo::newFromForm(element);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inventDimFormSetup.parmSkipOnHandLookUp(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;true&lt;/span&gt;);&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
case&lt;/span&gt; InventDimFormDesignUpdate::Active :&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inventDimFormSetup.formActiveSetup(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inventTable::find(AKUDemoTable.ItemId).dimGroupId);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inventDimFormSetup.formSetControls(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;true&lt;/span&gt;);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
break&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
case&lt;/span&gt; InventDimFormDesignUpdate::FieldChange :&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inventDimFormSetup.formActiveSetup(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inventTable::find(AKUDemoTable.ItemId).dimGroupId);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inventDim.clearNotSelectedDim(inventDimFormSetup.parmDimParmEnabled());&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inventDimFormSetup.formSetControls(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;true&lt;/span&gt;);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
break&lt;/span&gt;;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
default&lt;/span&gt; :&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
throw&lt;/span&gt; error(strfmt(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@SYS54195"&lt;/span&gt;,funcname()));&lt;br&gt;
&amp;nbsp; } 
&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; init()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; ;&lt;br&gt;
&amp;nbsp; super();&lt;br&gt;
&amp;nbsp; element.updateDesign(InventDimFormDesignUpdate::Init);&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Da die Logik, welche durch die Methode „updateDesign“ bereit gestellt wird, mehrfach
benötigt wird, erfolgt die Initialisierung des „InventDimCtrl_Frm“ Objekts nicht direkt
in der „init“ Methode.
&lt;/p&gt;
&lt;p&gt;
Damit die in der Maske erstellten Datensätze auch richtig gespeichert werden können,
müssen nun noch einige weitere Anpassungen an den Methoden der Datenquellen vorgenommen
werden.&lt;br&gt;
&lt;br&gt;
Datasource „AKUDemoTable“ (Hauptdatenquelle):&lt;br&gt;
Hier sind die Methoden „write“, „validateWrite“ und „active“ zu überschreiben.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; write()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; ;&lt;br&gt;
&amp;nbsp; ttsbegin;&lt;br&gt;
&lt;br&gt;
&amp;nbsp; AKUDemoTable.inventDimId &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; InventDim::findOrCreate(InventDim).inventDimId;&lt;br&gt;
&lt;br&gt;
&amp;nbsp; super();&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
if&lt;/span&gt;(AKUDemoTable.inventDimId !&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; InventDim.inventDimId)&lt;br&gt;
&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; InventDim.data(InventDim::find(AKUDemoTable.inventDimId));&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; InventDim_ds.setCurrent();&lt;br&gt;
&amp;nbsp; }&lt;br&gt;
&lt;br&gt;
&amp;nbsp; ttscommit;&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; boolean
validateWrite()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; boolean ret;&lt;br&gt;
&amp;nbsp; ;&lt;br&gt;
&amp;nbsp; AKUDemoTable.InventDimId &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; inventDim::findOrCreate(InventDim).inventDimId;&lt;br&gt;
&lt;br&gt;
&amp;nbsp; ret &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; super();&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
return&lt;/span&gt; ret;&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; active()&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
int&lt;/span&gt; ret;&lt;br&gt;
&amp;nbsp; ;&lt;br&gt;
&amp;nbsp; ret &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; super();&lt;br&gt;
&lt;br&gt;
&amp;nbsp; element.updateDesign(InventDimFormDesignUpdate::Active);&lt;br&gt;
&lt;br&gt;
&amp;nbsp; inventDim_DS.active();&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
return&lt;/span&gt; ret;&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;
&gt; 
&lt;p&gt;
Datasource „InventDim“:&lt;br&gt;
Hier müssen die Methoden „initValue“ und „write“ überschrieben werden.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; initValue()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; ;&lt;br&gt;
&amp;nbsp; InventDim.data(InventDim::find(AKUDemoTable.inventDimId));&lt;br&gt;
&lt;br&gt;
&amp;nbsp; super();&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; write()&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
//super();&lt;/span&gt;
&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Hierbei muss unbedingt beachtet werden, dass der „super“ Aufruf in der „write“ Methode
der Datasource „InventDim“ auskommentiert wird, um das Speichern von falschen InventDim
Datensätzen zu verhindern.
&lt;/p&gt;
&lt;p&gt;
Als letzte Methode sollte nun noch die Methode „modified“ des DataSource-Field „ItemId“
der Datasource „AKUDemoTable“ überschrieben werden, damit auf eine Änderung der Artikelnummer
reagiert werden kann (z.B. Artikelabhängige Anzeige der Lagerdimensionen).
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; modified()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp; ;&lt;br&gt;
&amp;nbsp; super();&lt;br&gt;
&amp;nbsp; element.updateDesign(InventDimFormDesignUpdate::FieldChange);&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Somit sind alle benötigten Quelltextanpassungen durchgeführt, sodass nur noch die
Feldgruppe „InventoryDimensions“ der DataSource „InventDim“ mit in das Grid gezogen
werden muss um die Lagerdimensionen auf der Maske anzuzeigen. Optional kann diese
auch in die TabPage „Dimensions“ gezogen werden um ein standardkonformes Aussehen
der Maske zu erhalten.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.ak-home.net/content/binary/FiledgorupInventoryDimensions.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Das vorgestellt Bespiel steht &lt;a href="http://blog.ak-home.net/content/binary/AKU_Demo_InventDimFrm.rar"&gt;hier&lt;/a&gt; als
Download bereit um die einzelnen Schritte genau ansehen/nachvollziehen zu können.&lt;br&gt;
&lt;a href="http://blog.ak-home.net/content/binary/AKU_Demo_InventDimFrm.rar"&gt;AKU_Demo_InventDimFrm.rar
(2,71 KB)&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=3d8d3d4a-130a-4b2f-8a9e-1328ea6d50c8" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,3d8d3d4a-130a-4b2f-8a9e-1328ea6d50c8.aspx</comments>
      <category>Allgemein;Dynamics Ax;Dynamics Ax/HowTo;Dynamics Ax/Programmierung;Dynamics Ax/Programmierung/API</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=24601242-7843-49f8-9fee-821f57ac7d55</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,24601242-7843-49f8-9fee-821f57ac7d55.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,24601242-7843-49f8-9fee-821f57ac7d55.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=24601242-7843-49f8-9fee-821f57ac7d55</wfw:commentRss>
      <title>Dynamics AX 2009 - Ungewollt den Sys Layer ändern</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,24601242-7843-49f8-9fee-821f57ac7d55.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,24601242-7843-49f8-9fee-821f57ac7d55.aspx</link>
      <pubDate>Wed, 11 Mar 2009 19:22:18 GMT</pubDate>
      <description>&lt;p&gt;
Leider scheint es ein Problem mit duplizierten Tabellen in Dynamics AX 2009 zu geben.&lt;br&gt;
Unter gewissen "Umständen" ist es möglich, Quelltext der in einem andern Layer (z.B.
CUS oder BUS) geschrieben wurde, in den SYS Layer zu "verschieben". 
&lt;/p&gt;
&lt;p&gt;
Dieser Verhalten ist sehr unschön, da viele Entwickler, z.B. für Testzwecke, mal ein
Objekt duplizieren, neuen Quelltext testen und anschließen diesen&amp;nbsp;auf das orginale
Objekt übernehmen oder verschieben. Leider taucht genau an dieser Stelle das Problem
auf (es kann sein, dass dieses "Verschieben" den Quelltext in den SYS Layer schreibt).
&lt;/p&gt;
&lt;p&gt;
Das genaue Verhalten ist in einem Video von "elranu"&amp;nbsp;auf YouTube beschrieben
(&lt;a href="http://www.youtube.com/watch?v=4HEwNyVAwtI"&gt;Link zum Video&lt;/a&gt;):
&lt;/p&gt;
&lt;p&gt;
&lt;object height=344 width=425&gt;
&lt;param name="movie" value="http://www.youtube.com/v/4HEwNyVAwtI&amp;amp;hl=de&amp;amp;fs=1"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowscriptaccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/4HEwNyVAwtI&amp;hl=de&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;
In den Newsgroups ist auch ein entsprechender Thread zu finden: &lt;a href="http://www.microsoft.com/Businesssolutions/Community/NewsGroups/dgbrowser/en-us/default.mspx?&amp;amp;query=ax+2009+sys+layer&amp;amp;lang=en&amp;amp;cr=US&amp;amp;guid=&amp;amp;sloc=en-us&amp;amp;dg=microsoft.public.axapta.programming&amp;amp;p=1&amp;amp;tid=9165d668-001b-4d67-8f7c-10569306bbb7&amp;amp;mid=bd0fc4ff-701a-4bed-8c30-ef00687bfbc5"&gt;&lt;strong&gt;Ax
2009 bug in Sys L&lt;wbr&gt;ayer &lt;/strong&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=24601242-7843-49f8-9fee-821f57ac7d55" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,24601242-7843-49f8-9fee-821f57ac7d55.aspx</comments>
      <category>Dynamics Ax;Dynamics AX/Dynamics AX 2009;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=dcaffcda-fd12-4fec-984d-97ded22c5517</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,dcaffcda-fd12-4fec-984d-97ded22c5517.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,dcaffcda-fd12-4fec-984d-97ded22c5517.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=dcaffcda-fd12-4fec-984d-97ded22c5517</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wie in einem Artikel auf der Microsoft Dynamics AX Webseite zu lesen ist wird der
"alte" COM Business Connector nicht mehr in zukünftigen Versionen von Dynamics AX
enthalten sein.<br /><a href="http://www.microsoft.com/dynamics/ax/using/ax_combizconnector.mspx">The COM
Business Connector will be discontinued in future releases of Microsoft Dynamics AX</a></p>
        <p>
Bereits in der Version 2009 von Microsoft Dynamics AX wird der COM Business Connector
vom "normalen" Setup nicht mehr angeboten.<br />
Dieser muss manuell, wie im Microsoft Dynamics AX Developer Center beschrieben, nachinstalliert
werden.<br /><a href="http://msdn.microsoft.com/en-us/library/cc624322.aspx">How to: Install COM
Business Connector using Command-line Options</a></p>
        <p>
Somit ist es an der Zeit, bestehende Lösungen welche den COM Business Connector verwenden,
auf den neueren .NET Business Connector zu portieren, um diese Lösungen auch in zukünftigen
Versionen verwenden zu können.
</p>
        <p>
Alle benötigten Informationen über die Verwendung des .NET Business Connectors können
in der Library des Microsoft Dynamics AX Developer Centers gefunden werden<br /><a href="http://msdn.microsoft.com/en-us/library/aa659581.aspx">.NET Business Connector
Overview</a></p>
        <p>
 
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=dcaffcda-fd12-4fec-984d-97ded22c5517" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Microsoft Dynamics AX - Der COM Business Connector wird in zukünftigen Versionen nicht mehr unterstützt</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,dcaffcda-fd12-4fec-984d-97ded22c5517.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,dcaffcda-fd12-4fec-984d-97ded22c5517.aspx</link>
      <pubDate>Mon, 02 Mar 2009 19:21:05 GMT</pubDate>
      <description>&lt;p&gt;
Wie in einem Artikel auf der Microsoft Dynamics AX Webseite zu lesen ist wird der
"alte" COM Business Connector nicht mehr in zukünftigen Versionen von Dynamics AX
enthalten sein.&lt;br&gt;
&lt;a href="http://www.microsoft.com/dynamics/ax/using/ax_combizconnector.mspx"&gt;The COM
Business Connector will be discontinued in future releases of Microsoft Dynamics AX&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Bereits in der Version 2009 von Microsoft Dynamics AX wird der COM Business Connector
vom "normalen" Setup nicht mehr angeboten.&lt;br&gt;
Dieser muss manuell, wie im Microsoft Dynamics AX Developer Center beschrieben,&amp;nbsp;nachinstalliert
werden.&lt;br&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/cc624322.aspx"&gt;How to: Install COM
Business Connector using Command-line Options&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Somit ist es an der Zeit, bestehende Lösungen welche den COM Business Connector verwenden,
auf den neueren .NET Business Connector zu portieren, um diese Lösungen auch in zukünftigen
Versionen verwenden zu können.
&lt;/p&gt;
&lt;p&gt;
Alle benötigten Informationen über die Verwendung des .NET Business Connectors können
in der Library des Microsoft Dynamics AX Developer Centers gefunden werden&lt;br&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/aa659581.aspx"&gt;.NET Business Connector
Overview&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=dcaffcda-fd12-4fec-984d-97ded22c5517" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,dcaffcda-fd12-4fec-984d-97ded22c5517.aspx</comments>
      <category>Allgemein;Dynamics Ax;Dynamics Ax/Administration;Dynamics Ax/Programmierung;Dynamics Ax/Programmierung/.NET</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=514153a0-b0ff-4af7-b6f3-73645f99f656</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,514153a0-b0ff-4af7-b6f3-73645f99f656.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,514153a0-b0ff-4af7-b6f3-73645f99f656.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=514153a0-b0ff-4af7-b6f3-73645f99f656</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Oft ist in Newsgroups und Foren die Frage zu lesen, wie .NET (CLR) Arrays in X++ verwendet,
bzw. wie diese deklariert werden können.<br />
Im Großen und Ganzen unterscheidet sich die Syntax für die Verwendung eines .NET Array
kaum von der eines reinen X++ Array.<br />
.NET Arrays können in X++ sogar auf zwei verschiedene Arten deklariert werden.
</p>
        <p>
          <u>Variante 1:</u>
        </p>
        <p>
Die Deklaration eines .NET Arrays erfolgt analog zu der Deklaration eines "reinen"
X++ Arrays:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">System.Object[]
arrayOfObjects;<br />
System.Int32[] arrayOfIntegers;<br /><br /></span>
        </p>
        <p>
Die Syntax für die Instanzierung des .NET Array weicht allerdings leicht von der "normalen"
X++ Syntax ab:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">arrayOfObjects <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> System.Object[10]();<br />
arrayOfIntegers <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> System.Int32[3]();<br /><br /></span>
        </p>
        <p>
Wichtig ist hierbei, dass immer "()" verwendet wird.
</p>
        <p>
Um die Werte eines .NET Arrays zu setzen wird die Methode "SetValue()" verwendet:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">arrayOfObjects.SetValue(myObject,
0);<br />
arrayOfIntegers.SetValue(300, 1);<br /><br /></span>
        </p>
        <p>
Um Werte aus einem Array abzufragen kann die Methode "GetValue" verwendet werden:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">arrayOfObjects.GetValue(0);<br />
arrayOfIntegers.GetValue(1);<br /><br /></span>
        </p>
        <p>
Eine weitere sehr nützliche Methode ist die Methode "get_Length()". Diese liefert
die Anzahl der Array-Elemente zurück.
</p>
        <p>
          <u>Variante 2:</u>
        </p>
        <p>
Alternativ zur ersten Variante besteht noch die Möglichkeit, ein .NET Array über die
Klasse System.Array zu erzeugen.<br />
Leider stößt man bei diesem Weg immer mal wieder auf kleinere Probleme, weswegen die
erste Variante für die Verwendung von .NET Array bevorzugt werden sollte.
</p>
        <p>
Eine etwas ausführlichere Beschreibung der Verwendung von .NET Array in X++ bzw. deren
besonderheiten und Abweichungen zur "normalen" X++ Syntax kann im Microsoft Dynamics
AX Developer Center gefunden werden.
</p>
        <p>
          <a href="http://msdn.microsoft.com/en-us/library/cc557456.aspx">How to: Use X++ Syntax
for CLR Arrays</a>
        </p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=514153a0-b0ff-4af7-b6f3-73645f99f656" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Microsoft Dynamics AX - X++ und .NET (CLR) Arrays </title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,514153a0-b0ff-4af7-b6f3-73645f99f656.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,514153a0-b0ff-4af7-b6f3-73645f99f656.aspx</link>
      <pubDate>Mon, 02 Mar 2009 18:40:39 GMT</pubDate>
      <description>&lt;p&gt;
Oft ist in Newsgroups und Foren die Frage zu lesen, wie .NET (CLR) Arrays in X++ verwendet,
bzw. wie diese deklariert werden können.&lt;br&gt;
Im Großen und Ganzen unterscheidet sich die Syntax für die Verwendung eines .NET Array
kaum von der eines reinen X++ Array.&lt;br&gt;
.NET Arrays können in X++ sogar auf zwei verschiedene Arten deklariert werden.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Variante 1:&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
Die Deklaration eines .NET Arrays erfolgt analog zu der Deklaration eines "reinen"
X++ Arrays:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;System.Object[]
arrayOfObjects;&lt;br&gt;
System.Int32[] arrayOfIntegers;&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Die Syntax für die Instanzierung des .NET Array weicht allerdings leicht von der "normalen"
X++ Syntax ab:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;arrayOfObjects &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; System.Object[10]();&lt;br&gt;
arrayOfIntegers &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; System.Int32[3]();&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Wichtig ist hierbei, dass immer "()" verwendet wird.
&lt;/p&gt;
&lt;p&gt;
Um die Werte eines .NET Arrays zu setzen wird die Methode "SetValue()" verwendet:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;arrayOfObjects.SetValue(myObject,
0);&lt;br&gt;
arrayOfIntegers.SetValue(300, 1);&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Um Werte aus einem Array abzufragen kann die Methode "GetValue" verwendet werden:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;arrayOfObjects.GetValue(0);&lt;br&gt;
arrayOfIntegers.GetValue(1);&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Eine weitere sehr nützliche Methode ist die Methode "get_Length()". Diese liefert
die Anzahl der Array-Elemente zurück.
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;Variante 2:&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
Alternativ zur ersten Variante besteht noch die Möglichkeit, ein .NET Array über die
Klasse System.Array zu erzeugen.&lt;br&gt;
Leider stößt man bei diesem Weg immer mal wieder auf kleinere Probleme, weswegen die
erste Variante für die Verwendung von .NET Array bevorzugt werden sollte.
&lt;/p&gt;
&lt;p&gt;
Eine etwas ausführlichere Beschreibung der Verwendung von .NET Array in X++ bzw. deren
besonderheiten und Abweichungen zur "normalen" X++ Syntax kann im Microsoft Dynamics
AX Developer Center gefunden werden.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://msdn.microsoft.com/en-us/library/cc557456.aspx"&gt;How to: Use X++ Syntax
for CLR Arrays&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=514153a0-b0ff-4af7-b6f3-73645f99f656" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,514153a0-b0ff-4af7-b6f3-73645f99f656.aspx</comments>
      <category>Dynamics Ax;Dynamics Ax/HowTo;Dynamics Ax/Programmierung;Dynamics Ax/Programmierung/.NET</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=d68de873-df06-4172-b927-a9bc15e1f81e</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,d68de873-df06-4172-b927-a9bc15e1f81e.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,d68de873-df06-4172-b927-a9bc15e1f81e.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=d68de873-df06-4172-b927-a9bc15e1f81e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Wer schon mit dem AIF in der Version 4.0 von Microsoft Dynamics AX gearbeitet hat
wird sich daran erinnern, dass ein Debuggen des Quellcodes, welcher durch das
AIF ausgeführt wird, nur möglich ist, wenn hierfür eine kleine Codeanpassung
in den Klassen "AifInboundProcessingService" und "AifOutboundProcessingService" vorgenommen
wird.<br />
Das genaue Vorgehen für die Version 4.0 von Dynamics AX ist in diesem <a href="http://casperkamal.spaces.live.com/blog/cns!9138ED475277CD63!175.entry">Artikel</a> beschrieben.
</p>
        <p>
Für Dynamics AX 2009 kann diese Quellcodeänderung allerdings nicht so ohne weiteres
angewendet werden, da für Dynamics AX 2009 einige Features ergänzt wurden (z.B. paralelle
Verarbeitung von AIF Nachrichten) und somit der Quellcode der beiden Klassen einige
Abweichungen zu dem der Version 4.0 hat.
</p>
        <p>
          <font size="3">
            <u>Debuggen von ausgehenden Nachrichten</u>
          </font>
        </p>
        <p>
Um das Debuggen von ausgehenden Nachrichten zu ermöglichen, muss die Methode "runAsWrapper"
der Klasse "AifOutboundProcessingService" angepasst werden.<br />
Der Aufruf von "runAS" (Zeile 22) muss durch "AifOutboundProcessingService::processAsUser(messageIdContainer)"
ersetzt werden.
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">...<br />
try</span>
            <br />
{<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
runAs currentUser and process all messages in the container.</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   new</span> RunAsPermission(runAsUserId).assert();<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
AKU, Enable Debuging for outbound messages - START --&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
Do not use in production system!!!</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
BP deviation documented</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //runas(runAsUserId,</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
classnum(AifOutboundProcessingService),</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
staticmethodstr(AifOutboundProcessingService, processAsUser),</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
messageIdContainer,</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
runAsCompany);</span><br />
   AifOutboundProcessingService::processAsUser(messageIdContainer);<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
AKU, Enable Debuging for ourbound message - END --&gt;</span><br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
Revert the permission</span><br />
   CodeAccessPermission::revertAssert();<br />
}<br /></span>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">...</span>
        </p>
        <p>
          <font size="3">
            <u>Debuggen von eingehenden Nachrichten</u>
          </font>
        </p>
        <p>
Um das Debuggen von eingehenden Nachrichten zu ermöglichen, muss die Methode "runAsWrapper"
der Klasse "AifInboundProcessingService" angepasst werden.<br />
Der Aufruf von "runAS" (Teile 24) muss durch "AifInboundProcessingService::processAsUser(messageIdContainer)"
ersetzt werden.
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">...<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">try</span><br />
{<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
Convert to Axapta UserId</span><br />
   axaptaUserId <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> AifEndpointUser::getAxaptaUser(runAsUserId).Id;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   new</span> RunAsPermission(axaptaUserId).assert();<br /><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
AKU, Enable Debuging - START --&gt;</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
Do not use in production system!!!</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
BP deviation documented</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //runas(axaptaUserId,</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
classnum(AifInboundProcessingService),</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
staticmethodstr(AifInboundProcessingService, processAsUser),</span><br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
messageIdContainer);</span><br />
   AifInboundProcessingService::processAsUser(messageIdContainer);<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //
AKU, Enable Debuging - END --&gt;</span><br /><br />
   CodeAccessPermission::revertAssert();<br />
}<br />
...<br /></span>
        </p>
        <p>
Für beide Quellcodeänderung sollte noch erwähnt werden, dass diese in einem Produktivsystem
nicht durchgeführt werden sollten, da dies Auswirkungen auf die Verarbeitung der Stapelprozesse
des AIF's haben könnte.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=d68de873-df06-4172-b927-a9bc15e1f81e" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>AIF debuggen mit Dynamics AX 2009</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,d68de873-df06-4172-b927-a9bc15e1f81e.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,d68de873-df06-4172-b927-a9bc15e1f81e.aspx</link>
      <pubDate>Fri, 06 Feb 2009 22:29:08 GMT</pubDate>
      <description>&lt;p&gt;
Wer schon mit dem AIF in der Version 4.0 von Microsoft Dynamics AX gearbeitet hat
wird sich daran erinnern, dass ein Debuggen des Quellcodes, welcher durch&amp;nbsp;das
AIF ausgeführt wird,&amp;nbsp;nur möglich ist, wenn hierfür eine kleine Codeanpassung
in den Klassen "AifInboundProcessingService" und "AifOutboundProcessingService" vorgenommen
wird.&lt;br&gt;
Das genaue Vorgehen für die Version 4.0 von Dynamics AX ist in diesem &lt;a href="http://casperkamal.spaces.live.com/blog/cns!9138ED475277CD63!175.entry"&gt;Artikel&lt;/a&gt; beschrieben.
&lt;/p&gt;
&lt;p&gt;
Für Dynamics AX 2009 kann diese Quellcodeänderung allerdings nicht so ohne weiteres
angewendet werden, da für Dynamics AX 2009 einige Features ergänzt wurden (z.B. paralelle
Verarbeitung von AIF Nachrichten) und somit der Quellcode der beiden Klassen einige
Abweichungen zu dem der Version 4.0 hat.
&lt;/p&gt;
&lt;p&gt;
&lt;font size=3&gt;&lt;u&gt;Debuggen von ausgehenden Nachrichten&lt;/u&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Um das Debuggen von ausgehenden Nachrichten zu ermöglichen, muss die Methode "runAsWrapper"
der Klasse "AifOutboundProcessingService" angepasst werden.&lt;br&gt;
Der Aufruf von "runAS" (Zeile 22) muss durch "AifOutboundProcessingService::processAsUser(messageIdContainer)"
ersetzt werden.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;...&lt;br&gt;
try&lt;/span&gt;
&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
runAs currentUser and process all messages in the container.&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;new&lt;/span&gt; RunAsPermission(runAsUserId).assert();&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
AKU, Enable Debuging for outbound messages - START --&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
Do not use in production system!!!&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
BP deviation documented&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//runas(runAsUserId,&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
classnum(AifOutboundProcessingService),&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
staticmethodstr(AifOutboundProcessingService, processAsUser),&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
messageIdContainer,&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
runAsCompany);&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;AifOutboundProcessingService::processAsUser(messageIdContainer);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
AKU, Enable Debuging for ourbound message - END --&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
Revert the permission&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;CodeAccessPermission::revertAssert();&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;...&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size=3&gt;&lt;u&gt;Debuggen von eingehenden Nachrichten&lt;/u&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Um das Debuggen von eingehenden Nachrichten zu ermöglichen, muss die Methode "runAsWrapper"
der Klasse "AifInboundProcessingService" angepasst werden.&lt;br&gt;
Der Aufruf von "runAS" (Teile 24) muss durch "AifInboundProcessingService::processAsUser(messageIdContainer)"
ersetzt werden.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;...&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;try&lt;/span&gt;
&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
Convert to Axapta UserId&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;axaptaUserId &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; AifEndpointUser::getAxaptaUser(runAsUserId).Id;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;new&lt;/span&gt; RunAsPermission(axaptaUserId).assert();&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
AKU, Enable Debuging - START --&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
Do not use in production system!!!&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
BP deviation documented&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//runas(axaptaUserId,&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
classnum(AifInboundProcessingService),&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
staticmethodstr(AifInboundProcessingService, processAsUser),&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
messageIdContainer);&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;AifInboundProcessingService::processAsUser(messageIdContainer);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
AKU, Enable Debuging - END --&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;CodeAccessPermission::revertAssert();&lt;br&gt;
}&lt;br&gt;
...&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Für beide Quellcodeänderung sollte noch erwähnt werden, dass diese in einem Produktivsystem
nicht durchgeführt werden sollten, da dies Auswirkungen auf die Verarbeitung der Stapelprozesse
des AIF's haben könnte.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=d68de873-df06-4172-b927-a9bc15e1f81e" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,d68de873-df06-4172-b927-a9bc15e1f81e.aspx</comments>
      <category>Dynamics AX/AIF;Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=ef93e4ea-4344-445a-8afa-db59ed706dfa</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,ef93e4ea-4344-445a-8afa-db59ed706dfa.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,ef93e4ea-4344-445a-8afa-db59ed706dfa.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ef93e4ea-4344-445a-8afa-db59ed706dfa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Das Application Integration Framework von Dynamics AX basiert auf Dokumenten (Axd&lt;Document&gt;
Klassen).<br />
Eigene Dokumente lassen sich reicht einfach per Hand oder mit Hilfe des Dokumenten-Wizards
erstellen.<br />
In der Version 2009 von Dynamics AX erstellt dieser Wizard auch gleichzeitig den benötigenten
Service (WCF-Webservice) und andere benötigte Elemente wie (Serviceklassen und Macros).<br />
Welche Schritte hierfür benötigt werden ist zum Beispiel im <a href="http://msdn.microsoft.com/en-us/library/aa856656.aspx">Microsoft
Dynamics AX Developer Center</a> beschrieben.
</p>
        <p>
Ein kleines Problem entsteht, wenn das neue Dokument, genauer gesagt die Elemente
oder Objekte des Dokuments, in einem Layer (zum Beispiel CUS-Layer) entwickelt wird
und später, aus welchen Gründen auch immer, alle Objekte des Dokuments (Query, Ax&lt;Table&gt;
Class, Axd&lt;Document&gt; Class) in einen anderen Layer (zum Beispiel VAR-Layer)
verschoben werden.
</p>
        <p>
Nach der "Verschiebung" des neuen Dokuments in einen anderen Entwicklungslayer werden
durch die AIF-Konfigurationsmasken (siehe Maske Dienstleistungen) allerdings keine
Operationen (Insert, Update, Delete, FindKey, etc.) mehr angezeigt.<br />
Auch an anderen Stellen, wie zum Beispiel der Endpunktkonfiguration, sind die entsprechenden
Operationen nicht mehr auswählbar oder vorhanden.
</p>
        <p>
Der Grund hierfür liegt in der ClassId der Serviceklasse des neuen Dokuments. Dieser,
wie auch jedem anderen Objekt, wird beim Import in einen anderen Layer eine neue ID
zugewiesen, wenn nicht explizit angegeben wurde, dass der Export und Import mit ID's
erfolgen soll. So kann es sein, dass die Klasse mit der ID 40001 nach dem Import in
einen anderen Layer die ID 300001 zugeordnet ist.
</p>
        <p>
Da wärend der Konfiguration des AIF's der AOT nach Dokumenten/Services durchsucht
wird und für jedes Dokument bzw. jeden Service ein Datensatz in der Tabelle "AifService"
sowie ein bis mehrere Datensätze in der Tabelle "AifAction" erzeugt wird, welche alle
eine Referenz auf die ClassId der Serviceklasse enthalten, kommt es jetzt zu dem genannten
Problem.<br />
Der Id 40001 ist nun keine Klasse oder noch schlimmer eine andere Klasse zugewiesen.
Auch eine "Aktualisierung" dieser Datensätze über die Aktualisierungsfunktion, welche
auf der Maske Dienstleistungen bereit gestellt wird, führt nicht zum gewünschten Erfolg.
</p>
        <p>
Genau in dieser Funktion scheint sich ein kleiner Fehler eingeschlichen zu haben.
Dort wird zwar eine Aktulisierung der ClassId für die Datensätze der Tabelle "AifService",
aber nicht für die Datensätze der Tabelle "AifAction", durchgeführt.
</p>
        <p>
Um diese Verhalten zu reproduzieren, muss folgendes gemacht werden:
</p>
        <ol>
          <li>
Erstellen eines neuen AIF Dokuments bzw. AIF Services.</li>
          <li>
Über die Maske Dienstleistungen, zu finden unter "Grundeinstellungen -&gt; Einstellungen
-&gt; Application Integration Framework -&gt; Dienstleistungen", Funktion "Aktualisieren"
das neue Dokument / den neuen Service "aktivieren".</li>
          <li>
Über den Button "Servicearbeitsgänge" können nun alle Operationen welche durch das
Dokument / den Service bereit gestellt werden eingesehen werden.</li>
          <li>
Verschieben aller Elemente des Dokuments / des Services in einen anderen Layer.</li>
          <li>
Schritt 2 erneut druchführen.</li>
          <li>
Über den Button "Servicearbeitsgänge" werden keine Operation mehr angezeigt.</li>
        </ol>
        <p>
Um dieses Problem zu lösen, gibt 2 Möglichkeiten.
</p>
        <p>
Entweder manuelles Löschen alle zu diesem Dokument/Service gehörigen Datensätze
der Tabelle "AifAction" oder aber man ergänzt die Methode "registerOperations" der
Klasse "AifServiceGenerationManager" um ein wenig X++ Code (bei Zeile 43) welcher
nicht nur den Namen der Operation aktualisiert sondern auch die ClassId.<br />
Da dieser Code sehr einfach ist verzichte ich an dieser Stelle auf ein Beispiel.
</p>
        <p>
Leider tritt dieses Problem auch mit Dynamics AX 2009 Service Pack 1 auf.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=ef93e4ea-4344-445a-8afa-db59ed706dfa" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Microsoft Dynamics AX AIF - Dokumente, Services aber keine Operationen?</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,ef93e4ea-4344-445a-8afa-db59ed706dfa.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,ef93e4ea-4344-445a-8afa-db59ed706dfa.aspx</link>
      <pubDate>Tue, 27 Jan 2009 18:46:19 GMT</pubDate>
      <description>&lt;p&gt;
Das Application Integration Framework von Dynamics AX basiert auf Dokumenten (Axd&amp;lt;Document&amp;gt;
Klassen).&lt;br&gt;
Eigene Dokumente lassen sich reicht einfach per Hand oder mit Hilfe des Dokumenten-Wizards
erstellen.&lt;br&gt;
In der Version 2009 von Dynamics AX erstellt dieser Wizard auch gleichzeitig den benötigenten
Service (WCF-Webservice) und andere benötigte Elemente wie (Serviceklassen und Macros).&lt;br&gt;
Welche Schritte hierfür benötigt werden ist zum Beispiel im &lt;a href="http://msdn.microsoft.com/en-us/library/aa856656.aspx"&gt;Microsoft
Dynamics AX Developer Center&lt;/a&gt; beschrieben.
&lt;/p&gt;
&lt;p&gt;
Ein kleines Problem entsteht, wenn das neue Dokument, genauer gesagt die Elemente
oder Objekte des Dokuments, in einem Layer (zum Beispiel CUS-Layer) entwickelt wird
und später, aus welchen Gründen auch immer, alle Objekte des Dokuments (Query, Ax&amp;lt;Table&amp;gt;
Class, Axd&amp;lt;Document&amp;gt; Class) in einen anderen Layer (zum Beispiel VAR-Layer)
verschoben werden.
&lt;/p&gt;
&lt;p&gt;
Nach der "Verschiebung" des neuen Dokuments in einen anderen Entwicklungslayer werden
durch die AIF-Konfigurationsmasken (siehe Maske Dienstleistungen) allerdings keine
Operationen (Insert, Update, Delete, FindKey, etc.)&amp;nbsp;mehr angezeigt.&lt;br&gt;
Auch an anderen Stellen, wie zum Beispiel der Endpunktkonfiguration, sind die entsprechenden
Operationen nicht mehr auswählbar oder vorhanden.
&lt;/p&gt;
&lt;p&gt;
Der Grund hierfür liegt in der ClassId der Serviceklasse des neuen Dokuments. Dieser,
wie auch jedem anderen Objekt, wird beim Import in einen anderen Layer eine neue ID
zugewiesen, wenn nicht explizit angegeben wurde, dass der Export und Import mit ID's
erfolgen soll. So kann es sein, dass die Klasse mit der ID 40001 nach dem Import in
einen anderen Layer die ID 300001 zugeordnet ist.
&lt;/p&gt;
&lt;p&gt;
Da wärend der Konfiguration des AIF's der AOT nach Dokumenten/Services durchsucht
wird und für jedes Dokument bzw. jeden Service ein Datensatz in der Tabelle "AifService"
sowie ein bis mehrere Datensätze in der Tabelle "AifAction" erzeugt wird, welche alle
eine Referenz auf die ClassId der Serviceklasse enthalten, kommt es jetzt zu dem genannten
Problem.&lt;br&gt;
Der Id 40001 ist nun keine Klasse oder noch schlimmer eine andere Klasse zugewiesen.
Auch eine "Aktualisierung" dieser Datensätze über die Aktualisierungsfunktion, welche
auf der Maske Dienstleistungen bereit gestellt wird, führt nicht zum gewünschten Erfolg.
&lt;/p&gt;
&lt;p&gt;
Genau in dieser Funktion scheint sich ein kleiner Fehler eingeschlichen zu haben.
Dort wird zwar eine Aktulisierung der ClassId für die Datensätze der Tabelle "AifService",
aber nicht für die Datensätze der Tabelle "AifAction", durchgeführt.
&lt;/p&gt;
&lt;p&gt;
Um diese Verhalten zu reproduzieren, muss folgendes gemacht werden:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Erstellen eines neuen AIF Dokuments bzw. AIF Services.&lt;/li&gt;
&lt;li&gt;
Über die Maske Dienstleistungen, zu finden unter&amp;nbsp;"Grundeinstellungen -&amp;gt; Einstellungen
-&amp;gt; Application Integration Framework -&amp;gt; Dienstleistungen", Funktion "Aktualisieren"
das neue Dokument / den neuen Service "aktivieren".&lt;/li&gt;
&lt;li&gt;
Über den Button "Servicearbeitsgänge" können nun alle Operationen welche durch das
Dokument / den Service bereit gestellt werden eingesehen werden.&lt;/li&gt;
&lt;li&gt;
Verschieben aller Elemente des Dokuments / des Services in einen anderen Layer.&lt;/li&gt;
&lt;li&gt;
Schritt 2 erneut druchführen.&lt;/li&gt;
&lt;li&gt;
Über den Button "Servicearbeitsgänge" werden keine Operation mehr angezeigt.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Um dieses Problem zu lösen, gibt 2 Möglichkeiten.
&lt;/p&gt;
&lt;p&gt;
Entweder&amp;nbsp;manuelles Löschen&amp;nbsp;alle zu diesem Dokument/Service gehörigen Datensätze
der Tabelle "AifAction" oder aber man ergänzt die Methode "registerOperations" der
Klasse "AifServiceGenerationManager" um ein wenig X++ Code (bei Zeile 43)&amp;nbsp;welcher
nicht nur den Namen der Operation aktualisiert sondern auch die ClassId.&lt;br&gt;
Da dieser Code sehr einfach ist verzichte ich an dieser Stelle auf ein Beispiel.
&lt;/p&gt;
&lt;p&gt;
Leider tritt dieses Problem auch mit Dynamics AX 2009 Service Pack 1 auf.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=ef93e4ea-4344-445a-8afa-db59ed706dfa" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,ef93e4ea-4344-445a-8afa-db59ed706dfa.aspx</comments>
      <category>Allgemein;Dynamics Ax;Dynamics Ax/Administration;Dynamics AX/AIF;Dynamics AX/Dynamics AX 2009;Dynamics Ax/HowTo;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=db4cdf8e-8cfa-4837-9371-a8362a319290</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,db4cdf8e-8cfa-4837-9371-a8362a319290.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,db4cdf8e-8cfa-4837-9371-a8362a319290.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=db4cdf8e-8cfa-4837-9371-a8362a319290</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
In Microsoft Dynamics AX werden alle Informationsmeldungen, Warnungen und Fehlermeldungen
in einem Fenster, dem so genannten Infolog, ausgegeben.
</p>
        <p>
Wie Informationen, Warnungen oder Fehlermeldungen erzeugt werden können, ist an vielen
Stellen bereits beschrieben.<br />
Ein wie ich finde sehr guter Artikel über dieses Thema ist dieser: <a href="http://blogs.msdn.com/mfp/pages/the-user-friendly-infolog.aspx">The
user friendly Infolog</a>.
</p>
        <p>
An dieser Stelle soll aber kurz beschrieben werden, wie die Meldungen des
Infologs ausgewertet werden können, um zum Beispiel zu ermitteln, ob das Infolog eine
Fehlermeldung oder auch eine Warnung enthält.
</p>
        <p>
Zuerst stellt sich die Frage, warum benötigt man überhaupt diese Art von Information
da in Dynamics AX die Möglichkeit besteht, verschiedenste Operationen innerhalb
einer Transaktion zu Kapsel und diese bei Auftreten eines Fehlers oder Erzeugung einer
Fehlermeldung (Stichwort "throw error") automatisch rückgängig zu machen.
</p>
        <p>
Diese Frage soll anhand eines Beispiels beantwortet werden.
</p>
        <p>
Angenommen wir möchten eine Anpassung in Dynamics AX schreiben, welche es ermöglicht,
Änderungen an Stücklisten und Arbeitsplänen von Produktionsaufträgen zu automatisieren
und alle getätigten Änderungen in einer Transaktion zu kapseln. Anschließend soll
noch der Status der Produktions aktualisiert werden. Ebenfalls innerhalb der Transaktion.<br />
Zum Beispiel soll der Produktionsauftrag gestartet werden.
</p>
        <p>
Hierfür ist es notwendig verschiedene Standardfunktionen von Dynamics AX zu verwenden,
die bereits eine Fehlerbehandlung implementiert haben und somit keine Fehler mehr
"melden", welche den Abbruch einer Transaktion zu Folge haben könnten.<br />
Somit wird zwar gewährleistet, dass alle "Unterfunktionen" in sich richtig auf Fehler
richtig reagieren, aber dennoch könnte eine Dateninkonsistenz entstehen, da nicht
alle Operationen rückgängig gemacht werden. Es könnte Beispielhaft sein, dass
die Anlage von neuen Stücklistenpositionen und/oder Arbeitsgangpositionen funktioniert,
die spätere Statusaktualisierung des Produktionsauftrags aber nicht. Die erstellten
Stücklistenpositionen und/oder Arbeitsgangpositionen würden im System gespeichert
(bleiben).
</p>
        <p>
Abhilfe für dieses Problem kann duch die Auswertung des Infologs und manuellen Aufrufs
von "ttsabort" geschaffen werden.
</p>
        <p>
Mit dem "SysInfologEnumerator" können alle Meldungen, welche in das Infolog geschrieben
wurden, durchlaufen werden.<br />
Über die Methode "currentException" kann anschließend ausgewertet werden, um was für
eine Meldung (Information, Warnung, Fehler) es sich handelt.
</p>
        <p>
Hier ein kurzes Beispiel, wie dies aussehen könnte:
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">boolean
hasError()<br />
{<br />
   SysInfologEnumerator <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">enum</span>;<br />
   SysInfoAction action;<br />
   boolean hasError <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">false</span>;<br />
   ;<br /><span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   //Analyse
the infolog to see if there are any warnings/errors</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   enum</span><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> SysInfologEnumerator::newData(infolog.infologData());<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   while</span> (<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">enum</span>.moveNext())<br />
   {<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">      switch</span> (<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">enum</span>.currentException())<br />
      {<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">         case</span> Exception::Error:<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">         case</span> Exception::Warning:<br />
            hasError <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">true</span>;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">            break</span>;<br />
      }<br /><br />
      infolog.add(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">enum</span>.currentException(), <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">enum</span>.currentMessage(), <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">enum</span>.currentHelpUrl());<br />
   }<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">   return</span> hasError;<br />
}</span>
        </p>
        <p>
Es muss allerdings beachtet werden, dass alle Meldungen des Infologs, durch den Aufruf
von "SysInfologEnumerator::newData(...)", gelöscht werden.<br />
Sollen diesese Meldungen nach der "Auswertung" dennoch dem Benutzer angezeigt werden,
müssen diese wieder manuell in das Infolog geschrieben werden (über "infolog.add(..)").
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=db4cdf8e-8cfa-4837-9371-a8362a319290" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Ermitteln ob Warnungen oder Fehlermeldung im Infolog enthalten sind</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,db4cdf8e-8cfa-4837-9371-a8362a319290.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,db4cdf8e-8cfa-4837-9371-a8362a319290.aspx</link>
      <pubDate>Thu, 08 Jan 2009 18:09:12 GMT</pubDate>
      <description>&lt;p&gt;
In Microsoft Dynamics AX werden alle Informationsmeldungen, Warnungen und Fehlermeldungen
in einem Fenster, dem so genannten Infolog, ausgegeben.
&lt;/p&gt;
&lt;p&gt;
Wie Informationen, Warnungen oder Fehlermeldungen erzeugt werden können, ist an vielen
Stellen bereits beschrieben.&lt;br&gt;
Ein wie ich finde sehr guter Artikel über dieses Thema ist dieser: &lt;a href="http://blogs.msdn.com/mfp/pages/the-user-friendly-infolog.aspx"&gt;The
user friendly Infolog&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
An dieser&amp;nbsp;Stelle soll&amp;nbsp;aber kurz beschrieben werden, wie die Meldungen des
Infologs ausgewertet werden können, um zum Beispiel zu ermitteln, ob das Infolog eine
Fehlermeldung oder auch eine Warnung enthält.
&lt;/p&gt;
&lt;p&gt;
Zuerst stellt sich die Frage, warum benötigt man überhaupt diese Art von Information
da&amp;nbsp;in Dynamics AX die Möglichkeit besteht, verschiedenste Operationen innerhalb
einer Transaktion zu Kapsel und diese bei Auftreten eines Fehlers oder Erzeugung einer
Fehlermeldung (Stichwort "throw error") automatisch rückgängig zu machen.
&lt;/p&gt;
&lt;p&gt;
Diese Frage soll anhand eines Beispiels beantwortet werden.
&lt;/p&gt;
&lt;p&gt;
Angenommen wir möchten eine Anpassung in Dynamics AX schreiben, welche es ermöglicht,
Änderungen an Stücklisten und Arbeitsplänen von Produktionsaufträgen zu automatisieren
und alle getätigten Änderungen in einer Transaktion zu kapseln. Anschließend soll
noch der Status der Produktions aktualisiert werden. Ebenfalls innerhalb der Transaktion.&lt;br&gt;
Zum Beispiel soll der Produktionsauftrag gestartet werden.
&lt;/p&gt;
&lt;p&gt;
Hierfür ist es notwendig verschiedene Standardfunktionen von Dynamics AX zu verwenden,
die bereits eine Fehlerbehandlung implementiert haben und somit keine Fehler mehr
"melden", welche den Abbruch einer Transaktion zu Folge haben könnten.&lt;br&gt;
Somit wird zwar gewährleistet, dass alle "Unterfunktionen" in sich richtig auf Fehler
richtig reagieren, aber dennoch könnte eine Dateninkonsistenz entstehen, da nicht
alle Operationen rückgängig gemacht werden.&amp;nbsp;Es könnte Beispielhaft sein, dass
die Anlage von neuen Stücklistenpositionen und/oder Arbeitsgangpositionen funktioniert,
die spätere Statusaktualisierung des Produktionsauftrags&amp;nbsp;aber nicht. Die erstellten
Stücklistenpositionen und/oder Arbeitsgangpositionen würden im System gespeichert
(bleiben).
&lt;/p&gt;
&lt;p&gt;
Abhilfe für dieses Problem kann duch die Auswertung des Infologs und manuellen Aufrufs
von "ttsabort" geschaffen werden.
&lt;/p&gt;
&lt;p&gt;
Mit dem "SysInfologEnumerator" können alle Meldungen, welche in das Infolog geschrieben
wurden, durchlaufen werden.&lt;br&gt;
Über die Methode "currentException" kann anschließend ausgewertet werden, um was für
eine Meldung (Information, Warnung, Fehler) es sich handelt.
&lt;/p&gt;
&lt;p&gt;
Hier ein kurzes Beispiel, wie dies aussehen könnte:
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;boolean
hasError()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;SysInfologEnumerator &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;enum&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;SysInfoAction action;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean hasError &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;false&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Analyse
the infolog to see if there are any warnings/errors&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;enum&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; SysInfologEnumerator::newData(infolog.infologData());&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;enum&lt;/span&gt;.moveNext())&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;enum&lt;/span&gt;.currentException())&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&lt;/span&gt; Exception::Error:&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&lt;/span&gt; Exception::Warning:&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hasError &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;true&lt;/span&gt;;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break&lt;/span&gt;;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;infolog.add(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;enum&lt;/span&gt;.currentException(), &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;enum&lt;/span&gt;.currentMessage(), &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;enum&lt;/span&gt;.currentHelpUrl());&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&lt;/span&gt; hasError;&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Es muss allerdings beachtet werden, dass alle Meldungen des Infologs, durch den Aufruf
von "SysInfologEnumerator::newData(...)", gelöscht werden.&lt;br&gt;
Sollen diesese Meldungen nach der "Auswertung" dennoch dem Benutzer angezeigt werden,
müssen diese wieder manuell in das Infolog geschrieben werden (über "infolog.add(..)").
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=db4cdf8e-8cfa-4837-9371-a8362a319290" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,db4cdf8e-8cfa-4837-9371-a8362a319290.aspx</comments>
      <category>Dynamics Ax;Dynamics Ax/HowTo;Dynamics Ax/Programmierung</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=d980d861-6cdc-4ebe-8dec-c2da27567f8e</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,d980d861-6cdc-4ebe-8dec-c2da27567f8e.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,d980d861-6cdc-4ebe-8dec-c2da27567f8e.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=d980d861-6cdc-4ebe-8dec-c2da27567f8e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Im Standard von Microsoft Dynamics AX 2009 werden verschiedenste Business Intelligence
Funktionen mitgeliefert.<br />
Die hierfür benötigen Cubes und Dimensionen erstellt Dynamics AX 2009 unter Verwendung
der Analysis-Extension direkt in den Analysis Services des SQL Servers.<br />
Dies ist schon einmal sehr schön, da die meiste Arbeit durch die Installationsroutinen
abgenommen wird.
</p>
        <p>
Muss oder möchte man allerdings die mitgelieferten Cubes oder Dimensionen an
die eigenen Gegebenheiten anpassen, muss zuerst ein BI-Projekt für Visual Studio erzeugt
werden, da die Bearbeitung in Visual Studio erfolgt (über die Funktion „BI-Projekt
generieren“).
</p>
        <p>
Es können einige „allgemeine“ Einstellungen für die Erstellung eines BI-Projektes
über die Funktion „Generierungsoptionen für BI-Projekt“ getätigt werden.<br />
Beispielhaft sei hier die Einstellung der Zeitdimensionen genannt.
</p>
        <p>
Allerdings kann es sein, dass man anstatt der erwartet Maske eine Fehlermeldung ausgegeben
bekommt.<br />
Dies kann besonders bei Verwendung, der für Dynamics AX 2009 bereit gestellten, Demo
Daten der Fall sein.
</p>
        <p>
          <img src="http://blog.ak-home.net/content/binary/Fehlermeldung.jpg" border="0" />
        </p>
        <p>
Leider ist diese Fehlermeldung nicht sehr Aussagekräftig.
</p>
        <p>
Hier hilft ein Blick in das Ereignisprotokoll des Dynamics AX Object Servers.
</p>
        <p>
          <img src="http://blog.ak-home.net/content/binary/Fehlermeldung_ereignisprotokoll.jpg" border="0" />
        </p>
        <p>
Dies lässt zumindest schon einmal den „groben“ Grund erkennen, was für ein Fehler
verursacht wurde bzw. wo der Fehler liegen könnte.
</p>
        <p>
Nach einem Blick in die Tabellendefinition und den Tabellebrowser der angegebenen
Tabelle „BIUDMROLES“ wird man feststellen, dass es die angegeben Spalte wirklich nicht
gibt. Es gibt aber einen Datensatz mit entsprechender UserGroupId (UserGroupId = PRComplete).
Verwendet man nun die Funktion „Gehe zu Haupttabelle“, wird man feststellen, dass
es diese Benutzergruppe nicht im System gibt.
</p>
        <p>
Somit ist die Lösung recht einfach.<br />
Nachdem der Fehlerhafte Datensatz gelöscht wurde, kann die Maske „Generierungsoptionen
für BI-Projekt“ ohne Probleme geöffnet werden.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=d980d861-6cdc-4ebe-8dec-c2da27567f8e" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Maske "Generierungsoptionen für BI-Projekt" von Microsoft Dynamics AX 2009</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,d980d861-6cdc-4ebe-8dec-c2da27567f8e.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,d980d861-6cdc-4ebe-8dec-c2da27567f8e.aspx</link>
      <pubDate>Tue, 09 Dec 2008 20:26:28 GMT</pubDate>
      <description>&lt;p&gt;
Im Standard von Microsoft Dynamics AX 2009 werden verschiedenste Business Intelligence
Funktionen mitgeliefert.&lt;br&gt;
Die hierfür benötigen Cubes und Dimensionen erstellt Dynamics AX 2009 unter Verwendung
der Analysis-Extension direkt in den Analysis Services des SQL Servers.&lt;br&gt;
Dies ist schon einmal sehr schön, da die meiste Arbeit durch die Installationsroutinen
abgenommen wird.
&lt;/p&gt;
&lt;p&gt;
Muss oder möchte man allerdings die mitgelieferten Cubes oder Dimensionen&amp;nbsp;an
die eigenen Gegebenheiten anpassen, muss zuerst ein BI-Projekt für Visual Studio erzeugt
werden, da die Bearbeitung in Visual Studio erfolgt (über die Funktion „BI-Projekt
generieren“).
&lt;/p&gt;
&lt;p&gt;
Es können einige „allgemeine“ Einstellungen für die Erstellung eines BI-Projektes
über die Funktion „Generierungsoptionen für BI-Projekt“ getätigt werden.&lt;br&gt;
Beispielhaft sei hier die Einstellung der Zeitdimensionen genannt.
&lt;/p&gt;
&lt;p&gt;
Allerdings kann es sein, dass man anstatt der erwartet Maske eine Fehlermeldung ausgegeben
bekommt.&lt;br&gt;
Dies kann besonders bei Verwendung, der für Dynamics AX 2009 bereit gestellten, Demo
Daten der Fall sein.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.ak-home.net/content/binary/Fehlermeldung.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Leider ist diese Fehlermeldung nicht sehr Aussagekräftig.
&lt;/p&gt;
&lt;p&gt;
Hier hilft ein Blick in das Ereignisprotokoll des Dynamics AX Object Servers.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.ak-home.net/content/binary/Fehlermeldung_ereignisprotokoll.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Dies lässt zumindest schon einmal den „groben“ Grund erkennen, was für ein Fehler
verursacht wurde bzw. wo der Fehler liegen könnte.
&lt;/p&gt;
&lt;p&gt;
Nach einem Blick in die Tabellendefinition und den Tabellebrowser der angegebenen
Tabelle „BIUDMROLES“ wird man feststellen, dass es die angegeben Spalte wirklich nicht
gibt. Es gibt aber einen Datensatz mit entsprechender UserGroupId (UserGroupId = PRComplete).
Verwendet man nun die Funktion „Gehe zu Haupttabelle“, wird man feststellen, dass
es diese Benutzergruppe nicht im System gibt.
&lt;/p&gt;
&lt;p&gt;
Somit ist die Lösung recht einfach.&lt;br&gt;
Nachdem der Fehlerhafte Datensatz gelöscht wurde, kann die Maske „Generierungsoptionen
für BI-Projekt“ ohne Probleme geöffnet werden.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=d980d861-6cdc-4ebe-8dec-c2da27567f8e" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,d980d861-6cdc-4ebe-8dec-c2da27567f8e.aspx</comments>
      <category>Dynamics Ax;Dynamics Ax/Administration;Dynamics Ax/HowTo</category>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=31c80671-6268-44d3-b929-ea305a64308a</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,31c80671-6268-44d3-b929-ea305a64308a.aspx</pingback:target>
      <dc:creator>Mathias Füßler</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,31c80671-6268-44d3-b929-ea305a64308a.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=31c80671-6268-44d3-b929-ea305a64308a</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List" />
        <link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData" />
        <link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping" />
        <style>
          <!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0cm;
	margin-right:0cm;
	margin-bottom:10.0pt;
	margin-left:0cm;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-fareast-language:EN-US;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-fareast-language:EN-US;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:70.85pt 70.85pt 2.0cm 70.85pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
        </style>
        <p class="MsoNormal">
Wie bestimmt man ein Alias für ein Tabellenfeld in Microsoft Dynamics AX um über mehr
als ein Feld die Auswahl des Datensatzes zu bestimmen? 
</p>
        <p class="MsoNormal">
In den Auftragspositionen kann man anstelle einer Artikelnummer auch den Suchbegriff
aus dem Artikelstamm eingeben um den gewünschte Artikel auszuwählen.
</p>
        <p class="MsoNormal">
Beispiel:
</p>
        <p class="MsoNormal">
Artikelnummer: 12345<br />
Suchbegriff: MeinArtikel
</p>
        <p class="MsoNormal">
Da, sofern man keine sprechenden Artikelnummern verwendet, ein Suchbegriff oft einprägsamer
ist als eine Artikelnummer hat man Systemweit die Möglichkeit anstelle der Artikelnummer
„12345“ den Suchbegriff „MeinArtikel“ einzugeben.
</p>
        <p class="MsoNormal">
Diese Funktion kann man ganz einfach auch selbst erstellen. Hierzu wird auf Tabellenfeldebene
in den Eigenschaften des Feldes Suchbegriff, die Eigenschaft AliasFor auf Artikelnummer
(ItemId) gesetzt. 
<br /></p>
        <p class="MsoNormal">
          <br />
        </p>
        <p>
        </p>
        <img src="http://starside.eu/content/binary/SetAliasFor_AX.jpg" border="0" />
        <br />
        <br />
        <link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel="File-List" />
        <link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel="themeData" />
        <link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel="colorSchemeMapping" />
        <style>
          <!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0cm;
	margin-right:0cm;
	margin-bottom:10.0pt;
	margin-left:0cm;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-fareast-language:EN-US;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-fareast-language:EN-US;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:70.85pt 70.85pt 2.0cm 70.85pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
-->
        </style>
        <p class="MsoNormal">
Sobald man nun „MeinArtikel“ im Feld Artikelnummer eingibt, wird automatisch die Artikelnummer
eingefügt. 
<br />
Dieses Verhalten ist nun Systemweit anwendbar. Überall wo ein Artikel über die Artikelnummer
ausgewählt werden kann (Bspw. Aufträge, Bestellungen) kann nun in der manuellen Eingabe
der Suchbegriff verwendet werden. Nach der Eingabe des Suchbegriffs wird dieser durch
die Artikelnummer ersetzt (sofern vorhanden).<br /></p>
        <img width="0" height="0" src="http://starside.eu/cptrk.ashx?id=220e4d04-7c2d-4ebe-ab17-bb074a9e47a7" />
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=31c80671-6268-44d3-b929-ea305a64308a" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Eigenschaft AliasFor in Microsoft Dynamics AX</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,31c80671-6268-44d3-b929-ea305a64308a.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,31c80671-6268-44d3-b929-ea305a64308a.aspx</link>
      <pubDate>Wed, 03 Dec 2008 19:18:04 GMT</pubDate>
      <description>&lt;link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel=File-List&gt;
&lt;link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel=themeData&gt;
&lt;link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel=colorSchemeMapping&gt;
&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0cm;
	margin-right:0cm;
	margin-bottom:10.0pt;
	margin-left:0cm;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-fareast-language:EN-US;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-fareast-language:EN-US;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:70.85pt 70.85pt 2.0cm 70.85pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;
&lt;/style&gt;
&lt;p class=MsoNormal&gt;
Wie bestimmt man ein Alias für ein Tabellenfeld in Microsoft Dynamics AX um über mehr
als ein Feld die Auswahl des Datensatzes zu bestimmen? 
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
In den Auftragspositionen kann man anstelle einer Artikelnummer auch den Suchbegriff
aus dem Artikelstamm eingeben um den gewünschte Artikel auszuwählen.
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
Beispiel:
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
Artikelnummer: 12345&lt;br&gt;
Suchbegriff: MeinArtikel
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
Da, sofern man keine sprechenden Artikelnummern verwendet, ein Suchbegriff oft einprägsamer
ist als eine Artikelnummer hat man Systemweit die Möglichkeit anstelle der Artikelnummer
„12345“ den Suchbegriff „MeinArtikel“ einzugeben.
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
Diese Funktion kann man ganz einfach auch selbst erstellen. Hierzu wird auf Tabellenfeldebene
in den Eigenschaften des Feldes Suchbegriff, die Eigenschaft AliasFor auf Artikelnummer
(ItemId) gesetzt. 
&lt;br&gt;
&lt;/p&gt;
&lt;p class=MsoNormal&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;img src="http://starside.eu/content/binary/SetAliasFor_AX.jpg" border=0&gt;
&lt;br&gt;
&lt;br&gt;
&lt;link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" rel=File-List&gt;
&lt;link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" rel=themeData&gt;
&lt;link href="file:///C:%5CUsers%5CMathias%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" rel=colorSchemeMapping&gt;
&lt;style&gt;
&lt;!--
 /* Font Definitions */
 @font-face
	{font-family:"Cambria Math";
	panose-1:2 4 5 3 5 4 6 3 2 4;
	mso-font-charset:1;
	mso-generic-font-family:roman;
	mso-font-format:other;
	mso-font-pitch:variable;
	mso-font-signature:0 0 0 0 0 0;}
@font-face
	{font-family:Calibri;
	panose-1:2 15 5 2 2 2 4 3 2 4;
	mso-font-charset:0;
	mso-generic-font-family:swiss;
	mso-font-pitch:variable;
	mso-font-signature:-1610611985 1073750139 0 0 159 0;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
	{mso-style-unhide:no;
	mso-style-qformat:yes;
	mso-style-parent:"";
	margin-top:0cm;
	margin-right:0cm;
	margin-bottom:10.0pt;
	margin-left:0cm;
	line-height:115%;
	mso-pagination:widow-orphan;
	font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-fareast-language:EN-US;}
.MsoChpDefault
	{mso-style-type:export-only;
	mso-default-props:yes;
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-fareast-font-family:Calibri;
	mso-fareast-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-bidi-font-family:"Times New Roman";
	mso-bidi-theme-font:minor-bidi;
	mso-fareast-language:EN-US;}
.MsoPapDefault
	{mso-style-type:export-only;
	margin-bottom:10.0pt;
	line-height:115%;}
@page Section1
	{size:612.0pt 792.0pt;
	margin:70.85pt 70.85pt 2.0cm 70.85pt;
	mso-header-margin:36.0pt;
	mso-footer-margin:36.0pt;
	mso-paper-source:0;}
div.Section1
	{page:Section1;}
--&gt;
&lt;/style&gt;
&lt;p class=MsoNormal&gt;
Sobald man nun „MeinArtikel“ im Feld Artikelnummer eingibt, wird automatisch die Artikelnummer
eingefügt. 
&lt;br&gt;
Dieses Verhalten ist nun Systemweit anwendbar. Überall wo ein Artikel über die Artikelnummer
ausgewählt werden kann (Bspw. Aufträge, Bestellungen) kann nun in der manuellen Eingabe
der Suchbegriff verwendet werden. Nach der Eingabe des Suchbegriffs wird dieser durch
die Artikelnummer ersetzt (sofern vorhanden).&lt;br&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://starside.eu/cptrk.ashx?id=220e4d04-7c2d-4ebe-ab17-bb074a9e47a7"&gt;&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=31c80671-6268-44d3-b929-ea305a64308a" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,31c80671-6268-44d3-b929-ea305a64308a.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://blog.ak-home.net/Trackback.aspx?guid=0b55aa90-c644-4505-9fa7-5a99d7c4a2d0</trackback:ping>
      <pingback:server>http://blog.ak-home.net/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ak-home.net/PermaLink,guid,0b55aa90-c644-4505-9fa7-5a99d7c4a2d0.aspx</pingback:target>
      <dc:creator>Axel Kühn</dc:creator>
      <wfw:comment>http://blog.ak-home.net/CommentView,guid,0b55aa90-c644-4505-9fa7-5a99d7c4a2d0.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ak-home.net/SyndicationService.asmx/GetEntryCommentsRss?guid=0b55aa90-c644-4505-9fa7-5a99d7c4a2d0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Microsoft Dynamics AX 2009 bietet die Möglichkeit, den Verlauf eines Dokuments, welches
über das AIF exportiert oder importiert wurde zu betrachten.<br />
Dies war auch schon mit Microsoft Dynamics AX 4.0 möglich.
</p>
        <p>
Über die Maske "Dokumentverlauf" können alle Dokumente/Nachrichten eingesehen werden,
welche über das AIF verarbeitet wurden.<br />
Über den Button "Korrelation" ist es sogar möglich, die von der Verarbeitung (schreiben,
ändern, lesen, etc.) betroffenen Datensätze anzuzeigen.
</p>
        <p>
        </p>
        <p>
          <img src="http://blog.ak-home.net/content/binary/AIFFehler_Maske2.jpg" border="0" />
        </p>
        <p>
So ist es zumindest in der Theorie.<br />
In der Praxis sieht es leider etwas anders aus. Nach einem Klick auf den Button "Korrelation"
öffnet sich leider nicht wie erwartet die Maske "Dokumentkorrelierung".<br />
Stattdessen wird der Debugger (wenn installiert) geöffnet und die Fehlermeldung
ausgegeben, dass ein Objekt nicht über die Methode "extendedTypeId" verfügt.
</p>
        <p>
          <img src="http://blog.ak-home.net/content/binary/AIFFehler2.jpg" border="0" />
        </p>
        <p>
So wie es scheint, hat sich in den Quellcode ein kleiner Fehler eingeschlichen, welcher
dazu führt, dass die Maske "Dokumentkorrelierung" niemals geöffnet werden kann.<br />
Nach einem Vergleich der Funktionalitäten zwischen Dynamics AX 4.0 und Dynamics AX
2009 kann dieses Verhalten (der Fehler) aber wie folgt beschrieben behoben werden.
</p>
        <ol>
          <li>
AOT öffnen und zu der Tabelle "AifCorrelation" navigieren. 
</li>
          <li>
Den Quelltext der Methode "displayEntityKey" anzeigen lassen bzw. diese für die Bearbeitung
öffnen. 
</li>
          <li>
Folgende Quelltextzeile suchen:<br /><font face="Courier New">dictField = new <strong>DictField</strong>(entityKey.parmTableId(),
enumerator.currentKey());</font></li>
          <li>
Dieses Zeile abändern in:<br /><font face="Courier New">dictField = new <strong>SySDictField</strong>(entityKey.parmTableId(),
enumerator.currentKey());</font></li>
        </ol>
        <p>
Nach dieser kleinen Quelltextänderung sollte alles wie erwartet funktionierten und
die Maske "Dokumentkorrelierung" mit den entsprechenden Datensätzen angezeigt werden.
</p>
        <img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=0b55aa90-c644-4505-9fa7-5a99d7c4a2d0" />
        <br />
        <hr />
Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben
gegeben. Die Verwendung erfolgt auf eigene Gefahr. Copyright © Axel Kühn (Aku's AX
Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</body>
      <title>Dynamics AX 2009 AIF - Aufruf der Dokumentkorrelierung im Dokumentverlauf</title>
      <guid isPermaLink="false">http://blog.ak-home.net/PermaLink,guid,0b55aa90-c644-4505-9fa7-5a99d7c4a2d0.aspx</guid>
      <link>http://blog.ak-home.net/PermaLink,guid,0b55aa90-c644-4505-9fa7-5a99d7c4a2d0.aspx</link>
      <pubDate>Wed, 05 Nov 2008 18:06:49 GMT</pubDate>
      <description>&lt;p&gt;
Microsoft Dynamics AX 2009 bietet die Möglichkeit, den Verlauf eines Dokuments, welches
über das AIF exportiert oder importiert wurde zu betrachten.&lt;br&gt;
Dies war auch schon mit Microsoft Dynamics AX 4.0 möglich.
&lt;/p&gt;
&lt;p&gt;
Über die Maske "Dokumentverlauf" können alle Dokumente/Nachrichten eingesehen werden,
welche über das AIF verarbeitet wurden.&lt;br&gt;
Über den Button "Korrelation" ist es sogar möglich, die von der Verarbeitung (schreiben,
ändern, lesen, etc.) betroffenen Datensätze anzuzeigen.
&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.ak-home.net/content/binary/AIFFehler_Maske2.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
So ist es zumindest in der Theorie.&lt;br&gt;
In der Praxis sieht es leider etwas anders aus. Nach einem Klick auf den Button "Korrelation"
öffnet sich leider nicht wie erwartet die Maske "Dokumentkorrelierung".&lt;br&gt;
Stattdessen wird der Debugger (wenn installiert)&amp;nbsp;geöffnet und&amp;nbsp;die Fehlermeldung
ausgegeben, dass ein Objekt nicht über die Methode "extendedTypeId" verfügt.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://blog.ak-home.net/content/binary/AIFFehler2.jpg" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
So wie es scheint, hat sich in den Quellcode ein kleiner Fehler eingeschlichen, welcher
dazu führt, dass die Maske "Dokumentkorrelierung" niemals geöffnet werden kann.&lt;br&gt;
Nach einem Vergleich der Funktionalitäten zwischen Dynamics AX 4.0 und Dynamics AX
2009 kann dieses Verhalten (der Fehler) aber wie folgt beschrieben behoben werden.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
AOT öffnen und zu der Tabelle "AifCorrelation" navigieren. 
&lt;li&gt;
Den Quelltext der Methode "displayEntityKey" anzeigen lassen bzw. diese für die Bearbeitung
öffnen. 
&lt;li&gt;
Folgende Quelltextzeile suchen:&lt;br&gt;
&lt;font face="Courier New"&gt;dictField = new &lt;strong&gt;DictField&lt;/strong&gt;(entityKey.parmTableId(),
enumerator.currentKey());&lt;/font&gt; 
&lt;li&gt;
Dieses Zeile abändern in:&lt;br&gt;
&lt;font face="Courier New"&gt;dictField = new &lt;strong&gt;SySDictField&lt;/strong&gt;(entityKey.parmTableId(),
enumerator.currentKey());&lt;/font&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Nach dieser kleinen Quelltextänderung sollte alles wie erwartet funktionierten und
die Maske "Dokumentkorrelierung" mit den entsprechenden Datensätzen angezeigt werden.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ak-home.net/aggbug.ashx?id=0b55aa90-c644-4505-9fa7-5a99d7c4a2d0" /&gt;
&lt;br /&gt;
&lt;hr /&gt;Es wird keine Haftung oder Gewährleistung auf die Richtigkeit der gemachten Angaben gegeben. Die Verwendung erfolgt auf eigene Gefahr.

Copyright © Axel Kühn (Aku's AX Blog, http://blog.ak-home.net) and Mathias Füßler (jinx's AX Blog, http://starside.eu)</description>
      <comments>http://blog.ak-home.net/CommentView,guid,0b55aa90-c644-4505-9fa7-5a99d7c4a2d0.aspx</comments>
      <category>Dynamics Ax;Dynamics Ax/HowTo;Dynamics Ax/Programmierung;Dynamics AX/AIF</category>
    </item>
  </channel>
</rss>