AX2012 Excel Add-in in combination with security

Add tables: Only with the system administrator role

Add data:
* Access to the tables that are used in the query
* Permissions to the services

Add Tables

Add Data


AX2012 Copy usage data between users

The usage data is stored in the table SysLastValue. It is saved on userid, so it is easy to copy the data from one user to another.

Before you start the copy it is best that you delete the usage data from the user to which you want to copy.

static void copyUsageDataToAnotherUser(Args _args)
    SyslastValue        syslastOld, syslastNew;

    while select UserId from syslastNew
    where syslastNew.userId == 'AXuser1'
        syslastNew.userId = 'AXuser2';

AX2012 Access denied to field X in table X – Grant access to specific organizations individually

Access denied to field IBAN (BankIBAN) in table Vendor bank accounts. (Or any other field where the property AOSAuthorization is set to yes)



The solution provided is only applicable if you set up the “grant access to specific organizations individually”. The error does not occur when you choose “grant access to all organizations”.

Another prerequisite is that you use virtual companies and table collections.



  1. When you close the form SysSecRoleAssignOM AX will save the details to which organization you gave that user/role combination access. This data will be stored in the table SecurityUserRoleCondition.
  2. The virtual companies are not included in table SecurityUserRoleCondition. You need to check when you close the screen if one of the organizations is included in a virtual company. If this is the case you can add the virtual company to.
  3. The two highlighted lines are added because they are the virtual companies.


Update incorrect Sales order status

In case you see that the sales order header or line status is wrong you can run a script that updates the line status based on the remaining qty and the header status based on the lowest status used in the sales order lines.

static void updateSOLineStatus(Args _args)
    SalesLine       salesLine;
    SalesStatus     oldSalesStatus;

    while select forUpdate salesLine
        where salesLine.SalesStatus == SalesStatus::Backorder
        oldSalesStatus = salesLine.SalesStatus;
        if (salesLine.SalesStatus != oldSalesStatus)
            info(strfmt('SO %1 updated, from %2 to %3',salesLine.SalesId, oldSalesStatus, salesLine.SalesStatus));