<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="https://www.schweda.net/style_feed.css" ?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:atom="http://www.w3.org/2005/Atom"	
	xmlns:dc="http://purl.org/dc/elements/1.1/" > 
<channel>
    <title>schweda.net - Blog</title>
    <link>https://www.schweda.net/</link>
    <description>schweda.net - Blog - Blog-Beitraege</description>
    <language>de-at</language>
    <copyright>Copyright 2006-2026</copyright>
    <generator>schweda.net</generator>
    <managingEditor>heinz.schweda@schweda.net (Heinz Schweda)</managingEditor>
    <webMaster>heinz.schweda@schweda.net (Heinz Schweda)</webMaster>
    <category>Blog</category>
	<atom:link href="https://schweda.net/blog_rss.php?bid=502" rel="self" type="application/rss+xml" />
<item>
<title><![CDATA[AX 2012: Ausführen einer statischen Klassen-Methode in der CIL]]></title>
<description><![CDATA[
<p>Mit Hilfe der nachstehenden Klasse m&ouml;chte ich zeigen, wie man in Dynamic AX 2012 X++ Code als CIL ausf&uuml;hrt.
</p>


<p>Die Klasse <em>MyDemoClass </em>enth&auml;lt eine statische Methode <em>countSalesRecords() </em>welche die eigentliche Logik enth&auml;lt.<br />
Eine weitere Methode namens <em>countSalesRecordsWrapper() </em>ruft diese statische Methode &uuml;ber eine weitere Methode <em>countSalesRecordsIL()</em> als CIL auf.
</p>


<p>&nbsp;
</p>


<p>Zu beachten sind vor allem die Modifier der jeweiligen Methoden sowie das Parameter-Profil der Methode <em>countSalesRecordsIL()</em> (ein- und ausgehender Container). H&auml;tte die Methode keinen eingehenden Container als Parameter, w&uuml;rde AX behaupten, die Methode nicht zu kennen:
</p>


<blockquote>

<p>Fehler w&auml;hrend der Verarbeitung: Classname Objekt verf&uuml;gt nicht &uuml;ber Methode &#39;MethodName&#39;.
</p>

</blockquote>


<p>Nachdem man die Klasse erstellt und die CIL inkrementell kompiliert hat, kann man die Klasse per rechter Maustaste ausf&uuml;hren. Dadurch wird die <em>main()</em>-Methode aufgerufen welche die Logik der Methode <em>countSalesRecords()</em> auf die altbew&auml;hrte Art &amp; Weise aufruft und zus&auml;tzlich in der CLR ausf&uuml;hrt.
</p>


<p>Vorausgesetzt nat&uuml;rlich der Benutzer hat in seinen Benutzer-Optionen die Option Gesch&auml;ftliche Arbeitsg&auml;nge in CIL ausf&uuml;hren aktiviert!
</p>


<pre class="pre_blog_axcode">
class MyDemoClass
{
}
</pre>


<p>&nbsp;
</p>


<pre class="pre_blog_axcode">
public server static counter countSalesRecords(SalesStatus _salesStatus)
{
    Query query;
    QueryBuildDataSource qbds_salesTable;
    QueryBuildDataSource qbds_salesLine;
    QueryRun queryRun;
    Counter r;

    setPrefix(strFmt(&quot;isCLRSession: %1&quot;, enum2str(xSession::isCLRSession())));

    setPrefix(enum2str(_salesStatus));

    query = new query();
    qbds_salesTable = query.addDataSource(tableNum(salesTable));
    qbds_salesTable.addSelectionField(fieldNum(salesTable, RecId));
    qbds_salesLine = qbds_salesTable.addDataSource(tableNum(salesLine));
    qbds_salesLine.addSelectionField(fieldNum(salesLine, RecId));
    qbds_salesLine.joinMode(JoinMode::InnerJoin);
    qbds_salesLine.relations(true);

    SysQuery::findOrCreateRange(qbds_salesTable, fieldNum(SalesTable, SalesStatus)).value(queryValue(_salesStatus));

    queryRun = new queryRun(query);
    while(queryRun.next())
    {
        r++;
    }

    info(strFmt(&quot;Records: %1&quot;, r));

    return r;
}
</pre>



<p>&nbsp;
</p>


<pre class="pre_blog_axcode">
private server static container countSalesRecordsIL(container _con)
{
    SalesStatus salesStatus;
    Counter c;
    container cReturn;

    salesStatus = conPeek(_con, 1);

    // Call method and get it&#39;s return value
    c = MyDemoClass::countSalesRecords(salesStatus);

    return conPoke(cReturn, 1, c);
}
</pre>




<p>&nbsp;
</p>


<pre class="pre_blog_axcode">
public server static counter countSalesRecordsWrapper(SalesStatus _salesStatus) // Same parameter-profile as method, which is called in CIL
{
    container resultContainer;
    Counter c;

    new XppILExecutePermission().assert();

    resultContainer =
    Global::runClassMethodIL(classStr(MyDemoClass),
                             staticMethodStr(MyDemoClass, countSalesRecordsIL),
                             [_salesStatus]);

    CodeAccessPermission::revertAssert();

    // Get return value through resultContainer
    c = conPeek(resultContainer, 1);

    return c;
}
</pre>



<p>&nbsp;
</p>


<pre class="pre_blog_axcode">
public static server void main(Args _args)
{
    setPrefix(&quot;MyDemoClass&quot;);

    MyDemoClass::countSalesRecords(SalesStatus::Invoiced);
    MyDemoClass::countSalesRecordsWrapper(SalesStatus::Backorder);
}
</pre>]]></description>
<category>Microsoft Dynamics AX (Axapta)</category>
<pubDate>Sat, 15 Mar 2014 22:32:00 +0100</pubDate>
<link>https://www.schweda.net/blog_ax.php?bid=502</link>
<comments>https://www.schweda.net/blog_ax.php?bid=502</comments>
<guid isPermaLink="true">https://www.schweda.net/blog_ax.php?bid=502</guid>
<author>heinz.schweda@schweda.net (Heinz Schweda)</author>
<wfw:commentRss>https://www.schweda.net/blog_ax.php?bid=502</wfw:commentRss>
</item>
</channel>
</rss>	
