Thursday, January 19, 2017

How to restore a hidden Fact box in the form without File and View menu options

There is no easy way out if you hid fact boxes in a modal form, like a wizard, for example, which has neither File nor View menu option.


Personalise/Reset won't help with it.




This is a trick to make hidden fact boxes visible again.
Take the form name in question.


Then go to your user's usage data and delete the records selected by the name in second "element name" column.


Now, welcome back your fact boxes!

Wednesday, January 11, 2017

Heavy form performance issue

One of my client complained about very slow opening of one form, which they use as a core functionality for supporting customer service calls. This form is really heavy equipped with many form controls, like grids, and dozen of linked data sources.

The behaviour was really strange: for some users it worked more or less fast, say, 3-6 secondes, for certains, on the contrary, it could take up to 25-30 secondes.

All of them were assigned to System admin role. No special security, like, RLS or whatsoever was implemented.

Trace Parser and Code Profiler showed that the sequence of the execution flow was the same; however, almost all of the methods executed as twice as longer for the"slow" user than for the "rapid" one.

The strangest thing was in the fact that Trace Parser showed inclusive execution time which was not the sum of all its including methods: evidently something happened behind the scene.

Another funny thing, after clearing the "slow" user's cache files, the first run was slow, which is normal, the second run was incredibly fast, as much fast as for the "rapid" users, but starting the third run it fell down to slowliness.

The key was actually in the small option as it explained on the article Configure client performance options:

Preload complex forms

By default, forms that include more than 80 controls are preloaded and added to a preload cache. When the user opens a form, the system checks the preload cache for a preloaded version of the form. If a preloaded version is found, the system completes the initialization process and loads the form. Not all forms are preloaded. If resource limitations are met, the system starts to remove forms from the cache, starting with the forms that were least recently used. Forms such as lookups, parts, preview panes, and system forms are excluded from this mechanism.
You can turn off preloading by using the following methods:
  • To turn off preloading for the whole system, in the Client performance options form, clear the Form pre-loading enabled (requires a client restart) option.
  • To turn off preloading for a form, follow one of these steps:
    • Set form argument allowUseOfPreloadedForm for the X++ method to true.
    • Set the Form.AllowPreLoading metadata property to No.

So, once I changed the latter for this heavy form that some users personalized, it started to open very fast for all of them.

I want to thank:

All my colleagues at work;
Brandon Wiese;
Brandon Ahmad;
Freeangel and all other members from this thread (in Russian).



Monday, December 5, 2016

Mass update Tracking dimension group

Just a job that makes the subject in three big steps.



Let's say we have a bunch of items for which we set up a wrong Tracking dimension group, 'Multi', for example.

First, it empties the current value in Product Tracking dimension for those with 'Multi' in their items, making possible to change the value in Item Tracking dimension.


Then it set up the new value, for example, 'MultiS' for items and, as the third step, for related Products.

If you press No in the dialog, it just shows the current values without updating anything. So you can estimate the scale of eventual changes.


Please make appropriate customization and use it at your own risk. It calls update().

By the way, if you need to change values en masse without calling update(), please use Universal Field Changer, which could be imported as one class that makes everything possible in any table.

Thursday, December 1, 2016

Access denied to method processReport in class whateverReportDP

If after all sorts of checking your security settings you still have the subject error, please just re-import the problematic SSRS report.

As explained by Nicolas GRANJON, under the hood, I quote, re-importing the report (re)generate data in the ModelSecurityPermission table of the model database, especially the permissions links between the report and the tables that it uses, and the data provider class.

Tuesday, November 29, 2016

How to see beginning balance journals from your projects

There is a bug in AX 2012 R2/R3.

Beginning balance journals do not create transactions in ProjJournalTrans table; therefore, they won't be selected via the standard query.



This is a small fix to show beginning balance journals from the projects forms.

In ProjJournalFormTable class we need to redo datasourceLinkActivePre() method as follows:

public void datasourceLinkActivePre()
{
    QueryBuildDataSource    qbds;
    ProjTable               callerRecord;

    if (formRun                 &&
        formRun.args()          &&
        formRun.args().record() &&
        formRun.args().dataset() == tableNum(ProjTable))
    {
        callerRecord = formRun.args().record() as ProjTable;

        // if this is a beginning balance table we have no transactions in ProjJournalTrans
        // therefore, we need to update the query so that all related journals will be shown.
        if(journalTypeId == 2) // beginning balance
        {
            SysQuery::findOrCreateRange(journalTable_ds.query().dataSourceTable(tableNum(ProjJournalTable)), fieldNum(ProjJournalTable, JournalType)).value(SysQuery::value(ProjJournalType::BegBalance));
            SysQuery::findOrCreateRange(journalTable_ds.query().dataSourceTable(tableNum(ProjJournalTable)), fieldNum(ProjJournalTable, ProjId)).value(SysQuery::value(callerRecord.ProjId));
        }
        else
        {
        // End
            qbds = journalTable_ds.query().dataSourceNo(1).addDataSource(tableNum(ProjJournalTrans));

            qbds.joinMode(JoinMode::ExistsJoin);

            qbds.addRange(fieldNum(ProjJournalTrans, ProjId)).value(callerRecord.ProjId);
            qbds.relations(true);
        }
    }

    super();
}

Saturday, November 26, 2016

Back slashing menu items

It turned out to be a wrong decision to use a back slash character in menu item label. When it is used then in a menu, nothing tells you that something is wrong.



However, no chance to run this menu item from the menu.
So, avoid this and, maybe, other illegal characters for labeling your menu items.

Wednesday, November 16, 2016

Automate Error 351

From time to time we get the lovely CIL compilation Error:351. As suggested by many, for example, by André Arnaud de Calavon, we have to recreate XppIL folder with all its guts.

The sequence is the following (quotation)

1. Stop the AOS.
2. Rename the XppIL folder (C:\Program Files\Microsoft Dynamics AX\60\Server\MicrosoftDynamicsAX\bin\XppIL) to e.g. XppIL_old.
3. Start the AOS.
4. Perform a full CIL generation.
A new XppIL folder will be created when you start the AOS.
When the CIL has completed without problems, you can delete the renamed XppIL_old folder.

Clean and simple. However, I am too impatient to wait for the end of deleting this huge folder: Windows Explorer starts time estimation and it drags on.

So, I wrote two short batch files that can be run as administrator and spare your time and nerves.

First just to rename the existing folder.


@echo off
set folder="C:\Program Files\Microsoft Dynamics AX\60\Server\CHR_AX_DEV\bin\"
echo Rename %folder%  XppIL to XppIL_old?
pause
c:
cd %folder% 
ren XppIL XppIL_old
echo %folder%XppIL to  has been renamed to XppIL_old
pause

Second to delete all the files in the 'backed up' folder and its subfolders with no questions and infolog, then to delete the folder itself. As it said here, they must work faster than just removing the folder.

@echo off
set folder="C:\Program Files\Microsoft Dynamics AX\60\Server\CHR_AX_DEV\bin\XppIL_old\"
echo Delete all the files from %folder% and remove the folder?
pause
del /f/s/q %folder% > nul
rmdir /s/q %folder%
echo Folder %folder% removed
pause

The last remarque. Be sure that your service windows account running the AOS in question had Full permission to the C:\Program Files\Microsoft Dynamics AX folder and all its subfolders.

command line