Skip to content

Commit 2f23b7b

Browse files
Entity fields and menu item cross reference utilities (#30)
1 parent 85fdcbf commit 2f23b7b

31 files changed

Lines changed: 2593 additions & 48 deletions

Metadata/AOTBrowser/AOTBrowser/AxClass/ARBAOTBrowserHelper.xml

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
<Declaration><![CDATA[
66
using Microsoft.Dynamics.AX.Metadata.MetaModel;
77
using Microsoft.Dynamics.AX.Metadata.Core.MetaModel;
8+
using Xpp = Microsoft.Dynamics.Ax.Xpp;
9+
using ArbelaXpp = Arbela.Dynamics.Ax.Xpp;
810
911
public final class ARBAOTBrowserHelper
1012
{
@@ -52,6 +54,214 @@ public final class ARBAOTBrowserHelper
5254
return objectId;
5355
}
5456
57+
]]></Source>
58+
</Method>
59+
<Method>
60+
<Name>getFormDatasourceTableName</Name>
61+
<Source><![CDATA[
62+
public static TableName getFormDatasourceTableName(str _formName, str _datasourceName)
63+
{
64+
str tableName;
65+
AxForm currentForm = Xpp.MetadataSupport::GetForm(_formName);
66+
tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, currentForm.DataSources);
67+
if (!tableName)
68+
{
69+
var formExtensionsEnum = ArbelaXpp.MetadataSupport::GetFormExtensionsForForm(_formName).GetEnumerator();
70+
while (!tableName && formExtensionsEnum.MoveNext())
71+
{
72+
AxFormExtension formExtension = formExtensionsEnum.Current;
73+
if (!CLRInterop::isNull(formExtension.DataSources))
74+
{
75+
tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, formExtension.DataSources);
76+
}
77+
}
78+
}
79+
80+
return tableName;
81+
}
82+
83+
]]></Source>
84+
</Method>
85+
<Method>
86+
<Name>getViewDatasourceTableName</Name>
87+
<Source><![CDATA[
88+
public static TableName getViewDatasourceTableName(str _viewName, str _datasourceName)
89+
{
90+
str tableName;
91+
AxView currentView = Xpp.MetadataSupport::GetView(_viewName);
92+
if (currentView.Query != null)
93+
{
94+
AxQuerySimple axQuery = Xpp.MetadataSupport::GetQuery(currentView.Query) as AxQuerySimple;
95+
tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, axQuery.DataSources);
96+
if (!tableName)
97+
{
98+
var queryExtensionsEnum = ArbelaXpp.MetadataSupport::GetQueryExtensionsForQuery(currentView.Query).GetEnumerator();
99+
while (!tableName && queryExtensionsEnum.MoveNext())
100+
{
101+
AxQuerySimpleExtension queryExtension = queryExtensionsEnum.Current;
102+
if (!CLRInterop::isNull(queryExtension.DataSources))
103+
{
104+
tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, queryExtension.DataSources);
105+
}
106+
}
107+
}
108+
}
109+
else
110+
{
111+
tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, currentView.ViewMetadata.DataSources);
112+
if (!tableName)
113+
{
114+
var viewExtensionsEnum = ArbelaXpp.MetadataSupport::GetViewExtensionsForView(_viewName).GetEnumerator();
115+
while (!tableName && viewExtensionsEnum.MoveNext())
116+
{
117+
AxViewExtension viewExtension = viewExtensionsEnum.Current;
118+
if (!CLRInterop::isNull(viewExtension.DataSources))
119+
{
120+
tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, viewExtension.DataSources);
121+
}
122+
}
123+
}
124+
}
125+
126+
return tableName;
127+
}
128+
129+
]]></Source>
130+
</Method>
131+
<Method>
132+
<Name>getTableNameFromDatasource</Name>
133+
<Source><![CDATA[
134+
public static TableName getTableNameFromDatasource(str _datasourceName, System.Collections.IEnumerable _datasources, System.Collections.IEnumerable _extensionDatasources = CLRInterop::Null())
135+
{
136+
System.Collections.IEnumerator datasourcesEnum;
137+
if (!CLRInterop::isNull(_datasources))
138+
{
139+
datasourcesEnum = _datasources.GetEnumerator();
140+
while (datasourcesEnum.MoveNext())
141+
{
142+
if (datasourcesEnum.Current is AxFormDataSourceRoot)
143+
{
144+
AxFormDataSourceRoot formDataSourceRoot = datasourcesEnum.Current;
145+
if (formDataSourceRoot.Name == _datasourceName)
146+
{
147+
return formDataSourceRoot.Table;
148+
}
149+
else
150+
{
151+
TableName tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, formDataSourceRoot.ReferencedDataSources);
152+
if (tableName)
153+
{
154+
return tableName;
155+
}
156+
else
157+
{
158+
tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, formDataSourceRoot.DerivedDataSources);
159+
if (tableName)
160+
{
161+
return tableName;
162+
}
163+
}
164+
}
165+
}
166+
else if (datasourcesEnum.Current is AxFormDataSourceDerived)
167+
{
168+
AxFormDataSourceDerived formDataSourceDerived = datasourcesEnum.Current;
169+
if (formDataSourceDerived.Name == _datasourceName)
170+
{
171+
return formDataSourceDerived.Table;
172+
}
173+
else
174+
{
175+
TableName tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, formDataSourceDerived.ReferencedDataSources);
176+
if (tableName)
177+
{
178+
return tableName;
179+
}
180+
else
181+
{
182+
tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, formDataSourceDerived.DerivedDataSources);
183+
if (tableName)
184+
{
185+
return tableName;
186+
}
187+
}
188+
}
189+
}
190+
else if (datasourcesEnum.Current is AxFormDataSourceReferenced)
191+
{
192+
AxFormDataSourceReferenced formDataSourceReferenced = datasourcesEnum.Current;
193+
if (formDataSourceReferenced.Name == _datasourceName)
194+
{
195+
return formDataSourceReferenced.Table;
196+
}
197+
else
198+
{
199+
TableName tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, formDataSourceReferenced.ReferencedDataSources);
200+
if (tableName)
201+
{
202+
return tableName;
203+
}
204+
}
205+
}
206+
else if (datasourcesEnum.Current is AxQuerySimpleDataSource)
207+
{
208+
AxQuerySimpleDataSource datasource = datasourcesEnum.Current as AxQuerySimpleDataSource;
209+
if (datasource.Name == _datasourceName)
210+
{
211+
return datasource.Table;
212+
}
213+
else
214+
{
215+
TableName tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, datasource.DataSources);
216+
if (tableName)
217+
{
218+
return tableName;
219+
}
220+
else
221+
{
222+
tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, datasource.DerivedDataSources);
223+
if (tableName)
224+
{
225+
return tableName;
226+
}
227+
}
228+
}
229+
}
230+
}
231+
}
232+
233+
if (!CLRInterop::isNull(_extensionDatasources))
234+
{
235+
datasourcesEnum = _datasources.GetEnumerator();
236+
while (datasourcesEnum.MoveNext())
237+
{
238+
AxQuerySimpleDataSource datasource = datasourcesEnum.Current as AxQuerySimpleDataSource;
239+
if (datasource.Name == _datasourceName)
240+
{
241+
return datasource.Table;
242+
}
243+
else
244+
{
245+
TableName tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, datasource.DataSources);
246+
if (tableName)
247+
{
248+
return tableName;
249+
}
250+
else
251+
{
252+
tableName = ARBAOTBrowserHelper::getTableNameFromDatasource(_datasourceName, datasource.DerivedDataSources);
253+
if (tableName)
254+
{
255+
return tableName;
256+
}
257+
}
258+
}
259+
}
260+
}
261+
262+
return '';
263+
}
264+
55265
]]></Source>
56266
</Method>
57267
</Methods>

Metadata/AOTBrowser/AOTBrowser/AxClass/ARBAOTObjectPopulateService.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,19 @@ class ARBAOTObjectPopulateService extends SysOperationServiceBase
514514
aotObjectsInsertList.add(aotObjects);
515515
}
516516
517+
var kpiNames = ArbelaXpp.MetadataSupport::KPINames();
518+
519+
while (kpiNames.MoveNext())
520+
{
521+
AxKPI object = Xpp.MetadataSupport::GetKPI(kpiNames.Current);
522+
523+
aotObjects.clear();
524+
aotObjects.Name = object.Name;
525+
aotObjects.Label = SysLabel::labelId2String2(object.Label);
526+
aotObjects.Type = ARBAOTObjectType::KPI;
527+
aotObjectsInsertList.add(aotObjects);
528+
}
529+
517530
aotObjectsInsertList.insertDatabase();
518531
}
519532

Metadata/AOTBrowser/AOTBrowser/AxClass/ARBAOTObjectTree.xml

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public class ARBAOTObjectTree
2222
protected boolean extensionsInline;
2323
Map collectionMap = new Map(Types::String, Types::AnyType);
2424
Map currentMap;
25+
str selectedTreePath;
2526
2627
}
2728
]]></Declaration>
@@ -100,6 +101,18 @@ public class ARBAOTObjectTree
100101
return extensionsInline;
101102
}
102103
104+
]]></Source>
105+
</Method>
106+
<Method>
107+
<Name>parmSelectedTreePath</Name>
108+
<Source><![CDATA[
109+
public str parmSelectedTreePath(str _selectedTreePath = selectedTreePath)
110+
{
111+
selectedTreePath = _selectedTreePath;
112+
113+
return selectedTreePath;
114+
}
115+
103116
]]></Source>
104117
</Method>
105118
<Method>
@@ -251,6 +264,9 @@ public class ARBAOTObjectTree
251264
case ARBAOTObjectType::Report:
252265
aotObject = _metadataProvider.Reports.Read(_aotNodeName);
253266
break;
267+
case ARBAOTObjectType::KPI:
268+
aotObject = _metadataProvider.KPIs.Read(_aotNodeName);
269+
break;
254270
}
255271
256272
if (aotObject == null
@@ -316,12 +332,12 @@ public class ARBAOTObjectTree
316332
case ARBAOTObjectType::SecurityDuty:
317333
enumerator = ArbelaXpp.MetadataSupport::GetSecurityDutyExtensionsForSecurityDuty(_aotNodeName).GetEnumerator();
318334
break;
319-
//case ARBAOTObjectType::WorkflowApproval:
320-
// enumerator = Xpp.MetadataSupport::GetWorkflowApprovalExtensionsForWorkflowApproval(_aotNodeName).GetEnumerator();
321-
// break;
322-
//case ARBAOTObjectType::WorkflowTask:
323-
// enumerator = Xpp.MetadataSupport::GetWorkflowTaskExtensionsForWorkflowTask(_aotNodeName).GetEnumerator();
324-
// break;
335+
case ARBAOTObjectType::WorkflowApproval:
336+
enumerator = ArbelaXpp.MetadataSupport::GetWorkflowApprovalExtensionsForWorkflowApproval(_aotNodeName).GetEnumerator();
337+
break;
338+
case ARBAOTObjectType::WorkflowTask:
339+
enumerator = ArbelaXpp.MetadataSupport::GetWorkflowTaskExtensionsForWorkflowTask(_aotNodeName).GetEnumerator();
340+
break;
325341
case ARBAOTObjectType::WorkflowType:
326342
enumerator = ArbelaXpp.MetadataSupport::GetWorkflowTemplateExtensionsForWorkflowTemplate(_aotNodeName).GetEnumerator();
327343
break;
@@ -386,7 +402,38 @@ public class ARBAOTObjectTree
386402
}
387403
}
388404
389-
treeControl.select(rootIdx);
405+
TreeItemIdx selectedIdx = rootIdx;
406+
if (selectedTreePath)
407+
{
408+
List pathSegments = strSplit(selectedTreePath, '/');
409+
ListEnumerator pathSegmentsEnum = pathSegments.getEnumerator();
410+
TreeItemIdx currentIdx = rootIdx;
411+
while (pathSegmentsEnum.moveNext())
412+
{
413+
str segmentName = pathSegmentsEnum.current();
414+
TreeItemIdx childIdx = treeControl.getChild(currentIdx);
415+
boolean found = false;
416+
while (childIdx != 0)
417+
{
418+
FormTreeItem childNode = treeControl.getItem(childIdx);
419+
if (childNode.text() == segmentName)
420+
{
421+
found = true;
422+
currentIdx = childIdx;
423+
break;
424+
}
425+
childIdx = treeControl.getNextSibling(childIdx);
426+
}
427+
if (!found)
428+
{
429+
break;
430+
}
431+
}
432+
433+
selectedIdx = currentIdx;
434+
}
435+
436+
treeControl.select(selectedIdx);
390437
}
391438
392439
]]></Source>
@@ -432,7 +479,8 @@ public class ARBAOTObjectTree
432479
}
433480
else
434481
{
435-
this.addExtension(modEnum.Current, rootNodeIdx, _extensionName);
482+
TreeItemIdx extIdx = this.addExtension(modEnum.Current, rootNodeIdx, _extensionName);
483+
modMap.insert(this.getObjectName(modEnum.Current), extIdx);
436484
}
437485
}
438486
}
@@ -618,7 +666,7 @@ public class ARBAOTObjectTree
618666
/// <param name = "_extensionName">The extension name</param>
619667
/// <param name = "_positionType">The position the control should be added</param>
620668
/// <param name = "_afterItemIdx">The index where the control should be inserted after</param>
621-
protected void addExtension(anytype _extension, TreeItemIdx _parentIdx, str _extensionName, CoreMetaModel.ExtensionItemPositionType _positionType =CoreMetaModel.ExtensionItemPositionType::End, int _afterItemIdx = 0)
669+
protected TreeItemIdx addExtension(anytype _extension, TreeItemIdx _parentIdx, str _extensionName, CoreMetaModel.ExtensionItemPositionType _positionType =CoreMetaModel.ExtensionItemPositionType::End, int _afterItemIdx = 0)
622670
{
623671
FormTreeItem parentControl = treeControl.getItem(_parentIdx);
624672
if (parentControl.data() is System.Collections.IEnumerable
@@ -653,6 +701,7 @@ public class ARBAOTObjectTree
653701
FormTreeItem control = treeControl.getItem(extIdx);
654702
control.stateBold(true);
655703
treeControl.setItem(control);
704+
return extIdx;
656705
}
657706
658707
]]></Source>

0 commit comments

Comments
 (0)