Bläddra i källkod

Improved OptimiseData handling within Reports

frogsoftware 4 dagar sedan
förälder
incheckning
6c88ed2a24
2 ändrade filer med 31 tillägg och 5 borttagningar
  1. 2 1
      InABox.Core/DataModel/DataModel.cs
  2. 29 4
      inabox.wpf/Reports/ReportUtils.cs

+ 2 - 1
InABox.Core/DataModel/DataModel.cs

@@ -215,7 +215,8 @@ namespace InABox.Core
 
         public abstract string Name { get; }
 
-        public IEnumerable<DataRelation> Relations => _relationships.Select(x => x.AsDataRelation()).ToArray();
+        public IEnumerable<IDataModelRelationship> Relations => _relationships; //.Select(x => x.AsDataRelation()).ToArray();
+        //public IEnumerable<IDataRelation> Relations => _relationships.Select(x => x.AsDataRelation()).ToArray();
         public IEnumerable<DataTable> Tables => _tables.Select(x => x.Value.Table.ToDataTable(x.Key));
         public IEnumerable<DataTable> DefaultTables => _tables.Where(x => x.Value.IsDefault).Select(x => x.Value.Table.ToDataTable(x.Key));
         public IEnumerable<string> DefaultTableNames => _tables.Where(x => x.Value.IsDefault).Select(x => x.Key);

+ 29 - 4
inabox.wpf/Reports/ReportUtils.cs

@@ -145,9 +145,13 @@ namespace InABox.Wpf.Reports
             {
                 var modelTable = data.GetDataModelTable(tableName);
                 var dataSource = report.GetDataSource(tableName);
+                var childkeys = data.Relations.Where(x => x.ChildTable.Equals(tableName))?.Select(x=>x.ChildColumn).ToArray() ?? [];
+                var parentkeys = data.Relations.Where(x => x.ParentTable.Equals(tableName))?.Select(x=>x.ParentColumn).ToArray() ?? [];
+                
                 if (dataSource != null && modelTable.Type is not null)
                 {
-                    var columnNames = CoreUtils.GetColumnNames(modelTable.Type, x => true);
+                    var allcolumns = CoreUtils.GetColumnNames(modelTable.Type, x => true);
+                    var columnNames = allcolumns.ToList();
                     if (template.OptimiseData)
                     {
                         // DataColumn="(table).(field)" or [(table).(field)]
@@ -155,12 +159,32 @@ namespace InABox.Wpf.Reports
                         var matches = Regex.Matches(templaterdl, pattern);
                         var usedcolumns = matches
                             .Cast<Match>()
-                            .Select(m => m.Groups["value"].Value)
+                            .Select(m => m.Groups["value"].Value.Split('.').TakeLast(2))
+                            .Where(x=>x.Count() == 2 && x.First().Equals(tableName))
+                            .Select(x=>string.Join('.',x))
                             .ToList();
                         columnNames = columnNames
-                            .Where(x=>x.Equals("ID") || usedcolumns.Contains($"{modelTable.Type.Name}.{x.Replace(".","_")}"))
+                            .Where(x=>usedcolumns.Contains($"{tableName}.{x.Replace(".","_")}"))
                             .ToList();
-                        
+                        if (columnNames.Count > 0)
+                        {
+                            if (!columnNames.Contains("ID"))
+                                columnNames.Add("ID");
+                            foreach (var childkey in childkeys)
+                            {
+                                var childcol = allcolumns.FirstOrDefault(x => x.Replace('.', '_').Equals(childkey));
+                                if (childcol != null && !columnNames.Contains(childcol))
+                                    columnNames.Add(childcol);
+                            }
+
+                            foreach (var parentkey in parentkeys)
+                            {
+                                var parentcol = allcolumns.FirstOrDefault(x => x.Replace('.', '_').Equals(parentkey));
+                                if (parentcol != null && !columnNames.Contains(parentcol))
+                                    columnNames.Add(parentcol);
+                            }
+                        }
+
                     }
                     else
                     {
@@ -178,6 +202,7 @@ namespace InABox.Wpf.Reports
                         }
                     }
                     modelTable.Columns = Columns.None(modelTable.Type).Add(columnNames);
+                    modelTable.ShouldLoad = modelTable.Columns.Count > 0;
                 }
             }