行事中有如此三个要求,有N张差异的报表,每张报表对应贰个数据源,总计数据采取内部存款和储蓄器格局,首先在内在里定义了数据源对应实体。总计标准用lamdba表明式式实现,通过工具对单元格举行定义。在达成进程中针对每一张表来写取数字呈现示是很Low的了,取数条件定义都是规则的,总结实现正是一段C#代码,不过要指向不相同的数据源也便是分裂的List<Entity>,通过钻研究开发现经过泛型和反光能够实现。

一.常用控件

金沙注册送58 1文本框:输入文字或表明式

金沙注册送58 2报表:设置表格的种类数,输入数字或表明式

金沙注册送58 3子报表:放置子报表后,系统会活动扩张二个页面,你能够在此页面上设计必要的表格。系统在打字与印刷处理时,先按主报表打字与印刷,当蒙受子报表时会自动转入子报表的页面进行打字与印刷处理,完毕后持续执行主报表打字与印刷的干活,所以大家又称作嵌套报表。

金沙注册送58 4复选框:依照布尔表明式是不是为ture来显示是不是 √

金沙注册送58 5条形码:绑定扫描码,一般Type为Code12八

金沙注册送58 6交叉表:Matrix

金沙注册送58 7页面设置:设置纸张大小及页边距

金沙注册送58 8边框设置:设置是还是不是出示上下左右侧框以及边框线条的安装

金沙注册送58 9边框宽度:下拉三角能够采纳边框宽度设置

非类型化的尺码查询

大家从概念规则查询的根开端,代码如下所示:

var query = session.CreateCriteria<Product>();

NHibernate初学者指南,并做为参数字传送入泛型方法中动用。CreateCriteria方法重返1个兑现了ICriteria接口的靶子。就算获得具有产品的列表,那么大家要求使用接口ICriteria的List<T>方法,如下边包车型客车代码所示:

var products = session.CreateCriteria<Product>().List<Product>();

List<Product>()方法再次回到IList<Product>。和LINQ to
NHibernate相比较,当List方法被调用时查询立时施行。

当然还有3个非泛型的List法国法定义在ICriteria接口上。这几个措施再次来到1个IList类型的靶子。

一.常用控件

 

   
  金沙注册送58 10文本框:输入文字或表明式

   
  金沙注册送58 11报表:设置表格的行列数,输入数字或表明式

     
金沙注册送58 12子报表:放置子报表后,系统会自行扩张3个页面,你能够在此页面上规划供给的报表。系统在打字与印刷处理时,先按主报表打字与印刷,当遇到子报表时会自动转入子报表的页面进
     
行打字与印刷处理,达成后继续执行主报表打印的劳作,所以大家又称作嵌套报表。

   
  金沙注册送58 13复选框:依照布尔表明式是不是为ture来呈现是或不是 √(如性别男女)

   
  金沙注册送58 14条形码:绑定扫描码(如静滴单),1般Type为Code12八 

           
  金沙注册送58 15交叉表:Matrix

     
     
  金沙注册送58 16页面设置:设置纸张大小及页边距

     
     
  金沙注册送58 17边框设置:设置是还是不是出示上下左左边框以及边框线条的设置

     
     
  金沙注册送58 18边框宽度:下拉三角能够选拔边框宽度设置

 

传说字符串获取实体类型

二.常用报表栏

报表标题区(ReportTitle):仅在第三页彰显在纸张的上部。1般用来打字与印刷表格的标题等音信。

报表合计(ReprotSummary):仅映今后具有数据的结尾末尾。一般用于打字与印刷总结消息等。

页眉(PageHeader):展现在每页的最上部。通过设置你能够让它内置报表抬头之上也许之下。1般用于打字与印刷页眉音信等。

数据区:绑定数据源展现数据。

多少首:展现在具备数据源的最上部,仅打字与印刷3回。壹般用来体现相关摘要音信,与页眉的区分是当该页无数据时,数据首的始末不出示且仅体现3次。

数据尾:展现在享有数据源的最下边,仅打字与印刷1回。壹般用于显示全体数据的协议消息。

栏首(ColumnHeader):显示在每页数据源的上部,它在每页均显得。由此一般用来打字与印刷数据源字段的栏目音讯。

栏尾(ColumnHeader):展现在每页数据源的上面,它在每页均展现。一般可用以总计呈现每页数据的页合计新闻。

分组页眉(GroupHeader):用于呈现分组数据,在每一个分组初始展现。

分组页脚(GroupFooter):与群组首一1对应。1般用于显示分组数据的总括音信。

页脚(PageFooter):展现在每页的最底部。一般用于打字与印刷页序等音信。

范围再次来到的记录数

限定查询再次来到的记录数,能够应用Set马克斯Results方法。从数据库中拿走前10个产品,代码如下:

var first10Products = session.CreateCriteria<Product>()
                       .SetMaxResults(10)
                       .List<Product>();

2.常用报表栏

      

报表标题区(ReportTitle):仅在率先页展现在纸张的上部。一般用于打字与印刷表格的标题等新闻。

 

报表合计(ReprotSummary):仅显示在有着数据的最后末尾。1般用来打印计算消息等。

 

页眉(PageHeader):呈现在每页的最上部。通过设置你能够让它放到报表抬头之上可能之下。一般用来打字与印刷页眉新闻等。

 

数据区(data):绑定数据源显示数据。

 

数码首(Header):呈现在具有数据源的最上部,仅打字与印刷3次。1般用来体现相关摘要音讯,与页眉的区分是当该页无数据时,数据首的剧情不显得且仅显示三遍。

 

数据尾(Footer):展现在颇具数据源的最上边,仅打字与印刷3遍。一般用来显示全部数据的磋商音讯。

 

栏首(ColumnHeader):彰显在每页数据源的上部,它在每页均彰显。由此1般用来打字与印刷数据源字段的栏目新闻。

 

栏尾(ColumnHeader):展现在每页数据源的上边,它在每页均显得。1般可用以总结显示每页数据的页合计音讯。

 

分组页眉(GroupHeader):用于体现分组数据,在每一个分组初始突显。

 

分组页脚(GroupFooter):与群组首①壹对应。一般用来显示分组数据的总括消息。

 

页脚(PageFooter):展现在每页的最尾部。一般用来打字与印刷页序等音讯。

 

 1 private Type getEntity(string typeName)
 2 {
 3     var workPath = AppDomain.CurrentDomain.BaseDirectory;
 4     string[] files = Directory.GetFiles(workPath, "XXX.Utils.dll", SearchOption.TopDirectoryOnly);
 5     foreach (string file in files)
 6     {
 7         string ext = file.Substring(file.LastIndexOf("."));
 8         if (ext != ".dll") continue;
 9         try
10         {
11             Assembly asm = Assembly.LoadFile(file);
12             Type[] allTypes = asm.GetTypes();
13             foreach (Type t in allTypes)
14             {
15                 if (t.IsSubclassOf(typeof(XXDataRecord)))
16                 {
17                     if (t.Name.ToUpper().IsSame(typeName.ToUpper()))
18                         return t;
19                 }
20             }
21         }
22         catch
23         {
24             return null;
25         }
26     }
27     return null;
28 }

三.常用功用

筛选记录集

1旦筛选出下架的出品,代码如下所示:

var discontinuedProducts = session.CreateCriteria<Product>()
                           .Add(Restrictions.Eq("Discontinued", true))
                           .List<Product>();

通过给查询添加一个或八个限制条件筛选就完了了。如若大家想获取全数需求再预约的在架产品列表,我们得以选取上边包车型大巴代码:

var discontinuedProducts = session.CreateCriteria<Product>()
                           .Add(Restrictions.Eq("Discontinued", false))
                           .Add(Restrictions.GeProperty("ReorderLevel", "UnitsOnStock"))
                           .List<Product>();

就算那样很利索,不过和LINQ to
NHibernate比较也是非凡简单出错的。倘若把UnitsOnStock写成了UnitSonStock,唯有在运营时才会发现到这一个破绽百出。

除此以外,Restrictions这么些静态类还有为数不少概念筛选标准的有利的措施。

3.常用功用

 

 

一.添加报表栏

将光标置于“设置报表拦”弹出“段编辑器”,再选择足够或删除段。

添加段的时候要注意:

1)选取添加段的岗位,如想添加子数据区,则当选要添加父数据区,点击添加“数据区”即可,如图所示:

金沙注册送58 19金沙注册送58 20金沙注册送58 21

二)若加上的数据区与原数据区平级,任选段,点击添加“数据区”即可,如图所示:

金沙注册送58 22金沙注册送58 23金沙注册送58 24

炫耀记录集

后天让我们谈谈如何映射记录集。那也号称投影。使用Criteria
API未有动用LINQ方便,大家亟须首先定义想要投影的字段。然后,还要定义三个transformer,它将那些值放入到所需的对象项目中,如上面包车型客车代码所示:

var productsLookup = session.CreateCriteria<Product>()
                    .SetProjection(Projections.ProjectionList()
                    .Add(Projections.Property("Id"))
                    .Add(Projections.Property("Name"))
                    )
                    .SetResultTransformer(
                    new AliasToBeanResultTransformer(typeof(NameID)))
                    .List<NameID>();

在上头的代码中,我们利用SetProjection方法定义映射。大家挑选product的Id和Name属性,并将它们放入到NameID类型的对象中。类NameID定义如下:

public class NameID
{
    public int Id { get; set; }
    public string Name { get; set; }
}

大家利用AliasToBeanResultTransformer把询问结果转换为NameID对象的列表。注意目的对象的习性名称必须与投影属性的称呼相称。假设不包容,ProjectionList有三个Add的重载方法,大家能够定义2个别名。这些小名与目的对象的名目相相称。

一.添加报表栏

 

将光标置于“设置报表拦”弹出“段编辑器”,再选取丰裕或删除段。

 

添加段的时候要小心:

 

     1)选用添加段的地点,如想添加子数据区,则当选要添加父数据区,点击添加“数据区”即可,如图所示:

                 
 金沙注册送58 25金沙注册送58 26金沙注册送58 27

       

       二)若加上的数据区与原数据区平级,任选段(除数量区外),点击添加“数据区”即可,如图所示:

                 
 金沙注册送58 28金沙注册送58 29金沙注册送58 30

         

泛型方法定义

贰.添加数据源

选择菜单栏的“数据”,在下拉框中选中“选取数据源”,弹出“选用报表数量”框,里面会列出已经流传的数据源,勾选须要的数据源,点击明确,此时界面左边“数据”列表中即展现当前所选中的数据源,选中数据源,右键选用“查看数据”,即可彰显当前数据源中所含有的数码:

金沙注册送58 31金沙注册送58 32金沙注册送58 33

金沙注册送58 34金沙注册送58 35

排序结果集

排序结果集万分不难。大家只需加上其余一个规则,如下边的代码所示:

var sortedProducts = session.CreateCriteria<Product>()
                    .AddOrder(Order.Asc("Name"))
                    .List<Product>();

以相反的顺序排列产品列表,只需采纳Order类的Desc方法。大家还足以遵照五个属性排序,只需为种种字段添加二个排序条件即可。

二.添加数据源

 

选取菜单栏的“数据”,在下拉框中选中“选取数据源”,弹出“采取报表数量”框,里面会列出已经扩散的数据源,勾选必要的数据源,点击分明,此时界面左边“数据”列表中即呈现当前所选中的数据源,选中数据源,右键选用“查看数据”,即可展现当前数据源中所含有的多寡:

               
  金沙注册送58 36金沙注册送58 37金沙注册送58 38

               
 金沙注册送58 39金沙注册送58 40

 

1 public XXDataMemory BuildDataMemoryPattern<T>(XXParams zb, string id) where T : XXDataRecord, new()

3.添加类别变量

对于一些变量或者取自当前系统,如时间,页码,序号等,此时甄选系统变量中相应的变量即可,如图:

金沙注册送58 41

分组记录集

分组在LINQ提供程序中是独立的不二法门,不过在criteria
API中是影子的一片段。借使我们想遵照Category分组产品和总结各个类别的产品数,大家得以应用上面的询问:

var productsGrouped = session.CreateCriteria<Product>()
                     .SetProjection(Projections.ProjectionList()
                     .Add(Projections.GroupProperty("Category"))
                     .Add(Projections.RowCount(), "Num")
                     )
                    .List();

1经非得依照用户的采纳动态变化查询,criteria
API是最合适的。除外,LINQ to
NHibernate更拥有可读性以及从长时间来看更有可维护性。

三.添加种类变量

对于部分变量或者取自当前系统,如时间,页码,序号等,此时增选系统变量中相应的变量即可,如图:

                                                             
 金沙注册送58 42

 

四.添加集中

对此有个别报表,要求在数据尾添加合计行,此时需求手动添加合计,弹出汇总项编辑器,再在集聚项编辑器中添加汇总数据源。

金沙注册送58 43

在集中名称一栏能够自命名三个商谈名称;

金沙注册送58 44

在“数据列或公式”中得以挑选集中的数据源;

在“总计段中每一列”可以挑选到场汇总的数据区;

在“计算满意下边条件的行”中得以做过滤,在写total时会出现计量某体系型的和,比如总结总人次分在职和离休之和,此时在写total时就须要写限制标准实行过滤。如[Table1.GRXZ]==”1″;如图:

金沙注册送58 45

强类型的尺度查询

NHibernatet
3引进了3个新的职能就是足以行使强类型定义规则查询。为此,QueryOver<T>出席到了ISession接口中。那里,泛型参数T表示大家想询问的实业类型。

利用QueryOver API,大家钦命询问的根,如上边包车型大巴代码所示:

var query = session.QueryOver<Product>();

粗略的拿走具有产品的列表,使用如下所示的询问:

var products = session.QueryOver<Product>().List();

与Criteria API比较,QueryOver不必要钦点重返类型。

四.添加集聚

对此有个别表格,要求在数额尾添加合计行,此时急需手动添加合计,弹出汇总项编辑器,再在集聚项编辑器中添加汇总数据源。

                                     
  金沙注册送58 46

在集中名称一栏能够自命名三个磋商名称;

                                       
 金沙注册送58 47

在“数据列或公式”中得以采纳集中的数据源;

在“总括段中每一列”能够选拔出席汇总的数据区;

在“计算满意上面条件的行”中能够做过滤,在写total时会现身计量某系列型的和,比如总计总人次分在职和离退休之和,此时在写total时就供给写限制标准举办过滤。如[Table1.GRXZ]==”1″;如图:

                                                       
 金沙注册送58 48

调用方法代码

伍.添加过滤、排序、分组

双击数据区,弹出“编辑数据段”,能够进行数据源的采用、排序、过滤。如图:

金沙注册送58 49

范围再次来到的记录数

限制查询重临的记录数,我们得以行使Take方法。这几个查询和LINQ to
NHibernate的查询相似,如上边所示:

var first10Products = session.QueryOver<Product>()
                      .Take(10)
                      .List();

5.添加过滤、排序、分组

双击数据区,弹出“编辑数据段”,可以拓展数据源的选项、排序、过滤。如图:

                                         
 金沙注册送58 50

 

 1 var obj = new GenerateDataHelper(_Param);
 2 Type myGenericClassType = obj.GetType();
 3 //MakeGenericMethod 设置泛型参数类型
 4 MethodInfo mi = myGenericClassType.GetMethod("BuildDataMemoryPattern").MakeGenericMethod(typeEntity);
 5 int count = 0;
 6 //设置调用方法参数
 7 object[] invokeArgs = new object[] { zb, id, count };
 8 //调用
 9 var dt = (DataTable)mi.Invoke(obj, invokeArgs);
10 //获取回返数据
11 recordCount = (int)invokeArgs[9];

4.常用属性

筛选记录集

筛选记录集使用Where方法。获得全部下架产品的列表,使用上边包车型大巴代码:

var discontinuedProducts = session.QueryOver<Product>()
                           .Where(p => p.Discontinued)
                           .List();

自然,大家还足以整合八个筛选,例如,获取具有在架上且必要再度订购的制品列表,如上面包车型客车代码所示:

var productsToReorder = session.QueryOver<Product>()
                        .Where(p => p.Discontinued == false)
                        .Where(p => p.ReorderLevel >= p.UnitsOnStock)
                        .List();

笔者们还是能利用下边包车型大巴主意筛选:

var productsToReorder = session.QueryOver<Product>()
                        .Where(p => p.Discontinued == false &&p.ReorderLevel >= p.UnitsOnStock)
                        .List();

四.常用属性

 

壹.页面安装

用来显示总的页数(TotalPages),例如:页脚突显第叁页/共20页。系统率先遍扫描报表时总计出TotalPages,然后第一遍实际变化报表。假若不行使Doublepass,则TotalPages重回0,所以必须安装report的性质doublepass为true;

设置方式:点击报表树,单击报表树最上端图标,点击属性,选取doublepass为true;也可一向在属性框中精选report,实行连锁属性设置!如图:

金沙注册送58 51金沙注册送58 52

排序结果集

利用QueryOver
API排序和LINQ非凡相似,只是LINQ定义OrderBy和OrderByDescending来定义升序和降序,而QueryOver
API只定义了3个OrderBy方法。然则,那一个主意必须和Asc大概Desc组合使用。当依照八个字段排序时,那多少个API都有ThenBy(LINQ还有一个ThenByDescending)方法。

获得依照Name升序和UnitPrice降序排列的成品列表,代码如下所示:

var sortedProducts = session.QueryOver<Product>()
                    .OrderBy(p => p.Name).Asc
                    .ThenBy(p => p.UnitPrice).Desc
                    .List();

一.页面装置

用以突显总的页数(TotalPages),例如:页脚展现 第二页/共20页。系统第三次扫描报表时计算出TotalPages,然后第三回实际变化报表。假使不接纳Double pass,则TotalPages再次回到0,所以必须设置report的习性doublepass为true;

安装方法:点击报表树,单击报表树最上端图标,点击属性,选取doublepass为true;也可一贯在属性框中甄选report,进行相关属性设置!如图:

                                       
  金沙注册送58 53金沙注册送58 54

下边是任何代码,具体效果完结略过

二.打字与印刷设置

对此套打模板,样式在纸张上1度固化了(如处方笺、收取金钱发票),只需求依照原定的样书将数据填充进去,在绘制的时候,供给用尺子优异尺寸,为了能够有一个更加好的作用,1般把页面上早已存在不供给再打字与印刷出来的也画出来,然则要求安装属性“printable”为false:表示打字与印刷不显得,若想在预览的时候就无须看到那一个不需求打字与印刷的,则需安装属性“Visible”为false:表示预览不突显。

阴影结果集

动用QueryOver
API定义映射也是最难的一部分。假设只想搜寻全部成品的Id和Name,并将它们填充到NameID对象的数组中,能够使用上面包车型地铁代码实现:

var productsLookup = session.QueryOver<Product>()
                    .Select(p => p.Id, p => p.Name)
                    .TransformUsing(Transformers.AliasToBean<NameID>())
                    .List<NameID>();

只顾大家是什么样使用Select方法定义大家想投影的习性列表。每一种属性都由二个Lamb达表明式定义,例如p=>p.Name投影Name属性。然后,大家运用TransformUsing方法注解NHibernate如何转移投影结果。在前面包车型客车事例中我们挑选AliasToBean转换器注解NameID作为目的转移类型。NHibernate还定义了别的的转换器,甚至能够定义自身的转换器。静态类Transformers给出了大家可用转换器的列表。最后调用List<NameID>甘休。那里大家声止汗标项目,不然,NHibernate会认为目的项目还是是Product。

二.打字与印刷设置

对此套打模板,样式在纸张上一度固定了(如处方笺、收取工资发票),只供给遵守原定的样书将数据填充进去,在绘制的时候,必要用尺子卓绝尺寸,为了能够有八个更加好的功力,1般把页面上1度存在不须要再打字与印刷出来的也画出来,可是急需设置属性“printable”为false:表示打字与印刷不显得,若想在预览的时候就毫无看到那个不须要打字与印刷的,则需安装属性“Visible”为false:表示预览不显得。

金沙注册送58 55金沙注册送58 56

三.格式设置

报表中1些数据要求服从分明的格式去显得,如必要把时间的格式改变一下,选中当前数码,右键单击,点击format(或在属性栏中甄选format),在弹出的取舍格式框中选用需求的格式。若format中平素不索要的格式,则要求在custom中自定义,比如作者急需把时光设置为二零一二-0玖-091一:2二:2③,此时能够在custom中填时间展现格式:yyyy-MM-ddHH:mm:ss。注意有的须求出示中午要么上午,表示中午上午的格式是tt,具体有关设置能够参见已存在的format进行编辑!如图:

金沙注册送58 57金沙注册送58 58

分组记录集

当大家使用投影转换数据时,还是能够分组记录集以及给字段应用聚合函数。依照Category分组全体的制品,然后总计各样体系下产品的个数,还足以估测计算各样门类下的平均单价以及各种项目下的仓库储存量总和。如下边包车型地铁代码所示:

var productsGrouped = session.QueryOver<Product>()
                    .Select(Projections.Group<Product>(p => p.Category),
                            Projections.Avg<Product>(p => p.UnitPrice),
                            Projections.Sum<Product>(p => p.UnitsOnStock),
                            Projections.RowCount())
                    .List<object[]>();

为了不难,上边的代码中大家未有概念转换,只是让NHibernate重回结果集的行数。

三.格式设置

报表中部分数据需求根据规定的格式去体现,如供给把日子的格式改变一下,选中当前多少,右键单击,点击format(或在属性栏中选取format),在弹出的选项格式框中挑选需求的格式。若format中从不索要的格式,则须求在custom中自定义,比如本身须求把时间设置为2013-0九-0玖 1一:2二:二3,此时得以在custom中填时间展现格式:yyyy-MM-dd HH:mm:ss。注意有的必要出示中午或然早晨,表示清晨午后的格式是tt,具体相关安装能够参考已存在的format进行编写制定!如图:

                                               
  金沙注册送58 59金沙注册送58 60

              

 1 public class UtilFetchHelper 
 2 {
 3     //获取实体类型
 4     private Type getEntity(string typeName)
 5     {
 6         var workPath = AppDomain.CurrentDomain.BaseDirectory;
 7         string[] files = Directory.GetFiles(workPath, "XXX.Utils.dll", SearchOption.TopDirectoryOnly);
 8         foreach (string file in files)
 9         {
10             string ext = file.Substring(file.LastIndexOf("."));
11             if (ext != ".dll") continue;
12             try
13             {
14                 Assembly asm = Assembly.LoadFile(file);
15                 Type[] allTypes = asm.GetTypes();
16                 foreach (Type t in allTypes)
17                 {
18                     if (t.IsSubclassOf(typeof(XXDataRecord)))
19                     {
20                         if (t.Name.ToUpper().IsSame(typeName.ToUpper()))
21                             return t;
22                     }
23                 }
24             }
25             catch
26             {
27                 return null;
28             }
29         }
30         return null;
31     }
32 
33     public DataTable BuildDataMemoryPattern(XXParams zb, string id, out int recordCount)
34     {
35         //根据传入参数获取实体名称
36         var entityName = GetDataSourceEntityName(zb);
37         //获取实体类型
38         Type typeEntity = getEntity(entityName);
39         if (typeEntity == null)
40             return  null;
41         var obj = new GenerateDataHelper(_Param);
42         Type myGenericClassType = obj.GetType();
43         MethodInfo mi = myGenericClassType.GetMethod("BuildDataMemoryPattern").MakeGenericMethod(typeEntity);
44         int count = 0;
45         object[] invokeArgs = new object[] { zb, id, count };
46         var dt = (DataTable)mi.Invoke(obj, invokeArgs);
47         //这里获取回返数据
48         recordCount = (int)invokeArgs[9];
49         return dt;
50     }
51 }
52 
53 public class GenerateDataHelper
54 {
55     private List<XXDataRecord> _DataList;
56     private List<XXDataRecord> DataList
57     {
58         set { _DataList = value; }
59         get { return _DataList; }
60     }    
61     
62     private List<T> GetDataSource<T>() where T : XXDataRecord, new()
63     {
64         var _DataList = new List<T>();
65         var dt = DB.ExecuteDataTable("Select * From XX");
66         for (int i = 0; i < dt.Rows.Count; i++)
67         {
68             var dataEnt = new T();
69             for (int j = 0; j < dt.Columns.Count; j++)
70             {
71                 dataEnt[dt.Columns[j].ColumnName] = dt.Rows[i][j];
72             }
73             _DataList.Add(dataEnt);
74         }
75         return _DataList;        
76      }
77         
78         
79     public XXDataMemory BuildDataMemoryPattern<T>(XXParams zb, string id) where T : XXDataRecord, new()
80     {
81         List<T> DataList = new List<T>();
82         DataList = GetDataSource<T>();
83         //以下是具体实现代码 针对DataList查询操作
84     }
85 }

四.显得设置

对于有个别数据,名称较长,在行高固定的情事下,系统暗中认可为自动换行,此时两岸均不可能完全展现不能一心体现,比如,此时遵从客户的须求,若须求机关截断,则设置“WordWrap”为false,若供给全体显得,则须要让该多少有遵照单元格大小活动缩放功用,设置属性“AutoShrink”为fontsize可能fontwith。

利用QueryOver检索数据

在这一个例子中,大家抬高一些出品到数据库,然后利用QueryOver方法检索这么些制品。

而且,我们应用Loquacious配置和ConfOrm映射,就当复习后边的始最终。

ConfOrm映射在NHibernate初学者指南(陆):映射模型到数据库之格局2

Loquacious配置在NHibernate初学者指南(1四):配置的二种方法

上边正式启幕大家的例证。

  1. 在SSMS中创立2个数据库:QueryOverSample。

  2. 在Visual Studio中成立三个控制台应用程序:QueryOver萨姆ple。

3.
为项目增进对NHibernate.dll,NHibernate.ByteCode.Castle.dll和ConfOrm.dll程序集的引用。

  1. 在项目中添加二个类公事Category.cs,添加如下代码定义Category实体:

    public class Category
    {

     public virtual Guid Id { get; set; }
     public virtual string Name { get; set; }
     public virtual string Description { get; set; }
    

    }

  2. 在项目中添加三个类公事Product.cs,添加如下代码定义Product实体:

    public class Product
    {

     public virtual Guid Id { get; set; }
     public virtual string Name { get; set; }
     public virtual Category Category { get; set; }
     public virtual decimal UnitPrice { get; set; }
     public virtual bool Discontinued { get; set; }
     public virtual int ReorderLevel { get; set; }
     public virtual int UnitsOnStock { get; set; }
    

    }

陆.
在Program类中,添加三个静态方法使用Loquacious配置创立一个NHibernate的Configuration对象:

private static Configuration GetConfiguration()
{
    var cfg = new Configuration();
    cfg.SessionFactory()
    .Proxy
    .Through<ProxyFactoryFactory>()
    .Integrate
    .LogSqlInConsole()
    .Using<MsSql2008Dialect>()
    .Connected
    .Through<DriverConnectionProvider>()
    .By<SqlClientDriver>()
    .Using(new SqlConnectionStringBuilder
    {
        DataSource = @".",
        InitialCatalog = "QueryOverSample",
        IntegratedSecurity = true
    });
    return cfg;
}
  1. 在Program类中添加一个静态方法为实体定义映射,代码如下所示:

    private static void AddMappings(Configuration configuration)
    {

     var types = new[] { typeof(Category), typeof(Product) };
     var orm = new ObjectRelationalMapper();
     orm.TablePerClass(types);
     var mapper = new Mapper(orm);
     var hbmMappings = mapper.CompileMappingFor(types);
     configuration.AddDeserializedMapping(hbmMappings, "MyDomain");
    

    }

  2. 在Program类中添加叁个静态方法创建或再度创造数据库架构,如下所示:

    private static void BuildSchema(Configuration configuration)
    {

     new SchemaExport(configuration).Execute(true, true, false);
    

    }

  3. 在Program中添加别的3个静态方法创造数量,如上面的代码所示:

    private static void BuildSchema(Configuration configuration)
    {

     new SchemaExport(configuration).Execute(true, true, false);
    

    }

    private static void AddProductsAndCategories(ISessionFactory sessionFactory)
    {

     var categories = new List<Category>();
     var products = new List<Product>();
     var random = new Random((int)DateTime.Now.Ticks);
     for (var i = 1; i <= 5; i++)
     {
         var category = new Category
         {
             Name = string.Format("Category {0}", i)
         };
         categories.Add(category);
         var count = random.Next(10);
         for (var j = 1; j <= count; j++)
         {
             var product = new Product
             {
                 Name = string.Format("Product {0}", i * 10 + j),
                 Category = category,
                 UnitPrice = (decimal)random.NextDouble() * 10m,
                 Discontinued = random.Next(10) > 8,
                 UnitsOnStock = random.Next(100),
                 ReorderLevel = random.Next(20)
             };
             products.Add(product);
         }
     }
     using (var session = sessionFactory.OpenSession())
     using (var tx = session.BeginTransaction())
     {
         foreach (var category in categories)
         {
             session.Save(category);
             foreach (var product in products)
             {
                 session.Save(product);
             }
         }
         tx.Commit();
     }
    

    }

以往我们使用ISession接口的QueryOver方法创造一些数据报表。

10.
创设一个静态方法,创设四个session和transaction,用来调用报表成立报表方法,如下所示:

private static void PrintReports(ISessionFactory sessionFactory)
{
    Console.WriteLine();
    Console.WriteLine("---------------------");
    Console.WriteLine("| Prining Reports |");
    Console.WriteLine("---------------------");
    using (var session = sessionFactory.OpenSession())
    using (var tx = session.BeginTransaction())
    {
        PrintListOfCategories(session);
        tx.Commit();
    }
}
  1. 大家供给贯彻PrintListOfCategories方法,代码如下:

    private static void PrintListOfCategories(ISession session)
    {

    Console.WriteLine("\r\nList of categories:\r\n");
    var categories = session.QueryOver<Category>()
    .OrderBy(c => c.Name).Asc
    .List();
    foreach (var category in categories)
    {
        Console.WriteLine("Category: {0}", category.Name);
    }
    

    }

  2. 在Program类中,创建3个静态字段,如下所示:

    private static ISessionFactory sessionFactory;

一三.
在Main方法中添加如下代码,创立布局,添加映射,成立或重新成立数据库架构,成立session工厂,创立和仓库储存category和product实体,最终调用PrintReports方法,如下所示:

var configuration = GetConfiguration();
AddMappings(configuration);
BuildSchema(configuration);
sessionFactory = configuration.BuildSessionFactory();
AddProductsAndCategories(sessionFactory);
PrintReports(sessionFactory);
Console.Write("\r\n\nHit enter to exit:");
Console.ReadLine();
  1. 运营程序,结果如下图所示:

金沙注册送58 61

15.
添加另3个报表方法,检索未有下架和供给再度订购的持有成品列表。产品列表应该先按category名称排序,再按product名称排序,代码如下所示:

private static void PrintProductsToReorder(ISession session)
{
    Console.WriteLine("\r\nList of products to reorder:\r\n");
    Product productAlias = null;
    Category categoryAlias = null;
    var products = session.QueryOver<Product>(() => productAlias)
    .JoinAlias(() => productAlias.Category, () => categoryAlias)
    .Where(() => productAlias.Discontinued == false)
    .Where(() => productAlias.ReorderLevel >= productAlias.UnitsOnStock)
    .OrderBy(() => categoryAlias.Name).Asc
    .ThenBy(() => productAlias.Name).Asc
    .List();
    Console.WriteLine();
    foreach (var product in products)
    {
        Console.WriteLine(
        "Category: {0}, Product: {1} (Units on stock: {2})",
        product.Category.Name, product.Name,
        product.UnitsOnStock);
    }
}
  1. 在PrintReports方法中调用PrintProductsToReorder方法。

  2. 再次运维程序,结果如下图所示:

金沙注册送58 62

留神,由于使用的是随机生成的数字,结果会分化等,笔者伊始运维了一遍,上海体育地方中的矩形框中都未有结果。

四.来得设置

对此某个数据,名称较长,在行高固定的情状下,系统暗中同意为自动换行,此时两者均不能够完全显示不可能完全突显,比如,此时遵循客户的需要,若供给机关截断,则设置“WordWrap”为false(即不活动换行),若须求全副展示,则需求让该数量有根据单元格大小活动缩放作用,设置属性“AutoShrink”为fontsize恐怕fontwith。

View Code

5.边框设置

边框能够通过工具栏设置,此时设置边框是基于外界框的轻重缓急来突显,下面框的安装也能够因此设置下划线,此时下面框的尺寸是基于数量呈现的长短来控制,还足以设置属性“underline”为true,此时也是依据边框的深浅来显示的。

总结

第二大家讲课了尺度查询的两种格局,即:非类型化的和强类型的。然后通过2个简便的例证,将理论知识得以利用,在例子中穿插着复习了前头的学识:使用Loquacious配置和ConfOrm映射。

5.边框设置

边框能够经过工具栏设置,此时设置边框是基于外界框的深浅来展现,上面框的安装也能够因此设置下划线,此时上边框的尺寸是依据数量突显的长短来控制,还足以设置属性“underline”为true,此时也是依据边框的轻重缓急来展现的。

 

陆.表格设置

一)表格的种类数:通过质量设置ColumnCount和RowCount设置。

贰)合并/分割单元格:选中要求联合/分割的单元格,右键单击,选取“合并单元格”/“分割单元格”,如图:

金沙注册送58 63

三)插入行列:选中某行、某列,右键单击,选拔须求插入的地方,如图:

金沙注册送58 64金沙注册送58 65

6.表格设置

①)表格的队列数:通过品质设置ColumnCount(列)和RowCount(行)设置。

二)合并/分割单元格:选中要求统1/分割的单元格,右键单击,采取“合并单元格”/“分割单元格”,如图:

                                       
       金沙注册送58 66

 

叁)插入行列:选中某行、某列,右键单击,接纳要求插入的职责,如图:

                                 
  金沙注册送58 67金沙注册送58 68

 

5.常用代码

5.常用代码

 

1.在文件编辑器中编辑

法斯特report软件自身带了累累职能达成多少的转移,直接在编辑框中即可达成。

金沙注册送58 69

常用的成效有:

金沙注册送58 70挑选语句IFF;控制语句Switch;

金沙注册送58 71截取字符串语句SubString,在text列表中选取SubString

金沙注册送58 72截取时间语句Date&Time:

金沙注册送58 73算数运算语句Mathematical:常用的有Abs。

留意,在利用那一个function的时候,在文件编辑器右下角会展现当前效益的用法规则,如图:

金沙注册送58 74金沙注册送58 75

若当前数据类型不满足规则,则须要运用方面包车型大巴转移语句,将其转换到与规则相符的数据类型,才能使用这么些function,不然会报错。

一.在文书编辑器中编辑

 

法斯特report软件本人带了重重功能达成多少的转移,直接在编排框中即可兑现。

                           
 金沙注册送58 76

 

常用的功用有:              

                                     
  金沙注册送58 77慎选语句IFF;控制语句Switch;

                           
 金沙注册送58 78截取字符串语句SubString,在text列表中精选SubString

                               
 金沙注册送58 79截取时间语句Date&Time:

     
                                 
 金沙注册送58 80算数运算语句Mathematical:常用的有Abs(取相对值)。

 

专注,在动用这个function的时候,在文件编辑器右下角会显示当前效果的用法规则,如图:

 

金沙注册送58 81金沙注册送58 82

若当前数据类型不满意规则,则需求利用方面包车型地铁更换语句,将其转换到与规则相符的数据类型,才能使用这个function,否则会报错。

 

2.在code区编写

稍稍数据的转换在编辑器中不能一向促成,要求在code区域编写代码。写代码此前供给定义到相应的轩然大波上:选中供给写代码的数目所在的表格拦,在性质设置中式点心击,在事件中双击必要利用的风云,自动跳转到code区,且会产出一行代码,类似于privatevoidGroupHeader一_BeforePrint(objectsender,EventArgse)

{

}

报表中常用事件有BeforePrint,AfterPrint。

2.在code区编写

 

稍微数据的变换在编辑器中无法一贯促成,供给在code区域编写代码。写代码此前供给定义到对应的风浪上:选中供给写代码的数目所在的表格拦,在性质设置中式点心击,在事变中双击要求运用的事件,自动跳转到code区,且会产出一行代码,类似于private void GroupHeader1_BeforePrint(object sender, EventArgs e)

 

    {

 

    }

 

报表中常用事件有BeforePrint,AfterPrint。

 

三.常用代码

一)Data1.InitDataSource();//数据伊始化,用于数据跑四次

二)有的需求把年月日展开分离展现,此时亟待选拔时间并精选只展现时间的某有些,比如有些DateTime二类型的参数值为二零一三0919,现供给将其年月日分开,分别以__年__月__日展现,必要利用fastreport提供的成效拓展分离,即第11中学的方法,但是注意此种方法只可以用来数据类型为datetime的数据;对于非datetime型的数据,能够写代码取位数也许进行强制转换,以string为例:

privatevoidColumnFooter1_BeforePrint(objectsender,EventArgse)

{

stringtbrq=Report.GetColumnValue(“Table1.TBRQ”));

if(!String.IsNullOrEmpty

{

Text9.Text=tbrq.Substring+”年”+tbrq.Substring+”月”+tbrq.Substring+”日”;

}//字符串型用SubString,Substring表示从第0位开头,取出三人作为年。

叁)小数位的主宰:可以用format对具有数据的小数位进行控制,但只对于数值型的数额才使得,不过对于string型的则须要用语句实行落到实处,如:

decimalsl=Report.GetColumnValue(“dtfee.Quantity”);

Cell5壹.Text=sl.ToString;//”0.00″若不填则依照暗中认可值显示,前边多少个零显得出来的数额即为有稍许个小数;对于数据,有时供给须要有小数时则显示小数,无小数时则显示整数,此时只需求将”0.00″改为”0.##”即可,##的个数也是能够自定义的,表示展现的最多的小数位。

三.常用代码

 

1)Data一.InitDataSource();//数据开首化,用于数据跑三次

 

二)有的要求把年月日开始展览分离显示,此时亟待选取时间并采纳只显示时间的某有个别,比如某些Date提姆e贰类型的参数值为二〇一一091玖,现须要将其年月日分开,分别以__年__月__日展现,需求运用fastreport提供的机能拓展分离,即第11中学的方法,不过注意此种方法只好用来数据类型为datetime的数目;对于非datetime型的数目,能够写代码取位数只怕实行强制转换,以string为例:

 

private void ColumnFooter1_BeforePrint(object sender, EventArgs e)

 

    {

 

      string  tbrq=  ((String)Report.GetColumnValue(“Table1.TBRQ”));

 

      if (!String.IsNullOrEmpty(tbrq))

 

      {

 

        Text9.Text = tbrq.Substring(0,4) + “年” + tbrq.Substring(4,2) + “月”+tbrq.Substring(6,2)+”日”;

 

      }//字符串型用SubString,Substring(0,四)表示从第0位起始,取出二个人作为年。

 

叁)小数位的主宰:可以用format对具备数据的小数位实行支配,但只对于数值型的数据才有效,可是对于string型的则要求用语句举行落实,如:

金沙注册送58 , 

decimal sl= ((Decimal)Report.GetColumnValue(“dtfee.Quantity”);

 

Cell5一.Text=sl.ToString(“0.00”);// “0.00”若不填则遵照默许值呈现,后边多少个零显得出来的数量即为有微微个小数;对于数据,有时供给要求有小数时则显示小数,无小数时则彰显整数,此时只须求将”0.00″改为”0.##”即可,##的个数也是足以自定义的,表示展现的最多的小数位。

 

奇异成效汇总

新鲜功用汇总

 

一.打字与印刷中贯彻空表格填满剩余的空行,达到钦定的行数。

1.打字与印刷中落到实处空表格填满剩余的空行,达到内定的行数。

 

1.单页显示钦定行数

为了能让数据在未填满的前提下,该页也能展现钦命的行数N,需求在数据区添加子报表,且供给设置其特性最少数据行(CompleteToNRows)为N。

金沙注册送58 83

一.单页展现钦点行数

 

为了能让多少在未填满的前提下,该页也能展现内定的行数N,要求在数据区(data)添加子报表(child),且要求安装其属性最少数据行(CompleteToNRows)为N。

金沙注册送58 84

 

 

 

 

                             

二.根据数据行数字呈现示内定行数

依照1的设置,预览的时候会意识该操作只会决定首页满意条件,当数码的行数抢先一页时,后边页均遵照有多少多少突显多少行,此时要求写代码控制。

如:

privatevoidPageHeader1_AfterPrint(objectsender,EventArgse)

{if(Engine.FinalPass)

{

Child1.CompleteToNRows=Report.GetVariableValue(“TotalPages”))*20;

}//遵照总页数*20来控制CompleteToNRows。

}

那时候报表拦中的child区CompleteToNRows设置为1,如图:

金沙注册送58 85

二.根据数据行数字突显示钦命行数

 

根据1的装置,预览的时候会意识该操作只会操纵首页知足条件,当数码的行数当先一页时,后边页均根据有些许数量展现多少行,此时内需写代码控制。

 

如:

 

private void PageHeader1_AfterPrint(object sender, EventArgs e)

 

{      if (Engine.FinalPass)

 

      {

 

        Child1.CompleteToNRows = ((Int32)Report.GetVariableValue(“TotalPages”)) * 20;

 

      }//依照总页数*20来控制CompleteToNRows。

 

}

 

此刻报表拦中的child区CompleteToNRows设置为壹,如图:

金沙注册送58 86

2.本页合计和本期合计

二.本页合计和本期合计

一.本页合计

在每页均会彰显,且总括当前页相关数据的和。此时勾选“打字与印刷后重置”项,再将协商项移到相应的职责即可。如图:

金沙注册送58 87

一.本页合计

在每页均会展现,且总结当前页相关数据的和。此时勾选“打字与印刷后重置”项,再将合计项移到相应的岗位即可。如图:

 

 

 金沙注册送58 88

二.本期小计

在每页均会显得,可是指在数量的最后一页呈现合计的多寡,总括当前报表的具备数据和;必要写total来计量当前值,只是本期小计中打字与印刷后重置这一个个性不勾选,由于本期小计只在最终1页展现数据,别的页面上数据区均为空,须求代码控制,例如:

privatevoidColumnFooter1_BeforePrint(objectsender,EventArgse)

{

ifReport.GetVariableValue!=Report.GetVariableValue(“TotalPages”)))//设置呈现本期小计须求的原则,即当前页与总页数相平等的时候,开首体现数据,不然为空。

二.本期小计

在每页均会展现,不过指在数据的末尾壹页展现合计的数额,总结当前报表的全数数据和;必要写total来测算当前值,只是本期小计中打字与印刷后重置这几个本性不勾选,由于本期小计只在结尾一页显示数据,其余页面上数据区均为空,须要代码控制,例如:

private void ColumnFooter1_BeforePrint(object sender, EventArgs e)

    {

      if(((Int32)Report.GetVariableValue(“Page”))!=((Int3二)Report.GetVariableValue(“TotalPages”)))//设置显示本期小计供给的标准,即当前页与总页数相平等的时候,初叶显得数据,不然为空。

三.交叉表的用法

参考模板收取薪金员结账汇总报表.frx

小心交叉表的队列宽度不需安装,自动依据数据长短实行设置。

3.交叉表的用法 (演示)

参考模板    收取费用员结账汇总报表.frx

小心交叉表的队列宽度不需安装,自动依照数据长短实行设置。

4.套打模板

参照模板门诊挂号发票.frx,处方笺.frx

注册发票的模版

专注,在周浦品种中,由于处方笺模板不均等,在医务职职员和工人作站会根据选择调用差异的沙盘,此时是将三种区别的模版组合在一块儿,再根据标志调用相应的模板。

四.套打模板(演示)

参考模板   门诊挂号发票(套打).frx,处方笺(综合).frx

挂号发票的模版

瞩目,在周浦项目中,由于处方笺模板不平等,在医师工作站会遵照选取调用不一致的沙盘,此时是将两种分歧的模版组合在共同,再依据标志调用相应的模板。

5.超链接模板

伍.超链接模板(演示)

报表&单据导入

报表&单据导入

一.单据导入

单据即由开发直接传入数据源,在模块中完毕单据的绘图。

手续:找到绝对应的模块,点击打字与印刷,进入空白模板,再拓展规划。对于已经绘制好的模板,能够间接导入,但注意,必须在本地把数据源清空,再导入,不然将会冒出data区重复,导致命名出现尤其,如data1一。

稍稍模板尽管清空数据源导入到模板,照旧会报错,则须求再行新建二个模板,再将原模板的事物复制进去即可。

相关联的表有:select*fromCommon.ReportTemplate

一. 单据导入

单据即由开发直接传入数据源,在模块中贯彻单据的绘图。

手续:找到相对应的模块,点击打字与印刷,进入空白模板,再开始展览统一筹划。对于曾经绘制好的沙盘,能够直接导入,但注意,必须在该地把数据源清空,再导入,不然将会并发data区重复,导致命名出现卓殊规,如data1壹。

稍微模板固然清空数据源导入到模板,还是会报错,则需求再一次新建1个模板,再将原模板的事物复制进去即可。

相关联的表有:select * from Common.ReportTemplate

二.报表导入

报表即由存储进度完结,然后再对应到相应的囤积进程,去存款和储蓄进程中的数据。

步骤:报表管理à新建报表à填写相应的消息后保存à绘制模板

只顾:填写音讯时要绑定正确的囤积进程,同时通过前台改变相应的界面呈现效果。

添加数据源:采用sql,再选拔相应的积存过程,鲜明即可,对于新建的模板,模板1栏不须要采取,若选取了则会调用以前存在的模版,同时改变的话也会潜移默化从前的模板。

金沙注册送58 89金沙注册送58 90

相关联的表有:

select*fromCommon.Report

select*fromCommon.ReportDataSource

select*fromCommon.ReportTemplate

select*fromCommon.ReportFolder

select*fromCommon.ReportParameter

证实:fastreport自个儿带有德姆o,里面很多效益都以足以供大家学习参考的。

二.报表导入

报表即由存款和储蓄进度实现,然后再对应到相应的积存进度,去存款和储蓄进度中的数据。

手续:报表管理à新建报表à填写相应的新闻后保存(演示)à绘制模板

小心:填写新闻时要绑定正确的积存进程,同时通过前台改变相应的界面展现效果。

丰盛数据源:采用sql,再采取相应的贮存进度,鲜明即可,对于新建的沙盘,模板一栏不供给选用,若选取了则会调用在此以前存在的模版,同时改变的话也会影响从前的模板。

金沙注册送58 91金沙注册送58 92

相关联的表有:

select * from Common.Report 

select * from Common.ReportDataSource

select * from Common.ReportTemplate

select * from Common.ReportFolder

select * from Common.ReportParameter

 

表明:fastreport本人带有德姆o,里面很多作用都以能够供我们学习参考的。

 

 

 

                              

 

 

 

 

 

 

 

 

 

相关文章

网站地图xml地图