mfp's two cents

...on Dynamics AX Development!

  • mfp's two cents

    Technical Conference - Wrapping up


    The Microsoft Dynamics AX Technical Conference 2012 is coming to an end. Over 1100 attendees, 75 break-out sessions and tons of networking have happened in Bellevue.

    RobertBadawyThe venue of this third conference has been perfect, large and roomy, great equipment for presenters, skillful and helpful staff and short queues for meals.  Ok, there has been a few minor glitches, some of the sessions were full, but the venue had room for repeats, which were readily scheduled. The first session I attended today was a repeat of the Development Life Cycle and Model Store Management – a topic close to my heart. Senior Program Manager Robert Badawy walked us through the best practices for the process when using TFS and managing the model store. At the last 2 technical conferences we presented a conceptual overview of the new model store capabilities, this prompted several questions, that were left unanswered until now. Robert’s session answered these questions and even better announced availability of white papers containing all the information. Here are the links to the white papers: Deploying Customizations Across Microsoft Dynamics AX 2012 Environments, Change management and TFS integration for multi developer projects and Developing solutions in a shared AOS environment. Petur Chief Architect Snaeland from ToIncrease commented on the session during the Q&A: “This session has been worth the entire conference.” I couldn’t have put it better – well  done, Robert!

    SverreThuneThe next session I attended was Sverre Thune’s presentation of the Product Configurator. A session full of Norwegian charm, warmth, and humor – and great demos. Sverre showed the fundamentals of the Product Configurator – which is based on the Solver that Peter Villadsen showed yesterday – he showed how attributes and constraints are added, and how the constraints are automatically (and instantly) applied when a product is sold – this results in both a BOM and a Route being created so the product and be produced according to the user’s selections. Sverre showed the additions in R2 in the Product Configurator including how attributes could be hidden based on a condition – to not clutter the configuration experience, and how the Configuration form is now a regular MorphX form and can be customized and personalized as any other form. Sverre received a well deserved applause after showing the API capabilities added. It is now possible to create a class that can get/set attributes when the product has been configured. This is based on the SysExtension framework – one of my favorite application frameworks in AX. The Product Configuration creates an instance of the right class based on the class’s attributes – this allows for truly non-intrusive extensions that can easily customize how a product in configured.

    Have a safe pleasant travel home.

  • mfp's two cents

    Technical Conference Day 2


    The second day of Microsoft Dynamics AX 2012 Technical Conference is coming to an end. The over 1100 attendees have been treated to yet another day of amazing sessions and tons of information. The phrase “drinking from a fire-horse” seems applicable.

    EhrenbergThe day kicked off with a key note from General Manager Sri Srinivasan. One of the announcements was the availability of Dynamics AX 2012 R2 CTP on InformationSource – it is now ready for download. Tao Wang joined Sri on stage and presented the new Application Life Cycle (ALM) tool box, including a cloud service where you can upload your model files and have them analyzed for various issues and metrics. Technical Fellow Mike Ehrenberg took the stage after Sri, and gave an inspiring and promising talk of the future of Microsoft, starting this week with Windows 8 and Surface – and how the Dynamics products will become the fabric that units the innovations from across the Microsoft division to deliver an outstanding experience for professional users.

    PVAfter the key note I headed directly to the largest break-session room 405. Here Peter Villadsen, Principal Program Manager on the X++ team was going to “push the envelope”. I needed to see that – and so did about 300 others. Peter is always great on stage, and he always comes with a lot of interesting demos. Today Peter showed the AX LINQ Provider, allowing you to query AX data via LINQ from C#. This feature fills a gap in our managed story – now you have access to both X++ classes (via proxies) and AX data. Peter then moved into talking about the Solver that is a component shipping with AX. With this you can solve a great deal of otherwise very hard problems. For example the Traveling Sales Man problem. (What is the shortest route to visit N cities once and return home?). Peter showed how fast such problems can be solve with the Solver (5 ms) and of course Peter showed the route on a Bing map hosted on an AX from using the WPF host control. This is just one of the problems the Solver can solve, almost anything that can be expressed mathematically can be solved (at least if it has a solution). Finally Peter showcased the Code Upgrade Tool build on XLNT (X++ Language Toolkit) allowing to generate Abstract Syntax Trees for X++ and write reliable rules to analyze and refactor X++ code.   Thanks for a great session Peter!

    AndersSenior Program Manager Anders Even Girke was hosting the next session I attended. For some reason Anders’ session was in a smaller room that could fit 150 – and it was packed. The session covered Inventory Valuation. In a session full of demos Anders showed the new Moving Average costing model. This is a perpetual costing model based on the average principle, where cost of an issue transaction does not change once posted. Any Invoice price difference is proportionally expensed to P&L in case On-hand inventory is not matching the invoice quantity. Anders also mentioned that Inventory Closing has been optimized dramatically for certain data distributions, by allowing items to be bundle for the parallel batch processing. Finally the conflict report that now also can detect conflicts between ledger and WIP transactions and a new cube for slicing and dicing costing data was shown. A solid presentation from Anders – after his AXUG sessions last week, Anders is on a roll.

    I also saw that the Inside Microsoft Dynamics AX 2012 book is available – they have copies in the Hands-On Labs. The wait is over :-)


    An amazing day is coming to an end – I enjoyed it, I hope you did too?

  • mfp's two cents

    Technical Conference 2012 is on


    The Microsoft Dynamics AX Technical Conference 2012 started this morning with a keynote session from Christian Pedersen and Hal Howard.

    Among the many announcements was the General Availability date for Microsoft Dynamics AX 2012 R2: December 1st 20212.

    Hal's talk also covered some pretty cool features in R2:

    • Global support in one instance - all the localized features are now part of the foundation SYS layer, allowing you to use a single instance globally.
    • Data Partitions - allowing you to have data separation within the same instance
    • BI enhancements. Milinda Vitharana joined Hal on stage and showcased how data from various sources can be mashed up to provide great KPIs and data visualization. Well deserved spontaneous applause when Milinda showed a Bing map annotated with customer locations, their amounts due, sliced by their credit rating.
    • Retail enhancements. Balaji Balasubramanian showed the capabilities of the retail shopping experience offered by Dynamics AX 2012 R2 on Microsoft SharePoint 2012. I'm not sure what impressed me the most: The fact that the data was provided and managed by AX or that the framework offered an equally great experience on a phone as on a larger form factor device. A lot less effort is now required to deliver a much richer shopping experience for customers.

    And there was some cool give aways too: A free copy of the eBook version of Inside Dynamics AX 2012 - and a lucky man from Germany won a ride in a Formula 1 Lotus car.


  • mfp's two cents

    Inside Microsoft Dynamics AX 2012 @ the printer


    The book is now being printed.

    Read more here:

  • mfp's two cents

    Don't miss the upcoming Microsoft Dynamics AX Technical Conference


    View the personal invitation to the Microsoft Dynamics AX Technical Conference from CVP of Dynamics ERP Research and Development, Hal Howard and Technical Fellow, Mike Ehrenberg to learn more about what you will experience at the upcoming conference. Register today!

  • mfp's two cents

    Inside Microsoft Dynamics AX 2012 RTM

    Today the team of authors and editors handed over the last chapter to MS Press. The book is now in the process of being printed.

    It is scheduled to hit the shelves October 24th 2012.


    This book project started exactly one year ago. I remember a morning in early October last year on a hotel’s patio in downtown Seattle where the first draft of the table of contents got discussed. Despite local traffic, rain, and jetlag we created a straw-man and table of contents. Now, one year later, and with thousands of iterations on contents, structures, phrases, wordings, samples, graphics and with the contribution of over 60 individuals the book is finally a reality. I’m delighted to have been part of the team, and I hope you will benefit from (and perhaps even enjoy) reading this book.


  • mfp's two cents

    Pre-order Inside Microsoft Dynamics AX 2012


    We are heading for a true power demonstration from Microsoft in the fall of 2012. A long line of exciting products will be released, including Windows 8, Windows Server 2012 and Microsoft Surface

    …and the probably most anticipated of them all:
    Inside Dynamics AX 2012.

    Pre-order your copy today.


    Dig into the architecture and internals of Microsoft Dynamics AX 2012 - with firsthand insights from the team that designed and developed it. Targeted for solution developers and system implementers, this guide focuses on programming and customization capabilities - including key architectural principles, the application model, framework, and tools. Topics include: Architecture and development environment, including MorphX Microsoft Visual Studio tools for Microsoft Dynamics AX X++ programming language Microsoft SQL Server reporting and analytics Models Core development concepts Extending and customizing Microsoft Dynamics AX Performance and security considerations Workflow Best practices Note: Readers should have working knowledge of SQL and OOP concepts to gain max benefit from this book.

  • mfp's two cents

    Memory consumption of tables variables


    I recently made an interesting discovery, that I want to share with you. I was investigating an recursive algorithm that scaled nicely; until it ran out of memory. For each level of the recursion a new class instance was created – this class contained multiple member variables of type Table (as in CustTable). I decided to measure the memory footprint of this construct, and I was much surprised by my findings.

    Consider these 3 classes – that each stores the same amount of data, but in different ways:

    /// <summary> 
    /// Test class containing a table buffer and setting 20 fields 
    /// </summary> 
    class Class1 
        BOMCalcTrans bomCalcTrans; 
        public void new() 
            bomCalcTrans.ConsumptionVariable = 50; 
            bomCalcTrans.ConsumptionConstant = 50; 
            bomCalcTrans.CostPriceQty = 50; 
            bomCalcTrans.CostPrice = 50; 
            bomCalcTrans.CostPriceQtySecCur_RU = 50; 
            bomCalcTrans.CostMarkup = 50; 
            bomCalcTrans.NumOfSeries = 50; 
            bomCalcTrans.SalesPriceQty = 50; 
            bomCalcTrans.SalesMarkupQty = 50; 
            bomCalcTrans.CostMarkupQty = 50; 
            bomCalcTrans.CostMarkupQtySecCur_RU = 50; 
            bomCalcTrans.CostPriceSecCur_RU = 50; 
            bomCalcTrans.CostMarkupSecCur_RU = 50; 
            bomCalcTrans.NetWeightQty = 50; 
            bomCalcTrans.CostPriceUnit = 50; 
            bomCalcTrans.SalesPrice = 50; 
            bomCalcTrans.SalesMarkup = 50; 
            bomCalcTrans.SalesPriceUnit = 50; 
            bomCalcTrans.SalesPriceFallBackVersion = 'abc'; 
            bomCalcTrans.CostPriceFallBackVersion = 'def'; 
    /// <summary> 
    /// Test class containing a hashTable with 20 key/value pairs 
    /// </summary> 
    class Class2 
        System.Collections.Hashtable hashTable; 
        public void new() 
            hashTable = new System.Collections.Hashtable(); 
            hashTable.Add(fieldNum(bomCalcTrans,ConsumptionVariable), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,ConsumptionConstant), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,CostPriceQty), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,CostPrice), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,CostPriceQtySecCur_RU), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,CostMarkup), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,NumOfSeries), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,SalesPriceQty), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,SalesMarkupQty), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,CostMarkupQty), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,CostMarkupQtySecCur_RU), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,CostPriceSecCur_RU), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,CostMarkupSecCur_RU), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,NetWeightQty), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,CostPriceUnit), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,SalesPrice), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,SalesMarkup), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,SalesPriceUnit), 50); 
            hashTable.Add(fieldNum(bomCalcTrans,SalesPriceFallBackVersion), 'abc'); 
            hashTable.Add(fieldNum(bomCalcTrans,CostPriceFallBackVersion), 'def'); 
    /// <summary> 
    /// Test class containing 20 member variables with values 
    /// </summary> 
    class Class3 
        InventQty bomCalcTransConsumptionVariable; 
        InventQty bomCalcTransConsumptionConstant; 
        CostPrice bomCalcTransCostPriceQty; 
        CostPrice bomCalcTransCostPrice; 
        CostPriceSecCur_RU bomCalcTransCostPriceQtySecCur_RU; 
        CostPrice bomCalcTransCostMarkup; 
        InventQty bomCalcTransNumOfSeries; 
        InventSalesPrice bomCalcTransSalesPriceQty; 
        InventSalesMarkup bomCalcTransSalesMarkupQty; 
        CostMarkup bomCalcTransCostMarkupQty; 
        InventPriceMarkupSecCur_RU bomCalcTransCostMarkupQtySecCur_RU; 
        CostPriceSecCur_RU bomCalcTransCostPriceSecCur_RU; 
        CostPriceSecCur_RU bomCalcTransCostMarkupSecCur_RU; 
        ItemNetWeight bomCalcTransNetWeightQty; 
        PriceUnit bomCalcTransCostPriceUnit; 
        CostingVersionId bomCalcTransCostPriceFallBackVersion; 
        InventSalesPrice bomCalcTransSalesPrice; 
        InventSalesMarkup bomCalcTransSalesMarkup; 
        PriceUnit bomCalcTransSalesPriceUnit; 
        CostingVersionId bomCalcTransSalesPriceFallBackVersion; 
        public void new() 
            bomCalcTransConsumptionVariable = 50; 
            bomCalcTransConsumptionConstant = 50; 
            bomCalcTransCostPriceQty = 50; 
            bomCalcTransCostPrice = 50; 
            bomCalcTransCostPriceQtySecCur_RU = 50; 
            bomCalcTransCostMarkup = 50; 
            bomCalcTransNumOfSeries = 50; 
            bomCalcTransSalesPriceQty = 50; 
            bomCalcTransSalesMarkupQty = 50; 
            bomCalcTransCostMarkupQty = 50; 
            bomCalcTransCostMarkupQtySecCur_RU = 50; 
            bomCalcTransCostPriceSecCur_RU = 50; 
            bomCalcTransCostMarkupSecCur_RU = 50; 
            bomCalcTransNetWeightQty = 50; 
            bomCalcTransCostPriceUnit = 50; 
            bomCalcTransSalesPrice = 50; 
            bomCalcTransSalesMarkup = 50; 
            bomCalcTransSalesPriceUnit = 50; 
            bomCalcTransSalesPriceFallBackVersion = 'abc';  
            bomCalcTransCostPriceFallBackVersion = 'def'; 

    Now; let us create 1,000,000 instances of each and store them all in a List(Types::Class), and measure the memory footprint of each type of the 3 classes – running as IL and running as pcode.


    Notice that using a table as a member variable consumes 6x as much memory as having each field as a member – apparently there is a huge overhead associated with the xRecord+Common functionality.

    My conclusion – apparently you cannot have nice code and low memory consumption at the same time. My advice – be careful when using tables as member variables, especially in batch scenarios, i.e. classes derived from RunBaseBatch or used by same.

  • mfp's two cents

    Microsoft Dynamics AX Technical Conference 2012


    Take advantage of this unique chance to see how Microsoft Dynamics AX can help provide you with innovative solutions for your business at the Microsoft Dynamics AX Technical Conference 2012. Whether you are new to Microsoft Dynamics AX, or are looking to keep your edge by going deeper and staying up-to-date on the new capabilities in the upcoming release of Microsoft Dynamics AX 2012 R2, there will be content that fits you!

    Sign-up for email alerts today and be one of the first people to receive event updates on registration opening, agenda & content updates, and more!

  • mfp's two cents

    We’re kicking it all the way to awesome


    Make sure to visit for the new fireside chat videos on the Microsoft Dynamics vision.

Page 7 of 22 (216 items) «56789»