D365/AX7:Create A Tree Node Form Using Pattern – Simple List & Details-Tree

Requirement

Create A New Tree Node Form Using Pattern – Simple List & Details-Tree.

Untitled

Steps

  1. Create a new table AcxNodeTable which contains fields -Node(str 10) & NodeDescription(str 60).
  2. Create a new table AcxNodeReferenceTable which contains fields – Node (int64) & ParentNode (int64).
  3. Create a new form AcxNode using pattern – *Simple List & Details – Tree*.The form design should look as per below screen.
  4. Create the below methods in form.

[code language = “cpp”]
[Form]
public class AcxNode extends FormRun
{
boolean isNewNode;
boolean isModified;
TreeItemIdx newItemIdx;
TreeItemIdx lastRecordIdx;
int64 lastRecordRecId;
int64 range;
int64 nodeGroupHierarchyParentRecid;
List delRecList;
public void deleteGroupCode(recId _parentrecId)
{
AcxNodeReferenceTable nodeReferenceTableLocal;
AcxNodeReferenceTable nodeReferenceTableLoop;
while select * from nodeReferenceTableLoop
where nodeReferenceTableLoop.ParentNode == _parentrecId</pre>
{
select count(recId) from nodeReferenceTableLocal
where nodeReferenceTableLocal.ParentNode == nodeReferenceTableLoop.RecId;
if(nodeReferenceTableLocal.RecId &gt; 0)
{
delRecList.addEnd(nodeReferenceTableLoop.ParentNode);
element.deleteGroupCode(nodeReferenceTableLoop.RecId);
}
else
{
delRecList.addEnd(nodeReferenceTableLoop.ParentNode);
}
}
}

public boolean deleteNodeGroup(recId _recId)
{
AcxNodeTable nodeTableLocal;
AcxNodeReferenceTable nodeReferenceTable;
DialogButton dialogButton;
ListEnumerator enumer;
boolean allDeleted = true;

if(_recId)
{
select firstonly1 nodeReferenceTable
where nodeReferenceTable.RecId == _recId;
dialogButton = Box::yesNo(“Do you want to delete node and its subnodes?”, DialogButton::No);
if( dialogButton == DialogButton::Yes )
{
try
{
delRecList = new List(Types::Int64);
delRecList.addStart(nodeReferenceTable.Node);
element.deleteGroupCode(_recId);
enumer = delRecList.getEnumerator();
ttsBegin;
while(enumer.moveNext())
{
select forupdate nodeTableLocal
where nodeTableLocal.RecId == enumer.current();
if(nodeTableLocal.validateDelete())
{
nodeTableLocal.delete();
}
else
{
allDeleted = false;
break;
}
}

if(allDeleted)
{
ttsCommit;
return true;
}
else
{
ttsAbort;
return false;
}
}
catch
{
return false;
}
}
else
{
return false;
}
}

else
{
return false;
}
}

public void refreshTree(recId _lastRecid)
{
lastRecordRecId = _lastRecid;
element.loadTree();
WorkplanTreeControl.select(lastRecordIdx);
}

public void addNode(TreeItemIdx _parentIdx)
{
FormTreeItem newItem;
FormTreeItem parentItem;
;

newItem = new FormTreeItem(“”);
newItem.data(0);
newItemIdx = WorkplanTreeControl.addItem(_parentIdx, FormTreeAdd::Sort,newItem);
WorkplanTreeControl.select(newItemIdx);
AcxNodeTable_ds.create();
parentItem = WorkplanTreeControl.getItem(_parentIdx);
nodeGroupHierarchyParentRecid = parentItem.data();
isNewNode = true;
}

/// &lt;summary&gt;
///
/// &lt;/summary&gt;
public void run()
{
super();

element.loadTree();
}

public void loadTree()
{
TreeItemIdx parentItemIdx;
WorkplanTreeControl.deleteAll();
parentItemIdx = this.createRootNode();
this.createChildNodes(parentItemIdx,0);
WorkplanTreeControl.select(WorkplanTreeControl.getRoot());
WorkplanTreeControl.expand(WorkplanTreeControl.getRoot());
}

public TreeItemIdx createRootNode()
{
FormTreeItem parentItem;
parentItem = new FormTreeItem(“Root Of Tree”);
parentItem.data(0);
return WorkplanTreeControl.addItem(FormTreeAdd::Root,FormTreeAdd::First,parentItem);
}

public void createChildNodes(TreeItemIdx _parentIdx, int64 _serviceGroupHierarchyParentRecid)
{
AcxNodeReferenceTable nodeReferenceLocal;
AcxNodeReferenceTable nodeReferenceChild;
AcxNodeTable nodeTable;
FormTreeItem parentItem;
TreeItemIdx newParentIdx;

while select * from nodeReferenceLocal
join * from nodeTable
where nodeReferenceLocal.ParentNode == _serviceGroupHierarchyParentRecid
&amp;&amp; nodeReferenceLocal.Node == nodeTable.RecId
{
select count(recId) from nodeReferenceChild
where nodeReferenceChild.ParentNode == nodeReferenceLocal.RecId;
if(nodeReferenceChild.RecId &gt; 0)
{
parentItem = new FormTreeItem();
parentItem.data(nodeReferenceLocal.RecId);
parentItem.text(nodeTable.NodeDescription);

newParentIdx = WorkplanTreeControl.addItem(_parentIdx,FormTreeAdd::Sort,parentItem);
if(nodeReferenceLocal.RecId == lastRecordRecId)
{
lastRecordIdx = newParentIdx;
}
element.createChildNodes(newParentIdx,nodeReferenceLocal.RecId);
}
else
{
parentItem = new FormTreeItem();
parentItem.data(nodeReferenceLocal.RecId);
parentItem.text(nodeTable.NodeDescription);
newParentIdx = WorkplanTreeControl.addItem(_parentIdx,FormTreeAdd::Sort,parentItem);
if(nodeReferenceLocal.RecId == lastRecordRecId)
{
lastRecordIdx = newParentIdx;
}
}

}
}

[DataSource]
class AcxNodeTable
{
/// &lt;summary&gt;
///
/// &lt;/summary&gt;
public void executeQuery()
{
this.query().dataSourceTable(tableNum(AcxNodeTable)).clearRanges();
this.query().dataSourceTable(tableNum(AcxNodeTable)).clearDynalinks();
this.query().dataSourceTable(tableNum(AcxNodeTable)).addRange(fieldNum(AcxNodeTable, RecId)).value(int642Str(Range));
range = 0;
super();
}

/// &lt;summary&gt;
///
/// &lt;/summary&gt;
public void write()
{
AcxNodeReferenceTable nodeReferenceTable;
super();
if(isNewNode == true)
{
nodeReferenceTable.clear();
nodeReferenceTable.Node = AcxNodeTable.RecId;
nodeReferenceTable.ParentNode = nodeGroupHierarchyParentRecid;
nodeReferenceTable.insert();

newItemIdx = 0;
nodeGroupHierarchyParentRecid = 0;
isNewNode = false;
isModified = false;
element.refreshTree(nodeReferenceTable.RecId);
}
else
{
element.refreshTree(nodeReferenceTable.RecId);
}
isNewNode = false;
}

}

[Control(“CommandButton”)]
class AddNode
{
/// &lt;summary&gt;
///
/// &lt;/summary&gt;
public void clicked()
{
super();
element.addNode(WorkplanTreeControl.getSelection());
}

}

[Control(“CommandButton”)]
class DeleteNode
{
public void clicked()
{
FormTreeItem treeItem;
treeItem = WorkplanTreeControl.getItem(WorkplanTreeControl.getSelection());
if(element.deleteNodeGroup(treeItem.data()))
{
element.loadTree();
}
}

}

[Control(“Tree”)]
class WorkplanTreeControl
{
/// &lt;summary&gt;
///
/// &lt;/summary&gt;
/// &lt;param name = “_OldItem”&gt;&lt;/param&gt;
/// &lt;param name = “_NewItem”&gt;&lt;/param&gt;
/// &lt;param name = “_how”&gt;&lt;/param&gt;
public void selectionChanged(FormTreeItem _OldItem, FormTreeItem _NewItem, FormTreeSelect _how)
{
AcxNodeReferenceTable nodeReferenceTable;
super(_OldItem, _NewItem, _how);
FormTreeItem treeItem;
treeItem = WorkplanTreeControl.getItem(WorkplanTreeControl.getSelection());
select firstonly1 nodeReferenceTable
where nodeReferenceTable.RecId == treeItem.data();
range = nodeReferenceTable.Node;
AcxNodeTable_DS.executeQuery();
AcxNodeTable_DS.research(true);
AcxNodeTable_DS.refresh();
}
}
}
}
[/code]

 

cheers 🙂

piyush adhikari

 

 

One thought on “D365/AX7:Create A Tree Node Form Using Pattern – Simple List & Details-Tree”

Leave a Reply