Steve Shebuski, VP of Digital Strategy
Guiding businesses through their digital transformation journey
You have a report you want to run in Microsoft Dynamics AX. You’ve already selected the record you want to run the report on, why should you have to select it again on the parameters screen? This guide shows you how to launch your report directly from a button-click without having to manually select report parameters.
Let's assume you already created and deployed your report to AX from Visual Studio. The key is to capture your data that will be used as parameters upon clicking your report button and utilizing inherited methods on your report controller class to auto-populate your parameters.
Your report controller class should extend the SrsReportRunController class:
class BHSTestRC extends SrsReportRunController
The main method of your report controller class should look similar to this:
public static void main(Args _args)
BHSTestRC controller = new BHSTestRC();
dataTable = _args.record() as BHSDataTable;
Above, you're taking the args that were passed into this class, and converting them to the type of table you want to pull data from using the _args.record() function. Then you pass the args into your newly created controller and decide which SSRS report to run.
In order to make the report run without showing the parameter screen, we call controller.parmShowDialog(false). This will disable the parameter screen.
The last line will begin the report. But how does the report know what field to use for what parameter? Use the same report controller class by overwriting the prePromptModifyContract method like this:
protected void prePromptModifyContract()
if (this.parmArgs() && this.parmArgs().record())
contract = this.parmReportContract().parmRdpContract() as BHSTestContract;
dataTable = this.parmArgs().record();
Above, is another instance of the table you pass in as your args, as well as declare an instance of the report contract class. The contract class houses all the parameters your report will use, as well as parm methods that will access your fields.
Check to see if args were passed in to the class. If so, create an instance of your contract class, and set the args to your data table. Then your parm the data you need from the args you passed in. This step will ensure that you get the correct data into the proper parameter.
The last step shows you how to pass your args into the class in order to use them in the controller. You’ll want to create a new Output menu item that runs your controller class first. Then, on the clicked() method of the button you will use to run your report, place the following code:
Args args = new Args();
new MenuFunction(menuitemOutputStr(BHSMenuItem), MenuItemType::Output).run(args);
You create a new Args class, and then use the data table to assign a record to args. If you’re on a form and you have a field highlighted in a grid, when you refer to that field, AX will understand that you’re talking about the record that you have highlighted.
From there, create a new MenuFunction using your newly created menu item. At the end we call run(args). This is the action that is responsible for passing the args into your controller class. The code you previously wrote will take care of the rest!
- Extend SrsReportRunController in your controller class
- Call controller.parmShowDialog(false) in order to bypass the parameter screen
- Overwrite the prePromptModifyContract method in order to populate your parameters
- Create a new menu item that we will use to call into our controller
- Call menuFunction.run(args) in order to pass our args from our form to our report