数据统计是每个系统中必备的功能,在给领导汇报统计数据,工作中需要的进展数据时非常有用。

在我看来,一个统计的模块应该实现以下功能:

  • 能够将常用的查询的统计结果显示出来;
  • 显示的结果可以是表格形式,也可以是图形形式,如果是图形的话能够以多种形式显示(柱状图、折线图、饼图、雷达图、堆叠柱状图等):
  • 统计查询的结果,点击数字或者百分比能够显示详细的数据;
  • 能够自由组合查询条件、筛选条件、分组条件、排序等;
  • 统计结果最好有个实时预览;
  • 查询统计能够保存,以便下次能直接调用并显示统计查询的结果;
  • 对于保存后的查询统计,下次调用时也可以按照灵活的筛选手段对查询结果进行筛选;
  • 界面需要做的简洁、直观,就算是不太懂电脑的操作员也能够方便使用;
  • 对于一些复杂的查询,能够直接在后台写Sql或者调用Sp出数据
  • ......

好了,以下是在实际环境中的实现和应用:
这是一个学生的就业系统,学生在不同的时期会对自己毕业去向进行登记,因此按照不同时间截点统计出来的数据是不一样的。数据表有100多个字段(并不是所有字段都需要统计)。

首先,我们在数据库中构建一个表值函数,能够按照不同的时间截点返回出数据,表也起到视图的作用,将参数表的值直接包含到返回结果中去。

  1. ALTER FUNCTION [dbo].[Get.............]
  2. (
  3. @gxsj datetime
  4. )
  5. RETURNS TABLE
  6. AS
  7. RETURN
  8. (
  9. select t1.*,
  10. dbo.depacode.xymc,
  11. CASE t1.xldm WHEN '' THEN '博士' WHEN '' THEN '硕士' WHEN '' THEN '双学位' WHEN '' THEN '本科' WHEN '' THEN '专科' WHEN '' THEN '高职' ELSE '' END AS xlmc,
  12. CASE WHEN LEFT(t1.sydqdm, 2) IN ('', '', '', '', '', '', '', '', '', '', '', '', '', '') THEN '东部'
  13. WHEN LEFT(t1.sydqdm, 2) IN ('', '', '', '', '', '', '', '') THEN '中部'
  14. WHEN LEFT(t1.sydqdm, 2) IN ('', '', '', '', '', '', '', '', '', '', '', '') THEN '西部' ELSE '' END AS sydq,
  15. sydq.dwdqmc AS sysf,
  16. CASE WHEN LEFT(t1.dwdqdm, 2) IN ('', '', '', '', '', '', '', '', '', '', '', '', '', '') THEN '东部'
  17. WHEN LEFT(t1.dwdqdm, 2) IN ('', '', '', '', '', '', '', '') THEN '中部'
  18. WHEN LEFT(t1.dwdqdm, 2) IN ('', '', '', '', '', '', '', '', '', '', '', '') THEN '西部' ELSE '' END AS dwdq,
  19. dwdq.dwdqmc AS dwsf, dbo.Entcode.hyname,
  20. dbo.hydygx.hymldm, dbo.hydygx.hyml,
  21. CASE t1.xbdm WHEN 1 THEN '男' WHEN 2 THEN '女' ELSE '男' END AS xbmc,
  22. [mzdmb].[nation] AS mzmc,
  23. [EjByqxdmb].[Ejbyqxmc], dbo.byqxdygx.jybbyqx, t1.gn500 AS jybdwxzdm,
  24. CASE t1.knslbdm WHEN '' THEN '就业困难、家庭困难和残疾' WHEN '' THEN '家庭困难和残疾' WHEN '' THEN '就业困难和残疾' WHEN '' THEN '残疾' WHEN '' THEN '就业和家庭困难' WHEN '' THEN '家庭困难' WHEN '' THEN '就业困难' ELSE '非困难生' END AS Knslb
  25. from [table] as t1
  26. LEFT OUTER JOIN
  27. dbo.depacode ON t1.xydm = dbo.depacode.xydm LEFT OUTER JOIN
  28. dbo.dwdq AS sydq ON LEFT(t1.sydqdm, 2) + '' = sydq.dwdqdm LEFT OUTER JOIN
  29. dbo.dwdq AS dwdq ON LEFT(t1.dwdqdm, 2) + '' = dwdq.dwdqdm LEFT OUTER JOIN
  30. dbo.Entcode ON t1.hylb = dbo.Entcode.hycode LEFT OUTER JOIN
  31. dbo.hydygx ON t1.hylb = dbo.hydygx.hydldm LEFT OUTER JOIN
  32. [mzdmb] ON t1.mzdm = [mzdmb].[mzdm] LEFT OUTER JOIN
  33. [EjByqxdmb] ON t1.byqx2 = [EjByqxdmb].[Ejbyqxdm] LEFT OUTER JOIN
  34. dbo.byqxdygx ON t1.byqx = dbo.byqxdygx.shbyqx AND
  35. t1.dwxzdm = dbo.byqxdygx.shdwxzdm
  36. where [gxsj] <= dateadd(day,1,@gxsj) and HisId in
  37. (SELECT TOP 1 HisId FROM [table]
  38. WHERE [gxsj] <= dateadd(day,1,@gxsj) and xsxh = t1.xsxh
  39. and bynf = t1.bynf and t1.byqx not in ('','','')
  40. ORDER BY [gxsj] DESC)
  41. )

这样我们使用 select * from [get...]('2016-8-25') 就可以查询出8月25日截止日期的数据。

接下来是界面设计,我们使用jequery-ui中dropable\dragable的控件,字段排列在界面上,直接拖拽到相应域里,就能够进行统计。

除了分组字段外,显示字段还能够按照具体的值进行统计过滤,起到多重分组统计的功能。

大家可以看到,最上面一栏是数据筛选,然后是系统已经保存的查询(分为表格查询和图形查询),点击保存好的查询直接出查询结果,也可以删除保存的查询。在下面是自定义查询,上面是一排条件,然后是可以拖拽的字段,当字段拖至分组列,则显示字段名称;拖至显示列,还可以对显示的数据的具体值进行分组筛选统计。下方则是一些选项,是否显示小计、总计,以何种方式显示图表。

以表格形式的显示统计,可以看到,每个数值都可以点击弹出框显示详情,最下方能够保存查询条件,以图形方式显示等:

图形的展示:

 

以下是核心类InquireHelper.cs:
字段实体类(部分)

  1. [Serializable]
  2. [XmlInclude(typeof(BYNF_InquireField))]
  3. [XmlInclude(typeof(Count_InquireField))]
  4. [XmlInclude(typeof(XYMC_InquireField))]
  5. [XmlInclude(typeof(ZYMC_InquireField))]
  6. [XmlInclude(typeof(SZBJ_InquireField))]
  7. [XmlInclude(typeof(FDY_InquireField))]
  8. [XmlInclude(typeof(XL_InquireField))]
  9. [XmlInclude(typeof(SYDQ_InquireField))]
  10. [XmlInclude(typeof(SYSF_InquireField))]
  11. [XmlInclude(typeof(DWDQ_InquireField))]
  12. [XmlInclude(typeof(DWSF_InquireField))]
  13. [XmlInclude(typeof(HYML_InquireField))]
  14. [XmlInclude(typeof(HYDL_InquireField))]
  15. [XmlInclude(typeof(XBMC_InquireField))]
  16. [XmlInclude(typeof(MZMC_InquireField))]
  17. [XmlInclude(typeof(BYQX_InquireField))]
  18. [XmlInclude(typeof(KNSLB_InquireField))]
  19. [XmlInclude(typeof(ZYDKL_InquireField))]
  20. [XmlInclude(typeof(DWXZ_InquireField))]
  21. [XmlInclude(typeof(EJBYQXMC_InquireField))]
  22. [XmlInclude(typeof(GZ_InquireField))]
  23. [XmlInclude(typeof(WYJE_InquireField))]
  24. public abstract class InquireFieldBase
  25. {
  26. public InquireFieldBase()
  27. {
  28. FieldItems = this.GetInquireItemsByInquireType();
  29. }
  30.  
  31. [XmlAttribute]
  32. public int FieldDisplayOrder { get; set; }
  33. [XmlAttribute]
  34. public string FieldName { get; set; }
  35. [XmlAttribute]
  36. public string DbName { get; set; }
  37. [XmlAttribute]
  38. public bool IsAggregate { get; set; }
  39. [XmlAttribute]
  40. public InquireHelper.FieldType FieldType { get; set; }
  41.  
  42. //用于highchart统计
  43. [XmlAttribute]
  44. public bool IsNameField { get; set; }
  45.  
  46. //用于统计输出数据
  47. [XmlAttribute]
  48. public bool IsPercent { get; set; }
  49.  
  50. [XmlIgnore]
  51. public List<string> FieldItems { get; set; }
  52. public List<string> FieldValue { get; set; }
  53. public bool? OrderByAsc { get; set; }
  54. }
  55. [Serializable]
  56. public class BYNF_InquireField : InquireFieldBase
  57. {
  58. public BYNF_InquireField()
  59. {
  60. FieldDisplayOrder = ;
  61. FieldName = "毕业年份";
  62. DbName = "BYNF";
  63. }
  64. }
  65. [Serializable]
  66. public class XYMC_InquireField : InquireFieldBase
  67. {
  68. public XYMC_InquireField()
  69. {
  70. FieldDisplayOrder = ;
  71. FieldName = "学院名称";
  72. DbName = "XYMC";
  73. }
  74. }
  75. [Serializable]
  76. public class ZYMC_InquireField : InquireFieldBase
  77. {
  78. public ZYMC_InquireField()
  79. {
  80. FieldDisplayOrder = ;
  81. FieldName = "专业名称";
  82. DbName = "ZYMC";
  83. }
  84. }
  85. [Serializable]
  86. public class SZBJ_InquireField : InquireFieldBase
  87. {
  88. public SZBJ_InquireField()
  89. {
  90. FieldDisplayOrder = ;
  91. FieldName = "所在班级";
  92. DbName = "SZBJ";
  93. }
  94. }
  95. [Serializable]
  96. public class FDY_InquireField : InquireFieldBase
  97. {
  98. public FDY_InquireField()
  99. {
  100. FieldDisplayOrder = ;
  101. FieldName = "辅导员";
  102. DbName = "FDY";
  103. }
  104. }
  105. [Serializable]
  106. public class XL_InquireField : InquireFieldBase
  107. {
  108. public XL_InquireField()
  109. {
  110. FieldDisplayOrder = ;
  111. FieldName = "学历";
  112. DbName = "XLMC";
  113. }
  114. }
  115. [Serializable]
  116. public class SYDQ_InquireField : InquireFieldBase
  117. {
  118. public SYDQ_InquireField()
  119. {
  120. FieldDisplayOrder = ;
  121. FieldName = "生源地区";
  122. DbName = "SYDQ";
  123. }
  124. }
  125. [Serializable]
  126. public class SYSF_InquireField : InquireFieldBase
  127. {
  128. public SYSF_InquireField()
  129. {
  130. FieldDisplayOrder = ;
  131. FieldName = "生源省份";
  132. DbName = "SYSF";
  133. }
  134. }
  135. [Serializable]
  136. public class DWDQ_InquireField : InquireFieldBase
  137. {
  138. public DWDQ_InquireField()
  139. {
  140. FieldDisplayOrder = ;
  141. FieldName = "单位地区";
  142. DbName = "DWDQ";
  143. }
  144. }
  145. [Serializable]
  146. public class DWSF_InquireField : InquireFieldBase
  147. {
  148. public DWSF_InquireField()
  149. {
  150. FieldDisplayOrder = ;
  151. FieldName = "单位省份";
  152. DbName = "DWSF";
  153. }
  154. }

控制类

  1. public static class InquireHelper
  2. {
  3. public static List<InquireFieldBase> GetSubInquireList()
  4. {
  5. var inquires = new List<InquireFieldBase>();
  6. var subTypeQuery = from t in Assembly.GetExecutingAssembly().GetTypes()
  7. where IsSubClassOf(t, typeof(InquireFieldBase))
  8. select t;
  9.  
  10. foreach (var type in subTypeQuery)
  11. {
  12. InquireFieldBase obj = CreateObject(type.FullName) as InquireFieldBase;
  13. if (obj != null)
  14. {
  15. inquires.Add(obj);
  16. }
  17. }
  18. return inquires;
  19.  
  20. }
  21.  
  22. static bool IsSubClassOf(Type type, Type baseType)
  23. {
  24. var b = type.BaseType;
  25. while (b != null)
  26. {
  27. if (b.Equals(baseType))
  28. {
  29. return true;
  30. }
  31. b = b.BaseType;
  32. }
  33. return false;
  34. }
  35. /// <summary>
  36. /// 创建对象(当前程序集)
  37. /// </summary>
  38. /// <param name="typeName">类型名</param>
  39. /// <returns>创建的对象,失败返回 null</returns>
  40. public static object CreateObject(string typeName)
  41. {
  42. object obj = null;
  43. try
  44. {
  45. Type objType = Type.GetType(typeName, true);
  46. obj = Activator.CreateInstance(objType);
  47. }
  48. catch (Exception ex)
  49. {
  50.  
  51. }
  52. return obj;
  53. }
  54.  
  55. public static List<InquireFieldBase> BindCondition(this List<InquireFieldBase> conditions, string conditionName, List<string> values)
  56. {
  57. var condition = conditions.FirstOrDefault(c => c.GetType().Name == conditionName && c.FieldType == FieldType.ConditionField);
  58.  
  59. if (condition == null)
  60. {
  61. condition = CreateObject("BLL." + conditionName) as InquireFieldBase;
  62. condition.FieldType = FieldType.ConditionField;
  63. conditions.Add(condition);
  64. }
  65.  
  66. condition.FieldValue = values;
  67.  
  68. return conditions;
  69. }
  70. //public static List<InquireFieldBase> BindCondition(this List<InquireFieldBase> conditions, string conditionName, string range1, string range2)
  71. //{
  72. // var condition = conditions.FirstOrDefault(c => c.GetType().Name == conditionName && c.FieldType == FieldType.ConditionField);
  73.  
  74. // if (!string.IsNullOrEmpty(range2)&&!string.IsNullOrEmpty(range1))
  75. // {
  76. // if (condition == null)
  77. // {
  78. // condition = CreateObject("BLL." + conditionName) as InquireFieldBase;
  79. // condition.FieldType = FieldType.ConditionField;
  80. // conditions.Add(condition);
  81. // }
  82.  
  83. // condition.FieldValue = string.Concat(condition.DbName,
  84. // " between to_date('", range1, "', 'yyyy-mm-dd hh24:mi:ss') and to_date('", range2,
  85. // "', 'yyyy-mm-dd hh24:mi:ss')");
  86. // }
  87. // return conditions;
  88. //}
  89.  
  90. public static DataTable GetDataTable(StatisticsInquire inquire)
  91. {
  92. var inquireCond = new List<string>();
  93. inquire.InquireFields.Where(f => f.FieldType == InquireHelper.FieldType.GroupField).ToList()
  94. .ForEach(f =>
  95. {
  96. if (!f.IsAggregate)
  97. {
  98. inquireCond.Add(string.Concat(f.DbName, " AS ", f.FieldName));
  99. }
  100. });
  101. inquire.InquireFields.Where(f => f.FieldType == FieldType.DisplayField).ToList().ToList()
  102. .ForEach(f => {
  103. if (f.IsAggregate)
  104. {
  105. inquireCond.Add(string.Concat(f.DbName, " AS ", f.FieldName));
  106. }
  107. else
  108. {
  109. if (f.IsPercent)
  110. {
  111. inquireCond.Add(string.Concat("ltrim(Convert(numeric(9,2), SUM(CASE WHEN ", f.DbName, " IN ('", string.Join("', '", f.FieldValue), "') THEN 1 ELSE 0 END)*100.0/Count(*))) + '%' AS '", f.FieldName, ":", string.Join(",", f.FieldValue).SubStr(), "(%)'"));
  112. }
  113. else
  114. {
  115. inquireCond.Add(string.Concat("SUM(CASE WHEN ", f.DbName, " IN ('", string.Join("', '", f.FieldValue) , "') THEN 1 ELSE 0 END) AS '", f.FieldName, ":", string.Join(",", f.FieldValue).SubStr(), "'"));
  116. }
  117. }
  118. });
  119.  
  120. var whereCond = new List<string>();
  121. inquire.InquireFields.Where(f => f.FieldType == InquireHelper.FieldType.ConditionField).ToList()
  122. .ForEach(f =>
  123. {
  124. whereCond.Add(string.Concat(f.DbName, " IN ('", string.Join("','", f.FieldValue), "')"));
  125. });
  126.  
  127. var groupCond = new List<string>();
  128. inquire.InquireFields.Where(f => f.FieldType == InquireHelper.FieldType.GroupField).ToList()
  129. .ForEach(f =>
  130. {
  131. groupCond.Add(f.DbName);
  132. });
  133. var orderbyCond = new List<string>();
  134. inquire.InquireFields.Where(f => f.FieldType == InquireHelper.FieldType.OrderByField).ToList()
  135. .ForEach(f =>
  136. {
  137. orderbyCond.Add(string.Concat(f.DbName, " ", f.OrderByAsc.GetValueOrDefault() ? "ASC" : "DESC"));
  138. });
  139.  
  140. var sqlStr = string.Concat("SELECT ",
  141. string.Join(", ", inquireCond),
  142. " FROM GetStudentStatusByGxsj('", inquire.StatisticsDate , "')",
  143. whereCond.Any() ? " WHERE " : string.Empty,
  144. string.Join(" AND ", whereCond),
  145. groupCond.Any() ? " GROUP BY " : string.Empty,
  146. (inquire.ShowSubSummary || inquire.ShowSummary)
  147. ? string.Concat("rollup(", string.Join(", ", groupCond), ")")
  148. : string.Join(", ", groupCond),
  149. orderbyCond.Any() ? " ORDER BY " : string.Empty,
  150. string.Join(", ", orderbyCond));
  151.  
  152. var dt = DBUtility.DbHelperSql.Query(sqlStr).Tables[];
  153. if (!inquire.ShowSubSummary)
  154. {
  155. if (inquire.ShowSummary)
  156. {
  157. var col = inquire.InquireFields.Where(f => f.FieldType == InquireHelper.FieldType.GroupField).Count();
  158. for(int i = dt.Rows.Count - ; i >= ; i -- ){
  159. if (dt.Rows[i][col - ].ToString() == "")
  160. {
  161. dt.Rows.RemoveAt(i);
  162. //dt.Rows.Remove[dt.Rows[i]);
  163. }
  164. }
  165. }
  166. }
  167. else
  168. {
  169. var col = inquire.InquireFields.Where(f => f.FieldType == InquireHelper.FieldType.GroupField).Count();
  170. for (int i = ; i < dt.Rows.Count - ; i++)
  171. {
  172. for (int j = ; j < col; j++)
  173. {
  174. if (dt.Rows[i][j].ToString() == "")
  175. {
  176. dt.Rows[i][j] = "小计";
  177. break;
  178. }
  179. }
  180.  
  181. }
  182.  
  183. }
  184.  
  185. if (inquire.ShowSubSummary || inquire.ShowSummary)
  186. {
  187. dt.Rows[dt.Rows.Count - ][] = "合计";
  188. }
  189.  
  190. return dt;
  191. }
  192. public static string SubStr(this string str, int maxLength)
  193. {
  194. if (str.Length > maxLength)
  195. {
  196. return str.Substring(, maxLength - );
  197. }
  198. else
  199. {
  200. return str;
  201. }
  202. }
  203.  
  204. public static string ToSerializableXML<T>(this T t)
  205. {
  206. XmlSerializer mySerializer = new XmlSerializer(typeof(T));
  207. StringWriter sw = new StringWriter();
  208. mySerializer.Serialize(sw, t);
  209. return sw.ToString();
  210. }
  211.  
  212. public static T ToEntity<T>(this string xmlString)
  213. {
  214. var xs = new XmlSerializer(typeof(T));
  215. var srReader = new StringReader(xmlString);
  216. var steplist = (T)xs.Deserialize(srReader);
  217. return steplist;
  218. }
  219.  
  220. public enum FieldType
  221. {
  222. DisplayField, GroupField, ConditionField, OrderByField
  223. }
  224.  
  225. private static ConcurrentDictionary<InquireFieldBase, List<string>> _inquireItems = new ConcurrentDictionary<InquireFieldBase,List<string>>();
  226. public static List<string> GetInquireItemsByInquireType(this InquireFieldBase inquireField)
  227. {
  228. List<string> inquireItems;
  229. if (_inquireItems.TryGetValue(inquireField, out inquireItems))
  230. {
  231. return inquireItems;
  232. }
  233. switch (inquireField.GetType().Name)
  234. {
  235. case "XYMC_InquireField":
  236. inquireItems = new BLL.depacode().GetModelList("").OrderBy(d => d.xydm).Select(d => d.xymc).ToList();
  237. break;
  238. case "ZYMC_InquireField":
  239. inquireItems = new BLL.profcode().GetModelList("").OrderBy(d => d.xydm).ThenBy(d => d.zydm).Select(d => d.zymc).ToList();
  240. break;
  241. case "SZBJ_InquireField":
  242. inquireItems = DbHelperSql.Query("select distinct szbj from jbdate order by szbj").Tables[].AsEnumerable().Select(b => b["szbj"].ToString()).ToList();
  243. break;
  244. case "FDY_InquireField":
  245. inquireItems = new BLL.DepaUser().GetModelList("").OrderBy(d => d.XYDM).ThenBy(y => y.YHXM).Select(d => d.YHXM).ToList();
  246. break;
  247. case "XL_InquireField":
  248. inquireItems = new[] { "博士", "硕士", "双学位", "本科", "专科", "高职" }.ToList();
  249. break;
  250. case "SYDQ_InquireField":
  251. inquireItems = new[] { "东部", "中部", "西部" }.ToList();
  252. break;
  253. case "SYSF_InquireField":
  254. inquireItems = DbHelperSql.Query("select [Name] from [Sydqdm] where RIGHT([code], 4) = '0000' order by code").Tables[].AsEnumerable().Select(b => b["Name"].ToString()).ToList();
  255. break;
  256. case "DWDQ_InquireField":
  257. inquireItems = new[] { "东部", "中部", "西部" }.ToList();
  258. break;
  259. case "DWSF_InquireField":
  260. inquireItems = DbHelperSql.Query("select [Name] from [Sydqdm] where RIGHT([code], 4) = '0000' order by code").Tables[].AsEnumerable().Select(b => b["Name"].ToString()).ToList();
  261. break;
  262. case "HYML_InquireField":
  263. inquireItems = DbHelperSql.Query("select distinct hyml from [hydygx]").Tables[].AsEnumerable().Select(b => b["hyml"].ToString()).ToList();
  264. break;
  265. case "HYDL_InquireField":
  266. inquireItems = DbHelperSql.Query("select hydl from [hydygx] order by hydldm").Tables[].AsEnumerable().Select(b => b["hydl"].ToString()).ToList();
  267. break;
  268. case "XBMC_InquireField":
  269. inquireItems = new[] { "男", "女" }.ToList();
  270. break;
  271. case "MZMC_InquireField":
  272. inquireItems = DbHelperSql.Query("select nation from [mzdmb] where nation in (select nation from jbdate) order by mzdm").Tables[].AsEnumerable().Select(b => b["nation"].ToString()).ToList();
  273. break;
  274. case "BYQX_InquireField":
  275. inquireItems = new BLL.Byqxdmb().GetModelList("").OrderBy(d => d.Byqxdm).Select(d => d.Byqxmc).ToList();
  276. break;
  277. case "KNSLB_InquireField":
  278. inquireItems = new[] { "就业困难、家庭困难和残疾", "家庭困难和残疾", "就业困难和残疾", "残疾", "就业和家庭困难", "家庭困难", "就业困难", "非困难生" }.ToList();
  279. break;
  280. case "ZYDKL_InquireField":
  281. inquireItems = new[] { "专业对口", "专业相关", "不对口", "未填写" }.ToList();
  282. break;
  283. case "DWXZ_InquireField":
  284. inquireItems = new BLL.Dwxz().GetModelList("").OrderBy(d => d.dwxzdm).Select(d => d.dwxzmc).ToList();
  285. break;
  286. case "EJBYQXMC_InquireField":
  287. inquireItems = new BLL.EjByqxdmb().GetModelList("").OrderBy(d => d.Ejbyqxdm).Select(d => d.Ejbyqxmc).ToList();
  288. break;
  289. }
  290. if (inquireItems != null)
  291. {
  292. _inquireItems[inquireField] = inquireItems;
  293. return inquireItems;
  294. }
  295. return new List<string>();
  296. }
  297. }
  298. [Serializable]
  299. public class StatisticsInquire
  300. {
  301. public List<InquireFieldBase> InquireFields { get; set; }
  302. [XmlAttribute]
  303. public bool ShowSummary { get; set; }
  304. [XmlAttribute]
  305. public bool ShowSubSummary { get; set; }
  306. [XmlAttribute]
  307. public string StatisticsDate { get; set; }
  308. [XmlAttribute]
  309. public HighChart.ChartType ChartType { get; set; }
  310. }

实际在使用中,还是非常方便的

预计以后版本需要制作的功能:
对统计字段进行进一步优化,能够使用多个条件组合筛选同一个字段,这个比较简单,扩展下类并且UI调整下就可以了。

在这里把代码都分享给大家,希望和大家一起探讨。

Asp.net管理信息系统中数据统计功能的实现的更多相关文章

  1. CI Weekly #16 | 从另一个角度看开发效率:flow.ci 数据统计功能上线

    很开心的告诉大家,flow.ci 数据统计功能已正式上线. 进入 flow.ci 控制台,点击「数据分析」按钮,你可以按照时间日期筛选,flow.ci 将多维度地展示「组织与项目」的构建数据指标与模型 ...

  2. 如何Windows分页控件中增加统计功能

    在我的博客里面,很多Winform程序里面都用到了分页处理,这样可以不管是在直接访问数据库的场景还是使用网络方式访问WCF服务获取数据,都能获得较好的效率,因此WInform程序里面的分页控件的使用是 ...

  3. Counter的数据统计功能

    Counter是dict的子类,一般用于统计,默认排序是从大到小 from collections import Counter # 输入iterable对象即可 str_counter = Coun ...

  4. sql中数据统计

    今天来说一下使用sql统计数据. 用的H2数据库,用的是DBeaver连接工具.有三表,打印表PRINT_JOB,复印表COPY_JOB和扫描表SCANNER_JOB (这段可以忽略)任务是要统计相同 ...

  5. 基于WebForm+EasyUI的业务管理系统形成之旅 -- 数据统计(Ⅳ)

    上篇<基于WebForm+EasyUI的业务管理系统形成之旅 -- 首页快捷方式>,主要介绍通过添加首页快捷方式,快速进入各个应用菜单功能. 将常用的菜单功能作为快捷方式,避免由于寻找诸多 ...

  6. spring JdbcTemplate 在itest 开源测试管理项目中的浅层(5个使用场景)封装

    导读: 主要从4个方面来阐述,1:背景:2:思路:3:代码实现:4:使用 一:封装背景, 在做项目的时候,用的JPA ,有些复杂查询,比如报表用原生的JdbcTemplate ,很不方便;传参也不方便 ...

  7. MIS(管理信息系统)

    MIS 管理信息系统(Management Information System,简称MIS) 是一个以人为主导,利用计算机硬件.软件.网络通信设备以及其他办公设备,进行信息的收集.传输.加工.储存. ...

  8. React Native 轻松集成统计功能(iOS 篇)

    最近产品让我加上数据统计功能,刚好极光官方支持数据统计 支持了 React Native 版本 第一步 安装: 在你的项目路径下执行命令: npm install janalytics-react-n ...

  9. 前端 SPA 单页应用数据统计解决方案 (ReactJS / VueJS)

    前端 SPA 单页应用数据统计解决方案 (ReactJS / VueJS) 一.百度统计的代码: UV PV 统计方式可能存在问题 在 SPA 的前端项目中 数据统计,往往就是一个比较麻烦的事情,Re ...

随机推荐

  1. 开涛spring3(8.1) - 对ORM的支持 之 8.1 概述

    8.1  概述 8.1.1  ORM框架 ORM全称对象关系映射(Object/Relation Mapping),指将Java对象状态自动映射到关系数据库中的数据上,从而提供透明化的持久化支持,即把 ...

  2. 开涛spring3(3.4) - DI 之 3.4 Bean的作用域

    3.4  Bean的作用域 什么是作用域呢?即“scope”,在面向对象程序设计中一般指对象或变量之间的可见范围.而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围. ...

  3. Ionic进行PC端Web开发时通过脚本压缩提高第一次加载效率

    1. 问题 1.1. 问题上下文描述: 基于Ionic进行PC端的Web应用开发: 使用Tomcat作为最终服务发布容器. 1.2. 问题描述: 编译后main.js的大小为4-6MByte.(集成第 ...

  4. Sublime常用插件

    注:此插件为我自己在用的,仅代表个人,如果发现好用的插件,会不断更新此博文. 1,package control 我们用sublime几乎都会首先安装这个插件,这个插件是管理插件的功能,先安装它,再安 ...

  5. MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?

    本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的 ...

  6. ViewPager实现无限轮播踩坑记

    最近笔者想通过ViewPager来实现一个广告Banner,并实现无限轮播的效果,但是在这个过程中踩了不少的坑,听我慢慢道来.如果大家有遇到和我一样的情况,可以参考我的解决方法,没有那就更好,如果针对 ...

  7. Filter自动登录

    Dao层略过 Domain略过 Service层过 Web层 Select逻辑 获取表单数据,Web-service--Dao返回用户信息 如果返回不为null否则,重定向到登录页面.则判断用户是否勾 ...

  8. Strom序列化机制

    Storm 中的 tuple可以包含任何类型的对象.由于Storm 是一个分布式系统,所以在不同的任务之间传递消息时Storm必须知道怎样序列化.反序列化消息对象. Storm 使用 Kryo库对对象 ...

  9. 如何远程调试zookeeper集群

    我们在阅读一些源码的时候,如果能调试源代码将会大大的提高我们的阅读效率.最近在学习zookeeper源码,分享下如何调试zookeeper集群. zookeeper代码,调试环境搭建 1.下载zook ...

  10. 探索Windows命令行系列(2):命令行工具入门

    1.理论基础 1.1.命令行的前世今生 1.2.命令执行规则 1.3.使用命令历史 2.使用入门 2.1.启动和关闭命令行 2.2.执行简单的命令 2.3.命令行执行程序使用技巧 3.总结 1.理论基 ...