Run multiple report in D365fo x++

Run multiple report in D365fo x++

using System.IO.Compression; class DSAQMCustAccountStatementV2Controller extends SrsReportRunController { public static void main(Args _args) { DSAQMCustAccountStatementV2Contract inputContractV2 = new DSAQMCustAccountStatementV2Contract(); DSAQMCustAccountStatementV2Controller mainController = new DSAQMCustAccountStatementV2Controller(); mainController.parmArgs(_args); mainController.parmShowDialog(true); mainController.parmReportName(ssrsReportStr(DSAQMCustAccountStatementV2, Report)); mainController.parmLoadFromSysLastValue(false); mainController.startOperation(); } public void runReport() { DSAQMCustAccountStatementV2Contract inputContract = this.parmReportContract().parmRdpContract() as DSAQMCustAccountStatementV2Contract; if(inputContract.parmPrintPDFOption() == DSAQMPrintPDFOption::SinglePdf) { super(); } else { List customerList; ListEnumerator listEnumerator; SRSPrintDestinationSettings settings; Map map; List salesman = inputContract.ParmSalesman(); if(salesman.elements()) { List salesmanCustomer = DSAQMCustAccountStatementV2Controller::getsalesman(salesman, inputContract); inputContract.ParmcustomerList(salesmanCustomer); } map = new Map(Types::String, Types::Class); settings = this.parmReportContract().parmPrintSettings(); customerList = inputContract.ParmcustomerList(); listEnumerator = customerList.getEnumerator(); if(customerList.elements()) { while (listEnumerator.moveNext()) { DSAQMCustAccountStatementV2Controller controller = this; controller.parmShowDialog(false); DSAQMCustAccountStatementV2Contract custContract = inputContract; custContract.parmCustomer(listEnumerator.current()); custContract.parmPrintPDFOption(DSAQMPrintPDFOption::SinglePdf); custContract.parmCustomerType(DSAQMCustomerType::SingleCustomer); 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,DSAQMCustAccountStatementV2Contract _inputContract) { List customerList = new List(Types::String); List uniquecustomerList = new List(Types::String); Set customeruniqueSet = new Set(Types::String); Query query = new Query(); QueryBuildDataSource qbdsCustTable, qbdsSalesTable, qbdsHcmWorker; QueryBuildFieldList qbfl; ListEnumerator enumerator; str value; DSAQMAccountType AccountType = _inputContract.ParmDSAQMAccountType(); if(AccountType == DSAQMAccountType::OrderAccount) { 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); } } if(AccountType == DSAQMAccountType::InvoiceAccount) { Query query2 = new Query(); QueryBuildDataSource qbdsCustTable2, qbdsSalesTable2, qbdsHcmWorker2; QueryBuildFieldList qbfl2; qbdsCustTable2 = query2.addDataSource(tableNum(CustTable)); qbdsSalesTable2 = qbdsCustTable2.addDataSource(tableNum(SalesTable)); qbdsSalesTable2.relations(false); qbdsSalesTable2.joinMode(JoinMode::InnerJoin); qbdsSalesTable2.addLink(fieldNum(CustTable, AccountNum), fieldNum(SalesTable, InvoiceAccount)); qbdsHcmWorker2 = qbdsSalesTable2.addDataSource(tableNum(HcmWorker)); qbdsHcmWorker2.relations(false); qbdsHcmWorker2.joinMode(JoinMode::InnerJoin); qbdsHcmWorker2.addLink(fieldNum(SalesTable, WorkerSalesResponsible), fieldNum(HcmWorker, RecId)); qbdsHcmWorker2.addRange(fieldNum(HcmWorker, PersonnelNumber)).value(con2StrUnlimited(list2Con(_salesman))); qbdsCustTable2.orderMode(OrderMode::GroupBy); qbdsCustTable2.addGroupByField(fieldNum(CustTable, AccountNum)); QueryRun QueryRun2 = new QueryRun(query2); while(QueryRun2.next()) { CustTable custTable = QueryRun2.get(tableNum(custTable)); customerList.addEnd(custTable.AccountNum); } } enumerator = customerList.getEnumerator(); while (enumerator.moveNext()) { value = enumerator.current(); customeruniqueSet.add(value); } SetEnumerator setEnumerator = customeruniqueSet.getEnumerator(); while (setEnumerator.moveNext()) { uniquecustomerList.addEnd(setEnumerator.current()); } return uniquecustomerList; } }

Comments

Popular posts from this blog

D365FO – AX – X++ –Refresh, Reread, Research, and ExecuteQuery

Create Inventory Journal through Code in D365FO X++

SalesLine Reservation in D365fo x++