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

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++