来自 澳门新葡亰 2019-11-27 16:48 的文章
当前位置: 澳门新葡亰app > 澳门新葡亰 > 正文

集算器协助报表计算的例子很多,首先在内在里

职业中有那样三个急需,有N张不一样的表格,每张报表对应三个数据源,总括数据接纳内部存款和储蓄器情势,首先在内在里定义了数据源对应实体。计算口径用lamdba表明式式完成,通过工具对单元格进行定义。在贯彻进程中针对每一张表来写取数字显示示是很Low的了,取数条件定义都以平整的,计算完毕便是生龙活虎段C#代码,不过要针对差异的数据源也正是不一样的List<Entity>,通过钻研究开发掘经过泛型和反光可以兑现。

集算器扶持报表总括的事例相当多,但超越八分之意气风发乘除困难都发出在数量走入报表工具此前,如上边列举的公文总结和SQL接济中就有不菲案例是指向性报表开拓的。除了那几个之外,还某些复杂总结是产生在表格工具环节内,以致有些并不是由于总结困难以致但足以用数据源总结来解决的表格难点。这里大家来谈谈集算器在这里些场所下对报表工具的帮带功用。

依照字符串获取实体类型

数量源集

动态数据源

报表工具中有些报表使用到的数据源平日是分明的,报表的参数经常只用于数据集的选出条件(即SQL的WHERE部分卡塔尔而不会用来抉择数据源,假设大家盼望某些报表使用的数据源是由参数决定的,那对于超过55%报表工具来说都能直接完事,平时都亟待采用报表工具提供的API编制程序才行,特别繁缛。

设若选取集算器就非常轻松。可将集算器作为报表的定位数据源,然后在集算脚本中再依附参数再决定连接实际的多寡源取数据重回。

        

A

1

=${pds}.query("select * from T where F=?",pF)

多少源名称用参数pds进来,报表工具本身不必补助动态繁多据源了。

好像地,有个别报表工具供给主人报表必需用同三个数据源,当需求主子报表用差别数量源时,也得以选用那一个点子,把集算器作为东道主报表的一块儿数据源,而实际上数据源在集算脚本中根据参数决定。

 

动态数据集

报表工具中,报表参数平常会用作多少集选出条件的参数,也正是SQL的参数。但不时大家必要替换SQL的风姿浪漫有的而无法只用参数,举例整个WHERE部分是当作参数字传送入的,那样恐怕得到更加灵敏的询问条件。

一点报表工具支持宏,能够形成这点。对于不扶植宏的报表工具,就只可以再利用报表工具提供的API用代码去改写报表模板的数码集定义,十分麻烦。用集算器就很简短:

        

A

 

1

="select * from T" + if(where!=""," where "+where,"")

拼上where,空则不拼

2

=db.query(A1)

 

 尽管支持宏的报表工具,某些SQL也不错拼出。比方希望按传入的字段列表做合计,就要在此些字段上拼加sum(),而报表工具常常未有一直转变串的一手,又必需使用API去处理,只怕在上层事先拼好。这个时候用集算器也都比较轻易管理。

        

A

 

1

=sums.array().("sum("+~+") as "+~).string()

把a,b变成sum(a) as a,sum(b) as b

2

=db.query("select G,"+A1+" from T group by G")

 

取数约束

鉴于体积有量,大家须求表格最多抽取10000行数据,若无取完要再补黄金时代行标识有“继续”的笔录,那样能够来得出多少是或不是完全。但报表工具平时只好进行规定的取数语句,这种灵活决定又需求复杂代码调用API来促成。

集算器用代码调控这一个历程很自在:

        

A

B

 

1

=db.cursor("select * from T")

=A1.fetch(1000)

 

2

if A1.fetch@0(1)

>B1.insert(0,"继续")

未完成则插入标记

3

>A1.close()

return B1

 

 

 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 public XXDataMemory BuildDataMemoryPattern<T>(XXParams zb, string id) where T : XXDataRecord, new()

 

调用方法代码

 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];

 

下边是全体代码,具体职能达成略过

图片 1图片 2

 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 }

View Code

 

本文由澳门新葡亰app发布于澳门新葡亰,转载请注明出处:集算器协助报表计算的例子很多,首先在内在里

关键词: