mfp's two cents

...on Dynamics AX Development!

May, 2011

  • mfp's two cents

    Seeing is believing - AX 2012 X++ Editor


    Here is a sneak preview of the new X++ Editor in Microsoft Dynamics AX 2012.

    Notice that the editor now features word-completion, automatic indenting, scripting, zoom, multiline editing, and much much more.

    This post is also available on Channel 9.


  • mfp's two cents

    Seeing is believing - AX 2012 Type Hierarchies


    This is a sneak preview of two new tools in Microsoft Dynamics AX 2012: The Type Hierarchy Context and the Type Hierarchy Browser.

    Please notice:

    • Microsoft Dynamics AX 2012 supports table inheritance
    • These tools runs off live meta data - no need for cross reference to fuel them
    • These tools improves the navigation and discoverability of meta data

    This video is also available on Channel 9.


  • mfp's two cents

    "Internal error 25" causes and solutions


    This article applies to Microsoft Dynamics AX 2012.

    The error message ”Internal error 25” is a generic error message that occurs when one type is trying to be converted into another incompatible type at runtime.

    This error can be triggered in a myriad of different situations. However; there are three likely root causes to this.

    1. A programmatic error

    In the ideal world the X++ compiler would detect any illegal X++ construct, that could lead to conversion between incompatible types. There are unfortunately a few situations where the X++ compiler doesn’t have enough information to do so. In X++ the type anytype can be used to denote any type in the system. Whenever the compiler sees a variable, parameter or return type of this type, it will not perform any type checking.

    This means that the code using the anytype type must explicitly verify the variable/parameter/return type is compatible with how it is being used. Failing to do so can lead to an “Internal error 25”.

    Consider this code:

    1. static void provokeInternalError25(Args _args)
    2. {    
    3.     info(strfmt('The current folder is %1',any2str(System.IO.Directory::GetCurrentDirectory())));    
    4. }

    It will result in an “Internal error 25”. The function any2str() accepts an anytype as parameter, so the compiler will not perform any checking. However, the implementation of any2str() doesn’t support that a System.String (CLR Object) is passed in – and thus this error. As an X++ developer the only remedy is to work around the issue. In above example by assigning the System.String to a str (X++ native type). That will work because the interpreter’s assignment implementation do support conversion of System.String to str. The code then becomes:

    1. static void avoidingInternalError25(Args _args)
    2. {    
    3.     str currentDirectory = System.IO.Directory::GetCurrentDirectory();
    4.     info(strfmt('The current folder is %1', currentDirectory));    
    5. }

    One might argue that the interpreter’s assignment conversion should have solved the issue when using any2str() too. That unfortunately cannot be done, as the interpreter will not perform any conversion as the receiving side claims to support anytype.

     2. Stale data

    The type to convert might originate from data in the data base. If the data has been stored in one format and is being retrieved in another, it could lead to this situation.

    Things to try:

    1. Synchronize the data base
      Right-click AOT | Data dictionary and select “Synchronize”
    2. Delete Usage data
      Tools | Options | Usage data. Click ‘Reset’
    3. Debugging
      Debug the steps leading up to the error, and correct the affected data – typically by deleting it.

    3. Stale pcode

    The compiler produces pcode from the X++ code. This pcode is stored in the model store, and thus imported to the model store via AXUtil import (or AOD import). Given pcode often is referencing meta data from other models, the model store needs to be recompiled when new models are added or removed. Until the model store has been recompiled the interpreter may interpret metadata incorrectly, which can lead to “Internal error 25”. AXUtil will inform you about this after import, and so will Dynamics AX the first time a client is started.

    The steps to take are:

    1. Restart AOS
    2. Start AX client
    3. Select “Launch model upgrade checklist” or “Compile and Synchronize” in the form that automatically opens.

    Given the nature of the problem, the internal error 25 can occur before the system has had a chance to open the form automatically. This typically occurs when one of these classes are customized: Application, Infolog or ClassFactory.  It can also occur, if elements referenced by these classes are customized.

    To solve this issue follow these steps:

    1. Restart AOS
    2. Start AX client in safe mode
      In command line type:  AX32.exe -noauto
      The –noauto option will prevent the system from running any pcode during start up, including the pcode that is triggering the “Internal error 25”, and the pcode that is launching the compile form. The client will start directly in the developer workspace to further prevent any application logic to be run.
    3. Right-click the root of AOT and select “Compile”  or compile select portions of the AOT
    4. Resolve any compilation errors that could trigger a problem during start up.


Page 1 of 1 (3 items)