Kaynağa Gözat

Added "OptimiseData" property to ReportTemplate to allow for automatic trimming of datamodel columns based on Report Contents

frogsoftware 1 ay önce
ebeveyn
işleme
a2b4efe2bd

+ 4 - 0
InABox.Core/Reports/ReportTemplate.cs

@@ -29,6 +29,10 @@ namespace InABox.Core.Reports
         [CheckBoxEditor]
         [EditorSequence(5)]
         public bool SelectedRecords { get; set; } = true;
+        
+        [CheckBoxEditor]
+        [EditorSequence(6)]
+        public bool OptimiseData { get; set; } = false;
 
         [NullEditor]
         public string Script { get; set; }

+ 2 - 2
inabox.wpf/Reports/ReportGrid.cs

@@ -33,7 +33,7 @@ namespace InABox.Wpf.Reports
             { Position = DynamicActionColumnPosition.Start });
             ActionColumns.Add(new DynamicImageColumn(Wpf.Resources.save.AsBitmapImage(), ExportClick)
             { Position = DynamicActionColumnPosition.Start });
-
+            
             ActionColumns.Add(new DynamicImageColumn(ScriptImage, ScriptClick));
             ActionColumns.Add(new DynamicImageColumn(Wpf.Resources.pencil.AsBitmapImage(), DesignClick));
             HiddenColumns.Add(x => x.IsRDL);
@@ -43,7 +43,7 @@ namespace InABox.Wpf.Reports
         protected override void DoReconfigure(DynamicGridOptions options)
         {
             base.DoReconfigure(options);
-
+            options.SelectColumns = true;
             options.RecordCount = true;
             options.ShowHelp = true;
         }

+ 28 - 9
inabox.wpf/Reports/ReportUtils.cs

@@ -9,6 +9,7 @@ using System.Drawing.Printing;
 using System.IO;
 using System.Linq;
 using System.Reflection;
+using System.Text.RegularExpressions;
 using System.Windows;
 using System.Windows.Controls;
 using FastReport;
@@ -138,6 +139,8 @@ namespace InABox.Wpf.Reports
             report.LoadFromString(templaterdl);
             report.FileName = template?.Name ?? "";
 
+
+            
             foreach(var tableName in data.TableNames)
             {
                 var modelTable = data.GetDataModelTable(tableName);
@@ -145,18 +148,34 @@ namespace InABox.Wpf.Reports
                 if (dataSource != null && modelTable.Type is not null)
                 {
                     var columnNames = CoreUtils.GetColumnNames(modelTable.Type, x => true);
-                    foreach (var column in dataSource.Columns)
+                    if (template.OptimiseData)
                     {
-                        if(column is FastReport.Data.Column col && !col.Enabled)
+                        // DataColumn="(table).(field)" or [(table).(field)]
+                        var pattern = @"DataColumn=""(?<value>[^""]+)""|\[(?<value>[^\]]+)\]";
+                        var matches = Regex.Matches(templaterdl, pattern);
+                        var usedcolumns = matches
+                            .Cast<Match>()
+                            .Select(m => m.Groups["value"].Value)
+                            .ToList();
+                        columnNames = columnNames
+                            .Where(x=>x.Equals("ID") || usedcolumns.Contains($"{modelTable.Type.Name}.{x.Replace(".","_")}"))
+                            .ToList();
+                        
+                    }
+                    else
+                    {
+                        foreach (var column in dataSource.Columns)
                         {
-                            //columns.Add(col.Name.Replace('_','.'));
-                            columnNames.Remove(col.Name.Replace('_', '.'));
+                            if(column is FastReport.Data.Column col && !col.Enabled)
+                            {
+                                columnNames.Remove(col.Name.Replace('_', '.'));
+                            }
+                            /*if (column is FastReport.Data.Column col && col.DataType != null && col.DataType.IsAssignableTo(typeof(IEnumerable<byte[]>)))
+                            {
+                                col.BindableControl = ColumnBindableControl.Custom;
+                                col.CustomBindableControl = "MultiImageObject";
+                            }*/
                         }
-                        /*if (column is FastReport.Data.Column col && col.DataType != null && col.DataType.IsAssignableTo(typeof(IEnumerable<byte[]>)))
-                        {
-                            col.BindableControl = ColumnBindableControl.Custom;
-                            col.CustomBindableControl = "MultiImageObject";
-                        }*/
                     }
                     modelTable.Columns = Columns.None(modelTable.Type).Add(columnNames);
                 }