Browse Source

Grouping can work with =Fields!FieldToGroup

pull/15/head^2
peterforstmeier 14 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 @@ -62,8 +62,10 @@ namespace ICSharpCode.Reports.Addin.ReportWizard
private void CreateGrouping(ReportSettings settings)
{
if (!String.IsNullOrEmpty(this.Grouping)){
GroupColumn g = new GroupColumn(Grouping,1,System.ComponentModel.ListSortDirection.Ascending);
if (!String.IsNullOrEmpty(this.Grouping))
{
string s = "=Fields!" + this.Grouping;
GroupColumn g = new GroupColumn(s,1,System.ComponentModel.ListSortDirection.Ascending);
settings.GroupColumnsCollection.Add(g);
}
}
@ -165,11 +167,6 @@ namespace ICSharpCode.Reports.Addin.ReportWizard @@ -165,11 +167,6 @@ namespace ICSharpCode.Reports.Addin.ReportWizard
this.queryParameters = null;
}
// if (this.SharpQueryProcedure != null) {
// this.SharpQueryProcedure = null;
// }
}
// Release unmanaged resources.

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

@ -37,5 +37,6 @@ namespace ICSharpCode.Reports.Core @@ -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; @@ -8,6 +8,8 @@ using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using ICSharpCode.Reports.Expressions.ReportingLanguage;
/// <summary>
/// BaseClass for all Datahandling Strategies
/// </summary>
@ -51,6 +53,7 @@ namespace ICSharpCode.Reports.Core { @@ -51,6 +53,7 @@ namespace ICSharpCode.Reports.Core {
}
this.ReportSettings = reportSettings;
this.IndexList = new IndexList("IndexList");
ExpressionEvaluator = new ExpressionEvaluatorFacade (null);
}
#endregion
@ -84,7 +87,8 @@ namespace ICSharpCode.Reports.Core { @@ -84,7 +87,8 @@ namespace ICSharpCode.Reports.Core {
IndexList childList = null;
foreach (BaseComparer element in list)
{
string groupValue = element.ObjectArray[0].ToString();
string groupValue = ExtractValue (element);
if (compVal != groupValue) {
childList = new IndexList();
GroupComparer gc = CreateGroupHeader(element);
@ -93,9 +97,24 @@ namespace ICSharpCode.Reports.Core { @@ -93,9 +97,24 @@ namespace ICSharpCode.Reports.Core {
} else {
CreateGroupedChildren(childList,element);
}
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 { @@ -246,6 +265,8 @@ namespace ICSharpCode.Reports.Core {
public IndexList IndexList {get; set;}
public IExpressionEvaluatorFacade ExpressionEvaluator {get;private set;}
#endregion
#region IDisposeable

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

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

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

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Data;
using ICSharpCode.Reports.Core;
using ICSharpCode.Reports.Core.Interfaces;
using SimpleExpressionEvaluator;
@ -53,6 +54,27 @@ namespace ICSharpCode.Reports.Expressions.ReportingLanguage @@ -53,6 +54,27 @@ namespace ICSharpCode.Reports.Expressions.ReportingLanguage
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)
{

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

@ -7,6 +7,7 @@ @@ -7,6 +7,7 @@
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Data;
using ICSharpCode.Reports.Core;
using ICSharpCode.Reports.Core.BaseClasses;
using ICSharpCode.Reports.Core.Globals;
@ -30,39 +31,73 @@ namespace SimpleExpressionEvaluator.Compilation.Functions.ReportingService @@ -30,39 +31,73 @@ namespace SimpleExpressionEvaluator.Compilation.Functions.ReportingService
public override string Evaluate(SimpleExpressionEvaluator.Evaluation.IExpressionContext context)
{
ISinglePage singlePage = context.ContextObject as SinglePage;
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 item = dataRow.Find(variable.VariableName);
string retval;
if (item != null) {
retval = item.Value.ToString();
} else
{
} else {
retval = GlobalValues.UnkownFunctionMessage(variable.VariableName);
Console.WriteLine("");
Console.WriteLine("ExpressionEvaluatorFacade.FieldReference");
Console.WriteLine("Field<{0}> not found",variable.VariableName);
Console.WriteLine("");
WriteLogmessage(variable);
}
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 string ExtractAggregateValue(AggregationState aggregationState)
{
return aggregationState.GetValue<string>("value");
}
protected override string ExtractAggregateValue(AggregationState aggregationState)
{
return aggregationState.GetValue<string>("value");
}
}
}

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

@ -5,6 +5,8 @@ using System; @@ -5,6 +5,8 @@ using System;
using System.Collections;
using System.ComponentModel;
using ICSharpCode.Reports.Expressions.ReportingLanguage;
namespace ICSharpCode.Reports.Core{
public interface IDataViewStrategy:IEnumerator,IDisposable{
@ -31,6 +33,7 @@ namespace ICSharpCode.Reports.Core{ @@ -31,6 +33,7 @@ namespace ICSharpCode.Reports.Core{
int Count {get;}
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 @@ -40,6 +40,34 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.TableStrategy
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
[Test]
@ -168,6 +196,7 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.TableStrategy @@ -168,6 +196,7 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.TableStrategy
private IDataNavigator PrepareStringGrouping ()
{
GroupColumn gc = new GroupColumn("GroupItem",1,ListSortDirection.Ascending);
gc.GroupExpression = "=Substring('GroupItem',0,5)";
ReportSettings rs = new ReportSettings();
rs.GroupColumnsCollection.Add(gc);
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 @@ -149,7 +149,7 @@ namespace ICSharpCode.Reports.Core.Test.DataManager.TableStrategy
#region Substring
[Test]
public void EnumSubStrings()
public void Enum_With_SubStrings()
{
ReportSettings rs = new ReportSettings();
IDataManager dm = ICSharpCode.Reports.Core.DataManager.CreateInstance(this.table,rs);

Loading…
Cancel
Save