Monthly Archives: May 2017

DAXRunBase on GitHub

The amount of posts and code published are starting to become harder to manage, thus a new Git repository has been created for hosting the source files. You may now find the codes available for DAXRunBase on GitHub using the following link:

DAXRunBase on GitHub

DAXRunBase GitHub

The files will be provided in form of XPO source files curated for Microsoft Dynamics AX 2012. They should be working for most versions with minor modifications only. The subfolders will link back to the original articles for detailed descriptions and use case scenarios.

Old posts are revised

Some of the outdated tools, jobs, or other modifications are going to get revised, updated/upgraded and will be published being compatible with the latest AX 2012 R3 version. Once the Git repository is ready, I will update the old posts to link directly to the respective folders there.

The previously published articles could be found using the X++ and XPO tags:

https://www.daxrunbase.com/tag/x/

By |2017-05-22T10:52:57+02:00May 22nd, 2017|Categories: AX 2012|0 Comments

Improved TFS Version Control tools

All companies should be using some form of Version Control nowadays, as Microsoft is also pushing us in that direction with Dynamics 365 for Operations already. The frameworks in AX are mostly open, ready for improvement – and there is a lot of room for that. You can find below some of my improved TFS Version Control tools below. If you have additional tools or ideas, feel free to share it.

  1. XPO Import dialog

    A new Check out button has been added, so when trying to import an object from XPO that is already under VCS, you do not have to navigate to the AOT, but can directly access it from here.
  2. Version Control Pending objects

    The Version Control Changes > Contents list already had an Open new window button for the currently selected objects, but it was missing from the Pending objects list – which is more frequently used -, until now.
  3. Version Control Check-in dialog

    IDs are now sorted in a descending order to have the most recent tasks on the top.
    I am now hiding the TFS entries in a Closed state by default and can be shown by a checkbox.
    Developers are typically working on Tasks, which was opened from a User Story using the Agile methodology setup in VCS, and check-ins are done against Tasks, so now I am hiding User Stories by default.

Please find attached the Improved TFS Version Control tools.

By |2017-05-20T10:08:38+02:00May 20th, 2017|Categories: AX 2012, TFS|Tags: , , , , , , |0 Comments

Investigating Workflow security issues

Many of us might have encountered the below error messages when trying to run a newly created workflow. I would like to provide this neat troubleshooting tip with the below code snippet for investigating workflow security issues.

Stopped (error): X++ Exception: Work item could not be created. 
Insufficient rights for user %1.

In most of the cases it is due to the lack of security access for the execution account on a menu item, for which we could add a couple of lines of code to resolve the problem.

Change \AOT\Classes\SysWorfklowDocument\assertAsUser method and for each fork of menu item type you may add the entry point in a security privilege or role, for which you need to provide access for on the user account you have been using. That means for each section of workflowPermission you need to add the appropriate menu item in the error log.

    if (workflowPermission.parmDisplayMenuItem())
    {
        permission = SysWorkflowDocument::assertMenuItem(workflowPermission.parmDisplayMenuItem(), MenuItemType::Display);
        if (!permission)
        {
            error(strFmt('Entry point %1', workflowPermission.parmDisplayMenuItem()));
            return [permission, buf2Con(rec)]; // buf2Con() needed to support packing buffers participating in SC/sc hierarchies
        }
    }

Also you need to add the following pieces to \AOT\Classes\SysWorkflowEventDispatcher\onWorkItemCreate() method:

    if (workflowPermission.parmDisplayMenuItem())
    {
        permission = SysWorkflowDocument::assertMenuItem(workflowPermission.parmDisplayMenuItem(), MenuItemType::Display);
        if (!permission)
        {
            error(strFmt('Entry point %1', workflowPermission.parmDisplayMenuItem()));
            return [permission, buf2Con(rec)]; // buf2Con() needed to support packing buffers participating in SC/sc hierarchies
        }
    }

(...)
 
    if (!SysWorkflowHelper::userHasPermission(
        _workItemContext.parmWorkflowCorrelation().parmWorkflowContext(),
        stepTable.workflowElementTable().workflowVersionTable().workflowTable().TemplateName,
        sysDictWorkflowElement.actionMenuItem(completingOutcome),
        menuItemName,
        user))
    {
        error(strFmt('Entry point %1 / Menu item action %2', menuItemName, sysDictWorkflowElement.actionMenuItem(completingOutcome)));
        throw error(strfmt("@SYS109561", user));
    }

Using the above changes you will be able to set up the missing security pieces easily by taking a look at the workflow execution history, where the infolog in the tracking history will contain the entry points causing the issues.

External references for the same issue:

https://workflowax.wordpress.com/2012/05/02/x-exception-workitem-could-not-be-created/

http://axfaq.blogspot.hu/2014/08/workflow-ax-2012-insufficient-rights.html

By |2017-05-18T12:18:42+02:00May 18th, 2017|Categories: AX 2012|Tags: , , |0 Comments
Go to Top