Pages

Thursday, May 12, 2016

A dynamic strFmt call

In the communities a users asked about a way to make a dynamic strFmt call, not knowing the number of parameters up front.

With some good critical tests from Levgen Miroshnikov (blog) I think I have managed to write a class method that does that.

Regular StrFmt will round decimal value and change the decimal point to whatever fits your windows locale. This method has a parameter allowing you to keep the formatting of decimal values.

Here is the code for it:
public str dynamicStrFmt(
    str         _expression,
    container   _args = conNull(),
    boolean     _keepRealsDecimals = false)
{
    str         ret;
    Counter     counter;
    str         argStr;
    char        argChar;

    if (_args == conNull())
    {
        return strFmt(_expression);
    }

    for (counter = 1; counter <= strLen(_expression); counter++)
    {
        if (subStr(_expression, counter, 1) != '%')
        {
            ret += subStr(_expression, counter, 1);
        }
        else
        {
            // This is a point in the string where an argument starts
            // Find the end of the argument
            argStr  = '';
            argChar = subStr(_expression, counter + 1, 1);
            while (argChar && argChar == strKeep(argChar, '0123456789'))
            {
                argStr += argChar;
                argChar = subStr(_expression, counter + strLen(argStr) + 1, 1);
            }

            // Lookup and insert the value to the result
            if (argStr)
            {
                // Check that the argument is within the bounds of the number of supplied argument values
                if (str2Int(argStr) <= conLen(_args)) 
                {
                    if (typeOf(conPeek(_args, str2Int(argStr))) == Types::Real && _keepRealsDecimals)
                    {
                        ret += num2str(conPeek(_args, str2Int(argStr)), -1, numOfDec(conPeek(_args, str2Int(argStr))), 1, 0);
                    }
                    else
                    {
                        ret += strFmt('%1', conPeek(_args, str2Int(argStr)));
                    }
                }
                else
                {
                    // The argument is not within the bounds of the supplied argument values. Keep the argument unchanged.
                    ret += subStr(_expression, counter, 1) + argStr;
                }
                // Move the current position in the _expression string to a position after the argument
                counter += strLen(argStr);
            }
            else
            {
                // Didn't find the argument to be meningfull, so just add the argument character as-is
                ret += subStr(_expression, counter, 1);
            }
        }
    }

    return ret;
}

And a main method for a quick demo:
public static void main(Args _args)
{
    aaaStrFmtBuilder    demo = new aaaStrFmtBuilder();

    info (demo.dynamicStrFmt("%1 + %1 = %2", [2, 4]));
    info(demo.dynamicStrFmt("%1/(%2*%1)", [1000, 0.135], true));
    info(demo.dynamicStrFmt("%2 %3 %1", ['AX', 'Microsoft', 'Dynamics']));
}

And here you can download a project with the class and unit tests for it:
 

The two classes are prefixed with 'aaa', making it easier for you to find them in the AOT :-)
Please change the names if you are going to use the code for something real.

Monday, May 9, 2016

Use Visual Studio to merge code for an AX 2012 CU

Here is a great explanation about how you use Visual Studios merge tool to merge files: https://roadtoalm.com/2013/10/22/use-visual-studio-as-your-diff-and-merging-tool-for-local-files/

You can find of plenty other tools for compare and merge on the Internet, but you probably already have a Visual Studio license. Here is an overview of other tools: https://en.wikipedia.org/wiki/Comparison_of_file_comparison_tools


Thursday, March 31, 2016

Check out multiple languages of a label file in one process in AX 2012

If you work under version control and you update labels in more than one language, you might have found it cumbersome that you for each language need to switch language in the label dialog and then check each language out individually.

I have made a job that does this in one process. The job uses saved selections from the label dialog to figure out the label file to check out, and in which languages.

Use at your own risk.

Sunday, February 28, 2016

What's new in the Dynamics AX user experience - Feb 2016

This is an excellent Office Mix on the latest news about the UI in the new Microsoft Dynamics AX:

Tuesday, February 9, 2016

Dynamics Technical Conference 2016 - Deep Dive Workshops

Microsoft still has some open seats for the Deep Dive Workshops that will be run after the conference.

All of the Deep Dive sessions will showcase the new Microsoft Dynamics AX ('AX 7').

Here are the details for the deep dive sessions – all will be held at the Microsoft Conference Center (Building 33) on the Microsoft campus in Redmond, Washington:

Microsoft Dynamics Retail Conference 2016 – 2 days of L300 learning from the R&D Retail Team on the new Microsoft Dynamics AX (‘AX 7’):

  • The deep dive includes presentations across the entire Retail solution (Modern POS/Cloud POS, Retail Server, Hardware station, eCommerce, Catalog & Call Center sales, Merchandising, BI/Reporting), as well as presentations highlighting solution architecture, they complete retail application lifecycle with Lifecycle Services (LCS), customization and extensibility, performance and scalability, troubleshooting, and best practices.
  • Hands-on lab experiences will include omni-channel scenarios, retail application configuration, setup, and deployment, as well as extensibility, monitoring, troubleshooting, and reporting.
  • Please note that content presented at the Dynamics Technical Conference is considered a prerequisite and will not be repeated during the Retail Conference. Attendance at the Dynamics Technical Conference is a mandatory prerequisite for the Retail Conference.
  • You can register here for the Retail Conference 2016: http://msdynamicsttt.msnlevents.net/Content/Trainings.aspx?rsvp=25424


Advanced Presales Workshop for Microsoft Dynamics AX (‘AX 7’) – 3 days of going deep on presales

  • This workshop provides presales consultants with solid grounding for demonstrating Microsoft Dynamics AX as a solution that is superior to competitive products. Participants learn through typical business scenarios, starting with foundational knowledge and persona scenarios along with exercises and case discussions by using real-world examples. The workshop covers the range of capabilities in Microsoft Dynamics AX – the learnings provide a basis for future work in vertical industries.
  • The workshop is designed for consultants who have led or had a strong supporting role in previous AX projects.
  • You can register here for the Advanced Presales Workshop: http://msdynamicsttt.msnlevents.net/Content/Trainings.aspx?rsvp=25398


Budget Planning Workshop for Microsoft Dynamics AX (‘AX 7’) – 3 days of intensive learning on budget planning

  • This workshop helps senior consultants to plan configure,  and implement advanced budgeting scenarios. The workshop engages with organizational hierarchies, security models, workflows, and integration to Excel for working with budget plans. The workshop is based on typical business scenarios and covers planning and setup, templates, and simulation as well as budget functions and tools with real-world examples.
  • The training is intended for architects and senior consultants with proven experience on AX implementation and solid knowledge of AX financials, as well as pre-sales consultants focused on financials.
  • You can register here for the Budget Planning Workshop: http://msdynamicsttt.msnlevents.net/Content/Trainings.aspx?rsvp=25427

Friday, January 29, 2016

pickTable method being painfully slow in AX 2012?

The call to pickTable in a user session can be extremely slow. I have measured times of up to 20 (!) minutes on an otherwise well functioning system.

A trace shows very clearly that the method is very chatty, so wrap the call into a server bound method. And ta-da, what took minutes now takes a second or two.

Wednesday, January 27, 2016

Explore the different form arrangements in AX 7

There is a tutorial form in AX 7 that shows you the different types of form arrangements.

The link to the form is: https://(your AX instance).cloudax.dynamics.com/?f=tutorial_Form_Arrange&cmp=DAT