我将描述我正在努力实现的目标,并且对如何设计解决方案的任何架构和技术建议表示赞赏。
我正在开发一款应用程序,该应用程序需要允许最终用户从一组有限的数据中创建临时报告。这些是我想要克服的全球障碍:
报告设计和元模型
最终用户应该能够通过报告向导,该向导包含以下步骤:
这是商业应用程序的常见问题,SugarCRM就是一个很好的例子。
我想要定义一个描述报告的自定义元模型。 应用程序使用NHibernate作为ORM,其想法是使用Criteria API构建报表查询,因此元模型应包含查询的所有必要数据(投影,连接,过滤器,顺序和按表达式分组)。是否有一个我可以适应这种解决方案的元模型的例子?
对于技术方面,存在以下问题:
浏览现有数据模型
如何从数据模型中提取字段和关系?首先考虑使用反射,但由于用户可以向实体添加自定义字段(不会更改实体类),因此这不是解决方案。剩下的是数据库本身或NHibernate映射文件。 Nhibernate是否公开API或手动XML查询是唯一的选择?
举报呈现
同时渲染报告也是一个问题。报告必须在运行时设计,但据我所知,rdlc无法实现。这种方法有哪些替代方案? 避免使用纯HTML格式的rdlc和渲染?还有其他框架吗?
对于实现这些功能并可用作灵感的开源(c#,java)项目的建议也是受欢迎的。
答案 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.ClassMappings
和Configuration.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/