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
Post a Comment