自定义Ad-hoc报告体系结构

时间:2012-11-29 12:18:46

标签: c# nhibernate architecture reporting metamodel

我将描述我正在努力实现的目标,并且对如何设计解决方案的任何架构和技术建议表示赞赏。

我正在开发一款应用程序,该应用程序需要允许最终用户从一组有限的数据中创建临时报告。这些是我想要克服的全球障碍:

报告设计和元模型

最终用户应该能够通过报告向导,该向导包含以下步骤:

  1. 选择报告根(实体是所有关系的根,例如投诉)
  2. 在根实体的属性上创建过滤器
  3. 在与根实体相关的其他实体的属性上创建过滤器(例如,客户,用户)
  4. 选择报告表的列(来自所选关系中所有列的并集)
  5. 选择排序表达式
  6. 选择分组表达
  7. 保存报告
  8. 这是商业应用程序的常见问题,SugarCRM就是一个很好的例子。

    我想要定义一个描述报告的自定义元模型。 应用程序使用NHibernate作为ORM,其想法是使用Criteria API构建报表查询,因此元模型应包含查询的所有必要数据(投影,连接,过滤器,顺序和按表达式分组)。是否有一个我可以适应这种解决方案的元模型的例子?

    对于技术方面,存在以下问题:

    浏览现有数据模型

    如何从数据模型中提取字段和关系?首先考虑使用反射,但由于用户可以向实体添加自定义字段(不会更改实体类),因此这不是解决方案。剩下的是数据库本身或NHibernate映射文件。 Nhibernate是否公开API或手动XML查询是唯一的选择?

    举报呈现

    同时渲染报告也是一个问题。报告必须在运行时设计,但据我所知,rdlc无法实现。这种方法有哪些替代方案? 避免使用纯HTML格式的rdlc和渲染?还有其他框架吗?

    对于实现这些功能并可用作灵感的开源(c#,java)项目的建议也是受欢迎的。

2 个答案:

答案 0 :(得分:2)

报告设计和元模型

Datamodel需要关联路径,列名和列索引

e.g。

class Report
{
    public Layout Layout { get; set; }
    public string EntityTypeFullName { get; set; }
    /// each Filter is a compare on one Property
    public ICollection<Filter> Filters { get; }
    public IList<Column> Columns { get; }
}

class Column
{
    public string HeaderText { get; set; }

    /// e.g. Contract.User.Name
    public string AssociationPath { get; set; }
}

// in code
var query = session.CreateCriteria(EntityTypeFullName);
// recursive method which adds simple properties as Restrictions and calls itself
// with query.CreateCriteria(referencePropertyName, Filters.Select(CropAssociationPath));
AddFilter(query, report.Filters)

浏览现有数据模型

NHibernate通过Configuration.ClassMappingsConfiguration.GetClassMapping(Type)或有用的反射优化访问方式公开详细的元数据,并通过ISessionFactory.GetClassMetadata(Type)公开PropertyNames GetPropertyValue(obj, name, mode.Poco),{{1}}

报告呈现

我在这里无法帮助

答案 1 :(得分:1)

可以使用PdfReport创建临时报告。 PdfReport是一个代码优先的报告引擎,它建立在iTextSharp和EPPlus库之上。 它兼容.NET 3.5+ Web和Windows应用程序。 PdfReport支持从数据表到内存强类型列表的各种数据源,而不需要数据库:http://pdfreport.codeplex.com/