0

我将描述我正在努力实现的目标,并感谢任何关于如何设计解决方案的架构和技术建议。

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

报告设计和元模型

最终用户应该能够完成由以下步骤组成的报告向导:

  1. 选择报告根(实体是所有关系的根,例如投诉)
  2. 在根实体的属性上创建过滤器
  3. 在与根实体(例如客户、用户)相关的其他实体的属性上创建过滤器
  4. 选择报告表的列(从跨选定关系的所有列的联合中)
  5. 选择排序表达式
  6. 选择分组表达式
  7. 保存报告

这在商业应用程序中很常见,SugarCRM 就是一个很好的例子。

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

技术方面存在以下问题:

浏览现有数据模型

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

报告呈现

此外,呈现报告也是一个问题。报告必须在运行时设计,但据我所知,rdlc 无法做到这一点。这种方法有哪些替代方法?避免 rdlc 并以纯 HTML 呈现?还有其他框架吗?

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

4

2 回答 2

2

报告设计和元模型

数据模型需要关联路径、列名和列索引

例如

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)最重要的是PropertyNamesGetPropertyValue(obj, name, mode.Poco)

报告呈现

我在这里帮不上忙

于 2012-11-29T12:51:44.103 回答
1

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

于 2012-11-29T12:51:11.097 回答