Wednesday, October 9, 2013

How to find what projects an object from the AOT exists in

Where I work, we are required to create a new, numbered project for every modification request.  The numbered projects have corresponding documentation for the intended purpose.

So when I later want to find out what projects an AOT object exists in, I needed a way to search inside every project.  I wrote this proof of concept job on how to find in what projects a specific object exists.  Enjoy!

static void FindWhatProjectsObjectExistsIn(Args _args)
    ProjectNode         pn;
    ProjectListNode     projectListNode;

    TreeNode            tn, tn2;
    TreeNodeIterator    tni, tni2;

    // Object we are searching for
    TreeNode            tnSearch = TreeNode::findNode(@'\Forms\SalesTable');

    projectListNode = SysTreeNode::getSharedProject();
    tni = projectListNode.AOTiterator();

    tn =;

    while (tn)
        pn = tn; // ProjectNode inherits TreeNode
        pn = pn.loadForInspection();

        tni2 = pn.AOTiterator();

        tn2 =;

        while (tn2)
            if (tn2.treeNodePath() == tnSearch.treeNodePath())
                info(strfmt("Found in shared project %1", tn.AOTname()));

            // info(tn2.applObjectType()); // Returns the type (Form/Class/Table/Etc)
            // info(tn2.AOTname()); // Returns the object name
            // info(tn2.treeNodePath()); // Returns the object path
            tn2 =;

        tn =;



  2. How Can I get AOT Object name based on Label ID used?

  3. Frustrating that there's no recursive iterator for nodes: the second iterator will only check objects at the root of shared projects, so if people organise their projects into groups, they'll be missed. Still, it's a starting point, so thanks for sharing.

    1. You're right. I wrote this ~4 years ago, but I should update it to use recursion and be more efficient. It's useful when I'm dropped into a new environment and I'm trying to figure out what 1 custom class does...I can track down the project it's in to find the related objects (if the developer had a heart to put it in a project!)