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); } }