88bifa必发唯一官网 48

NHibernate初学者指南,并做为参数字传送入泛型方法中运用

办事中有这般八个急需,有N张差异的表格,每张报表对应一个数据源,计算数据采纳内存情势,首先在内在里定义了数据源对应实体。总计规范用lamdba表明式式落成,通过工具对单元格进行定义。在促成进程中针对每一张表来写取数字展现示是很Low的了,取数条件定义都是平整的,总括完成正是1段C#代码,可是要对准差别的数据源也等于见仁见智的List<Entity>,通过研究开掘经过泛型和反光能够兑现。

一.常用控件

88bifa必发唯一官网 1文本框:输入文字或表明式

88bifa必发唯一官网 2报表:设置表格的队列数,输入数字或表达式

88bifa必发唯一官网 3子报表:放置子报表后,系统会自动扩展一个页面,你能够在此页面上统一策画供给的表格。系统在打字与印刷管理时,先按主报表打字与印刷,当遭遇子报表时会自动转入子报表的页面举办打字与印刷处理,实现后三番五次推行主报表打字与印刷的干活,所以大家又称之为嵌套报表。

88bifa必发唯一官网 4复选框:依照布尔表明式是或不是为ture来展现是不是 √

88bifa必发唯一官网 5条形码:绑定扫描码,一般Type为Code12八

88bifa必发唯一官网 6交叉表:Matrix

88bifa必发唯一官网 7页面设置:设置纸张大小及页边距

88bifa必发唯一官网 8边框设置:设置是或不是出示上下左左边框以及边框线条的装置

88bifa必发唯一官网 9边框宽度:下拉三角能够挑选边框宽度设置

非类型化的原则查询

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

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

CreateCriteria方法重返1个兑现了ICriteria接口的目的。倘若得到具备产品的列表,那么大家须求选取接口ICriteria的List<T>方法,如上面包车型客车代码所示:

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

List<Product>()方法重临IList<Product>。和LINQ to
NHibernate相比较,当List方法被调用时查询立即进行。

自然还有3个非泛型的List法兰西共和国法定义在ICriteria接口上。那个办法重返3个IList类型的对象。

依附字符串获取实体类型

贰.常用报表栏

报表标题区(ReportTitle):仅在第二页显示在纸张的上部。一般用于打字与印刷表格的标题等消息。

报表合计(ReprotSummary):仅呈未来具有数据的末梢末尾。一般用于打字与印刷总括音信等。

页眉(PageHeader):呈现在每页的最上部。通过设置你可以让它内置报表抬头之上或许之下。一般用于打字与印刷页眉音讯等。

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

数量首:展现在享有数据源的最上部,仅打字与印刷2回。一般用于展示相关摘要消息,与页眉的界别是当该页无数据时,数据首的始末不呈现且仅展现一回。

数据尾:彰显在具备数据源的最下边,仅打字与印刷一回。一般用于呈现全数数据的议和音讯。

栏首(ColumnHeader):展现在每页数据源的上部,它在每页均展现。由此一般用于打字与印刷数据源字段的栏目信息。

栏尾(ColumnHeader):展现在每页数据源的底下,它在每页均展现。一般可用于总结显示每页数据的页合计音信。

分组页眉(GroupHeader):用于显示分组数据,在每1个分组初步浮现。

分组页脚(GroupFooter):与群组首1壹对应。一般用来体现分组数据的总计音讯。

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

限定重临的记录数

限制查询再次回到的记录数,可以应用Set马克斯Results方法。从数据库中取得前11个产品,代码如下:

var first10Products = session.CreateCriteria<Product>()
                       .SetMaxResults(10)
                       .List<Product>();
 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 }

叁.常用效率

筛选记录集

如果筛选出下架的制品,代码如下所示:

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这几个静态类还有多数概念筛选规范的福利的办法。

 

1.增添报表栏

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

增添段的时候要留心:

一)选取加多段的职位,如想加多子数据区,则当选要增多父数据区,点击加多“数据区”就可以,如图所示:

88bifa必发唯一官网 1088bifa必发唯一官网 1188bifa必发唯一官网 12

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

88bifa必发唯一官网 1388bifa必发唯一官网 1488bifa必发唯一官网 15

炫丽记录集

今昔让大家谈谈什么映射记录集。这也叫做投影。使用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有2个Add的重载方法,我们能够定义四个别称。那一个外号与目的对象的名号相相配。

泛型方法定义

二.加多数据源

慎选菜单栏的“数据”,在下拉框中选中“选取数据源”,弹出“选取报表数量”框,里面会列出已经传出的数据源,勾选须求的数据源,点击鲜明,此时分界面左侧“数据”列表中即彰显当前所选中的数据源,选中数据源,右键选取“查看数据”,就能够呈现当前数据源中所含有的多寡:

88bifa必发唯一官网 1688bifa必发唯一官网 1788bifa必发唯一官网 18

88bifa必发唯一官网 1988bifa必发唯一官网 20

排序结果集

排序结果集万分轻易。大家只需加上此外四个条件,如下边包车型客车代码所示:

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

以相反的顺序排列产品列表,只需利用Order类的Desc方法。大家还能够依据几天性格排序,只需为各样字段增多八个排序条件就可以。

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

三.增加体系变量

对于有些变量恐怕取自当前系统,如时间,页码,序号等,此时选用系统变量中相应的变量就能够,如图:

88bifa必发唯一官网 21

分组记录集

分组在LINQ提供程序中是独自的艺术,不过在criteria
API中是影子的一片段。如若大家想依据Category分组产品和计算每一种项目标成品数,我们得以采纳下边包车型地铁询问:

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

假使非得凭仗用户的取舍动态变化查询,criteria
API是最合适的。除外,LINQ to
NHibernate更具备可读性以及从深切来看更有可维护性。

 

肆.加多集中

对于部分报表,要求在多少尾增加合计行,此时内需手动增添合计,弹出汇总项编辑器,再在集聚项编辑器中增添汇总的数量据源。

88bifa必发唯一官网 22

在集中名称1栏能够自命名二个切磋名称;

88bifa必发唯一官网 23

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

在“计算段中每壹列”可以挑选出席汇总的数据区;

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

88bifa必发唯一官网 24

强类型的尺度查询

NHibernatet
3引进了一个新的功效正是足以动用强类型定义规则查询。为此,QueryOver<T>参预到了ISession接口中。这里,泛型参数T表示大家想查询的实体类型。

选择QueryOver API,大家钦定询问的根,如上面包车型地铁代码所示:

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

简单的说的获取具备成品的列表,使用如下所示的查询:

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

与Criteria API相比,QueryOver没有须求内定再次来到类型。

调用方法代码

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

双击数据区,弹出“编辑数据段”,能够开始展览数据源的取舍、排序、过滤。如图:

88bifa必发唯一官网 25

限制重回的记录数

范围查询重返的记录数,大家得以选拔Take方法。这几个查询和LINQ to
NHibernate的查询相似,如上面所示:

var first10Products = session.QueryOver<Product>()
                      .Take(10)
                      .List();
 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];

肆.常用属性

筛选记录集

筛选记录集使用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),例如:页脚显示第2页/共20页。系统率先遍扫描报表时总括出TotalPages,然后第3回实际变化报表。假设不利用Doublepass,则TotalPages重返0,所以必须设置report的习性doublepass为true;

设置方法:点击报表树,单击报表树最顶端图标,点击属性,接纳doublepass为true;也可直接在属性框中采纳report,进行有关属性设置!如图:

88bifa必发唯一官网 2688bifa必发唯一官网 27

排序结果集

选拔QueryOver
API排序和LINQ异常相像,只是LINQ定义OrderBy和OrderByDescending来定义升序和降序,而QueryOver
API只定义了二个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();

下边是1体代码,具体作用落成略过

二.打印设置

对此套打模板,样式在纸张上曾经固定了(如处方笺、收取金钱小票),只必要依照原定的样本将数据填充进去,在绘制的时候,需求用尺子优秀尺寸,为了能够有二个更好的成效,一般把页面故洗经存在无需再打字与印刷出来的也画出来,可是须要安装属性“printable”为false:表示打字与印刷不展现,若想在预览的时候就绝不看到那么些没有供给打字与印刷的,则需安装属性“Visible”为false:表示预览不出示。

影子结果集

运用QueryOver
API定义映射也是最难的1局地。假设只想搜寻全数成品的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。

88bifa必发唯一官网 2888bifa必发唯一官网 29

三.格式设置

88bifa必发唯一官网,报表中部分数据须要遵从规定的格式去体现,如必要把时间的格式改换一下,选中当前多少,右键单击,点击format(或在属性栏中甄选format),在弹出的挑三拣4格式框中选用必要的格式。若format中从不索要的格式,则供给在custom中自定义,比方自身急需把时光设置为二〇一一-0玖-091一:2二:二3,此时得以在custom中填时间彰显格式:yyyy-MM-ddHH:mm:ss。注意有的要求出示早上要么下午,表示清晨午后的格式是tt,具体相关安装能够参照已存在的format进行编写制定!如图:

88bifa必发唯一官网 3088bifa必发唯一官网 31

分组记录集

当咱们运用投影转变数据时,还是能够分组记录集以及给字段应用聚合函数。依据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重返结果集的行数。

 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初学者指南(六):映射模型到数据库之格局二

Loquacious配置在NHibernate初学者指南(1四):配置的三种艺术

上面正式开首大家的例子。

  1. 在SSMS中创设贰个数据库:QueryOver萨姆ple。

  2. 在Visual Studio中创建一个调整台应用程序:QueryOverSample。

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

  1. 在类型中增添3个类公事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. 在等级次序中增加1个类公事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类中,增加3个静态方法使用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类中加多1个静态方法创建或另行创立数据库架构,如下所示:

    private static void BuildSchema(Configuration configuration)
    {

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

    }

  3. 在Program中增加此外1个静态方法成立数量,如下边包车型大巴代码所示:

    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方法创设一些数据报表。

十.
开创叁个静态方法,创设二个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类中,创制一个静态字段,如下所示:

    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. 运转程序,结果如下图所示:

88bifa必发唯一官网 32

15.
增加另一个表格方法,检索未有下架和内需再行订购的兼具产品列表。产品列表应该先按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. 再度运维程序,结果如下图所示:

88bifa必发唯一官网 33

留意,由于接纳的是随机生成的数字,结果会不1致,我初阶运维了两遍,上海教室中的矩形框中都从不结果。

View Code

伍.边框设置

边框能够透过工具栏设置,此时设置边框是依据外界框的轻重来展现,上边框的设置也足以通过设置下划线,此时上边框的长度是依附数量展现的尺寸来决定,还足以设置属性“underline”为true,此时也是依据边框的分寸来呈现的。

总结

率先大家上课了准星查询的二种艺术,即:非类型化的和强类型的。然后经过三个简单易行的例子,将理论知识得以利用,在例子中穿插着复习了前边的知识:使用Loquacious配置和ConfOrm映射。

 

陆.表格设置

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

2)合并/分割单元格:选中须要统1/分割的单元格,右键单击,选用“合并单元格”/“分割单元格”,如图:

88bifa必发唯一官网 34

三)插入行列:选中某行、某列,右键单击,选取要求插入的职务,如图:

88bifa必发唯一官网 3588bifa必发唯一官网 36

5.常用代码

一.在文书编辑器中编辑

法斯特report软件自己带了成都百货上千意义落成数量的转移,间接在编排框中就可以兑现。

88bifa必发唯一官网 37

常用的成效有:

88bifa必发唯一官网 38选料语句IFF;调控语句Switch;

88bifa必发唯一官网 39截取字符串语句SubString,在text列表中挑选SubString

88bifa必发唯一官网 40截取时间语句Date&Time:

88bifa必发唯一官网 41算数运算语句Mathematical:常用的有Abs。

瞩目,在行使那几个function的时候,在文件编辑器右下角会呈现当前效应的用法规则,如图:

88bifa必发唯一官网 4288bifa必发唯一官网 43

若当前数据类型不满意规则,则须求运用方面包车型地铁转移语句,将其转换到与规则相符的数据类型,本领使用那个function,不然会报错。

2.在code区编写

稍稍数据的调换在编辑器中无法直接促成,要求在code区域编写代码。写代码以前供给定义到相应的事件上:选中必要写代码的数码所在的报表拦,在性质设置中式点心击,在事件中双击须要运用的事件,自动跳转到code区,且会见世一行代码,类似于privatevoidGroupHeader一_BeforePrint(objectsender,EventArgse)

{

}

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

3.常用代码

一)Data一.InitDataSource();//数据初阶化,用于数据跑四回

二)有的要求把年月日拓展分离彰显,此时内需选用时间并精选只展现时间的某部分,举例某些Date提姆e2类型的参数值为20110919,现需求将其年月日分别,分别以__年__月__日突显,必要利用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”);

Cell51.Text=sl.ToString;//”0.00″若不填则依据暗许值凸显,前面多少个零体现出来的多寡即为有个别许个小数;对于数据,有时供给供给有小数时则展现小数,无小数时则展现整数,此时只供给将”0.00″改为”0.##”即可,##的个数也是足以自定义的,表示展现的最多的小数位。

出奇功能汇总

1.打印中贯彻空表格填满剩余的空行,到达内定的行数。

一.单页展现内定行数

为了能让多少在未填满的前提下,该页也能显得钦定的行数N,需求在数据区加多子报表,且需求安装其性能最少数据行(CompleteToNRows)为N。

88bifa必发唯一官网 44

2.依据数据行数字展现示钦赐行数

依据一的设置,预览的时候会意识该操作只会决定首页满意条件,当数码的行数超过1页时,前面页均依据有稍许数量展现多少行,此时内需写代码调控。

如:

privatevoidPageHeader1_AfterPrint(objectsender,EventArgse)

{if(Engine.FinalPass)

{

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

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

}

那儿报表拦中的child区CompleteToNRows设置为一,如图:

88bifa必发唯一官网 45

②.本页合计和本期合计

一.本页合计

在每页均会显得,且计算当前页相关数据的和。此时勾选“打字与印刷后复位”项,再将合计项移到对应的职分就可以。如图:

88bifa必发唯一官网 46

二.本期小计

在每页均会展现,不过指在数码的末段1页展现合计的数额,总结当前报表的富有数据和;供给写total来测算当前值,只是本期小计中打字与印刷后重新设置那脾个性不勾选,由于本期小计只在终极一页展现数据,别的页面上数据区均为空,要求代码调整,举例:

privatevoidColumnFooter1_BeforePrint(objectsender,EventArgse)

{

ifReport.GetVariableValue!=Report.GetVariableValue(“TotalPages”)))//设置展现本期小计需求的标准化,即当前页与总页数相平等的时候,开头显示数据,不然为空。

3.交叉表的用法

参照模板收取费用员买下账单汇总报表.frx

在意交叉表的连串宽度不需安装,自动遵照数据长短实行安装。

四.套打模板

参考模板门诊挂号收据.frx,处方笺.frx

登记小票的模板

瞩目,在周浦品种中,由于处方笺模板不平等,在先生工作站会基于选用调用分化的模版,此时是将二种分裂的模板组合在一块儿,再依靠标记调用相应的沙盘。

5.超链接模板

报表&单据导入

一.单据导入

票据即由开荒一贯传入数据源,在模块中贯彻单据的绘图。

手续:找到相对应的模块,点击打字与印刷,进入空白模板,再举行统一筹算。对于早已绘制好的模版,能够平昔导入,但注意,必须在地方把数据源清空,再导入,不然将会见世data区重复,导致命名出现分外规,如data1一。

稍微模板即便清空数据源导入到模板,仍旧会报错,则必要重新新建3个模板,再将原模板的事物复制进去就可以。

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

二.报表导入

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

手续:报表管理à新建报表à填写相应的音信后保存à绘制模板

注意:填写音信时要绑定精确的蕴藏进程,同时通过前台改换相应的分界面展现效果。

拉长数据源:选择sql,再采取相应的存款和储蓄进度,明显就可以,对于新建的模板,模板一栏无需选取,若选取了则会调用在此以前存在的模版,同时更动的话也会影响以前的模板。

88bifa必发唯一官网 4788bifa必发唯一官网 48

相关联的表有:

select*fromCommon.Report

select*fromCommon.ReportDataSource

select*fromCommon.ReportTemplate

select*fromCommon.ReportFolder

select*fromCommon.ReportParameter

表明:fastreport自己带有德姆o,里面繁多效应都以足以供我们学习参考的。