PDF & Zip file generation for report through code at runtime in D365fo x++
PDF & Zip file generation for report through code at runtime in D365fo x++
using System.IO.Compression; class DSAQMCustAccountStatementV2Controller extends SrsReportRunController { public static void main(Args _args) { DSAQMCustAccountStatementV2Controller mainController = new DSAQMCustAccountStatementV2Controller(); mainController.parmArgs(_args); mainController.parmShowDialog(true); mainController.parmReportName(ssrsReportStr(DSAQMCustAccountStatementV2, Report)); mainController.parmLoadFromSysLastValue(false); if(mainController.prompt()) { mainController.parmReportContract(); mainController.prePromptModifyContract(); // for Saleman DSAQMCustAccountStatementV2Contract inputContract = mainController.parmReportContract().parmRdpContract() as DSAQMCustAccountStatementV2Contract; List salesman = inputContract.ParmSalesman(); if(salesman.elements()) { List salesmanCustomer = DSAQMCustAccountStatementV2Controller::getsalesman(salesman); inputContract.ParmcustomerList(salesmanCustomer); } //Form Customer Map map = new Map(Types::String, Types::Class); SRSPrintDestinationSettings settings = mainController.parmReportContract().parmPrintSettings(); List customerList = inputContract.ParmcustomerList(); ListEnumerator listEnumerator = customerList.getEnumerator(); if(customerList.elements()) { while (listEnumerator.moveNext()) { DSAQMCustAccountStatementV2Controller controller = mainController; controller.parmShowDialog(false); DSAQMCustAccountStatementV2Contract custContract = inputContract; custContract.parmCustomer(listEnumerator.current()); controller.parmReportContract().parmRdpContract(custContract); if(settings.printMediumType() == SRSPrintMediumType::File) { CustTable CustTable = CustTable::find(custContract.parmCustomer()); System.IO.MemoryStream mstream = DSAQMCustAccountStatementV2Controller::getFileStreams(controller, strFmt("%1-%2.pdf", CustTable.AccountNum, CustTable.name())); map.insert(strFmt("%1-%2.pdf", CustTable.AccountNum, CustTable.name()), mstream); } else { controller.startOperation(); } } if(map.elements()) {DSAQMCustAccountStatementV2Controller::createZipFile(map);} } else { throw error(strFmt("No customer found!")); } } } public static System.IO.MemoryStream getFileStreams(DSAQMCustAccountStatementV2Controller controller, Filename fileName) { Array arrayFiles; SRSProxy srsProxy; Map reportParametersMap; SRSPrintDestinationSettings settings; System.Byte[] reportBytes = new System.Byte[0](); SRSReportRunService srsReportRunService = new SrsReportRunService(); SRSReportExecutionInfo executionInfo = new SRSReportExecutionInfo(); Microsoft.Dynamics.AX.Framework.Reporting.Shared.ReportingService.ParameterValue[] parameterValueArray; // Provide printer settings settings = controller.parmReportContract().parmPrintSettings(); settings.printMediumType(SRSPrintMediumType::File); settings.fileName(fileName); settings.fileFormat(SRSReportFileFormat::PDF); // Below is a part of code responsible for rendering the report controller.parmReportContract().parmReportServerConfig(SRSConfiguration::getDefaultServerConfiguration()); controller.parmReportContract().parmReportExecutionInfo(executionInfo); srsReportRunService.getReportDataContract(controller.parmreportcontract().parmReportName()); srsReportRunService.preRunReport(controller.parmreportcontract()); reportParametersMap = srsReportRunService.createParamMapFromContract(controller.parmReportContract()); parameterValueArray = SrsReportRunUtil::getParameterValueArray(reportParametersMap); srsProxy = SRSProxy::constructWithConfiguration(controller.parmReportContract().parmReportServerConfig()); // Actual rendering to byte array reportBytes = srsproxy.renderReportToByteArray(controller.parmreportcontract().parmreportpath(), parameterValueArray, settings.fileFormat(), settings.deviceinfo()); System.IO.MemoryStream mstream = new System.IO.MemoryStream(reportBytes); return mstream; } public static void createZipFile(Map _cStoreErrorData) { MapEnumerator mapEnumerator = _cStoreErrorData.getEnumerator(); if (_cStoreErrorData.elements() > 0) { using(System.IO.MemoryStream zipStream = new System.IO.MemoryStream()) { using(System.IO.Compression.ZipArchive archive = new System.IO.Compression.ZipArchive(zipStream, System.IO.Compression.ZipArchiveMode::Create, true)) { while(mapEnumerator.moveNext()) { ZipArchiveEntry dataFileEntry = archive.CreateEntry(mapEnumerator.currentKey()); using (System.IO.Stream dataFileEntryStream = dataFileEntry.Open()) { System.IO.Stream stream = mapEnumerator.currentValue(); stream.CopyTo(dataFileEntryStream); } } } File::SendFileToUser(zipStream, 'Account Statement V2' + '.zip'); } } } public static List getsalesman(List _salesman) { List customerList = new List(Types::String); Query query = new Query(); QueryBuildDataSource qbdsCustTable, qbdsSalesTable, qbdsHcmWorker; QueryBuildFieldList qbfl; qbdsCustTable = query.addDataSource(tableNum(CustTable)); qbdsSalesTable = qbdsCustTable.addDataSource(tableNum(SalesTable)); qbdsSalesTable.relations(false); qbdsSalesTable.joinMode(JoinMode::InnerJoin); qbdsSalesTable.addLink(fieldNum(CustTable, AccountNum), fieldNum(SalesTable, CustAccount)); qbdsHcmWorker = qbdsSalesTable.addDataSource(tableNum(HcmWorker)); qbdsHcmWorker.relations(false); qbdsHcmWorker.joinMode(JoinMode::InnerJoin); qbdsHcmWorker.addLink(fieldNum(SalesTable, WorkerSalesResponsible), fieldNum(HcmWorker, RecId)); qbdsHcmWorker.addRange(fieldNum(HcmWorker, PersonnelNumber)).value(con2StrUnlimited(list2Con(_salesman))); qbdsCustTable.orderMode(OrderMode::GroupBy); qbdsCustTable.addGroupByField(fieldNum(CustTable, AccountNum)); QueryRun QueryRun = new QueryRun(query); while(QueryRun.next()) { CustTable custTable = QueryRun.get(tableNum(custTable)); customerList.addEnd(custTable.AccountNum); } return customerList; } }
Comments
Post a Comment