Dynamics AX Blog - Beiträge vom Juni 2011

Momentan angezeigt werden nur Beiträge vom »Juni 2011«. Filter entfernen

Projekte nach einem bestimmten Objekt durchsuchen

Nachstehender Job durchsucht alle Projekte nach einem bestimmten Element des AOT.

Dafür wird ein Dialog verwendet, wo man lediglich den Namen und den Typ des zu suchenden Elementes angeben muss. Außerdem kann man noch einstellen, ob auch die privaten Projektknoten durchsucht werden sollen.

static void findObjectWithinProjects(Args _args)
{
    UtilElementType utilElementType        = UtilElementType::Table;
    Name            objectName             = 'custTable';
    boolean         includePrivateProjects = false;
    Dialog          dialog;
    DialogField     df_objectName;
    DialogField     df_utilElementType;
    DialogField     df_privateProjects;
    container       conProjects;
    int             c;
    TreeNode                treeNodeRoot;
    SysOperationProgress    sysOperationProgress;
    UtilElementType         utilElementTypeSelection;    

    #Aot
    #TreeNodeSysNodeType
    #AviFiles
    #define.objectNameField("Name of object")
    #define.utilElementTypeField("Type of object")

    void findChildNodes(TreeNode _treeNodeParent, ProjectNode _projectNode, str _objectName)
    {
        TreeNode            treeNode;
        TreeNodeIterator    treeNodeIterator;

        ; 
        treeNodeIterator = _treeNodeParent.AOTiterator();
        treeNode = treeNodeIterator.next();
        while (treeNode)
        {
            if (treeNode.AOTgetNodeType() == #NT_PROJECT_GROUP)
            {
                findChildNodes(treeNode, _projectNode, _objectName);
            }
            else if (treeNode.AOTname() like _objectName)
            {
                utilElementTypeSelection = str2enum(utilElementTypeSelection, enum2str(utilElementType)); 
                if (!utilElementType || treeNode.applObjectType() == utilElementTypeSelection)
                {
                    if (!confind(conProjects, _projectNode.AOTname()))
                    {
                        conProjects = conins(conProjects, conlen(conProjects)+1, _projectNode.AOTname());
                    } 
                    return;
                }
            } 
            treeNode.treeNodeRelease();
            treeNode = treeNodeIterator.next();
        }
    }
    void loopProjectsNode(TreeNode _treeNode)
    {
        ProjectNode projectNode;
        TreeNode treeNodeProject; 

        if (_treeNode)
        {
            treeNodeProject = _treeNode.AOTfirstChild();
            while (treeNodeProject)
            {
                projectNode = treeNodeProject; 
                sysOperationProgress.setText(projectNode.name()); 
                findChildNodes(projectNode.loadForInspection(), treeNodeProject, objectName); 
                treeNodeProject = treeNodeProject.AOTnextSibling();
            }
        }
    }
    ; 
    dialog = new Dialog();
    dialog.caption("Find projects containing specific object");
    df_objectName      = dialog.addField(Types::String, #objectNameField);
    df_utilElementType = dialog.addField(typeid(UtilElementType), #utilElementTypeField);
    df_privateProjects = dialog.addField(typeid(NoYesId), "Include Private projects"); 
    df_objectName.value(objectName);
    df_utilElementType.value(utilElementType);
    df_privateProjects.value(includePrivateProjects); 
    if( !dialog.run())
    {
        return;
    } 
    objectName             = df_objectName.value();
    utilElementType        = df_utilElementType.value();
    includePrivateProjects = df_privateProjects.value(); 
    if (objectName == '*' || objectName == '')
    {
        throw error(strfmt("@SYS26332", #objectNameField));
    } 
    setprefix(strfmt("Projects containing %1 '%2'", utilElementType, objectName)); 

    startLengthyOperation(); 

    sysOperationProgress = new SysOperationProgress();
    sysOperationProgress.setCaption("Searching");
    sysOperationProgress.setAnimation(#AviSearch); 

    // Private projects
    if(includePrivateProjects)
    {
        loopProjectsNode(SysTreeNode::getPrivateProject());
    }
    // Shared projects
    loopProjectsNode(SysTreeNode::getSharedProject()); 
    sysOperationProgress.kill();
    endLengthyOperation(); 

    // List projects
    for(c=1;c<=conlen(conProjects);c++)
    {
        info(conpeek(conProjects, c));
    }
}

Wer eine etwas komfortablere Möglichkeit vorzieht, der kann sich bei Firma Loncar Technologies Inc. ein entsprechendes XPO herunterladen und ins AX einspielen. Auf Basis dieses XPOs ist auch obiger Job entstanden.

https://www.loncartechnologies.com/download.php


 
 
 

Berechtigung eines Benutzers für einen Sicherheitsschlüssel abfragen

Mit diesem Stückchen Code kann man in Dynamics AX prüfen, welche Berechtigung ein Benutzer für einen bestimmten Sicherheitsschlüssel (Securitykey) hat.

static void GetSecurityKeyAccess4User(Args _args)
{
    Dictionary          Dictionary = new Dictionary();
    securityKeyId       securityKeyId;
    SecurityKeySet      securityKeySet = new SecurityKeySet();
    UserId              userId = 'user1';
    SelectableDataArea  dataArea = 'ceu';
    AccessType          accessType;
    ;

    securityKeyId = Dictionary.securityKeyName2Id("BatchReport");

    securityKeySet.loadUserRights(userId, dataArea);

    AccessType = securityKeySet.access(securityKeyId);

    info(enum2str(AccessType));
}

 
 
 

AX 2012: Having-Clause über addHavingFilter

Ein neues Feature von Dynamics AX 2012 ist, daß man nun bei einem Query auch eine HAVING-Clause hinzufügen kann.

Diese Bedingung dient dazu, berechnete Werte einer GROUP BY-Clause in der WHERE-Clause berücksichtigen zu können. Dieses Feature habe ich in der Vergangenheit vor allem dazu gerne verwendet, wenn es darum ging über eine SQL-Abfrage doppelte (bzw. vielfache) Datensätze in einer Tabelle zu finden. In den bisherigen Versionen von Dynamics AX war dieses Unterfangen über X++ nur etwas umständlich abzubilden.


 
 
 

AX 2012: AddQueryFilter

In Dynamics AX 2012 verfügt das Query-Objekt nun über eine neue Methode addQueryFilter, mit dessen Hilfe man die Datenbank anweisen kann, Filterkriterien zur WHERE-Clause statt wie in bisherigen Versionen zur ON-Clause einer OUTER-JOIN-Verknüpfung hinzuzufügen. Dies wiederum bewirkt, daß keine "leeren" Datensätze verarbeitet werden.


 
 
 

 

 
 
 
Beiträge des aktuellen Monats
Juni 2011
MoDiMiDoFrSaSo
 12345
6789101112
13141516171819
20212223242526
27282930 
 
© 2006-2025 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