/// <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)); }
/// <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); }
/////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// /// <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; }
/// <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 } } }
/////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////// /// <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> /// 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); } }
/// <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> /// 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); }
/// <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); }