Sunday 31 January 2016

X++ in AX7: Reals are decimals

AX2012 reals are compiled as System.Decimal when compiling IL code. In AX7 that is the only option.


The main difference between the two is the maximum value supported:
AX 2012:
AX 7:
~ 9E127
~ 8E28


Both numbers should be large enough for most ERP scenarios – but you could get burned when doing arithmetic.



For example in AX7 you get an "Value was either too large or too small for a Decimal" exception when multiplying big reals - like realMax()







In AX 2012 the above would be within the supported range.
Another related improvement is that you now can control the number of decimals when Real based Extended Data Types are persisted in the data base, and the default is now 6 decimals – but that is another story.

X++ in AX7: Reals are decimals

AX2012 reals are compiled as System.Decimal when compiling IL code. In AX7 that is the only option.


The main difference between the two is the maximum value supported:
AX 2012:
AX 7:
~ 9E127
~ 8E28


Both numbers should be large enough for most ERP scenarios – but you could get burned when doing arithmetic.



For example in AX7 you get an "Value was either too large or too small for a Decimal" exception when multiplying big reals - like realMax()







In AX 2012 the above would be within the supported range.
Another related improvement is that you now can control the number of decimals when Real based Extended Data Types are persisted in the data base, and the default is now 6 decimals – but that is another story.

X++ in AX7: Readonly keyword

In AX7 X++ now supports the readonly keyword. Semantically it is identical to readonly in C#.


In short; it allows you to define members on a class that can only be initialized in the declaration and in the constructor.


class MyClass
{
    readonly str identifier = "XYZ";
    readonly str identifier2;

    public void new(str _identifier)
    {
        identifier2 = _identifier;
    }

    public void foo()
    {
        // The field 'identifier2' is read only. A value cannot be assigned to it.
        //identifier2 = "ABC"; 
    }
}  





The big question is "when to use it?" In my opinion the actual use scenarios are limited – simply because other language constructs are still missing.


In X++ we still recommend the construct pattern and the newFrom pattern. These patterns recommend the new method to not have any parameters – readonly has little applicability, when the new method is parameter-less.



So why do we prefer parameter-less new methods?
  1. It enables serialization of classes using the pack/unpack pattern – all classes extending RunBase are subject to this.
  2. It enables the extension framework and smart customizations.
Once X++ supports getters/setters and method overloading (at least of the new method) – then readonly will become handy.'


If you have a good use scenario for readonly - please share in the comments section below.

X++ in AX7: Readonly keyword

In AX7 X++ now supports the readonly keyword. Semantically it is identical to readonly in C#.


In short; it allows you to define members on a class that can only be initialized in the declaration and in the constructor.


class MyClass
{
    readonly str identifier = "XYZ";
    readonly str identifier2;

    public void new(str _identifier)
    {
        identifier2 = _identifier;
    }

    public void foo()
    {
        // The field 'identifier2' is read only. A value cannot be assigned to it.
        //identifier2 = "ABC"; 
    }
}  





The big question is "when to use it?" In my opinion the actual use scenarios are limited – simply because other language constructs are still missing.


In X++ we still recommend the construct pattern and the newFrom pattern. These patterns recommend the new method to not have any parameters – readonly has little applicability, when the new method is parameter-less.



So why do we prefer parameter-less new methods?
  1. It enables serialization of classes using the pack/unpack pattern – all classes extending RunBase are subject to this.
  2. It enables the extension framework and smart customizations.
Once X++ supports getters/setters and method overloading (at least of the new method) – then readonly will become handy.'


If you have a good use scenario for readonly - please share in the comments section below.

X++ in AX7: Extension methods

Have you ever experienced a Microsoft provided class or table missing that vital method that would just make your life easier? If so, you might have been tempted to add it yourself using overlayering. And you surely have paid the upgrade price!


You are about to be pleased. In AX7 X++ supports extension methods, similarly to C#.
Suppose we want to add a fullName method to the DirPersonName table. Here is how you do it, without touching the DirPersonName table. Create this new class:



static class MyDirPersonName_Extension
{
    static public PersonName fullName(DirPersonName _person)
    {
        return strFmt('%1 %2 %3', _person.FirstName, _person.MiddleName, _person.LastName);
    }
}  



Things to remember:
  1. The class must be postfixed with "_extension".
  2. The class must be static.
  3. The extension methods must be static.
  4. The type of the first parameter determines which type is extended.

Now you can enjoy your extension method:


DirPersonName dirPersonName;

while select dirPersonName
{
    info(dirPersonName.fullName());



Notice:
  1. When calling extension methods, you don't provide the first parameter – that gets inferred from the instance's type.
  2. If the extension method took any additional parameters – they (of course) needs to be provided.
  3. This doesn't break encapsulation. The extension method only has access to public fields and methods on the type.

X++ in AX7: Extension methods

Have you ever experienced a Microsoft provided class or table missing that vital method that would just make your life easier? If so, you might have been tempted to add it yourself using overlayering. And you surely have paid the upgrade price!


You are about to be pleased. In AX7 X++ supports extension methods, similarly to C#.
Suppose we want to add a fullName method to the DirPersonName table. Here is how you do it, without touching the DirPersonName table. Create this new class:



static class MyDirPersonName_Extension
{
    static public PersonName fullName(DirPersonName _person)
    {
        return strFmt('%1 %2 %3', _person.FirstName, _person.MiddleName, _person.LastName);
    }
}  



Things to remember:
  1. The class must be postfixed with "_extension".
  2. The class must be static.
  3. The extension methods must be static.
  4. The type of the first parameter determines which type is extended.

Now you can enjoy your extension method:


DirPersonName dirPersonName;

while select dirPersonName
{
    info(dirPersonName.fullName());



Notice:
  1. When calling extension methods, you don't provide the first parameter – that gets inferred from the instance's type.
  2. If the extension method took any additional parameters – they (of course) needs to be provided.
  3. This doesn't break encapsulation. The extension method only has access to public fields and methods on the type.

X++ in AX7: Const keyword

In AX7 X++ now supports the const keyword. Semantically it is identical to const in C#.
In short; it allows you to define members on a class and variables in a method that can only be initialized during the declaration. The compiler will replace references to these constants with the literal value. In other words, the constant value must be known at compile time.


This is a killer feature! It replaces most use cases of macros.


void constsAreCool()
{
    #define.magicNumber("AX 2012");
    const str MagicNumber = "AX7";
    info(#magicNumber);
    info(MagicNumber);
}  





There are many benefits:
  1. IntelliSense in the editor.
  2. Support for "Go to definition" in the editor.
  3. Full control of the type for the constant.
  4. Faster compilation – macros are notorious hard for the compiler to handle.
  5. None of the macro idiosyncrasies – like the ability to redefine/override.
Now when you couple this with public and static members, then you can create classes with constants to replace macro libraries.


static class TimeConstants
{
    static const public int DaysPerWeek = 7;
    static const public int HoursPerDay = 24;
    static const public int HoursPerWeek = TimeConstants::DaysPerWeek * TimeConstants::HoursPerDay;
}  




It is best practice to use PascalCasing when naming const variables, regardless of if they are private, protected or public.



Notice how the constants in the class are referenced:
TimeConstants::HoursPerWeek  


This is much clearer than macros:
#TimeConstants
int x = #HoursPerWeek  



For example; you are no longer in doubt where the definition is coming from.

X++ in AX7: Const keyword

In AX7 X++ now supports the const keyword. Semantically it is identical to const in C#.
In short; it allows you to define members on a class and variables in a method that can only be initialized during the declaration. The compiler will replace references to these constants with the literal value. In other words, the constant value must be known at compile time.


This is a killer feature! It replaces most use cases of macros.


void constsAreCool()
{
    #define.magicNumber("AX 2012");
    const str MagicNumber = "AX7";
    info(#magicNumber);
    info(MagicNumber);
}  





There are many benefits:
  1. IntelliSense in the editor.
  2. Support for "Go to definition" in the editor.
  3. Full control of the type for the constant.
  4. Faster compilation – macros are notorious hard for the compiler to handle.
  5. None of the macro idiosyncrasies – like the ability to redefine/override.
Now when you couple this with public and static members, then you can create classes with constants to replace macro libraries.


static class TimeConstants
{
    static const public int DaysPerWeek = 7;
    static const public int HoursPerDay = 24;
    static const public int HoursPerWeek = TimeConstants::DaysPerWeek * TimeConstants::HoursPerDay;
}  




It is best practice to use PascalCasing when naming const variables, regardless of if they are private, protected or public.



Notice how the constants in the class are referenced:
TimeConstants::HoursPerWeek  


This is much clearer than macros:
#TimeConstants
int x = #HoursPerWeek  



For example; you are no longer in doubt where the definition is coming from.

X++ in AX7: Inline variable declarations

What would you pay to be able to do this in X++?

for (int i = 1; i <= n; i++) 
{
}    
Or this:
if (i > 0)  
{
    int positiveInt = i;
}  
Or this:
if (applyInterestRate)
{
    real rate = this.getInterestRate();
    result = result * rate;
}
if (applyExchangeRate)
{
    ExchangeRate rate = this.getExchangeRate();
    result = result * rate.ExchangeRate;
}  
Finally, we can:
  • Declare variables close(r) to where they are used,
  • Variables are scoped by the block in which they are declared, and
  • Variable names can be reused in another scope.
The price: Join the ranks of AX7 developers!
Note: Whenever you consider using inline variable declarations – consider extracting the code into a smaller method instead.

X++ in AX7: Inline variable declarations

What would you pay to be able to do this in X++?

for (int i = 1; i <= n; i++) 
{
}    
Or this:
if (i > 0)  
{
    int positiveInt = i;
}  
Or this:
if (applyInterestRate)
{
    real rate = this.getInterestRate();
    result = result * rate;
}
if (applyExchangeRate)
{
    ExchangeRate rate = this.getExchangeRate();
    result = result * rate.ExchangeRate;
}  
Finally, we can:
  • Declare variables close(r) to where they are used,
  • Variables are scoped by the block in which they are declared, and
  • Variable names can be reused in another scope.
The price: Join the ranks of AX7 developers!
Note: Whenever you consider using inline variable declarations – consider extracting the code into a smaller method instead.

X++ in AX7: Method signatures

This post is about one of the more subtle changes in AX7. AX7 uses the .NET runtime, aka CLR. This has some implications for method signatures. In the CLR a method's signature includes casing, parameters and return type. In AX2012 a method's signature was simply the method's name – case insensitive.


Why is this important? If you change a method's signature, then all references to the method needs to be recompiled. Including those changes that appear harmless, like:


  • Fixing a casing issue in a method name, e.g. "somemethod" -> "someMethod".
  • Changing return type from void to <something>

Here is an example, where I changed the casing of a method, that is being consumed by a test. I did NOT recompile the test before running it.


Notice the System.MissingMethodException: Method not found: 'Void Dynamics.AX.Application.MyClass.myMethod()'. The CLR only knows of a method with all lower case.







Optional parametersIt is still safe to add and remove (unused) optional parameters. The X++ compiler uses CLR's method overloading, i.e. several methods with the same name and the variations of supported parameters are produced by the compiler.



Lesson to learnDo not change a method's signature, unless you are willing (and able) to recompile all consumers.

X++ in AX7: Method signatures

This post is about one of the more subtle changes in AX7. AX7 uses the .NET runtime, aka CLR. This has some implications for method signatures. In the CLR a method's signature includes casing, parameters and return type. In AX2012 a method's signature was simply the method's name – case insensitive.


Why is this important? If you change a method's signature, then all references to the method needs to be recompiled. Including those changes that appear harmless, like:


  • Fixing a casing issue in a method name, e.g. "somemethod" -> "someMethod".
  • Changing return type from void to <something>

Here is an example, where I changed the casing of a method, that is being consumed by a test. I did NOT recompile the test before running it.


Notice the System.MissingMethodException: Method not found: 'Void Dynamics.AX.Application.MyClass.myMethod()'. The CLR only knows of a method with all lower case.







Optional parametersIt is still safe to add and remove (unused) optional parameters. The X++ compiler uses CLR's method overloading, i.e. several methods with the same name and the variations of supported parameters are produced by the compiler.



Lesson to learnDo not change a method's signature, unless you are willing (and able) to recompile all consumers.

X++ in AX7: Garbage Collection

In AX 2012 the runtime can either be the .NET CLR executing IL code, or the AX interpreter executing pcode. From a Garbage Collection point of view these two behaves extremely different. The difference is like night and day.

In AX7 only the .NET CLR Garbage Collector is in play.



Native AX interpreter.NET CLR
TriggerImmediately – when reference count reaches zero.Indeterministic – usually when system is low on memory or idle. Can also be on demand.
Performance
Maintaining the reference counts is expensive. More info.
Freeing memory in-proc is expensive, slowing down transactions, etc.
Designed for minimal impact at runtime.

Who cares?

In most situations you don't have to care. The .NET GC will do what you expect. However; if you are dealing with any unmanaged resources, you have to pay attention.


Locks in SQL is a typical unmanaged resource. If your logic uses the UserConnection class to obtain a lock in SQL, and you rely on the GC to release the lock (by aborting the user connection's transaction), then you will experience the lock not being released as you expect. In fact, you may notice it never gets released.


The ReqReaderWriteLock class in AX2012 was doing exactly that. In AX7 this classes is now implementing the System.IDisposable interface. Consumers must ensure dispose() gets invoked. The using statement is handy here.

X++ in AX7: Forms implementing interface

Forms can now implement interfaces.


 public class MyForm extends FormRun implements SysPackable
{
}    



 This is pretty cool, because:
  1. The compiler will validate that the interface is correctly implemented.
  2. No longer a need to use reflection, like hasFormMethod(), to determine if it is safe to call the method.
  3. No longer a need to downcast to object to invoke the methods. Now cast to the interface:

    var sysPackable = myFormRun as SysPackable;

    if (sysPackable)
    {
        sysPackable.pack();
    }  

X++ in AX7: Forms implementing interface

Forms can now implement interfaces.


 public class MyForm extends FormRun implements SysPackable
{
}    



 This is pretty cool, because:
  1. The compiler will validate that the interface is correctly implemented.
  2. No longer a need to use reflection, like hasFormMethod(), to determine if it is safe to call the method.
  3. No longer a need to downcast to object to invoke the methods. Now cast to the interface:

    var sysPackable = myFormRun as SysPackable;

    if (sysPackable)
    {
        sysPackable.pack();
    }  

X++ in AX7: Garbage Collection

In AX 2012 the runtime can either be the .NET CLR executing IL code, or the AX interpreter executing pcode. From a Garbage Collection point of view these two behaves extremely different. The difference is like night and day.

In AX7 only the .NET CLR Garbage Collector is in play.



Native AX interpreter .NET CLR
Trigger Immediately – when reference count reaches zero. Indeterministic – usually when system is low on memory or idle. Can also be on demand.
Performance
Maintaining the reference counts is expensive. More info.
Freeing memory in-proc is expensive, slowing down transactions, etc.
Designed for minimal impact at runtime.

Who cares?

In most situations you don't have to care. The .NET GC will do what you expect. However; if you are dealing with any unmanaged resources, you have to pay attention.


Locks in SQL is a typical unmanaged resource. If your logic uses the UserConnection class to obtain a lock in SQL, and you rely on the GC to release the lock (by aborting the user connection's transaction), then you will experience the lock not being released as you expect. In fact, you may notice it never gets released.


The ReqReaderWriteLock class in AX2012 was doing exactly that. In AX7 this classes is now implementing the System.IDisposable interface. Consumers must ensure dispose() gets invoked. The using statement is handy here.

X++ in AX7: String truncation

Consider this X++ code:


CustGroupId id = "012345678901234567890123456789"//30 chars long;

CustGroup custgroup; 
custGroup.id = id;
custGroup.insert;  
select custGroup
   
where custGroup.id == id;  



The CustGroupID EDT is defined with a length of 20 characters. In AX 2012 the assignment in the very first line would truncate the string from 30 to 20 characters. The record would be inserted and selected again.



In AX7 the CustGroupID EDT is being compiled as the CLR type: string. The consequence being that no truncation occurs in the first line. The truncation happens in the data base layer, as the column can only contain 20 characters. The most significant change is in the select statement. In AX7 no record will be found, as no record has an ID matching the 30-character long ID.




Actually; this also happens in AX2012 – when X++ code is compiled as CIL.


Is this good or bad?

I think it is primarily good. It is good - very good from a performance perspective. X++ is now compiled into CLR and is magnitudes faster than in AX2012. We could have injected a small check to validate and truncate every string upon assignment - at a quite dire cost. In the vast majority of cases the truncation isn't required - string lengths are already enforced, for example on the UI - so we opted for performance.




The only issues we discovered by this was in automated testing - like unit tests, where test data defined in code contained too long strings. In reality an implementation problem already in AX2012 - but it didn't surface until now. Once you know this change in behavior, solving the relatively few issues aren't a big deal.

X++ in AX7: String truncation

Consider this X++ code:


CustGroupId id = "012345678901234567890123456789"//30 chars long;

CustGroup custgroup; 
custGroup.id = id;
custGroup.insert;  
select custGroup
   
where custGroup.id == id;  



The CustGroupID EDT is defined with a length of 20 characters. In AX 2012 the assignment in the very first line would truncate the string from 30 to 20 characters. The record would be inserted and selected again.



In AX7 the CustGroupID EDT is being compiled as the CLR type: string. The consequence being that no truncation occurs in the first line. The truncation happens in the data base layer, as the column can only contain 20 characters. The most significant change is in the select statement. In AX7 no record will be found, as no record has an ID matching the 30-character long ID.




Actually; this also happens in AX2012 – when X++ code is compiled as CIL.


Is this good or bad?

I think it is primarily good. It is good - very good from a performance perspective. X++ is now compiled into CLR and is magnitudes faster than in AX2012. We could have injected a small check to validate and truncate every string upon assignment - at a quite dire cost. In the vast majority of cases the truncation isn't required - string lengths are already enforced, for example on the UI - so we opted for performance.




The only issues we discovered by this was in automated testing - like unit tests, where test data defined in code contained too long strings. In reality an implementation problem already in AX2012 - but it didn't surface until now. Once you know this change in behavior, solving the relatively few issues aren't a big deal.

X++ in AX7: Attributes without specifying ”Attribute”

The naming convention in X++ (and C# by the way) is to postfix attribute classes' name with

"Attribute". When using the attribute to decorate a class, it is a bit verbose to type in "Attribute" as it is apparent from the context, so now in X++ - just like in C# - you can skip the last part of the name.
Example:


class MyTestCase extends SysTestCase
{
    [SysTestMethodAttribute]
    public void testCase1()
    {
    }
}  
 
Is semantically identical to:
class MyTestCase extends SysTestCase
{
    [SysTestMethod]
    public void testCase1()
    {
    }
}  



Now, there is a difference in opinion on which one is best. One camp would argue that the shorter code is easier to read and write. Another camp would argue that referring to the same type in two different ways makes tooling (like refactoring tools, F12/Go to declaration and cross references tool) harder to implement. I agree with both, however, now the door is opened for this dual way of referencing and the tooling needs to follow suit. I'm in favor for the short notion.

X++ in AX7: Attributes without specifying ”Attribute”

The naming convention in X++ (and C# by the way) is to postfix attribute classes' name with

"Attribute". When using the attribute to decorate a class, it is a bit verbose to type in "Attribute" as it is apparent from the context, so now in X++ - just like in C# - you can skip the last part of the name.
Example:


class MyTestCase extends SysTestCase
{
    [SysTestMethodAttribute]
    public void testCase1()
    {
    }
}  
 
Is semantically identical to:
class MyTestCase extends SysTestCase
{
    [SysTestMethod]
    public void testCase1()
    {
    }
}  



Now, there is a difference in opinion on which one is best. One camp would argue that the shorter code is easier to read and write. Another camp would argue that referring to the same type in two different ways makes tooling (like refactoring tools, F12/Go to declaration and cross references tool) harder to implement. I agree with both, however, now the door is opened for this dual way of referencing and the tooling needs to follow suit. I'm in favor for the short notion.

New video material on Dynamics Ax 7 at Microsoft Dynamics Learning portal


 
xyz


I just login on Microsoft Dynamics Learning Portal and found that Microsoft Uploaded new videos for Dynamics Ax 7 under following heads
  • General
  • Retail
  • Technical Conference
  • Technical Conference –LCS
  • Technical conference courses
https://mbspartner.microsoft.com/AX/Topic/21

New video material on Dynamics Ax 7 at Microsoft Dynamics Learning portal


 
xyz


I just login on Microsoft Dynamics Learning Portal and found that Microsoft Uploaded new videos for Dynamics Ax 7 under following heads
  • General
  • Retail
  • Technical Conference
  • Technical Conference –LCS
  • Technical conference courses
https://mbspartner.microsoft.com/AX/Topic/21

Delete a legal entity in Dynamics Ax 2012

Today I have to delete all legal entities from one of MS Dynamics Ax 2012 environment.
During this I got following error while deleting legal entities.


“Can not record , The corresponding AOS  validation failed”.



This error clearly shows that Transnational data exists in that legal entity.


I follow these steps to clear all legal entities.
  • First of open AOT with development rights.
  • Change the legal entity from DAT to required legal entity.
  • From AOT, expand the Class node, type SysdatabaseTransDelete. When find, right click on it click it open / run. It will delete all transactional history of required legal entity.
  • Now open the new workspace and open Organization Administrator ion => setup=>organization => legal entities.
  • Select on required legal entity and click on delete from top menu.


Some but on some legal entities delete button is still disabled. Because there is no important data as well I want to delete all legal entities, I manually delete the data in RCHYRELATIONSHIP table.

Otherwise I have to delete the organization hierarchy data carefully.




Following two links help me to solve this issue.
http://daxture.blogspot.com/2014/09/delete-legal-entities-in-ax-2012.html
https://community.dynamics.com/ax/f/33/t/139605

Delete a legal entity in Dynamics Ax 2012

Today I have to delete all legal entities from one of MS Dynamics Ax 2012 environment.
During this I got following error while deleting legal entities.


“Can not record , The corresponding AOS  validation failed”.



This error clearly shows that Transnational data exists in that legal entity.


I follow these steps to clear all legal entities.
  • First of open AOT with development rights.
  • Change the legal entity from DAT to required legal entity.
  • From AOT, expand the Class node, type SysdatabaseTransDelete. When find, right click on it click it open / run. It will delete all transactional history of required legal entity.
  • Now open the new workspace and open Organization Administrator ion => setup=>organization => legal entities.
  • Select on required legal entity and click on delete from top menu.


Some but on some legal entities delete button is still disabled. Because there is no important data as well I want to delete all legal entities, I manually delete the data in RCHYRELATIONSHIP table.

Otherwise I have to delete the organization hierarchy data carefully.




Following two links help me to solve this issue.
http://daxture.blogspot.com/2014/09/delete-legal-entities-in-ax-2012.html
https://community.dynamics.com/ax/f/33/t/139605

Exploring the Dynamic Ax (AX 7) workspace

New Dynamics AX (AX 7) is web based. Its navigation layout is different than Dynamics Ax 2012.
Writing of this blog post, I am using Dynamics Ax 7 CTP8 beta version, so possible later version will have better navigation layout.


Lets explore what Current version offers us.

When we login into AX 7 web page. The first page or dashboard appears shows us multiple workspace. These workspace are depended on login user role.



Currently I am login with administrator user. So It will show all workspaces. Consider following screenshot.



Workspace.


Dashboards central area shows the multiple workspace links based on role of login user.


Workspace1




Left section contains a calendar, favorites and recently used pages. Calendar shows us current date. If click on any date, pop up message ask to change the session date.













Favorits and clander




On favorite tab, can be find all favorite page linked, which select as favorite, this feature helps user to go on specific page directly on which he most frequently works.



Next to it Recent, Here Dynamics Ax shows all forms you recently visited inside Dynamics Ax. It is some kind of history.



From right side or right section user can find all links to records which are assigned to him or her as result of workflow submission.



Assign to me


If we see top menu bar It will contains legal entry change, universal search and module menu. In below screenshot I attached different points to described in more detail.




navigation pane 


Point 1: If we click Dynamics Ax button, this will lead us on dashboard page or home page.



Point 2: Click on Icon pointed in 2. This will shows us pop up menu, which take us different modules and there respected forms.







2015-12-29_23-35-24



Point 3: AX provide excellent search button, for example in point 3 I entered the word “Product” , a drop down shows all possible links where word product found.







Search




Point 4: On point 4 is place where we can change legal entity





Legal entities 



Point 5: Next item is on click we found link for task record and other option.




Menu2

Now we explore on other Sales order processing and Inquiry workspace. For this we have to click on top menu and open




Sales Inquery page




On clicking that we find following workspace page open



Workspace detail




The workspace is clearly divided into three parts.
  1. Summary one is summary section.
This section shows the summary of number of issues, status, count of particular status. For example above summary section shows that currently two unconfirmed sales order, Zero confirmed sales orders and 0 partially shipped in current legal entity. This summary also contains quick links for All Sales Orders and All customers.




Summary Sections
If I click on Unconfirmed summary button this will leads to list page where unconfirmed sales orders are placed.
Sumarry details




You can also see the action pane in above screenshot, This form open as result of clicking on Unconfirmed Sales Order summary button.

  1. Second section is tab section.
Tabbed Area




Tab are shows the list, steps and do list. For example if I click on unconfirmed tab than tabbed area looks the like following screen shot.
Tabbed Details
  1. Third section in workspace is links. Where you find links for other pages which related current paged. Here you find inquiries, frequently access page links etc.




Links





Multiple windows.



While working we usually open multiple screens, for this purpose Dynamics Ax 7 , provide a button on Action pane. Click on this button you can open multiple web pages.






Open in new window




Reports:
 We can also run reports from pop up menu. Lets run sales orders per customer.




Reports menu



By clicking on “Sales Order per customer” following tab open at right side of workspace.




Report Daliog

Expand Records to Include and add filter for report



Report Dalilog details



Click on filter under “Record to Include”



Customer DEtails




Click ok and customer is selected




Customer Selection details




Click ok to run report.
Loading and loading wait for loading report for selected Sales order.



Report load
Taa taan Reports opens.
Report is runned


Exploring the Dynamic Ax (AX 7) workspace

New Dynamics AX (AX 7) is web based. Its navigation layout is different than Dynamics Ax 2012.
Writing of this blog post, I am using Dynamics Ax 7 CTP8 beta version, so possible later version will have better navigation layout.


Lets explore what Current version offers us.

When we login into AX 7 web page. The first page or dashboard appears shows us multiple workspace. These workspace are depended on login user role.



Currently I am login with administrator user. So It will show all workspaces. Consider following screenshot.



Workspace.


Dashboards central area shows the multiple workspace links based on role of login user.


Workspace1




Left section contains a calendar, favorites and recently used pages. Calendar shows us current date. If click on any date, pop up message ask to change the session date.













Favorits and clander




On favorite tab, can be find all favorite page linked, which select as favorite, this feature helps user to go on specific page directly on which he most frequently works.



Next to it Recent, Here Dynamics Ax shows all forms you recently visited inside Dynamics Ax. It is some kind of history.



From right side or right section user can find all links to records which are assigned to him or her as result of workflow submission.



Assign to me


If we see top menu bar It will contains legal entry change, universal search and module menu. In below screenshot I attached different points to described in more detail.




navigation pane 


Point 1: If we click Dynamics Ax button, this will lead us on dashboard page or home page.



Point 2: Click on Icon pointed in 2. This will shows us pop up menu, which take us different modules and there respected forms.







2015-12-29_23-35-24



Point 3: AX provide excellent search button, for example in point 3 I entered the word “Product” , a drop down shows all possible links where word product found.







Search




Point 4: On point 4 is place where we can change legal entity





Legal entities 



Point 5: Next item is on click we found link for task record and other option.




Menu2

Now we explore on other Sales order processing and Inquiry workspace. For this we have to click on top menu and open




Sales Inquery page




On clicking that we find following workspace page open



Workspace detail




The workspace is clearly divided into three parts.
  1. Summary one is summary section.
This section shows the summary of number of issues, status, count of particular status. For example above summary section shows that currently two unconfirmed sales order, Zero confirmed sales orders and 0 partially shipped in current legal entity. This summary also contains quick links for All Sales Orders and All customers.




Summary Sections
If I click on Unconfirmed summary button this will leads to list page where unconfirmed sales orders are placed.
Sumarry details




You can also see the action pane in above screenshot, This form open as result of clicking on Unconfirmed Sales Order summary button.

  1. Second section is tab section.
Tabbed Area




Tab are shows the list, steps and do list. For example if I click on unconfirmed tab than tabbed area looks the like following screen shot.
Tabbed Details
  1. Third section in workspace is links. Where you find links for other pages which related current paged. Here you find inquiries, frequently access page links etc.




Links





Multiple windows.



While working we usually open multiple screens, for this purpose Dynamics Ax 7 , provide a button on Action pane. Click on this button you can open multiple web pages.






Open in new window




Reports:
 We can also run reports from pop up menu. Lets run sales orders per customer.




Reports menu



By clicking on “Sales Order per customer” following tab open at right side of workspace.




Report Daliog

Expand Records to Include and add filter for report



Report Dalilog details



Click on filter under “Record to Include”



Customer DEtails




Click ok and customer is selected




Customer Selection details




Click ok to run report.
Loading and loading wait for loading report for selected Sales order.



Report load
Taa taan Reports opens.
Report is runned