Charts in Microsoft Dynamics AX 2012

 

 

 

 

Microsoft Dynamics AX 2012 has integrated support for Microsoft .NET charts, easily managed via X++.

 

  • The Microsoft .NET team has extended the .NET API by introducing a Chart control.
  • Microsoft Dynamics Client enables simple use of this control by creating a new X++ wrapper class for the MSChart control: Graphics.
  • The Microsoft Dynamics Client has introduced a new companion control for the MSChart control: The Chart Toolbar control.

With the Graphics class, an X++ developer can easily display their data graphical manner, without the need to utilize and understand the low-level .NET charting API. Simply utilize the Graphics class to initialize a chart with default display values, call a single "add data" API, then call Update to diplay the chart. In most cases, the developer will also want to provide the end user with the ability to manipulate the chart at runtime. In those cases, the developer will add the new Chart Toolbar to his form, and pass the toolbar an instance of the chart to be manipulated. That's it. An example use of charting can be found in the Tutorial_Form_Graphics form.

 

Start by adding Two Managed Controls to your form. One to host the Chart Control, the other to Host the Chart Toolbar

 

 

For the purposes of this example name the chart control instance is "GraphControl"

 

Assembly: System.Windows.Forms

Control: System.Windows.Forms.DataVisualization.Charting.Chart

 

Assembly: Microsoft.Dynamics.AX.Framework.Client.Controls

Control: Microsoft.Dynamics.AX.Framework.Client.Controls.ChartToolBar

 

Set both to have a Width of Column Width

 

// Class Declaration

public class FormRun extends ObjectRun

{

      Graphics graphics;

    Microsoft.Dynamics.AX.Framework.Client.Controls.ChartToolBar chartToolbarControl;

}

public

void init(){

        super();

// create an runtime reference to the toolbar control 

   chartToolbarControl = chartToolbarControlHost.control();

 

// bind the tool bar to the chart control by passing an instance of the chart control to it

    chartToolbarControl.set_ChartControl(graphControl.control());

      this.createSampleData();

    this.showchart();

}

void showchart()

{

// create an instance of the X++ to .NET abstraction class and bind it to the chart control

    graphics =  new Graphics();

    graphics.ManagedHostToControl(graphControl);

 

// set your abstracted chart options

    graphics.parmCreateType(#CT_LEGEND | #CT_3D);

    graphics.create();

    graphics.parmTitle("@SYS95906");

    graphics.parmTitleXAxis("@SYS106478");

    graphics.parmTitleYAxis("@SYS3065");

 

// populate the chart with data

   whileselect tmpAccountSum 

       orderby TransDate

    {

        graphics.loadData( date2str(tmpAccountSum.TransDate,-1,-1,-1,-1,-1,-1, DateFlags::None),  tmpAccountSum.Txt, tmpAccountSum.Qty01);

    }

    graphics.showGraph();

}

 

 // create some sample data

void createsampledata()

{   

    tmpAccountSum.TransDate = 01\01\2007;

    tmpAccountSum.Qty01 = 1;

    tmpAccountSum.Txt = 'Group1';

    tmpAccountSum.insert();

 

    tmpAccountSum.TransDate = 02\02\2007;

    tmpAccountSum.Qty01 = 2;

    tmpAccountSum.Txt = 'Group1';

    tmpAccountSum.insert();

 

    tmpAccountSum.TransDate = 02\02\2007;

    tmpAccountSum.Qty01 = 1;

    tmpAccountSum.Txt = 'Group2';

    tmpAccountSum.insert();

 

    tmpAccountSum.TransDate = 03\03\2007;

    tmpAccountSum.Qty01 = 3;

    tmpAccountSum.Txt = 'Group2';

    tmpAccountSum.insert();

 

    tmpAccountSum.TransDate = 04\04\2007;

    tmpAccountSum.Qty01 = 1;

    tmpAccountSum.Txt = 'Group1';

    tmpAccountSum.insert();

 

    tmpAccountSum.TransDate = 04\04\2007;

    tmpAccountSum.Qty01 = 2;

    tmpAccountSum.Txt = 'Group3';

    tmpAccountSum.insert();

 

    tmpAccountSum.TransDate = 05\05\2007;

    tmpAccountSum.Qty01 = 3;

    tmpAccountSum.Txt = 'Group3';

    tmpAccountSum.insert();

 

    tmpAccountSum.TransDate = 05\05\2007;

    tmpAccountSum.Qty01 = 2;

    tmpAccountSum.Txt = 'Group2';

    tmpAccountSum.insert();

}