Exemple #1
0
        /// <summary>
        /// Does exception routine.
        /// </summary>
        /// <param name="message">Head message text.</param>
        /// <param name="exception">Exception object.</param>
        /// <param name="generator">Report generator.</param>
        /// <param name="description">Report state description.</param>
        /// <returns>Exception status message.</returns>
        private MessageDetail _DoExceptionRoutine(string message,
                                                  Exception exception,
                                                  ReportsGenerator generator,
                                                  ReportStateDescription description)
        {
            Debug.Assert(!string.IsNullOrEmpty(message));
            Debug.Assert(null != exception);
            Debug.Assert(null != generator);
            Debug.Assert(null != description);

            Logger.Error(exception);

            generator.DisposeReport(description);

            string messageReason = (exception is OutOfMemoryException) ?
                                   App.Current.FindString("ReportPreviewReasonOutOfMemory") :
                                   exception.Message;

            if (!string.IsNullOrEmpty(messageReason))
            {
                message = string.Format(MESSAGE_FORMAT, message, messageReason);
            }

            return(new MessageDetail(MessageType.Error, message));
        }
Exemple #2
0
        /// <summary>
        /// Saves operation.
        /// </summary>
        /// <param name="generator">Reports generator.</param>
        /// <param name="descriptions">Report state description.</param>
        private void _DoSave(ReportsGenerator generator, IList <ReportStateDescription> descriptions)
        {
            Debug.Assert(null != generator);
            Debug.Assert(null != descriptions);
            Debug.Assert(0 < descriptions.Count);

            try
            {
                string exportDir = null;
                string fileName  = null;
                string fileExt   = null;

                // get export settings
                if (1 == descriptions.Count)
                {   // get settings for one file
                    _GetExportOutputSettings(descriptions[0].ReportName,
                                             out exportDir,
                                             out fileName,
                                             out fileExt);
                }
                else
                {   // get settings for files
                    Debug.Assert(1 < descriptions.Count);
                    _GetExportOutputSettings(out exportDir, out fileExt);
                }

                // export reports
                if (!string.IsNullOrEmpty(exportDir) && !string.IsNullOrEmpty(fileExt))
                {
                    IDocumentExport exporter = ReportsHelpers.GetExporterByFileExtension(fileExt);
                    // do save export files
                    List <MessageDetail> details = new List <MessageDetail>();
                    for (int index = 0; index < descriptions.Count; ++index)
                    {
                        ReportStateDescription description = descriptions[index];
                        MessageDetail          detail      = _DoSaveReport(exporter, exportDir, fileName, fileExt,
                                                                           generator, description);
                        if (null != detail)
                        {
                            details.Add(detail);
                        }
                    }

                    // export done - show messages
                    string infoMessage  = App.Current.FindString("ReportPreviewTopLevelSaveDone");
                    string errorMessage = App.Current.FindString("ReportPreviewTopLevelSaveFail");
                    _PopulateMessages(errorMessage, infoMessage, details);
                }
            }
            catch (Exception ex)
            {
                _DoSaveInitExceptionRoutine(ex);
            }
        }
        /// <summary>
        /// Disposes all report core resources.
        /// </summary>
        /// <param name="description">Created report description.</param>
        public void DisposeReport(ReportStateDescription description)
        {
            Debug.Assert(null != description);

            ActiveReport3 rpt = description.Report;

            if (null != rpt)
            {
                description.Report = null;
                _DisposeReport(ref rpt);

                GC.Collect();
                GC.WaitForFullGCApproach();
            }
        }
        /// <summary>
        /// Initiates report description.
        /// </summary>
        /// <param name="sourceFileName">Data source file full name.</param>
        /// <param name="reportName">Report name.</param>
        /// <param name="info">Report template info.</param>
        /// <returns>Created report description.</returns>
        ReportStateDescription _InitReportDescription(string sourceFileName,
                                                      string reportName,
                                                      ReportInfo info)
        {
            Debug.Assert(!string.IsNullOrEmpty(sourceFileName));
            Debug.Assert(!string.IsNullOrEmpty(reportName));
            Debug.Assert(null != info);

            var description = new ReportStateDescription();

            description.SourceFilePath = sourceFileName;
            description.ReportName     = reportName;
            description.ReportInfo     = info;
            description.Report         = null;

            return(description);
        }
Exemple #5
0
        ///////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Starts reports operation.
        /// </summary>
        /// <param name="type">Selected reports operation.</param>
        /// <param name="reports">Reports to processing.</param>
        public void DoProcess(ProcessType type, IList <ReportStateDescription> reports)
        {
            Debug.Assert(null != _reports);
            Debug.Assert(null != reports);

            // dispose report only if it not selected for this operation and not loked
            ReportsGenerator generator = App.Current.ReportGenerator;

            for (int index = 0; index < _reports.Count; ++index)
            {
                ReportStateDescription report = _reports[index];
                if (!reports.Contains(report) && !report.IsLocked)
                {
                    generator.DisposeReport(report);
                }
            }

            // start process
            if (0 < _reports.Count)
            {
                switch (type)
                {
                case ProcessType.Preview:
                    _DoPreview(generator, reports);
                    break;

                case ProcessType.Print:
                    _DoPrint(generator, reports);
                    break;

                case ProcessType.Save:
                    _DoSave(generator, reports);
                    break;

                default:
                {
                    Debug.Assert(false);         // NOTE: not supported
                    break;
                }
                }
            }
        }
        public PreviewForm(Form parentForm, ReportStateDescription description, bool disposeResponsible)
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            this.MdiParent = parentForm;
            if (null == description.Report)
            {
                ReportsGenerator generator = App.Current.ReportGenerator;
                generator.RunReport(description);
            }
            description.IsLocked = true;

            arvMain.Document = description.Report.Document;
            this.Text = description.Report.Document.Name;

            _description = description;
            _disposeResponsible = disposeResponsible;
        }
Exemple #7
0
        /// <summary>
        /// Saves report routine.
        /// </summary>
        /// <param name="exporter">Exporter object.</param>
        /// <param name="exportDir">Export directory.</param>
        /// <param name="fileName">Export report file name (can be null).</param>
        /// <param name="fileExt">Export file extension.</param>
        /// <param name="generator">Report generator.</param>
        /// <param name="description">Report state descriiption.</param>
        /// <returns>Status messages.</returns>
        private MessageDetail _DoSaveReport(IDocumentExport exporter,
                                            string exportDir,
                                            string fileName,
                                            string fileExt,
                                            ReportsGenerator generator,
                                            ReportStateDescription description)
        {
            Debug.Assert(null != exporter);
            Debug.Assert(null != generator);
            Debug.Assert(null != description);
            Debug.Assert((null != exportDir) && (null != fileExt));

            MessageDetail detail       = null;
            string        fullFileName = null;

            try
            {
                string filename = (string.IsNullOrEmpty(fileName)) ?
                                  _ValidateFileName(description.ReportName) : fileName;
                fullFileName = Path.Combine(exportDir, filename + fileExt);

                if (null == description.Report)
                {
                    generator.RunReport(description);
                }

                exporter.Export(description.Report.Document, fullFileName);
                string message = App.Current.GetString("ReportPreviewSaveDoneFormat",
                                                       description.ReportName, fullFileName);
                detail = new MessageDetail(MessageType.Information, message);
            }
            catch (Exception ex)
            {
                string message = App.Current.GetString("ReportPreviewSaveFailFormat",
                                                       description.ReportName, fullFileName);
                detail = _DoExceptionRoutine(message, ex, generator, description);
            }

            return(detail);
        }
        /// <summary>
        /// Runs report core to real report creation (call after <c>CreateReportsAsync</c>).
        /// </summary>
        /// <param name="description">Created report description.</param>
        public void RunReport(ReportStateDescription description)
        {
            Debug.Assert(null != description);
            Debug.Assert(null == description.Report);

            using (WorkingStatusHelper.EnterBusyState(null))
            {
                try
                {
                    // load report structure
                    var rpt = _LoadReportStructure(description.ReportInfo.TemplatePath);

                    // update connection string
                    var ds = (DataDynamics.ActiveReports.DataSources.OleDBDataSource)rpt.DataSource;
                    ds.ConnectionString = _UpdateConnectionString(description.SourceFilePath,
                                                                  ds.ConnectionString);
                    string connectionString = ds.ConnectionString;

                    // set sub reports
                    Section section = rpt.Sections[REPORT_SECTION_NAME_DETAIL];
                    _InitSubReports(description.ReportInfo.SubReports, connectionString, section);

                    // run report building
                    rpt.Document.Name = description.ReportName;
                    rpt.Run();

                    description.Report = rpt;

                    GC.Collect();
                    GC.WaitForFullGCApproach();
                }
                catch
                {
                    DisposeReport(description);

                    throw; // exception
                }
            }
        }
Exemple #9
0
        ///////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Does report preview.
        /// </summary>
        /// <param name="generator">Report generator object.</param>
        /// <param name="description">Report state description.</param>
        /// <returns>Operation status message.</returns>
        private MessageDetail _DoPreview(ReportsGenerator generator,
                                         ReportStateDescription description)
        {
            Debug.Assert(null != generator);
            Debug.Assert(null != description);

            MessageDetail detail = null;

            try
            {
                PreviewForm viewerForm = new PreviewForm(null, description, false);
                viewerForm.Show();
            }
            catch (Exception ex)
            {
                string message = App.Current.GetString("ReportPreviewPreviewFailFormat",
                                                       description.ReportName);
                detail = _DoExceptionRoutine(message, ex, generator, description);
            }

            return(detail);
        }
Exemple #10
0
        /// <summary>
        /// Does print operation.
        /// </summary>
        /// <param name="generator">Report generator object.</param>
        /// <param name="descriptions">Report state description list.</param>
        private void _DoPrint(ReportsGenerator generator,
                              IList <ReportStateDescription> descriptions)
        {
            Debug.Assert(null != generator);
            Debug.Assert(null != descriptions);
            Debug.Assert(0 < descriptions.Count);

            List <MessageDetail> details = new List <MessageDetail>();

            bool multiPrint = (1 < descriptions.Count);

            bool isCanceled  = false;
            int  copiesCount = 1;

            for (int index = 0; index < descriptions.Count; ++index)
            {
                ReportStateDescription description = descriptions[index];
                MessageDetail          detail      = _DoPrint(generator, description, (0 == index),
                                                              ref copiesCount, ref isCanceled);
                if (null != detail)
                {
                    details.Add(detail);
                }

                if (isCanceled)
                {
                    break;
                }
            }

            if (!isCanceled)
            {
                string errorMessage = App.Current.FindString("ReportPreviewTopLevelPrintFail");
                string infoMessage  = App.Current.FindString("ReportPreviewTopLevelPrintDone");
                _PopulateMessages(errorMessage, infoMessage, details);
            }
        }
Exemple #11
0
        /// <summary>
        /// Does preview reports.
        /// </summary>
        /// <param name="generator">Report generator object.</param>
        /// <param name="descriptions">Report state description list.</param>
        private void _DoPreview(ReportsGenerator generator,
                                IList <ReportStateDescription> descriptions)
        {
            Debug.Assert(null != generator);
            Debug.Assert(null != descriptions);
            Debug.Assert(0 < descriptions.Count);

            var details = new List <MessageDetail>();

            for (int index = 0; index < descriptions.Count; ++index)
            {
                ReportStateDescription description = descriptions[index];
                MessageDetail          detail      = _DoPreview(generator, description);
                if (null != detail)
                {
                    details.Add(detail);
                }
            }

            // populate errors
            if (0 < details.Count)
            {   // NOTE: only error supported
                string statusMessage = null;
                if (1 == details.Count)
                {
                    statusMessage = details[0].Text;
                    App.Current.Messenger.AddMessage(details[0].Type, statusMessage);
                }
                else
                {
                    statusMessage = App.Current.FindString("ReportPreviewTopLevelPreviewFail");
                    App.Current.Messenger.AddMessage(MessageType.Error, statusMessage, details);
                }

                App.Current.MainWindow.StatusBar.SetStatus(_parentPage, statusMessage);
            }
        }
        ///////////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Does report preview.
        /// </summary>
        /// <param name="generator">Report generator object.</param>
        /// <param name="description">Report state description.</param>
        /// <returns>Operation status message.</returns>
        private MessageDetail _DoPreview(ReportsGenerator generator,
                                         ReportStateDescription description)
        {
            Debug.Assert(null != generator);
            Debug.Assert(null != description);

            MessageDetail detail = null;
            try
            {
                PreviewForm viewerForm = new PreviewForm(null, description, false);
                viewerForm.Show();
            }
            catch (Exception ex)
            {
                string message = App.Current.GetString("ReportPreviewPreviewFailFormat",
                                                       description.ReportName);
                detail = _DoExceptionRoutine(message, ex, generator, description);
            }

            return detail;
        }
        /// <summary>
        /// Initiates report description.
        /// </summary>
        /// <param name="sourceFileName">Data source file full name.</param>
        /// <param name="reportName">Report name.</param>
        /// <param name="info">Report template info.</param>
        /// <returns>Created report description.</returns>
        ReportStateDescription _InitReportDescription(string sourceFileName,
                                                      string reportName,
                                                      ReportInfo info)
        {
            Debug.Assert(!string.IsNullOrEmpty(sourceFileName));
            Debug.Assert(!string.IsNullOrEmpty(reportName));
            Debug.Assert(null != info);

            var description = new ReportStateDescription();
            description.SourceFilePath = sourceFileName;
            description.ReportName = reportName;
            description.ReportInfo = info;
            description.Report = null;

            return description;
        }
        /// <summary>
        /// Runs report core to real report creation (call after <c>CreateReportsAsync</c>).
        /// </summary>
        /// <param name="description">Created report description.</param>
        public void RunReport(ReportStateDescription description)
        {
            Debug.Assert(null != description);
            Debug.Assert(null == description.Report);

            using (WorkingStatusHelper.EnterBusyState(null))
            {
                try
                {
                    // load report structure
                    var rpt = _LoadReportStructure(description.ReportInfo.TemplatePath);

                    // update connection string
                    var ds = (DataDynamics.ActiveReports.DataSources.OleDBDataSource)rpt.DataSource;
                    ds.ConnectionString = _UpdateConnectionString(description.SourceFilePath,
                                                                  ds.ConnectionString);
                    string connectionString = ds.ConnectionString;

                    // set sub reports
                    Section section = rpt.Sections[REPORT_SECTION_NAME_DETAIL];
                    _InitSubReports(description.ReportInfo.SubReports, connectionString, section);

                    // run report building
                    rpt.Document.Name = description.ReportName;
                    rpt.Run();

                    description.Report = rpt;

                    GC.Collect();
                    GC.WaitForFullGCApproach();
                }
                catch
                {
                    DisposeReport(description);

                    throw; // exception
                }
            }
        }
        /// <summary>
        /// Disposes all report core resources.
        /// </summary>
        /// <param name="description">Created report description.</param>
        public void DisposeReport(ReportStateDescription description)
        {
            Debug.Assert(null != description);

            ActiveReport3 rpt = description.Report;
            if (null != rpt)
            {
                description.Report = null;
                _DisposeReport(ref rpt);

                GC.Collect();
                GC.WaitForFullGCApproach();
            }
        }
        /// <summary>
        /// Does print report.
        /// </summary>
        /// <param name="generator">Report generator object.</param>
        /// <param name="description">Report state description.</param>
        /// <param name="showPrintDialog">Need show print dialog flag.</param>
        /// <param name="copiesCount">Selecetd copies count.</param>
        /// <param name="isCanceled">Is operation ccancel by user.</param>
        /// <returns>Operation status message.</returns>
        private MessageDetail _DoPrint(ReportsGenerator generator,
                                       ReportStateDescription description,
                                       bool showPrintDialog,
                                       ref int copiesCount,
                                       ref bool isCanceled)
        {
            Debug.Assert(null != generator);
            Debug.Assert(null != description);

            isCanceled = false;
            MessageDetail detail = null;
            try
            {
                // generate report
                if (null == description.Report)
                    generator.RunReport(description);

                // init print dialog
                DDActiveReports.Document.Document document = description.Report.Document;
                document.PrintAborted +=
                    new DDActiveReports.Document.PrintAbortedEventHandler(Document_PrintAborted);
                DDActiveReports.Document.Printer printer = document.Printer;
                printer.PrinterSettings.PrintRange = PrintRange.SomePages;
                printer.PrinterSettings.FromPage = 1;
                printer.PrinterSettings.ToPage = description.Report.Document.Pages.Count;
                printer.PrinterSettings.PrintRange = PrintRange.AllPages;

                // select application printer
                ArcLogistics.App.PrinterSettingsStore settings = App.Current.PrinterSettingsStore;
                if (!string.IsNullOrEmpty(settings.PrinterName))
                {
                    description.Report.Document.Printer.PrinterName = settings.PrinterName;
                    description.Report.Document.Printer.DefaultPageSettings = settings.PageSettings;
                }

                // do printing
                if (!description.Report.Document.Print(showPrintDialog, true))
                    isCanceled = true;
                else
                {
                    if (showPrintDialog)
                    {
                        // store copies count
                        copiesCount = description.Report.Document.Printer.PrinterSettings.Copies;

                        // store printer settings in application
                        var prntSettings = description.Report.Document.Printer.PrinterSettings;
                        if (!string.IsNullOrEmpty(prntSettings.PrinterName))
                            settings.StoreSetting(prntSettings.PrinterName,
                                                  prntSettings.DefaultPageSettings);
                    }

                    string message = App.Current.GetString("ReportPreviewPrintDoneFormat",
                                                           description.ReportName);
                    detail = new MessageDetail(MessageType.Information, message);
                }
            }
            catch (Exception ex)
            {
                string message = App.Current.GetString("ReportPreviewPrintFailFormat",
                                                       description.ReportName);
                detail = _DoExceptionRoutine(message, ex, generator, description);
            }

            return detail;
        }
        /// <summary>
        /// Saves report routine.
        /// </summary>
        /// <param name="exporter">Exporter object.</param>
        /// <param name="exportDir">Export directory.</param>
        /// <param name="fileName">Export report file name (can be null).</param>
        /// <param name="fileExt">Export file extension.</param>
        /// <param name="generator">Report generator.</param>
        /// <param name="description">Report state descriiption.</param>
        /// <returns>Status messages.</returns>
        private MessageDetail _DoSaveReport(IDocumentExport exporter,
                                            string exportDir,
                                            string fileName,
                                            string fileExt,
                                            ReportsGenerator generator,
                                            ReportStateDescription description)
        {
            Debug.Assert(null != exporter);
            Debug.Assert(null != generator);
            Debug.Assert(null != description);
            Debug.Assert((null != exportDir) && (null != fileExt));

            MessageDetail detail = null;
            string fullFileName = null;
            try
            {
                string filename = (string.IsNullOrEmpty(fileName)) ?
                                    _ValidateFileName(description.ReportName) : fileName;
                fullFileName = Path.Combine(exportDir, filename + fileExt);

                if (null == description.Report)
                    generator.RunReport(description);

                exporter.Export(description.Report.Document, fullFileName);
                string message = App.Current.GetString("ReportPreviewSaveDoneFormat",
                                                       description.ReportName, fullFileName);
                detail = new MessageDetail(MessageType.Information, message);
            }
            catch (Exception ex)
            {
                string message = App.Current.GetString("ReportPreviewSaveFailFormat",
                                                       description.ReportName, fullFileName);
                detail = _DoExceptionRoutine(message, ex, generator, description);
            }

            return detail;
        }
        /// <summary>
        /// Does exception routine.
        /// </summary>
        /// <param name="message">Head message text.</param>
        /// <param name="exception">Exception object.</param>
        /// <param name="generator">Report generator.</param>
        /// <param name="description">Report state description.</param>
        /// <returns>Exception status message.</returns>
        private MessageDetail _DoExceptionRoutine(string message,
                                                  Exception exception,
                                                  ReportsGenerator generator,
                                                  ReportStateDescription description)
        {
            Debug.Assert(!string.IsNullOrEmpty(message));
            Debug.Assert(null != exception);
            Debug.Assert(null != generator);
            Debug.Assert(null != description);

            Logger.Error(exception);

            generator.DisposeReport(description);

            string messageReason = (exception is OutOfMemoryException) ?
                                        App.Current.FindString("ReportPreviewReasonOutOfMemory") :
                                        exception.Message;

            if (!string.IsNullOrEmpty(messageReason))
                message = string.Format(MESSAGE_FORMAT, message, messageReason);

            return new MessageDetail(MessageType.Error, message);
        }
Exemple #19
0
        /// <summary>
        /// Does print report.
        /// </summary>
        /// <param name="generator">Report generator object.</param>
        /// <param name="description">Report state description.</param>
        /// <param name="showPrintDialog">Need show print dialog flag.</param>
        /// <param name="copiesCount">Selecetd copies count.</param>
        /// <param name="isCanceled">Is operation ccancel by user.</param>
        /// <returns>Operation status message.</returns>
        private MessageDetail _DoPrint(ReportsGenerator generator,
                                       ReportStateDescription description,
                                       bool showPrintDialog,
                                       ref int copiesCount,
                                       ref bool isCanceled)
        {
            Debug.Assert(null != generator);
            Debug.Assert(null != description);

            isCanceled = false;
            MessageDetail detail = null;

            try
            {
                // generate report
                if (null == description.Report)
                {
                    generator.RunReport(description);
                }

                // init print dialog
                DDActiveReports.Document.Document document = description.Report.Document;
                document.PrintAborted +=
                    new DDActiveReports.Document.PrintAbortedEventHandler(Document_PrintAborted);
                DDActiveReports.Document.Printer printer = document.Printer;
                printer.PrinterSettings.PrintRange = PrintRange.SomePages;
                printer.PrinterSettings.FromPage   = 1;
                printer.PrinterSettings.ToPage     = description.Report.Document.Pages.Count;
                printer.PrinterSettings.PrintRange = PrintRange.AllPages;

                // select application printer
                ArcLogistics.App.PrinterSettingsStore settings = App.Current.PrinterSettingsStore;
                if (!string.IsNullOrEmpty(settings.PrinterName))
                {
                    description.Report.Document.Printer.PrinterName         = settings.PrinterName;
                    description.Report.Document.Printer.DefaultPageSettings = settings.PageSettings;
                }

                // do printing
                if (!description.Report.Document.Print(showPrintDialog, true))
                {
                    isCanceled = true;
                }
                else
                {
                    if (showPrintDialog)
                    {
                        // store copies count
                        copiesCount = description.Report.Document.Printer.PrinterSettings.Copies;

                        // store printer settings in application
                        var prntSettings = description.Report.Document.Printer.PrinterSettings;
                        if (!string.IsNullOrEmpty(prntSettings.PrinterName))
                        {
                            settings.StoreSetting(prntSettings.PrinterName,
                                                  prntSettings.DefaultPageSettings);
                        }
                    }

                    string message = App.Current.GetString("ReportPreviewPrintDoneFormat",
                                                           description.ReportName);
                    detail = new MessageDetail(MessageType.Information, message);
                }
            }
            catch (Exception ex)
            {
                string message = App.Current.GetString("ReportPreviewPrintFailFormat",
                                                       description.ReportName);
                detail = _DoExceptionRoutine(message, ex, generator, description);
            }

            return(detail);
        }