Browse Source

Grouping can work with =Fields!FieldToGroup

pull/15/head^2
peterforstmeier 15 years ago
parent
commit
f022528c78
  1. 11
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportStructure.cs
  2. 1
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/GroupColumn.cs
  3. 25
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/BaseListStrategy.cs
  4. 65
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/TableStrategy.cs
  5. 22
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/ExpressionEvaluatorFacade.cs
  6. 67
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/ReportingService/FieldReference.cs
  7. 5
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IDataViewStrategy.cs
  8. 29
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/DataManager/TableStragy/GroupTableFixture.cs
  9. 2
      src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/DataManager/TableStragy/TableDataManagerFixture.cs

11
src/AddIns/Misc/Reports/ICSharpCode.Reports.Addin/Project/ReportWizard/ReportStructure.cs

@ -62,8 +62,10 @@ namespace ICSharpCode.Reports.Addin.ReportWizard
private void CreateGrouping(ReportSettings settings) private void CreateGrouping(ReportSettings settings)
{ {
if (!String.IsNullOrEmpty(this.Grouping)){ if (!String.IsNullOrEmpty(this.Grouping))
GroupColumn g = new GroupColumn(Grouping,1,System.ComponentModel.ListSortDirection.Ascending); {
string s = "=Fields!" + this.Grouping;
GroupColumn g = new GroupColumn(s,1,System.ComponentModel.ListSortDirection.Ascending);
settings.GroupColumnsCollection.Add(g); settings.GroupColumnsCollection.Add(g);
} }
} }
@ -165,11 +167,6 @@ namespace ICSharpCode.Reports.Addin.ReportWizard
this.queryParameters = null; this.queryParameters = null;
} }
// if (this.SharpQueryProcedure != null) {
// this.SharpQueryProcedure = null;
// }
} }
// Release unmanaged resources. // Release unmanaged resources.

1
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/BaseClasses/GroupColumn.cs

@ -37,5 +37,6 @@ namespace ICSharpCode.Reports.Core
} }
} }
public string GroupExpression {get;set;}
} }
} }

25
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/BaseListStrategy.cs

@ -8,6 +8,8 @@ using System.Collections.ObjectModel;
using System.ComponentModel; using System.ComponentModel;
using System.Linq; using System.Linq;
using ICSharpCode.Reports.Expressions.ReportingLanguage;
/// <summary> /// <summary>
/// BaseClass for all Datahandling Strategies /// BaseClass for all Datahandling Strategies
/// </summary> /// </summary>
@ -51,6 +53,7 @@ namespace ICSharpCode.Reports.Core {
} }
this.ReportSettings = reportSettings; this.ReportSettings = reportSettings;
this.IndexList = new IndexList("IndexList"); this.IndexList = new IndexList("IndexList");
ExpressionEvaluator = new ExpressionEvaluatorFacade (null);
} }
#endregion #endregion
@ -84,7 +87,8 @@ namespace ICSharpCode.Reports.Core {
IndexList childList = null; IndexList childList = null;
foreach (BaseComparer element in list) foreach (BaseComparer element in list)
{ {
string groupValue = element.ObjectArray[0].ToString(); string groupValue = ExtractValue (element);
if (compVal != groupValue) { if (compVal != groupValue) {
childList = new IndexList(); childList = new IndexList();
GroupComparer gc = CreateGroupHeader(element); GroupComparer gc = CreateGroupHeader(element);
@ -93,9 +97,24 @@ namespace ICSharpCode.Reports.Core {
} else { } else {
CreateGroupedChildren(childList,element); CreateGroupedChildren(childList,element);
} }
compVal = groupValue; compVal = groupValue;
} }
//ShowIndexList(IndexList); ShowIndexList(IndexList);
}
string ExtractValue(BaseComparer element)
{
string val = String.Empty;
GroupColumn gc = element.ColumnCollection[0] as GroupColumn;
if (gc != null) {
val = element.ObjectArray[0].ToString();
var ex = gc.GroupExpression;
// Console.WriteLine("{0} - {1}",val,ex);
var sss = ((ExpressionEvaluatorFacade)ExpressionEvaluator).Evaluate(ex,val);
}
return val;
} }
@ -246,6 +265,8 @@ namespace ICSharpCode.Reports.Core {
public IndexList IndexList {get; set;} public IndexList IndexList {get; set;}
public IExpressionEvaluatorFacade ExpressionEvaluator {get;private set;}
#endregion #endregion
#region IDisposeable #region IDisposeable

65
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/DataManager/ListStrategy/TableStrategy.cs

@ -16,7 +16,6 @@ namespace ICSharpCode.Reports.Core
internal class TableStrategy: BaseListStrategy,IEnumerable<BaseComparer> internal class TableStrategy: BaseListStrategy,IEnumerable<BaseComparer>
{ {
private DataTable table; private DataTable table;
private IExpressionEvaluatorFacade expressionEvaluator;
public TableStrategy(DataTable table,ReportSettings reportSettings):base(reportSettings) public TableStrategy(DataTable table,ReportSettings reportSettings):base(reportSettings)
{ {
@ -24,7 +23,7 @@ namespace ICSharpCode.Reports.Core
throw new ArgumentNullException("table"); throw new ArgumentNullException("table");
} }
this.table = table; this.table = table;
expressionEvaluator = new ExpressionEvaluatorFacade (null);
} }
#region Methods #region Methods
@ -32,7 +31,6 @@ namespace ICSharpCode.Reports.Core
public override void Bind() public override void Bind()
{ {
base.Bind(); base.Bind();
if (base.ReportSettings.GroupColumnsCollection.Count > 0) { if (base.ReportSettings.GroupColumnsCollection.Count > 0) {
this.Group(); this.Group();
} else { } else {
@ -88,31 +86,28 @@ namespace ICSharpCode.Reports.Core
var dataItem = item as BaseDataItem; var dataItem = item as BaseDataItem;
if (dataItem != null) { if (dataItem != null) {
dataItem.DBValue = ExtractValue(row,dataItem).ToString(); dataItem.DBValue = ExtractValue(row,dataItem).ToString();
//dataItem.DBValue = row[dataItem.ColumnName].ToString();
} }
return; return;
} }
} }
} }
object ExtractValue(DataRow row,BaseDataItem item) object ExtractValue(DataRow row,BaseDataItem item)
{ {
var val = row[item.ColumnName]; object val = null;
if (item.Text.StartsWith("=")) {
// string s = expressionEvaluator ( if (item.Text.StartsWith("="))
return val; {
return ((ExpressionEvaluatorFacade)base.ExpressionEvaluator).Evaluate(item.Text,row);
} else { } else {
return val; return row[item.ColumnName];;
} }
return null;
} }
public override CurrentItemsCollection FillDataRow(int pos) public override CurrentItemsCollection FillDataRow(int pos)
{ {
//this.table.Rows[pos];
DataRow row = (DataRow) CurrentFromPosition(pos); DataRow row = (DataRow) CurrentFromPosition(pos);
return FillCurrentRow(row); return FillCurrentRow(row);
} }
@ -170,11 +165,10 @@ namespace ICSharpCode.Reports.Core
public override void Group () public override void Group ()
{ {
base.Group(); base.Group();
IndexList sortedIndexList = new IndexList("group"); IndexList groupedIndexList = new IndexList("group");
sortedIndexList = this.BuildSortIndex (ReportSettings.GroupColumnsCollection); groupedIndexList = this.BuildSortIndex (ReportSettings.GroupColumnsCollection);
// ShowIndexList(sortedIndexList); // ShowIndexList(sortedIndexList);
BuildGroup(sortedIndexList); BuildGroup(groupedIndexList);
} }
#endregion #endregion
@ -187,20 +181,18 @@ namespace ICSharpCode.Reports.Core
for (int rowIndex = 0; rowIndex < this.table.Rows.Count; rowIndex++){ for (int rowIndex = 0; rowIndex < this.table.Rows.Count; rowIndex++){
DataRow rowItem = this.table.Rows[rowIndex]; DataRow rowItem = this.table.Rows[rowIndex];
object[] values = new object[col.Count]; object[] values = new object[col.Count];
for (int criteriaIndex = 0; criteriaIndex < col.Count; criteriaIndex++){ for (int criteriaIndex = 0; criteriaIndex < col.Count; criteriaIndex++)
AbstractColumn c = (AbstractColumn)col[criteriaIndex]; {
object value = rowItem[c.ColumnName]; object value = ExtractColumnValue(rowItem,col,criteriaIndex);
if (value != null && value != DBNull.Value){ if (value != null && value != DBNull.Value)
if (!(value is IComparable)){ {
throw new InvalidOperationException(value.ToString());
}
values[criteriaIndex] = value; values[criteriaIndex] = value;
} else { } else {
values[criteriaIndex] = DBNull.Value; values[criteriaIndex] = DBNull.Value;
} }
} }
arrayList.Add(new SortComparer(col, rowIndex, values)); arrayList.Add(new SortComparer(col, rowIndex, values));
} }
@ -216,6 +208,27 @@ namespace ICSharpCode.Reports.Core
} }
object ExtractColumnValue(DataRow row,ColumnCollection col, int criteriaIndex)
{
AbstractColumn c = (AbstractColumn)col[criteriaIndex];
int pos = c.ColumnName.IndexOf("!");
object val = null;
if (pos > 0)
{
val = ((ExpressionEvaluatorFacade)ExpressionEvaluator).Evaluate(c.ColumnName,row);
}
else
{
val = row[c.ColumnName];
}
if (!(val is IComparable)){
throw new InvalidOperationException(val.ToString());
}
return val;
}
private IndexList IndexBuilder(SortColumnCollection col) private IndexList IndexBuilder(SortColumnCollection col)
{ {
IndexList arrayList = new IndexList(); IndexList arrayList = new IndexList();

22
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/ExpressionEvaluatorFacade.cs

@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System; using System;
using System.Data;
using ICSharpCode.Reports.Core; using ICSharpCode.Reports.Core;
using ICSharpCode.Reports.Core.Interfaces; using ICSharpCode.Reports.Core.Interfaces;
using SimpleExpressionEvaluator; using SimpleExpressionEvaluator;
@ -53,6 +54,27 @@ namespace ICSharpCode.Reports.Expressions.ReportingLanguage
return expression; return expression;
} }
public string Evaluate (string expression, object row)
{
try {
if (CanEvaluate(expression)) {
IExpression compiled = compiler.CompileExpression<string>(expression);
this.context.ContextObject =row;
if (compiled != null) {
return (compiled.Evaluate(context)).ToString();
}
}
} catch (Exception e) {
expression = e.Message;
Console.WriteLine("");
Console.WriteLine("ExpressionEvaluatorFacade.Evaluate");
Console.WriteLine(e.Message);
Console.WriteLine("");
}
return expression;
}
private static bool CanEvaluate (string expressionn) private static bool CanEvaluate (string expressionn)
{ {

67
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Expressions/SimpleExpressionEvaluator/Compilation/Functions/ReportingService/FieldReference.cs

@ -7,6 +7,7 @@
* To change this template use Tools | Options | Coding | Edit Standard Headers. * To change this template use Tools | Options | Coding | Edit Standard Headers.
*/ */
using System; using System;
using System.Data;
using ICSharpCode.Reports.Core; using ICSharpCode.Reports.Core;
using ICSharpCode.Reports.Core.BaseClasses; using ICSharpCode.Reports.Core.BaseClasses;
using ICSharpCode.Reports.Core.Globals; using ICSharpCode.Reports.Core.Globals;
@ -30,39 +31,73 @@ namespace SimpleExpressionEvaluator.Compilation.Functions.ReportingService
public override string Evaluate(SimpleExpressionEvaluator.Evaluation.IExpressionContext context) public override string Evaluate(SimpleExpressionEvaluator.Evaluation.IExpressionContext context)
{ {
ISinglePage singlePage = context.ContextObject as SinglePage;
Variable variable = Arguments[0] as Variable; Variable variable = Arguments[0] as Variable;
string retval = string.Empty;
ISinglePage singlePage = context.ContextObject as SinglePage;
if (singlePage != null)
{
return ExtractValueFromSinglePage(ref variable, singlePage, ref retval);
}
if (singlePage.IDataNavigator.CurrentRow > -1) { DataRow row = context.ContextObject as DataRow;
if (row != null) {
return ExtractValueFromDataRow(ref variable, retval, row);
}
return variable.VariableName ;
}
string ExtractValueFromSinglePage(ref Variable variable, ISinglePage singlePage, ref string retval)
{
if (singlePage.IDataNavigator.CurrentRow > -1)
{
var dataRow = singlePage.IDataNavigator.GetDataRow; var dataRow = singlePage.IDataNavigator.GetDataRow;
var item = dataRow.Find(variable.VariableName); var item = dataRow.Find(variable.VariableName);
string retval;
if (item != null) { if (item != null) {
retval = item.Value.ToString(); retval = item.Value.ToString();
} else } else {
{
retval = GlobalValues.UnkownFunctionMessage(variable.VariableName); retval = GlobalValues.UnkownFunctionMessage(variable.VariableName);
WriteLogmessage(variable);
Console.WriteLine("");
Console.WriteLine("ExpressionEvaluatorFacade.FieldReference");
Console.WriteLine("Field<{0}> not found",variable.VariableName);
Console.WriteLine("");
} }
return retval; return retval;
} }
return variable.VariableName ; return variable.VariableName;
}
string ExtractValueFromDataRow(ref Variable variable, string retval, DataRow row)
{
var item = row[variable.VariableName];
if (item != null) {
retval = item.ToString();
} else {
retval = GlobalValues.UnkownFunctionMessage(variable.VariableName);
WriteLogmessage(variable);
}
return retval;
}
void WriteLogmessage(Variable variable)
{
Console.WriteLine("");
Console.WriteLine("ExpressionEvaluatorFacade.FieldReference");
Console.WriteLine("Field<{0}> not found",variable.VariableName);
Console.WriteLine("");
} }
protected override void AggregateValue(object value, AggregationState aggregationState, params object[] args) protected override void AggregateValue(object value, AggregationState aggregationState, params object[] args)
{ {
} }
protected override string ExtractAggregateValue(AggregationState aggregationState) protected override string ExtractAggregateValue(AggregationState aggregationState)
{ {
return aggregationState.GetValue<string>("value"); return aggregationState.GetValue<string>("value");
} }
} }
} }

5
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Project/Interfaces/IDataViewStrategy.cs

@ -5,6 +5,8 @@ using System;
using System.Collections; using System.Collections;
using System.ComponentModel; using System.ComponentModel;
using ICSharpCode.Reports.Expressions.ReportingLanguage;
namespace ICSharpCode.Reports.Core{ namespace ICSharpCode.Reports.Core{
public interface IDataViewStrategy:IEnumerator,IDisposable{ public interface IDataViewStrategy:IEnumerator,IDisposable{
@ -31,6 +33,7 @@ namespace ICSharpCode.Reports.Core{
int Count {get;} int Count {get;}
int CurrentPosition {get;set;} int CurrentPosition {get;set;}
IExpressionEvaluatorFacade ExpressionEvaluator {get;}
} }
} }

29
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/DataManager/TableStragy/GroupTableFixture.cs

@ -40,6 +40,34 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.TableStrategy
Assert.That(availableFieldsCollection.Count,Is.GreaterThan(0)); Assert.That(availableFieldsCollection.Count,Is.GreaterThan(0));
} }
#region Group by Expression
[Test]
public void Group_By_Substring()
{
GroupColumn gc = new GroupColumn("=Fields!first",1,ListSortDirection.Ascending);
gc.GroupExpression = "=Substring('first',0,3)";
ReportSettings rs = new ReportSettings();
rs.GroupColumnsCollection.Add(gc);
IDataManager dataManager = ICSharpCode.Reports.Core.DataManager.CreateInstance(this.table,rs);
var dataNavigator = dataManager.GetNavigator;
while (dataNavigator.MoveNext()) {
if (dataNavigator.HasChildren)
{
var childNavigator = dataNavigator.GetChildNavigator;
do
{
Assert.That(dataNavigator.HasChildren,Is.True);
DataRow r = dataNavigator.Current as DataRow;
// string v2 = r["last"].ToString() + " GroupVal :" + r[3].ToString();
// Console.WriteLine(v2);
}
while (childNavigator.MoveNext());
}
}
}
#endregion
#region Group by String #region Group by String
[Test] [Test]
@ -168,6 +196,7 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.TableStrategy
private IDataNavigator PrepareStringGrouping () private IDataNavigator PrepareStringGrouping ()
{ {
GroupColumn gc = new GroupColumn("GroupItem",1,ListSortDirection.Ascending); GroupColumn gc = new GroupColumn("GroupItem",1,ListSortDirection.Ascending);
gc.GroupExpression = "=Substring('GroupItem',0,5)";
ReportSettings rs = new ReportSettings(); ReportSettings rs = new ReportSettings();
rs.GroupColumnsCollection.Add(gc); rs.GroupColumnsCollection.Add(gc);
IDataManager dm = ICSharpCode.Reports.Core.DataManager.CreateInstance(this.table,rs); IDataManager dm = ICSharpCode.Reports.Core.DataManager.CreateInstance(this.table,rs);

2
src/AddIns/Misc/Reports/ICSharpCode.Reports.Core/Test/ICSharpCode.Reports.Core.Test/DataManager/TableStragy/TableDataManagerFixture.cs

@ -149,7 +149,7 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.TableStrategy
#region Substring #region Substring
[Test] [Test]
public void EnumSubStrings() public void Enum_With_SubStrings()
{ {
ReportSettings rs = new ReportSettings(); ReportSettings rs = new ReportSettings();
IDataManager dm = ICSharpCode.Reports.Core.DataManager.CreateInstance(this.table,rs); IDataManager dm = ICSharpCode.Reports.Core.DataManager.CreateInstance(this.table,rs);

Loading…
Cancel
Save