web
You’re offline. This is a read only version of the page.
close
Skip to main content
Community site session details

Community site session details

Session Id :

Find tables without cacheLookup property set

Vilmos Kintera Profile Picture Vilmos Kintera 46,149

During the cleanup exercise of our code upgrade to Dynamics 365 Finance and Operations we have noticed that many of our custom tables did not have the cacheLookup configured. It can have a negative performance impact on your system, so it is best practice to have this properly configured. You can find below a job to find tables without cacheLookup property set.

You can find more details about caching in the documentation:

https://docs.microsoft.com/en-us/dynamicsax-2012/developer/single-record-caching

It is going to create a new project, with all the tables which were created on the CUS layer, that you need to verify.

static void WIK_findTablesWithoutCache(Args _args)
{
    #AOT
    #AOTExport
    #AviFiles
 
    ProjectName             projectName = "TableCache";
    TreeNodeIterator        tni     = TreeNode::findNode(#TablesPath).AOTiterator();
    TreeNode                node;
    ProjectNode             projectNode;
    SysDictTable            dictTable;
    Common                  common;
    int                     cnt;
    int64                   recordCount;
    int64                   counter;
    SysOperationProgress    pr = SysOperationProgress::newGeneral(#AviUpdate, 'Processing treenode', 0);
 
    void addTreeNodeToProject(TreeNode _node)
    {
        TmpIdRef        tmpIdRef;
 
        tmpIdRef.clear();
        tmpIdRef.Name = SysTreeNode::getPath(_node);
        tmpIdRef.Mode = SysTreeNode::path2ApplObjectType(tmpIdRef.Name);
        tmpIdRef.useMode = UtilFileType::Application;
        tmpIdRef.insert();
 
        SysProjectFilterRunBase::addProjectNodes(tmpIdRef, projectNode);
    }
 
    projectNode    = infolog.projectRootNode();
    projectNode    = projectNode.AOTfindChild(#expProjectprivate);
    projectNode    = projectNode.AOTfindChild(projectName);
 
    if( !projectNode)
    {
        projectNode = SysTreeNode::createProject(projectName, ProjectSharedPrivate::Projprivate);
    }
 
    //projectNode.loadForInspection();
 
    tni = TreeNode::findNode(#TablesPath).AOTiterator();
    node = tni.next();
 
    while (node)
    {
        pr.incCount();
        pr.setText(node.AOTname());
 
        dictTable = SysDictTable::newTreeNode(node);
 
        if (!dictTable.isView() && !dictTable.isMap() && !dictTable.isTmp() && !dictTable.isTempDb() && !dictTable.isSystemTable()
            && dictTable.cacheLookup() == RecordCacheLevel::None
            && SysTreeNode::existsInLayer(dictTable.treeNode(), UtilEntryLevel::cus)
            && !SysTreeNode::existsInLayer(dictTable.treeNode(), UtilEntryLevel::sys)
            && !SysTreeNode::existsInLayer(dictTable.treeNode(), UtilEntryLevel::syp)
            )
        {
            counter++;
            //recordCount = dictTable.recordCount(true);
            //info(strFmt('%1 - %2 - %3', counter, dictTable.name(), recordCount));
            common = dictTable.makeRecord();
            select firstOnly RecId from common;
            if (common.RecId)
            {
                addTreeNodeToProject(node);
            }
        }
 
        node = tni.next();
    }
 
    //projectNode.treeNodeRelease();
    //projectNode.AOTrefresh();
}

The post Find tables without cacheLookup property set appeared first on DAXRunBase.

Comments

*This post is locked for comments