<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3799501001413219239</id><updated>2011-07-08T08:54:46.688+02:00</updated><category term='Development'/><category term='Frameworks'/><category term='Ax2009'/><category term='welcome'/><category term='Comparison'/><title type='text'>Dynamics Ax stuff</title><subtitle type='html'>Ideas, tips, tricks, tools and many other stuff regarding Dynamics AX.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dynamicsaxstuff.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3799501001413219239/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dynamicsaxstuff.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Mkz</name><uri>http://www.blogger.com/profile/09004527920296334163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_AednIu5RKrU/SreYoPpkjMI/AAAAAAAAAOI/cme6lVwU-Ic/S220/mqm.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3799501001413219239.post-8954082793137167485</id><published>2011-05-14T15:55:00.000+02:00</published><updated>2011-05-14T15:55:41.791+02:00</updated><title type='text'>Dynamics AX Code bookmark utility</title><content type='html'>I made a Dynamics AX tool that will help developers to bookmark source code and write a little description to the bookmark.&lt;br /&gt;&lt;br /&gt;Here is the &lt;a href="http://www.trucosax.com/phpnuke/modules.php?name=Forums&amp;amp;file=viewtopic&amp;amp;t=2577"&gt;link to the article&lt;/a&gt; where I explain how you can made your own tool (sorry, the explanation is in Spanish) and there you will find a DOWNLOAD link to download the tool (the tool is in English ;))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Greetz,&lt;br /&gt;&lt;br /&gt;Mkz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3799501001413219239-8954082793137167485?l=dynamicsaxstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicsaxstuff.blogspot.com/feeds/8954082793137167485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicsaxstuff.blogspot.com/2011/05/dynamics-ax-code-bookmark-utility.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3799501001413219239/posts/default/8954082793137167485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3799501001413219239/posts/default/8954082793137167485'/><link rel='alternate' type='text/html' href='http://dynamicsaxstuff.blogspot.com/2011/05/dynamics-ax-code-bookmark-utility.html' title='Dynamics AX Code bookmark utility'/><author><name>Mkz</name><uri>http://www.blogger.com/profile/09004527920296334163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_AednIu5RKrU/SreYoPpkjMI/AAAAAAAAAOI/cme6lVwU-Ic/S220/mqm.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3799501001413219239.post-1720119099285154032</id><published>2010-06-03T11:56:00.000+02:00</published><updated>2010-06-03T11:56:05.684+02:00</updated><title type='text'>My first interview</title><content type='html'>Hello all,&lt;br /&gt;&lt;br /&gt;I'm pleased to present to you my first interview (and maybe the last :P)&lt;br /&gt;&lt;br /&gt;http://www.dynamicsworld.co.uk/Interview-Manel-Querol.php&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Kind Regards,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3799501001413219239-1720119099285154032?l=dynamicsaxstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicsaxstuff.blogspot.com/feeds/1720119099285154032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicsaxstuff.blogspot.com/2010/06/my-first-interview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3799501001413219239/posts/default/1720119099285154032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3799501001413219239/posts/default/1720119099285154032'/><link rel='alternate' type='text/html' href='http://dynamicsaxstuff.blogspot.com/2010/06/my-first-interview.html' title='My first interview'/><author><name>Mkz</name><uri>http://www.blogger.com/profile/09004527920296334163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_AednIu5RKrU/SreYoPpkjMI/AAAAAAAAAOI/cme6lVwU-Ic/S220/mqm.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3799501001413219239.post-1844826503749930610</id><published>2010-04-26T00:31:00.000+02:00</published><updated>2010-04-26T00:31:34.757+02:00</updated><title type='text'>Basic Survival Kit - Article #1 : Customizing Lookups by code</title><content type='html'>Here we are again :)&lt;br /&gt;&lt;br /&gt;Sometimes I posted &lt;a href="http://www.trucosax.com/phpnuke/modules.php?name=Forums&amp;amp;file=viewtopic&amp;amp;t=711"&gt;complex and crazy articles&lt;/a&gt; trying to be original and showing strange behaviours or new concepts(at least for me) , but ... there exists a wide range of daily problems which every Dynamics AX developer needs to solve frequently and sometimes is not easy to find useful information.&lt;br /&gt;&lt;br /&gt;With this article I will start a serie of articles dedicated to show some necessary basic concepts in the daily life of a Dynamics AX developer.&lt;br /&gt;&lt;br /&gt;Please note that almost all of the articles of this serie will be intended to help those Dynamics AX beginner developers that are working hard to learn how to customize this wonderful ERP.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Customizing Lookups by code&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;There are some situations on which we must to perform a custom lookup operation to show to the user some filtered records or for any other special reason.&lt;br /&gt;There exists some classes designed to help us to perform this tasks.&lt;br /&gt;&lt;br /&gt;Let's see a simple example, below is the code we wrote inside form control's lookup method&amp;nbsp; : &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; lookup()&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;{&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #38761d;"&gt;// SysTableLookup is the base class to perform many lookups&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SysTableLookup&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sysTableLookup = SysTableLookup::newParameters(tablenum(InventTable),this);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #6aa84f;"&gt;// We already know how to create a query :)&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Query&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; query = new Query();&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; QueryBuildDataSource&amp;nbsp;&amp;nbsp;&amp;nbsp; queryBuildDataSource = query.addDataSource(&lt;span style="color: blue;"&gt;tablenum&lt;/span&gt;(InventTable));&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #6aa84f;"&gt;// On lookup we don't call super()&lt;/span&gt;&lt;/span&gt;&lt;br style="color: #6aa84f; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="color: #6aa84f; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //super();&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #6aa84f;"&gt; // What fields we want into lookup grid :)&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sysTableLookup.addLookupfield(&lt;span style="color: blue;"&gt;fieldnum&lt;/span&gt;(InventTable,ItemId));&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sysTableLookup.addLookupfield(&lt;span style="color: blue;"&gt;fieldnum&lt;/span&gt;(InventTable,ItemName));&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sysTableLookup.addLookupfield(&lt;span style="color: blue;"&gt;fieldnum&lt;/span&gt;(InventTable,ItemGroupId));&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sysTableLookup.addLookupfield(&lt;span style="color: blue;"&gt;fieldnum&lt;/span&gt;(InventTable,NameAlias));&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sysTableLookup.addLookupfield(&lt;span style="color: blue;"&gt;fieldnum&lt;/span&gt;(InventTable,ItemType));&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #6aa84f;"&gt;// Here is our customizations for this example : we only want items which belongs to ItemGroup 02&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; queryBuildDataSource.addRange(&lt;span style="color: blue;"&gt;fieldnum&lt;/span&gt;(InventTable,ItemGroupId)).value('02');&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #6aa84f;"&gt;// Here we're passing the query to systablelookup as a parameter&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sysTableLookup.parmQuery(query);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #6aa84f;"&gt;// And here, finally, he launch the lookup&lt;/span&gt;&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sysTableLookup.performFormLookup();&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As we can see on the code above, we are using SysTableLookup class to prepare and finally perform the lookup we want.&lt;br /&gt;We just prepared a Query with all of the filters we need and after that we can perform the lookup.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are another way to perform a custom lookup : Creating a custom lookup form, you can find a nice example in the Axaptapedia (&lt;a href="http://www.axaptapedia.com/Lookup_Form"&gt;here&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Greetz,&lt;br /&gt;&lt;br /&gt;Mkz.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3799501001413219239-1844826503749930610?l=dynamicsaxstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicsaxstuff.blogspot.com/feeds/1844826503749930610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicsaxstuff.blogspot.com/2010/04/basic-survival-kit-article-1.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3799501001413219239/posts/default/1844826503749930610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3799501001413219239/posts/default/1844826503749930610'/><link rel='alternate' type='text/html' href='http://dynamicsaxstuff.blogspot.com/2010/04/basic-survival-kit-article-1.html' title='Basic Survival Kit - Article #1 : Customizing Lookups by code'/><author><name>Mkz</name><uri>http://www.blogger.com/profile/09004527920296334163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_AednIu5RKrU/SreYoPpkjMI/AAAAAAAAAOI/cme6lVwU-Ic/S220/mqm.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3799501001413219239.post-7817155956460796776</id><published>2009-11-07T01:52:00.006+01:00</published><updated>2009-11-09T14:49:02.825+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Comparison'/><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><category scheme='http://www.blogger.com/atom/ns#' term='Ax2009'/><category scheme='http://www.blogger.com/atom/ns#' term='Frameworks'/><title type='text'>Comparison Framework Sample : BOM Version comparer</title><content type='html'>Hi all :)&lt;br /&gt;&lt;br /&gt;If we take some time to explore the classes structure existing inside Dynamics Ax we can find many useful frameworks.&lt;br /&gt;&lt;br /&gt;One of this frameworks is the comparison framework.&lt;br /&gt;I'm sure many of you have used sometimes the comparison code tool to discover what has changed in code between two layers.&lt;br /&gt;&lt;br /&gt;Well, Dynamics Ax brings us the opportunity to use this comparison framework to compare everything we want.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Let's do it &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I will create a BOM Version comparison tool.&lt;br /&gt;I mean ... I want a simple tool that allows me to compare two BOM versions of the same BOM.&lt;br /&gt;&lt;br /&gt;There are two "tutorial" classes in the AOT that shows us a little comparison tool sample.&lt;br /&gt;&lt;br /&gt;This two classes are "Tutorial_CompareContextProvider" and "Tutorial_Comparable".&lt;br /&gt;&lt;br /&gt;The first thing we will do is to duplicate the Tutorial_CompareContextProvider class and we create the &lt;b&gt;MyBOMCompareContextProvider&lt;/b&gt; class (Remember to modify the main and construct methods to use the new created class).&lt;br /&gt;&lt;br /&gt;This class is the one who manages the user interface part of the comparison framework.&lt;br /&gt;&lt;br /&gt;Well, we want to use this tool in this way :&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The user selects an item on the inventTable form and press "BOM" button and "Lines" option.&lt;/li&gt;&lt;li&gt;Here we want the user will be able to press a button and select wich of the BOM versions associated with the same Item will be compared.&lt;/li&gt;&lt;/ol&gt;We need then our class will be called in an Item context ...&lt;br /&gt;&lt;br /&gt;We change the main method of our "&lt;b&gt;MyBOMCompareContextProvider&lt;/b&gt;" class :&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; &lt;span style="color: blue;"&gt;void&lt;/span&gt; main(Args args)  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;{  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    InventTable InventTable;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    BOMVersion BOMVersion;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    ItemId ItemId;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    MyBomCompareContextProvider BomComparer;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    ;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    &lt;span style="color: blue;"&gt;if&lt;/span&gt; (args.dataset() == tablenum(InventTable))  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    {  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;        InventTable = args.record();  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;        ItemId = InventTable.ItemId;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    }  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    &lt;span style="color: blue;"&gt;else&lt;/span&gt;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    &lt;span style="color: blue;"&gt;if&lt;/span&gt; (args.dataset() == tablenum(BOMVersion))  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    {  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;        BOMVersion = args.record();  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;        ItemID = BOMVersion.ItemId;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    }  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    &lt;span style="color: blue;"&gt;else&lt;/span&gt;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;        &lt;span style="color: blue;"&gt;throw&lt;/span&gt; &lt;span style="color: blue;"&gt;error&lt;/span&gt;(&lt;span style="color: red;"&gt;'Parameters needed'&lt;/span&gt;);  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    BOMComparer = MyBomCompareContextProvider::construct(ItemID);  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;    SysCompare::startCompareOfContextProvider(BomComparer);  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #cccccc; margin-bottom: 0in;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;Here we're to get the master Item for we must to compare the different available BOM Versions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;As we can see on the code above ... we must to change the construct method too to acquire the master Item :&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;!--  @page { size: 8.27in 11.69in; margin: 0.79in }  P { margin-bottom: 0.08in } --&gt;&lt;/style&gt;  &lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; MyBomCompareContextProvider construct( ItemId MasterItem )  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;{  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;    &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt; MyBomCompareContextProvider( MasterItem );  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;And consequently ... we must to change the new method too :&lt;br /&gt;&lt;style type="text/css"&gt; &lt;!--  @page { size: 8.27in 11.69in; margin: 0.79in }  P { margin-bottom: 0.08in } --&gt; &lt;/style&gt;  &lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;void&lt;/span&gt; &lt;span style="color: blue;"&gt;new&lt;/span&gt;( ItemId _ItemId)  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;{  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt; ;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt; ItemId = _ItemId;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;This means we must add ItemId variable on the ClassDeclaration of MyBOMCompareContextProvider.&lt;br /&gt;&lt;br /&gt;Now we must tune some parameters :&lt;br /&gt;We need to show the tree pane to allow the user to navigate through several BOM lines.&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;boolean&lt;/span&gt; showTreePane()&lt;/i&gt;&lt;br /&gt;&lt;i&gt;{&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;true&lt;/span&gt;;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;}&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Now the Case-sensitive parameter :&lt;br /&gt;&lt;style type="text/css"&gt; &lt;!--  @page { size: 8.27in 11.69in; margin: 0.79in }  P { margin-bottom: 0.08in } --&gt; &lt;/style&gt;  &lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;boolean&lt;/span&gt; parmCaseSensitive( &lt;span style="color: blue;"&gt;boolean&lt;/span&gt; _casesensitive )  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;{  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;false&lt;/span&gt;;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;And all the other parameters (ShowDifferencesOnly, ShowLineNumbers, SuppressWhiteSpaces, SupportDeleteWhenIdentical...) set to false.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;What we want to compare ?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Now we must to create a class to manage the elements we want to compare ... It's called the ComparableClass.&lt;br /&gt;&lt;br /&gt;If we think about the BOM structure ... it's like a tree structure and this means we need a recursive comparable structure.&lt;br /&gt;OK, but analyzing our case ... we will need two different comparable structures : One for the BOM Versions (BOMVersion Table) and another for the lines (BOM Table)&lt;br /&gt;Both comparable classes will apply on BOM lines, one for Sub-BOM lines and the other for simple lines. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We will duplicate the Tutorial_Comparable class and create the new "&lt;b&gt;MyBOMVersionComparable&lt;/b&gt;" class.&lt;br /&gt;Here we add a new method called "parmBOMVersion" in this way :&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; BOMVersion parmBOMVersion(BOMVersion _BOMVersion = BOMVersion)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOM Bom;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOMVersion.data(_BOMVersion);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; BOMVersion;&lt;br /&gt;}&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;And we create a new static method :&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; &lt;span style="color: blue;"&gt;static&lt;/span&gt; MyBOMVersionComparable newBOMVersion(BOMVersion _BOMVersion)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyBOMVersionComparable BOMVerComp = MyBOMVersionComparable::construct();&lt;br /&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOMVerComp.parmBOMVersion(_BOMVersion);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; BOMVerComp;&lt;br /&gt;}&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;Now we modify the ComparableSelected(), Construct(), ComparableName() following same criteria we found on tutorial class.&lt;br /&gt;And this important change on the Name() method :&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; str name()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; strfmt('&lt;span style="color: red;"&gt;%1 BOM Version&lt;/span&gt;',BOMVersion.ItemId);&lt;br /&gt;}&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;We must know our comparison tool will navigate recursively the BOM tree and, when sub-boom appears, we must try to unify the same line "header" on both comparable lines and let the comparison tool will follow the tree comparing those sub-lines.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now we modify the ComparableTextList method just changing all references to CustTable by BOMVersion (This method is the one who tells to the comparison engine what must to be compared. In our case it's correct to compare all the fields on the BOMVersion Table)&lt;br /&gt;&lt;br /&gt;We will go back now to &lt;b&gt;MyBOMCompareContextProvider&lt;/b&gt; on method "ComparableList. In this method we enumerate every single object that could be compared (this just fills the combo list that allows to the user to choose wich objects he wants to compare) &lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt; &lt;!--  @page { size: 8.27in 11.69in; margin: 0.79in }  P { margin-bottom: 0.08in } --&gt; &lt;/style&gt;  &lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; List comparableList(SysCompareType _type)  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;{  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;    List list = &lt;span style="color: blue;"&gt;new&lt;/span&gt; List(Types::&lt;span style="color: blue;"&gt;Class&lt;/span&gt;); &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;    BOMVersion BOMVersion;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt; &lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;    while select BOMVersion where BOMVersion.ItemId == ItemId  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;    {  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;        list.addEnd(MyBOMVersionComparable::newBOMVersion(BOMVersion));  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;    }  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;    &lt;span style="color: blue;"&gt;return&lt;/span&gt; list;  &lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-bottom: 0in;"&gt;&lt;i&gt;}&lt;/i&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;Obviously we are looking for every BOMVersion associated with our MasterItem.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Testing our first draft (for impatient souls :-P ) &lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We will create an Action MenuItem associated with our "MyBOMCompareContextProvider" class and with a label like ... &lt;i&gt;"Compare Versions"&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;And now we add our new menuItem on the BOMConsistOf form (inside the buttongroup "VersionButtonGroup") assigning the BOMVersion Datasource to its datasource property.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_AednIu5RKrU/SvSzlHqXkPI/AAAAAAAAAOw/dkpxLbnAZ7M/s1600-h/screenshot28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_AednIu5RKrU/SvSzlHqXkPI/AAAAAAAAAOw/dkpxLbnAZ7M/s400/screenshot28.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;We can run our first comparison tool (alpha version) ...&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_AednIu5RKrU/SvS1CM2wxGI/AAAAAAAAAO4/oTgv-1JtAcw/s1600-h/screenshot30.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_AednIu5RKrU/SvS1CM2wxGI/AAAAAAAAAO4/oTgv-1JtAcw/s400/screenshot30.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Ok, but ... now we must to compare the lines and sub-boms too &lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Investigating a little with this classes ... we found a curious method called GetEnumerator().&lt;br /&gt;By it's name ... it seems to be the typical method that is called by someone to navigate trought it's children nodes.&lt;br /&gt;&lt;br /&gt;But ... wait !, it returns a SysComparableEnumerator.&lt;br /&gt;mmm and what is a SysComparableEnumerator ? ... it's an interface with the methods : current() and movenext().&lt;br /&gt;Well, I created a new class called MyComparableEnumerator to try to use an standard ListEnumerator as a SysComparableEnumerator :&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;i style="background-color: #999999;"&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;class&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; MyComparableEnumerator &lt;/span&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;extends&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; listEnumerator &lt;/span&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;implements&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; SysComparableEnumerator&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; {&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;And now we can use a normal list and it's listenumerator as we want.&lt;br /&gt;&lt;br /&gt;We must create the second comparable class wich it will manage the BOM lines. We called it "&lt;b&gt;MyBOMComparable&lt;/b&gt;" and it's very similar to "MyBOMVersionComparable" but with some changes regarding the parmBOM() method, and a newBOM static method (you can download the demo project related to this article) and this important changes on ComparableTextList() method :&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; List comparableTextList( SysComparable _top,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SysCompareContextProvider _context,&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SysComparable _matchingDummy = &lt;span style="color: blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; str text;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DictTable dictTable = new DictTable(BOM.TableId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DictFieldGroup dictFieldGroup;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DictField dictField;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DictField extDictField;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fieldId&amp;nbsp;&amp;nbsp; fieldId, extFieldId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i, j, k;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; List list = &lt;span style="color: blue;"&gt;new&lt;/span&gt; List(Types::Record);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;for&lt;/span&gt; (i=1; i&amp;lt;=dictTable.fieldGroupCnt(); i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dictFieldGroup = &lt;span style="color: blue;"&gt;new&lt;/span&gt; DictFieldGroup(dictTable.id(), dictTable.fieldGroup(i));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text = &lt;span style="color: red;"&gt;''&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (j=1; j&amp;lt;=dictFieldGroup.numberOfFields(); j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fieldId = dictFieldGroup.field(j);&lt;br /&gt;&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; dictField = &lt;span style="color: blue;"&gt;new&lt;/span&gt; DictField(dictTable.id(), fieldId);&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; if (dictField &lt;span style="background-color: yellow;"&gt;&amp;amp;&amp;amp; dictField.id() != fieldnum(BOM, BOMId) &amp;amp;&amp;amp; dictField.id() != fieldnum(BOM, linenum)&lt;/span&gt; )&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; {&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (k=1; k&amp;lt;=dictField.arraySize(); k++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; extFieldId&amp;nbsp;&amp;nbsp; = Global::fieldId2Ext(fieldId, k);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; extDictField = new DictField(dictTable.id(), extFieldId);&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;switch&lt;/span&gt; (extDictField.baseType())&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;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; Types::Container:&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; Types::String:&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;case&lt;/span&gt; Types::VarString:&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text += strfmt(&lt;span style="color: red;"&gt;" %1%2: %3\n"&lt;/span&gt;, extDictField.label(), strrep(&lt;span style="color: red;"&gt;' '&lt;/span&gt;, 40-strlen(extDictField.label())), strReplace(&lt;span style="background-color: yellow;"&gt;BOM&lt;/span&gt;.(extFieldId), &lt;span style="color: red;"&gt;'\n'&lt;/span&gt;, &lt;span style="color: red;"&gt;','&lt;/span&gt;));&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;default&lt;/span&gt;:&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text += strfmt(&lt;span style="color: red;"&gt;" %1%2: %3\n"&lt;/span&gt;, extDictField.label(), strrep(&lt;span style="color: red;"&gt;' '&lt;/span&gt;, 40-strlen(extDictField.label())), &lt;span style="background-color: yellow;"&gt;BOM&lt;/span&gt;.(extFieldId));&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;break&lt;/span&gt;;&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;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&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; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.addEnd(SysComparableTmpText::newText(substr(text,1,strlen(text)-1), dictFieldGroup.label(), 0, false, true));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return list;&lt;br /&gt;}&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;We've hardcoded some exceptions on this comparison regarding some datafields we already know it will be different between comparable objects (like the bomId or the linenum) but we don't want the system marks as different those objects if only this two fields are differents (because this fields will always be different)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now we return back to &lt;b&gt;MyBOMVersionComparable&lt;/b&gt;...&lt;br /&gt;We want to inform the comparison tool about all the children BOM lines associated with one BOMVersion.&lt;br /&gt;We add a BOMList (type list) variable on the ClassDeclaration and we will fill-in the list for example on the parmBOMVersion method (maybe it's not the best place to do this, but ... this is just a little sample ;) )&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;i&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;public&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; BOMVersion parmBOMVersion(BOMVersion _BOMVersion = BOMVersion)&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; {&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; BOM Bom;&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; BOMVersion.data(_BOMVersion);&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt; &lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; BOMList = &lt;/span&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;new&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; List(Types::Class);&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;While&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; &lt;/span&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;Select&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; BOM &lt;/span&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;where&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; BOM.BOMId &lt;/span&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;==&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; BOMVersion.BOMId&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOMList.addEnd(MyBOMComparable::newBOM(BOM));&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt; &lt;span style="background-color: #cccccc; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; BOMVersion;&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;And now we can implement the GetEnumerator() method :&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; SysComparableEnumerator getEnumerator()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MyComparableEnumerator LEnum;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LEnum = BOMList.getEnumerator();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; LEnum;&lt;br /&gt;}&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;We just make this little typecasting trick to return a SysComparableEnumerator from a simple ListEnumerator.&lt;br /&gt;&lt;br /&gt;And obviously ... we must take care about the sub-BOM lines.&lt;br /&gt;&lt;br /&gt;We return back to MyBOMComparable class and we will :&lt;br /&gt;Add a list to the classdeclaration and we're gonna fill this list on the parmBOM method :&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;i&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;public&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; BOM parmBOM(BOM _BOM = BOM)&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; {&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp; BOMVersion BOMVersion;&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp; InventTable InventTable;&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt; &lt;br style="background-color: #cccccc;" /&gt; &lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; BOM.data(_BOM);&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt; &lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; BOMList = &lt;/span&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;new&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; List(Types::Class);&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; InventTable = InventTable::find(BOM.ItemId);&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (InventTable.ItemType &lt;/span&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;==&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; ItemType::BOM)&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (BOM.ItemBOMId)&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;b style="background-color: #cccccc;"&gt;&lt;span style="color: #38761d;"&gt; // if BOMVersion designed ... we use it&lt;/span&gt;&lt;/b&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOMVersion = BOMVersion::find(BOM.ItemId, BOM.ItemBOMId, false, systemdateget(), systemdateget(), BOM.BOMQty);&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;b style="background-color: #cccccc; color: #38761d;"&gt;// else ... we will try to get an apropiated BOMVersion&lt;/b&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOMVersion = BomVersion::selectBomVersion(BOM.ItemId, systemdateget(), BOM.bomQty, BOM.inventDim());&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt; &lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (BOMVersion)&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BOMList.addEnd(MyBOMVersionComparable::newBOMVersion(BOMVersion));&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt; &lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="background-color: #cccccc; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background-color: #cccccc;"&gt; BOM;&lt;/span&gt;&lt;br style="background-color: #cccccc;" /&gt;&lt;span style="background-color: #cccccc;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;And the same typecasting trick on the getEnumerator() method ...&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;&lt;i&gt;&lt;span style="color: blue;"&gt;public&lt;/span&gt; SysComparableEnumerator getEnumerator()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; MyComparableEnumerator LEnum;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; LEnum = BOMList.getEnumerator();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; if (BOMList.elements())&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; LEnum;&lt;br /&gt;&amp;nbsp; &lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;return&lt;/span&gt; &lt;span style="color: blue;"&gt;null&lt;/span&gt;;&lt;br /&gt;}&lt;/i&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Finally ...&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Let's try it :&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_AednIu5RKrU/SvTD-tu53II/AAAAAAAAAPA/d2K53wffC6w/s1600-h/screenshot31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_AednIu5RKrU/SvTD-tu53II/AAAAAAAAAPA/d2K53wffC6w/s400/screenshot31.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Well, it was hard to explain, but &lt;a href="http://www.trucosax.com/phpnuke/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=25"&gt;here you can download the sample project&lt;/a&gt; (xpo) and play, investigate and try it yourself.&lt;br /&gt;&lt;br /&gt;&lt;i style="color: #6aa84f;"&gt;NOTE: I removed from the downloadable project the BOMConsistOf form because it's a standard form and it's not a good idea to import existing forms from third parties without being sure what you are doing. BTW you only must to take the menuItem you will find inside the project&amp;nbsp; and to add to your BOMConsistOf form by yourself (assigning the datasource property to BOMVersion)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Greetz,&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3799501001413219239-7817155956460796776?l=dynamicsaxstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicsaxstuff.blogspot.com/feeds/7817155956460796776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicsaxstuff.blogspot.com/2009/11/comparison-framework-sample-bom-version.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3799501001413219239/posts/default/7817155956460796776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3799501001413219239/posts/default/7817155956460796776'/><link rel='alternate' type='text/html' href='http://dynamicsaxstuff.blogspot.com/2009/11/comparison-framework-sample-bom-version.html' title='Comparison Framework Sample : BOM Version comparer'/><author><name>Mkz</name><uri>http://www.blogger.com/profile/09004527920296334163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_AednIu5RKrU/SreYoPpkjMI/AAAAAAAAAOI/cme6lVwU-Ic/S220/mqm.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_AednIu5RKrU/SvSzlHqXkPI/AAAAAAAAAOw/dkpxLbnAZ7M/s72-c/screenshot28.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3799501001413219239.post-1509962072228625917</id><published>2009-09-21T18:22:00.000+02:00</published><updated>2009-09-21T18:22:51.130+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='welcome'/><title type='text'>Welcome to Dynamics Ax Stuff</title><content type='html'>Welcome to Dynamics Ax stuff, my name is Manel Querol and I'm the webmaster of www.trucosax.com (the world's biggest Dynamics Ax community in Spanish language).&lt;br /&gt;&lt;br /&gt;On July'2009 I was awarded with the Microsoft MVP award on Dynamics Ax and this boosted me to create my first Dynamics Ax blog in english language.&lt;br /&gt;&lt;br /&gt;I would make a request to the readers to try to be patience with my english skills, I will try my best to express myself in a comprehensive way.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Currently I'm working as a freelance and I'm very very busy, but I will try to get enough time to frequently write here.&lt;br /&gt;&lt;br /&gt;Best Regards,&lt;br /&gt;&lt;br /&gt;Manel Querol.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3799501001413219239-1509962072228625917?l=dynamicsaxstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dynamicsaxstuff.blogspot.com/feeds/1509962072228625917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://dynamicsaxstuff.blogspot.com/2009/09/welcome-to-dynamics-ax-stuff.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3799501001413219239/posts/default/1509962072228625917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3799501001413219239/posts/default/1509962072228625917'/><link rel='alternate' type='text/html' href='http://dynamicsaxstuff.blogspot.com/2009/09/welcome-to-dynamics-ax-stuff.html' title='Welcome to Dynamics Ax Stuff'/><author><name>Mkz</name><uri>http://www.blogger.com/profile/09004527920296334163</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='25' height='32' src='http://2.bp.blogspot.com/_AednIu5RKrU/SreYoPpkjMI/AAAAAAAAAOI/cme6lVwU-Ic/S220/mqm.jpg'/></author><thr:total>1</thr:total></entry></feed>
