Dynamics AX Blog - aot - Microsoft Dynamics AX (Axapta)

Momentan angezeigt werden nur Einträge der Kategorie »Microsoft Dynamics AX (Axapta)« Filter entfernen

In den letzten Jahren, in denen ich mich fast hauptsächlich mit der Entwicklung im Umfeld von Microsoft Dynamics AX (vormals Axapta) beschäftigt habe, ist das eine oder andere Code-Fragment entstanden, von dem ich mir vorstellen könnte, daß es auch für andere AX-Entwickler ganz nützlich sein könnte. Aber auch Tips und Tricks zu dem mächtigen ERP-System werde ich in dieser Kategorie präsentieren.

RSS-Feed dieser Kategorie
Momentan angezeigt werden nur Einträge, bei denen das Schlagwort »aot« eingetragen wurde. Filter entfernen

Shared Project per Code erstellen, Objekte hinzufügen und dabei Gruppen je Objekttyp erzeugen

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:

Sceenshot


 

Namen der Shared Projects nach einem String durchsuchen

Um 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 auflisten

Mit 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 wurden

Mithilfe 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.

Der folgende job ist eine Erweiterung der oben genannten Beitrags und listet alle Ojekte auf, die im aktuellen Layer verändert wurden und noch nicht zur Versionskontrolle hinzugefügt wurden.


 

Geänderte Objekte innerhalb eines Layers ausgeben

Um 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.

In Dynamics AX 2012 ist eine neue Möglichkeit hinzugekommen, und zwar gibt es in der Datenbank nun einige Tabelle die mit SysModel* beginnen. Diese Tabellen kann man ebenfalls dazu verwenden, den AOT nach Objekten/Eigenschaften zu durchsuchen.

Ein Beispiel für eine solche Abfrage ist der folgende Job, der einfach alle Objekte (unsortiert) ausgibt, die im aktuellen Layer angepasst wurden. Beim Aufruf des jobs kann zuvor der Query geändert werden, um die Abfrage weiter einzuschränken.


 

Alle Tabellen ermitteln, bei denen eine bestimmte Eigenschaft gesetzt ist

Der hier vorgestellte Job gibt über das Infolog alle Tabellen aus, bei welchen eine bestimmte Eigenschaft - im Beispiel wird die Property ModifiedBy abgefragt -
einen bestimmten Wert aufweist.

Im Makro #Properties findet man alle weiteren möglichen Properties von AOT-Objekten, wodurch man den Job auch für Abfragen anderer Eigenschaften einsetzen kann.

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ügen

Nachstehend 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:

Screenshot


 

 

 
 
 
Beiträge des aktuellen Monats
März 2019
MoDiMiDoFrSaSo
 123
45678910
11121314151617
18192021222324
25262728293031
 
© 2006-2019 Heinz Schweda | Impressum | Kontakt | English version | Mobile Version
Diese Webseite verwendet Cookies, um Benutzern einen besseren Service anzubieten. Wenn Sie weiterhin auf der Seite bleiben, stimmen Sie der Verwendung von Cookies zu.  Mehr dazu