January 07, 2013

Open any object from code editor to in AOT node(Editor script)

Open any object from code editor to in AOT node(Editor script)

I have posted a editor script method earlier that can open and browse table for code editor.using below code developer will have ease of opening any object from AX code editor to AOT node.



TO USE THIS CODE COPY AND PASTE THE METHOD IN EDITOR SCRIPT CLASS

void addIns_OpenInAOT(Editor e)
{
    #AOT
    TreeNode        treeNode;
    FreeText        selectedLine;
    str 1           curSymbol;
    int             iCopyFrom;
    int             iCopyTo;
    Set             selectedNodesSet = new Set(Types::Class);
    SetIterator     setIterator;
    Map             map;
 
    void add2Set(TreeNodePath _path)
    {
        ;
        treeNode = TreeNode::findNode(_path + #AOTRootPath + selectedLine);
        if (treeNode)
            selectedNodesSet.add(treeNode);
    }
    ;
    if (e.markMode() != MarkMode::NoMark && e.selectionStartCol() != e.selectionEndCol())
    {
        selectedLine = strLRTrim(subStr(e.currentLine(), e.selectionStartCol(), e.selectionEndCol() - e.selectionStartCol()));
    }
    else
    {
        selectedLine = e.currentLine();
        for (iCopyFrom = e.columnNo()+1; iCopyFrom >= 0; iCopyFrom--)
        {
            curSymbol = subStr(selectedLine, iCopyFrom, 1);
            if (!strAlpha(curSymbol) && curSymbol != '_')
                break;
        }
        for (iCopyTo = e.columnNo()+1; iCopyTo <= strLen(selectedLine); iCopyTo++)
        {
            curSymbol = subStr(selectedLine, iCopyTo, 1);
            if (!strAlpha(curSymbol) && curSymbol != '_')
                break;
        }
        selectedLine = (iCopyFrom < iCopyTo) ? subStr(selectedLine, iCopyFrom + 1, iCopyTo - iCopyFrom - 1) : '';
    }
 
    if (selectedLine)
    {
        add2Set(#ExtendedDataTypesPath);
        add2Set(#BaseEnumsPath);
        add2Set(#TablesPath);
        add2Set(#ClassesPath);
        add2Set(#MacrosPath);
 
        if (selectedNodesSet.elements() == 0)
        {
            add2Set(#SystemFunctionsPath);
            add2Set(#SystemTablesPath);
            add2Set(#SystemTypesPath);
            add2Set(#SystemEnumsPath);
            add2Set(#SystemClassesPath);
            add2Set(#ClassesPath + #AOTRootPath + classStr(Global));
        }
 
        if (selectedNodesSet.elements() > 0)
        {
            setIterator = new SetIterator(selectedNodesSet);
            setIterator.begin();
            if (selectedNodesSet.elements() == 1)
            {
                treeNode = setIterator.value();
            }
            else
            {
                map = new Map(Types::String, Types::String);
                while (setIterator.more())
                {
                    treeNode = setIterator.value();
                    map.insert(treeNode.treeNodePath(), treeNode.AOTparent().treeNodeName());
                    setIterator.next();
                }
                treeNode = TreeNode::findNode(pickList(map, "Location", "Select element type"));
            }
            if (treeNode && treeNode.treeNodePath() != TreeNode::rootNode().treeNodePath())
            {
                if (SysTreeNode::hasSource(treeNode))
                {
                    if (treeNode.AOTparent().treeNodePath() == #macrosPath && subStr(e.currentLine(), e.selectionStartCol() - 1, 1) != '#')
                        return;
                    treeNode.AOTedit();
                }
                else
                {
                    treeNode.AOTnewWindow();
                }
            }
        }
 


Click here the origional post....

-Harry

January 02, 2013

How to Restrict Multiple Time login of a same user

Hi Folks,

Many times intentionally or unintentionally a user may open multiple session of AX. That surly impact your performance. So here is a fix,
1.     Go to AOT
2.     Open class ‘Info’
3.     Copy Paste the Following Code in startupPost method.

void startupPost ()
{
// To restrict user login form second login
xSession session;
SysClientSessions SysClientSessions;
UserId currentUserId;
int counter;
;
currentUserId = curUserId();
if(currentUserId!="Admin")// only Admin User is allowed to login multiple time
{
while select SysClientSessions
where SysClientSessions.userId == currentUserId &&
SysClientSessions.Status == 1 // 1 : Login 0 : Logout
{
session = new xSession(SysClientSessions.SessionId, true);
if (session && session.userId())
{
counter++;
}
}
if(counter>=2)
{
Box::stop("Already Logged-in : The same user id can't log in twice.");
infolog.shutDown(true);
}
}
}

Please take backup of your application before copying code

-Harry