Here is a small job that demonstrates the main parts of build a report dynamically in X++ and launching it.

 

static void MakeReportJob(Args _args)

{

    #AOT

    str reportName = 'aaMakeReport';

    tableid custTableId = tablenum(CustTable);

    TreeNode reportNode = TreeNode::findNode(#ReportsPath);

    Report areport;

    ReportDesign design;

    ReportAutoDesignSpecs specs;

    ReportSection section;

    ReportRun run;

    ;

   

    // Delete the report if it already exists

    areport = reportNode.AOTfindChild(reportName);

    if (areport)

        areport.AOTdelete();

 

    // Build the report

    areport = reportNode.AOTadd(reportName);

    areport.query().addDataSource(custTableId);

    design = areport.addDesign('Design');

    specs = design.autoDesignSpecs();

    section = specs.addSection(ReportBlockType::Body, custTableId);

    section.addControl(custTableId, fieldnum(CustTable, AccountNum));

    section.addControl(custTableId, fieldnum(CustTable, Name));

   

    // Now the report will not prompt for user input

    areport.interactive(false);

    areport.query().interactive(false);

   

    areport.AOTcompile();

   

    run = ClassFactory.reportRunClass(new Args(reportName));

    run.init();

    run.run();

}