axaptadynamics-ax-2012dynamics-ax-2012-r2dynamic-method

Add a method dynamically in ax 2012 component


I want to add a method dynamically to a component in ax 2012, how can I do this through code? Is it possible?


Solution

  • Here is a job I wrote that demonstrates a bunch of different ways of doing what you're wanting:

    static void Job79(Args _args)
    {
        TreeNode        treeNode = TreeNode::findNode(@'\Classes\Activities');
        SysDictClass    sysDictClass = new SysDictClass(treeNode.applObjectId());
        FormRun         formRun = new FormRun(new Args(formStr(AifAction)));
        Form            form = new Form(formStr(AifAction));
        ClassBuild      classBuild;
        SysDictTable    sysDictTable = new SysDictTable(tableNum(AccountSumMap)); // Maps are treated like tables
        SysDictMethod   sysDictMethod;
        int             i;
        MemberFunction  method;
        str             methodSource = 'public static str getTime()\n{\n\treturn "3/3/2015";\n}';
    
    
        // Find if class has a method
        if (sysDictClass.hasObjectMethod('delete'))
        {
            info("Found object method delete");
        }
    
        if (sysDictClass.hasStaticMethod('main'))
        {
            info("Found static method main");
        }
    
        // Find if form has a method
        if (formHasMethod(formRun, 'init'))
        {
            info("Found form method 'init'");
        }
    
    
        if (form.AOTfindChild('methods').AOTfindChild('refreshGrid') != null)
        {
            info("Found 'refreshGrid' method on AifAction");
        }
    
    
        if (sysDictClass.hasStaticMethod('getTime') == false)
        {
            classBuild = new ClassBuild(sysDictClass.name());
    
            treeNode = classBuild.addMethod('getTime', methodSource);
    
            if (classBuild.classNode().AOTcompile())
            {
                classBuild.classNode().AOTsave();
                info("Added method getTime, compiled, and saved");
            }
            else
            {
                info(strFmt("Unable to compile method 'getTime' with source code '%1', restoring class...", treeNode.AOTgetSource()));
                // Delete the non-compiling method
                if (treeNode)
                    treeNode.AOTdelete();
    
                classBuild.classNode().AOTsave();
            }
    
        }
        else
        {
            info("Method 'getTime' already exists");
        }
    
        if (sysDictTable.isMap())
        {
            if (sysDictTable.doesMethodExist('getTime') == false)
            {
                treeNode = sysDictTable.treeNode().AOTfindChild('methods').AOTadd('getTime');
                method = sysDictTable.treeNode().AOTfindChild('methods').AOTfindChild('getTime');
                method.AOTsave();
                method.AOTsetSource(methodSource, true);
                method.AOTsave();
    
    
                if (sysDictTable.treeNode().AOTcompile())
                {
                    sysDictTable.treeNode().AOTsave();
                    info(strFmt("Added 'getTime' to AccountSumMap"));
                }
                else
                {
                    info(strFmt("Unable to compile method 'getTime' with source code '%1', restoring class...", treeNode.AOTgetSource()));
    
                    // Delete the non-compiling method
                    if (treeNode)
                        treeNode.AOTdelete();
    
                    sysDictTable.treeNode().AOTsave();
                }
            }
        }
    }