if the customer have not buy [Business analysis]  License , then the standard reports will can't  using to running reports with Batch jobs function in Dynamics AX 2009.

 so, I have a good Idear. just that Using some of x++ code achieve to it.

 

Wrote by Jimmy xie on Feb 24th 2011

Main code below as:

1)Batch Running reports

void runReport(QVS_BatchManageReportLine  ReportLine)
{
    #WinAPI
    Args                args;
    SysReportRun        reportRun;
    Str 500             AttachmentPath;
    System.Exception    ex;
    reportname          reportname = ReportLine.ObjectName;
;
    if(ReportLine.ActivedCondition && ReportLine.Condition01 && (ReportLine.Condition01 != "1" || ReportLine.Condition01 != "0"))
        AttachmentPath = WinAPI::getFolderPath(#CSIDL_Personal) + "\\" +  reportName2Pname(reportname) +
                         ReportLine.Condition01 +  ReportLine.FileFormat;
    else
        AttachmentPath = WinAPI::getFolderPath(#CSIDL_Personal) + '\\' + reportName2Pname(reportname)  + ReportLine.FileFormat;//ReportLine.FileFormat - > ".PDF";

    if(WinAPI::fileExists(AttachmentPath))
        WinAPI::deleteFile(AttachmentPath);
    try
    {
        setprefix("Run report ... " + reportName2Pname(reportname));
        args = new Args();
        args.name(reportname);
        args.record(ReportLine);
        //reportRun = new ReportRun(args,'');

        reportRun = classFactory.reportRunClass(args);

        reportRun.setTarget(PrintMedium::File);
        reportRun.printJobSettings().preferredTarget(PrintMedium::File);
        //ReportLine.PrintFormat - > PrintFormat::PDF
        reportRun.printJobSettings().format(ReportLine.PrintFormat);
        reportRun.printJobSettings().preferredFileFormat(ReportLine.PrintFormat);
        reportRun.printJobSettings().fileName(AttachmentPath);
        reportRun.printJobSettings().warnIfFileExists(False);
        reportRun.printJobSettings().suppressScalingMessage(True);
        reportRun.query().interactive(false);
        reportRun.report().interactive(false);
        reportRun.run();
    }
    catch (Exception::CLRError)
    {
        ex = CLRInterop::getLastException();
        throw Error(strfmt('Running the report %1 generic %2!',reportname,ex.ToString()));
    }
    catch (Exception::CodeAccessSecurity)
    {
        info("Code Access Security Error");
        throw Error(strfmt('Running the report %1 generic CodeAccessSecurity!',reportname));
    }
    catch (Exception::Internal)  // This exception handler was the Magic Sauce!!
    {
        ex = CLRInterop::getLastException();
        if (ex)
            error(ex.ToString());
        else
            error("Internal Error");
    }
    catch (Exception::Error)
    {
        error("None of it worked (generic Exception)");
        throw Error(strfmt('Running the report %1 generic error!',reportname));
    }
}

2)Send email for attachment

void sendEmail(QVS_BatchManageReportHeader  Header)
{
    #WinAPI
    QVS_ProcessLongStr              _ProcessLongStr;
    SysMailer   mailer              = new SysMailer();
    SysEmailParameters parameters   = SysEmailParameters::find();
    QVS_BatchManageReportLine       ReportLine;

    List                            listTo,listCC;
    ListEnumerator                  leTo,leCC;
    Str 60                          CurMail;
    Str 150                         CurReceivedName;
    Name                            curUserName;
    str 500                         AttachmentPath;
    InteropPermission               interopPermission;
    System.Exception                ex;

;
    curUserName = (select firstonly UserInfo where UserInfo.id == curUserId()).Name;

    try
    {
        interopPermission = new InteropPermission(InteropKind::ComInterop);
        interopPermission.assert();

        if (parameters.SMTPRelayServerName)
            mailer.SMTPRelayServer(parameters.SMTPRelayServerName);
        else
            mailer.SMTPRelayServer(parameters.SMTPServerIPAddress);

        CurMail = parameters.SMTPUserName;
        if(!CurMail)
            CurMail = sysUserInfo::find(curUserId()).Email;
        if (!CurMail)
            CurMail = "dynax@qvsglobal.com.cn";
        if(CurMail)
            mailer.fromAddress(CurMail);

        //Attachment
        while select ReportLine where ReportLine.RelationId == Header.RelationId
            && ReportLine.ObjectName
        {
            if(strlrtrim(ReportLine.ObjectName))
            {
                if(ReportLine.ActivedCondition && ReportLine.Condition01 && (ReportLine.Condition01 != "1" || ReportLine.Condition01 != "0"))
                    AttachmentPath = WinAPI::getFolderPath(#CSIDL_Personal) + "\\" +  reportName2Pname(ReportLine.ObjectName) +
                                     ReportLine.Condition01 +  ReportLine.FileFormat;
                else
                    AttachmentPath = WinAPI::getFolderPath(#CSIDL_Personal) + '\\' + reportName2Pname(ReportLine.ObjectName)  + ReportLine.FileFormat;
                if(WinAPI::fileExists(AttachmentPath))
                    mailer.attachments().add(AttachmentPath);
            }
        }

        //Send to
        _ProcessLongStr = new QVS_ProcessLongStr();
        _ProcessLongStr.ProcessMulitList(Header.Sendto,";\n");
        listTo  = _ProcessLongStr.parmList();
        leTo    = listTo.getEnumerator();
        while(leTo.moveNext())
        {
            if(strlrtrim(leTo.current()))
            {
                mailer.tos().appendAddress(leTo.current());
                if(!CurReceivedName)
                    CurReceivedName =  subStr(leTo.current(),0,strScan(leTo.current(),'@',1,StrLen(leTo.current()))-2);
                else
                    CurReceivedName += ',' + subStr(leTo.current(),0,strScan(leTo.current(),'@',1,StrLen(leTo.current()))-2);
            }

        }

        //CC
        _ProcessLongStr = new QVS_ProcessLongStr();
        _ProcessLongStr.ProcessMulitList(Header.CCTo,";\n");
        listCC = _ProcessLongStr.parmList();
        leCC   = listCC.getEnumerator();

        while(leCC.moveNext())
        {
            if(strlrtrim(leCC.current()))
            {
                mailer.ccs().appendAddress(leCC.current());
                /*
                if(!CurReceivedName)
                    CurReceivedName =  subStr(leCC.current(),0,strScan(leCC.current(),'@',1,StrLen(leCC.current()))-1);
                else
                    CurReceivedName += ',' + subStr(leCC.current(),0,strScan(leCC.current(),'@',1,StrLen(leCC.current()))-1);
                */
            }
        }

        if(Header.SubJect)
            mailer.subject(Header.SubJect);
        else
            mailer.subject("Batch Job Run To Report");
        if(Header.Body)
            mailer.htmlBody(strfmt("<font size=2 face=Arial>%1</font>",Header.Body)
                           );

        else
            mailer.htmlBody('<B><font color= "#36648B">'+
                            'Hi ' + CurReceivedName + ',' +
                            '<br><p>    ' +
                            'This email and Attachment is an automatically  sent to you,</br>' +
                            '<br>    ' +
                            'It was send by the ERP system batch function generates report.</br>' +
                           // '<br>    ' +
                           // 'Please be informed that!'+
                           // '</br>
                            '</p></font></B>'+
                            '<font color = "blue">' +
                            'Best Regards,' +
                            '<br>' + curUserName +
                            '</br></font></br>');

        mailer.sendMail();
    }
    catch (Exception::CLRError)
    {
        ex = CLRInterop::getLastException();
        info(ex.ToString());
    }
    catch (Exception::CodeAccessSecurity)
    {
        info("Code Access Security Error");
    }
    catch (Exception::Internal)  // This exception handler was the Magic Sauce!!
    {
        ex = CLRInterop::getLastException();
        if (ex)
            info(ex.ToString());
        else
            info("Internal Error");
    }
    catch (Exception::Error)
    {
        info("None of it worked (generic Exception)");
        throw Error('Send the report Attachment Error!');
    }
}

3)store reports attachment.

void UpdateLogFile(QVS_BatchManageReportHeader  Header)
{
    BinData                     binData = new BinData();
    QVS_BatchJobRunToReportLog  Log;
    QVS_BatchManageReportLine   Line;
    filePath                    AttachmentPath;
    #WinAPI
;
    while select Line where Line.RelationId == Header.RelationId
        && Line.ObjectName != ""
    {
        Log.clear();
        if(Line.ActivedCondition && Line.Condition01 && (Line.Condition01 != "1" || Line.Condition01 != "0"))
            AttachmentPath = WinAPI::getFolderPath(#CSIDL_Personal) + "\\" +  reportName2Pname(Line.ObjectName) +
                             Line.Condition01 +  Line.FileFormat;
        else
            AttachmentPath = WinAPI::getFolderPath(#CSIDL_Personal) + '\\' + reportName2Pname(Line.ObjectName)  + Line.FileFormat;
        ttsbegin;
        Log = QVS_BatchJobRunToReportLog::find(Header.PrjId,Line.LineNum,true);
        if(Log && WinAPI::fileExists(AttachmentPath))
        {
            binData.loadFile(AttachmentPath);
            Log.file            = binData.getData();
            Log.PrintFormat     = Line.PrintFormat;
            Log.Fileformat      = Line.Fileformat;
            Log.FilePath        = AttachmentPath;
            Log.update();
        }
        ttscommit;
        sleep(5000);
        if(WinAPI::fileExists(AttachmentPath))
            WinAPI::deleteFile(AttachmentPath);
    }

}