Dynamics AX Blog - aot
Namen der Shared Projects nach einem String durchsuchenUm sich alle (Shared-)Projekte ausgeben zu lassen, die einen bestimmten Text im Namen tragen, kann man den folgenden Code verwenden.
static void searchProjectName(Args _args)
{
ProjectNode projectNode;
#AOTExport
projectNode = infolog.projectRootNode();
projectNode = projectNode.AOTfindChild(#expProjectShared);
projectNode = projectNode.AOTfirstChild();
while(projectNode)
{
setPrefix(projectNode.name());
if(strScan(projectNode.name(), "BR_", 0, 60))
{
info(projectNode.name());
}
projectNode = projectNode.AOTnextSibling();
}
} |
Favoriten in Entwicklungsumgebung auflistenMit Hilfe des hier gezeigten Jobs kann man die Favoriten eines Benutzers auslesen und sich ausgeben lassen.
static void listFavoritesOfCurrentUser(Args _args)
{
TreeNode treeNode;
TreeNodeIterator iterator;
TreeNode newTreeNode;
int level;
#AOT
void loopChilds(TreeNode _treeNode)
{
level++;
while(_treeNode)
{
info(strRep(" ", level-1) + any2str(SysLabel::labelId2String2(_treeNode.AOTname(), Global::currentUserLanguage())));
loopChilds(_treeNode.AOTfirstChild());
level--;
_treeNode = _treeNode.AOTnextSibling();
}
}
treeNode = infolog.userNode();
iterator = treeNode.AOTiterator();
treeNode = iterator.next();
if (treeNode)
{
treeNode = treeNode.AOTfirstChild();
if (treeNode)
{
setPrefix(treeNode.AOTname());
loopChilds(treeNode.AOTfirstChild());
}
}
} |
Geänderte Objekte innerhalb eines Layers ausgeben, die noch nicht zur Versionskontrolle hinzugefügt wurdenMithilfe der SysModel*-Tabellen kann man in Dynamics AX den AOT nach bestimmten Objekten bzw. deren Eigenschaften durchsuchen. Ein Beispiel dazu habe ich bereits hier gepostet. |
Geänderte Objekte innerhalb eines Layers ausgebenUm den AOT nach bestimmten Objekten zu durchsuchen, kann man in AX die TreeNode-Klasse verwende. Einige Beispiele dazu habe ich hier ja auch schon in der Vergangenheit gepostet. |
Alle Tabellen ermitteln, bei denen eine bestimmte Eigenschaft gesetzt istDer hier vorgestellte Job gibt über das Infolog alle Tabellen aus, bei welchen eine bestimmte Eigenschaft - im Beispiel wird die Property ModifiedBy abgefragt - static void findTablesWithSpecificProperty(Args _args) { TreeNode treeNodeTables; TreeNode treeNode; str prop; str properties; #aot #Properties; treeNodeTables = TreeNode::findNode(#TablesPath + #AOTRootPath); treeNodeTables = treeNodeTables.AOTfirstChild(); while(treeNodeTables) { properties = treeNodeTables.AOTgetProperties(); prop = Global::findProperty(properties,#PropertyModifiedBy); if(prop == "yes") { info(treeNodeTables.AOTname()); } treeNodeTables = treeNodeTables.AOTnextSibling(); } } |
Objekte per Code zu einem Projekt hinzufügenNachstehend ein kurzer Job, mit dessen Hilfe man AOT-Elemente zu einem bestehenden Shared Project hinzufügen kann. static void AddNodeToSharedProject(Args _args)
{ projectNode projectNode; TreeNode treeNode; #AOT #AOTExport projectNode = infolog.projectRootNode(); projectNode = projectNode.AOTfindChild(#expProjectShared); projectNode = projectNode.AOTfindChild('MyProject'); // Add objects treenode = TreeNode::findNode(#TablesPath+'\\'+tableid2name(tablenum(CustGroup))); projectNode.addNode(treenode); treenode = TreeNode::findNode(#TablesPath+'\\'+tableid2name(tablenum(VendGroup))); projectNode.addNode(treenode); treenode = TreeNode::findNode(#ClassesPath+'\\'+classStr(PriceDisc)); projectNode.addNode(treenode); } Das geänderte Projekt sieht beispielsweise wie folgt aus:
|
|
|
|
|
|
|


Mit Hilfe des hier gezeigten Jobs kann man per Code ein Shared Project erstellen, Objekte hinzufügen und diese dabei in Gruppen je Objekttyp einordnen lassen.
static void AddNodeToSharedProject(Args _args) { projectNode projectNode; TreeNode treeNode; ProjectName projectName = "MyProject"; #AOT #AOTExport void addTreeNodeToProjectNode(treeNode _treeNode) { TmpIdRef tmpIdRef; tmpIdRef.clear(); tmpIdRef.Name = SysTreeNode::getPath(_treeNode); tmpIdRef.Mode = SysTreeNode::path2ApplObjectType(tmpIdRef.Name); tmpIdRef.useMode = UtilFileType::Application; tmpIdRef.insert(); SysProjectFilterRunBase::addProjectNodes(tmpIdRef, projectNode); } projectNode = infolog.projectRootNode(); projectNode = projectNode.AOTfindChild(#expProjectShared); projectNode = projectNode.AOTfindChild(projectName); // Create shared project if neccessary if( !projectNode) { projectNode = SysTreeNode::createProject(projectName, ProjectSharedPrivate::ProjShared); } // Add objects (and create groups) treenode = TreeNode::findNode(#TablesPath+#AOTRootPath+tableid2name(tablenum(AccountingDistribution))); addTreeNodeToProjectNode(treenode); treenode = TreeNode::findNode(#TablesPath+#AOTRootPath+tableid2name(tablenum(VendGroup))); addTreeNodeToProjectNode(treenode); treenode = TreeNode::findNode(#ClassesPath+#AOTRootPath+classStr(PriceDisc)); addTreeNodeToProjectNode(treenode); }Auf die gleiche Art & Weise kann man natürlich auch ein Private Project erstellen, einfach die Vorkommnisse von Shared durch Private ersetzen.
Das erstellte Projekt sieht wie folgt aus: