
{"id":66,"date":"2017-04-11T18:13:23","date_gmt":"2017-04-11T08:13:23","guid":{"rendered":"http:\/\/bakke.online\/?p=66"},"modified":"2017-04-11T18:13:23","modified_gmt":"2017-04-11T08:13:23","slug":"how-to-tree-lookups-in-dynamics-ax-reference-group-controls-part-1","status":"publish","type":"post","link":"https:\/\/www.bakke.online\/index.php\/2017\/04\/11\/how-to-tree-lookups-in-dynamics-ax-reference-group-controls-part-1\/","title":{"rendered":"How-to: Tree lookups in Dynamics AX reference group controls, part 1"},"content":{"rendered":"<p>This is the first part of a multi-post series that explains how to do a tree lookup in a reference group control on an AX form.<\/p>\n<p>It&#8217;s simple, just look at those trees up there&#8230;<\/p>\n<p>Oh, seriously&#8230;<\/p>\n<p>This is something that keeps coming up on different projects, so I&#8217;d like to share how I usually do this. \u00a0There are some examples out there which try to describe a very generic solution which can be used in almost any case. \u00a0However, such solutions very quickly become <strong>very<\/strong> complex. \u00a0To keep things simple, I have tried to keep this example fairly specific but adaptable to a wide range of circumstances. \u00a0Specifically this example is using a fixed hierarchy structure with a fixed number of levels, each of which will be represented by a different table.<\/p>\n<p>I&#8217;ll show how to build the\u00a0lookup, how to load the tree items on demand to speed up the loading times as well as how to properly select and return the selected record. \u00a0I&#8217;ll also show some suggestions for how to build the reference group properly so it is easy for the user to understand the information presented to him\/her and to understand what to do.<\/p>\n<p>This first part of the series shows how to set up the tables and their relationships.<\/p>\n<p><!--more--><\/p>\n<p>To use an example which is easy to relate to, imagine a local council operating multiple libraries. \u00a0I&#8217;ll organise this into a structure like Library =&gt; Aisle =&gt; Rack\u00a0=&gt; Shelf, each of which will be represented by a separate table. \u00a0(I know this is very analogous to the Dynamic AX site\/warehouse structure, but this is just choosing a simple example.)<\/p>\n<p>In addition to the tables representing the levels of the tree, there will be a table representing books and containing a reference back to the specific shelf a book can be found on.<\/p>\n<p>For clarity, I&#8217;ll keep things simple and only add the bare minimums to each table. \u00a0Things will get fairly repetitive as a result, as the data model is virtually identical at each level of the tree. \u00a0If you don&#8217;t want to create all of this manually, there will be an XPO in the last part of this series, containing the full set of objects discussed.<\/p>\n<p>As usual, use whatever object name prefix you need, according to your naming conventions.<\/p>\n<h3>Libraries\u00a0table<\/h3>\n<p>This is the top-level table in the hierarchy.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-72\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/EB_Libraries.png\" alt=\"\" width=\"343\" height=\"35\" \/><\/p>\n<p>Add the following fields:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-84\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/LibraryId2.png\" alt=\"\" width=\"288\" height=\"52\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-83\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/libraryname2.png\" alt=\"\" width=\"288\" height=\"52\" \/><\/p>\n<p>We&#8217;re going to need an index to use as a replacement key, so let&#8217;s add one on the LibraryId field. \u00a0Setting this as replacement key will also update the AutoIdentification field group to match the index keys.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-77\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/libraryidx.png\" alt=\"\" width=\"421\" height=\"119\" \/><\/p>\n<p>To support links from the following table back to this one, add a new Extended Data Type (EDT), int64 type. \u00a0The EDT needs a table reference to the RecId field in this table.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-78\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_libraryrefrecid.png\" alt=\"\" width=\"600\" height=\"70\" \/><\/p>\n<p>That relation needs to be backed by an index, so make sure there is an index on RecId, and that it is the primary key for the aisles table. \u00a0The index-related properties on the table should look like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-79\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/libraries_index.png\" alt=\"\" width=\"309\" height=\"52\" \/><\/p>\n<h3>Aisle table<\/h3>\n<p>This table describes the aisles within each library.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-81\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_aisles.png\" alt=\"\" width=\"272\" height=\"35\" \/><\/p>\n<p>Add the following fields:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-82\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/libraryrecid.png\" alt=\"\" width=\"310\" height=\"52\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-86\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/aisleid.png\" alt=\"\" width=\"310\" height=\"52\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-87\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/aislename.png\" alt=\"\" width=\"310\" height=\"52\" \/><\/p>\n<p>We need a relation on LibraryRecId to point to RecId in EB_Libraries. \u00a0This will be added automatically when adding the LibraryRecId field, based on the table relation specified on the EDT. \u00a0If you missed this, or clicked &#8220;No&#8221; on the prompt, add one manually now.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-89\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_aisles_relation.png\" alt=\"\" width=\"337\" height=\"171\" \/><\/p>\n<p>We&#8217;re going to need an index to use as a replacement key, so let&#8217;s add one on the AisleId field. \u00a0However, there can be multiple aisles with the same ID as long as they are in different libraries, so we&#8217;ll need LibraryRecId as the leading key. \u00a0Setting this as replacement key will also update the AutoIdentification field group to match the index keys.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-90\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/aisleidx.png\" alt=\"\" width=\"448\" height=\"186\" \/><\/p>\n<p>To help speed up queries, we&#8217;ll make sure all aisles for a library are stored next to each other in the database, so we&#8217;re going to make this the clustered index for the table as well.<\/p>\n<p>To support links from the following table back to this one, add a new Extended Data Type (EDT), int64 type. \u00a0The EDT needs a table reference to the RecId field in this table.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-100\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_aislerefrecid.png\" alt=\"\" width=\"561\" height=\"99\" \/><\/p>\n<p>That relation needs to be backed by an index, so make sure there is an index on RecId, and that it is the primary key for the aisles table. \u00a0The index-related properties on the table should look like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-92\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/aisles_index.png\" alt=\"\" width=\"282\" height=\"52\" \/><\/p>\n<h3>Racks table<\/h3>\n<p>This table describes the racks within each aisle.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-93\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_racks.png\" alt=\"\" width=\"284\" height=\"35\" \/><\/p>\n<p>Add the following fields:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-94\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/aislerecid.png\" alt=\"\" width=\"310\" height=\"52\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-95\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/rackid.png\" alt=\"\" width=\"310\" height=\"52\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-96\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/rackname.png\" alt=\"\" width=\"310\" height=\"52\" \/><\/p>\n<p>We need a relation on AisleRecId to point to RecId in EB_Aisles. \u00a0This will be added automatically when adding the AisleRecId field, based on the table relation specified on the EDT. \u00a0If you missed this, or clicked &#8220;No&#8221; on the prompt, add one manually now.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-97\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_racks_relation.png\" alt=\"\" width=\"312\" height=\"171\" \/><\/p>\n<p>We&#8217;re going to need an index to use as a replacement key, so let&#8217;s add one on the RackId field. \u00a0However, there can be multiple racks\u00a0with the same ID as long as they are in different aisles, so we&#8217;ll need AisleRecId as the leading key. \u00a0Setting this as replacement key will also update the AutoIdentification field group to match the index keys.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-98\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/rackidx.png\" alt=\"\" width=\"566\" height=\"189\" \/><\/p>\n<p>To help speed up queries, we&#8217;ll make sure all racks for an aisle are stored next to each other in the database, so we&#8217;re going to make this the clustered index for the table as well.<\/p>\n<p>To support links from the following table back to this one, add a new Extended Data Type (EDT), int64 type. \u00a0The EDT needs a table reference to the RecId field in this table.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-99\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_rackrefrecid.png\" alt=\"\" width=\"620\" height=\"69\" \/><\/p>\n<p>That relation needs to be backed by an index, so make sure there is an index on RecId, and that it is the primary key for the aisles table. \u00a0The index-related properties on the table should look like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-101\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/racks_index.png\" alt=\"\" width=\"282\" height=\"52\" \/><\/p>\n<h3>Shelves table<\/h3>\n<p>This table describes the shelves in each rack.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-106\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_shelves.png\" alt=\"\" width=\"274\" height=\"35\" \/><\/p>\n<p>Add the following fields:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-107\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/rackrecid.png\" alt=\"\" width=\"310\" height=\"52\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-108\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/shelfid.png\" alt=\"\" width=\"310\" height=\"52\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-109\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/shelfname.png\" alt=\"\" width=\"310\" height=\"52\" \/><\/p>\n<p>We need a relation on RackRecId to point to RecId in EB_Racks. \u00a0This will be added automatically when adding the RackRecId field, based on the table relation specified on the EDT. \u00a0If you missed this, or clicked &#8220;No&#8221; on the prompt, add one manually now.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-113\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_shelves_relation2.png\" alt=\"\" width=\"328\" height=\"170\" \/><\/p>\n<p>We&#8217;re going to need an index to use as a replacement key, so let&#8217;s add one on the ShelfId field. \u00a0However, there can be multiple shelves with the same ID as long as they are in different racks, so we&#8217;ll need RackRecId as the leading key. \u00a0Setting this as replacement key will also update the AutoIdentification field group to match the index keys.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-111\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/shelfidx.png\" alt=\"\" width=\"576\" height=\"188\" \/><\/p>\n<p>To help speed up queries, we&#8217;ll make sure all racks for an aisle are stored next to each other in the database, so we&#8217;re going to make this the clustered index for the table as well.<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-120\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_books_relation.png\" alt=\"\" width=\"336\" height=\"172\" \/><\/p>\n<p>To support links from the books table back to this one, add a new Extended Data Type (EDT), int64 type. \u00a0The EDT needs a table reference to the RecId field in this table.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-114\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_shelfrefrecid.png\" alt=\"\" width=\"634\" height=\"69\" \/><\/p>\n<p>That relation needs to be backed by an index, so make sure there is an index on RecId, and that it is the primary key for the aisles table. \u00a0The index-related properties on the table should look like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-115\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/shelves_index.png\" alt=\"\" width=\"298\" height=\"52\" \/><\/p>\n<h3>Demo data<\/h3>\n<p>We need some demo data, which we can create through a simple job.<\/p>\n<pre><span style=\"color: #0000ff;\"><strong>static void<\/strong><\/span> EB_FillLibraries( Args _args )\n{\n  EB_Libraries libraries;\n  EB_Aisles    aisles;\n  EB_Racks     racks;\n  EB_Shelves   shelves;\n  <span style=\"color: #0000ff;\"><strong>int<\/strong> <\/span>l, a, r, s;\n\n  <strong><span style=\"color: #0000ff;\">container<\/span> <\/strong>conLibraries = [ <span style=\"color: #993300;\">\"Top Ryde\"<\/span>, <span style=\"color: #993300;\">\"Eastwood\"<\/span>, <span style=\"color: #993300;\">\"West Ryde\"<\/span> ];\n  <strong><span style=\"color: #0000ff;\">container <\/span><\/strong>conAisles    = [ <span style=\"color: #993300;\">\"A1\"<\/span>, <span style=\"color: #993300;\">\"A2\"<\/span>, <span style=\"color: #993300;\">\"A3\"<\/span>, <span style=\"color: #993300;\">\"A4\"<\/span>, <span style=\"color: #993300;\">\"A5\"<\/span>, <span style=\"color: #993300;\">\"A6\"<\/span> ];\n  <strong><span style=\"color: #0000ff;\">container<\/span> <\/strong>conRacks     = [ <span style=\"color: #993300;\">\"R1\"<\/span>, <span style=\"color: #993300;\">\"R2\"<\/span>, <span style=\"color: #993300;\">\"R3\"<\/span>, <span style=\"color: #993300;\">\"R4\"<\/span>, <span style=\"color: #993300;\">\"R5\"<\/span>, <span style=\"color: #993300;\">\"R6\"<\/span>, <span style=\"color: #993300;\">\"R7\"<\/span>, <span style=\"color: #993300;\">\"R8\"<\/span> ];\n  <strong><span style=\"color: #0000ff;\">container<\/span> <\/strong>conShelves   = [ <span style=\"color: #993300;\">\"S1\"<\/span>, <span style=\"color: #993300;\">\"S2\"<\/span>, <span style=\"color: #993300;\">\"S3\"<\/span>, <span style=\"color: #993300;\">\"S4\"<\/span> ];\n\n  <span style=\"color: #0000ff;\"><strong>ttsBegin<\/strong><\/span>;\n\n  <strong><span style=\"color: #0000ff;\">for<\/span><\/strong>( l = <span style=\"color: #ff0000;\"><strong>1<\/strong><\/span>; l &lt;= <span style=\"color: #0000ff;\"><strong>conLen<\/strong><\/span>( conLibraries ); l++ )\n  {\n    libraries.clear();\n    libraries.LibraryId = <span style=\"color: #0000ff;\"><strong>conPeek<\/strong><\/span>( conLibraries, l );\n  \u00a0 libraries.Name      = libraries.LibraryId;\n    libraries.insert();\n\n    <span style=\"color: #0000ff;\"><strong>for<\/strong><\/span>( a = <span style=\"color: #ff0000;\"><strong>1<\/strong><\/span>; a &lt;= <span style=\"color: #0000ff;\"><strong>conLen<\/strong><\/span>( conAisles ); a++ )\n    {\n      aisles.clear();\n      aisles.LibraryRecId = libraries.RecId;\n      aisles.AisleId      = <span style=\"color: #0000ff;\"><strong>conPeek<\/strong><\/span>( conAisles, a );\n      aisles.Name         = <span style=\"color: #0000ff;\"><strong>strFmt<\/strong><\/span>( <span style=\"color: #993300;\">\"Aisle %1\"<\/span>, aisles.AisleId );\n      aisles.insert();\n\n      <span style=\"color: #0000ff;\"><strong>for<\/strong><\/span>( r = <span style=\"color: #ff0000;\"><strong>1<\/strong><\/span>; r &lt;= <span style=\"color: #0000ff;\"><strong>conLen<\/strong><\/span>( conRacks ); r++ )\n      {\n        racks.clear();\n        racks.AisleRecId = aisles.RecId;\n        racks.RackId     = <span style=\"color: #0000ff;\"><strong>conPeek<\/strong><\/span>( conRacks, r );\n        racks.Name       = <span style=\"color: #0000ff;\"><strong>strFmt<\/strong><\/span>( <span style=\"color: #993300;\">\"Rack %1\"<\/span>, racks.RackId );\n        racks.insert();\n\n        <span style=\"color: #0000ff;\"><strong>for<\/strong><\/span>( s = <span style=\"color: #ff0000;\"><strong>1<\/strong><\/span>; s &lt;= <span style=\"color: #0000ff;\"><strong>conLen<\/strong><\/span>( conShelves ); s++ )\n        {\n          shelves.clear();\n          shelves.RackRecId = racks.RecId;\n          shelves.ShelfId   = <span style=\"color: #0000ff;\"><strong>conPeek<\/strong><\/span>( conShelves, s );\n          shelves.Name      = <span style=\"color: #0000ff;\"><strong>strFmt<\/strong><\/span>( <span style=\"color: #993300;\">\"Shelf %1\"<\/span>, shelves.ShelfId );\n          shelves.insert();\n        }\n      }\n    }\n  }\n\n  <span style=\"color: #0000ff;\"><strong>ttsCommit<\/strong><\/span>;\n}<\/pre>\n<p>Copy\/paste this into a new job and run it. \u00a0It will create identical layouts for each library but it&#8217;s good enough for this purpose.<\/p>\n<h3>Books table<\/h3>\n<p>This table describes books, which can be on any shelf within the whole library.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-117\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_books.png\" alt=\"\" width=\"295\" height=\"35\" \/><\/p>\n<p>Add the following fields:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-118\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/bookid.png\" alt=\"\" width=\"303\" height=\"52\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-119\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/shelfrecid.png\" alt=\"\" width=\"310\" height=\"52\" \/><\/p>\n<p>We need a relation on ShelfRecId to point to RecId in EB_Shelves. \u00a0This will be added automatically when adding the ShelfRecId field, based on the table relation specified on the EDT. \u00a0If you missed this, or clicked &#8220;No&#8221; on the prompt, add one manually now.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-120\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/eb_books_relation.png\" alt=\"\" width=\"336\" height=\"172\" \/><\/p>\n<p>As we&#8217;re not going to have anything referencing the books table, we&#8217;re not adding any indexes or replacement keys. \u00a0What we will do, however, is to add a form.<\/p>\n<p>Add a simple form containing EB_Books as a datasource and a single grid set to fill the entire form. \u00a0The grid should use EB_Books as its datasource, and contain two fields, ShelfRecid and BookId. \u00a0Let&#8217;s call the form EB_Books.<\/p>\n<p>Notice how AX automatically replaced ShelfRecId with a reference group containing the replacement keys for each hierarchy level all the way up to LibraryId.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-121\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/books_form.png\" alt=\"\" width=\"537\" height=\"308\" \/><\/p>\n<p>Quite helpful, actually. \u00a0Let&#8217;s see what it looks like.<\/p>\n<p><a href=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/books_form_2b.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-199 size-full\" src=\"https:\/\/www.bakke.online\/wp-content\/uploads\/2017\/04\/books_form_2b.png\" width=\"749\" height=\"359\" \/><\/a><\/p>\n<p>OK, it shows each field in the hierarchy.<br \/>\nThe drop-down only allows to select the Shelf level, and there are no drop-downs on any of the other levels. \u00a0And&#8230; \u00a0Every single shelf record is displayed. \u00a0 \u00a0 Uuuughhh&#8230;.<\/p>\n<p>To solve this, we need a tree lookup, and that&#8217;s probably why you&#8217;re reading this anyway. \u00a0I&#8217;ll get back to that in the <a href=\"https:\/\/www.bakke.online\/index.php\/2017\/04\/12\/how-to-tree-lookups-in-dynamics-ax-reference-group-controls-part-2\/\">second part of the series<\/a>.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is the first part of a multi-post series that explains how to do a tree lookup in a reference group control on an AX form. It&#8217;s simple, just look at those trees up there&#8230; Oh, seriously&#8230; This is something that keeps coming up on different projects, so I&#8217;d like to share how I usually &hellip; <a href=\"https:\/\/www.bakke.online\/index.php\/2017\/04\/11\/how-to-tree-lookups-in-dynamics-ax-reference-group-controls-part-1\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;How-to: Tree lookups in Dynamics AX reference group controls, part 1&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,1],"tags":[2,3,5],"class_list":["post-66","post","type-post","status-publish","format-standard","hentry","category-dynamics-ax","category-uncategorized","tag-ax2012r3","tag-dynamics-ax","tag-user-interface"],"_links":{"self":[{"href":"https:\/\/www.bakke.online\/index.php\/wp-json\/wp\/v2\/posts\/66","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bakke.online\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bakke.online\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bakke.online\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bakke.online\/index.php\/wp-json\/wp\/v2\/comments?post=66"}],"version-history":[{"count":0,"href":"https:\/\/www.bakke.online\/index.php\/wp-json\/wp\/v2\/posts\/66\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.bakke.online\/index.php\/wp-json\/wp\/v2\/media?parent=66"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bakke.online\/index.php\/wp-json\/wp\/v2\/categories?post=66"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bakke.online\/index.php\/wp-json\/wp\/v2\/tags?post=66"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}