D365/AX7:Convert A String/Text Into A Memory Stream & Download It As XML File

Requirement & Purpose

Requirement is to create a XML string from D365 Finance & Operation using X++ & downloading it into the user’s browser as a XML file.The purpose of this sample code is to show you how we can convert string or text value into a byte array, converting byte array into memory stream the download it into the user’s browser as a XML file.

Sample Code

[code language = “cpp”]
System.Byte[] reportBytes = new System.Byte[0]();
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
reportBytes = enc.GetBytes(‘YOUR XML STRING/TEXT’);
System.IO.MemoryStream stream = new System.IO.MemoryStream(reportBytes);
FileUploadTemporaryStorageResult result = File::SendFileToTempStore_GetResult(stream, ‘abcd.xml’);
Message::Add(MessageSeverity::Informational, result.getDownloadUrl());
Browser().navigate(result.getDownloadUrl(), true);
[/code]

D365/AX7/SQL:ColumnStore VS Index Simple-Talk

Purpose & Explanation

In older version of Microsoft Dynamics AX , there is no option to use concept of ‘Column Store’.But in Microsoft Dynamics 365 Finance & Operations you can set the “IndexType” property of a index in a table.There are 2 values available – 1) Index 2)ColumnStore.

A columnstore index stores data in a column-wise or in columnar format where as index stores data in a row -wise format.

Columnstore index is to reduce I/O, which can have a direct impact on query performance as comparison to index.

Columnstore is designed to speed up data-warehouse queries & read-Only operations.

Columnstore is better for OLAP whereas index is better for OLTP.

Untitled

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